@up_si_vale/sivale-componentes-angular 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/esm2022/lib/atoms/button/button.component.mjs +55 -0
  2. package/esm2022/lib/atoms/checkbox/checkbox.component.mjs +174 -0
  3. package/esm2022/lib/atoms/date-picker/date-picker.component.mjs +835 -0
  4. package/esm2022/lib/atoms/input/input.component.mjs +218 -0
  5. package/esm2022/lib/atoms/loader/loader.component.mjs +81 -0
  6. package/esm2022/lib/atoms/radio/radio.component.mjs +142 -0
  7. package/esm2022/lib/atoms/textarea/textarea.component.mjs +126 -0
  8. package/esm2022/lib/directives/asset-source.directive.mjs +68 -0
  9. package/esm2022/lib/directives/icon-source.directive.mjs +65 -0
  10. package/esm2022/lib/directives/no-leading-space.directive.mjs +24 -0
  11. package/esm2022/lib/directives/only-letters.directive.mjs +25 -0
  12. package/esm2022/lib/directives/only-number.directive.mjs +21 -0
  13. package/esm2022/lib/directives/rfc.directive.mjs +67 -0
  14. package/esm2022/lib/directives/tooltip.directive.mjs +199 -0
  15. package/esm2022/lib/models/snackbar.models.mjs +2 -0
  16. package/esm2022/lib/molecules/alert/alert.component.mjs +79 -0
  17. package/esm2022/lib/molecules/copy-input/copy-input.component.mjs +46 -0
  18. package/esm2022/lib/molecules/multiselect/multiselect.component.mjs +466 -0
  19. package/esm2022/lib/molecules/option/option.component.mjs +55 -0
  20. package/esm2022/lib/molecules/phone-input/phone-input.component.mjs +64 -0
  21. package/esm2022/lib/molecules/select/select.component.mjs +498 -0
  22. package/esm2022/lib/molecules/snackbar/snackbar.component.mjs +581 -0
  23. package/esm2022/lib/organisms/sidebar/sidebar-icon.component.mjs +91 -0
  24. package/esm2022/lib/organisms/sidebar/sidebar.component.mjs +115 -0
  25. package/esm2022/lib/services/snackbar.service.mjs +96 -0
  26. package/esm2022/lib/tokens/asset-base-url.token.mjs +10 -0
  27. package/esm2022/public-api.mjs +37 -0
  28. package/esm2022/up_si_vale-sivale-componentes-angular.mjs +5 -0
  29. package/fesm2022/up_si_vale-sivale-componentes-angular.mjs +4116 -0
  30. package/fesm2022/up_si_vale-sivale-componentes-angular.mjs.map +1 -0
  31. package/index.d.ts +5 -0
  32. package/lib/atoms/button/button.component.d.ts +20 -0
  33. package/lib/atoms/checkbox/checkbox.component.d.ts +31 -0
  34. package/lib/atoms/date-picker/date-picker.component.d.ts +134 -0
  35. package/lib/atoms/input/input.component.d.ts +35 -0
  36. package/lib/atoms/loader/loader.component.d.ts +10 -0
  37. package/lib/atoms/radio/radio.component.d.ts +25 -0
  38. package/lib/atoms/textarea/textarea.component.d.ts +27 -0
  39. package/lib/directives/asset-source.directive.d.ts +19 -0
  40. package/lib/directives/icon-source.directive.d.ts +18 -0
  41. package/lib/directives/no-leading-space.directive.d.ts +6 -0
  42. package/lib/directives/only-letters.directive.d.ts +7 -0
  43. package/lib/directives/only-number.directive.d.ts +6 -0
  44. package/lib/directives/rfc.directive.d.ts +12 -0
  45. package/lib/directives/tooltip.directive.d.ts +27 -0
  46. package/{src/lib/models/snackbar.models.ts → lib/models/snackbar.models.d.ts} +8 -10
  47. package/lib/molecules/alert/alert.component.d.ts +29 -0
  48. package/lib/molecules/copy-input/copy-input.component.d.ts +14 -0
  49. package/lib/molecules/multiselect/multiselect.component.d.ts +74 -0
  50. package/lib/molecules/option/option.component.d.ts +19 -0
  51. package/lib/molecules/phone-input/phone-input.component.d.ts +12 -0
  52. package/lib/molecules/select/select.component.d.ts +88 -0
  53. package/lib/molecules/snackbar/snackbar.component.d.ts +17 -0
  54. package/lib/organisms/sidebar/sidebar-icon.component.d.ts +8 -0
  55. package/lib/organisms/sidebar/sidebar.component.d.ts +47 -0
  56. package/lib/services/snackbar.service.d.ts +40 -0
  57. package/{src/lib/tokens/asset-base-url.token.ts → lib/tokens/asset-base-url.token.d.ts} +1 -5
  58. package/package.json +39 -28
  59. package/{src/public-api.ts → public-api.d.ts} +3 -15
  60. package/ng-package.json +0 -9
  61. package/src/lib/atoms/button/button.component.html +0 -21
  62. package/src/lib/atoms/button/button.component.scss +0 -242
  63. package/src/lib/atoms/button/button.component.ts +0 -43
  64. package/src/lib/atoms/checkbox/checkbox.component.scss +0 -131
  65. package/src/lib/atoms/checkbox/checkbox.component.ts +0 -130
  66. package/src/lib/atoms/date-picker/date-picker.component.html +0 -295
  67. package/src/lib/atoms/date-picker/date-picker.component.scss +0 -1002
  68. package/src/lib/atoms/date-picker/date-picker.component.ts +0 -942
  69. package/src/lib/atoms/input/input.component.ts +0 -239
  70. package/src/lib/atoms/loader/loader.component.scss +0 -144
  71. package/src/lib/atoms/loader/loader.component.ts +0 -44
  72. package/src/lib/atoms/radio/radio.component.scss +0 -115
  73. package/src/lib/atoms/radio/radio.component.ts +0 -103
  74. package/src/lib/atoms/textarea/textarea.component.ts +0 -155
  75. package/src/lib/directives/asset-source.directive.ts +0 -64
  76. package/src/lib/directives/icon-source.directive.ts +0 -74
  77. package/src/lib/directives/no-leading-space.directive.ts +0 -18
  78. package/src/lib/directives/only-letters.directive.ts +0 -21
  79. package/src/lib/directives/only-number.directive.ts +0 -15
  80. package/src/lib/directives/rfc.directive.ts +0 -60
  81. package/src/lib/directives/tooltip.directive.ts +0 -211
  82. package/src/lib/molecules/copy-input/copy-input.component.html +0 -29
  83. package/src/lib/molecules/copy-input/copy-input.component.scss +0 -101
  84. package/src/lib/molecules/copy-input/copy-input.component.ts +0 -41
  85. package/src/lib/molecules/multiselect/multiselect.component.scss +0 -298
  86. package/src/lib/molecules/multiselect/multiselect.component.ts +0 -487
  87. package/src/lib/molecules/option/option.component.ts +0 -45
  88. package/src/lib/molecules/phone-input/phone-input.component.scss +0 -78
  89. package/src/lib/molecules/phone-input/phone-input.component.ts +0 -43
  90. package/src/lib/molecules/select/select.component.ts +0 -482
  91. package/src/lib/molecules/snackbar/snackbar.component.scss +0 -201
  92. package/src/lib/molecules/snackbar/snackbar.component.ts +0 -321
  93. package/src/lib/services/snackbar.service.ts +0 -103
  94. package/tsconfig.json +0 -31
@@ -0,0 +1,835 @@
1
+ import { Component, Input, forwardRef, ViewChild, ElementRef, HostListener } from '@angular/core';
2
+ import { CommonModule, DOCUMENT } from '@angular/common';
3
+ import { NG_VALUE_ACCESSOR, ReactiveFormsModule, FormsModule } from '@angular/forms';
4
+ import { Inject } from '@angular/core';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ export class DatePickerComponent {
8
+ renderer;
9
+ document;
10
+ label = '';
11
+ id = '';
12
+ placeholder = 'Seleccionar fecha';
13
+ hasError = false;
14
+ errorMessage = '';
15
+ disabled = false;
16
+ minDate;
17
+ maxDate;
18
+ rangeMode = false; // false = single date, true = date range
19
+ iconPosition = 'left';
20
+ trigger;
21
+ dropdown;
22
+ // Single date value
23
+ singleValue = null;
24
+ // Range value
25
+ rangeValue = { startDate: null, endDate: null };
26
+ isOpen = false;
27
+ onChange = () => { };
28
+ onTouched = () => { };
29
+ leftMonthDate = new Date();
30
+ rightMonthDate = new Date();
31
+ tempStartDate = null;
32
+ tempEndDate = null;
33
+ tempSingleDate = null;
34
+ hoverDate = null;
35
+ // Store original calendar positions for cancel
36
+ originalLeftMonthDate = new Date();
37
+ originalRightMonthDate = new Date();
38
+ // Cached calendar days
39
+ leftCalendarDays = [];
40
+ rightCalendarDays = [];
41
+ filterOptions = [
42
+ { value: 'hoy', label: 'Hoy' },
43
+ { value: 'ayer', label: 'Ayer' },
44
+ { value: 'esta-semana', label: 'Esta semana' },
45
+ { value: 'semana-pasada', label: 'Semana pasada' },
46
+ { value: 'este-mes', label: 'Este mes' },
47
+ { value: 'mes-pasado', label: 'Mes pasado' },
48
+ { value: 'este-ano', label: 'Este año' },
49
+ { value: 'ano-pasado', label: 'Año pasado' },
50
+ { value: 'mostrar-todo', label: 'Mostrar todo' }
51
+ ];
52
+ selectedFilter = '';
53
+ weekDays = ['Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa', 'Do'];
54
+ months = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'];
55
+ // Month/Year picker state
56
+ showLeftMonthPicker = false;
57
+ showRightMonthPicker = false;
58
+ years = [];
59
+ leftYearPickerPage = 0;
60
+ rightYearPickerPage = 0;
61
+ yearsPerPage = 12;
62
+ scrollHandler = null;
63
+ resizeHandler = null;
64
+ dropdownPosition = { top: '0px', left: '0px' };
65
+ constructor(renderer, document) {
66
+ this.renderer = renderer;
67
+ this.document = document;
68
+ }
69
+ ngOnInit() {
70
+ this.initializeDates();
71
+ }
72
+ ngOnDestroy() {
73
+ this.removeRepositionListeners();
74
+ }
75
+ initializeDates() {
76
+ const today = new Date();
77
+ this.leftMonthDate = new Date(today.getFullYear(), today.getMonth(), 1);
78
+ this.rightMonthDate = new Date(today.getFullYear(), today.getMonth() + 1, 1);
79
+ this.updateCalendarDays();
80
+ }
81
+ updateCalendarDays() {
82
+ this.leftCalendarDays = this.generateCalendarDays(this.leftMonthDate);
83
+ if (this.rangeMode) {
84
+ this.rightCalendarDays = this.generateCalendarDays(this.rightMonthDate);
85
+ }
86
+ }
87
+ onDocumentClick(event) {
88
+ if (!this.isOpen)
89
+ return;
90
+ const triggerElement = this.trigger?.nativeElement;
91
+ const dropdownElement = this.document.querySelector('.date-picker-dropdown');
92
+ const monthYearPickers = this.document.querySelectorAll('.month-year-picker');
93
+ const monthYearButtons = this.document.querySelectorAll('.month-year');
94
+ let isOnMonthYearButton = false;
95
+ monthYearButtons.forEach(button => {
96
+ if (button.contains(event.target)) {
97
+ isOnMonthYearButton = true;
98
+ }
99
+ });
100
+ let isInsideMonthYearPicker = false;
101
+ monthYearPickers.forEach(picker => {
102
+ if (picker.contains(event.target)) {
103
+ isInsideMonthYearPicker = true;
104
+ }
105
+ });
106
+ if (isOnMonthYearButton || isInsideMonthYearPicker) {
107
+ return;
108
+ }
109
+ if (dropdownElement && dropdownElement.contains(event.target)) {
110
+ this.showLeftMonthPicker = false;
111
+ this.showRightMonthPicker = false;
112
+ return;
113
+ }
114
+ if (triggerElement && !triggerElement.contains(event.target)) {
115
+ if (dropdownElement && !dropdownElement.contains(event.target)) {
116
+ this.closeDropdown();
117
+ }
118
+ }
119
+ }
120
+ toggleDropdown(event) {
121
+ event.stopPropagation();
122
+ if (this.disabled)
123
+ return;
124
+ if (this.isOpen) {
125
+ this.closeDropdown();
126
+ }
127
+ else {
128
+ this.openDropdown();
129
+ }
130
+ }
131
+ openDropdown() {
132
+ if (!this.trigger)
133
+ return;
134
+ if (this.rangeMode) {
135
+ this.tempStartDate = this.rangeValue.startDate;
136
+ this.tempEndDate = this.rangeValue.endDate;
137
+ }
138
+ else {
139
+ this.tempSingleDate = this.singleValue;
140
+ }
141
+ this.originalLeftMonthDate = new Date(this.leftMonthDate);
142
+ this.originalRightMonthDate = new Date(this.rightMonthDate);
143
+ this.leftYearPickerPage = 0;
144
+ this.rightYearPickerPage = 0;
145
+ this.isOpen = true;
146
+ setTimeout(() => {
147
+ this.updateDropdownPosition();
148
+ this.addRepositionListeners();
149
+ }, 0);
150
+ }
151
+ getDropdownStyle() {
152
+ if (!this.trigger)
153
+ return {};
154
+ const position = this.calculatePosition();
155
+ return {
156
+ 'position': 'fixed',
157
+ 'left': position.left,
158
+ 'top': position.top,
159
+ 'z-index': '10000'
160
+ };
161
+ }
162
+ calculatePosition() {
163
+ const triggerElement = this.trigger.nativeElement;
164
+ const rect = triggerElement.getBoundingClientRect();
165
+ let dropdownWidth = this.rangeMode ? 830 : 320;
166
+ let dropdownHeight = this.rangeMode ? 520 : 400;
167
+ if (this.dropdown) {
168
+ const dropdownElement = this.dropdown.nativeElement;
169
+ const dropdownRect = dropdownElement.getBoundingClientRect();
170
+ if (dropdownRect.width > 0) {
171
+ dropdownWidth = dropdownRect.width;
172
+ }
173
+ else {
174
+ dropdownWidth = window.innerWidth < 768 ? 280 : (this.rangeMode ? 830 : 320);
175
+ }
176
+ if (dropdownRect.height > 0) {
177
+ dropdownHeight = dropdownRect.height;
178
+ }
179
+ }
180
+ else {
181
+ dropdownWidth = window.innerWidth < 768 ? 280 : (this.rangeMode ? 830 : 320);
182
+ }
183
+ const spaceOnRight = window.innerWidth - rect.left;
184
+ let left = rect.left;
185
+ if (spaceOnRight < dropdownWidth) {
186
+ left = rect.right - dropdownWidth;
187
+ if (left < 0) {
188
+ left = Math.max(8, window.innerWidth - dropdownWidth - 8);
189
+ }
190
+ }
191
+ if (window.innerWidth < 768) {
192
+ const centeredLeft = rect.left + (rect.width / 2) - (dropdownWidth / 2);
193
+ const minLeft = 8;
194
+ const maxLeft = window.innerWidth - dropdownWidth - 8;
195
+ left = Math.max(minLeft, Math.min(centeredLeft, maxLeft));
196
+ }
197
+ const spaceBelow = window.innerHeight - rect.bottom;
198
+ const spaceAbove = rect.top;
199
+ let top = rect.bottom + 4;
200
+ if (spaceBelow < dropdownHeight && spaceAbove > spaceBelow) {
201
+ top = rect.top - dropdownHeight - 4;
202
+ }
203
+ return {
204
+ top: `${top}px`,
205
+ left: `${left}px`
206
+ };
207
+ }
208
+ closeDropdown() {
209
+ this.leftMonthDate = new Date(this.originalLeftMonthDate);
210
+ this.rightMonthDate = new Date(this.originalRightMonthDate);
211
+ if (this.rangeMode) {
212
+ this.tempStartDate = this.rangeValue.startDate;
213
+ this.tempEndDate = this.rangeValue.endDate;
214
+ }
215
+ else {
216
+ this.tempSingleDate = this.singleValue;
217
+ }
218
+ this.updateCalendarDays();
219
+ this.removeRepositionListeners();
220
+ this.isOpen = false;
221
+ this.hoverDate = null;
222
+ this.showLeftMonthPicker = false;
223
+ this.showRightMonthPicker = false;
224
+ }
225
+ addRepositionListeners() {
226
+ const scrollHandler = () => this.updateDropdownPosition();
227
+ const resizeHandler = () => this.updateDropdownPosition();
228
+ window.addEventListener('scroll', scrollHandler, true);
229
+ this.scrollHandler = () => window.removeEventListener('scroll', scrollHandler, true);
230
+ window.addEventListener('resize', resizeHandler);
231
+ this.resizeHandler = () => window.removeEventListener('resize', resizeHandler);
232
+ }
233
+ removeRepositionListeners() {
234
+ if (this.scrollHandler) {
235
+ this.scrollHandler();
236
+ this.scrollHandler = null;
237
+ }
238
+ if (this.resizeHandler) {
239
+ this.resizeHandler();
240
+ this.resizeHandler = null;
241
+ }
242
+ }
243
+ updateDropdownPosition() {
244
+ if (!this.trigger)
245
+ return;
246
+ this.dropdownPosition = this.calculatePosition();
247
+ }
248
+ getDisplayValue() {
249
+ if (this.rangeMode) {
250
+ if (this.rangeValue.startDate && this.rangeValue.endDate) {
251
+ const start = this.formatDateShort(this.rangeValue.startDate);
252
+ const end = this.formatDateShort(this.rangeValue.endDate);
253
+ return `${start} - ${end}`;
254
+ }
255
+ }
256
+ else {
257
+ if (this.singleValue) {
258
+ return this.formatDateShort(this.singleValue);
259
+ }
260
+ }
261
+ return '';
262
+ }
263
+ formatDateShort(date) {
264
+ const day = String(date.getDate()).padStart(2, '0');
265
+ const month = String(date.getMonth() + 1).padStart(2, '0');
266
+ const year = date.getFullYear();
267
+ return `${day}/${month}/${year}`;
268
+ }
269
+ generateCalendarDays(monthDate) {
270
+ const year = monthDate.getFullYear();
271
+ const month = monthDate.getMonth();
272
+ const firstDay = new Date(year, month, 1);
273
+ const lastDay = new Date(year, month + 1, 0);
274
+ let startDay = firstDay.getDay() - 1;
275
+ if (startDay === -1)
276
+ startDay = 6;
277
+ const days = [];
278
+ const prevMonthLastDay = new Date(year, month, 0);
279
+ for (let i = startDay - 1; i >= 0; i--) {
280
+ const date = new Date(year, month - 1, prevMonthLastDay.getDate() - i);
281
+ date.setHours(0, 0, 0, 0);
282
+ days.push(this.createCalendarDay(date, false));
283
+ }
284
+ for (let day = 1; day <= lastDay.getDate(); day++) {
285
+ const date = new Date(year, month, day);
286
+ date.setHours(0, 0, 0, 0);
287
+ days.push(this.createCalendarDay(date, true));
288
+ }
289
+ const remainingDays = 42 - days.length;
290
+ for (let day = 1; day <= remainingDays; day++) {
291
+ const date = new Date(year, month + 1, day);
292
+ date.setHours(0, 0, 0, 0);
293
+ days.push(this.createCalendarDay(date, false));
294
+ }
295
+ return days;
296
+ }
297
+ createCalendarDay(date, isCurrentMonth) {
298
+ const today = new Date();
299
+ today.setHours(0, 0, 0, 0);
300
+ const dateOnly = new Date(date);
301
+ dateOnly.setHours(0, 0, 0, 0);
302
+ const isToday = dateOnly.getTime() === today.getTime();
303
+ let isSelected = false;
304
+ let isRangeStart = false;
305
+ let isRangeEnd = false;
306
+ let isInRange = false;
307
+ if (this.rangeMode) {
308
+ const startDate = this.tempStartDate ? new Date(this.tempStartDate) : null;
309
+ const endDate = this.tempEndDate ? new Date(this.tempEndDate) : null;
310
+ if (startDate)
311
+ startDate.setHours(0, 0, 0, 0);
312
+ if (endDate)
313
+ endDate.setHours(0, 0, 0, 0);
314
+ isRangeStart = isCurrentMonth && startDate ? dateOnly.getTime() === startDate.getTime() : false;
315
+ isRangeEnd = isCurrentMonth && endDate ? dateOnly.getTime() === endDate.getTime() : false;
316
+ isSelected = isRangeStart || isRangeEnd;
317
+ if (isCurrentMonth && startDate && endDate) {
318
+ isInRange = dateOnly > startDate && dateOnly < endDate;
319
+ }
320
+ else if (isCurrentMonth && startDate && this.hoverDate && !endDate) {
321
+ const hoverDateOnly = new Date(this.hoverDate);
322
+ hoverDateOnly.setHours(0, 0, 0, 0);
323
+ if (hoverDateOnly > startDate) {
324
+ isInRange = dateOnly > startDate && dateOnly < hoverDateOnly;
325
+ }
326
+ }
327
+ }
328
+ else {
329
+ const selectedDate = this.tempSingleDate ? new Date(this.tempSingleDate) : null;
330
+ if (selectedDate)
331
+ selectedDate.setHours(0, 0, 0, 0);
332
+ isSelected = isCurrentMonth && selectedDate ? dateOnly.getTime() === selectedDate.getTime() : false;
333
+ }
334
+ const isDisabled = !isCurrentMonth || this.isDateDisabled(date);
335
+ return {
336
+ date,
337
+ isCurrentMonth,
338
+ isToday,
339
+ isSelected,
340
+ isInRange,
341
+ isRangeStart,
342
+ isRangeEnd,
343
+ isDisabled
344
+ };
345
+ }
346
+ isDateDisabled(date) {
347
+ if (this.minDate && date < this.minDate)
348
+ return true;
349
+ if (this.maxDate && date > this.maxDate)
350
+ return true;
351
+ return false;
352
+ }
353
+ trackByDate(index, day) {
354
+ return day.date.getTime().toString();
355
+ }
356
+ isInRange(date) {
357
+ if (!this.rangeMode)
358
+ return false;
359
+ const dateOnly = new Date(date);
360
+ dateOnly.setHours(0, 0, 0, 0);
361
+ const startDate = this.tempStartDate ? new Date(this.tempStartDate) : null;
362
+ const endDate = this.tempEndDate ? new Date(this.tempEndDate) : null;
363
+ if (startDate)
364
+ startDate.setHours(0, 0, 0, 0);
365
+ if (endDate)
366
+ endDate.setHours(0, 0, 0, 0);
367
+ if (startDate && endDate) {
368
+ return dateOnly > startDate && dateOnly < endDate;
369
+ }
370
+ else if (startDate && this.hoverDate && !endDate) {
371
+ const hoverDateOnly = new Date(this.hoverDate);
372
+ hoverDateOnly.setHours(0, 0, 0, 0);
373
+ if (hoverDateOnly > startDate) {
374
+ return dateOnly > startDate && dateOnly < hoverDateOnly;
375
+ }
376
+ }
377
+ return false;
378
+ }
379
+ onDayClick(day) {
380
+ if (day.isDisabled)
381
+ return;
382
+ const clickedDate = new Date(day.date);
383
+ clickedDate.setHours(0, 0, 0, 0);
384
+ if (this.rangeMode) {
385
+ this.selectedFilter = '';
386
+ if (!this.tempStartDate || (this.tempStartDate && this.tempEndDate)) {
387
+ this.tempStartDate = clickedDate;
388
+ this.tempEndDate = null;
389
+ this.hoverDate = null;
390
+ }
391
+ else if (this.tempStartDate && !this.tempEndDate) {
392
+ const startDate = new Date(this.tempStartDate);
393
+ startDate.setHours(0, 0, 0, 0);
394
+ if (clickedDate.getTime() === startDate.getTime()) {
395
+ this.tempEndDate = clickedDate;
396
+ }
397
+ else if (clickedDate > startDate) {
398
+ this.tempEndDate = clickedDate;
399
+ }
400
+ else {
401
+ this.tempEndDate = startDate;
402
+ this.tempStartDate = clickedDate;
403
+ }
404
+ this.hoverDate = null;
405
+ }
406
+ }
407
+ else {
408
+ this.tempSingleDate = clickedDate;
409
+ // Auto-apply for single date mode
410
+ this.apply();
411
+ return;
412
+ }
413
+ this.updateCalendarDays();
414
+ }
415
+ onDayHover(day) {
416
+ if (day.isDisabled || !this.rangeMode)
417
+ return;
418
+ this.hoverDate = day.date;
419
+ }
420
+ onDayLeave() {
421
+ this.hoverDate = null;
422
+ }
423
+ previousMonth() {
424
+ if (!this.canNavigatePreviousMonth())
425
+ return;
426
+ this.leftMonthDate = new Date(this.leftMonthDate.getFullYear(), this.leftMonthDate.getMonth() - 1, 1);
427
+ if (this.rangeMode) {
428
+ this.rightMonthDate = new Date(this.rightMonthDate.getFullYear(), this.rightMonthDate.getMonth() - 1, 1);
429
+ }
430
+ this.updateCalendarDays();
431
+ }
432
+ nextMonth() {
433
+ if (!this.canNavigateNextMonth())
434
+ return;
435
+ this.leftMonthDate = new Date(this.leftMonthDate.getFullYear(), this.leftMonthDate.getMonth() + 1, 1);
436
+ if (this.rangeMode) {
437
+ this.rightMonthDate = new Date(this.rightMonthDate.getFullYear(), this.rightMonthDate.getMonth() + 1, 1);
438
+ }
439
+ this.updateCalendarDays();
440
+ }
441
+ canNavigatePreviousMonth() {
442
+ if (!this.minDate)
443
+ return true;
444
+ const newLeftMonth = new Date(this.leftMonthDate.getFullYear(), this.leftMonthDate.getMonth() - 1, 1);
445
+ const minDateMonth = new Date(this.minDate.getFullYear(), this.minDate.getMonth(), 1);
446
+ return newLeftMonth >= minDateMonth;
447
+ }
448
+ canNavigateNextMonth() {
449
+ if (!this.maxDate)
450
+ return true;
451
+ const checkMonth = this.rangeMode ? this.rightMonthDate : this.leftMonthDate;
452
+ const newMonth = new Date(checkMonth.getFullYear(), checkMonth.getMonth() + 1, 1);
453
+ const maxDateMonth = new Date(this.maxDate.getFullYear(), this.maxDate.getMonth(), 1);
454
+ return newMonth <= maxDateMonth;
455
+ }
456
+ getMonthYear(date) {
457
+ return `${this.months[date.getMonth()]} ${date.getFullYear()}`;
458
+ }
459
+ selectFilter(filter) {
460
+ this.selectedFilter = filter;
461
+ this.applyFilter(filter);
462
+ this.updateCalendarDays();
463
+ }
464
+ applyFilter(filter) {
465
+ const today = new Date();
466
+ today.setHours(0, 0, 0, 0);
467
+ let startDate = null;
468
+ let endDate = null;
469
+ switch (filter) {
470
+ case 'hoy':
471
+ startDate = new Date(today);
472
+ endDate = new Date(today);
473
+ break;
474
+ case 'ayer':
475
+ startDate = new Date(today);
476
+ startDate.setDate(startDate.getDate() - 1);
477
+ endDate = new Date(startDate);
478
+ break;
479
+ case 'esta-semana':
480
+ startDate = this.getStartOfWeek(today);
481
+ endDate = new Date(today);
482
+ break;
483
+ case 'semana-pasada':
484
+ const lastWeekEnd = new Date(this.getStartOfWeek(today));
485
+ lastWeekEnd.setDate(lastWeekEnd.getDate() - 1);
486
+ startDate = this.getStartOfWeek(lastWeekEnd);
487
+ endDate = lastWeekEnd;
488
+ break;
489
+ case 'este-mes':
490
+ startDate = new Date(today.getFullYear(), today.getMonth(), 1);
491
+ endDate = new Date(today);
492
+ break;
493
+ case 'mes-pasado':
494
+ startDate = new Date(today.getFullYear(), today.getMonth() - 1, 1);
495
+ endDate = new Date(today.getFullYear(), today.getMonth(), 0);
496
+ break;
497
+ case 'este-ano':
498
+ startDate = new Date(today.getFullYear(), 0, 1);
499
+ endDate = new Date(today);
500
+ break;
501
+ case 'ano-pasado':
502
+ startDate = new Date(today.getFullYear() - 1, 0, 1);
503
+ endDate = new Date(today.getFullYear() - 1, 11, 31);
504
+ break;
505
+ case 'mostrar-todo':
506
+ startDate = null;
507
+ endDate = null;
508
+ break;
509
+ }
510
+ this.tempStartDate = startDate;
511
+ this.tempEndDate = endDate;
512
+ if (startDate) {
513
+ this.leftMonthDate = new Date(startDate.getFullYear(), startDate.getMonth(), 1);
514
+ this.rightMonthDate = new Date(startDate.getFullYear(), startDate.getMonth() + 1, 1);
515
+ }
516
+ else {
517
+ const currentDate = new Date();
518
+ this.leftMonthDate = new Date(currentDate.getFullYear(), currentDate.getMonth(), 1);
519
+ this.rightMonthDate = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 1);
520
+ }
521
+ }
522
+ getStartOfWeek(date) {
523
+ const day = date.getDay();
524
+ const diff = day === 0 ? -6 : 1 - day;
525
+ const startOfWeek = new Date(date);
526
+ startOfWeek.setDate(date.getDate() + diff);
527
+ return startOfWeek;
528
+ }
529
+ cancel() {
530
+ if (this.rangeMode) {
531
+ this.tempStartDate = this.rangeValue.startDate;
532
+ this.tempEndDate = this.rangeValue.endDate;
533
+ }
534
+ else {
535
+ this.tempSingleDate = this.singleValue;
536
+ }
537
+ this.selectedFilter = '';
538
+ this.leftMonthDate = new Date(this.originalLeftMonthDate);
539
+ this.rightMonthDate = new Date(this.originalRightMonthDate);
540
+ this.updateCalendarDays();
541
+ this.closeDropdown();
542
+ }
543
+ apply() {
544
+ if (this.rangeMode) {
545
+ this.rangeValue = {
546
+ startDate: this.tempStartDate,
547
+ endDate: this.tempEndDate
548
+ };
549
+ this.onChange(this.rangeValue);
550
+ }
551
+ else {
552
+ this.singleValue = this.tempSingleDate;
553
+ this.onChange(this.singleValue);
554
+ }
555
+ this.originalLeftMonthDate = new Date(this.leftMonthDate);
556
+ this.originalRightMonthDate = new Date(this.rightMonthDate);
557
+ this.onTouched();
558
+ this.removeRepositionListeners();
559
+ this.isOpen = false;
560
+ this.hoverDate = null;
561
+ this.showLeftMonthPicker = false;
562
+ this.showRightMonthPicker = false;
563
+ }
564
+ getStartDateDisplay() {
565
+ if (this.tempStartDate) {
566
+ return this.formatDateForInput(this.tempStartDate);
567
+ }
568
+ return 'Fecha inicio';
569
+ }
570
+ getEndDateDisplay() {
571
+ if (this.tempEndDate) {
572
+ return this.formatDateForInput(this.tempEndDate);
573
+ }
574
+ return 'Fecha fin';
575
+ }
576
+ formatDateForInput(date) {
577
+ const day = date.getDate();
578
+ const month = date.toLocaleString('es-ES', { month: 'short' });
579
+ const year = date.getFullYear();
580
+ return `${day} ${month} ${year}`;
581
+ }
582
+ toggleLeftMonthPicker(event) {
583
+ event.stopPropagation();
584
+ this.showLeftMonthPicker = !this.showLeftMonthPicker;
585
+ this.showRightMonthPicker = false;
586
+ if (this.showLeftMonthPicker) {
587
+ this.leftYearPickerPage = 0;
588
+ }
589
+ }
590
+ toggleRightMonthPicker(event) {
591
+ event.stopPropagation();
592
+ this.showRightMonthPicker = !this.showRightMonthPicker;
593
+ this.showLeftMonthPicker = false;
594
+ if (this.showRightMonthPicker) {
595
+ this.rightYearPickerPage = 0;
596
+ }
597
+ }
598
+ getLeftYears() {
599
+ const currentYear = this.leftMonthDate.getFullYear();
600
+ const baseYear = currentYear + (this.leftYearPickerPage * this.yearsPerPage);
601
+ const years = [];
602
+ for (let i = 0; i < this.yearsPerPage; i++) {
603
+ const year = baseYear - 5 + i;
604
+ years.push(year);
605
+ }
606
+ return years;
607
+ }
608
+ getRightYears() {
609
+ const currentYear = this.rightMonthDate.getFullYear();
610
+ const baseYear = currentYear + (this.rightYearPickerPage * this.yearsPerPage);
611
+ const years = [];
612
+ for (let i = 0; i < this.yearsPerPage; i++) {
613
+ const year = baseYear - 5 + i;
614
+ years.push(year);
615
+ }
616
+ return years;
617
+ }
618
+ previousLeftYearPage(event) {
619
+ event.stopPropagation();
620
+ this.leftYearPickerPage--;
621
+ }
622
+ nextLeftYearPage(event) {
623
+ event.stopPropagation();
624
+ this.leftYearPickerPage++;
625
+ }
626
+ previousRightYearPage(event) {
627
+ event.stopPropagation();
628
+ this.rightYearPickerPage--;
629
+ }
630
+ nextRightYearPage(event) {
631
+ event.stopPropagation();
632
+ this.rightYearPickerPage++;
633
+ }
634
+ isMonthDisabled(monthIndex, calendarDate) {
635
+ const testDate = new Date(calendarDate.getFullYear(), monthIndex, 1);
636
+ if (this.minDate) {
637
+ const minDateMonth = new Date(this.minDate.getFullYear(), this.minDate.getMonth(), 1);
638
+ if (testDate < minDateMonth)
639
+ return true;
640
+ }
641
+ if (this.maxDate) {
642
+ const maxDateMonth = new Date(this.maxDate.getFullYear(), this.maxDate.getMonth(), 1);
643
+ if (testDate > maxDateMonth)
644
+ return true;
645
+ }
646
+ return false;
647
+ }
648
+ isYearDisabled(year) {
649
+ if (this.minDate && year < this.minDate.getFullYear())
650
+ return true;
651
+ if (this.maxDate && year > this.maxDate.getFullYear())
652
+ return true;
653
+ return false;
654
+ }
655
+ getLeftYearRangeLabel() {
656
+ const years = this.getLeftYears();
657
+ return `${years[0]} - ${years[years.length - 1]}`;
658
+ }
659
+ getRightYearRangeLabel() {
660
+ const years = this.getRightYears();
661
+ return `${years[0]} - ${years[years.length - 1]}`;
662
+ }
663
+ canNavigateLeftYearsPrevious() {
664
+ if (!this.minDate && !this.maxDate)
665
+ return true;
666
+ const currentYear = this.leftMonthDate.getFullYear();
667
+ const baseYear = currentYear + ((this.leftYearPickerPage - 1) * this.yearsPerPage);
668
+ const previousPageYears = [];
669
+ for (let i = 0; i < this.yearsPerPage; i++) {
670
+ previousPageYears.push(baseYear - 5 + i);
671
+ }
672
+ return previousPageYears.some(year => !this.isYearDisabled(year));
673
+ }
674
+ canNavigateLeftYearsNext() {
675
+ if (!this.minDate && !this.maxDate)
676
+ return true;
677
+ const currentYear = this.leftMonthDate.getFullYear();
678
+ const baseYear = currentYear + ((this.leftYearPickerPage + 1) * this.yearsPerPage);
679
+ const nextPageYears = [];
680
+ for (let i = 0; i < this.yearsPerPage; i++) {
681
+ nextPageYears.push(baseYear - 5 + i);
682
+ }
683
+ return nextPageYears.some(year => !this.isYearDisabled(year));
684
+ }
685
+ canNavigateRightYearsPrevious() {
686
+ if (!this.minDate && !this.maxDate)
687
+ return true;
688
+ const currentYear = this.rightMonthDate.getFullYear();
689
+ const baseYear = currentYear + ((this.rightYearPickerPage - 1) * this.yearsPerPage);
690
+ const previousPageYears = [];
691
+ for (let i = 0; i < this.yearsPerPage; i++) {
692
+ previousPageYears.push(baseYear - 5 + i);
693
+ }
694
+ return previousPageYears.some(year => !this.isYearDisabled(year));
695
+ }
696
+ canNavigateRightYearsNext() {
697
+ if (!this.minDate && !this.maxDate)
698
+ return true;
699
+ const currentYear = this.rightMonthDate.getFullYear();
700
+ const baseYear = currentYear + ((this.rightYearPickerPage + 1) * this.yearsPerPage);
701
+ const nextPageYears = [];
702
+ for (let i = 0; i < this.yearsPerPage; i++) {
703
+ nextPageYears.push(baseYear - 5 + i);
704
+ }
705
+ return nextPageYears.some(year => !this.isYearDisabled(year));
706
+ }
707
+ selectLeftMonth(monthIndex, event) {
708
+ if (event) {
709
+ event.stopPropagation();
710
+ }
711
+ this.leftMonthDate = new Date(this.leftMonthDate.getFullYear(), monthIndex, 1);
712
+ if (this.rangeMode) {
713
+ this.rightMonthDate = new Date(this.leftMonthDate.getFullYear(), monthIndex + 1, 1);
714
+ }
715
+ this.updateCalendarDays();
716
+ this.showLeftMonthPicker = false;
717
+ }
718
+ selectRightMonth(monthIndex, event) {
719
+ if (event) {
720
+ event.stopPropagation();
721
+ }
722
+ this.rightMonthDate = new Date(this.rightMonthDate.getFullYear(), monthIndex, 1);
723
+ this.leftMonthDate = new Date(this.rightMonthDate.getFullYear(), monthIndex - 1, 1);
724
+ this.updateCalendarDays();
725
+ this.showRightMonthPicker = false;
726
+ }
727
+ selectLeftYear(year, event) {
728
+ if (event) {
729
+ event.stopPropagation();
730
+ }
731
+ this.leftMonthDate = new Date(year, this.leftMonthDate.getMonth(), 1);
732
+ if (this.rangeMode) {
733
+ this.rightMonthDate = new Date(year, this.leftMonthDate.getMonth() + 1, 1);
734
+ }
735
+ this.updateCalendarDays();
736
+ this.showLeftMonthPicker = false;
737
+ }
738
+ selectRightYear(year, event) {
739
+ if (event) {
740
+ event.stopPropagation();
741
+ }
742
+ this.rightMonthDate = new Date(year, this.rightMonthDate.getMonth(), 1);
743
+ this.leftMonthDate = new Date(year, this.rightMonthDate.getMonth() - 1, 1);
744
+ this.updateCalendarDays();
745
+ this.showRightMonthPicker = false;
746
+ }
747
+ writeValue(value) {
748
+ if (this.rangeMode) {
749
+ const rangeVal = value;
750
+ this.rangeValue = rangeVal || { startDate: null, endDate: null };
751
+ this.tempStartDate = this.rangeValue.startDate;
752
+ this.tempEndDate = this.rangeValue.endDate;
753
+ }
754
+ else {
755
+ this.singleValue = value;
756
+ this.tempSingleDate = this.singleValue;
757
+ }
758
+ }
759
+ registerOnChange(fn) {
760
+ this.onChange = fn;
761
+ }
762
+ registerOnTouched(fn) {
763
+ this.onTouched = fn;
764
+ }
765
+ setDisabledState(isDisabled) {
766
+ this.disabled = isDisabled;
767
+ }
768
+ resetDatePicker() {
769
+ if (this.rangeMode) {
770
+ this.rangeValue = { startDate: null, endDate: null };
771
+ this.tempStartDate = null;
772
+ this.tempEndDate = null;
773
+ this.onChange(this.rangeValue);
774
+ }
775
+ else {
776
+ this.singleValue = null;
777
+ this.tempSingleDate = null;
778
+ this.onChange(this.singleValue);
779
+ }
780
+ this.selectedFilter = '';
781
+ this.initializeDates();
782
+ this.updateCalendarDays();
783
+ }
784
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DatePickerComponent, deps: [{ token: i0.Renderer2 }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component });
785
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DatePickerComponent, isStandalone: true, selector: "app-date-picker", inputs: { label: "label", id: "id", placeholder: "placeholder", hasError: "hasError", errorMessage: "errorMessage", disabled: "disabled", minDate: "minDate", maxDate: "maxDate", rangeMode: "rangeMode", iconPosition: "iconPosition" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, providers: [
786
+ {
787
+ provide: NG_VALUE_ACCESSOR,
788
+ useExisting: forwardRef(() => DatePickerComponent),
789
+ multi: true
790
+ }
791
+ ], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, read: ElementRef }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"date-picker-wrapper\">\n <label *ngIf=\"label\" [for]=\"id\">{{ label }}</label>\n\n <div class=\"date-picker-container\">\n <div\n #trigger\n class=\"date-picker-input\"\n [class.error]=\"hasError\"\n [class.disabled]=\"disabled\"\n [class.open]=\"isOpen\"\n [class.icon-right]=\"iconPosition === 'right'\"\n (click)=\"toggleDropdown($event)\">\n\n <svg *ngIf=\"iconPosition === 'left'\" class=\"calendar-icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.66667 1.66667V4.16667M13.3333 1.66667V4.16667M2.5 7.5H17.5M4.16667 3.33333H15.8333C16.7538 3.33333 17.5 4.07953 17.5 5V16.6667C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6667V5C2.5 4.07953 3.24619 3.33333 4.16667 3.33333Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n\n <span class=\"date-picker-placeholder\" *ngIf=\"!getDisplayValue()\">\n {{ placeholder }}\n </span>\n <span class=\"date-picker-value\" *ngIf=\"getDisplayValue()\">\n {{ getDisplayValue() }}\n </span>\n\n <svg *ngIf=\"iconPosition === 'right'\" class=\"calendar-icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.66667 1.66667V4.16667M13.3333 1.66667V4.16667M2.5 7.5H17.5M4.16667 3.33333H15.8333C16.7538 3.33333 17.5 4.07953 17.5 5V16.6667C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6667V5C2.5 4.07953 3.24619 3.33333 4.16667 3.33333Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </div>\n\n <div *ngIf=\"hasError && errorMessage\" class=\"field-error\">\n {{ errorMessage }}\n </div>\n</div>\n\n<!-- Dropdown content (rendered with fixed position) -->\n<div *ngIf=\"isOpen\" class=\"date-picker-overlay\">\n <div #dropdown class=\"date-picker-dropdown\" [class.open]=\"isOpen\" [class.range-mode]=\"rangeMode\" [ngStyle]=\"getDropdownStyle()\">\n <div class=\"date-picker-content\">\n <!-- Sidebar with filters (only for range mode) -->\n <div class=\"filter-sidebar\" *ngIf=\"rangeMode\">\n <div\n *ngFor=\"let option of filterOptions\"\n class=\"filter-option\"\n [class.active]=\"selectedFilter === option.value\"\n (click)=\"selectFilter(option.value)\">\n {{ option.label }}\n </div>\n </div>\n\n <!-- Main content (calendars + footer) -->\n <div class=\"date-picker-main\">\n <!-- Calendars -->\n <div class=\"calendars-container\">\n <!-- Left Calendar (or single calendar in single mode) -->\n <div class=\"calendar\">\n <div class=\"calendar-header\">\n <button\n type=\"button\"\n class=\"nav-button\"\n [disabled]=\"!canNavigatePreviousMonth()\"\n [class.disabled]=\"!canNavigatePreviousMonth()\"\n (click)=\"previousMonth()\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7.5 2L3.5 6L7.5 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div class=\"month-year-selector\">\n <button type=\"button\" class=\"month-year\" (click)=\"toggleLeftMonthPicker($event)\">\n {{ getMonthYear(leftMonthDate) }}\n </button>\n\n <!-- Month/Year Picker Dropdown -->\n <div class=\"month-year-picker\" *ngIf=\"showLeftMonthPicker\" (click)=\"$event.stopPropagation()\">\n <div class=\"picker-section\">\n <div class=\"picker-title\">Mes</div>\n <div class=\"months-grid\">\n <button\n type=\"button\"\n *ngFor=\"let month of months; let i = index\"\n class=\"month-option\"\n [class.active]=\"i === leftMonthDate.getMonth()\"\n [class.disabled]=\"isMonthDisabled(i, leftMonthDate)\"\n [disabled]=\"isMonthDisabled(i, leftMonthDate)\"\n (click)=\"selectLeftMonth(i, $event)\">\n {{ month.substring(0, 3) }}\n </button>\n </div>\n </div>\n <div class=\"picker-section\">\n <div class=\"picker-header\">\n <button\n type=\"button\"\n class=\"year-nav-button\"\n [disabled]=\"!canNavigateLeftYearsPrevious()\"\n [class.disabled]=\"!canNavigateLeftYearsPrevious()\"\n (click)=\"previousLeftYearPage($event)\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.25 2.5L3.75 5L6.25 7.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div class=\"picker-title\">{{ getLeftYearRangeLabel() }}</div>\n <button\n type=\"button\"\n class=\"year-nav-button\"\n [disabled]=\"!canNavigateLeftYearsNext()\"\n [class.disabled]=\"!canNavigateLeftYearsNext()\"\n (click)=\"nextLeftYearPage($event)\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3.75 2.5L6.25 5L3.75 7.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n <div class=\"years-grid\">\n <button\n type=\"button\"\n *ngFor=\"let year of getLeftYears()\"\n class=\"year-option\"\n [class.active]=\"year === leftMonthDate.getFullYear()\"\n [class.disabled]=\"isYearDisabled(year)\"\n [disabled]=\"isYearDisabled(year)\"\n (click)=\"selectLeftYear(year, $event)\">\n {{ year }}\n </button>\n </div>\n </div>\n </div>\n </div>\n <button\n type=\"button\"\n class=\"nav-button\"\n [disabled]=\"!canNavigateNextMonth()\"\n [class.disabled]=\"!canNavigateNextMonth()\"\n (click)=\"nextMonth()\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4.5 2L8.5 6L4.5 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n\n <div class=\"calendar-grid\">\n <div class=\"weekday-header\" *ngFor=\"let day of weekDays\">\n {{ day }}\n </div>\n\n <div\n *ngFor=\"let day of leftCalendarDays; trackBy: trackByDate\"\n class=\"calendar-day\"\n [class.other-month]=\"!day.isCurrentMonth\"\n [class.today]=\"day.isToday\"\n [class.selected]=\"day.isSelected\"\n [class.in-range]=\"rangeMode && isInRange(day.date)\"\n [class.range-start]=\"day.isRangeStart\"\n [class.range-end]=\"day.isRangeEnd\"\n [class.disabled]=\"day.isDisabled\"\n (click)=\"onDayClick(day)\"\n (mouseenter)=\"onDayHover(day)\"\n (mouseleave)=\"onDayLeave()\">\n <span>{{ day.date.getDate() }}</span>\n </div>\n </div>\n </div>\n\n <!-- Right Calendar (only for range mode) -->\n <div class=\"calendar\" *ngIf=\"rangeMode\">\n <div class=\"calendar-header\">\n <div class=\"nav-button-placeholder\"></div>\n <div class=\"month-year-selector\">\n <button type=\"button\" class=\"month-year\" (click)=\"toggleRightMonthPicker($event)\">\n {{ getMonthYear(rightMonthDate) }}\n </button>\n\n <!-- Month/Year Picker Dropdown -->\n <div class=\"month-year-picker\" *ngIf=\"showRightMonthPicker\" (click)=\"$event.stopPropagation()\">\n <div class=\"picker-section\">\n <div class=\"picker-title\">Mes</div>\n <div class=\"months-grid\">\n <button\n type=\"button\"\n *ngFor=\"let month of months; let i = index\"\n class=\"month-option\"\n [class.active]=\"i === rightMonthDate.getMonth()\"\n [class.disabled]=\"isMonthDisabled(i, rightMonthDate)\"\n [disabled]=\"isMonthDisabled(i, rightMonthDate)\"\n (click)=\"selectRightMonth(i, $event)\">\n {{ month.substring(0, 3) }}\n </button>\n </div>\n </div>\n <div class=\"picker-section\">\n <div class=\"picker-header\">\n <button\n type=\"button\"\n class=\"year-nav-button\"\n [disabled]=\"!canNavigateRightYearsPrevious()\"\n [class.disabled]=\"!canNavigateRightYearsPrevious()\"\n (click)=\"previousRightYearPage($event)\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.25 2.5L3.75 5L6.25 7.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div class=\"picker-title\">{{ getRightYearRangeLabel() }}</div>\n <button\n type=\"button\"\n class=\"year-nav-button\"\n [disabled]=\"!canNavigateRightYearsNext()\"\n [class.disabled]=\"!canNavigateRightYearsNext()\"\n (click)=\"nextRightYearPage($event)\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3.75 2.5L6.25 5L3.75 7.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n <div class=\"years-grid\">\n <button\n type=\"button\"\n *ngFor=\"let year of getRightYears()\"\n class=\"year-option\"\n [class.active]=\"year === rightMonthDate.getFullYear()\"\n [class.disabled]=\"isYearDisabled(year)\"\n [disabled]=\"isYearDisabled(year)\"\n (click)=\"selectRightYear(year, $event)\">\n {{ year }}\n </button>\n </div>\n </div>\n </div>\n </div>\n <button\n type=\"button\"\n class=\"nav-button\"\n [disabled]=\"!canNavigateNextMonth()\"\n [class.disabled]=\"!canNavigateNextMonth()\"\n (click)=\"nextMonth()\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4.5 2L8.5 6L4.5 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n\n <div class=\"calendar-grid\">\n <div class=\"weekday-header\" *ngFor=\"let day of weekDays\">\n {{ day }}\n </div>\n\n <div\n *ngFor=\"let day of rightCalendarDays; trackBy: trackByDate\"\n class=\"calendar-day\"\n [class.other-month]=\"!day.isCurrentMonth\"\n [class.today]=\"day.isToday\"\n [class.selected]=\"day.isSelected\"\n [class.in-range]=\"isInRange(day.date)\"\n [class.range-start]=\"day.isRangeStart\"\n [class.range-end]=\"day.isRangeEnd\"\n [class.disabled]=\"day.isDisabled\"\n (click)=\"onDayClick(day)\"\n (mouseenter)=\"onDayHover(day)\"\n (mouseleave)=\"onDayLeave()\">\n <span>{{ day.date.getDate() }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Footer with dates and actions (only for range mode) -->\n <div class=\"footer\" *ngIf=\"rangeMode\">\n <div class=\"selected-dates\">\n <div class=\"date-display\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5.33333 1.33333V3.33333M10.6667 1.33333V3.33333M2 6H14M3.33333 2.66667H12.6667C13.403 2.66667 14 3.26362 14 4V13.3333C14 14.0697 13.403 14.6667 12.6667 14.6667H3.33333C2.59695 14.6667 2 14.0697 2 13.3333V4C2 3.26362 2.59695 2.66667 3.33333 2.66667Z\" stroke=\"#6B7280\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"date-text\">{{ getStartDateDisplay() }}</span>\n </div>\n <span class=\"date-separator\">-</span>\n <div class=\"date-display\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5.33333 1.33333V3.33333M10.6667 1.33333V3.33333M2 6H14M3.33333 2.66667H12.6667C13.403 2.66667 14 3.26362 14 4V13.3333C14 14.0697 13.403 14.6667 12.6667 14.6667H3.33333C2.59695 14.6667 2 14.0697 2 13.3333V4C2 3.26362 2.59695 2.66667 3.33333 2.66667Z\" stroke=\"#6B7280\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"date-text\">{{ getEndDateDisplay() }}</span>\n </div>\n </div>\n\n <div class=\"action-buttons\">\n <button type=\"button\" class=\"btn-cancel\" (click)=\"cancel()\">\n Cancelar\n </button>\n <button type=\"button\" class=\"btn-apply\" (click)=\"apply()\">\n Aplicar\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".date-picker-wrapper{display:flex;flex-direction:column;width:100%;margin-bottom:6px;padding:0 4px}.date-picker-wrapper label{display:block;margin-bottom:.5rem;font-family:Quicksand,sans-serif;font-weight:500;font-size:14px;color:#585d61}.date-picker-container{position:relative;width:100%}.date-picker-input{display:flex;align-items:center;gap:.5rem;width:100%;min-height:44px;height:44px;padding:0 .75rem;border:1px solid #EAECF5;box-shadow:0 1px 2px #a1afec66;border-radius:8px;background:#fff;cursor:pointer;transition:all .2s ease;font-family:Quicksand,sans-serif}.date-picker-input:hover:not(.disabled){border-color:#fbd399}.date-picker-input.open{border-color:#fbd399;box-shadow:0 0 0 4px #ffe8c8,0 1px 2px #0a0d120d}.date-picker-input.error{border-color:#f04438}.date-picker-input.disabled{background:#f9fafb;cursor:not-allowed;opacity:.6}.date-picker-input .calendar-icon{color:#a4a7ae;flex-shrink:0}.date-picker-input .date-picker-placeholder{color:#a4a7ae;font-size:14px;flex:1}.date-picker-input .date-picker-value{color:#2e353a;font-size:14px;font-weight:500;flex:1}.field-error{color:#f04438;font-size:.875rem;margin-top:.25rem;font-family:Quicksand,sans-serif}.date-picker-overlay{position:fixed;inset:0;z-index:9999;pointer-events:none}.date-picker-dropdown{pointer-events:all;background:#fff;border-radius:12px;box-shadow:0 10px 40px #00000026;opacity:0;transform:translateY(-10px);transition:all .2s ease;overflow:visible}.date-picker-dropdown.open{opacity:1;transform:translateY(0)}.date-picker-content{display:flex;font-family:Quicksand,sans-serif;overflow:visible}.date-picker-main{display:flex;flex-direction:column;flex:1;overflow:visible}.filter-sidebar{padding:.5rem .8rem;min-width:170px;display:flex;flex-direction:column;border-right:1px solid #F3F4F6}.filter-sidebar .filter-option{font-family:Quicksand,sans-serif;padding:.625rem .8rem;color:#6b7280;cursor:pointer;transition:all .15s ease;white-space:nowrap;position:relative;font-weight:400;font-size:14px}.filter-sidebar .filter-option:hover:not(.active){background:#f9fafb}.filter-sidebar .filter-option.active{background:#fef4e6;color:#f7a733;font-weight:500;border-radius:6px}.calendars-container{display:flex;gap:3rem;padding:1rem;overflow:visible}.date-picker-dropdown:not(.range-mode) .calendars-container{gap:0;justify-content:center}.calendar{display:flex;flex-direction:column;gap:1rem;position:relative;overflow:visible}.calendar .calendar-header{display:flex;align-items:center;justify-content:space-between;padding:0 .25rem;margin-bottom:.5rem;position:relative;overflow:visible}.calendar .calendar-header .month-year-selector{position:relative;flex:1;display:flex;justify-content:center}.calendar .calendar-header .month-year{font-size:.9375rem;font-weight:600;color:#1f2937;min-width:160px;text-align:center;background:transparent;border:none;cursor:pointer;padding:.375rem .5rem;border-radius:6px;transition:all .15s ease}.calendar .calendar-header .month-year:hover{background:#f3f4f6}.calendar .calendar-header .nav-button{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:transparent;border-radius:6px;cursor:pointer;color:#6b7280;transition:all .15s ease;padding:0}.calendar .calendar-header .nav-button:hover:not(:disabled):not(.disabled){background:#f3f4f6;color:#1f2937}.calendar .calendar-header .nav-button.disabled,.calendar .calendar-header .nav-button:disabled{color:#d1d5db;cursor:not-allowed;opacity:.4}.calendar .calendar-header .nav-button svg{width:10px;height:10px}.calendar .calendar-header .nav-button-placeholder{width:28px;height:28px}.calendar .month-year-picker{position:absolute;top:100%;left:50%;transform:translate(-50%);margin-top:.5rem;background:#fff;border-radius:8px;box-shadow:0 10px 30px #0003;z-index:10002;padding:1rem;min-width:280px;border:1px solid #E5E7EB}.calendar .month-year-picker .picker-section{margin-bottom:1rem}.calendar .month-year-picker .picker-section:last-child{margin-bottom:0}.calendar .month-year-picker .picker-section .picker-title{font-size:.75rem;font-weight:600;color:#6b7280;text-transform:uppercase;letter-spacing:.5px;margin-bottom:.5rem}.calendar .month-year-picker .picker-section .picker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem}.calendar .month-year-picker .picker-section .picker-header .picker-title{margin-bottom:0;font-size:.75rem;font-weight:600;color:#1f2937;text-transform:none;letter-spacing:0}.calendar .month-year-picker .picker-section .picker-header .year-nav-button{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;border-radius:4px;cursor:pointer;color:#6b7280;transition:all .15s ease;padding:0}.calendar .month-year-picker .picker-section .picker-header .year-nav-button:hover:not(:disabled):not(.disabled){background:#f3f4f6;color:#1f2937}.calendar .month-year-picker .picker-section .picker-header .year-nav-button.disabled,.calendar .month-year-picker .picker-section .picker-header .year-nav-button:disabled{color:#d1d5db;cursor:not-allowed;opacity:.5}.calendar .month-year-picker .picker-section .picker-header .year-nav-button svg{width:10px;height:10px}.calendar .month-year-picker .months-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:.375rem}.calendar .month-year-picker .months-grid .month-option{padding:.5rem;border:1px solid #E5E7EB;background:#fff;border-radius:6px;font-size:.75rem;font-weight:500;color:#6b7280;cursor:pointer;transition:all .15s ease}.calendar .month-year-picker .months-grid .month-option:hover{background:#f9fafb;border-color:#d1d5db}.calendar .month-year-picker .months-grid .month-option.active{background:#f59100;color:#fff;border-color:#f59100}.calendar .month-year-picker .months-grid .month-option.disabled,.calendar .month-year-picker .months-grid .month-option:disabled{background:#f9fafb;color:#d1d5db;border-color:#e5e7eb;cursor:not-allowed;pointer-events:none}.calendar .month-year-picker .years-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:.375rem;max-height:200px;overflow-y:auto}.calendar .month-year-picker .years-grid .year-option{padding:.5rem;border:1px solid #E5E7EB;background:#fff;border-radius:6px;font-size:.75rem;font-weight:500;color:#6b7280;cursor:pointer;transition:all .15s ease}.calendar .month-year-picker .years-grid .year-option:hover{background:#f9fafb;border-color:#d1d5db}.calendar .month-year-picker .years-grid .year-option.active{background:#f59100;color:#fff;border-color:#f59100}.calendar .month-year-picker .years-grid .year-option.disabled,.calendar .month-year-picker .years-grid .year-option:disabled{background:#f9fafb;color:#d1d5db;border-color:#e5e7eb;cursor:not-allowed;pointer-events:none}.calendar .calendar-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px 0}.calendar .calendar-grid .weekday-header{display:flex;align-items:center;justify-content:center;font-size:.6875rem;font-weight:500;color:#9ca3af;padding:.5rem 0;text-transform:uppercase;letter-spacing:.5px}.calendar .calendar-grid .calendar-day{display:flex;align-items:center;justify-content:center;width:36px;height:36px;font-size:.8125rem;color:#1f2937;cursor:pointer;transition:all .15s ease;position:relative;font-weight:400;border-radius:0}.calendar .calendar-grid .calendar-day.other-month{color:#d1d5db}.calendar .calendar-grid .calendar-day.today{font-weight:600;color:#f59100;background:transparent}.calendar .calendar-grid .calendar-day.today:after{content:\"\";position:absolute;bottom:4px;left:50%;transform:translate(-50%);width:4px;height:4px;background:#f59100;border-radius:50%}.calendar .calendar-grid .calendar-day:hover:not(.disabled):not(.selected):not(.range-start):not(.range-end):not(.in-range){background:#fef4e6;border-radius:50%}.calendar .calendar-grid .calendar-day.in-range:hover:not(.disabled):not(.range-start):not(.range-end){position:relative;background:transparent}.calendar .calendar-grid .calendar-day.in-range:hover:not(.disabled):not(.range-start):not(.range-end):before{content:\"\";position:absolute;inset:0;background:#fef4e6;z-index:-1;border-radius:0}.calendar .calendar-grid .calendar-day.in-range:hover:not(.disabled):not(.range-start):not(.range-end):after{content:\"\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:100%;height:100%;background:#fef4e6;border-radius:50%;z-index:0}.calendar .calendar-grid .calendar-day.in-range:hover:not(.disabled):not(.range-start):not(.range-end) span{position:relative;z-index:1;color:#f59100}.calendar .calendar-grid .calendar-day.in-range:not(.disabled):not(.range-start):not(.range-end){background:#fef4e6;color:#f59100;border-radius:0}.calendar .calendar-grid .calendar-day.in-range:not(.disabled):not(.range-start):not(.range-end):nth-child(7n+8){border-radius:50% 0 0 50%}.calendar .calendar-grid .calendar-day.in-range:not(.disabled):not(.range-start):not(.range-end):nth-child(7n+14){border-radius:0 50% 50% 0}.calendar .calendar-grid .calendar-day.in-range:not(.disabled):not(.range-start):not(.range-end):nth-child(7n+8):nth-child(7n+14){border-radius:50%}.calendar .calendar-grid .calendar-day.range-start:not(.disabled){position:relative;background:transparent;color:#fff;font-weight:600;z-index:2}.calendar .calendar-grid .calendar-day.range-start:not(.disabled):before{content:\"\";position:absolute;inset:0;background:#fef4e6;z-index:-1;border-radius:50% 0 0 50%}.calendar .calendar-grid .calendar-day.range-start:not(.disabled):after{content:\"\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:100%;height:100%;background:#f59100;border-radius:50%;z-index:1}.calendar .calendar-grid .calendar-day.range-start:not(.disabled) span{position:relative;z-index:2}.calendar .calendar-grid .calendar-day.range-start:not(.disabled).range-end:before{border-radius:50%}.calendar .calendar-grid .calendar-day.range-end:not(.disabled){position:relative;background:transparent;color:#fff;font-weight:600;z-index:2}.calendar .calendar-grid .calendar-day.range-end:not(.disabled):before{content:\"\";position:absolute;inset:0;background:#fef4e6;z-index:-1;border-radius:0 50% 50% 0}.calendar .calendar-grid .calendar-day.range-end:not(.disabled):after{content:\"\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:100%;height:100%;background:#f59100;border-radius:50%;z-index:1}.calendar .calendar-grid .calendar-day.range-end:not(.disabled) span{position:relative;z-index:2}.calendar .calendar-grid .calendar-day.range-end:not(.disabled).range-start:before{border-radius:50%}.calendar .calendar-grid .calendar-day.range-start.in-range:not(.disabled){position:relative}.calendar .calendar-grid .calendar-day.range-start.in-range:not(.disabled):before{content:\"\";position:absolute;inset:0 -2px 0 50%;background:#fef4e6;z-index:-1}.calendar .calendar-grid .calendar-day.range-end.in-range:not(.disabled){position:relative}.calendar .calendar-grid .calendar-day.range-end.in-range:not(.disabled):before{content:\"\";position:absolute;inset:0 50% 0 -2px;background:#fef4e6;z-index:-1}.calendar .calendar-grid .calendar-day.selected:not(.range-start):not(.range-end){background:#f59100;color:#fff;font-weight:600;border-radius:50%}.calendar .calendar-grid .calendar-day.disabled{color:#e5e7eb;cursor:not-allowed;pointer-events:none}.footer{display:flex;align-items:center;justify-content:space-between;padding:1rem;border-top:1px solid #E5E7EB}.footer .selected-dates{display:flex;align-items:center;gap:.75rem}.footer .selected-dates .date-display{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;background:#fff;border:1px solid #E5E7EB;border-radius:6px;font-size:.8125rem;color:#6b7280}.footer .selected-dates .date-display svg{flex-shrink:0;color:#9ca3af}.footer .selected-dates .date-display .date-text{font-weight:400;white-space:nowrap;-webkit-user-select:none;user-select:none}.footer .selected-dates .date-separator{color:#9ca3af;font-weight:400;font-size:.875rem}.footer .action-buttons{display:flex;gap:.75rem}.footer .action-buttons button{padding:.625rem 1.75rem;border-radius:8px;font-size:.875rem;font-weight:500;font-family:Quicksand,sans-serif;cursor:pointer;transition:all .15s ease;border:none;outline:none}.footer .action-buttons button:focus-visible{outline:2px solid rgba(245,145,0,.3);outline-offset:2px}.footer .action-buttons .btn-cancel{background:#fff;color:#6b7280;border:1px solid #D1D5DB}.footer .action-buttons .btn-cancel:hover{background:#f9fafb;border-color:#9ca3af}.footer .action-buttons .btn-apply{background:#f59100;color:#fff;border:1px solid #F59100}.footer .action-buttons .btn-apply:hover{background:#e08500;border-color:#e08500}.footer .action-buttons .btn-apply:active{background:#cc7a00;border-color:#cc7a00}@media (max-width: 768px){.date-picker-content{flex-direction:column}.filter-sidebar{display:none}.calendars-container{padding:.75rem;gap:0;justify-content:center}.calendars-container .calendar:last-child:not(:first-child){display:none}.calendar .calendar-header .month-year-selector{flex:1}.calendar .calendar-header .month-year{min-width:auto;font-size:.875rem;padding:.25rem .375rem}.calendar .calendar-header .nav-button{width:28px;height:28px}.calendar .calendar-header .nav-button svg{width:10px;height:10px}.calendar .calendar-header .nav-button-placeholder{display:none}.calendar .month-year-picker{min-width:240px;padding:.75rem}.calendar .month-year-picker .picker-section .picker-title{font-size:.7rem}.calendar .month-year-picker .months-grid{grid-template-columns:repeat(3,1fr);gap:.25rem}.calendar .month-year-picker .months-grid .month-option{padding:.4rem;font-size:.7rem}.calendar .month-year-picker .years-grid{grid-template-columns:repeat(3,1fr);gap:.25rem;max-height:150px}.calendar .month-year-picker .years-grid .year-option{padding:.4rem;font-size:.7rem}.calendar .calendar-grid{gap:2px 0}.calendar .calendar-grid .calendar-day{width:30px;height:30px;font-size:.75rem}.calendar .calendar-grid .weekday-header{font-size:.65rem}.footer{flex-direction:column;gap:.75rem;padding:.75rem}.footer .selected-dates{width:100%;justify-content:center;flex-wrap:wrap;gap:.5rem}.footer .selected-dates .date-display{font-size:.7rem;padding:.35rem .5rem}.footer .selected-dates .date-display svg{width:12px;height:12px}.footer .selected-dates .date-separator{font-size:.7rem}.footer .action-buttons{width:100%;gap:.5rem}.footer .action-buttons button{flex:1;padding:.625rem .75rem;font-size:.75rem}.date-picker-dropdown{width:280px!important;max-width:calc(100vw - 2rem);max-height:calc(100vh - 4rem);overflow-y:auto}.date-picker-dropdown.range-mode{width:280px!important}}@media (max-width: 480px){.calendars-container{padding:.5rem}.calendar .calendar-header .month-year{font-size:.8125rem;padding:.2rem .3rem}.calendar .calendar-header .nav-button{width:26px;height:26px}.calendar .calendar-header .nav-button svg{width:9px;height:9px}.calendar .month-year-picker{min-width:220px;padding:.625rem}.calendar .month-year-picker .picker-section{margin-bottom:.75rem}.calendar .month-year-picker .picker-section .picker-title{font-size:.65rem;margin-bottom:.375rem}.calendar .month-year-picker .months-grid{gap:.2rem}.calendar .month-year-picker .months-grid .month-option{padding:.35rem;font-size:.65rem}.calendar .month-year-picker .years-grid{gap:.2rem;max-height:120px}.calendar .month-year-picker .years-grid .year-option{padding:.35rem;font-size:.65rem}.calendar .calendar-grid{gap:1px 0}.calendar .calendar-grid .weekday-header{font-size:.6rem;padding:.35rem 0}.calendar .calendar-grid .calendar-day{width:28px;height:28px;font-size:.7rem}.footer{padding:.5rem;gap:.5rem}.footer .selected-dates{gap:.4rem}.footer .selected-dates .date-display{font-size:.65rem;padding:.3rem .4rem}.footer .selected-dates .date-display svg{width:11px;height:11px}.footer .selected-dates .date-separator{font-size:.65rem}.footer .action-buttons{gap:.4rem}.footer .action-buttons button{padding:.5rem .625rem;font-size:.7rem}.date-picker-dropdown{width:260px!important;max-width:calc(100vw - 1rem)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: FormsModule }] });
792
+ }
793
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DatePickerComponent, decorators: [{
794
+ type: Component,
795
+ args: [{ selector: 'app-date-picker', standalone: true, imports: [CommonModule, ReactiveFormsModule, FormsModule], providers: [
796
+ {
797
+ provide: NG_VALUE_ACCESSOR,
798
+ useExisting: forwardRef(() => DatePickerComponent),
799
+ multi: true
800
+ }
801
+ ], template: "<div class=\"date-picker-wrapper\">\n <label *ngIf=\"label\" [for]=\"id\">{{ label }}</label>\n\n <div class=\"date-picker-container\">\n <div\n #trigger\n class=\"date-picker-input\"\n [class.error]=\"hasError\"\n [class.disabled]=\"disabled\"\n [class.open]=\"isOpen\"\n [class.icon-right]=\"iconPosition === 'right'\"\n (click)=\"toggleDropdown($event)\">\n\n <svg *ngIf=\"iconPosition === 'left'\" class=\"calendar-icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.66667 1.66667V4.16667M13.3333 1.66667V4.16667M2.5 7.5H17.5M4.16667 3.33333H15.8333C16.7538 3.33333 17.5 4.07953 17.5 5V16.6667C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6667V5C2.5 4.07953 3.24619 3.33333 4.16667 3.33333Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n\n <span class=\"date-picker-placeholder\" *ngIf=\"!getDisplayValue()\">\n {{ placeholder }}\n </span>\n <span class=\"date-picker-value\" *ngIf=\"getDisplayValue()\">\n {{ getDisplayValue() }}\n </span>\n\n <svg *ngIf=\"iconPosition === 'right'\" class=\"calendar-icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.66667 1.66667V4.16667M13.3333 1.66667V4.16667M2.5 7.5H17.5M4.16667 3.33333H15.8333C16.7538 3.33333 17.5 4.07953 17.5 5V16.6667C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6667V5C2.5 4.07953 3.24619 3.33333 4.16667 3.33333Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </div>\n\n <div *ngIf=\"hasError && errorMessage\" class=\"field-error\">\n {{ errorMessage }}\n </div>\n</div>\n\n<!-- Dropdown content (rendered with fixed position) -->\n<div *ngIf=\"isOpen\" class=\"date-picker-overlay\">\n <div #dropdown class=\"date-picker-dropdown\" [class.open]=\"isOpen\" [class.range-mode]=\"rangeMode\" [ngStyle]=\"getDropdownStyle()\">\n <div class=\"date-picker-content\">\n <!-- Sidebar with filters (only for range mode) -->\n <div class=\"filter-sidebar\" *ngIf=\"rangeMode\">\n <div\n *ngFor=\"let option of filterOptions\"\n class=\"filter-option\"\n [class.active]=\"selectedFilter === option.value\"\n (click)=\"selectFilter(option.value)\">\n {{ option.label }}\n </div>\n </div>\n\n <!-- Main content (calendars + footer) -->\n <div class=\"date-picker-main\">\n <!-- Calendars -->\n <div class=\"calendars-container\">\n <!-- Left Calendar (or single calendar in single mode) -->\n <div class=\"calendar\">\n <div class=\"calendar-header\">\n <button\n type=\"button\"\n class=\"nav-button\"\n [disabled]=\"!canNavigatePreviousMonth()\"\n [class.disabled]=\"!canNavigatePreviousMonth()\"\n (click)=\"previousMonth()\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7.5 2L3.5 6L7.5 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div class=\"month-year-selector\">\n <button type=\"button\" class=\"month-year\" (click)=\"toggleLeftMonthPicker($event)\">\n {{ getMonthYear(leftMonthDate) }}\n </button>\n\n <!-- Month/Year Picker Dropdown -->\n <div class=\"month-year-picker\" *ngIf=\"showLeftMonthPicker\" (click)=\"$event.stopPropagation()\">\n <div class=\"picker-section\">\n <div class=\"picker-title\">Mes</div>\n <div class=\"months-grid\">\n <button\n type=\"button\"\n *ngFor=\"let month of months; let i = index\"\n class=\"month-option\"\n [class.active]=\"i === leftMonthDate.getMonth()\"\n [class.disabled]=\"isMonthDisabled(i, leftMonthDate)\"\n [disabled]=\"isMonthDisabled(i, leftMonthDate)\"\n (click)=\"selectLeftMonth(i, $event)\">\n {{ month.substring(0, 3) }}\n </button>\n </div>\n </div>\n <div class=\"picker-section\">\n <div class=\"picker-header\">\n <button\n type=\"button\"\n class=\"year-nav-button\"\n [disabled]=\"!canNavigateLeftYearsPrevious()\"\n [class.disabled]=\"!canNavigateLeftYearsPrevious()\"\n (click)=\"previousLeftYearPage($event)\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.25 2.5L3.75 5L6.25 7.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div class=\"picker-title\">{{ getLeftYearRangeLabel() }}</div>\n <button\n type=\"button\"\n class=\"year-nav-button\"\n [disabled]=\"!canNavigateLeftYearsNext()\"\n [class.disabled]=\"!canNavigateLeftYearsNext()\"\n (click)=\"nextLeftYearPage($event)\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3.75 2.5L6.25 5L3.75 7.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n <div class=\"years-grid\">\n <button\n type=\"button\"\n *ngFor=\"let year of getLeftYears()\"\n class=\"year-option\"\n [class.active]=\"year === leftMonthDate.getFullYear()\"\n [class.disabled]=\"isYearDisabled(year)\"\n [disabled]=\"isYearDisabled(year)\"\n (click)=\"selectLeftYear(year, $event)\">\n {{ year }}\n </button>\n </div>\n </div>\n </div>\n </div>\n <button\n type=\"button\"\n class=\"nav-button\"\n [disabled]=\"!canNavigateNextMonth()\"\n [class.disabled]=\"!canNavigateNextMonth()\"\n (click)=\"nextMonth()\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4.5 2L8.5 6L4.5 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n\n <div class=\"calendar-grid\">\n <div class=\"weekday-header\" *ngFor=\"let day of weekDays\">\n {{ day }}\n </div>\n\n <div\n *ngFor=\"let day of leftCalendarDays; trackBy: trackByDate\"\n class=\"calendar-day\"\n [class.other-month]=\"!day.isCurrentMonth\"\n [class.today]=\"day.isToday\"\n [class.selected]=\"day.isSelected\"\n [class.in-range]=\"rangeMode && isInRange(day.date)\"\n [class.range-start]=\"day.isRangeStart\"\n [class.range-end]=\"day.isRangeEnd\"\n [class.disabled]=\"day.isDisabled\"\n (click)=\"onDayClick(day)\"\n (mouseenter)=\"onDayHover(day)\"\n (mouseleave)=\"onDayLeave()\">\n <span>{{ day.date.getDate() }}</span>\n </div>\n </div>\n </div>\n\n <!-- Right Calendar (only for range mode) -->\n <div class=\"calendar\" *ngIf=\"rangeMode\">\n <div class=\"calendar-header\">\n <div class=\"nav-button-placeholder\"></div>\n <div class=\"month-year-selector\">\n <button type=\"button\" class=\"month-year\" (click)=\"toggleRightMonthPicker($event)\">\n {{ getMonthYear(rightMonthDate) }}\n </button>\n\n <!-- Month/Year Picker Dropdown -->\n <div class=\"month-year-picker\" *ngIf=\"showRightMonthPicker\" (click)=\"$event.stopPropagation()\">\n <div class=\"picker-section\">\n <div class=\"picker-title\">Mes</div>\n <div class=\"months-grid\">\n <button\n type=\"button\"\n *ngFor=\"let month of months; let i = index\"\n class=\"month-option\"\n [class.active]=\"i === rightMonthDate.getMonth()\"\n [class.disabled]=\"isMonthDisabled(i, rightMonthDate)\"\n [disabled]=\"isMonthDisabled(i, rightMonthDate)\"\n (click)=\"selectRightMonth(i, $event)\">\n {{ month.substring(0, 3) }}\n </button>\n </div>\n </div>\n <div class=\"picker-section\">\n <div class=\"picker-header\">\n <button\n type=\"button\"\n class=\"year-nav-button\"\n [disabled]=\"!canNavigateRightYearsPrevious()\"\n [class.disabled]=\"!canNavigateRightYearsPrevious()\"\n (click)=\"previousRightYearPage($event)\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.25 2.5L3.75 5L6.25 7.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div class=\"picker-title\">{{ getRightYearRangeLabel() }}</div>\n <button\n type=\"button\"\n class=\"year-nav-button\"\n [disabled]=\"!canNavigateRightYearsNext()\"\n [class.disabled]=\"!canNavigateRightYearsNext()\"\n (click)=\"nextRightYearPage($event)\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3.75 2.5L6.25 5L3.75 7.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n <div class=\"years-grid\">\n <button\n type=\"button\"\n *ngFor=\"let year of getRightYears()\"\n class=\"year-option\"\n [class.active]=\"year === rightMonthDate.getFullYear()\"\n [class.disabled]=\"isYearDisabled(year)\"\n [disabled]=\"isYearDisabled(year)\"\n (click)=\"selectRightYear(year, $event)\">\n {{ year }}\n </button>\n </div>\n </div>\n </div>\n </div>\n <button\n type=\"button\"\n class=\"nav-button\"\n [disabled]=\"!canNavigateNextMonth()\"\n [class.disabled]=\"!canNavigateNextMonth()\"\n (click)=\"nextMonth()\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4.5 2L8.5 6L4.5 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n\n <div class=\"calendar-grid\">\n <div class=\"weekday-header\" *ngFor=\"let day of weekDays\">\n {{ day }}\n </div>\n\n <div\n *ngFor=\"let day of rightCalendarDays; trackBy: trackByDate\"\n class=\"calendar-day\"\n [class.other-month]=\"!day.isCurrentMonth\"\n [class.today]=\"day.isToday\"\n [class.selected]=\"day.isSelected\"\n [class.in-range]=\"isInRange(day.date)\"\n [class.range-start]=\"day.isRangeStart\"\n [class.range-end]=\"day.isRangeEnd\"\n [class.disabled]=\"day.isDisabled\"\n (click)=\"onDayClick(day)\"\n (mouseenter)=\"onDayHover(day)\"\n (mouseleave)=\"onDayLeave()\">\n <span>{{ day.date.getDate() }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Footer with dates and actions (only for range mode) -->\n <div class=\"footer\" *ngIf=\"rangeMode\">\n <div class=\"selected-dates\">\n <div class=\"date-display\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5.33333 1.33333V3.33333M10.6667 1.33333V3.33333M2 6H14M3.33333 2.66667H12.6667C13.403 2.66667 14 3.26362 14 4V13.3333C14 14.0697 13.403 14.6667 12.6667 14.6667H3.33333C2.59695 14.6667 2 14.0697 2 13.3333V4C2 3.26362 2.59695 2.66667 3.33333 2.66667Z\" stroke=\"#6B7280\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"date-text\">{{ getStartDateDisplay() }}</span>\n </div>\n <span class=\"date-separator\">-</span>\n <div class=\"date-display\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5.33333 1.33333V3.33333M10.6667 1.33333V3.33333M2 6H14M3.33333 2.66667H12.6667C13.403 2.66667 14 3.26362 14 4V13.3333C14 14.0697 13.403 14.6667 12.6667 14.6667H3.33333C2.59695 14.6667 2 14.0697 2 13.3333V4C2 3.26362 2.59695 2.66667 3.33333 2.66667Z\" stroke=\"#6B7280\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"date-text\">{{ getEndDateDisplay() }}</span>\n </div>\n </div>\n\n <div class=\"action-buttons\">\n <button type=\"button\" class=\"btn-cancel\" (click)=\"cancel()\">\n Cancelar\n </button>\n <button type=\"button\" class=\"btn-apply\" (click)=\"apply()\">\n Aplicar\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".date-picker-wrapper{display:flex;flex-direction:column;width:100%;margin-bottom:6px;padding:0 4px}.date-picker-wrapper label{display:block;margin-bottom:.5rem;font-family:Quicksand,sans-serif;font-weight:500;font-size:14px;color:#585d61}.date-picker-container{position:relative;width:100%}.date-picker-input{display:flex;align-items:center;gap:.5rem;width:100%;min-height:44px;height:44px;padding:0 .75rem;border:1px solid #EAECF5;box-shadow:0 1px 2px #a1afec66;border-radius:8px;background:#fff;cursor:pointer;transition:all .2s ease;font-family:Quicksand,sans-serif}.date-picker-input:hover:not(.disabled){border-color:#fbd399}.date-picker-input.open{border-color:#fbd399;box-shadow:0 0 0 4px #ffe8c8,0 1px 2px #0a0d120d}.date-picker-input.error{border-color:#f04438}.date-picker-input.disabled{background:#f9fafb;cursor:not-allowed;opacity:.6}.date-picker-input .calendar-icon{color:#a4a7ae;flex-shrink:0}.date-picker-input .date-picker-placeholder{color:#a4a7ae;font-size:14px;flex:1}.date-picker-input .date-picker-value{color:#2e353a;font-size:14px;font-weight:500;flex:1}.field-error{color:#f04438;font-size:.875rem;margin-top:.25rem;font-family:Quicksand,sans-serif}.date-picker-overlay{position:fixed;inset:0;z-index:9999;pointer-events:none}.date-picker-dropdown{pointer-events:all;background:#fff;border-radius:12px;box-shadow:0 10px 40px #00000026;opacity:0;transform:translateY(-10px);transition:all .2s ease;overflow:visible}.date-picker-dropdown.open{opacity:1;transform:translateY(0)}.date-picker-content{display:flex;font-family:Quicksand,sans-serif;overflow:visible}.date-picker-main{display:flex;flex-direction:column;flex:1;overflow:visible}.filter-sidebar{padding:.5rem .8rem;min-width:170px;display:flex;flex-direction:column;border-right:1px solid #F3F4F6}.filter-sidebar .filter-option{font-family:Quicksand,sans-serif;padding:.625rem .8rem;color:#6b7280;cursor:pointer;transition:all .15s ease;white-space:nowrap;position:relative;font-weight:400;font-size:14px}.filter-sidebar .filter-option:hover:not(.active){background:#f9fafb}.filter-sidebar .filter-option.active{background:#fef4e6;color:#f7a733;font-weight:500;border-radius:6px}.calendars-container{display:flex;gap:3rem;padding:1rem;overflow:visible}.date-picker-dropdown:not(.range-mode) .calendars-container{gap:0;justify-content:center}.calendar{display:flex;flex-direction:column;gap:1rem;position:relative;overflow:visible}.calendar .calendar-header{display:flex;align-items:center;justify-content:space-between;padding:0 .25rem;margin-bottom:.5rem;position:relative;overflow:visible}.calendar .calendar-header .month-year-selector{position:relative;flex:1;display:flex;justify-content:center}.calendar .calendar-header .month-year{font-size:.9375rem;font-weight:600;color:#1f2937;min-width:160px;text-align:center;background:transparent;border:none;cursor:pointer;padding:.375rem .5rem;border-radius:6px;transition:all .15s ease}.calendar .calendar-header .month-year:hover{background:#f3f4f6}.calendar .calendar-header .nav-button{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:transparent;border-radius:6px;cursor:pointer;color:#6b7280;transition:all .15s ease;padding:0}.calendar .calendar-header .nav-button:hover:not(:disabled):not(.disabled){background:#f3f4f6;color:#1f2937}.calendar .calendar-header .nav-button.disabled,.calendar .calendar-header .nav-button:disabled{color:#d1d5db;cursor:not-allowed;opacity:.4}.calendar .calendar-header .nav-button svg{width:10px;height:10px}.calendar .calendar-header .nav-button-placeholder{width:28px;height:28px}.calendar .month-year-picker{position:absolute;top:100%;left:50%;transform:translate(-50%);margin-top:.5rem;background:#fff;border-radius:8px;box-shadow:0 10px 30px #0003;z-index:10002;padding:1rem;min-width:280px;border:1px solid #E5E7EB}.calendar .month-year-picker .picker-section{margin-bottom:1rem}.calendar .month-year-picker .picker-section:last-child{margin-bottom:0}.calendar .month-year-picker .picker-section .picker-title{font-size:.75rem;font-weight:600;color:#6b7280;text-transform:uppercase;letter-spacing:.5px;margin-bottom:.5rem}.calendar .month-year-picker .picker-section .picker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem}.calendar .month-year-picker .picker-section .picker-header .picker-title{margin-bottom:0;font-size:.75rem;font-weight:600;color:#1f2937;text-transform:none;letter-spacing:0}.calendar .month-year-picker .picker-section .picker-header .year-nav-button{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;border-radius:4px;cursor:pointer;color:#6b7280;transition:all .15s ease;padding:0}.calendar .month-year-picker .picker-section .picker-header .year-nav-button:hover:not(:disabled):not(.disabled){background:#f3f4f6;color:#1f2937}.calendar .month-year-picker .picker-section .picker-header .year-nav-button.disabled,.calendar .month-year-picker .picker-section .picker-header .year-nav-button:disabled{color:#d1d5db;cursor:not-allowed;opacity:.5}.calendar .month-year-picker .picker-section .picker-header .year-nav-button svg{width:10px;height:10px}.calendar .month-year-picker .months-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:.375rem}.calendar .month-year-picker .months-grid .month-option{padding:.5rem;border:1px solid #E5E7EB;background:#fff;border-radius:6px;font-size:.75rem;font-weight:500;color:#6b7280;cursor:pointer;transition:all .15s ease}.calendar .month-year-picker .months-grid .month-option:hover{background:#f9fafb;border-color:#d1d5db}.calendar .month-year-picker .months-grid .month-option.active{background:#f59100;color:#fff;border-color:#f59100}.calendar .month-year-picker .months-grid .month-option.disabled,.calendar .month-year-picker .months-grid .month-option:disabled{background:#f9fafb;color:#d1d5db;border-color:#e5e7eb;cursor:not-allowed;pointer-events:none}.calendar .month-year-picker .years-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:.375rem;max-height:200px;overflow-y:auto}.calendar .month-year-picker .years-grid .year-option{padding:.5rem;border:1px solid #E5E7EB;background:#fff;border-radius:6px;font-size:.75rem;font-weight:500;color:#6b7280;cursor:pointer;transition:all .15s ease}.calendar .month-year-picker .years-grid .year-option:hover{background:#f9fafb;border-color:#d1d5db}.calendar .month-year-picker .years-grid .year-option.active{background:#f59100;color:#fff;border-color:#f59100}.calendar .month-year-picker .years-grid .year-option.disabled,.calendar .month-year-picker .years-grid .year-option:disabled{background:#f9fafb;color:#d1d5db;border-color:#e5e7eb;cursor:not-allowed;pointer-events:none}.calendar .calendar-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px 0}.calendar .calendar-grid .weekday-header{display:flex;align-items:center;justify-content:center;font-size:.6875rem;font-weight:500;color:#9ca3af;padding:.5rem 0;text-transform:uppercase;letter-spacing:.5px}.calendar .calendar-grid .calendar-day{display:flex;align-items:center;justify-content:center;width:36px;height:36px;font-size:.8125rem;color:#1f2937;cursor:pointer;transition:all .15s ease;position:relative;font-weight:400;border-radius:0}.calendar .calendar-grid .calendar-day.other-month{color:#d1d5db}.calendar .calendar-grid .calendar-day.today{font-weight:600;color:#f59100;background:transparent}.calendar .calendar-grid .calendar-day.today:after{content:\"\";position:absolute;bottom:4px;left:50%;transform:translate(-50%);width:4px;height:4px;background:#f59100;border-radius:50%}.calendar .calendar-grid .calendar-day:hover:not(.disabled):not(.selected):not(.range-start):not(.range-end):not(.in-range){background:#fef4e6;border-radius:50%}.calendar .calendar-grid .calendar-day.in-range:hover:not(.disabled):not(.range-start):not(.range-end){position:relative;background:transparent}.calendar .calendar-grid .calendar-day.in-range:hover:not(.disabled):not(.range-start):not(.range-end):before{content:\"\";position:absolute;inset:0;background:#fef4e6;z-index:-1;border-radius:0}.calendar .calendar-grid .calendar-day.in-range:hover:not(.disabled):not(.range-start):not(.range-end):after{content:\"\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:100%;height:100%;background:#fef4e6;border-radius:50%;z-index:0}.calendar .calendar-grid .calendar-day.in-range:hover:not(.disabled):not(.range-start):not(.range-end) span{position:relative;z-index:1;color:#f59100}.calendar .calendar-grid .calendar-day.in-range:not(.disabled):not(.range-start):not(.range-end){background:#fef4e6;color:#f59100;border-radius:0}.calendar .calendar-grid .calendar-day.in-range:not(.disabled):not(.range-start):not(.range-end):nth-child(7n+8){border-radius:50% 0 0 50%}.calendar .calendar-grid .calendar-day.in-range:not(.disabled):not(.range-start):not(.range-end):nth-child(7n+14){border-radius:0 50% 50% 0}.calendar .calendar-grid .calendar-day.in-range:not(.disabled):not(.range-start):not(.range-end):nth-child(7n+8):nth-child(7n+14){border-radius:50%}.calendar .calendar-grid .calendar-day.range-start:not(.disabled){position:relative;background:transparent;color:#fff;font-weight:600;z-index:2}.calendar .calendar-grid .calendar-day.range-start:not(.disabled):before{content:\"\";position:absolute;inset:0;background:#fef4e6;z-index:-1;border-radius:50% 0 0 50%}.calendar .calendar-grid .calendar-day.range-start:not(.disabled):after{content:\"\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:100%;height:100%;background:#f59100;border-radius:50%;z-index:1}.calendar .calendar-grid .calendar-day.range-start:not(.disabled) span{position:relative;z-index:2}.calendar .calendar-grid .calendar-day.range-start:not(.disabled).range-end:before{border-radius:50%}.calendar .calendar-grid .calendar-day.range-end:not(.disabled){position:relative;background:transparent;color:#fff;font-weight:600;z-index:2}.calendar .calendar-grid .calendar-day.range-end:not(.disabled):before{content:\"\";position:absolute;inset:0;background:#fef4e6;z-index:-1;border-radius:0 50% 50% 0}.calendar .calendar-grid .calendar-day.range-end:not(.disabled):after{content:\"\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:100%;height:100%;background:#f59100;border-radius:50%;z-index:1}.calendar .calendar-grid .calendar-day.range-end:not(.disabled) span{position:relative;z-index:2}.calendar .calendar-grid .calendar-day.range-end:not(.disabled).range-start:before{border-radius:50%}.calendar .calendar-grid .calendar-day.range-start.in-range:not(.disabled){position:relative}.calendar .calendar-grid .calendar-day.range-start.in-range:not(.disabled):before{content:\"\";position:absolute;inset:0 -2px 0 50%;background:#fef4e6;z-index:-1}.calendar .calendar-grid .calendar-day.range-end.in-range:not(.disabled){position:relative}.calendar .calendar-grid .calendar-day.range-end.in-range:not(.disabled):before{content:\"\";position:absolute;inset:0 50% 0 -2px;background:#fef4e6;z-index:-1}.calendar .calendar-grid .calendar-day.selected:not(.range-start):not(.range-end){background:#f59100;color:#fff;font-weight:600;border-radius:50%}.calendar .calendar-grid .calendar-day.disabled{color:#e5e7eb;cursor:not-allowed;pointer-events:none}.footer{display:flex;align-items:center;justify-content:space-between;padding:1rem;border-top:1px solid #E5E7EB}.footer .selected-dates{display:flex;align-items:center;gap:.75rem}.footer .selected-dates .date-display{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;background:#fff;border:1px solid #E5E7EB;border-radius:6px;font-size:.8125rem;color:#6b7280}.footer .selected-dates .date-display svg{flex-shrink:0;color:#9ca3af}.footer .selected-dates .date-display .date-text{font-weight:400;white-space:nowrap;-webkit-user-select:none;user-select:none}.footer .selected-dates .date-separator{color:#9ca3af;font-weight:400;font-size:.875rem}.footer .action-buttons{display:flex;gap:.75rem}.footer .action-buttons button{padding:.625rem 1.75rem;border-radius:8px;font-size:.875rem;font-weight:500;font-family:Quicksand,sans-serif;cursor:pointer;transition:all .15s ease;border:none;outline:none}.footer .action-buttons button:focus-visible{outline:2px solid rgba(245,145,0,.3);outline-offset:2px}.footer .action-buttons .btn-cancel{background:#fff;color:#6b7280;border:1px solid #D1D5DB}.footer .action-buttons .btn-cancel:hover{background:#f9fafb;border-color:#9ca3af}.footer .action-buttons .btn-apply{background:#f59100;color:#fff;border:1px solid #F59100}.footer .action-buttons .btn-apply:hover{background:#e08500;border-color:#e08500}.footer .action-buttons .btn-apply:active{background:#cc7a00;border-color:#cc7a00}@media (max-width: 768px){.date-picker-content{flex-direction:column}.filter-sidebar{display:none}.calendars-container{padding:.75rem;gap:0;justify-content:center}.calendars-container .calendar:last-child:not(:first-child){display:none}.calendar .calendar-header .month-year-selector{flex:1}.calendar .calendar-header .month-year{min-width:auto;font-size:.875rem;padding:.25rem .375rem}.calendar .calendar-header .nav-button{width:28px;height:28px}.calendar .calendar-header .nav-button svg{width:10px;height:10px}.calendar .calendar-header .nav-button-placeholder{display:none}.calendar .month-year-picker{min-width:240px;padding:.75rem}.calendar .month-year-picker .picker-section .picker-title{font-size:.7rem}.calendar .month-year-picker .months-grid{grid-template-columns:repeat(3,1fr);gap:.25rem}.calendar .month-year-picker .months-grid .month-option{padding:.4rem;font-size:.7rem}.calendar .month-year-picker .years-grid{grid-template-columns:repeat(3,1fr);gap:.25rem;max-height:150px}.calendar .month-year-picker .years-grid .year-option{padding:.4rem;font-size:.7rem}.calendar .calendar-grid{gap:2px 0}.calendar .calendar-grid .calendar-day{width:30px;height:30px;font-size:.75rem}.calendar .calendar-grid .weekday-header{font-size:.65rem}.footer{flex-direction:column;gap:.75rem;padding:.75rem}.footer .selected-dates{width:100%;justify-content:center;flex-wrap:wrap;gap:.5rem}.footer .selected-dates .date-display{font-size:.7rem;padding:.35rem .5rem}.footer .selected-dates .date-display svg{width:12px;height:12px}.footer .selected-dates .date-separator{font-size:.7rem}.footer .action-buttons{width:100%;gap:.5rem}.footer .action-buttons button{flex:1;padding:.625rem .75rem;font-size:.75rem}.date-picker-dropdown{width:280px!important;max-width:calc(100vw - 2rem);max-height:calc(100vh - 4rem);overflow-y:auto}.date-picker-dropdown.range-mode{width:280px!important}}@media (max-width: 480px){.calendars-container{padding:.5rem}.calendar .calendar-header .month-year{font-size:.8125rem;padding:.2rem .3rem}.calendar .calendar-header .nav-button{width:26px;height:26px}.calendar .calendar-header .nav-button svg{width:9px;height:9px}.calendar .month-year-picker{min-width:220px;padding:.625rem}.calendar .month-year-picker .picker-section{margin-bottom:.75rem}.calendar .month-year-picker .picker-section .picker-title{font-size:.65rem;margin-bottom:.375rem}.calendar .month-year-picker .months-grid{gap:.2rem}.calendar .month-year-picker .months-grid .month-option{padding:.35rem;font-size:.65rem}.calendar .month-year-picker .years-grid{gap:.2rem;max-height:120px}.calendar .month-year-picker .years-grid .year-option{padding:.35rem;font-size:.65rem}.calendar .calendar-grid{gap:1px 0}.calendar .calendar-grid .weekday-header{font-size:.6rem;padding:.35rem 0}.calendar .calendar-grid .calendar-day{width:28px;height:28px;font-size:.7rem}.footer{padding:.5rem;gap:.5rem}.footer .selected-dates{gap:.4rem}.footer .selected-dates .date-display{font-size:.65rem;padding:.3rem .4rem}.footer .selected-dates .date-display svg{width:11px;height:11px}.footer .selected-dates .date-separator{font-size:.65rem}.footer .action-buttons{gap:.4rem}.footer .action-buttons button{padding:.5rem .625rem;font-size:.7rem}.date-picker-dropdown{width:260px!important;max-width:calc(100vw - 1rem)}}\n"] }]
802
+ }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: Document, decorators: [{
803
+ type: Inject,
804
+ args: [DOCUMENT]
805
+ }] }], propDecorators: { label: [{
806
+ type: Input
807
+ }], id: [{
808
+ type: Input
809
+ }], placeholder: [{
810
+ type: Input
811
+ }], hasError: [{
812
+ type: Input
813
+ }], errorMessage: [{
814
+ type: Input
815
+ }], disabled: [{
816
+ type: Input
817
+ }], minDate: [{
818
+ type: Input
819
+ }], maxDate: [{
820
+ type: Input
821
+ }], rangeMode: [{
822
+ type: Input
823
+ }], iconPosition: [{
824
+ type: Input
825
+ }], trigger: [{
826
+ type: ViewChild,
827
+ args: ['trigger', { read: ElementRef }]
828
+ }], dropdown: [{
829
+ type: ViewChild,
830
+ args: ['dropdown', { read: ElementRef }]
831
+ }], onDocumentClick: [{
832
+ type: HostListener,
833
+ args: ['document:click', ['$event']]
834
+ }] } });
835
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9hdG9tcy9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2F0b21zL2RhdGUtcGlja2VyL2RhdGUtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFVBQVUsRUFDVixTQUFTLEVBQ1QsVUFBVSxFQUVWLFlBQVksRUFHYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0csT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBb0N2QyxNQUFNLE9BQU8sbUJBQW1CO0lBcUVwQjtJQUNrQjtJQXJFbkIsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNYLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDUixXQUFXLEdBQUcsbUJBQW1CLENBQUM7SUFDbEMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDakIsT0FBTyxDQUFRO0lBQ2YsT0FBTyxDQUFRO0lBQ2YsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLHlDQUF5QztJQUM1RCxZQUFZLEdBQXFCLE1BQU0sQ0FBQztJQUVMLE9BQU8sQ0FBYztJQUNwQixRQUFRLENBQWM7SUFFbkUsb0JBQW9CO0lBQ3BCLFdBQVcsR0FBZ0IsSUFBSSxDQUFDO0lBQ2hDLGNBQWM7SUFDZCxVQUFVLEdBQWMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFF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QkFBYixLQUFLO2dCQUNHLEVBQUU7c0JBQVYsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVzQyxPQUFPO3NCQUFsRCxTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBQ0csUUFBUTtzQkFBcEQsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQW1GM0MsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgZm9yd2FyZFJlZixcbiAgVmlld0NoaWxkLFxuICBFbGVtZW50UmVmLFxuICBPbkRlc3Ryb3ksXG4gIEhvc3RMaXN0ZW5lcixcbiAgUmVuZGVyZXIyLFxuICBPbkluaXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUsIERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBEYXRlUmFuZ2Uge1xuICBzdGFydERhdGU6IERhdGUgfCBudWxsO1xuICBlbmREYXRlOiBEYXRlIHwgbnVsbDtcbn1cblxuZXhwb3J0IHR5cGUgRGF0ZVBpY2tlclZhbHVlID0gRGF0ZSB8IG51bGwgfCBEYXRlUmFuZ2U7XG5cbmludGVyZmFjZSBDYWxlbmRhckRheSB7XG4gIGRhdGU6IERhdGU7XG4gIGlzQ3VycmVudE1vbnRoOiBib29sZWFuO1xuICBpc1RvZGF5OiBib29sZWFuO1xuICBpc1NlbGVjdGVkOiBib29sZWFuO1xuICBpc0luUmFuZ2U6IGJvb2xlYW47XG4gIGlzUmFuZ2VTdGFydDogYm9vbGVhbjtcbiAgaXNSYW5nZUVuZDogYm9vbGVhbjtcbiAgaXNEaXNhYmxlZDogYm9vbGVhbjtcbn1cblxudHlwZSBGaWx0ZXJPcHRpb24gPSAnaG95JyB8ICdheWVyJyB8ICdlc3RhLXNlbWFuYScgfCAnc2VtYW5hLXBhc2FkYScgfCAnZXN0ZS1tZXMnIHwgJ21lcy1wYXNhZG8nIHwgJ2VzdGUtYW5vJyB8ICdhbm8tcGFzYWRvJyB8ICdtb3N0cmFyLXRvZG8nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZGF0ZS1waWNrZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBGb3Jtc01vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGUtcGlja2VyLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZVBpY2tlckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRlUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uRGVzdHJveSwgT25Jbml0IHtcbiAgQElucHV0KCkgbGFiZWwgPSAnJztcbiAgQElucHV0KCkgaWQgPSAnJztcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnU2VsZWNjaW9uYXIgZmVjaGEnO1xuICBASW5wdXQoKSBoYXNFcnJvciA9IGZhbHNlO1xuICBASW5wdXQoKSBlcnJvck1lc3NhZ2UgPSAnJztcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgbWluRGF0ZT86IERhdGU7XG4gIEBJbnB1dCgpIG1heERhdGU/OiBEYXRlO1xuICBASW5wdXQoKSByYW5nZU1vZGUgPSBmYWxzZTsgLy8gZmFsc2UgPSBzaW5nbGUgZGF0ZSwgdHJ1ZSA9IGRhdGUgcmFuZ2VcbiAgQElucHV0KCkgaWNvblBvc2l0aW9uOiAnbGVmdCcgfCAncmlnaHQnID0gJ2xlZnQnO1xuXG4gIEBWaWV3Q2hpbGQoJ3RyaWdnZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgdHJpZ2dlciE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIGRyb3Bkb3duPzogRWxlbWVudFJlZjtcblxuICAvLyBTaW5nbGUgZGF0ZSB2YWx1ZVxuICBzaW5nbGVWYWx1ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAvLyBSYW5nZSB2YWx1ZVxuICByYW5nZVZhbHVlOiBEYXRlUmFuZ2UgPSB7IHN0YXJ0RGF0ZTogbnVsbCwgZW5kRGF0ZTogbnVsbCB9O1xuXG4gIGlzT3BlbiA9IGZhbHNlO1xuICBvbkNoYW5nZTogYW55ID0gKCkgPT4ge307XG4gIG9uVG91Y2hlZDogYW55ID0gKCkgPT4ge307XG5cbiAgbGVmdE1vbnRoRGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XG4gIHJpZ2h0TW9udGhEYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcbiAgdGVtcFN0YXJ0RGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICB0ZW1wRW5kRGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICB0ZW1wU2luZ2xlRGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICBob3ZlckRhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcblxuICAvLyBTdG9yZSBvcmlnaW5hbCBjYWxlbmRhciBwb3NpdGlvbnMgZm9yIGNhbmNlbFxuICBvcmlnaW5hbExlZnRNb250aERhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xuICBvcmlnaW5hbFJpZ2h0TW9udGhEYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcblxuICAvLyBDYWNoZWQgY2FsZW5kYXIgZGF5c1xuICBsZWZ0Q2FsZW5kYXJEYXlzOiBDYWxlbmRhckRheVtdID0gW107XG4gIHJpZ2h0Q2FsZW5kYXJEYXlzOiBDYWxlbmRhckRheVtdID0gW107XG5cbiAgZmlsdGVyT3B0aW9uczogeyB2YWx1ZTogRmlsdGVyT3B0aW9uOyBsYWJlbDogc3RyaW5nIH1bXSA9IFtcbiAgICB7IHZhbHVlOiAnaG95JywgbGFiZWw6ICdIb3knIH0sXG4gICAgeyB2YWx1ZTogJ2F5ZXInLCBsYWJlbDogJ0F5ZXInIH0sXG4gICAgeyB2YWx1ZTogJ2VzdGEtc2VtYW5hJywgbGFiZWw6ICdFc3RhIHNlbWFuYScgfSxcbiAgICB7IHZhbHVlOiAnc2VtYW5hLXBhc2FkYScsIGxhYmVsOiAnU2VtYW5hIHBhc2FkYScgfSxcbiAgICB7IHZhbHVlOiAnZXN0ZS1tZXMnLCBsYWJlbDogJ0VzdGUgbWVzJyB9LFxuICAgIHsgdmFsdWU6ICdtZXMtcGFzYWRvJywgbGFiZWw6ICdNZXMgcGFzYWRvJyB9LFxuICAgIHsgdmFsdWU6ICdlc3RlLWFubycsIGxhYmVsOiAnRXN0ZSBhw7FvJyB9LFxuICAgIHsgdmFsdWU6ICdhbm8tcGFzYWRvJywgbGFiZWw6ICdBw7FvIHBhc2FkbycgfSxcbiAgICB7IHZhbHVlOiAnbW9zdHJhci10b2RvJywgbGFiZWw6ICdNb3N0cmFyIHRvZG8nIH1cbiAgXTtcblxuICBzZWxlY3RlZEZpbHRlcjogRmlsdGVyT3B0aW9uIHwgJycgPSAnJztcblxuICB3ZWVrRGF5cyA9IFsnTHUnLCAnTWEnLCAnTWknLCAnSnUnLCAnVmknLCAnU2EnLCAnRG8nXTtcbiAgbW9udGhzID0gWydFbmVybycsICdGZWJyZXJvJywgJ01hcnpvJywgJ0FicmlsJywgJ01heW8nLCAnSnVuaW8nLCAnSnVsaW8nLCAnQWdvc3RvJywgJ1NlcHRpZW1icmUnLCAnT2N0dWJyZScsICdOb3ZpZW1icmUnLCAnRGljaWVtYnJlJ107XG5cbiAgLy8gTW9udGgvWWVhciBwaWNrZXIgc3RhdGVcbiAgc2hvd0xlZnRNb250aFBpY2tlciA9IGZhbHNlO1xuICBzaG93UmlnaHRNb250aFBpY2tlciA9IGZhbHNlO1xuICB5ZWFyczogbnVtYmVyW10gPSBbXTtcbiAgbGVmdFllYXJQaWNrZXJQYWdlID0gMDtcbiAgcmlnaHRZZWFyUGlja2VyUGFnZSA9IDA7XG4gIHllYXJzUGVyUGFnZSA9IDEyO1xuXG4gIHByaXZhdGUgc2Nyb2xsSGFuZGxlcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVzaXplSGFuZGxlcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIGRyb3Bkb3duUG9zaXRpb246IHsgdG9wOiBzdHJpbmc7IGxlZnQ6IHN0cmluZyB9ID0geyB0b3A6ICcwcHgnLCBsZWZ0OiAnMHB4JyB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudFxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsaXplRGF0ZXMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlUmVwb3NpdGlvbkxpc3RlbmVycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplRGF0ZXMoKTogdm9pZCB7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIHRoaXMubGVmdE1vbnRoRGF0ZSA9IG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIDEpO1xuICAgIHRoaXMucmlnaHRNb250aERhdGUgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpICsgMSwgMSk7XG4gICAgdGhpcy51cGRhdGVDYWxlbmRhckRheXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ2FsZW5kYXJEYXlzKCk6IHZvaWQge1xuICAgIHRoaXMubGVmdENhbGVuZGFyRGF5cyA9IHRoaXMuZ2VuZXJhdGVDYWxlbmRhckRheXModGhpcy5sZWZ0TW9udGhEYXRlKTtcbiAgICBpZiAodGhpcy5yYW5nZU1vZGUpIHtcbiAgICAgIHRoaXMucmlnaHRDYWxlbmRhckRheXMgPSB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJEYXlzKHRoaXMucmlnaHRNb250aERhdGUpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzT3BlbikgcmV0dXJuO1xuXG4gICAgY29uc3QgdHJpZ2dlckVsZW1lbnQgPSB0aGlzLnRyaWdnZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgZHJvcGRvd25FbGVtZW50ID0gdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZGF0ZS1waWNrZXItZHJvcGRvd24nKTtcbiAgICBjb25zdCBtb250aFllYXJQaWNrZXJzID0gdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubW9udGgteWVhci1waWNrZXInKTtcbiAgICBjb25zdCBtb250aFllYXJCdXR0b25zID0gdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubW9udGgteWVhcicpO1xuXG4gICAgbGV0IGlzT25Nb250aFllYXJCdXR0b24gPSBmYWxzZTtcbiAgICBtb250aFllYXJCdXR0b25zLmZvckVhY2goYnV0dG9uID0+IHtcbiAgICAgIGlmIChidXR0b24uY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICAgIGlzT25Nb250aFllYXJCdXR0b24gPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbGV0IGlzSW5zaWRlTW9udGhZZWFyUGlja2VyID0gZmFsc2U7XG4gICAgbW9udGhZZWFyUGlja2Vycy5mb3JFYWNoKHBpY2tlciA9PiB7XG4gICAgICBpZiAocGlja2VyLmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkge1xuICAgICAgICBpc0luc2lkZU1vbnRoWWVhclBpY2tlciA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoaXNPbk1vbnRoWWVhckJ1dHRvbiB8fCBpc0luc2lkZU1vbnRoWWVhclBpY2tlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkcm9wZG93bkVsZW1lbnQgJiYgZHJvcGRvd25FbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkge1xuICAgICAgdGhpcy5zaG93TGVmdE1vbnRoUGlja2VyID0gZmFsc2U7XG4gICAgICB0aGlzLnNob3dSaWdodE1vbnRoUGlja2VyID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRyaWdnZXJFbGVtZW50ICYmICF0cmlnZ2VyRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgIGlmIChkcm9wZG93bkVsZW1lbnQgJiYgIWRyb3Bkb3duRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlRHJvcGRvd24oZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3BlbkRyb3Bkb3duKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvcGVuRHJvcGRvd24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRyaWdnZXIpIHJldHVybjtcblxuICAgIGlmICh0aGlzLnJhbmdlTW9kZSkge1xuICAgICAgdGhpcy50ZW1wU3RhcnREYXRlID0gdGhpcy5yYW5nZVZhbHVlLnN0YXJ0RGF0ZTtcbiAgICAgIHRoaXMudGVtcEVuZERhdGUgPSB0aGlzLnJhbmdlVmFsdWUuZW5kRGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZW1wU2luZ2xlRGF0ZSA9IHRoaXMuc2luZ2xlVmFsdWU7XG4gICAgfVxuXG4gICAgdGhpcy5vcmlnaW5hbExlZnRNb250aERhdGUgPSBuZXcgRGF0ZSh0aGlzLmxlZnRNb250aERhdGUpO1xuICAgIHRoaXMub3JpZ2luYWxSaWdodE1vbnRoRGF0ZSA9IG5ldyBEYXRlKHRoaXMucmlnaHRNb250aERhdGUpO1xuXG4gICAgdGhpcy5sZWZ0WWVhclBpY2tlclBhZ2UgPSAwO1xuICAgIHRoaXMucmlnaHRZZWFyUGlja2VyUGFnZSA9IDA7XG5cbiAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlRHJvcGRvd25Qb3NpdGlvbigpO1xuICAgICAgdGhpcy5hZGRSZXBvc2l0aW9uTGlzdGVuZXJzKCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBnZXREcm9wZG93blN0eWxlKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLnRyaWdnZXIpIHJldHVybiB7fTtcblxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5jYWxjdWxhdGVQb3NpdGlvbigpO1xuICAgIHJldHVybiB7XG4gICAgICAncG9zaXRpb24nOiAnZml4ZWQnLFxuICAgICAgJ2xlZnQnOiBwb3NpdGlvbi5sZWZ0LFxuICAgICAgJ3RvcCc6IHBvc2l0aW9uLnRvcCxcbiAgICAgICd6LWluZGV4JzogJzEwMDAwJ1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZVBvc2l0aW9uKCk6IHsgdG9wOiBzdHJpbmc7IGxlZnQ6IHN0cmluZyB9IHtcbiAgICBjb25zdCB0cmlnZ2VyRWxlbWVudCA9IHRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHJlY3QgPSB0cmlnZ2VyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGxldCBkcm9wZG93bldpZHRoID0gdGhpcy5yYW5nZU1vZGUgPyA4MzAgOiAzMjA7XG4gICAgbGV0IGRyb3Bkb3duSGVpZ2h0ID0gdGhpcy5yYW5nZU1vZGUgPyA1MjAgOiA0MDA7XG5cbiAgICBpZiAodGhpcy5kcm9wZG93bikge1xuICAgICAgY29uc3QgZHJvcGRvd25FbGVtZW50ID0gdGhpcy5kcm9wZG93bi5uYXRpdmVFbGVtZW50O1xuICAgICAgY29uc3QgZHJvcGRvd25SZWN0ID0gZHJvcGRvd25FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICBpZiAoZHJvcGRvd25SZWN0LndpZHRoID4gMCkge1xuICAgICAgICBkcm9wZG93bldpZHRoID0gZHJvcGRvd25SZWN0LndpZHRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHJvcGRvd25XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoIDwgNzY4ID8gMjgwIDogKHRoaXMucmFuZ2VNb2RlID8gODMwIDogMzIwKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRyb3Bkb3duUmVjdC5oZWlnaHQgPiAwKSB7XG4gICAgICAgIGRyb3Bkb3duSGVpZ2h0ID0gZHJvcGRvd25SZWN0LmhlaWdodDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZHJvcGRvd25XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoIDwgNzY4ID8gMjgwIDogKHRoaXMucmFuZ2VNb2RlID8gODMwIDogMzIwKTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGFjZU9uUmlnaHQgPSB3aW5kb3cuaW5uZXJXaWR0aCAtIHJlY3QubGVmdDtcblxuICAgIGxldCBsZWZ0ID0gcmVjdC5sZWZ0O1xuXG4gICAgaWYgKHNwYWNlT25SaWdodCA8IGRyb3Bkb3duV2lkdGgpIHtcbiAgICAgIGxlZnQgPSByZWN0LnJpZ2h0IC0gZHJvcGRvd25XaWR0aDtcblxuICAgICAgaWYgKGxlZnQgPCAwKSB7XG4gICAgICAgIGxlZnQgPSBNYXRoLm1heCg4LCB3aW5kb3cuaW5uZXJXaWR0aCAtIGRyb3Bkb3duV2lkdGggLSA4KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod2luZG93LmlubmVyV2lkdGggPCA3NjgpIHtcbiAgICAgIGNvbnN0IGNlbnRlcmVkTGVmdCA9IHJlY3QubGVmdCArIChyZWN0LndpZHRoIC8gMikgLSAoZHJvcGRvd25XaWR0aCAvIDIpO1xuICAgICAgY29uc3QgbWluTGVmdCA9IDg7XG4gICAgICBjb25zdCBtYXhMZWZ0ID0gd2luZG93LmlubmVyV2lkdGggLSBkcm9wZG93bldpZHRoIC0gODtcblxuICAgICAgbGVmdCA9IE1hdGgubWF4KG1pbkxlZnQsIE1hdGgubWluKGNlbnRlcmVkTGVmdCwgbWF4TGVmdCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHNwYWNlQmVsb3cgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LmJvdHRvbTtcbiAgICBjb25zdCBzcGFjZUFib3ZlID0gcmVjdC50b3A7XG5cbiAgICBsZXQgdG9wID0gcmVjdC5ib3R0b20gKyA0O1xuXG4gICAgaWYgKHNwYWNlQmVsb3cgPCBkcm9wZG93bkhlaWdodCAmJiBzcGFjZUFib3ZlID4gc3BhY2VCZWxvdykge1xuICAgICAgdG9wID0gcmVjdC50b3AgLSBkcm9wZG93bkhlaWdodCAtIDQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvcDogYCR7dG9wfXB4YCxcbiAgICAgIGxlZnQ6IGAke2xlZnR9cHhgXG4gICAgfTtcbiAgfVxuXG4gIGNsb3NlRHJvcGRvd24oKTogdm9pZCB7XG4gICAgdGhpcy5sZWZ0TW9udGhEYXRlID0gbmV3IERhdGUodGhpcy5vcmlnaW5hbExlZnRNb250aERhdGUpO1xuICAgIHRoaXMucmlnaHRNb250aERhdGUgPSBuZXcgRGF0ZSh0aGlzLm9yaWdpbmFsUmlnaHRNb250aERhdGUpO1xuXG4gICAgaWYgKHRoaXMucmFuZ2VNb2RlKSB7XG4gICAgICB0aGlzLnRlbXBTdGFydERhdGUgPSB0aGlzLnJhbmdlVmFsdWUuc3RhcnREYXRlO1xuICAgICAgdGhpcy50ZW1wRW5kRGF0ZSA9IHRoaXMucmFuZ2VWYWx1ZS5lbmREYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRlbXBTaW5nbGVEYXRlID0gdGhpcy5zaW5nbGVWYWx1ZTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUNhbGVuZGFyRGF5cygpO1xuICAgIHRoaXMucmVtb3ZlUmVwb3NpdGlvbkxpc3RlbmVycygpO1xuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5ob3ZlckRhdGUgPSBudWxsO1xuICAgIHRoaXMuc2hvd0xlZnRNb250aFBpY2tlciA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd1JpZ2h0TW9udGhQaWNrZXIgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUmVwb3NpdGlvbkxpc3RlbmVycygpOiB2b2lkIHtcbiAgICBjb25zdCBzY3JvbGxIYW5kbGVyID0gKCkgPT4gdGhpcy51cGRhdGVEcm9wZG93blBvc2l0aW9uKCk7XG4gICAgY29uc3QgcmVzaXplSGFuZGxlciA9ICgpID0+IHRoaXMudXBkYXRlRHJvcGRvd25Qb3NpdGlvbigpO1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbEhhbmRsZXIsIHRydWUpO1xuICAgIHRoaXMuc2Nyb2xsSGFuZGxlciA9ICgpID0+IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyLCB0cnVlKTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCByZXNpemVIYW5kbGVyKTtcbiAgICB0aGlzLnJlc2l6ZUhhbmRsZXIgPSAoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgcmVzaXplSGFuZGxlcik7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVJlcG9zaXRpb25MaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2Nyb2xsSGFuZGxlcikge1xuICAgICAgdGhpcy5zY3JvbGxIYW5kbGVyKCk7XG4gICAgICB0aGlzLnNjcm9sbEhhbmRsZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlc2l6ZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMucmVzaXplSGFuZGxlcigpO1xuICAgICAgdGhpcy5yZXNpemVIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURyb3Bkb3duUG9zaXRpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRyaWdnZXIpIHJldHVybjtcbiAgICB0aGlzLmRyb3Bkb3duUG9zaXRpb24gPSB0aGlzLmNhbGN1bGF0ZVBvc2l0aW9uKCk7XG4gIH1cblxuICBnZXREaXNwbGF5VmFsdWUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5yYW5nZU1vZGUpIHtcbiAgICAgIGlmICh0aGlzLnJhbmdlVmFsdWUuc3RhcnREYXRlICYmIHRoaXMucmFuZ2VWYWx1ZS5lbmREYXRlKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5mb3JtYXREYXRlU2hvcnQodGhpcy5yYW5nZVZhbHVlLnN0YXJ0RGF0ZSk7XG4gICAgICAgIGNvbnN0IGVuZCA9IHRoaXMuZm9ybWF0RGF0ZVNob3J0KHRoaXMucmFuZ2VWYWx1ZS5lbmREYXRlKTtcbiAgICAgICAgcmV0dXJuIGAke3N0YXJ0fSAtICR7ZW5kfWA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnNpbmdsZVZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdERhdGVTaG9ydCh0aGlzLnNpbmdsZVZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgZm9ybWF0RGF0ZVNob3J0KGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRheSA9IFN0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCBtb250aCA9IFN0cmluZyhkYXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgcmV0dXJuIGAke2RheX0vJHttb250aH0vJHt5ZWFyfWA7XG4gIH1cblxuICBnZW5lcmF0ZUNhbGVuZGFyRGF5cyhtb250aERhdGU6IERhdGUpOiBDYWxlbmRhckRheVtdIHtcbiAgICBjb25zdCB5ZWFyID0gbW9udGhEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgbW9udGggPSBtb250aERhdGUuZ2V0TW9udGgoKTtcbiAgICBjb25zdCBmaXJzdERheSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKTtcbiAgICBjb25zdCBsYXN0RGF5ID0gbmV3IERhdGUoeWVhciwgbW9udGggKyAxLCAwKTtcblxuICAgIGxldCBzdGFydERheSA9IGZpcnN0RGF5LmdldERheSgpIC0gMTtcbiAgICBpZiAoc3RhcnREYXkgPT09IC0xKSBzdGFydERheSA9IDY7XG5cbiAgICBjb25zdCBkYXlzOiBDYWxlbmRhckRheVtdID0gW107XG5cbiAgICBjb25zdCBwcmV2TW9udGhMYXN0RGF5ID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDApO1xuICAgIGZvciAobGV0IGkgPSBzdGFydERheSAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBwcmV2TW9udGhMYXN0RGF5LmdldERhdGUoKSAtIGkpO1xuICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgIGRheXMucHVzaCh0aGlzLmNyZWF0ZUNhbGVuZGFyRGF5KGRhdGUsIGZhbHNlKSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgZGF5ID0gMTsgZGF5IDw9IGxhc3REYXkuZ2V0RGF0ZSgpOyBkYXkrKykge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXkpO1xuICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgIGRheXMucHVzaCh0aGlzLmNyZWF0ZUNhbGVuZGFyRGF5KGRhdGUsIHRydWUpKTtcbiAgICB9XG5cbiAgICBjb25zdCByZW1haW5pbmdEYXlzID0gNDIgLSBkYXlzLmxlbmd0aDtcbiAgICBmb3IgKGxldCBkYXkgPSAxOyBkYXkgPD0gcmVtYWluaW5nRGF5czsgZGF5KyspIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIGRheSk7XG4gICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgICAgZGF5cy5wdXNoKHRoaXMuY3JlYXRlQ2FsZW5kYXJEYXkoZGF0ZSwgZmFsc2UpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF5cztcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ2FsZW5kYXJEYXkoZGF0ZTogRGF0ZSwgaXNDdXJyZW50TW9udGg6IGJvb2xlYW4pOiBDYWxlbmRhckRheSB7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIHRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xuXG4gICAgY29uc3QgZGF0ZU9ubHkgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICBkYXRlT25seS5zZXRIb3VycygwLCAwLCAwLCAwKTtcblxuICAgIGNvbnN0IGlzVG9kYXkgPSBkYXRlT25seS5nZXRUaW1lKCkgPT09IHRvZGF5LmdldFRpbWUoKTtcblxuICAgIGxldCBpc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgbGV0IGlzUmFuZ2VTdGFydCA9IGZhbHNlO1xuICAgIGxldCBpc1JhbmdlRW5kID0gZmFsc2U7XG4gICAgbGV0IGlzSW5SYW5nZSA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMucmFuZ2VNb2RlKSB7XG4gICAgICBjb25zdCBzdGFydERhdGUgPSB0aGlzLnRlbXBTdGFydERhdGUgPyBuZXcgRGF0ZSh0aGlzLnRlbXBTdGFydERhdGUpIDogbnVsbDtcbiAgICAgIGNvbnN0IGVuZERhdGUgPSB0aGlzLnRlbXBFbmREYXRlID8gbmV3IERhdGUodGhpcy50ZW1wRW5kRGF0ZSkgOiBudWxsO1xuXG4gICAgICBpZiAoc3RhcnREYXRlKSBzdGFydERhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICBpZiAoZW5kRGF0ZSkgZW5kRGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcblxuICAgICAgaXNSYW5nZVN0YXJ0ID0gaXNDdXJyZW50TW9udGggJiYgc3RhcnREYXRlID8gZGF0ZU9ubHkuZ2V0VGltZSgpID09PSBzdGFydERhdGUuZ2V0VGltZSgpIDogZmFsc2U7XG4gICAgICBpc1JhbmdlRW5kID0gaXNDdXJyZW50TW9udGggJiYgZW5kRGF0ZSA/IGRhdGVPbmx5LmdldFRpbWUoKSA9PT0gZW5kRGF0ZS5nZXRUaW1lKCkgOiBmYWxzZTtcbiAgICAgIGlzU2VsZWN0ZWQgPSBpc1JhbmdlU3RhcnQgfHwgaXNSYW5nZUVuZDtcblxuICAgICAgaWYgKGlzQ3VycmVudE1vbnRoICYmIHN0YXJ0RGF0ZSAmJiBlbmREYXRlKSB7XG4gICAgICAgIGlzSW5SYW5nZSA9IGRhdGVPbmx5ID4gc3RhcnREYXRlICYmIGRhdGVPbmx5IDwgZW5kRGF0ZTtcbiAgICAgIH0gZWxzZSBpZiAoaXNDdXJyZW50TW9udGggJiYgc3RhcnREYXRlICYmIHRoaXMuaG92ZXJEYXRlICYmICFlbmREYXRlKSB7XG4gICAgICAgIGNvbnN0IGhvdmVyRGF0ZU9ubHkgPSBuZXcgRGF0ZSh0aGlzLmhvdmVyRGF0ZSk7XG4gICAgICAgIGhvdmVyRGF0ZU9ubHkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICAgIGlmIChob3ZlckRhdGVPbmx5ID4gc3RhcnREYXRlKSB7XG4gICAgICAgICAgaXNJblJhbmdlID0gZGF0ZU9ubHkgPiBzdGFydERhdGUgJiYgZGF0ZU9ubHkgPCBob3ZlckRhdGVPbmx5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRGF0ZSA9IHRoaXMudGVtcFNpbmdsZURhdGUgPyBuZXcgRGF0ZSh0aGlzLnRlbXBTaW5nbGVEYXRlKSA6IG51bGw7XG4gICAgICBpZiAoc2VsZWN0ZWREYXRlKSBzZWxlY3RlZERhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICBpc1NlbGVjdGVkID0gaXNDdXJyZW50TW9udGggJiYgc2VsZWN0ZWREYXRlID8gZGF0ZU9ubHkuZ2V0VGltZSgpID09PSBzZWxlY3RlZERhdGUuZ2V0VGltZSgpIDogZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaXNEaXNhYmxlZCA9ICFpc0N1cnJlbnRNb250aCB8fCB0aGlzLmlzRGF0ZURpc2FibGVkKGRhdGUpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGUsXG4gICAgICBpc0N1cnJlbnRNb250aCxcbiAgICAgIGlzVG9kYXksXG4gICAgICBpc1NlbGVjdGVkLFxuICAgICAgaXNJblJhbmdlLFxuICAgICAgaXNSYW5nZVN0YXJ0LFxuICAgICAgaXNSYW5nZUVuZCxcbiAgICAgIGlzRGlzYWJsZWRcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBpc0RhdGVEaXNhYmxlZChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubWluRGF0ZSAmJiBkYXRlIDwgdGhpcy5taW5EYXRlKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5tYXhEYXRlICYmIGRhdGUgPiB0aGlzLm1heERhdGUpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyYWNrQnlEYXRlKGluZGV4OiBudW1iZXIsIGRheTogQ2FsZW5kYXJEYXkpOiBzdHJpbmcge1xuICAgIHJldHVybiBkYXkuZGF0ZS5nZXRUaW1lKCkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIGlzSW5SYW5nZShkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnJhbmdlTW9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgZGF0ZU9ubHkgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICBkYXRlT25seS5zZXRIb3VycygwLCAwLCAwLCAwKTtcblxuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMudGVtcFN0YXJ0RGF0ZSA/IG5ldyBEYXRlKHRoaXMudGVtcFN0YXJ0RGF0ZSkgOiBudWxsO1xuICAgIGNvbnN0IGVuZERhdGUgPSB0aGlzLnRlbXBFbmREYXRlID8gbmV3IERhdGUodGhpcy50ZW1wRW5kRGF0ZSkgOiBudWxsO1xuXG4gICAgaWYgKHN0YXJ0RGF0ZSkgc3RhcnREYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIGlmIChlbmREYXRlKSBlbmREYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuXG4gICAgaWYgKHN0YXJ0RGF0ZSAmJiBlbmREYXRlKSB7XG4gICAgICByZXR1cm4gZGF0ZU9ubHkgPiBzdGFydERhdGUgJiYgZGF0ZU9ubHkgPCBlbmREYXRlO1xuICAgIH0gZWxzZSBpZiAoc3RhcnREYXRlICYmIHRoaXMuaG92ZXJEYXRlICYmICFlbmREYXRlKSB7XG4gICAgICBjb25zdCBob3ZlckRhdGVPbmx5ID0gbmV3IERhdGUodGhpcy5ob3ZlckRhdGUpO1xuICAgICAgaG92ZXJEYXRlT25seS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgIGlmIChob3ZlckRhdGVPbmx5ID4gc3RhcnREYXRlKSB7XG4gICAgICAgIHJldHVybiBkYXRlT25seSA+IHN0YXJ0RGF0ZSAmJiBkYXRlT25seSA8IGhvdmVyRGF0ZU9ubHk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG9uRGF5Q2xpY2soZGF5OiBDYWxlbmRhckRheSk6IHZvaWQge1xuICAgIGlmIChkYXkuaXNEaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY2xpY2tlZERhdGUgPSBuZXcgRGF0ZShkYXkuZGF0ZSk7XG4gICAgY2xpY2tlZERhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG5cbiAgICBpZiAodGhpcy5yYW5nZU1vZGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXIgPSAnJyBhcyBGaWx0ZXJPcHRpb247XG5cbiAgICAgIGlmICghdGhpcy50ZW1wU3RhcnREYXRlIHx8ICh0aGlzLnRlbXBTdGFydERhdGUgJiYgdGhpcy50ZW1wRW5kRGF0ZSkpIHtcbiAgICAgICAgdGhpcy50ZW1wU3RhcnREYXRlID0gY2xpY2tlZERhdGU7XG4gICAgICAgIHRoaXMudGVtcEVuZERhdGUgPSBudWxsO1xuICAgICAgICB0aGlzLmhvdmVyRGF0ZSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudGVtcFN0YXJ0RGF0ZSAmJiAhdGhpcy50ZW1wRW5kRGF0ZSkge1xuICAgICAgICBjb25zdCBzdGFydERhdGUgPSBuZXcgRGF0ZSh0aGlzLnRlbXBTdGFydERhdGUpO1xuICAgICAgICBzdGFydERhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG5cbiAgICAgICAgaWYgKGNsaWNrZWREYXRlLmdldFRpbWUoKSA9PT0gc3RhcnREYXRlLmdldFRpbWUoKSkge1xuICAgICAgICAgIHRoaXMudGVtcEVuZERhdGUgPSBjbGlja2VkRGF0ZTtcbiAgICAgICAgfSBlbHNlIGlmIChjbGlja2VkRGF0ZSA+IHN0YXJ0RGF0ZSkge1xuICAgICAgICAgIHRoaXMudGVtcEVuZERhdGUgPSBjbGlja2VkRGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnRlbXBFbmREYXRlID0gc3RhcnREYXRlO1xuICAgICAgICAgIHRoaXMudGVtcFN0YXJ0RGF0ZSA9IGNsaWNrZWREYXRlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaG92ZXJEYXRlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZW1wU2luZ2xlRGF0ZSA9IGNsaWNrZWREYXRlO1xuICAgICAgLy8gQXV0by1hcHBseSBmb3Igc2luZ2xlIGRhdGUgbW9kZVxuICAgICAgdGhpcy5hcHBseSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJEYXlzKCk7XG4gIH1cblxuICBvbkRheUhvdmVyKGRheTogQ2FsZW5kYXJEYXkpOiB2b2lkIHtcbiAgICBpZiAoZGF5LmlzRGlzYWJsZWQgfHwgIXRoaXMucmFuZ2VNb2RlKSByZXR1cm47XG4gICAgdGhpcy5ob3ZlckRhdGUgPSBkYXkuZGF0ZTtcbiAgfVxuXG4gIG9uRGF5TGVhdmUoKTogdm9pZCB7XG4gICAgdGhpcy5ob3ZlckRhdGUgPSBudWxsO1xuICB9XG5cbiAgcHJldmlvdXNNb250aCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuTmF2aWdhdGVQcmV2aW91c01vbnRoKCkpIHJldHVybjtcbiAgICB0aGlzLmxlZnRNb250aERhdGUgPSBuZXcgRGF0ZSh0aGlzLmxlZnRNb250aERhdGUuZ2V0RnVsbFllYXIoKSwgdGhpcy5sZWZ0TW9udGhEYXRlLmdldE1vbnRoKCkgLSAxLCAxKTtcbiAgICBpZiAodGhpcy5yYW5nZU1vZGUpIHtcbiAgICAgIHRoaXMucmlnaHRNb250aERhdGUgPSBuZXcgRGF0ZSh0aGlzLnJpZ2h0TW9udGhEYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMucmlnaHRNb250aERhdGUuZ2V0TW9udGgoKSAtIDEsIDEpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUNhbGVuZGFyRGF5cygpO1xuICB9XG5cbiAgbmV4dE1vbnRoKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5OYXZpZ2F0ZU5leHRNb250aCgpKSByZXR1cm47XG4gICAgdGhpcy5sZWZ0TW9udGhEYXRlID0gbmV3IERhdGUodGhpcy5sZWZ0TW9udGhEYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMubGVmdE1vbnRoRGF0ZS5nZXRNb250aCgpICsgMSwgMSk7XG4gICAgaWYgKHRoaXMucmFuZ2VNb2RlKSB7XG4gICAgICB0aGlzLnJpZ2h0TW9udGhEYXRlID0gbmV3IERhdGUodGhpcy5yaWdodE1vbnRoRGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLnJpZ2h0TW9udGhEYXRlLmdldE1vbnRoKCkgKyAxLCAxKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVDYWxlbmRhckRheXMoKTtcbiAgfVxuXG4gIGNhbk5hdmlnYXRlUHJldmlvdXNNb250aCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMubWluRGF0ZSkgcmV0dXJuIHRydWU7XG5cbiAgICBjb25zdCBuZXdMZWZ0TW9udGggPSBuZXcgRGF0ZSh0aGlzLmxlZnRNb250aERhdGUuZ2V0RnVsbFllYXIoKSwgdGhpcy5sZWZ0TW9udGhEYXRlLmdldE1vbnRoKCkgLSAxLCAxKTtcbiAgICBjb25zdCBtaW5EYXRlTW9udGggPSBuZXcgRGF0ZSh0aGlzLm1pbkRhdGUuZ2V0RnVsbFllYXIoKSwgdGhpcy5taW5EYXRlLmdldE1vbnRoKCksIDEpO1xuXG4gICAgcmV0dXJuIG5ld0xlZnRNb250aCA+PSBtaW5EYXRlTW9udGg7XG4gIH1cblxuICBjYW5OYXZpZ2F0ZU5leHRNb250aCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMubWF4RGF0ZSkgcmV0dXJuIHRydWU7XG5cbiAgICBjb25zdCBjaGVja01vbnRoID0gdGhpcy5yYW5nZU1vZGUgPyB0aGlzLnJpZ2h0TW9udGhEYXRlIDogdGhpcy5sZWZ0TW9udGhEYXRlO1xuICAgIGNvbnN0IG5ld01vbnRoID0gbmV3IERhdGUoY2hlY2tNb250aC5nZXRGdWxsWWVhcigpLCBjaGVja01vbnRoLmdldE1vbnRoKCkgKyAxLCAxKTtcbiAgICBjb25zdCBtYXhEYXRlTW9udGggPSBuZXcgRGF0ZSh0aGlzLm1heERhdGUuZ2V0RnVsbFllYXIoKSwgdGhpcy5tYXhEYXRlLmdldE1vbnRoKCksIDEpO1xuXG4gICAgcmV0dXJuIG5ld01vbnRoIDw9IG1heERhdGVNb250aDtcbiAgfVxuXG4gIGdldE1vbnRoWWVhcihkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5tb250aHNbZGF0ZS5nZXRNb250aCgpXX0gJHtkYXRlLmdldEZ1bGxZZWFyKCl9YDtcbiAgfVxuXG4gIHNlbGVjdEZpbHRlcihmaWx0ZXI6IEZpbHRlck9wdGlvbik6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXIgPSBmaWx0ZXI7XG4gICAgdGhpcy5hcHBseUZpbHRlcihmaWx0ZXIpO1xuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJEYXlzKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5RmlsdGVyKGZpbHRlcjogRmlsdGVyT3B0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIHRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xuXG4gICAgbGV0IHN0YXJ0RGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBlbmREYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG5cbiAgICBzd2l0Y2ggKGZpbHRlcikge1xuICAgICAgY2FzZSAnaG95JzpcbiAgICAgICAgc3RhcnREYXRlID0gbmV3IERhdGUodG9kYXkpO1xuICAgICAgICBlbmREYXRlID0gbmV3IERhdGUodG9kYXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2F5ZXInOlxuICAgICAgICBzdGFydERhdGUgPSBuZXcgRGF0ZSh0b2RheSk7XG4gICAgICAgIHN0YXJ0RGF0ZS5zZXREYXRlKHN0YXJ0RGF0ZS5nZXREYXRlKCkgLSAxKTtcbiAgICAgICAgZW5kRGF0ZSA9IG5ldyBEYXRlKHN0YXJ0RGF0ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXN0YS1zZW1hbmEnOlxuICAgICAgICBzdGFydERhdGUgPSB0aGlzLmdldFN0YXJ0T2ZXZWVrKHRvZGF5KTtcbiAgICAgICAgZW5kRGF0ZSA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzZW1hbmEtcGFzYWRhJzpcbiAgICAgICAgY29uc3QgbGFzdFdlZWtFbmQgPSBuZXcgRGF0ZSh0aGlzLmdldFN0YXJ0T2ZXZWVrKHRvZGF5KSk7XG4gICAgICAgIGxhc3RXZWVrRW5kLnNldERhdGUobGFzdFdlZWtFbmQuZ2V0RGF0ZSgpIC0gMSk7XG4gICAgICAgIHN0YXJ0RGF0ZSA9IHRoaXMuZ2V0U3RhcnRPZldlZWsobGFzdFdlZWtFbmQpO1xuICAgICAgICBlbmREYXRlID0gbGFzdFdlZWtFbmQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXN0ZS1tZXMnOlxuICAgICAgICBzdGFydERhdGUgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpLCAxKTtcbiAgICAgICAgZW5kRGF0ZSA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtZXMtcGFzYWRvJzpcbiAgICAgICAgc3RhcnREYXRlID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgdG9kYXkuZ2V0TW9udGgoKSAtIDEsIDEpO1xuICAgICAgICBlbmREYXRlID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgdG9kYXkuZ2V0TW9udGgoKSwgMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXN0ZS1hbm8nOlxuICAgICAgICBzdGFydERhdGUgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCAwLCAxKTtcbiAgICAgICAgZW5kRGF0ZSA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhbm8tcGFzYWRvJzpcbiAgICAgICAgc3RhcnREYXRlID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSAtIDEsIDAsIDEpO1xuICAgICAgICBlbmREYXRlID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSAtIDEsIDExLCAzMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbW9zdHJhci10b2RvJzpcbiAgICAgICAgc3RhcnREYXRlID0gbnVsbDtcbiAgICAgICAgZW5kRGF0ZSA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMudGVtcFN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTtcbiAgICB0aGlzLnRlbXBFbmREYXRlID0gZW5kRGF0ZTtcblxuICAgIGlmIChzdGFydERhdGUpIHtcbiAgICAgIHRoaXMubGVmdE1vbnRoRGF0ZSA9IG5ldyBEYXRlKHN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpLCBzdGFydERhdGUuZ2V0TW9udGgoKSwgMSk7XG4gICAgICB0aGlzLnJpZ2h0TW9udGhEYXRlID0gbmV3IERhdGUoc3RhcnREYXRlLmdldEZ1bGxZZWFyKCksIHN0YXJ0RGF0ZS5nZXRNb250aCgpICsgMSwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoKTtcbiAgICAgIHRoaXMubGVmdE1vbnRoRGF0ZSA9IG5ldyBEYXRlKGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCksIGN1cnJlbnREYXRlLmdldE1vbnRoKCksIDEpO1xuICAgICAgdGhpcy5yaWdodE1vbnRoRGF0ZSA9IG5ldyBEYXRlKGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCksIGN1cnJlbnREYXRlLmdldE1vbnRoKCkgKyAxLCAxKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFN0YXJ0T2ZXZWVrKGRhdGU6IERhdGUpOiBEYXRlIHtcbiAgICBjb25zdCBkYXkgPSBkYXRlLmdldERheSgpO1xuICAgIGNvbnN0IGRpZmYgPSBkYXkgPT09IDAgPyAtNiA6IDEgLSBkYXk7XG4gICAgY29uc3Qgc3RhcnRPZldlZWsgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICBzdGFydE9mV2Vlay5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgZGlmZik7XG4gICAgcmV0dXJuIHN0YXJ0T2ZXZWVrO1xuICB9XG5cbiAgY2FuY2VsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJhbmdlTW9kZSkge1xuICAgICAgdGhpcy50ZW1wU3RhcnREYXRlID0gdGhpcy5yYW5nZVZhbHVlLnN0YXJ0RGF0ZTtcbiAgICAgIHRoaXMudGVtcEVuZERhdGUgPSB0aGlzLnJhbmdlVmFsdWUuZW5kRGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZW1wU2luZ2xlRGF0ZSA9IHRoaXMuc2luZ2xlVmFsdWU7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXIgPSAnJztcblxuICAgIHRoaXMubGVmdE1vbnRoRGF0ZSA9IG5ldyBEYXRlKHRoaXMub3JpZ2luYWxMZWZ0TW9udGhEYXRlKTtcbiAgICB0aGlzLnJpZ2h0TW9udGhEYXRlID0gbmV3IERhdGUodGhpcy5vcmlnaW5hbFJpZ2h0TW9udGhEYXRlKTtcblxuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJEYXlzKCk7XG4gICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gIH1cblxuICBhcHBseSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yYW5nZU1vZGUpIHtcbiAgICAgIHRoaXMucmFuZ2VWYWx1ZSA9IHtcbiAgICAgICAgc3RhcnREYXRlOiB0aGlzLnRlbXBTdGFydERhdGUsXG4gICAgICAgIGVuZERhdGU6IHRoaXMudGVtcEVuZERhdGVcbiAgICAgIH07XG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMucmFuZ2VWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2luZ2xlVmFsdWUgPSB0aGlzLnRlbXBTaW5nbGVEYXRlO1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnNpbmdsZVZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLm9yaWdpbmFsTGVmdE1vbnRoRGF0ZSA9IG5ldyBEYXRlKHRoaXMubGVmdE1vbnRoRGF0ZSk7XG4gICAgdGhpcy5vcmlnaW5hbFJpZ2h0TW9udGhEYXRlID0gbmV3IERhdGUodGhpcy5yaWdodE1vbnRoRGF0ZSk7XG5cbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuXG4gICAgdGhpcy5yZW1vdmVSZXBvc2l0aW9uTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmhvdmVyRGF0ZSA9IG51bGw7XG4gICAgdGhpcy5zaG93TGVmdE1vbnRoUGlja2VyID0gZmFsc2U7XG4gICAgdGhpcy5zaG93UmlnaHRNb250aFBpY2tlciA9IGZhbHNlO1xuICB9XG5cbiAgZ2V0U3RhcnREYXRlRGlzcGxheSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnRlbXBTdGFydERhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdERhdGVGb3JJbnB1dCh0aGlzLnRlbXBTdGFydERhdGUpO1xuICAgIH1cbiAgICByZXR1cm4gJ0ZlY2hhIGluaWNpbyc7XG4gIH1cblxuICBnZXRFbmREYXRlRGlzcGxheSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnRlbXBFbmREYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXREYXRlRm9ySW5wdXQodGhpcy50ZW1wRW5kRGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiAnRmVjaGEgZmluJztcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0RGF0ZUZvcklucHV0KGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuICAgIGNvbnN0IG1vbnRoID0gZGF0ZS50b0xvY2FsZVN0cmluZygnZXMtRVMnLCB7IG1vbnRoOiAnc2hvcnQnIH0pO1xuICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgcmV0dXJuIGAke2RheX0gJHttb250aH0gJHt5ZWFyfWA7XG4gIH1cblxuICB0b2dnbGVMZWZ0TW9udGhQaWNrZXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5zaG93TGVmdE1vbnRoUGlja2VyID0gIXRoaXMuc2hvd0xlZnRNb250aFBpY2tlcjtcbiAgICB0aGlzLnNob3dSaWdodE1vbnRoUGlja2VyID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuc2hvd0xlZnRNb250aFBpY2tlcikge1xuICAgICAgdGhpcy5sZWZ0WWVhclBpY2tlclBhZ2UgPSAwO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZVJpZ2h0TW9udGhQaWNrZXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5zaG93UmlnaHRNb250aFBpY2tlciA9ICF0aGlzLnNob3dSaWdodE1vbnRoUGlja2VyO1xuICAgIHRoaXMuc2hvd0xlZnRNb250aFBpY2tlciA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnNob3dSaWdodE1vbnRoUGlja2VyKSB7XG4gICAgICB0aGlzLnJpZ2h0WWVhclBpY2tlclBhZ2UgPSAwO1xuICAgIH1cbiAgfVxuXG4gIGdldExlZnRZZWFycygpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgY3VycmVudFllYXIgPSB0aGlzLmxlZnRNb250aERhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBiYXNlWWVhciA9IGN1cnJlbnRZZWFyICsgKHRoaXMubGVmdFllYXJQaWNrZXJQYWdlICogdGhpcy55ZWFyc1BlclBhZ2UpO1xuICAgIGNvbnN0IHllYXJzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnllYXJzUGVyUGFnZTsgaSsrKSB7XG4gICAgICBjb25zdCB5ZWFyID0gYmFzZVllYXIgLSA1ICsgaTtcbiAgICAgIHllYXJzLnB1c2goeWVhcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHllYXJzO1xuICB9XG5cbiAgZ2V0UmlnaHRZZWFycygpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgY3VycmVudFllYXIgPSB0aGlzLnJpZ2h0TW9udGhEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgYmFzZVllYXIgPSBjdXJyZW50WWVhciArICh0aGlzLnJpZ2h0WWVhclBpY2tlclBhZ2UgKiB0aGlzLnllYXJzUGVyUGFnZSk7XG4gICAgY29uc3QgeWVhcnM6IG51bWJlcltdID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMueWVhcnNQZXJQYWdlOyBpKyspIHtcbiAgICAgIGNvbnN0IHllYXIgPSBiYXNlWWVhciAtIDUgKyBpO1xuICAgICAgeWVhcnMucHVzaCh5ZWFyKTtcbiAgICB9XG5cbiAgICByZXR1cm4geWVhcnM7XG4gIH1cblxuICBwcmV2aW91c0xlZnRZZWFyUGFnZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmxlZnRZZWFyUGlja2VyUGFnZS0tO1xuICB9XG5cbiAgbmV4dExlZnRZZWFyUGFnZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmxlZnRZZWFyUGlja2VyUGFnZSsrO1xuICB9XG5cbiAgcHJldmlvdXNSaWdodFllYXJQYWdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMucmlnaHRZZWFyUGlja2VyUGFnZS0tO1xuICB9XG5cbiAgbmV4dFJpZ2h0WWVhclBhZ2UoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5yaWdodFllYXJQaWNrZXJQYWdlKys7XG4gIH1cblxuICBpc01vbnRoRGlzYWJsZWQobW9udGhJbmRleDogbnVtYmVyLCBjYWxlbmRhckRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICBjb25zdCB0ZXN0RGF0ZSA9IG5ldyBEYXRlKGNhbGVuZGFyRGF0ZS5nZXRGdWxsWWVhcigpLCBtb250aEluZGV4LCAxKTtcblxuICAgIGlmICh0aGlzLm1pbkRhdGUpIHtcbiAgICAgIGNvbnN0IG1pbkRhdGVNb250aCA9IG5ldyBEYXRlKHRoaXMubWluRGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLm1pbkRhdGUuZ2V0TW9udGgoKSwgMSk7XG4gICAgICBpZiAodGVzdERhdGUgPCBtaW5EYXRlTW9udGgpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1heERhdGUpIHtcbiAgICAgIGNvbnN0IG1heERhdGVNb250aCA9IG5ldyBEYXRlKHRoaXMubWF4RGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLm1heERhdGUuZ2V0TW9udGgoKSwgMSk7XG4gICAgICBpZiAodGVzdERhdGUgPiBtYXhEYXRlTW9udGgpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlzWWVhckRpc2FibGVkKHllYXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1pbkRhdGUgJiYgeWVhciA8IHRoaXMubWluRGF0ZS5nZXRGdWxsWWVhcigpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5tYXhEYXRlICYmIHllYXIgPiB0aGlzLm1heERhdGUuZ2V0RnVsbFllYXIoKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0TGVmdFllYXJSYW5nZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeWVhcnMgPSB0aGlzLmdldExlZnRZZWFycygpO1xuICAgIHJldHVybiBgJHt5ZWFyc1swXX0gLSAke3llYXJzW3llYXJzLmxlbmd0aCAtIDFdfWA7XG4gIH1cblxuICBnZXRSaWdodFllYXJSYW5nZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeWVhcnMgPSB0aGlzLmdldFJpZ2h0WWVhcnMoKTtcbiAgICByZXR1cm4gYCR7eWVhcnNbMF19IC0gJHt5ZWFyc1t5ZWFycy5sZW5ndGggLSAxXX1gO1xuICB9XG5cbiAgY2FuTmF2aWdhdGVMZWZ0WWVhcnNQcmV2aW91cygpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMubWluRGF0ZSAmJiAhdGhpcy5tYXhEYXRlKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gdGhpcy5sZWZ0TW9udGhEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgYmFzZVllYXIgPSBjdXJyZW50WWVhciArICgodGhpcy5sZWZ0WWVhclBpY2tlclBhZ2UgLSAxKSAqIHRoaXMueWVhcnNQZXJQYWdlKTtcblxuICAgIGNvbnN0IHByZXZpb3VzUGFnZVllYXJzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy55ZWFyc1BlclBhZ2U7IGkrKykge1xuICAgICAgcHJldmlvdXNQYWdlWWVhcnMucHVzaChiYXNlWWVhciAtIDUgKyBpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJldmlvdXNQYWdlWWVhcnMuc29tZSh5ZWFyID0+ICF0aGlzLmlzWWVhckRpc2FibGVkKHllYXIpKTtcbiAgfVxuXG4gIGNhbk5hdmlnYXRlTGVmdFllYXJzTmV4dCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMubWluRGF0ZSAmJiAhdGhpcy5tYXhEYXRlKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gdGhpcy5sZWZ0TW9udGhEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgYmFzZVllYXIgPSBjdXJyZW50WWVhciArICgodGhpcy5sZWZ0WWVhclBpY2tlclBhZ2UgKyAxKSAqIHRoaXMueWVhcnNQZXJQYWdlKTtcblxuICAgIGNvbnN0IG5leHRQYWdlWWVhcnM6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnllYXJzUGVyUGFnZTsgaSsrKSB7XG4gICAgICBuZXh0UGFnZVllYXJzLnB1c2goYmFzZVllYXIgLSA1ICsgaSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHRQYWdlWWVhcnMuc29tZSh5ZWFyID0+ICF0aGlzLmlzWWVhckRpc2FibGVkKHllYXIpKTtcbiAgfVxuXG4gIGNhbk5hdmlnYXRlUmlnaHRZZWFyc1ByZXZpb3VzKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5taW5EYXRlICYmICF0aGlzLm1heERhdGUpIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgY3VycmVudFllYXIgPSB0aGlzLnJpZ2h0TW9udGhEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgYmFzZVllYXIgPSBjdXJyZW50WWVhciArICgodGhpcy5yaWdodFllYXJQaWNrZXJQYWdlIC0gMSkgKiB0aGlzLnllYXJzUGVyUGFnZSk7XG5cbiAgICBjb25zdCBwcmV2aW91c1BhZ2VZZWFyczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMueWVhcnNQZXJQYWdlOyBpKyspIHtcbiAgICAgIHByZXZpb3VzUGFnZVllYXJzLnB1c2goYmFzZVllYXIgLSA1ICsgaSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByZXZpb3VzUGFnZVllYXJzLnNvbWUoeWVhciA9PiAhdGhpcy5pc1llYXJEaXNhYmxlZCh5ZWFyKSk7XG4gIH1cblxuICBjYW5OYXZpZ2F0ZVJpZ2h0WWVhcnNOZXh0KCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5taW5EYXRlICYmICF0aGlzLm1heERhdGUpIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgY3VycmVudFllYXIgPSB0aGlzLnJpZ2h0TW9udGhEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgYmFzZVllYXIgPSBjdXJyZW50WWVhciArICgodGhpcy5yaWdodFllYXJQaWNrZXJQYWdlICsgMSkgKiB0aGlzLnllYXJzUGVyUGFnZSk7XG5cbiAgICBjb25zdCBuZXh0UGFnZVllYXJzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy55ZWFyc1BlclBhZ2U7IGkrKykge1xuICAgICAgbmV4dFBhZ2VZZWFycy5wdXNoKGJhc2VZZWFyIC0gNSArIGkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXh0UGFnZVllYXJzLnNvbWUoeWVhciA9PiAhdGhpcy5pc1llYXJEaXNhYmxlZCh5ZWFyKSk7XG4gIH1cblxuICBzZWxlY3RMZWZ0TW9udGgobW9udGhJbmRleDogbnVtYmVyLCBldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5sZWZ0TW9udGhEYXRlID0gbmV3IERhdGUodGhpcy5sZWZ0TW9udGhEYXRlLmdldEZ1bGxZZWFyKCksIG1vbnRoSW5kZXgsIDEpO1xuICAgIGlmICh0aGlzLnJhbmdlTW9kZSkge1xuICAgICAgdGhpcy5yaWdodE1vbnRoRGF0ZSA9IG5ldyBEYXRlKHRoaXMubGVmdE1vbnRoRGF0ZS5nZXRGdWxsWWVhcigpLCBtb250aEluZGV4ICsgMSwgMSk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJEYXlzKCk7XG4gICAgdGhpcy5zaG93TGVmdE1vbnRoUGlja2VyID0gZmFsc2U7XG4gIH1cblxuICBzZWxlY3RSaWdodE1vbnRoKG1vbnRoSW5kZXg6IG51bWJlciwgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICAgIHRoaXMucmlnaHRNb250aERhdGUgPSBuZXcgRGF0ZSh0aGlzLnJpZ2h0TW9udGhEYXRlLmdldEZ1bGxZZWFyKCksIG1vbnRoSW5kZXgsIDEpO1xuICAgIHRoaXMubGVmdE1vbnRoRGF0ZSA9IG5ldyBEYXRlKHRoaXMucmlnaHRNb250aERhdGUuZ2V0RnVsbFllYXIoKSwgbW9udGhJbmRleCAtIDEsIDEpO1xuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJEYXlzKCk7XG4gICAgdGhpcy5zaG93UmlnaHRNb250aFBpY2tlciA9IGZhbHNlO1xuICB9XG5cbiAgc2VsZWN0TGVmdFllYXIoeWVhcjogbnVtYmVyLCBldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5sZWZ0TW9udGhEYXRlID0gbmV3IERhdGUoeWVhciwgdGhpcy5sZWZ0TW9udGhEYXRlLmdldE1vbnRoKCksIDEpO1xuICAgIGlmICh0aGlzLnJhbmdlTW9kZSkge1xuICAgICAgdGhpcy5yaWdodE1vbnRoRGF0ZSA9IG5ldyBEYXRlKHllYXIsIHRoaXMubGVmdE1vbnRoRGF0ZS5nZXRNb250aCgpICsgMSwgMSk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJEYXlzKCk7XG4gICAgdGhpcy5zaG93TGVmdE1vbnRoUGlja2VyID0gZmFsc2U7XG4gIH1cblxuICBzZWxlY3RSaWdodFllYXIoeWVhcjogbnVtYmVyLCBldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5yaWdodE1vbnRoRGF0ZSA9IG5ldyBEYXRlKHllYXIsIHRoaXMucmlnaHRNb250aERhdGUuZ2V0TW9udGgoKSwgMSk7XG4gICAgdGhpcy5sZWZ0TW9udGhEYXRlID0gbmV3IERhdGUoeWVhciwgdGhpcy5yaWdodE1vbnRoRGF0ZS5nZXRNb250aCgpIC0gMSwgMSk7XG4gICAgdGhpcy51cGRhdGVDYWxlbmRhckRheXMoKTtcbiAgICB0aGlzLnNob3dSaWdodE1vbnRoUGlja2VyID0gZmFsc2U7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBEYXRlUGlja2VyVmFsdWUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yYW5nZU1vZGUpIHtcbiAgICAgIGNvbnN0IHJhbmdlVmFsID0gdmFsdWUgYXMgRGF0ZVJhbmdlO1xuICAgICAgdGhpcy5yYW5nZVZhbHVlID0gcmFuZ2VWYWwgfHwgeyBzdGFydERhdGU6IG51bGwsIGVuZERhdGU6IG51bGwgfTtcbiAgICAgIHRoaXMudGVtcFN0YXJ0RGF0ZSA9IHRoaXMucmFuZ2VWYWx1ZS5zdGFydERhdGU7XG4gICAgICB0aGlzLnRlbXBFbmREYXRlID0gdGhpcy5yYW5nZVZhbHVlLmVuZERhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2luZ2xlVmFsdWUgPSB2YWx1ZSBhcyBEYXRlIHwgbnVsbDtcbiAgICAgIHRoaXMudGVtcFNpbmdsZURhdGUgPSB0aGlzLnNpbmdsZVZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICBwdWJsaWMgcmVzZXREYXRlUGlja2VyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJhbmdlTW9kZSkge1xuICAgICAgdGhpcy5yYW5nZVZhbHVlID0geyBzdGFydERhdGU6IG51bGwsIGVuZERhdGU6IG51bGwgfTtcbiAgICAgIHRoaXMudGVtcFN0YXJ0RGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLnRlbXBFbmREYXRlID0gbnVsbDtcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5yYW5nZVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaW5nbGVWYWx1ZSA9IG51bGw7XG4gICAgICB0aGlzLnRlbXBTaW5nbGVEYXRlID0gbnVsbDtcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5zaW5nbGVWYWx1ZSk7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXIgPSAnJztcblxuICAgIHRoaXMuaW5pdGlhbGl6ZURhdGVzKCk7XG4gICAgdGhpcy51cGRhdGVDYWxlbmRhckRheXMoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLXdyYXBwZXJcIj5cbiAgPGxhYmVsICpuZ0lmPVwibGFiZWxcIiBbZm9yXT1cImlkXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuXG4gIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1jb250YWluZXJcIj5cbiAgICA8ZGl2XG4gICAgICAjdHJpZ2dlclxuICAgICAgY2xhc3M9XCJkYXRlLXBpY2tlci1pbnB1dFwiXG4gICAgICBbY2xhc3MuZXJyb3JdPVwiaGFzRXJyb3JcIlxuICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFtjbGFzcy5vcGVuXT1cImlzT3BlblwiXG4gICAgICBbY2xhc3MuaWNvbi1yaWdodF09XCJpY29uUG9zaXRpb24gPT09ICdyaWdodCdcIlxuICAgICAgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKCRldmVudClcIj5cblxuICAgICAgPHN2ZyAqbmdJZj1cImljb25Qb3NpdGlvbiA9PT0gJ2xlZnQnXCIgY2xhc3M9XCJjYWxlbmRhci1pY29uXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTYuNjY2NjcgMS42NjY2N1Y0LjE2NjY3TTEzLjMzMzMgMS42NjY2N1Y0LjE2NjY3TTIuNSA3LjVIMTcuNU00LjE2NjY3IDMuMzMzMzNIMTUuODMzM0MxNi43NTM4IDMuMzMzMzMgMTcuNSA0LjA3OTUzIDE3LjUgNVYxNi42NjY3QzE3LjUgMTcuNTg3MSAxNi43NTM4IDE4LjMzMzMgMTUuODMzMyAxOC4zMzMzSDQuMTY2NjdDMy4yNDYxOSAxOC4zMzMzIDIuNSAxNy41ODcxIDIuNSAxNi42NjY3VjVDMi41IDQuMDc5NTMgMy4yNDYxOSAzLjMzMzMzIDQuMTY2NjcgMy4zMzMzM1pcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICA8L3N2Zz5cblxuICAgICAgPHNwYW4gY2xhc3M9XCJkYXRlLXBpY2tlci1wbGFjZWhvbGRlclwiICpuZ0lmPVwiIWdldERpc3BsYXlWYWx1ZSgpXCI+XG4gICAgICAgIHt7IHBsYWNlaG9sZGVyIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImRhdGUtcGlja2VyLXZhbHVlXCIgKm5nSWY9XCJnZXREaXNwbGF5VmFsdWUoKVwiPlxuICAgICAgICB7eyBnZXREaXNwbGF5VmFsdWUoKSB9fVxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8c3ZnICpuZ0lmPVwiaWNvblBvc2l0aW9uID09PSAncmlnaHQnXCIgY2xhc3M9XCJjYWxlbmRhci1pY29uXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTYuNjY2NjcgMS42NjY2N1Y0LjE2NjY3TTEzLjMzMzMgMS42NjY2N1Y0LjE2NjY3TTIuNSA3LjVIMTcuNU00LjE2NjY3IDMuMzMzMzNIMTUuODMzM0MxNi43NTM4IDMuMzMzMzMgMTcuNSA0LjA3OTUzIDE3LjUgNVYxNi42NjY3QzE3LjUgMTcuNTg3MSAxNi43NTM4IDE4LjMzMzMgMTUuODMzMyAxOC4zMzMzSDQuMTY2NjdDMy4yNDYxOSAxOC4zMzMzIDIuNSAxNy41ODcxIDIuNSAxNi42NjY3VjVDMi41IDQuMDc5NTMgMy4yNDYxOSAzLjMzMzMzIDQuMTY2NjcgMy4zMzMzM1pcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cImhhc0Vycm9yICYmIGVycm9yTWVzc2FnZVwiIGNsYXNzPVwiZmllbGQtZXJyb3JcIj5cbiAgICB7eyBlcnJvck1lc3NhZ2UgfX1cbiAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSBEcm9wZG93biBjb250ZW50IChyZW5kZXJlZCB3aXRoIGZpeGVkIHBvc2l0aW9uKSAtLT5cbjxkaXYgKm5nSWY9XCJpc09wZW5cIiBjbGFzcz1cImRhdGUtcGlja2VyLW92ZXJsYXlcIj5cbiAgPGRpdiAjZHJvcGRvd24gY2xhc3M9XCJkYXRlLXBpY2tlci1kcm9wZG93blwiIFtjbGFzcy5vcGVuXT1cImlzT3BlblwiIFtjbGFzcy5yYW5nZS1tb2RlXT1cInJhbmdlTW9kZVwiIFtuZ1N0eWxlXT1cImdldERyb3Bkb3duU3R5bGUoKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1jb250ZW50XCI+XG4gICAgICA8IS0tIFNpZGViYXIgd2l0aCBmaWx0ZXJzIChvbmx5IGZvciByYW5nZSBtb2RlKSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItc2lkZWJhclwiICpuZ0lmPVwicmFuZ2VNb2RlXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlck9wdGlvbnNcIlxuICAgICAgICAgIGNsYXNzPVwiZmlsdGVyLW9wdGlvblwiXG4gICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZEZpbHRlciA9PT0gb3B0aW9uLnZhbHVlXCJcbiAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RmlsdGVyKG9wdGlvbi52YWx1ZSlcIj5cbiAgICAgICAgICB7eyBvcHRpb24ubGFiZWwgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBNYWluIGNvbnRlbnQgKGNhbGVuZGFycyArIGZvb3RlcikgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItbWFpblwiPlxuICAgICAgICA8IS0tIENhbGVuZGFycyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFycy1jb250YWluZXJcIj5cbiAgICAgICAgICA8IS0tIExlZnQgQ2FsZW5kYXIgKG9yIHNpbmdsZSBjYWxlbmRhciBpbiBzaW5nbGUgbW9kZSkgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItaGVhZGVyXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm5hdi1idXR0b25cIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuTmF2aWdhdGVQcmV2aW91c01vbnRoKClcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCIhY2FuTmF2aWdhdGVQcmV2aW91c01vbnRoKClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJwcmV2aW91c01vbnRoKClcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy41IDJMMy41IDZMNy41IDEwXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLXllYXItc2VsZWN0b3JcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1vbnRoLXllYXJcIiAoY2xpY2spPVwidG9nZ2xlTGVmdE1vbnRoUGlja2VyKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGdldE1vbnRoWWVhcihsZWZ0TW9udGhEYXRlKSB9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBNb250aC9ZZWFyIFBpY2tlciBEcm9wZG93biAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgteWVhci1waWNrZXJcIiAqbmdJZj1cInNob3dMZWZ0TW9udGhQaWNrZXJcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGlja2VyLXNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBpY2tlci10aXRsZVwiPk1lczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGhzLWdyaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBtb250aCBvZiBtb250aHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtb250aC1vcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpID09PSBsZWZ0TW9udGhEYXRlLmdldE1vbnRoKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImlzTW9udGhEaXNhYmxlZChpLCBsZWZ0TW9udGhEYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNNb250aERpc2FibGVkKGksIGxlZnRNb250aERhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RMZWZ0TW9udGgoaSwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgbW9udGguc3Vic3RyaW5nKDAsIDMpIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGlja2VyLXNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBpY2tlci1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwieWVhci1uYXYtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuTmF2aWdhdGVMZWZ0WWVhcnNQcmV2aW91cygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCIhY2FuTmF2aWdhdGVMZWZ0WWVhcnNQcmV2aW91cygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwcmV2aW91c0xlZnRZZWFyUGFnZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjI1IDIuNUwzLjc1IDVMNi4yNSA3LjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGlja2VyLXRpdGxlXCI+e3sgZ2V0TGVmdFllYXJSYW5nZUxhYmVsKCkgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwieWVhci1uYXYtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuTmF2aWdhdGVMZWZ0WWVhcnNOZXh0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIiFjYW5OYXZpZ2F0ZUxlZnRZZWFyc05leHQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmV4dExlZnRZZWFyUGFnZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zLjc1IDIuNUw2LjI1IDVMMy43NSA3LjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ5ZWFycy1ncmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgeWVhciBvZiBnZXRMZWZ0WWVhcnMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInllYXItb3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwieWVhciA9PT0gbGVmdE1vbnRoRGF0ZS5nZXRGdWxsWWVhcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJpc1llYXJEaXNhYmxlZCh5ZWFyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNZZWFyRGlzYWJsZWQoeWVhcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdExlZnRZZWFyKHllYXIsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHllYXIgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm5hdi1idXR0b25cIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuTmF2aWdhdGVOZXh0TW9udGgoKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIiFjYW5OYXZpZ2F0ZU5leHRNb250aCgpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibmV4dE1vbnRoKClcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNC41IDJMOC41IDZMNC41IDEwXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItZ3JpZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2Vla2RheS1oZWFkZXJcIiAqbmdGb3I9XCJsZXQgZGF5IG9mIHdlZWtEYXlzXCI+XG4gICAgICAgICAgICAgICAge3sgZGF5IH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF5IG9mIGxlZnRDYWxlbmRhckRheXM7IHRyYWNrQnk6IHRyYWNrQnlEYXRlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNhbGVuZGFyLWRheVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLm90aGVyLW1vbnRoXT1cIiFkYXkuaXNDdXJyZW50TW9udGhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy50b2RheV09XCJkYXkuaXNUb2RheVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImRheS5pc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaW4tcmFuZ2VdPVwicmFuZ2VNb2RlICYmIGlzSW5SYW5nZShkYXkuZGF0ZSlcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5yYW5nZS1zdGFydF09XCJkYXkuaXNSYW5nZVN0YXJ0XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MucmFuZ2UtZW5kXT1cImRheS5pc1JhbmdlRW5kXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiZGF5LmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRheUNsaWNrKGRheSlcIlxuICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9uRGF5SG92ZXIoZGF5KVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25EYXlMZWF2ZSgpXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgZGF5LmRhdGUuZ2V0RGF0ZSgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBSaWdodCBDYWxlbmRhciAob25seSBmb3IgcmFuZ2UgbW9kZSkgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyXCIgKm5nSWY9XCJyYW5nZU1vZGVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5hdi1idXR0b24tcGxhY2Vob2xkZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLXllYXItc2VsZWN0b3JcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1vbnRoLXllYXJcIiAoY2xpY2spPVwidG9nZ2xlUmlnaHRNb250aFBpY2tlcigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICB7eyBnZXRNb250aFllYXIocmlnaHRNb250aERhdGUpIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8IS0tIE1vbnRoL1llYXIgUGlja2VyIERyb3Bkb3duIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb250aC15ZWFyLXBpY2tlclwiICpuZ0lmPVwic2hvd1JpZ2h0TW9udGhQaWNrZXJcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGlja2VyLXNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBpY2tlci10aXRsZVwiPk1lczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGhzLWdyaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBtb250aCBvZiBtb250aHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtb250aC1vcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpID09PSByaWdodE1vbnRoRGF0ZS5nZXRNb250aCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJpc01vbnRoRGlzYWJsZWQoaSwgcmlnaHRNb250aERhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc01vbnRoRGlzYWJsZWQoaSwgcmlnaHRNb250aERhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RSaWdodE1vbnRoKGksICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1vbnRoLnN1YnN0cmluZygwLCAzKSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBpY2tlci1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaWNrZXItaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInllYXItbmF2LWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNhbk5hdmlnYXRlUmlnaHRZZWFyc1ByZXZpb3VzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIiFjYW5OYXZpZ2F0ZVJpZ2h0WWVhcnNQcmV2aW91cygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwcmV2aW91c1JpZ2h0WWVhclBhZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi4yNSAyLjVMMy43NSA1TDYuMjUgNy41XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBpY2tlci10aXRsZVwiPnt7IGdldFJpZ2h0WWVhclJhbmdlTGFiZWwoKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ5ZWFyLW5hdi1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5OYXZpZ2F0ZVJpZ2h0WWVhcnNOZXh0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIiFjYW5OYXZpZ2F0ZVJpZ2h0WWVhcnNOZXh0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5leHRSaWdodFllYXJQYWdlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAxMCAxMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMuNzUgMi41TDYuMjUgNUwzLjc1IDcuNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInllYXJzLWdyaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB5ZWFyIG9mIGdldFJpZ2h0WWVhcnMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInllYXItb3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwieWVhciA9PT0gcmlnaHRNb250aERhdGUuZ2V0RnVsbFllYXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiaXNZZWFyRGlzYWJsZWQoeWVhcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzWWVhckRpc2FibGVkKHllYXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RSaWdodFllYXIoeWVhciwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgeWVhciB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibmF2LWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5OYXZpZ2F0ZU5leHRNb250aCgpXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiIWNhbk5hdmlnYXRlTmV4dE1vbnRoKClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJuZXh0TW9udGgoKVwiPlxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00LjUgMkw4LjUgNkw0LjUgMTBcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1ncmlkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3ZWVrZGF5LWhlYWRlclwiICpuZ0Zvcj1cImxldCBkYXkgb2Ygd2Vla0RheXNcIj5cbiAgICAgICAgICAgICAgICB7eyBkYXkgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBkYXkgb2YgcmlnaHRDYWxlbmRhckRheXM7IHRyYWNrQnk6IHRyYWNrQnlEYXRlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNhbGVuZGFyLWRheVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLm90aGVyLW1vbnRoXT1cIiFkYXkuaXNDdXJyZW50TW9udGhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy50b2RheV09XCJkYXkuaXNUb2RheVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImRheS5pc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaW4tcmFuZ2VdPVwiaXNJblJhbmdlKGRheS5kYXRlKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnJhbmdlLXN0YXJ0XT1cImRheS5pc1JhbmdlU3RhcnRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5yYW5nZS1lbmRdPVwiZGF5LmlzUmFuZ2VFbmRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJkYXkuaXNEaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGF5Q2xpY2soZGF5KVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25EYXlIb3ZlcihkYXkpXCJcbiAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbkRheUxlYXZlKClcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBkYXkuZGF0ZS5nZXREYXRlKCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gRm9vdGVyIHdpdGggZGF0ZXMgYW5kIGFjdGlvbnMgKG9ubHkgZm9yIHJhbmdlIG1vZGUpIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyXCIgKm5nSWY9XCJyYW5nZU1vZGVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0ZWQtZGF0ZXNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLWRpc3BsYXlcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk01LjMzMzMzIDEuMzMzMzNWMy4zMzMzM00xMC42NjY3IDEuMzMzMzNWMy4zMzMzM00yIDZIMTRNMy4zMzMzMyAyLjY2NjY3SDEyLjY2NjdDMTMuNDAzIDIuNjY2NjcgMTQgMy4yNjM2MiAxNCA0VjEzLjMzMzNDMTQgMTQuMDY5NyAxMy40MDMgMTQuNjY2NyAxMi42NjY3IDE0LjY2NjdIMy4zMzMzM0MyLjU5Njk1IDE0LjY2NjcgMiAxNC4wNjk3IDIgMTMuMzMzM1Y0QzIgMy4yNjM2MiAyLjU5Njk1IDIuNjY2NjcgMy4zMzMzMyAyLjY2NjY3WlwiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGUtdGV4dFwiPnt7IGdldFN0YXJ0RGF0ZURpc3BsYXkoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXRlLXNlcGFyYXRvclwiPi08L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1kaXNwbGF5XCI+XG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNS4zMzMzMyAxLjMzMzMzVjMuMzMzMzNNMTAuNjY2NyAxLjMzMzMzVjMuMzMzMzNNMiA2SDE0TTMuMzMzMzMgMi42NjY2N0gxMi42NjY3QzEzLjQwMyAyLjY2NjY3IDE0IDMuMjYzNjIgMTQgNFYxMy4zMzMzQzE0IDE0LjA2OTcgMTMuNDAzIDE0LjY2NjcgMTIuNjY2NyAxNC42NjY3SDMuMzMzMzNDMi41OTY5NSAxNC42NjY3IDIgMTQuMDY5NyAyIDEzLjMzMzNWNEMyIDMuMjYzNjIgMi41OTY5NSAyLjY2NjY3IDMuMzMzMzMgMi42NjY2N1pcIiBzdHJva2U9XCIjNkI3MjgwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXRlLXRleHRcIj57eyBnZXRFbmREYXRlRGlzcGxheSgpIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNhbmNlbFwiIChjbGljayk9XCJjYW5jZWwoKVwiPlxuICAgICAgICAgICAgICBDYW5jZWxhclxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1hcHBseVwiIChjbGljayk9XCJhcHBseSgpXCI+XG4gICAgICAgICAgICAgIEFwbGljYXJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19