@oneluiz/dual-datepicker 2.7.0 → 3.0.1

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.
@@ -1,466 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, HostListener, forwardRef, signal, computed, effect, inject } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { FormsModule, ReactiveFormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
4
- import { DATE_ADAPTER } from './date-adapter';
5
- import { NativeDateAdapter } from './native-date-adapter';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/common";
8
- export class DualDatepickerComponent {
9
- elementRef;
10
- placeholder = 'Select date range';
11
- fechaInicio = '';
12
- fechaFin = '';
13
- showPresets = true;
14
- showClearButton = false;
15
- multiRange = false;
16
- closeOnSelection = true;
17
- closeOnPresetSelection = true;
18
- closeOnClickOutside = true;
19
- presets = [
20
- { label: 'Last month', daysAgo: 30 },
21
- { label: 'Last 6 months', daysAgo: 180 },
22
- { label: 'Last year', daysAgo: 365 }
23
- ];
24
- inputBackgroundColor = '#fff';
25
- inputTextColor = '#495057';
26
- inputBorderColor = '#ced4da';
27
- inputBorderColorHover = '#ced4da';
28
- inputBorderColorFocus = '#80bdff';
29
- inputPadding = '0.375rem 0.75rem';
30
- locale = {};
31
- dateRangeChange = new EventEmitter();
32
- dateRangeSelected = new EventEmitter();
33
- multiDateRangeChange = new EventEmitter();
34
- multiDateRangeSelected = new EventEmitter();
35
- // Date adapter injection
36
- dateAdapter = inject(DATE_ADAPTER);
37
- // Signals for reactive state
38
- mostrarDatePicker = signal(false);
39
- rangoFechas = signal('');
40
- fechaSeleccionandoInicio = signal(true);
41
- mesActual = signal(this.dateAdapter.today());
42
- mesAnterior = signal(this.dateAdapter.today());
43
- diasMesActual = signal([]);
44
- diasMesAnterior = signal([]);
45
- isDisabled = signal(false);
46
- // Multi-range support
47
- selectedRanges = signal([]);
48
- currentRangeIndex = signal(-1);
49
- // Computed values
50
- nombreMesActual = computed(() => this.getNombreMes(this.mesActual()));
51
- nombreMesAnterior = computed(() => this.getNombreMes(this.mesAnterior()));
52
- diasSemana = computed(() => this.getDayNames());
53
- defaultMonthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
54
- defaultMonthNamesShort = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
55
- defaultDayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
56
- defaultDayNamesShort = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];
57
- // ControlValueAccessor callbacks
58
- onChange = () => { };
59
- onTouched = () => { };
60
- constructor(elementRef) {
61
- this.elementRef = elementRef;
62
- // Effect to emit changes when dates change
63
- effect(() => {
64
- const rango = this.rangoFechas();
65
- if (this.fechaInicio || this.fechaFin) {
66
- this.onChange(this.getDateRangeValue());
67
- }
68
- });
69
- }
70
- onClickOutside(event) {
71
- if (this.mostrarDatePicker() && this.closeOnClickOutside) {
72
- const clickedInside = this.elementRef.nativeElement.contains(event.target);
73
- if (!clickedInside) {
74
- this.cerrarDatePicker();
75
- }
76
- }
77
- }
78
- ngOnInit() {
79
- if (this.fechaInicio && this.fechaFin) {
80
- this.actualizarRangoFechasTexto();
81
- this.generarCalendarios();
82
- }
83
- }
84
- ngOnChanges(changes) {
85
- if (changes['fechaInicio'] || changes['fechaFin']) {
86
- if (this.fechaInicio && this.fechaFin) {
87
- this.actualizarRangoFechasTexto();
88
- this.generarCalendarios();
89
- }
90
- else if (!this.fechaInicio && !this.fechaFin) {
91
- this.rangoFechas.set('');
92
- }
93
- }
94
- }
95
- formatearFecha(fecha) {
96
- const year = this.dateAdapter.getYear(fecha);
97
- const month = String(this.dateAdapter.getMonth(fecha) + 1).padStart(2, '0');
98
- const day = String(this.dateAdapter.getDate(fecha)).padStart(2, '0');
99
- return `${year}-${month}-${day}`;
100
- }
101
- formatearFechaDisplay(fechaStr) {
102
- if (!fechaStr)
103
- return '';
104
- const fecha = this.dateAdapter.parse(fechaStr);
105
- if (!fecha)
106
- return '';
107
- const monthNames = this.locale.monthNamesShort || this.defaultMonthNamesShort;
108
- return `${this.dateAdapter.getDate(fecha)} ${monthNames[this.dateAdapter.getMonth(fecha)]}`;
109
- }
110
- actualizarRangoFechasTexto() {
111
- if (this.fechaInicio && this.fechaFin) {
112
- const inicio = this.formatearFechaDisplay(this.fechaInicio);
113
- const fin = this.formatearFechaDisplay(this.fechaFin);
114
- this.rangoFechas.set(`${inicio} - ${fin}`);
115
- }
116
- else {
117
- this.rangoFechas.set('');
118
- }
119
- }
120
- toggleDatePicker() {
121
- this.mostrarDatePicker.update(value => !value);
122
- if (this.mostrarDatePicker()) {
123
- this.fechaSeleccionandoInicio.set(true);
124
- const mesActualValue = this.mesActual();
125
- const año = this.dateAdapter.getYear(mesActualValue);
126
- const mes = this.dateAdapter.getMonth(mesActualValue);
127
- const mesAnteriorDate = this.dateAdapter.createDate(año, mes - 1, 1);
128
- this.mesAnterior.set(mesAnteriorDate);
129
- this.generarCalendarios();
130
- }
131
- this.onTouched();
132
- }
133
- cerrarDatePicker() {
134
- this.mostrarDatePicker.set(false);
135
- this.onTouched();
136
- }
137
- generarCalendarios() {
138
- this.diasMesAnterior.set(this.generarCalendarioMes(this.mesAnterior()));
139
- this.diasMesActual.set(this.generarCalendarioMes(this.mesActual()));
140
- }
141
- generarCalendarioMes(fecha) {
142
- const año = this.dateAdapter.getYear(fecha);
143
- const mes = this.dateAdapter.getMonth(fecha);
144
- const primerDia = this.dateAdapter.createDate(año, mes, 1);
145
- const ultimoDia = this.dateAdapter.createDate(año, mes + 1, 0);
146
- const diasEnMes = this.dateAdapter.getDate(ultimoDia);
147
- const primerDiaSemana = this.dateAdapter.getDay(primerDia);
148
- const diasMes = [];
149
- for (let i = 0; i < primerDiaSemana; i++) {
150
- diasMes.push({ dia: null, esMesActual: false });
151
- }
152
- for (let dia = 1; dia <= diasEnMes; dia++) {
153
- const fechaDia = this.dateAdapter.createDate(año, mes, dia);
154
- const fechaStr = this.formatearFecha(fechaDia);
155
- diasMes.push({
156
- dia: dia,
157
- fecha: fechaStr,
158
- esMesActual: true,
159
- esInicio: this.fechaInicio === fechaStr,
160
- esFin: this.fechaFin === fechaStr,
161
- enRango: this.estaEnRango(fechaStr)
162
- });
163
- }
164
- return diasMes;
165
- }
166
- estaEnRango(fechaStr) {
167
- if (this.multiRange) {
168
- // Check if date is in any of the selected ranges
169
- return this.selectedRanges().some(range => {
170
- return fechaStr >= range.fechaInicio && fechaStr <= range.fechaFin;
171
- });
172
- }
173
- else {
174
- if (!this.fechaInicio || !this.fechaFin)
175
- return false;
176
- return fechaStr >= this.fechaInicio && fechaStr <= this.fechaFin;
177
- }
178
- }
179
- seleccionarDia(diaObj) {
180
- if (!diaObj.esMesActual || this.isDisabled())
181
- return;
182
- if (this.multiRange) {
183
- // Multi-range mode: add ranges to array
184
- if (this.fechaSeleccionandoInicio()) {
185
- this.fechaInicio = diaObj.fecha;
186
- this.fechaFin = '';
187
- this.rangoFechas.set('');
188
- this.fechaSeleccionandoInicio.set(false);
189
- }
190
- else {
191
- if (diaObj.fecha < this.fechaInicio) {
192
- this.fechaFin = this.fechaInicio;
193
- this.fechaInicio = diaObj.fecha;
194
- }
195
- else {
196
- this.fechaFin = diaObj.fecha;
197
- }
198
- // Add the new range to the array
199
- const newRange = {
200
- fechaInicio: this.fechaInicio,
201
- fechaFin: this.fechaFin,
202
- rangoTexto: this.formatearFechaDisplay(this.fechaInicio) + ' – ' + this.formatearFechaDisplay(this.fechaFin)
203
- };
204
- const currentRanges = [...this.selectedRanges()];
205
- currentRanges.push(newRange);
206
- this.selectedRanges.set(currentRanges);
207
- // Reset for next range selection
208
- this.fechaInicio = '';
209
- this.fechaFin = '';
210
- this.fechaSeleccionandoInicio.set(true);
211
- // Update display text
212
- this.actualizarMultiRangoTexto();
213
- // Don't close if multiRange, allow adding more ranges
214
- if (this.closeOnSelection && !this.multiRange) {
215
- this.mostrarDatePicker.set(false);
216
- }
217
- this.emitirMultiCambio();
218
- this.emitirMultiSeleccion();
219
- }
220
- this.generarCalendarios();
221
- }
222
- else {
223
- // Single range mode (original behavior)
224
- if (this.fechaSeleccionandoInicio()) {
225
- this.fechaInicio = diaObj.fecha;
226
- this.fechaFin = '';
227
- this.rangoFechas.set('');
228
- this.fechaSeleccionandoInicio.set(false);
229
- this.emitirCambio();
230
- }
231
- else {
232
- if (diaObj.fecha < this.fechaInicio) {
233
- this.fechaFin = this.fechaInicio;
234
- this.fechaInicio = diaObj.fecha;
235
- }
236
- else {
237
- this.fechaFin = diaObj.fecha;
238
- }
239
- this.actualizarRangoFechasTexto();
240
- if (this.closeOnSelection) {
241
- this.mostrarDatePicker.set(false);
242
- }
243
- this.fechaSeleccionandoInicio.set(true);
244
- this.emitirCambio();
245
- this.emitirSeleccion();
246
- }
247
- this.generarCalendarios();
248
- }
249
- }
250
- cambiarMes(direccion) {
251
- const mesActualValue = this.mesActual();
252
- const año = this.dateAdapter.getYear(mesActualValue);
253
- const mes = this.dateAdapter.getMonth(mesActualValue);
254
- const nuevoMesActual = this.dateAdapter.createDate(año, mes + direccion, 1);
255
- this.mesActual.set(nuevoMesActual);
256
- const añoNuevo = this.dateAdapter.getYear(nuevoMesActual);
257
- const mesNuevo = this.dateAdapter.getMonth(nuevoMesActual);
258
- const mesAnteriorNuevo = this.dateAdapter.createDate(añoNuevo, mesNuevo - 1, 1);
259
- this.mesAnterior.set(mesAnteriorNuevo);
260
- this.generarCalendarios();
261
- }
262
- getNombreMes(fecha) {
263
- const monthNames = this.locale.monthNames || this.defaultMonthNames;
264
- return `${monthNames[this.dateAdapter.getMonth(fecha)]} ${this.dateAdapter.getYear(fecha)}`;
265
- }
266
- getDayNames() {
267
- return this.locale.dayNamesShort || this.defaultDayNamesShort;
268
- }
269
- seleccionarRangoPredefinido(preset) {
270
- let start;
271
- let end;
272
- // New flexible pattern with getValue()
273
- if (preset.getValue) {
274
- const range = preset.getValue();
275
- start = range.start;
276
- end = range.end;
277
- }
278
- // Backward compatibility with daysAgo pattern
279
- else if (preset.daysAgo !== undefined) {
280
- const hoy = this.dateAdapter.today();
281
- const fechaInicio = this.dateAdapter.addDays(hoy, -preset.daysAgo);
282
- start = this.formatearFecha(fechaInicio);
283
- end = this.formatearFecha(hoy);
284
- }
285
- else {
286
- console.error('PresetConfig must have either getValue() or daysAgo');
287
- return;
288
- }
289
- this.fechaInicio = start;
290
- this.fechaFin = end;
291
- this.actualizarRangoFechasTexto();
292
- this.generarCalendarios();
293
- if (this.closeOnPresetSelection) {
294
- this.mostrarDatePicker.set(false);
295
- }
296
- this.emitirSeleccion();
297
- }
298
- limpiar() {
299
- this.fechaInicio = '';
300
- this.fechaFin = '';
301
- this.rangoFechas.set('');
302
- this.mostrarDatePicker.set(false);
303
- this.fechaSeleccionandoInicio.set(true);
304
- if (this.multiRange) {
305
- this.selectedRanges.set([]);
306
- this.currentRangeIndex.set(-1);
307
- this.emitirMultiCambio();
308
- }
309
- else {
310
- this.emitirCambio();
311
- }
312
- this.onTouched();
313
- this.generarCalendarios();
314
- }
315
- eliminarRango(index) {
316
- if (!this.multiRange)
317
- return;
318
- const currentRanges = [...this.selectedRanges()];
319
- currentRanges.splice(index, 1);
320
- this.selectedRanges.set(currentRanges);
321
- this.actualizarMultiRangoTexto();
322
- this.emitirMultiCambio();
323
- this.emitirMultiSeleccion();
324
- this.generarCalendarios();
325
- }
326
- actualizarMultiRangoTexto() {
327
- const count = this.selectedRanges().length;
328
- if (count === 0) {
329
- this.rangoFechas.set('');
330
- }
331
- else if (count === 1) {
332
- this.rangoFechas.set('1 range selected');
333
- }
334
- else {
335
- this.rangoFechas.set(`${count} ranges selected`);
336
- }
337
- }
338
- emitirCambio() {
339
- this.dateRangeChange.emit({
340
- fechaInicio: this.fechaInicio,
341
- fechaFin: this.fechaFin,
342
- rangoTexto: this.rangoFechas()
343
- });
344
- }
345
- emitirSeleccion() {
346
- this.dateRangeSelected.emit({
347
- fechaInicio: this.fechaInicio,
348
- fechaFin: this.fechaFin,
349
- rangoTexto: this.rangoFechas()
350
- });
351
- }
352
- emitirMultiCambio() {
353
- this.multiDateRangeChange.emit({
354
- ranges: this.selectedRanges()
355
- });
356
- }
357
- emitirMultiSeleccion() {
358
- this.multiDateRangeSelected.emit({
359
- ranges: this.selectedRanges()
360
- });
361
- }
362
- getDateRangeValue() {
363
- return {
364
- fechaInicio: this.fechaInicio,
365
- fechaFin: this.fechaFin,
366
- rangoTexto: this.rangoFechas()
367
- };
368
- }
369
- // ControlValueAccessor implementation
370
- writeValue(value) {
371
- if (value) {
372
- this.fechaInicio = value.fechaInicio || '';
373
- this.fechaFin = value.fechaFin || '';
374
- if (this.fechaInicio && this.fechaFin) {
375
- this.actualizarRangoFechasTexto();
376
- this.generarCalendarios();
377
- }
378
- }
379
- else {
380
- this.fechaInicio = '';
381
- this.fechaFin = '';
382
- this.rangoFechas.set('');
383
- }
384
- }
385
- registerOnChange(fn) {
386
- this.onChange = fn;
387
- }
388
- registerOnTouched(fn) {
389
- this.onTouched = fn;
390
- }
391
- setDisabledState(isDisabled) {
392
- this.isDisabled.set(isDisabled);
393
- }
394
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DualDatepickerComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
395
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DualDatepickerComponent, isStandalone: true, selector: "ngx-dual-datepicker", inputs: { placeholder: "placeholder", fechaInicio: "fechaInicio", fechaFin: "fechaFin", showPresets: "showPresets", showClearButton: "showClearButton", multiRange: "multiRange", closeOnSelection: "closeOnSelection", closeOnPresetSelection: "closeOnPresetSelection", closeOnClickOutside: "closeOnClickOutside", presets: "presets", inputBackgroundColor: "inputBackgroundColor", inputTextColor: "inputTextColor", inputBorderColor: "inputBorderColor", inputBorderColorHover: "inputBorderColorHover", inputBorderColorFocus: "inputBorderColorFocus", inputPadding: "inputPadding", locale: "locale" }, outputs: { dateRangeChange: "dateRangeChange", dateRangeSelected: "dateRangeSelected", multiDateRangeChange: "multiDateRangeChange", multiDateRangeSelected: "multiDateRangeSelected" }, host: { listeners: { "document:click": "onClickOutside($event)" } }, providers: [
396
- {
397
- provide: NG_VALUE_ACCESSOR,
398
- useExisting: forwardRef(() => DualDatepickerComponent),
399
- multi: true
400
- },
401
- {
402
- provide: DATE_ADAPTER,
403
- useClass: NativeDateAdapter
404
- }
405
- ], usesOnChanges: true, ngImport: i0, template: "<div class=\"datepicker-wrapper\" \n [style.--input-border-hover]=\"inputBorderColorHover\"\n [style.--input-border-focus]=\"inputBorderColorFocus\">\n <input \n type=\"text\" \n class=\"datepicker-input\" \n [value]=\"rangoFechas()\" \n (click)=\"toggleDatePicker()\" \n [placeholder]=\"placeholder\"\n [disabled]=\"isDisabled()\"\n [ngStyle]=\"{\n 'background-color': inputBackgroundColor,\n 'color': inputTextColor,\n 'border-color': inputBorderColor,\n 'padding': inputPadding\n }\"\n readonly>\n\n @if (mostrarDatePicker()) {\n <div class=\"date-picker-dropdown\">\n @if (showPresets) {\n <div class=\"date-picker-presets\">\n @for (preset of presets; track preset.label) {\n <button type=\"button\" (click)=\"seleccionarRangoPredefinido(preset)\">{{ preset.label }}</button>\n }\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"cerrarDatePicker()\" title=\"Close\">\n \u00D7\n </button>\n </div>\n }\n\n @if (!showPresets) {\n <div class=\"date-picker-header-only-close\">\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"cerrarDatePicker()\" title=\"Close\">\n \u00D7\n </button>\n </div>\n }\n\n <!-- Calendars -->\n <div class=\"date-picker-calendars\">\n <!-- Previous month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" (click)=\"cambiarMes(-1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ nombreMesAnterior() }}</span>\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n @for (dayName of diasSemana(); track $index) {\n <span>{{ dayName }}</span>\n }\n </div>\n <div class=\"date-picker-days\">\n @for (diaObj of diasMesAnterior(); track diaObj.fecha || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!diaObj.esMesActual\"\n [class.selected]=\"diaObj.esInicio || diaObj.esFin\"\n [class.in-range]=\"diaObj.enRango && !diaObj.esInicio && !diaObj.esFin\"\n (click)=\"seleccionarDia(diaObj)\"\n [disabled]=\"!diaObj.esMesActual\">\n {{ diaObj.dia }}\n </button>\n }\n </div>\n </div>\n\n <!-- Current month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ nombreMesActual() }}</span>\n <button type=\"button\" (click)=\"cambiarMes(1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n @for (dayName of diasSemana(); track $index) {\n <span>{{ dayName }}</span>\n }\n </div>\n <div class=\"date-picker-days\">\n @for (diaObj of diasMesActual(); track diaObj.fecha || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!diaObj.esMesActual\"\n [class.selected]=\"diaObj.esInicio || diaObj.esFin\"\n [class.in-range]=\"diaObj.enRango && !diaObj.esInicio && !diaObj.esFin\"\n (click)=\"seleccionarDia(diaObj)\"\n [disabled]=\"!diaObj.esMesActual\">\n {{ diaObj.dia }}\n </button>\n }\n </div>\n </div>\n </div>\n\n <!-- Multi-Range List -->\n @if (multiRange && selectedRanges().length > 0) {\n <div class=\"multi-range-list\">\n <div class=\"multi-range-header\">\n <span class=\"multi-range-title\">Selected Ranges ({{ selectedRanges().length }})</span>\n </div>\n <div class=\"multi-range-items\">\n @for (range of selectedRanges(); track $index) {\n <div class=\"multi-range-item\">\n <span class=\"multi-range-text\">{{ range.rangoTexto }}</span>\n <button \n type=\"button\" \n class=\"btn-remove-range\" \n (click)=\"eliminarRango($index)\"\n title=\"Remove this range\">\n <svg width=\"14\" height=\"14\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z\"/>\n </svg>\n </button>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Footer with clear button -->\n @if (showClearButton || multiRange) {\n <div class=\"date-picker-footer\">\n @if (multiRange) {\n <div class=\"multi-range-footer-actions\">\n <button type=\"button\" class=\"btn-clear\" (click)=\"limpiar()\" title=\"Clear all ranges\">\n Clear All\n </button>\n <button type=\"button\" class=\"btn-done\" (click)=\"cerrarDatePicker()\" title=\"Done selecting\">\n Done\n </button>\n </div>\n }\n @if (!multiRange && showClearButton) {\n <button type=\"button\" class=\"btn-clear\" (click)=\"limpiar()\" title=\"Clear selection\">\n Clear\n </button>\n }\n </div>\n }\n </div>\n }\n</div>\n", styles: [".datepicker-wrapper{position:relative;width:100%}.datepicker-wrapper .datepicker-input{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;cursor:pointer}.datepicker-wrapper .datepicker-input:hover{border-color:var(--input-border-hover, #ced4da)}.datepicker-wrapper .datepicker-input:focus{border-color:var(--input-border-focus, #80bdff);box-shadow:0 0 0 .2rem #007bff40;outline:0}.datepicker-wrapper .datepicker-input::placeholder{color:#6c757d;opacity:1}.datepicker-wrapper .datepicker-input:disabled,.datepicker-wrapper .datepicker-input[readonly]{background-color:#e9ecef;opacity:1}.date-picker-dropdown{position:absolute;top:100%;left:0;margin-top:4px;background:#fff;border:1px solid #e1e4e8;border-radius:8px;box-shadow:0 4px 12px #00000014,0 0 1px #00000014;padding:16px;z-index:1060;min-width:680px}@media (max-width: 768px){.date-picker-dropdown{min-width:100%;left:0;right:0}}.date-picker-header-only-close{display:flex;justify-content:flex-end;margin-bottom:12px}.date-picker-header-only-close .btn-close-calendar{background-color:transparent;border:1px solid transparent;color:#6b7280;padding:6px 10px;border-radius:6px;cursor:pointer;transition:all .15s ease;font-size:1.5rem;line-height:1}.date-picker-header-only-close .btn-close-calendar:hover{background-color:#fee;border-color:#fcc;color:#dc2626;transform:translateY(-1px);box-shadow:0 2px 4px #dc26261a}.date-picker-header-only-close .btn-close-calendar:active{transform:translateY(0);box-shadow:none}.date-picker-presets{display:flex;gap:6px;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid #e5e7eb;align-items:center}@media (max-width: 768px){.date-picker-presets{flex-wrap:wrap}}.date-picker-presets button{font-size:.75rem;padding:6px 14px;border:none;background-color:#f9fafb;color:#374151;border-radius:6px;transition:all .15s ease;font-weight:500;cursor:pointer;border:1px solid #e5e7eb}.date-picker-presets button:hover{background-color:#f3f4f6;border-color:#d1d5db;transform:translateY(-1px);box-shadow:0 2px 4px #0000000f}.date-picker-presets button:active{transform:translateY(0);box-shadow:none}.date-picker-presets .btn-close-calendar{margin-left:auto;background-color:transparent;border:1px solid transparent;color:#6b7280;padding:6px 10px;font-size:1.5rem;line-height:1}.date-picker-presets .btn-close-calendar:hover{background-color:#fee;border-color:#fcc;color:#dc2626;transform:translateY(-1px);box-shadow:0 2px 4px #dc26261a}.date-picker-presets .btn-close-calendar:active{transform:translateY(0);box-shadow:none}.date-picker-calendars{display:flex;gap:32px}@media (max-width: 768px){.date-picker-calendars{flex-direction:column;gap:16px}}.date-picker-calendar{flex:1}.date-picker-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;padding:0 4px}.date-picker-header span{font-size:.813rem;font-weight:600;color:#111827}.date-picker-header button{padding:4px;color:#6b7280;text-decoration:none;border-radius:6px;transition:all .15s ease;border:none;background:transparent;cursor:pointer}.date-picker-header button:hover{background-color:#f3f4f6;color:#111827}.date-picker-weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:4px}.date-picker-weekdays span{text-align:center;font-size:.625rem;font-weight:600;color:#6b7280;padding:6px}.date-picker-days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.date-picker-day{aspect-ratio:1;border:none;background:transparent;border-radius:50%;font-size:.75rem;cursor:pointer;transition:all .15s ease;color:#374151;font-weight:400}.date-picker-day:hover:not(:disabled):not(.selected){background-color:#f3f4f6;color:#111827}.date-picker-day.empty{visibility:hidden}.date-picker-day.selected{background-color:#222;color:#fff;font-weight:600}.date-picker-day.in-range{background-color:#f9fafb;border-radius:0}.date-picker-day:disabled{cursor:not-allowed;opacity:.3}.date-picker-footer{padding:12px;border-top:1px solid #e1e4e8;display:flex;justify-content:center;gap:8px}.date-picker-footer .btn-clear{padding:8px 16px;background-color:#f6f8fa;border:1px solid #d0d7de;border-radius:6px;font-size:.875rem;font-weight:500;color:#24292f;cursor:pointer;transition:all .15s ease}.date-picker-footer .btn-clear:hover{background-color:#f3f4f6;border-color:#8c959f;transform:translateY(-1px);box-shadow:0 2px 4px #0000000d}.date-picker-footer .btn-clear:active{transform:translateY(0);box-shadow:none;background-color:#e9ecef}.date-picker-footer .btn-done{padding:8px 16px;background-color:#222;border:1px solid #222;border-radius:6px;font-size:.875rem;font-weight:500;color:#fff;cursor:pointer;transition:all .15s ease}.date-picker-footer .btn-done:hover{background-color:#000;border-color:#000;transform:translateY(-1px);box-shadow:0 2px 4px #00000026}.date-picker-footer .btn-done:active{transform:translateY(0);box-shadow:none}.date-picker-footer .multi-range-footer-actions{display:flex;gap:8px;width:100%;justify-content:space-between}.multi-range-list{border-top:1px solid #e1e4e8;border-bottom:1px solid #e1e4e8;padding:12px;margin-top:12px}.multi-range-list .multi-range-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.multi-range-list .multi-range-header .multi-range-title{font-size:.8125rem;font-weight:600;color:#24292f;text-transform:uppercase;letter-spacing:.025em}.multi-range-list .multi-range-items{display:flex;flex-direction:column;gap:6px;max-height:150px;overflow-y:auto}.multi-range-list .multi-range-items::-webkit-scrollbar{width:6px}.multi-range-list .multi-range-items::-webkit-scrollbar-track{background:#f1f3f4;border-radius:4px}.multi-range-list .multi-range-items::-webkit-scrollbar-thumb{background:#cbd5e0;border-radius:4px}.multi-range-list .multi-range-items::-webkit-scrollbar-thumb:hover{background:#a0aec0}.multi-range-list .multi-range-item{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background-color:#f6f8fa;border:1px solid #d0d7de;border-radius:6px;transition:all .15s ease}.multi-range-list .multi-range-item:hover{background-color:#f3f4f6;border-color:#8c959f}.multi-range-list .multi-range-item .multi-range-text{font-size:.875rem;color:#24292f;font-weight:500}.multi-range-list .multi-range-item .btn-remove-range{padding:4px;background-color:transparent;border:1px solid transparent;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#6b7280;transition:all .15s ease}.multi-range-list .multi-range-item .btn-remove-range:hover{background-color:#fee;border-color:#fcc;color:#dc2626}.multi-range-list .multi-range-item .btn-remove-range:hover svg{transform:scale(1.1)}.multi-range-list .multi-range-item .btn-remove-range:active{transform:scale(.95)}.multi-range-list .multi-range-item .btn-remove-range svg{transition:transform .15s ease}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }] });
406
- }
407
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DualDatepickerComponent, decorators: [{
408
- type: Component,
409
- args: [{ selector: 'ngx-dual-datepicker', standalone: true, imports: [CommonModule, FormsModule, ReactiveFormsModule], providers: [
410
- {
411
- provide: NG_VALUE_ACCESSOR,
412
- useExisting: forwardRef(() => DualDatepickerComponent),
413
- multi: true
414
- },
415
- {
416
- provide: DATE_ADAPTER,
417
- useClass: NativeDateAdapter
418
- }
419
- ], template: "<div class=\"datepicker-wrapper\" \n [style.--input-border-hover]=\"inputBorderColorHover\"\n [style.--input-border-focus]=\"inputBorderColorFocus\">\n <input \n type=\"text\" \n class=\"datepicker-input\" \n [value]=\"rangoFechas()\" \n (click)=\"toggleDatePicker()\" \n [placeholder]=\"placeholder\"\n [disabled]=\"isDisabled()\"\n [ngStyle]=\"{\n 'background-color': inputBackgroundColor,\n 'color': inputTextColor,\n 'border-color': inputBorderColor,\n 'padding': inputPadding\n }\"\n readonly>\n\n @if (mostrarDatePicker()) {\n <div class=\"date-picker-dropdown\">\n @if (showPresets) {\n <div class=\"date-picker-presets\">\n @for (preset of presets; track preset.label) {\n <button type=\"button\" (click)=\"seleccionarRangoPredefinido(preset)\">{{ preset.label }}</button>\n }\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"cerrarDatePicker()\" title=\"Close\">\n \u00D7\n </button>\n </div>\n }\n\n @if (!showPresets) {\n <div class=\"date-picker-header-only-close\">\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"cerrarDatePicker()\" title=\"Close\">\n \u00D7\n </button>\n </div>\n }\n\n <!-- Calendars -->\n <div class=\"date-picker-calendars\">\n <!-- Previous month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" (click)=\"cambiarMes(-1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ nombreMesAnterior() }}</span>\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n @for (dayName of diasSemana(); track $index) {\n <span>{{ dayName }}</span>\n }\n </div>\n <div class=\"date-picker-days\">\n @for (diaObj of diasMesAnterior(); track diaObj.fecha || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!diaObj.esMesActual\"\n [class.selected]=\"diaObj.esInicio || diaObj.esFin\"\n [class.in-range]=\"diaObj.enRango && !diaObj.esInicio && !diaObj.esFin\"\n (click)=\"seleccionarDia(diaObj)\"\n [disabled]=\"!diaObj.esMesActual\">\n {{ diaObj.dia }}\n </button>\n }\n </div>\n </div>\n\n <!-- Current month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ nombreMesActual() }}</span>\n <button type=\"button\" (click)=\"cambiarMes(1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n @for (dayName of diasSemana(); track $index) {\n <span>{{ dayName }}</span>\n }\n </div>\n <div class=\"date-picker-days\">\n @for (diaObj of diasMesActual(); track diaObj.fecha || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!diaObj.esMesActual\"\n [class.selected]=\"diaObj.esInicio || diaObj.esFin\"\n [class.in-range]=\"diaObj.enRango && !diaObj.esInicio && !diaObj.esFin\"\n (click)=\"seleccionarDia(diaObj)\"\n [disabled]=\"!diaObj.esMesActual\">\n {{ diaObj.dia }}\n </button>\n }\n </div>\n </div>\n </div>\n\n <!-- Multi-Range List -->\n @if (multiRange && selectedRanges().length > 0) {\n <div class=\"multi-range-list\">\n <div class=\"multi-range-header\">\n <span class=\"multi-range-title\">Selected Ranges ({{ selectedRanges().length }})</span>\n </div>\n <div class=\"multi-range-items\">\n @for (range of selectedRanges(); track $index) {\n <div class=\"multi-range-item\">\n <span class=\"multi-range-text\">{{ range.rangoTexto }}</span>\n <button \n type=\"button\" \n class=\"btn-remove-range\" \n (click)=\"eliminarRango($index)\"\n title=\"Remove this range\">\n <svg width=\"14\" height=\"14\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z\"/>\n </svg>\n </button>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Footer with clear button -->\n @if (showClearButton || multiRange) {\n <div class=\"date-picker-footer\">\n @if (multiRange) {\n <div class=\"multi-range-footer-actions\">\n <button type=\"button\" class=\"btn-clear\" (click)=\"limpiar()\" title=\"Clear all ranges\">\n Clear All\n </button>\n <button type=\"button\" class=\"btn-done\" (click)=\"cerrarDatePicker()\" title=\"Done selecting\">\n Done\n </button>\n </div>\n }\n @if (!multiRange && showClearButton) {\n <button type=\"button\" class=\"btn-clear\" (click)=\"limpiar()\" title=\"Clear selection\">\n Clear\n </button>\n }\n </div>\n }\n </div>\n }\n</div>\n", styles: [".datepicker-wrapper{position:relative;width:100%}.datepicker-wrapper .datepicker-input{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;cursor:pointer}.datepicker-wrapper .datepicker-input:hover{border-color:var(--input-border-hover, #ced4da)}.datepicker-wrapper .datepicker-input:focus{border-color:var(--input-border-focus, #80bdff);box-shadow:0 0 0 .2rem #007bff40;outline:0}.datepicker-wrapper .datepicker-input::placeholder{color:#6c757d;opacity:1}.datepicker-wrapper .datepicker-input:disabled,.datepicker-wrapper .datepicker-input[readonly]{background-color:#e9ecef;opacity:1}.date-picker-dropdown{position:absolute;top:100%;left:0;margin-top:4px;background:#fff;border:1px solid #e1e4e8;border-radius:8px;box-shadow:0 4px 12px #00000014,0 0 1px #00000014;padding:16px;z-index:1060;min-width:680px}@media (max-width: 768px){.date-picker-dropdown{min-width:100%;left:0;right:0}}.date-picker-header-only-close{display:flex;justify-content:flex-end;margin-bottom:12px}.date-picker-header-only-close .btn-close-calendar{background-color:transparent;border:1px solid transparent;color:#6b7280;padding:6px 10px;border-radius:6px;cursor:pointer;transition:all .15s ease;font-size:1.5rem;line-height:1}.date-picker-header-only-close .btn-close-calendar:hover{background-color:#fee;border-color:#fcc;color:#dc2626;transform:translateY(-1px);box-shadow:0 2px 4px #dc26261a}.date-picker-header-only-close .btn-close-calendar:active{transform:translateY(0);box-shadow:none}.date-picker-presets{display:flex;gap:6px;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid #e5e7eb;align-items:center}@media (max-width: 768px){.date-picker-presets{flex-wrap:wrap}}.date-picker-presets button{font-size:.75rem;padding:6px 14px;border:none;background-color:#f9fafb;color:#374151;border-radius:6px;transition:all .15s ease;font-weight:500;cursor:pointer;border:1px solid #e5e7eb}.date-picker-presets button:hover{background-color:#f3f4f6;border-color:#d1d5db;transform:translateY(-1px);box-shadow:0 2px 4px #0000000f}.date-picker-presets button:active{transform:translateY(0);box-shadow:none}.date-picker-presets .btn-close-calendar{margin-left:auto;background-color:transparent;border:1px solid transparent;color:#6b7280;padding:6px 10px;font-size:1.5rem;line-height:1}.date-picker-presets .btn-close-calendar:hover{background-color:#fee;border-color:#fcc;color:#dc2626;transform:translateY(-1px);box-shadow:0 2px 4px #dc26261a}.date-picker-presets .btn-close-calendar:active{transform:translateY(0);box-shadow:none}.date-picker-calendars{display:flex;gap:32px}@media (max-width: 768px){.date-picker-calendars{flex-direction:column;gap:16px}}.date-picker-calendar{flex:1}.date-picker-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;padding:0 4px}.date-picker-header span{font-size:.813rem;font-weight:600;color:#111827}.date-picker-header button{padding:4px;color:#6b7280;text-decoration:none;border-radius:6px;transition:all .15s ease;border:none;background:transparent;cursor:pointer}.date-picker-header button:hover{background-color:#f3f4f6;color:#111827}.date-picker-weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:4px}.date-picker-weekdays span{text-align:center;font-size:.625rem;font-weight:600;color:#6b7280;padding:6px}.date-picker-days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.date-picker-day{aspect-ratio:1;border:none;background:transparent;border-radius:50%;font-size:.75rem;cursor:pointer;transition:all .15s ease;color:#374151;font-weight:400}.date-picker-day:hover:not(:disabled):not(.selected){background-color:#f3f4f6;color:#111827}.date-picker-day.empty{visibility:hidden}.date-picker-day.selected{background-color:#222;color:#fff;font-weight:600}.date-picker-day.in-range{background-color:#f9fafb;border-radius:0}.date-picker-day:disabled{cursor:not-allowed;opacity:.3}.date-picker-footer{padding:12px;border-top:1px solid #e1e4e8;display:flex;justify-content:center;gap:8px}.date-picker-footer .btn-clear{padding:8px 16px;background-color:#f6f8fa;border:1px solid #d0d7de;border-radius:6px;font-size:.875rem;font-weight:500;color:#24292f;cursor:pointer;transition:all .15s ease}.date-picker-footer .btn-clear:hover{background-color:#f3f4f6;border-color:#8c959f;transform:translateY(-1px);box-shadow:0 2px 4px #0000000d}.date-picker-footer .btn-clear:active{transform:translateY(0);box-shadow:none;background-color:#e9ecef}.date-picker-footer .btn-done{padding:8px 16px;background-color:#222;border:1px solid #222;border-radius:6px;font-size:.875rem;font-weight:500;color:#fff;cursor:pointer;transition:all .15s ease}.date-picker-footer .btn-done:hover{background-color:#000;border-color:#000;transform:translateY(-1px);box-shadow:0 2px 4px #00000026}.date-picker-footer .btn-done:active{transform:translateY(0);box-shadow:none}.date-picker-footer .multi-range-footer-actions{display:flex;gap:8px;width:100%;justify-content:space-between}.multi-range-list{border-top:1px solid #e1e4e8;border-bottom:1px solid #e1e4e8;padding:12px;margin-top:12px}.multi-range-list .multi-range-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.multi-range-list .multi-range-header .multi-range-title{font-size:.8125rem;font-weight:600;color:#24292f;text-transform:uppercase;letter-spacing:.025em}.multi-range-list .multi-range-items{display:flex;flex-direction:column;gap:6px;max-height:150px;overflow-y:auto}.multi-range-list .multi-range-items::-webkit-scrollbar{width:6px}.multi-range-list .multi-range-items::-webkit-scrollbar-track{background:#f1f3f4;border-radius:4px}.multi-range-list .multi-range-items::-webkit-scrollbar-thumb{background:#cbd5e0;border-radius:4px}.multi-range-list .multi-range-items::-webkit-scrollbar-thumb:hover{background:#a0aec0}.multi-range-list .multi-range-item{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background-color:#f6f8fa;border:1px solid #d0d7de;border-radius:6px;transition:all .15s ease}.multi-range-list .multi-range-item:hover{background-color:#f3f4f6;border-color:#8c959f}.multi-range-list .multi-range-item .multi-range-text{font-size:.875rem;color:#24292f;font-weight:500}.multi-range-list .multi-range-item .btn-remove-range{padding:4px;background-color:transparent;border:1px solid transparent;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#6b7280;transition:all .15s ease}.multi-range-list .multi-range-item .btn-remove-range:hover{background-color:#fee;border-color:#fcc;color:#dc2626}.multi-range-list .multi-range-item .btn-remove-range:hover svg{transform:scale(1.1)}.multi-range-list .multi-range-item .btn-remove-range:active{transform:scale(.95)}.multi-range-list .multi-range-item .btn-remove-range svg{transition:transform .15s ease}\n"] }]
420
- }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { placeholder: [{
421
- type: Input
422
- }], fechaInicio: [{
423
- type: Input
424
- }], fechaFin: [{
425
- type: Input
426
- }], showPresets: [{
427
- type: Input
428
- }], showClearButton: [{
429
- type: Input
430
- }], multiRange: [{
431
- type: Input
432
- }], closeOnSelection: [{
433
- type: Input
434
- }], closeOnPresetSelection: [{
435
- type: Input
436
- }], closeOnClickOutside: [{
437
- type: Input
438
- }], presets: [{
439
- type: Input
440
- }], inputBackgroundColor: [{
441
- type: Input
442
- }], inputTextColor: [{
443
- type: Input
444
- }], inputBorderColor: [{
445
- type: Input
446
- }], inputBorderColorHover: [{
447
- type: Input
448
- }], inputBorderColorFocus: [{
449
- type: Input
450
- }], inputPadding: [{
451
- type: Input
452
- }], locale: [{
453
- type: Input
454
- }], dateRangeChange: [{
455
- type: Output
456
- }], dateRangeSelected: [{
457
- type: Output
458
- }], multiDateRangeChange: [{
459
- type: Output
460
- }], multiDateRangeSelected: [{
461
- type: Output
462
- }], onClickOutside: [{
463
- type: HostListener,
464
- args: ['document:click', ['$event']]
465
- }] } });
466
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVhbC1kYXRlcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kdWFsLWRhdGVwaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vc3JjL2R1YWwtZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFvQyxZQUFZLEVBQWMsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqTCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRyxPQUFPLEVBQWUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7OztBQWtEMUQsTUFBTSxPQUFPLHVCQUF1QjtJQTJEZDtJQTFEWCxXQUFXLEdBQVcsbUJBQW1CLENBQUM7SUFDMUMsV0FBVyxHQUFXLEVBQUUsQ0FBQztJQUN6QixRQUFRLEdBQVcsRUFBRSxDQUFDO0lBQ3RCLFdBQVcsR0FBWSxJQUFJLENBQUM7SUFDNUIsZUFBZSxHQUFZLEtBQUssQ0FBQztJQUNqQyxVQUFVLEdBQVksS0FBSyxDQUFDO0lBQzVCLGdCQUFnQixHQUFZLElBQUksQ0FBQztJQUNqQyxzQkFBc0IsR0FBWSxJQUFJLENBQUM7SUFDdkMsbUJBQW1CLEdBQVksSUFBSSxDQUFDO0lBQ3BDLE9BQU8sR0FBbUI7UUFDakMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7UUFDcEMsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxH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QkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csc0JBQXNCO3NCQUEvQixNQUFNO2dCQTRDUCxjQUFjO3NCQURiLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiwgZm9yd2FyZFJlZiwgc2lnbmFsLCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIsIERBVEVfQURBUFRFUiB9IGZyb20gJy4vZGF0ZS1hZGFwdGVyJztcbmltcG9ydCB7IE5hdGl2ZURhdGVBZGFwdGVyIH0gZnJvbSAnLi9uYXRpdmUtZGF0ZS1hZGFwdGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBEYXRlUmFuZ2Uge1xuICBmZWNoYUluaWNpbzogc3RyaW5nO1xuICBmZWNoYUZpbjogc3RyaW5nO1xuICByYW5nb1RleHRvOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTXVsdGlEYXRlUmFuZ2Uge1xuICByYW5nZXM6IERhdGVSYW5nZVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByZXNldFJhbmdlIHtcbiAgc3RhcnQ6IHN0cmluZztcbiAgZW5kOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJlc2V0Q29uZmlnIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBnZXRWYWx1ZSgpIGluc3RlYWQgZm9yIG1vcmUgZmxleGliaWxpdHkgKi9cbiAgZGF5c0Fnbz86IG51bWJlcjtcbiAgZ2V0VmFsdWU/OiAoKSA9PiBQcmVzZXRSYW5nZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb2NhbGVDb25maWcge1xuICBtb250aE5hbWVzPzogc3RyaW5nW107XG4gIG1vbnRoTmFtZXNTaG9ydD86IHN0cmluZ1tdO1xuICBkYXlOYW1lcz86IHN0cmluZ1tdO1xuICBkYXlOYW1lc1Nob3J0Pzogc3RyaW5nW107XG4gIGZpcnN0RGF5T2ZXZWVrPzogbnVtYmVyOyAvLyAwID0gU3VuZGF5LCAxID0gTW9uZGF5LCBldGMuXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1kdWFsLWRhdGVwaWNrZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9kdWFsLWRhdGVwaWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZHVhbC1kYXRlcGlja2VyLmNvbXBvbmVudC5zY3NzJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEdWFsRGF0ZXBpY2tlckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogREFURV9BREFQVEVSLFxuICAgICAgdXNlQ2xhc3M6IE5hdGl2ZURhdGVBZGFwdGVyXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIER1YWxEYXRlcGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICdTZWxlY3QgZGF0ZSByYW5nZSc7XG4gIEBJbnB1dCgpIGZlY2hhSW5pY2lvOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZmVjaGFGaW46IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBzaG93UHJlc2V0czogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dDbGVhckJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBtdWx0aVJhbmdlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNsb3NlT25TZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBjbG9zZU9uUHJlc2V0U2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgY2xvc2VPbkNsaWNrT3V0c2lkZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHByZXNldHM6IFByZXNldENvbmZpZ1tdID0gW1xuICAgIHsgbGFiZWw6ICdMYXN0IG1vbnRoJywgZGF5c0FnbzogMzAgfSxcbiAgICB7IGxhYmVsOiAnTGFzdCA2IG1vbnRocycsIGRheXNBZ286IDE4MCB9LFxuICAgIHsgbGFiZWw6ICdMYXN0IHllYXInLCBkYXlzQWdvOiAzNjUgfVxuICBdO1xuICBASW5wdXQoKSBpbnB1dEJhY2tncm91bmRDb2xvcjogc3RyaW5nID0gJyNmZmYnO1xuICBASW5wdXQoKSBpbnB1dFRleHRDb2xvcjogc3RyaW5nID0gJyM0OTUwNTcnO1xuICBASW5wdXQoKSBpbnB1dEJvcmRlckNvbG9yOiBzdHJpbmcgPSAnI2NlZDRkYSc7XG4gIEBJbnB1dCgpIGlucHV0Qm9yZGVyQ29sb3JIb3Zlcjogc3RyaW5nID0gJyNjZWQ0ZGEnO1xuICBASW5wdXQoKSBpbnB1dEJvcmRlckNvbG9yRm9jdXM6IHN0cmluZyA9ICcjODBiZGZmJztcbiAgQElucHV0KCkgaW5wdXRQYWRkaW5nOiBzdHJpbmcgPSAnMC4zNzVyZW0gMC43NXJlbSc7XG4gIEBJbnB1dCgpIGxvY2FsZTogTG9jYWxlQ29uZmlnID0ge307XG5cbiAgQE91dHB1dCgpIGRhdGVSYW5nZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZVJhbmdlPigpO1xuICBAT3V0cHV0KCkgZGF0ZVJhbmdlU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGVSYW5nZT4oKTtcbiAgQE91dHB1dCgpIG11bHRpRGF0ZVJhbmdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxNdWx0aURhdGVSYW5nZT4oKTtcbiAgQE91dHB1dCgpIG11bHRpRGF0ZVJhbmdlU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE11bHRpRGF0ZVJhbmdlPigpO1xuXG4gIC8vIERhdGUgYWRhcHRlciBpbmplY3Rpb25cbiAgcHJpdmF0ZSBkYXRlQWRhcHRlciA9IGluamVjdDxEYXRlQWRhcHRlcj4oREFURV9BREFQVEVSKTtcblxuICAvLyBTaWduYWxzIGZvciByZWFjdGl2ZSBzdGF0ZVxuICBtb3N0cmFyRGF0ZVBpY2tlciA9IHNpZ25hbChmYWxzZSk7XG4gIHJhbmdvRmVjaGFzID0gc2lnbmFsKCcnKTtcbiAgZmVjaGFTZWxlY2Npb25hbmRvSW5pY2lvID0gc2lnbmFsKHRydWUpO1xuICBtZXNBY3R1YWwgPSBzaWduYWwodGhpcy5kYXRlQWRhcHRlci50b2RheSgpKTtcbiAgbWVzQW50ZXJpb3IgPSBzaWduYWwodGhpcy5kYXRlQWRhcHRlci50b2RheSgpKTtcbiAgZGlhc01lc0FjdHVhbCA9IHNpZ25hbDxhbnlbXT4oW10pO1xuICBkaWFzTWVzQW50ZXJpb3IgPSBzaWduYWw8YW55W10+KFtdKTtcbiAgaXNEaXNhYmxlZCA9IHNpZ25hbChmYWxzZSk7XG4gIFxuICAvLyBNdWx0aS1yYW5nZSBzdXBwb3J0XG4gIHNlbGVjdGVkUmFuZ2VzID0gc2lnbmFsPERhdGVSYW5nZVtdPihbXSk7XG4gIGN1cnJlbnRSYW5nZUluZGV4ID0gc2lnbmFsPG51bWJlcj4oLTEpO1xuXG4gIC8vIENvbXB1dGVkIHZhbHVlc1xuICBub21icmVNZXNBY3R1YWwgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmdldE5vbWJyZU1lcyh0aGlzLm1lc0FjdHVhbCgpKSk7XG4gIG5vbWJyZU1lc0FudGVyaW9yID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5nZXROb21icmVNZXModGhpcy5tZXNBbnRlcmlvcigpKSk7XG4gIGRpYXNTZW1hbmEgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmdldERheU5hbWVzKCkpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdE1vbnRoTmFtZXMgPSBbJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0TW9udGhOYW1lc1Nob3J0ID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHREYXlOYW1lcyA9IFsnU3VuZGF5JywgJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0RGF5TmFtZXNTaG9ydCA9IFsnUycsICdNJywgJ1QnLCAnVycsICdUJywgJ0YnLCAnUyddO1xuXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGNhbGxiYWNrc1xuICBwcml2YXRlIG9uQ2hhbmdlOiAodmFsdWU6IERhdGVSYW5nZSB8IG51bGwpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHtcbiAgICAvLyBFZmZlY3QgdG8gZW1pdCBjaGFuZ2VzIHdoZW4gZGF0ZXMgY2hhbmdlXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHJhbmdvID0gdGhpcy5yYW5nb0ZlY2hhcygpO1xuICAgICAgaWYgKHRoaXMuZmVjaGFJbmljaW8gfHwgdGhpcy5mZWNoYUZpbikge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuZ2V0RGF0ZVJhbmdlVmFsdWUoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uQ2xpY2tPdXRzaWRlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9zdHJhckRhdGVQaWNrZXIoKSAmJiB0aGlzLmNsb3NlT25DbGlja091dHNpZGUpIHtcbiAgICAgIGNvbnN0IGNsaWNrZWRJbnNpZGUgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpO1xuICAgICAgaWYgKCFjbGlja2VkSW5zaWRlKSB7XG4gICAgICAgIHRoaXMuY2VycmFyRGF0ZVBpY2tlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZlY2hhSW5pY2lvICYmIHRoaXMuZmVjaGFGaW4pIHtcbiAgICAgIHRoaXMuYWN0dWFsaXphclJhbmdvRmVjaGFzVGV4dG8oKTtcbiAgICAgIHRoaXMuZ2VuZXJhckNhbGVuZGFyaW9zKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydmZWNoYUluaWNpbyddIHx8IGNoYW5nZXNbJ2ZlY2hhRmluJ10pIHtcbiAgICAgIGlmICh0aGlzLmZlY2hhSW5pY2lvICYmIHRoaXMuZmVjaGFGaW4pIHtcbiAgICAgICAgdGhpcy5hY3R1YWxpemFyUmFuZ29GZWNoYXNUZXh0bygpO1xuICAgICAgICB0aGlzLmdlbmVyYXJDYWxlbmRhcmlvcygpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5mZWNoYUluaWNpbyAmJiAhdGhpcy5mZWNoYUZpbikge1xuICAgICAgICB0aGlzLnJhbmdvRmVjaGFzLnNldCgnJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9ybWF0ZWFyRmVjaGEoZmVjaGE6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IHllYXIgPSB0aGlzLmRhdGVBZGFwdGVyLmdldFllYXIoZmVjaGEpO1xuICAgIGNvbnN0IG1vbnRoID0gU3RyaW5nKHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZmVjaGEpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCBkYXkgPSBTdHJpbmcodGhpcy5kYXRlQWRhcHRlci5nZXREYXRlKGZlY2hhKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YDtcbiAgfVxuXG4gIGZvcm1hdGVhckZlY2hhRGlzcGxheShmZWNoYVN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWZlY2hhU3RyKSByZXR1cm4gJyc7XG4gICAgY29uc3QgZmVjaGEgPSB0aGlzLmRhdGVBZGFwdGVyLnBhcnNlKGZlY2hhU3RyKTtcbiAgICBpZiAoIWZlY2hhKSByZXR1cm4gJyc7XG4gICAgY29uc3QgbW9udGhOYW1lcyA9IHRoaXMubG9jYWxlLm1vbnRoTmFtZXNTaG9ydCB8fCB0aGlzLmRlZmF1bHRNb250aE5hbWVzU2hvcnQ7XG4gICAgcmV0dXJuIGAke3RoaXMuZGF0ZUFkYXB0ZXIuZ2V0RGF0ZShmZWNoYSl9ICR7bW9udGhOYW1lc1t0aGlzLmRhdGVBZGFwdGVyLmdldE1vbnRoKGZlY2hhKV19YDtcbiAgfVxuXG4gIGFjdHVhbGl6YXJSYW5nb0ZlY2hhc1RleHRvKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZlY2hhSW5pY2lvICYmIHRoaXMuZmVjaGFGaW4pIHtcbiAgICAgIGNvbnN0IGluaWNpbyA9IHRoaXMuZm9ybWF0ZWFyRmVjaGFEaXNwbGF5KHRoaXMuZmVjaGFJbmljaW8pO1xuICAgICAgY29uc3QgZmluID0gdGhpcy5mb3JtYXRlYXJGZWNoYURpc3BsYXkodGhpcy5mZWNoYUZpbik7XG4gICAgICB0aGlzLnJhbmdvRmVjaGFzLnNldChgJHtpbmljaW99IC0gJHtmaW59YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmFuZ29GZWNoYXMuc2V0KCcnKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVEYXRlUGlja2VyKCk6IHZvaWQge1xuICAgIHRoaXMubW9zdHJhckRhdGVQaWNrZXIudXBkYXRlKHZhbHVlID0+ICF2YWx1ZSk7XG4gICAgaWYgKHRoaXMubW9zdHJhckRhdGVQaWNrZXIoKSkge1xuICAgICAgdGhpcy5mZWNoYVNlbGVjY2lvbmFuZG9JbmljaW8uc2V0KHRydWUpO1xuICAgICAgY29uc3QgbWVzQWN0dWFsVmFsdWUgPSB0aGlzLm1lc0FjdHVhbCgpO1xuICAgICAgY29uc3QgYcOxbyA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0WWVhcihtZXNBY3R1YWxWYWx1ZSk7XG4gICAgICBjb25zdCBtZXMgPSB0aGlzLmRhdGVBZGFwdGVyLmdldE1vbnRoKG1lc0FjdHVhbFZhbHVlKTtcbiAgICAgIGNvbnN0IG1lc0FudGVyaW9yRGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShhw7FvLCBtZXMgLSAxLCAxKTtcbiAgICAgIHRoaXMubWVzQW50ZXJpb3Iuc2V0KG1lc0FudGVyaW9yRGF0ZSk7XG4gICAgICB0aGlzLmdlbmVyYXJDYWxlbmRhcmlvcygpO1xuICAgIH1cbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgY2VycmFyRGF0ZVBpY2tlcigpOiB2b2lkIHtcbiAgICB0aGlzLm1vc3RyYXJEYXRlUGlja2VyLnNldChmYWxzZSk7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgfVxuXG4gIGdlbmVyYXJDYWxlbmRhcmlvcygpOiB2b2lkIHtcbiAgICB0aGlzLmRpYXNNZXNBbnRlcmlvci5zZXQodGhpcy5nZW5lcmFyQ2FsZW5kYXJpb01lcyh0aGlzLm1lc0FudGVyaW9yKCkpKTtcbiAgICB0aGlzLmRpYXNNZXNBY3R1YWwuc2V0KHRoaXMuZ2VuZXJhckNhbGVuZGFyaW9NZXModGhpcy5tZXNBY3R1YWwoKSkpO1xuICB9XG5cbiAgZ2VuZXJhckNhbGVuZGFyaW9NZXMoZmVjaGE6IERhdGUpOiBhbnlbXSB7XG4gICAgY29uc3QgYcOxbyA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0WWVhcihmZWNoYSk7XG4gICAgY29uc3QgbWVzID0gdGhpcy5kYXRlQWRhcHRlci5nZXRNb250aChmZWNoYSk7XG4gICAgY29uc3QgcHJpbWVyRGlhID0gdGhpcy5kYXRlQWRhcHRlci5jcmVhdGVEYXRlKGHDsW8sIG1lcywgMSk7XG4gICAgY29uc3QgdWx0aW1vRGlhID0gdGhpcy5kYXRlQWRhcHRlci5jcmVhdGVEYXRlKGHDsW8sIG1lcyArIDEsIDApO1xuICAgIGNvbnN0IGRpYXNFbk1lcyA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0RGF0ZSh1bHRpbW9EaWEpO1xuICAgIGNvbnN0IHByaW1lckRpYVNlbWFuYSA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0RGF5KHByaW1lckRpYSk7XG5cbiAgICBjb25zdCBkaWFzTWVzID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByaW1lckRpYVNlbWFuYTsgaSsrKSB7XG4gICAgICBkaWFzTWVzLnB1c2goeyBkaWE6IG51bGwsIGVzTWVzQWN0dWFsOiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBkaWEgPSAxOyBkaWEgPD0gZGlhc0VuTWVzOyBkaWErKykge1xuICAgICAgY29uc3QgZmVjaGFEaWEgPSB0aGlzLmRhdGVBZGFwdGVyLmNyZWF0ZURhdGUoYcOxbywgbWVzLCBkaWEpO1xuICAgICAgY29uc3QgZmVjaGFTdHIgPSB0aGlzLmZvcm1hdGVhckZlY2hhKGZlY2hhRGlhKTtcbiAgICAgIGRpYXNNZXMucHVzaCh7XG4gICAgICAgIGRpYTogZGlhLFxuICAgICAgICBmZWNoYTogZmVjaGFTdHIsXG4gICAgICAgIGVzTWVzQWN0dWFsOiB0cnVlLFxuICAgICAgICBlc0luaWNpbzogdGhpcy5mZWNoYUluaWNpbyA9PT0gZmVjaGFTdHIsXG4gICAgICAgIGVzRmluOiB0aGlzLmZlY2hhRmluID09PSBmZWNoYVN0cixcbiAgICAgICAgZW5SYW5nbzogdGhpcy5lc3RhRW5SYW5nbyhmZWNoYVN0cilcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkaWFzTWVzO1xuICB9XG5cbiAgZXN0YUVuUmFuZ28oZmVjaGFTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm11bHRpUmFuZ2UpIHtcbiAgICAgIC8vIENoZWNrIGlmIGRhdGUgaXMgaW4gYW55IG9mIHRoZSBzZWxlY3RlZCByYW5nZXNcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkUmFuZ2VzKCkuc29tZShyYW5nZSA9PiB7XG4gICAgICAgIHJldHVybiBmZWNoYVN0ciA+PSByYW5nZS5mZWNoYUluaWNpbyAmJiBmZWNoYVN0ciA8PSByYW5nZS5mZWNoYUZpbjtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXRoaXMuZmVjaGFJbmljaW8gfHwgIXRoaXMuZmVjaGFGaW4pIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBmZWNoYVN0ciA+PSB0aGlzLmZlY2hhSW5pY2lvICYmIGZlY2hhU3RyIDw9IHRoaXMuZmVjaGFGaW47XG4gICAgfVxuICB9XG5cbiAgc2VsZWNjaW9uYXJEaWEoZGlhT2JqOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIWRpYU9iai5lc01lc0FjdHVhbCB8fCB0aGlzLmlzRGlzYWJsZWQoKSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMubXVsdGlSYW5nZSkge1xuICAgICAgLy8gTXVsdGktcmFuZ2UgbW9kZTogYWRkIHJhbmdlcyB0byBhcnJheVxuICAgICAgaWYgKHRoaXMuZmVjaGFTZWxlY2Npb25hbmRvSW5pY2lvKCkpIHtcbiAgICAgICAgdGhpcy5mZWNoYUluaWNpbyA9IGRpYU9iai5mZWNoYTtcbiAgICAgICAgdGhpcy5mZWNoYUZpbiA9ICcnO1xuICAgICAgICB0aGlzLnJhbmdvRmVjaGFzLnNldCgnJyk7XG4gICAgICAgIHRoaXMuZmVjaGFTZWxlY2Npb25hbmRvSW5pY2lvLnNldChmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZGlhT2JqLmZlY2hhIDwgdGhpcy5mZWNoYUluaWNpbykge1xuICAgICAgICAgIHRoaXMuZmVjaGFGaW4gPSB0aGlzLmZlY2hhSW5pY2lvO1xuICAgICAgICAgIHRoaXMuZmVjaGFJbmljaW8gPSBkaWFPYmouZmVjaGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mZWNoYUZpbiA9IGRpYU9iai5mZWNoYTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gQWRkIHRoZSBuZXcgcmFuZ2UgdG8gdGhlIGFycmF5XG4gICAgICAgIGNvbnN0IG5ld1JhbmdlOiBEYXRlUmFuZ2UgPSB7XG4gICAgICAgICAgZmVjaGFJbmljaW86IHRoaXMuZmVjaGFJbmljaW8sXG4gICAgICAgICAgZmVjaGFGaW46IHRoaXMuZmVjaGFGaW4sXG4gICAgICAgICAgcmFuZ29UZXh0bzogdGhpcy5mb3JtYXRlYXJGZWNoYURpc3BsYXkodGhpcy5mZWNoYUluaWNpbykgKyAnIOKAkyAnICsgdGhpcy5mb3JtYXRlYXJGZWNoYURpc3BsYXkodGhpcy5mZWNoYUZpbilcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSYW5nZXMgPSBbLi4udGhpcy5zZWxlY3RlZFJhbmdlcygpXTtcbiAgICAgICAgY3VycmVudFJhbmdlcy5wdXNoKG5ld1JhbmdlKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlcy5zZXQoY3VycmVudFJhbmdlcyk7XG4gICAgICAgIFxuICAgICAgICAvLyBSZXNldCBmb3IgbmV4dCByYW5nZSBzZWxlY3Rpb25cbiAgICAgICAgdGhpcy5mZWNoYUluaWNpbyA9ICcnO1xuICAgICAgICB0aGlzLmZlY2hhRmluID0gJyc7XG4gICAgICAgIHRoaXMuZmVjaGFTZWxlY2Npb25hbmRvSW5pY2lvLnNldCh0cnVlKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBkaXNwbGF5IHRleHRcbiAgICAgICAgdGhpcy5hY3R1YWxpemFyTXVsdGlSYW5nb1RleHRvKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBEb24ndCBjbG9zZSBpZiBtdWx0aVJhbmdlLCBhbGxvdyBhZGRpbmcgbW9yZSByYW5nZXNcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VPblNlbGVjdGlvbiAmJiAhdGhpcy5tdWx0aVJhbmdlKSB7XG4gICAgICAgICAgdGhpcy5tb3N0cmFyRGF0ZVBpY2tlci5zZXQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0aGlzLmVtaXRpck11bHRpQ2FtYmlvKCk7XG4gICAgICAgIHRoaXMuZW1pdGlyTXVsdGlTZWxlY2Npb24oKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ2VuZXJhckNhbGVuZGFyaW9zKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNpbmdsZSByYW5nZSBtb2RlIChvcmlnaW5hbCBiZWhhdmlvcilcbiAgICAgIGlmICh0aGlzLmZlY2hhU2VsZWNjaW9uYW5kb0luaWNpbygpKSB7XG4gICAgICAgIHRoaXMuZmVjaGFJbmljaW8gPSBkaWFPYmouZmVjaGE7XG4gICAgICAgIHRoaXMuZmVjaGFGaW4gPSAnJztcbiAgICAgICAgdGhpcy5yYW5nb0ZlY2hhcy5zZXQoJycpO1xuICAgICAgICB0aGlzLmZlY2hhU2VsZWNjaW9uYW5kb0luaWNpby5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLmVtaXRpckNhbWJpbygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGRpYU9iai5mZWNoYSA8IHRoaXMuZmVjaGFJbmljaW8pIHtcbiAgICAgICAgICB0aGlzLmZlY2hhRmluID0gdGhpcy5mZWNoYUluaWNpbztcbiAgICAgICAgICB0aGlzLmZlY2hhSW5pY2lvID0gZGlhT2JqLmZlY2hhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZmVjaGFGaW4gPSBkaWFPYmouZmVjaGE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3R1YWxpemFyUmFuZ29GZWNoYXNUZXh0bygpO1xuICAgICAgICBpZiAodGhpcy5jbG9zZU9uU2VsZWN0aW9uKSB7XG4gICAgICAgICAgdGhpcy5tb3N0cmFyRGF0ZVBpY2tlci5zZXQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmVjaGFTZWxlY2Npb25hbmRvSW5pY2lvLnNldCh0cnVlKTtcbiAgICAgICAgdGhpcy5lbWl0aXJDYW1iaW8oKTtcbiAgICAgICAgdGhpcy5lbWl0aXJTZWxlY2Npb24oKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ2VuZXJhckNhbGVuZGFyaW9zKCk7XG4gICAgfVxuICB9XG5cbiAgY2FtYmlhck1lcyhkaXJlY2Npb246IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IG1lc0FjdHVhbFZhbHVlID0gdGhpcy5tZXNBY3R1YWwoKTtcbiAgICBjb25zdCBhw7FvID0gdGhpcy5kYXRlQWRhcHRlci5nZXRZZWFyKG1lc0FjdHVhbFZhbHVlKTtcbiAgICBjb25zdCBtZXMgPSB0aGlzLmRhdGVBZGFwdGVyLmdldE1vbnRoKG1lc0FjdHVhbFZhbHVlKTtcbiAgICBjb25zdCBudWV2b01lc0FjdHVhbCA9IHRoaXMuZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShhw7FvLCBtZXMgKyBkaXJlY2Npb24sIDEpO1xuICAgIHRoaXMubWVzQWN0dWFsLnNldChudWV2b01lc0FjdHVhbCk7XG4gICAgXG4gICAgY29uc3QgYcOxb051ZXZvID0gdGhpcy5kYXRlQWRhcHRlci5nZXRZZWFyKG51ZXZvTWVzQWN0dWFsKTtcbiAgICBjb25zdCBtZXNOdWV2byA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0TW9udGgobnVldm9NZXNBY3R1YWwpO1xuICAgIGNvbnN0IG1lc0FudGVyaW9yTnVldm8gPSB0aGlzLmRhdGVBZGFwdGVyLmNyZWF0ZURhdGUoYcOxb051ZXZvLCBtZXNOdWV2byAtIDEsIDEpO1xuICAgIHRoaXMubWVzQW50ZXJpb3Iuc2V0KG1lc0FudGVyaW9yTnVldm8pO1xuICAgIHRoaXMuZ2VuZXJhckNhbGVuZGFyaW9zKCk7XG4gIH1cblxuICBnZXROb21icmVNZXMoZmVjaGE6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1vbnRoTmFtZXMgPSB0aGlzLmxvY2FsZS5tb250aE5hbWVzIHx8IHRoaXMuZGVmYXVsdE1vbnRoTmFtZXM7XG4gICAgcmV0dXJuIGAke21vbnRoTmFtZXNbdGhpcy5kYXRlQWRhcHRlci5nZXRNb250aChmZWNoYSldfSAke3RoaXMuZGF0ZUFkYXB0ZXIuZ2V0WWVhcihmZWNoYSl9YDtcbiAgfVxuXG4gIGdldERheU5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGUuZGF5TmFtZXNTaG9ydCB8fCB0aGlzLmRlZmF1bHREYXlOYW1lc1Nob3J0O1xuICB9XG5cbiAgc2VsZWNjaW9uYXJSYW5nb1ByZWRlZmluaWRvKHByZXNldDogUHJlc2V0Q29uZmlnKTogdm9pZCB7XG4gICAgbGV0IHN0YXJ0OiBzdHJpbmc7XG4gICAgbGV0IGVuZDogc3RyaW5nO1xuXG4gICAgLy8gTmV3IGZsZXhpYmxlIHBhdHRlcm4gd2l0aCBnZXRWYWx1ZSgpXG4gICAgaWYgKHByZXNldC5nZXRWYWx1ZSkge1xuICAgICAgY29uc3QgcmFuZ2UgPSBwcmVzZXQuZ2V0VmFsdWUoKTtcbiAgICAgIHN0YXJ0ID0gcmFuZ2Uuc3RhcnQ7XG4gICAgICBlbmQgPSByYW5nZS5lbmQ7XG4gICAgfVxuICAgIC8vIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBkYXlzQWdvIHBhdHRlcm5cbiAgICBlbHNlIGlmIChwcmVzZXQuZGF5c0FnbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBob3kgPSB0aGlzLmRhdGVBZGFwdGVyLnRvZGF5KCk7XG4gICAgICBjb25zdCBmZWNoYUluaWNpbyA9IHRoaXMuZGF0ZUFkYXB0ZXIuYWRkRGF5cyhob3ksIC1wcmVzZXQuZGF5c0Fnbyk7XG4gICAgICBzdGFydCA9IHRoaXMuZm9ybWF0ZWFyRmVjaGEoZmVjaGFJbmljaW8pO1xuICAgICAgZW5kID0gdGhpcy5mb3JtYXRlYXJGZWNoYShob3kpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1ByZXNldENvbmZpZyBtdXN0IGhhdmUgZWl0aGVyIGdldFZhbHVlKCkgb3IgZGF5c0FnbycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmVjaGFJbmljaW8gPSBzdGFydDtcbiAgICB0aGlzLmZlY2hhRmluID0gZW5kO1xuICAgIHRoaXMuYWN0dWFsaXphclJhbmdvRmVjaGFzVGV4dG8oKTtcbiAgICB0aGlzLmdlbmVyYXJDYWxlbmRhcmlvcygpO1xuICAgIGlmICh0aGlzLmNsb3NlT25QcmVzZXRTZWxlY3Rpb24pIHtcbiAgICAgIHRoaXMubW9zdHJhckRhdGVQaWNrZXIuc2V0KGZhbHNlKTtcbiAgICB9XG4gICAgdGhpcy5lbWl0aXJTZWxlY2Npb24oKTtcbiAgfVxuXG4gIGxpbXBpYXIoKTogdm9pZCB7XG4gICAgdGhpcy5mZWNoYUluaWNpbyA9ICcnO1xuICAgIHRoaXMuZmVjaGFGaW4gPSAnJztcbiAgICB0aGlzLnJhbmdvRmVjaGFzLnNldCgnJyk7XG4gICAgdGhpcy5tb3N0cmFyRGF0ZVBpY2tlci5zZXQoZmFsc2UpO1xuICAgIHRoaXMuZmVjaGFTZWxlY2Npb25hbmRvSW5pY2lvLnNldCh0cnVlKTtcbiAgICBcbiAgICBpZiAodGhpcy5tdWx0aVJhbmdlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUmFuZ2VzLnNldChbXSk7XG4gICAgICB0aGlzLmN1cnJlbnRSYW5nZUluZGV4LnNldCgtMSk7XG4gICAgICB0aGlzLmVtaXRpck11bHRpQ2FtYmlvKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdGlyQ2FtYmlvKCk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpcy5nZW5lcmFyQ2FsZW5kYXJpb3MoKTtcbiAgfVxuICBcbiAgZWxpbWluYXJSYW5nbyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm11bHRpUmFuZ2UpIHJldHVybjtcbiAgICBcbiAgICBjb25zdCBjdXJyZW50UmFuZ2VzID0gWy4uLnRoaXMuc2VsZWN0ZWRSYW5nZXMoKV07XG4gICAgY3VycmVudFJhbmdlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuc2VsZWN0ZWRSYW5nZXMuc2V0KGN1cnJlbnRSYW5nZXMpO1xuICAgIFxuICAgIHRoaXMuYWN0dWFsaXphck11bHRpUmFuZ29UZXh0bygpO1xuICAgIHRoaXMuZW1pdGlyTXVsdGlDYW1iaW8oKTtcbiAgICB0aGlzLmVtaXRpck11bHRpU2VsZWNjaW9uKCk7XG4gICAgdGhpcy5nZW5lcmFyQ2FsZW5kYXJpb3MoKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBhY3R1YWxpemFyTXVsdGlSYW5nb1RleHRvKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5zZWxlY3RlZFJhbmdlcygpLmxlbmd0aDtcbiAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgIHRoaXMucmFuZ29GZWNoYXMuc2V0KCcnKTtcbiAgICB9IGVsc2UgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgICB0aGlzLnJhbmdvRmVjaGFzLnNldCgnMSByYW5nZSBzZWxlY3RlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJhbmdvRmVjaGFzLnNldChgJHtjb3VudH0gcmFuZ2VzIHNlbGVjdGVkYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0aXJDYW1iaW8oKTogdm9pZCB7XG4gICAgdGhpcy5kYXRlUmFuZ2VDaGFuZ2UuZW1pdCh7XG4gICAgICBmZWNoYUluaWNpbzogdGhpcy5mZWNoYUluaWNpbyxcbiAgICAgIGZlY2hhRmluOiB0aGlzLmZlY2hhRmluLFxuICAgICAgcmFuZ29UZXh0bzogdGhpcy5yYW5nb0ZlY2hhcygpXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRpclNlbGVjY2lvbigpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGVSYW5nZVNlbGVjdGVkLmVtaXQoe1xuICAgICAgZmVjaGFJbmljaW86IHRoaXMuZmVjaGFJbmljaW8sXG4gICAgICBmZWNoYUZpbjogdGhpcy5mZWNoYUZpbixcbiAgICAgIHJhbmdvVGV4dG86IHRoaXMucmFuZ29GZWNoYXMoKVxuICAgIH0pO1xuICB9XG4gIFxuICBwcml2YXRlIGVtaXRpck11bHRpQ2FtYmlvKCk6IHZvaWQge1xuICAgIHRoaXMubXVsdGlEYXRlUmFuZ2VDaGFuZ2UuZW1pdCh7XG4gICAgICByYW5nZXM6IHRoaXMuc2VsZWN0ZWRSYW5nZXMoKVxuICAgIH0pO1xuICB9XG4gIFxuICBwcml2YXRlIGVtaXRpck11bHRpU2VsZWNjaW9uKCk6IHZvaWQge1xuICAgIHRoaXMubXVsdGlEYXRlUmFuZ2VTZWxlY3RlZC5lbWl0KHtcbiAgICAgIHJhbmdlczogdGhpcy5zZWxlY3RlZFJhbmdlcygpXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldERhdGVSYW5nZVZhbHVlKCk6IERhdGVSYW5nZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZlY2hhSW5pY2lvOiB0aGlzLmZlY2hhSW5pY2lvLFxuICAgICAgZmVjaGFGaW46IHRoaXMuZmVjaGFGaW4sXG4gICAgICByYW5nb1RleHRvOiB0aGlzLnJhbmdvRmVjaGFzKClcbiAgICB9O1xuICB9XG5cbiAgLy8gQ29udHJvbFZhbHVlQWNjZXNzb3IgaW1wbGVtZW50YXRpb25cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogRGF0ZVJhbmdlIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5mZWNoYUluaWNpbyA9IHZhbHVlLmZlY2hhSW5pY2lvIHx8ICcnO1xuICAgICAgdGhpcy5mZWNoYUZpbiA9IHZhbHVlLmZlY2hhRmluIHx8ICcnO1xuICAgICAgaWYgKHRoaXMuZmVjaGFJbmljaW8gJiYgdGhpcy5mZWNoYUZpbikge1xuICAgICAgICB0aGlzLmFjdHVhbGl6YXJSYW5nb0ZlY2hhc1RleHRvKCk7XG4gICAgICAgIHRoaXMuZ2VuZXJhckNhbGVuZGFyaW9zKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmVjaGFJbmljaW8gPSAnJztcbiAgICAgIHRoaXMuZmVjaGFGaW4gPSAnJztcbiAgICAgIHRoaXMucmFuZ29GZWNoYXMuc2V0KCcnKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IERhdGVSYW5nZSB8IG51bGwpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmlzRGlzYWJsZWQuc2V0KGlzRGlzYWJsZWQpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlci13cmFwcGVyXCIgXG4gIFtzdHlsZS4tLWlucHV0LWJvcmRlci1ob3Zlcl09XCJpbnB1dEJvcmRlckNvbG9ySG92ZXJcIlxuICBbc3R5bGUuLS1pbnB1dC1ib3JkZXItZm9jdXNdPVwiaW5wdXRCb3JkZXJDb2xvckZvY3VzXCI+XG4gIDxpbnB1dCBcbiAgICB0eXBlPVwidGV4dFwiIFxuICAgIGNsYXNzPVwiZGF0ZXBpY2tlci1pbnB1dFwiIFxuICAgIFt2YWx1ZV09XCJyYW5nb0ZlY2hhcygpXCIgXG4gICAgKGNsaWNrKT1cInRvZ2dsZURhdGVQaWNrZXIoKVwiIFxuICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQoKVwiXG4gICAgW25nU3R5bGVdPVwie1xuICAgICAgJ2JhY2tncm91bmQtY29sb3InOiBpbnB1dEJhY2tncm91bmRDb2xvcixcbiAgICAgICdjb2xvcic6IGlucHV0VGV4dENvbG9yLFxuICAgICAgJ2JvcmRlci1jb2xvcic6IGlucHV0Qm9yZGVyQ29sb3IsXG4gICAgICAncGFkZGluZyc6IGlucHV0UGFkZGluZ1xuICAgIH1cIlxuICAgIHJlYWRvbmx5PlxuXG4gIEBpZiAobW9zdHJhckRhdGVQaWNrZXIoKSkge1xuICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItZHJvcGRvd25cIj5cbiAgICBAaWYgKHNob3dQcmVzZXRzKSB7XG4gICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLXByZXNldHNcIj5cbiAgICAgIEBmb3IgKHByZXNldCBvZiBwcmVzZXRzOyB0cmFjayBwcmVzZXQubGFiZWwpIHtcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzZWxlY2Npb25hclJhbmdvUHJlZGVmaW5pZG8ocHJlc2V0KVwiPnt7IHByZXNldC5sYWJlbCB9fTwvYnV0dG9uPlxuICAgICAgfVxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2UtY2FsZW5kYXJcIiAoY2xpY2spPVwiY2VycmFyRGF0ZVBpY2tlcigpXCIgdGl0bGU9XCJDbG9zZVwiPlxuICAgICAgICDDl1xuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmICghc2hvd1ByZXNldHMpIHtcbiAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItaGVhZGVyLW9ubHktY2xvc2VcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlLWNhbGVuZGFyXCIgKGNsaWNrKT1cImNlcnJhckRhdGVQaWNrZXIoKVwiIHRpdGxlPVwiQ2xvc2VcIj5cbiAgICAgICAgw5dcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIH1cblxuICAgIDwhLS0gQ2FsZW5kYXJzIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1jYWxlbmRhcnNcIj5cbiAgICAgIDwhLS0gUHJldmlvdXMgbW9udGggY2FsZW5kYXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItY2FsZW5kYXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLWhlYWRlclwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjYW1iaWFyTWVzKC0xKVwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0xMS4zNTQgMS42NDZhLjUuNSAwIDAgMSAwIC43MDhMNS43MDcgOGw1LjY0NyA1LjY0NmEuNS41IDAgMCAxLS43MDguNzA4bC02LTZhLjUuNSAwIDAgMSAwLS43MDhsNi02YS41LjUgMCAwIDEgLjcwOCAwelwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxzcGFuPnt7IG5vbWJyZU1lc0FudGVyaW9yKCkgfX08L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc3R5bGU9XCJ2aXNpYmlsaXR5OiBoaWRkZW47XCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+XG4gICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTQuNjQ2IDEuNjQ2YS41LjUgMCAwIDEgLjcwOCAwbDYgNmEuNS41IDAgMCAxIDAgLjcwOGwtNiA2YS41LjUgMCAwIDEtLjcwOC0uNzA4TDEwLjI5MyA4IDQuNjQ2IDIuMzU0YS41LjUgMCAwIDEgMC0uNzA4elwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLXdlZWtkYXlzXCI+XG4gICAgICAgICAgQGZvciAoZGF5TmFtZSBvZiBkaWFzU2VtYW5hKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgPHNwYW4+e3sgZGF5TmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItZGF5c1wiPlxuICAgICAgICAgIEBmb3IgKGRpYU9iaiBvZiBkaWFzTWVzQW50ZXJpb3IoKTsgdHJhY2sgZGlhT2JqLmZlY2hhIHx8ICRpbmRleCkge1xuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZGF0ZS1waWNrZXItZGF5XCIgXG4gICAgICAgICAgICAgIFtjbGFzcy5lbXB0eV09XCIhZGlhT2JqLmVzTWVzQWN0dWFsXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImRpYU9iai5lc0luaWNpbyB8fCBkaWFPYmouZXNGaW5cIlxuICAgICAgICAgICAgICBbY2xhc3MuaW4tcmFuZ2VdPVwiZGlhT2JqLmVuUmFuZ28gJiYgIWRpYU9iai5lc0luaWNpbyAmJiAhZGlhT2JqLmVzRmluXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjY2lvbmFyRGlhKGRpYU9iailcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWRpYU9iai5lc01lc0FjdHVhbFwiPlxuICAgICAgICAgICAgICB7eyBkaWFPYmouZGlhIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQ3VycmVudCBtb250aCBjYWxlbmRhciAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1jYWxlbmRhclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItaGVhZGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc3R5bGU9XCJ2aXNpYmlsaXR5OiBoaWRkZW47XCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+XG4gICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTExLjM1NCAxLjY0NmEuNS41IDAgMCAxIDAgLjcwOEw1LjcwNyA4bDUuNjQ3IDUuNjQ2YS41LjUgMCAwIDEtLjcwOC43MDhsLTYtNmEuNS41IDAgMCAxIDAtLjcwOGw2LTZhLjUuNSAwIDAgMSAuNzA4IDB6XCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPHNwYW4+e3sgbm9tYnJlTWVzQWN0dWFsKCkgfX08L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNhbWJpYXJNZXMoMSlcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj5cbiAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNNC42NDYgMS42NDZhLjUuNSAwIDAgMSAuNzA4IDBsNiA2YS41LjUgMCAwIDEgMCAuNzA4bC02IDZhLjUuNSAwIDAgMS0uNzA4LS43MDhMMTAuMjkzIDggNC42NDYgMi4zNTRhLjUuNSAwIDAgMSAwLS43MDh6XCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItd2Vla2RheXNcIj5cbiAgICAgICAgICBAZm9yIChkYXlOYW1lIG9mIGRpYXNTZW1hbmEoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICA8c3Bhbj57eyBkYXlOYW1lIH19PC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1kYXlzXCI+XG4gICAgICAgICAgQGZvciAoZGlhT2JqIG9mIGRpYXNNZXNBY3R1YWwoKTsgdHJhY2sgZGlhT2JqLmZlY2hhIHx8ICRpbmRleCkge1xuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZGF0ZS1waWNrZXItZGF5XCIgXG4gICAgICAgICAgICAgIFtjbGFzcy5lbXB0eV09XCIhZGlhT2JqLmVzTWVzQWN0dWFsXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImRpYU9iai5lc0luaWNpbyB8fCBkaWFPYmouZXNGaW5cIlxuICAgICAgICAgICAgICBbY2xhc3MuaW4tcmFuZ2VdPVwiZGlhT2JqLmVuUmFuZ28gJiYgIWRpYU9iai5lc0luaWNpbyAmJiAhZGlhT2JqLmVzRmluXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjY2lvbmFyRGlhKGRpYU9iailcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWRpYU9iai5lc01lc0FjdHVhbFwiPlxuICAgICAgICAgICAgICB7eyBkaWFPYmouZGlhIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIE11bHRpLVJhbmdlIExpc3QgLS0+XG4gICAgQGlmIChtdWx0aVJhbmdlICYmIHNlbGVjdGVkUmFuZ2VzKCkubGVuZ3RoID4gMCkge1xuICAgIDxkaXYgY2xhc3M9XCJtdWx0aS1yYW5nZS1saXN0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibXVsdGktcmFuZ2UtaGVhZGVyXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibXVsdGktcmFuZ2UtdGl0bGVcIj5TZWxlY3RlZCBSYW5nZXMgKHt7IHNlbGVjdGVkUmFuZ2VzKCkubGVuZ3RoIH19KTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm11bHRpLXJhbmdlLWl0ZW1zXCI+XG4gICAgICAgIEBmb3IgKHJhbmdlIG9mIHNlbGVjdGVkUmFuZ2VzKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibXVsdGktcmFuZ2UtaXRlbVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXVsdGktcmFuZ2UtdGV4dFwiPnt7IHJhbmdlLnJhbmdvVGV4dG8gfX08L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuLXJlbW92ZS1yYW5nZVwiIFxuICAgICAgICAgICAgKGNsaWNrKT1cImVsaW1pbmFyUmFuZ28oJGluZGV4KVwiXG4gICAgICAgICAgICB0aXRsZT1cIlJlbW92ZSB0aGlzIHJhbmdlXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMi4xNDYgMi44NTRhLjUuNSAwIDEgMSAuNzA4LS43MDhMOCA3LjI5M2w1LjE0Ni01LjE0N2EuNS41IDAgMCAxIC43MDguNzA4TDguNzA3IDhsNS4xNDcgNS4xNDZhLjUuNSAwIDAgMS0uNzA4LjcwOEw4IDguNzA3bC01LjE0NiA1LjE0N2EuNS41IDAgMCAxLS43MDgtLjcwOEw3LjI5MyA4IDIuMTQ2IDIuODU0WlwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPCEtLSBGb290ZXIgd2l0aCBjbGVhciBidXR0b24gLS0+XG4gICAgQGlmIChzaG93Q2xlYXJCdXR0b24gfHwgbXVsdGlSYW5nZSkge1xuICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1mb290ZXJcIj5cbiAgICAgIEBpZiAobXVsdGlSYW5nZSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibXVsdGktcmFuZ2UtZm9vdGVyLWFjdGlvbnNcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbGVhclwiIChjbGljayk9XCJsaW1waWFyKClcIiB0aXRsZT1cIkNsZWFyIGFsbCByYW5nZXNcIj5cbiAgICAgICAgICAgIENsZWFyIEFsbFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWRvbmVcIiAoY2xpY2spPVwiY2VycmFyRGF0ZVBpY2tlcigpXCIgdGl0bGU9XCJEb25lIHNlbGVjdGluZ1wiPlxuICAgICAgICAgICAgRG9uZVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAoIW11bHRpUmFuZ2UgJiYgc2hvd0NsZWFyQnV0dG9uKSB7XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsZWFyXCIgKGNsaWNrKT1cImxpbXBpYXIoKVwiIHRpdGxlPVwiQ2xlYXIgc2VsZWN0aW9uXCI+XG4gICAgICAgICAgQ2xlYXJcbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbiAgfVxuPC9kaXY+XG4iXX0=