ng-zenduit 2.0.2 → 2.0.7

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.
@@ -0,0 +1,500 @@
1
+ import { Component, EventEmitter, HostListener, Input, Output, ViewChild } from '@angular/core';
2
+ import moment from 'moment/moment';
3
+ import { TemplatePortal } from '@angular/cdk/portal';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/cdk/overlay";
6
+ import * as i2 from "@ngx-translate/core";
7
+ import * as i3 from "@angular/common";
8
+ import * as i4 from "../icon/zendu-icon.component";
9
+ const MOBILE_BREAKPOINT = 768;
10
+ export class ZenduDatePickerDropdownComponent {
11
+ constructor(_element, overlay, viewContainerRef, _translate) {
12
+ this._element = _element;
13
+ this.overlay = overlay;
14
+ this.viewContainerRef = viewContainerRef;
15
+ this._translate = _translate;
16
+ this.type = 'single';
17
+ this.date = null;
18
+ this.dateChange = new EventEmitter();
19
+ this.startDate = null;
20
+ this.startDateChange = new EventEmitter();
21
+ this.endDate = null;
22
+ this.endDateChange = new EventEmitter();
23
+ this.rangeChange = new EventEmitter();
24
+ this.presets = null;
25
+ this.minDate = null;
26
+ this.maxDate = null;
27
+ this.disabled = false;
28
+ this.highlightDays = [];
29
+ this.placeholder = '';
30
+ this.mobileBreakpoint = MOBILE_BREAKPOINT;
31
+ this.mobile = false;
32
+ this.isOpen = false;
33
+ // Left calendar state
34
+ this.leftCurrentSlot = new Date();
35
+ this.leftDayRows = [];
36
+ this.leftDaysTitle = '';
37
+ // Right calendar state (for range desktop)
38
+ this.rightCurrentSlot = new Date();
39
+ this.rightDayRows = [];
40
+ this.rightDaysTitle = '';
41
+ this.weekDays = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sat', 'Su'];
42
+ // Internal selection state
43
+ this._selectedDate = null;
44
+ this._selectedStart = null;
45
+ this._selectedEnd = null;
46
+ this._activePreset = null;
47
+ this.overlayRef = null;
48
+ this.defaultPresets = [
49
+ {
50
+ label: 'Today',
51
+ getRange: () => ({
52
+ start: moment().startOf('day').toDate(),
53
+ end: moment().endOf('day').toDate()
54
+ })
55
+ },
56
+ {
57
+ label: 'Yesterday',
58
+ getRange: () => ({
59
+ start: moment().subtract(1, 'day').startOf('day').toDate(),
60
+ end: moment().subtract(1, 'day').endOf('day').toDate()
61
+ })
62
+ },
63
+ {
64
+ label: 'This week',
65
+ getRange: () => ({
66
+ start: moment().startOf('isoWeek').toDate(),
67
+ end: moment().endOf('isoWeek').toDate()
68
+ })
69
+ },
70
+ {
71
+ label: 'Last week',
72
+ getRange: () => ({
73
+ start: moment().subtract(1, 'week').startOf('isoWeek').toDate(),
74
+ end: moment().subtract(1, 'week').endOf('isoWeek').toDate()
75
+ })
76
+ },
77
+ {
78
+ label: 'This month',
79
+ getRange: () => ({
80
+ start: moment().startOf('month').toDate(),
81
+ end: moment().endOf('month').toDate()
82
+ })
83
+ },
84
+ {
85
+ label: 'Last month',
86
+ getRange: () => ({
87
+ start: moment().subtract(1, 'month').startOf('month').toDate(),
88
+ end: moment().subtract(1, 'month').endOf('month').toDate()
89
+ })
90
+ },
91
+ {
92
+ label: 'This year',
93
+ getRange: () => ({
94
+ start: moment().startOf('year').toDate(),
95
+ end: moment().endOf('year').toDate()
96
+ })
97
+ },
98
+ {
99
+ label: 'Last year',
100
+ getRange: () => ({
101
+ start: moment().subtract(1, 'year').startOf('year').toDate(),
102
+ end: moment().subtract(1, 'year').endOf('year').toDate()
103
+ })
104
+ },
105
+ {
106
+ label: 'All time',
107
+ getRange: () => ({
108
+ start: new Date(2000, 0, 1),
109
+ end: moment().endOf('day').toDate()
110
+ })
111
+ }
112
+ ];
113
+ }
114
+ ngOnInit() {
115
+ this.checkMobile();
116
+ }
117
+ onResize() {
118
+ this.checkMobile();
119
+ }
120
+ checkMobile() {
121
+ this.mobile = window.innerWidth < this.mobileBreakpoint;
122
+ }
123
+ ngOnChanges(changes) {
124
+ if (changes['date'] && this.date) {
125
+ this._selectedDate = new Date(this.date);
126
+ }
127
+ if (changes['startDate'] && this.startDate) {
128
+ this._selectedStart = new Date(this.startDate);
129
+ }
130
+ if (changes['endDate'] && this.endDate) {
131
+ this._selectedEnd = new Date(this.endDate);
132
+ }
133
+ }
134
+ ngOnDestroy() {
135
+ this.closeOverlay();
136
+ }
137
+ outsideHandling(event) {
138
+ if (!document.body.contains(event.target))
139
+ return;
140
+ if (this._element.nativeElement.contains(event.target))
141
+ return;
142
+ // Check if click is inside overlay
143
+ if (this.overlayRef) {
144
+ const overlayElement = this.overlayRef.overlayElement;
145
+ if (overlayElement && overlayElement.contains(event.target))
146
+ return;
147
+ }
148
+ this.close();
149
+ }
150
+ get activePresets() {
151
+ return this.presets || this.defaultPresets;
152
+ }
153
+ get showPresetsSidebar() {
154
+ return this.type === 'range' && !this.mobile;
155
+ }
156
+ get showDualCalendars() {
157
+ return this.type === 'range' && !this.mobile;
158
+ }
159
+ get triggerLabel() {
160
+ if (this.type === 'single') {
161
+ if (this.date) {
162
+ return this.formatDate(this.date);
163
+ }
164
+ return this.placeholder || this._translate.instant('Select date');
165
+ }
166
+ if (this.startDate && this.endDate) {
167
+ return `${this.formatDate(this.startDate)} - ${this.formatDate(this.endDate)}`;
168
+ }
169
+ return this.placeholder || this._translate.instant('Select dates');
170
+ }
171
+ get hasValue() {
172
+ if (this.type === 'single')
173
+ return !!this.date;
174
+ return !!(this.startDate && this.endDate);
175
+ }
176
+ get formattedSelectedDate() {
177
+ return this._selectedDate ? this.formatDate(this._selectedDate) : '';
178
+ }
179
+ get formattedStartDate() {
180
+ return this._selectedStart ? this.formatDate(this._selectedStart) : '';
181
+ }
182
+ get formattedEndDate() {
183
+ return this._selectedEnd ? this.formatDate(this._selectedEnd) : '';
184
+ }
185
+ formatDate(date) {
186
+ const enMonth = moment(date).format('MMM');
187
+ const translatedMonth = this._translate.instant(enMonth);
188
+ return moment(date).format('MMM D, YYYY').replace(enMonth, translatedMonth);
189
+ }
190
+ toggle() {
191
+ if (this.disabled)
192
+ return;
193
+ if (this.isOpen) {
194
+ this.close();
195
+ }
196
+ else {
197
+ this.open();
198
+ }
199
+ }
200
+ open() {
201
+ this.isOpen = true;
202
+ this._selectedDate = this.date ? new Date(this.date) : null;
203
+ this._selectedStart = this.startDate ? new Date(this.startDate) : null;
204
+ this._selectedEnd = this.endDate ? new Date(this.endDate) : null;
205
+ this._activePreset = null;
206
+ if (this.type === 'single') {
207
+ this.leftCurrentSlot = this._selectedDate ? new Date(this._selectedDate) : new Date();
208
+ }
209
+ else {
210
+ this.leftCurrentSlot = this._selectedStart ? new Date(this._selectedStart) : new Date();
211
+ this.rightCurrentSlot = moment(this.leftCurrentSlot).add(1, 'month').toDate();
212
+ }
213
+ this.updateCalendars();
214
+ this.createOverlay();
215
+ }
216
+ close() {
217
+ this.isOpen = false;
218
+ this.closeOverlay();
219
+ }
220
+ createOverlay() {
221
+ const position = {
222
+ originX: 'end',
223
+ originY: 'bottom',
224
+ overlayX: 'end',
225
+ overlayY: 'top'
226
+ };
227
+ const positionStrategy = this.overlay.position()
228
+ .flexibleConnectedTo(this.triggerBtn)
229
+ .withPositions([
230
+ position,
231
+ { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom' },
232
+ { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },
233
+ { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' }
234
+ ])
235
+ .withFlexibleDimensions(false)
236
+ .withDefaultOffsetY(8)
237
+ .withPush(false);
238
+ this.overlayRef = this.overlay.create({
239
+ positionStrategy,
240
+ hasBackdrop: true,
241
+ backdropClass: 'cdk-overlay-transparent-backdrop',
242
+ panelClass: 'zen-date-picker-dropdown-overlay',
243
+ });
244
+ this.overlayRef.attach(new TemplatePortal(this.dropdownTemplate, this.viewContainerRef));
245
+ this.overlayRef.backdropClick().subscribe(() => {
246
+ this.close();
247
+ });
248
+ }
249
+ closeOverlay() {
250
+ if (this.overlayRef) {
251
+ this.overlayRef.detach();
252
+ this.overlayRef.dispose();
253
+ this.overlayRef = null;
254
+ }
255
+ }
256
+ // Calendar navigation
257
+ leftPrevMonth() {
258
+ this.leftCurrentSlot = moment(this.leftCurrentSlot).subtract(1, 'month').toDate();
259
+ if (this.showDualCalendars) {
260
+ this.rightCurrentSlot = moment(this.leftCurrentSlot).add(1, 'month').toDate();
261
+ }
262
+ this.updateCalendars();
263
+ }
264
+ leftNextMonth() {
265
+ this.leftCurrentSlot = moment(this.leftCurrentSlot).add(1, 'month').toDate();
266
+ if (this.showDualCalendars) {
267
+ this.rightCurrentSlot = moment(this.leftCurrentSlot).add(1, 'month').toDate();
268
+ }
269
+ this.updateCalendars();
270
+ }
271
+ rightPrevMonth() {
272
+ this.rightCurrentSlot = moment(this.rightCurrentSlot).subtract(1, 'month').toDate();
273
+ this.leftCurrentSlot = moment(this.rightCurrentSlot).subtract(1, 'month').toDate();
274
+ this.updateCalendars();
275
+ }
276
+ rightNextMonth() {
277
+ this.rightCurrentSlot = moment(this.rightCurrentSlot).add(1, 'month').toDate();
278
+ this.leftCurrentSlot = moment(this.rightCurrentSlot).subtract(1, 'month').toDate();
279
+ this.updateCalendars();
280
+ }
281
+ // For mobile/single mode when there's only one calendar
282
+ prevMonth() {
283
+ this.leftPrevMonth();
284
+ }
285
+ nextMonth() {
286
+ this.leftNextMonth();
287
+ }
288
+ selectDay(day) {
289
+ if (day.isDisabled || day.isOutside)
290
+ return;
291
+ if (this.type === 'single') {
292
+ this._selectedDate = new Date(day.date);
293
+ }
294
+ else {
295
+ // Range selection logic
296
+ if (!this._selectedStart || (this._selectedStart && this._selectedEnd)) {
297
+ // Start new selection
298
+ this._selectedStart = new Date(day.date);
299
+ this._selectedEnd = null;
300
+ this._activePreset = null;
301
+ }
302
+ else {
303
+ // Complete the range
304
+ const newDate = new Date(day.date);
305
+ if (moment(newDate).isBefore(this._selectedStart)) {
306
+ this._selectedEnd = new Date(this._selectedStart);
307
+ this._selectedStart = newDate;
308
+ }
309
+ else {
310
+ this._selectedEnd = newDate;
311
+ }
312
+ }
313
+ }
314
+ this.updateCalendars();
315
+ }
316
+ selectPreset(preset) {
317
+ const range = preset.getRange();
318
+ this._selectedStart = range.start;
319
+ this._selectedEnd = range.end;
320
+ this._activePreset = preset.label;
321
+ this.leftCurrentSlot = new Date(range.start);
322
+ if (this.showDualCalendars) {
323
+ this.rightCurrentSlot = moment(this.leftCurrentSlot).add(1, 'month').toDate();
324
+ }
325
+ this.updateCalendars();
326
+ }
327
+ goToToday() {
328
+ const today = new Date();
329
+ this._selectedDate = moment(today).startOf('day').toDate();
330
+ this.leftCurrentSlot = new Date(today);
331
+ this.updateCalendars();
332
+ }
333
+ apply() {
334
+ if (this.type === 'single') {
335
+ if (this._selectedDate) {
336
+ this.date = new Date(this._selectedDate);
337
+ this.dateChange.emit(this.date);
338
+ }
339
+ }
340
+ else {
341
+ if (this._selectedStart) {
342
+ this.startDate = new Date(this._selectedStart);
343
+ this.startDateChange.emit(this.startDate);
344
+ }
345
+ if (this._selectedEnd) {
346
+ this.endDate = new Date(this._selectedEnd);
347
+ this.endDateChange.emit(this.endDate);
348
+ }
349
+ if (this._selectedStart && this._selectedEnd) {
350
+ this.rangeChange.emit({ start: this.startDate, end: this.endDate });
351
+ }
352
+ }
353
+ this.close();
354
+ }
355
+ cancel() {
356
+ this.close();
357
+ }
358
+ get canApply() {
359
+ if (this.type === 'single')
360
+ return !!this._selectedDate;
361
+ return !!(this._selectedStart && this._selectedEnd);
362
+ }
363
+ updateCalendars() {
364
+ this.updateDays(this.leftCurrentSlot, 'left');
365
+ if (this.showDualCalendars) {
366
+ this.updateDays(this.rightCurrentSlot, 'right');
367
+ }
368
+ }
369
+ updateDays(slot, side) {
370
+ const enMonth = moment(slot).format('MMM');
371
+ const translatedMonth = this._translate.instant(enMonth);
372
+ const title = moment(slot).format('MMMM YYYY');
373
+ const dayRows = [];
374
+ let current = moment(slot).startOf('month').startOf('isoWeek');
375
+ const end = moment(slot).endOf('month').endOf('isoWeek');
376
+ const currentMonth = moment(slot).month();
377
+ while (current.isSameOrBefore(end)) {
378
+ const row = { days: [] };
379
+ dayRows.push(row);
380
+ for (let idx = 0; idx < 7; idx++) {
381
+ const isOutside = currentMonth !== current.month();
382
+ let isDisabled = false;
383
+ if (this.minDate && current.toDate() < this.minDate) {
384
+ isDisabled = true;
385
+ }
386
+ else if (this.maxDate && current.toDate() > this.maxDate) {
387
+ isDisabled = true;
388
+ }
389
+ let isHighlighted = false;
390
+ if (this.highlightDays && this.highlightDays.length) {
391
+ isHighlighted = this.highlightDays.indexOf(current.valueOf()) >= 0;
392
+ }
393
+ const isSelected = isOutside ? false : this.isDaySelected(current);
394
+ row.days.push({
395
+ date: current.toDate(),
396
+ lbl: isOutside ? '' : current.date().toString(),
397
+ isOutside,
398
+ selected: isSelected,
399
+ isDisabled: isOutside ? true : isDisabled,
400
+ isHighlighted: isOutside ? false : isHighlighted
401
+ });
402
+ current = current.clone().add(1, 'day');
403
+ }
404
+ }
405
+ if (side === 'left') {
406
+ this.leftDayRows = dayRows;
407
+ this.leftDaysTitle = title;
408
+ }
409
+ else {
410
+ this.rightDayRows = dayRows;
411
+ this.rightDaysTitle = title;
412
+ }
413
+ }
414
+ isDaySelected(date) {
415
+ if (this.type === 'single') {
416
+ return this._selectedDate ? date.isSame(moment(this._selectedDate), 'day') : false;
417
+ }
418
+ if (this._selectedStart && date.isSame(moment(this._selectedStart), 'day'))
419
+ return true;
420
+ if (this._selectedEnd && date.isSame(moment(this._selectedEnd), 'day'))
421
+ return true;
422
+ return false;
423
+ }
424
+ isToday(day) {
425
+ if (day.isOutside)
426
+ return false;
427
+ return moment(day.date).isSame(moment(), 'day');
428
+ }
429
+ isInRange(day) {
430
+ if (day.isOutside)
431
+ return false;
432
+ if (this.type !== 'range' || !this._selectedStart || !this._selectedEnd)
433
+ return false;
434
+ const d = moment(day.date);
435
+ return d.isAfter(moment(this._selectedStart), 'day') && d.isBefore(moment(this._selectedEnd), 'day');
436
+ }
437
+ isRangeStart(day) {
438
+ if (day.isOutside)
439
+ return false;
440
+ if (this.type !== 'range' || !this._selectedStart)
441
+ return false;
442
+ return moment(day.date).isSame(moment(this._selectedStart), 'day');
443
+ }
444
+ isRangeEnd(day) {
445
+ if (day.isOutside)
446
+ return false;
447
+ if (this.type !== 'range' || !this._selectedEnd)
448
+ return false;
449
+ return moment(day.date).isSame(moment(this._selectedEnd), 'day');
450
+ }
451
+ }
452
+ ZenduDatePickerDropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduDatePickerDropdownComponent, deps: [{ token: i0.ElementRef }, { token: i1.Overlay }, { token: i0.ViewContainerRef }, { token: i2.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
453
+ ZenduDatePickerDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduDatePickerDropdownComponent, selector: "zen-date-picker-dropdown", inputs: { type: "type", date: "date", startDate: "startDate", endDate: "endDate", presets: "presets", minDate: "minDate", maxDate: "maxDate", disabled: "disabled", highlightDays: "highlightDays", placeholder: "placeholder", mobileBreakpoint: "mobileBreakpoint" }, outputs: { dateChange: "dateChange", startDateChange: "startDateChange", endDateChange: "endDateChange", rangeChange: "rangeChange" }, host: { listeners: { "window:resize": "onResize()", "window:mousedown": "outsideHandling($event)" } }, viewQueries: [{ propertyName: "triggerBtn", first: true, predicate: ["triggerBtn"], descendants: true }, { propertyName: "dropdownTemplate", first: true, predicate: ["dropdownTemplate"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- Trigger Button -->\n<button class=\"dropdown-trigger\"\n #triggerBtn\n [disabled]=\"disabled\"\n [class.active]=\"isOpen\"\n [class.has-value]=\"hasValue\"\n (click)=\"toggle()\">\n <zen-icon class=\"trigger-icon\"\n src=\"assets/ng-zenduit/icons/calendar.svg\">\n </zen-icon>\n <span class=\"trigger-label\">{{ triggerLabel }}</span>\n</button>\n\n<!-- Dropdown Panel -->\n<ng-template #dropdownTemplate>\n <div class=\"dropdown-menu\" [class.mobile]=\"mobile\">\n <!-- RANGE DESKTOP: presets sidebar + dual calendar -->\n <ng-container *ngIf=\"type === 'range' && !mobile\">\n <!-- Presets sidebar -->\n <div class=\"presets-sidebar\">\n <div class=\"preset-item\"\n *ngFor=\"let preset of activePresets\"\n [class.active]=\"_activePreset === preset.label\"\n (click)=\"selectPreset(preset)\">\n {{ preset.label | translate }}\n </div>\n </div>\n\n <div class=\"sidebar-divider\"></div>\n\n <!-- Calendars + bottom panel -->\n <div class=\"calendars-container\">\n <div class=\"dual-calendars\">\n <!-- Left calendar -->\n <div class=\"calendar-panel\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"leftPrevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"leftNextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n </div>\n\n <div class=\"calendar-divider\"></div>\n\n <!-- Right calendar -->\n <div class=\"calendar-panel\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"rightPrevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ rightDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"rightNextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: rightDayRows }\"></ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <!-- Bottom panel: inputs + actions -->\n <div class=\"bottom-panel\">\n <div class=\"input-fields\">\n <div class=\"date-input\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedStart\">\n {{ _selectedStart ? formattedStartDate : ('Start date' | translate) }}\n </span>\n </div>\n <span class=\"date-separator\">&ndash;</span>\n <div class=\"date-input\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedEnd\">\n {{ _selectedEnd ? formattedEndDate : ('End date' | translate) }}\n </span>\n </div>\n </div>\n <div class=\"actions\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- RANGE MOBILE: single calendar with dual inputs on top -->\n <ng-container *ngIf=\"type === 'range' && mobile\">\n <div class=\"single-calendar-container\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"prevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"nextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n\n <!-- Range inputs -->\n <div class=\"mobile-range-inputs\">\n <div class=\"date-input compact\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedStart\">\n {{ _selectedStart ? formattedStartDate : ('Select date' | translate) }}\n </span>\n </div>\n <span class=\"date-separator\">&ndash;</span>\n <div class=\"date-input compact\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedEnd\">\n {{ _selectedEnd ? formattedEndDate : ('Select date' | translate) }}\n </span>\n </div>\n </div>\n\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <div class=\"bottom-panel compact\">\n <div class=\"actions full-width\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- SINGLE DATE: single calendar + input + today button -->\n <ng-container *ngIf=\"type === 'single'\">\n <div class=\"single-calendar-container\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"prevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"nextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n\n <!-- Date input + Today button -->\n <div class=\"single-actions-row\">\n <div class=\"date-input flex-1\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedDate\">\n {{ _selectedDate ? formattedSelectedDate : ('Select date' | translate) }}\n </span>\n </div>\n <button class=\"btn-today\" (click)=\"goToToday()\">{{ 'Today' | translate }}</button>\n </div>\n\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <div class=\"bottom-panel compact\">\n <div class=\"actions full-width\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n</ng-template>\n\n<!-- Shared calendar grid template -->\n<ng-template #calendarGrid let-dayRows>\n <div class=\"dates-grid\">\n <!-- Week day headers -->\n <div class=\"week-header\">\n <div class=\"cell header-cell\" *ngFor=\"let wd of weekDays\">{{ wd | translate }}</div>\n </div>\n <!-- Day rows -->\n <div class=\"day-row\" *ngFor=\"let row of dayRows\">\n <div class=\"cell day-cell\"\n *ngFor=\"let day of row.days\"\n [class.outside]=\"day.isOutside\"\n [class.selected]=\"day.selected\"\n [class.today]=\"isToday(day)\"\n [class.disabled]=\"day.isDisabled\"\n [class.in-range]=\"isInRange(day)\"\n [class.range-start]=\"isRangeStart(day)\"\n [class.range-end]=\"isRangeEnd(day)\"\n (click)=\"selectDay(day)\">\n <span class=\"day-number\">{{ day.lbl }}</span>\n <span class=\"highlight-dot\" *ngIf=\"day.isHighlighted\"></span>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".dropdown-trigger{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:10px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;cursor:pointer;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#667085;white-space:nowrap;transition:.2s;-webkit-appearance:none;appearance:none;outline:none}.dropdown-trigger:hover{border-color:#98a2b3}.dropdown-trigger.active{box-shadow:0 1px 2px #1018280d,0 0 0 4px #f2f4f7}.dropdown-trigger.has-value{color:#344054}.dropdown-trigger:disabled{cursor:not-allowed;opacity:.5}.dropdown-trigger .trigger-icon{width:20px;height:20px;background-color:#667085}.dropdown-trigger.has-value .trigger-icon{background-color:#344054}.dropdown-menu{display:inline-flex;background:#FFFFFF;border:1px solid #EAECF0;border-radius:8px;box-shadow:0 20px 24px -4px #10182814,0 8px 8px -4px #10182808;font-family:Inter,sans-serif;overflow:hidden;width:max-content}::ng-deep .cdk-overlay-container{position:fixed;z-index:1200;pointer-events:none;top:0;left:0;height:100%;width:100%}::ng-deep .cdk-overlay-backdrop{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:auto;z-index:1200}::ng-deep .cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1201;display:flex;flex-direction:column;min-width:1px;min-height:1px}::ng-deep .zen-date-picker-dropdown-overlay{position:absolute;width:max-content!important;pointer-events:auto}.presets-sidebar{display:flex;flex-direction:column;gap:4px;padding:12px 16px;min-width:160px}.presets-sidebar .preset-item{padding:10px 16px;border-radius:6px;font-size:14px;font-weight:400;line-height:20px;color:#344054;cursor:pointer;white-space:nowrap;transition:.15s}.presets-sidebar .preset-item:hover{background:#F9FAFB}.presets-sidebar .preset-item.active{background:#F9FAFB;font-weight:500}.sidebar-divider{width:1px;background:#EAECF0;align-self:stretch}.calendars-container{display:flex;flex-direction:column}.dual-calendars{display:flex}.calendar-divider{width:1px;background:#EAECF0;align-self:stretch}.calendar-panel{width:328px;overflow:hidden}.calendar-content{display:flex;flex-direction:column;padding:20px 24px;gap:12px}.single-calendar-container{display:flex;flex-direction:column;width:328px}.month-header{display:flex;align-items:center;justify-content:space-between;width:280px}.nav-btn{display:flex;align-items:center;justify-content:center;padding:10px;border-radius:8px;border:none;background:transparent;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s}.nav-btn:hover{background:#F9FAFB}.nav-btn zen-icon{width:20px;height:20px;background-color:#344054}.month-title{font-size:16px;font-weight:500;line-height:24px;color:#344054;text-align:center}.single-actions-row{display:flex;gap:12px;align-items:flex-start;width:280px}.flex-1{flex:1}.btn-today{display:flex;align-items:center;justify-content:center;padding:10px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#344054;cursor:pointer;white-space:nowrap;-webkit-appearance:none;appearance:none;outline:none;transition:.15s}.btn-today:hover{background:#F9FAFB}.mobile-range-inputs{display:flex;align-items:center;gap:8px;height:40px;width:280px}.date-input{display:flex;align-items:center;padding:8px 14px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;min-width:0}.date-input.compact{flex:1}.date-input .date-input-text{font-size:16px;font-weight:400;line-height:24px;color:#101828;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.date-input .date-input-text.placeholder{color:#667085}.date-separator{font-size:16px;font-weight:400;line-height:24px;color:#667085}.dates-grid{display:flex;flex-direction:column;gap:4px}.week-header{display:flex;width:280px}.day-row{display:flex;border-radius:20px;overflow:hidden}.cell{position:relative;width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:20px}.cell .day-number{font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#344054;width:24px}.cell.header-cell .day-number{font-weight:500}.header-cell{font-size:14px;font-weight:500;line-height:20px;color:#344054}.day-cell{cursor:pointer;transition:.1s}.day-cell:hover:not(.disabled):not(.selected){background:#F1F7FE}.day-cell:hover:not(.disabled):not(.selected) .day-number{color:#105494;font-weight:500}.day-cell.outside{cursor:default;pointer-events:none}.day-cell.today{background:#F2F4F7}.day-cell.today .day-number{font-weight:500}.day-cell.selected{background:#136AB6}.day-cell.selected .day-number{color:#fff;font-weight:500}.day-cell.in-range{background:#F1F7FE;border-radius:0}.day-cell.in-range .day-number{color:#105494}.day-cell.range-start{border-radius:20px 0 0 20px}.day-cell.range-end{border-radius:0 20px 20px 0}.day-cell.range-start.range-end{border-radius:20px}.day-cell.disabled{cursor:not-allowed}.day-cell.disabled .day-number{color:#d0d5dd}.day-cell .highlight-dot{position:absolute;bottom:4px;left:50%;transform:translate(-50%);width:5px;height:5px;border-radius:50%;background:#105494}.day-cell.selected .highlight-dot{background:#FFFFFF}.day-cell.outside .highlight-dot{background:#98A2B3}.bottom-divider{height:1px;background:#EAECF0;width:100%}.bottom-panel{display:flex;align-items:flex-start;justify-content:space-between;padding:16px 24px}.bottom-panel.compact{justify-content:flex-end}.input-fields{display:flex;gap:12px;align-items:center}.input-fields .date-input{width:128px}.actions{display:flex;gap:12px}.actions.full-width,.actions.full-width .btn-cancel,.actions.full-width .btn-apply{flex:1}.btn-cancel{display:flex;align-items:center;justify-content:center;padding:10px 16px;min-width:109px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#344054;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s;white-space:nowrap}.btn-cancel:hover{background:#F9FAFB}.btn-apply{display:flex;align-items:center;justify-content:center;padding:10px 16px;min-width:109px;background:#136AB6;border:1px solid #136AB6;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#fff;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s;white-space:nowrap}.btn-apply:hover{background:#105494}.btn-apply:disabled{opacity:.5;cursor:not-allowed}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.ZenduIconComponent, selector: "zen-icon", inputs: ["src"] }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] });
454
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduDatePickerDropdownComponent, decorators: [{
455
+ type: Component,
456
+ args: [{ selector: 'zen-date-picker-dropdown', template: "<!-- Trigger Button -->\n<button class=\"dropdown-trigger\"\n #triggerBtn\n [disabled]=\"disabled\"\n [class.active]=\"isOpen\"\n [class.has-value]=\"hasValue\"\n (click)=\"toggle()\">\n <zen-icon class=\"trigger-icon\"\n src=\"assets/ng-zenduit/icons/calendar.svg\">\n </zen-icon>\n <span class=\"trigger-label\">{{ triggerLabel }}</span>\n</button>\n\n<!-- Dropdown Panel -->\n<ng-template #dropdownTemplate>\n <div class=\"dropdown-menu\" [class.mobile]=\"mobile\">\n <!-- RANGE DESKTOP: presets sidebar + dual calendar -->\n <ng-container *ngIf=\"type === 'range' && !mobile\">\n <!-- Presets sidebar -->\n <div class=\"presets-sidebar\">\n <div class=\"preset-item\"\n *ngFor=\"let preset of activePresets\"\n [class.active]=\"_activePreset === preset.label\"\n (click)=\"selectPreset(preset)\">\n {{ preset.label | translate }}\n </div>\n </div>\n\n <div class=\"sidebar-divider\"></div>\n\n <!-- Calendars + bottom panel -->\n <div class=\"calendars-container\">\n <div class=\"dual-calendars\">\n <!-- Left calendar -->\n <div class=\"calendar-panel\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"leftPrevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"leftNextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n </div>\n\n <div class=\"calendar-divider\"></div>\n\n <!-- Right calendar -->\n <div class=\"calendar-panel\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"rightPrevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ rightDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"rightNextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: rightDayRows }\"></ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <!-- Bottom panel: inputs + actions -->\n <div class=\"bottom-panel\">\n <div class=\"input-fields\">\n <div class=\"date-input\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedStart\">\n {{ _selectedStart ? formattedStartDate : ('Start date' | translate) }}\n </span>\n </div>\n <span class=\"date-separator\">&ndash;</span>\n <div class=\"date-input\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedEnd\">\n {{ _selectedEnd ? formattedEndDate : ('End date' | translate) }}\n </span>\n </div>\n </div>\n <div class=\"actions\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- RANGE MOBILE: single calendar with dual inputs on top -->\n <ng-container *ngIf=\"type === 'range' && mobile\">\n <div class=\"single-calendar-container\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"prevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"nextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n\n <!-- Range inputs -->\n <div class=\"mobile-range-inputs\">\n <div class=\"date-input compact\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedStart\">\n {{ _selectedStart ? formattedStartDate : ('Select date' | translate) }}\n </span>\n </div>\n <span class=\"date-separator\">&ndash;</span>\n <div class=\"date-input compact\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedEnd\">\n {{ _selectedEnd ? formattedEndDate : ('Select date' | translate) }}\n </span>\n </div>\n </div>\n\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <div class=\"bottom-panel compact\">\n <div class=\"actions full-width\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- SINGLE DATE: single calendar + input + today button -->\n <ng-container *ngIf=\"type === 'single'\">\n <div class=\"single-calendar-container\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"prevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"nextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n\n <!-- Date input + Today button -->\n <div class=\"single-actions-row\">\n <div class=\"date-input flex-1\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedDate\">\n {{ _selectedDate ? formattedSelectedDate : ('Select date' | translate) }}\n </span>\n </div>\n <button class=\"btn-today\" (click)=\"goToToday()\">{{ 'Today' | translate }}</button>\n </div>\n\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <div class=\"bottom-panel compact\">\n <div class=\"actions full-width\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n</ng-template>\n\n<!-- Shared calendar grid template -->\n<ng-template #calendarGrid let-dayRows>\n <div class=\"dates-grid\">\n <!-- Week day headers -->\n <div class=\"week-header\">\n <div class=\"cell header-cell\" *ngFor=\"let wd of weekDays\">{{ wd | translate }}</div>\n </div>\n <!-- Day rows -->\n <div class=\"day-row\" *ngFor=\"let row of dayRows\">\n <div class=\"cell day-cell\"\n *ngFor=\"let day of row.days\"\n [class.outside]=\"day.isOutside\"\n [class.selected]=\"day.selected\"\n [class.today]=\"isToday(day)\"\n [class.disabled]=\"day.isDisabled\"\n [class.in-range]=\"isInRange(day)\"\n [class.range-start]=\"isRangeStart(day)\"\n [class.range-end]=\"isRangeEnd(day)\"\n (click)=\"selectDay(day)\">\n <span class=\"day-number\">{{ day.lbl }}</span>\n <span class=\"highlight-dot\" *ngIf=\"day.isHighlighted\"></span>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".dropdown-trigger{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:10px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;cursor:pointer;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#667085;white-space:nowrap;transition:.2s;-webkit-appearance:none;appearance:none;outline:none}.dropdown-trigger:hover{border-color:#98a2b3}.dropdown-trigger.active{box-shadow:0 1px 2px #1018280d,0 0 0 4px #f2f4f7}.dropdown-trigger.has-value{color:#344054}.dropdown-trigger:disabled{cursor:not-allowed;opacity:.5}.dropdown-trigger .trigger-icon{width:20px;height:20px;background-color:#667085}.dropdown-trigger.has-value .trigger-icon{background-color:#344054}.dropdown-menu{display:inline-flex;background:#FFFFFF;border:1px solid #EAECF0;border-radius:8px;box-shadow:0 20px 24px -4px #10182814,0 8px 8px -4px #10182808;font-family:Inter,sans-serif;overflow:hidden;width:max-content}::ng-deep .cdk-overlay-container{position:fixed;z-index:1200;pointer-events:none;top:0;left:0;height:100%;width:100%}::ng-deep .cdk-overlay-backdrop{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:auto;z-index:1200}::ng-deep .cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1201;display:flex;flex-direction:column;min-width:1px;min-height:1px}::ng-deep .zen-date-picker-dropdown-overlay{position:absolute;width:max-content!important;pointer-events:auto}.presets-sidebar{display:flex;flex-direction:column;gap:4px;padding:12px 16px;min-width:160px}.presets-sidebar .preset-item{padding:10px 16px;border-radius:6px;font-size:14px;font-weight:400;line-height:20px;color:#344054;cursor:pointer;white-space:nowrap;transition:.15s}.presets-sidebar .preset-item:hover{background:#F9FAFB}.presets-sidebar .preset-item.active{background:#F9FAFB;font-weight:500}.sidebar-divider{width:1px;background:#EAECF0;align-self:stretch}.calendars-container{display:flex;flex-direction:column}.dual-calendars{display:flex}.calendar-divider{width:1px;background:#EAECF0;align-self:stretch}.calendar-panel{width:328px;overflow:hidden}.calendar-content{display:flex;flex-direction:column;padding:20px 24px;gap:12px}.single-calendar-container{display:flex;flex-direction:column;width:328px}.month-header{display:flex;align-items:center;justify-content:space-between;width:280px}.nav-btn{display:flex;align-items:center;justify-content:center;padding:10px;border-radius:8px;border:none;background:transparent;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s}.nav-btn:hover{background:#F9FAFB}.nav-btn zen-icon{width:20px;height:20px;background-color:#344054}.month-title{font-size:16px;font-weight:500;line-height:24px;color:#344054;text-align:center}.single-actions-row{display:flex;gap:12px;align-items:flex-start;width:280px}.flex-1{flex:1}.btn-today{display:flex;align-items:center;justify-content:center;padding:10px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#344054;cursor:pointer;white-space:nowrap;-webkit-appearance:none;appearance:none;outline:none;transition:.15s}.btn-today:hover{background:#F9FAFB}.mobile-range-inputs{display:flex;align-items:center;gap:8px;height:40px;width:280px}.date-input{display:flex;align-items:center;padding:8px 14px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;min-width:0}.date-input.compact{flex:1}.date-input .date-input-text{font-size:16px;font-weight:400;line-height:24px;color:#101828;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.date-input .date-input-text.placeholder{color:#667085}.date-separator{font-size:16px;font-weight:400;line-height:24px;color:#667085}.dates-grid{display:flex;flex-direction:column;gap:4px}.week-header{display:flex;width:280px}.day-row{display:flex;border-radius:20px;overflow:hidden}.cell{position:relative;width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:20px}.cell .day-number{font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#344054;width:24px}.cell.header-cell .day-number{font-weight:500}.header-cell{font-size:14px;font-weight:500;line-height:20px;color:#344054}.day-cell{cursor:pointer;transition:.1s}.day-cell:hover:not(.disabled):not(.selected){background:#F1F7FE}.day-cell:hover:not(.disabled):not(.selected) .day-number{color:#105494;font-weight:500}.day-cell.outside{cursor:default;pointer-events:none}.day-cell.today{background:#F2F4F7}.day-cell.today .day-number{font-weight:500}.day-cell.selected{background:#136AB6}.day-cell.selected .day-number{color:#fff;font-weight:500}.day-cell.in-range{background:#F1F7FE;border-radius:0}.day-cell.in-range .day-number{color:#105494}.day-cell.range-start{border-radius:20px 0 0 20px}.day-cell.range-end{border-radius:0 20px 20px 0}.day-cell.range-start.range-end{border-radius:20px}.day-cell.disabled{cursor:not-allowed}.day-cell.disabled .day-number{color:#d0d5dd}.day-cell .highlight-dot{position:absolute;bottom:4px;left:50%;transform:translate(-50%);width:5px;height:5px;border-radius:50%;background:#105494}.day-cell.selected .highlight-dot{background:#FFFFFF}.day-cell.outside .highlight-dot{background:#98A2B3}.bottom-divider{height:1px;background:#EAECF0;width:100%}.bottom-panel{display:flex;align-items:flex-start;justify-content:space-between;padding:16px 24px}.bottom-panel.compact{justify-content:flex-end}.input-fields{display:flex;gap:12px;align-items:center}.input-fields .date-input{width:128px}.actions{display:flex;gap:12px}.actions.full-width,.actions.full-width .btn-cancel,.actions.full-width .btn-apply{flex:1}.btn-cancel{display:flex;align-items:center;justify-content:center;padding:10px 16px;min-width:109px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#344054;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s;white-space:nowrap}.btn-cancel:hover{background:#F9FAFB}.btn-apply{display:flex;align-items:center;justify-content:center;padding:10px 16px;min-width:109px;background:#136AB6;border:1px solid #136AB6;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#fff;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s;white-space:nowrap}.btn-apply:hover{background:#105494}.btn-apply:disabled{opacity:.5;cursor:not-allowed}\n"] }]
457
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.Overlay }, { type: i0.ViewContainerRef }, { type: i2.TranslateService }]; }, propDecorators: { type: [{
458
+ type: Input
459
+ }], date: [{
460
+ type: Input
461
+ }], dateChange: [{
462
+ type: Output
463
+ }], startDate: [{
464
+ type: Input
465
+ }], startDateChange: [{
466
+ type: Output
467
+ }], endDate: [{
468
+ type: Input
469
+ }], endDateChange: [{
470
+ type: Output
471
+ }], rangeChange: [{
472
+ type: Output
473
+ }], presets: [{
474
+ type: Input
475
+ }], minDate: [{
476
+ type: Input
477
+ }], maxDate: [{
478
+ type: Input
479
+ }], disabled: [{
480
+ type: Input
481
+ }], highlightDays: [{
482
+ type: Input
483
+ }], placeholder: [{
484
+ type: Input
485
+ }], mobileBreakpoint: [{
486
+ type: Input
487
+ }], triggerBtn: [{
488
+ type: ViewChild,
489
+ args: ['triggerBtn']
490
+ }], dropdownTemplate: [{
491
+ type: ViewChild,
492
+ args: ['dropdownTemplate']
493
+ }], onResize: [{
494
+ type: HostListener,
495
+ args: ['window:resize']
496
+ }], outsideHandling: [{
497
+ type: HostListener,
498
+ args: ['window:mousedown', ['$event']]
499
+ }] } });
500
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVuZHUtZGF0ZS1waWNrZXItZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctemVuZHVpdC9zcmMvbGliL2RhdGUtcGlja2VyLWRyb3Bkb3duL3plbmR1LWRhdGUtcGlja2VyLWRyb3Bkb3duLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9kYXRlLXBpY2tlci1kcm9wZG93bi96ZW5kdS1kYXRlLXBpY2tlci1kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUMxQixNQUFNLEVBQThCLFNBQVMsRUFDOUUsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxNQUFNLE1BQU0sZUFBZSxDQUFDO0FBR25DLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7O0FBSXJELE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFDO0FBTzlCLE1BQU0sT0FBTyxnQ0FBZ0M7SUFrSHpDLFlBQ1ksUUFBb0IsRUFDcEIsT0FBZ0IsRUFDaEIsZ0JBQWtDLEVBQ2xDLFVBQTRCO1FBSDVCLGFBQVEsR0FBUixRQUFRLENBQVk7UUFDcEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNoQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBcEgvQixTQUFJLEdBQTJCLFFBQVEsQ0FBQztRQUN4QyxTQUFJLEdBQWdCLElBQUksQ0FBQztRQUN4QixlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQWUsQ0FBQztRQUU5QyxjQUFTLEdBQWdCLElBQUksQ0FBQztRQUM3QixvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFlLENBQUM7UUFFbkQsWUFBTyxHQUFnQixJQUFJLENBQUM7UUFDM0Isa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO1FBRWhELGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFFbEQsWUFBTyxHQUE4QixJQUFJLENBQUM7UUFDMUMsWUFBTyxHQUFnQixJQUFJLENBQUM7UUFDNUIsWUFBTyxHQUFnQixJQUFJLENBQUM7UUFDNUIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixrQkFBYSxHQUFhLEVBQUUsQ0FBQztRQUM3QixnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUN6QixxQkFBZ0IsR0FBVyxpQkFBaUIsQ0FBQztRQUt0RCxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2YsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUVmLHNCQUFzQjtRQUN0QixvQkFBZSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDN0IsZ0JBQVcsR0FBcUMsRUFBRSxDQUFDO1FBQ25ELGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBRW5CLDJDQUEyQztRQUMzQyxxQkFBZ0IsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQzlCLGlCQUFZLEdBQXFDLEVBQUUsQ0FBQztRQUNwRCxtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUVwQixhQUFRLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV2RCwyQkFBMkI7UUFDM0Isa0JBQWEsR0FBZ0IsSUFBSSxDQUFDO1FBQ2xDLG1CQUFjLEdBQWdCLElBQUksQ0FBQztRQUNuQyxpQkFBWSxHQUFnQixJQUFJLENBQUM7UUFDakMsa0JBQWEsR0FBa0IsSUFBSSxDQUFDO1FBRTVCLGVBQVUsR0FBc0IsSUFBSSxDQUFDO1FBRTdDLG1CQUFjLEdBQXVCO1lBQ2pDO2dCQUNJLEtBQUssRUFBRSxPQUFPO2dCQUNkLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO29CQUNiLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFO29CQUN2QyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRTtpQkFDdEMsQ0FBQzthQUNMO1lBQ0Q7Z0JBQ0ksS0FBSyxFQUFFLFdBQVc7Z0JBQ2xCLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO29CQUNiLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUU7b0JBQzFELEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUU7aUJBQ3pELENBQUM7YUFDTDtZQUNEO2dCQUNJLEtBQUssRUFBRSxXQUFXO2dCQUNsQixRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztvQkFDYixLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtvQkFDM0MsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUU7aUJBQzFDLENBQUM7YUFDTDtZQUNEO2dCQUNJLEtBQUssRUFBRSxXQUFXO2dCQUNsQixRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztvQkFDYixLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFO29CQUMvRCxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFO2lCQUM5RCxDQUFDO2FBQ0w7WUFDRDtnQkFDSSxLQUFLLEVBQUUsWUFBWTtnQkFDbkIsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7b0JBQ2IsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUU7b0JBQ3pDLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFO2lCQUN4QyxDQUFDO2FBQ0w7WUFDRDtnQkFDSSxLQUFLLEVBQUUsWUFBWTtnQkFDbkIsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7b0JBQ2IsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRTtvQkFDOUQsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRTtpQkFDN0QsQ0FBQzthQUNMO1lBQ0Q7Z0JBQ0ksS0FBSyxFQUFFLFdBQVc7Z0JBQ2xCLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO29CQUNiLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFO29CQUN4QyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRTtpQkFDdkMsQ0FBQzthQUNMO1lBQ0Q7Z0JBQ0ksS0FBSyxFQUFFLFdBQVc7Z0JBQ2xCLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO29CQUNiLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUU7b0JBQzVELEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUU7aUJBQzNELENBQUM7YUFDTDtZQUNEO2dCQUNJLEtBQUssRUFBRSxVQUFVO2dCQUNqQixRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztvQkFDYixLQUFLLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzNCLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFO2lCQUN0QyxDQUFDO2FBQ0w7U0FDSixDQUFDO0lBT0UsQ0FBQztJQUVMLFFBQVE7UUFDSixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUdELFFBQVE7UUFDSixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVPLFdBQVc7UUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQzVELENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDOUIsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM1QztRQUNELElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDeEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDbEQ7UUFDRCxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzlDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUdELGVBQWUsQ0FBQyxLQUFpQjtRQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQWMsQ0FBQztZQUFFLE9BQU87UUFDMUQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU87UUFDL0QsbUNBQW1DO1FBQ25DLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQztZQUN0RCxJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFjLENBQUM7Z0JBQUUsT0FBTztTQUMvRTtRQUNELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2IsT0FBTyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDL0MsQ0FBQztJQUVELElBQUksa0JBQWtCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ2pELENBQUM7SUFFRCxJQUFJLGlCQUFpQjtRQUNqQixPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNqRCxDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ1osSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUN4QixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ1gsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNyQztZQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNyRTtRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hDLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1NBQ2xGO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDUixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUTtZQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDL0MsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsSUFBSSxxQkFBcUI7UUFDckIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3pFLENBQUM7SUFFRCxJQUFJLGtCQUFrQjtRQUNsQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDM0UsQ0FBQztJQUVELElBQUksZ0JBQWdCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN2RSxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQVU7UUFDakIsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsTUFBTTtRQUNGLElBQUksSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQzFCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNiLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNoQjthQUFNO1lBQ0gsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2Y7SUFDTCxDQUFDO0lBRUQsSUFBSTtRQUNBLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDNUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN2RSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2pFLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBRTFCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDeEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7U0FDekY7YUFBTTtZQUNILElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3hGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDakY7UUFFRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxLQUFLO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFTyxhQUFhO1FBQ2pCLE1BQU0sUUFBUSxHQUFzQjtZQUNoQyxPQUFPLEVBQUUsS0FBSztZQUNkLE9BQU8sRUFBRSxRQUFRO1lBQ2pCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsUUFBUSxFQUFFLEtBQUs7U0FDbEIsQ0FBQztRQUVGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUU7YUFDM0MsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQzthQUNwQyxhQUFhLENBQUM7WUFDWCxRQUFRO1lBQ1IsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO1lBQ3ZFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtZQUMzRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7U0FDOUUsQ0FBQzthQUNELHNCQUFzQixDQUFDLEtBQUssQ0FBQzthQUM3QixrQkFBa0IsQ0FBQyxDQUFDLENBQUM7YUFDckIsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDbEMsZ0JBQWdCO1lBQ2hCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLGFBQWEsRUFBRSxrQ0FBa0M7WUFDakQsVUFBVSxFQUFFLGtDQUFrQztTQUNqRCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUV6RixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDM0MsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLFlBQVk7UUFDaEIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztTQUMxQjtJQUNMLENBQUM7SUFFRCxzQkFBc0I7SUFDdEIsYUFBYTtRQUNULElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xGLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDakY7UUFDRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELGFBQWE7UUFDVCxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3RSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUN4QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ2pGO1FBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxjQUFjO1FBQ1YsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BGLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbkYsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxjQUFjO1FBQ1YsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQy9FLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbkYsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCx3REFBd0Q7SUFDeEQsU0FBUztRQUNMLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsU0FBUztRQUNMLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsU0FBUyxDQUFDLEdBQWtCO1FBQ3hCLElBQUksR0FBRyxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUMsU0FBUztZQUFFLE9BQU87UUFFNUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMzQzthQUFNO1lBQ0gsd0JBQXdCO1lBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUU7Z0JBQ3BFLHNCQUFzQjtnQkFDdEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2dCQUN6QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQzthQUM3QjtpQkFBTTtnQkFDSCxxQkFBcUI7Z0JBQ3JCLE1BQU0sT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRTtvQkFDL0MsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBQ2xELElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDO2lCQUNqQztxQkFBTTtvQkFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQztpQkFDL0I7YUFDSjtTQUNKO1FBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxZQUFZLENBQUMsTUFBd0I7UUFDakMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDakY7UUFDRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELFNBQVM7UUFDTCxNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsS0FBSztRQUNELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDeEIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDekMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ25DO1NBQ0o7YUFBTTtZQUNILElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtnQkFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUM3QztZQUNELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUN6QztZQUNELElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUMxQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQzthQUN2RTtTQUNKO1FBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFRCxNQUFNO1FBQ0YsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDUixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUTtZQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDeEQsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRU8sZUFBZTtRQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDOUMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDbkQ7SUFDTCxDQUFDO0lBRU8sVUFBVSxDQUFDLElBQVUsRUFBRSxJQUFzQjtRQUNqRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFL0MsTUFBTSxPQUFPLEdBQXFDLEVBQUUsQ0FBQztRQUNyRCxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFMUMsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2hDLE1BQU0sR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQXFCLEVBQUUsQ0FBQztZQUM1QyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xCLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQzlCLE1BQU0sU0FBUyxHQUFHLFlBQVksS0FBSyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBRW5ELElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztnQkFDdkIsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUNqRCxVQUFVLEdBQUcsSUFBSSxDQUFDO2lCQUNyQjtxQkFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ3hELFVBQVUsR0FBRyxJQUFJLENBQUM7aUJBQ3JCO2dCQUVELElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztnQkFDMUIsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFO29CQUNqRCxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUN0RTtnQkFFRCxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFbkUsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ1YsSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUU7b0JBQ3RCLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtvQkFDL0MsU0FBUztvQkFDVCxRQUFRLEVBQUUsVUFBVTtvQkFDcEIsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVO29CQUN6QyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGFBQWE7aUJBQ25ELENBQUMsQ0FBQztnQkFFSCxPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDM0M7U0FDSjtRQUVELElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUNqQixJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztZQUMzQixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztTQUM5QjthQUFNO1lBQ0gsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUM7WUFDNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7U0FDL0I7SUFDTCxDQUFDO0lBRU8sYUFBYSxDQUFDLElBQW1CO1FBQ3JDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDeEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztTQUN0RjtRQUNELElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDeEYsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNwRixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQWtCO1FBQ3RCLElBQUksR0FBRyxDQUFDLFNBQVM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNoQyxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxTQUFTLENBQUMsR0FBa0I7UUFDeEIsSUFBSSxHQUFHLENBQUMsU0FBUztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2hDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN0RixNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN6RyxDQUFDO0lBRUQsWUFBWSxDQUFDLEdBQWtCO1FBQzNCLElBQUksR0FBRyxDQUFDLFNBQVM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNoQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNoRSxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELFVBQVUsQ0FBQyxHQUFrQjtRQUN6QixJQUFJLEdBQUcsQ0FBQyxTQUFTO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDaEMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDOUQsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JFLENBQUM7OzhIQXhlUSxnQ0FBZ0M7a0hBQWhDLGdDQUFnQyw0eEJDbEI3Qyw4Z1VBeU1BOzRGRHZMYSxnQ0FBZ0M7a0JBTDVDLFNBQVM7K0JBQ0ksMEJBQTBCO3FMQU0zQixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNJLFVBQVU7c0JBQW5CLE1BQU07Z0JBRUUsU0FBUztzQkFBakIsS0FBSztnQkFDSSxlQUFlO3NCQUF4QixNQUFNO2dCQUVFLE9BQU87c0JBQWYsS0FBSztnQkFDSSxhQUFhO3NCQUF0QixNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBRUUsT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVtQixVQUFVO3NCQUFsQyxTQUFTO3VCQUFDLFlBQVk7Z0JBQ1EsZ0JBQWdCO3NCQUE5QyxTQUFTO3VCQUFDLGtCQUFrQjtnQkF1RzdCLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxlQUFlO2dCQTBCN0IsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCxcbiAgICBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudC9tb21lbnQnO1xuaW1wb3J0IHsgRGF0ZVBpY2tlckRheSB9IGZyb20gJy4uL2RhdGVwaWNrZXIvZGF0ZS1waWNrZXItZGF5JztcbmltcG9ydCB7IE92ZXJsYXksIE92ZXJsYXlSZWYsIENvbm5lY3RlZFBvc2l0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IERhdGVQaWNrZXJEcm9wZG93blR5cGUsIERhdGVQaWNrZXJQcmVzZXQsIERhdGVSYW5nZVZhbHVlIH0gZnJvbSAnLi9kYXRlLXBpY2tlci1kcm9wZG93bi50eXBlcyc7XG5cbmNvbnN0IE1PQklMRV9CUkVBS1BPSU5UID0gNzY4O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3plbi1kYXRlLXBpY2tlci1kcm9wZG93bicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3plbmR1LWRhdGUtcGlja2VyLWRyb3Bkb3duLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi96ZW5kdS1kYXRlLXBpY2tlci1kcm9wZG93bi5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFplbmR1RGF0ZVBpY2tlckRyb3Bkb3duQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG5cbiAgICBASW5wdXQoKSB0eXBlOiBEYXRlUGlja2VyRHJvcGRvd25UeXBlID0gJ3NpbmdsZSc7XG4gICAgQElucHV0KCkgZGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIEBPdXRwdXQoKSBkYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlIHwgbnVsbD4oKTtcblxuICAgIEBJbnB1dCgpIHN0YXJ0RGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIEBPdXRwdXQoKSBzdGFydERhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGUgfCBudWxsPigpO1xuXG4gICAgQElucHV0KCkgZW5kRGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIEBPdXRwdXQoKSBlbmREYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlIHwgbnVsbD4oKTtcblxuICAgIEBPdXRwdXQoKSByYW5nZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZVJhbmdlVmFsdWU+KCk7XG5cbiAgICBASW5wdXQoKSBwcmVzZXRzOiBEYXRlUGlja2VyUHJlc2V0W10gfCBudWxsID0gbnVsbDtcbiAgICBASW5wdXQoKSBtaW5EYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgQElucHV0KCkgbWF4RGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgaGlnaGxpZ2h0RGF5czogbnVtYmVyW10gPSBbXTtcbiAgICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG4gICAgQElucHV0KCkgbW9iaWxlQnJlYWtwb2ludDogbnVtYmVyID0gTU9CSUxFX0JSRUFLUE9JTlQ7XG5cbiAgICBAVmlld0NoaWxkKCd0cmlnZ2VyQnRuJykgdHJpZ2dlckJ0biE6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnZHJvcGRvd25UZW1wbGF0ZScpIGRyb3Bkb3duVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICAgIG1vYmlsZSA9IGZhbHNlO1xuICAgIGlzT3BlbiA9IGZhbHNlO1xuXG4gICAgLy8gTGVmdCBjYWxlbmRhciBzdGF0ZVxuICAgIGxlZnRDdXJyZW50U2xvdCA9IG5ldyBEYXRlKCk7XG4gICAgbGVmdERheVJvd3M6IEFycmF5PHsgZGF5czogRGF0ZVBpY2tlckRheVtdIH0+ID0gW107XG4gICAgbGVmdERheXNUaXRsZSA9ICcnO1xuXG4gICAgLy8gUmlnaHQgY2FsZW5kYXIgc3RhdGUgKGZvciByYW5nZSBkZXNrdG9wKVxuICAgIHJpZ2h0Q3VycmVudFNsb3QgPSBuZXcgRGF0ZSgpO1xuICAgIHJpZ2h0RGF5Um93czogQXJyYXk8eyBkYXlzOiBEYXRlUGlja2VyRGF5W10gfT4gPSBbXTtcbiAgICByaWdodERheXNUaXRsZSA9ICcnO1xuXG4gICAgd2Vla0RheXMgPSBbJ01vJywgJ1R1JywgJ1dlJywgJ1RoJywgJ0ZyJywgJ1NhdCcsICdTdSddO1xuXG4gICAgLy8gSW50ZXJuYWwgc2VsZWN0aW9uIHN0YXRlXG4gICAgX3NlbGVjdGVkRGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIF9zZWxlY3RlZFN0YXJ0OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgX3NlbGVjdGVkRW5kOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgX2FjdGl2ZVByZXNldDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcml2YXRlIG92ZXJsYXlSZWY6IE92ZXJsYXlSZWYgfCBudWxsID0gbnVsbDtcblxuICAgIGRlZmF1bHRQcmVzZXRzOiBEYXRlUGlja2VyUHJlc2V0W10gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnVG9kYXknLFxuICAgICAgICAgICAgZ2V0UmFuZ2U6ICgpID0+ICh7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IG1vbWVudCgpLnN0YXJ0T2YoJ2RheScpLnRvRGF0ZSgpLFxuICAgICAgICAgICAgICAgIGVuZDogbW9tZW50KCkuZW5kT2YoJ2RheScpLnRvRGF0ZSgpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ1llc3RlcmRheScsXG4gICAgICAgICAgICBnZXRSYW5nZTogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICBzdGFydDogbW9tZW50KCkuc3VidHJhY3QoMSwgJ2RheScpLnN0YXJ0T2YoJ2RheScpLnRvRGF0ZSgpLFxuICAgICAgICAgICAgICAgIGVuZDogbW9tZW50KCkuc3VidHJhY3QoMSwgJ2RheScpLmVuZE9mKCdkYXknKS50b0RhdGUoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdUaGlzIHdlZWsnLFxuICAgICAgICAgICAgZ2V0UmFuZ2U6ICgpID0+ICh7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IG1vbWVudCgpLnN0YXJ0T2YoJ2lzb1dlZWsnKS50b0RhdGUoKSxcbiAgICAgICAgICAgICAgICBlbmQ6IG1vbWVudCgpLmVuZE9mKCdpc29XZWVrJykudG9EYXRlKClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnTGFzdCB3ZWVrJyxcbiAgICAgICAgICAgIGdldFJhbmdlOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgIHN0YXJ0OiBtb21lbnQoKS5zdWJ0cmFjdCgxLCAnd2VlaycpLnN0YXJ0T2YoJ2lzb1dlZWsnKS50b0RhdGUoKSxcbiAgICAgICAgICAgICAgICBlbmQ6IG1vbWVudCgpLnN1YnRyYWN0KDEsICd3ZWVrJykuZW5kT2YoJ2lzb1dlZWsnKS50b0RhdGUoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdUaGlzIG1vbnRoJyxcbiAgICAgICAgICAgIGdldFJhbmdlOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgIHN0YXJ0OiBtb21lbnQoKS5zdGFydE9mKCdtb250aCcpLnRvRGF0ZSgpLFxuICAgICAgICAgICAgICAgIGVuZDogbW9tZW50KCkuZW5kT2YoJ21vbnRoJykudG9EYXRlKClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnTGFzdCBtb250aCcsXG4gICAgICAgICAgICBnZXRSYW5nZTogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICBzdGFydDogbW9tZW50KCkuc3VidHJhY3QoMSwgJ21vbnRoJykuc3RhcnRPZignbW9udGgnKS50b0RhdGUoKSxcbiAgICAgICAgICAgICAgICBlbmQ6IG1vbWVudCgpLnN1YnRyYWN0KDEsICdtb250aCcpLmVuZE9mKCdtb250aCcpLnRvRGF0ZSgpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ1RoaXMgeWVhcicsXG4gICAgICAgICAgICBnZXRSYW5nZTogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICBzdGFydDogbW9tZW50KCkuc3RhcnRPZigneWVhcicpLnRvRGF0ZSgpLFxuICAgICAgICAgICAgICAgIGVuZDogbW9tZW50KCkuZW5kT2YoJ3llYXInKS50b0RhdGUoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdMYXN0IHllYXInLFxuICAgICAgICAgICAgZ2V0UmFuZ2U6ICgpID0+ICh7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IG1vbWVudCgpLnN1YnRyYWN0KDEsICd5ZWFyJykuc3RhcnRPZigneWVhcicpLnRvRGF0ZSgpLFxuICAgICAgICAgICAgICAgIGVuZDogbW9tZW50KCkuc3VidHJhY3QoMSwgJ3llYXInKS5lbmRPZigneWVhcicpLnRvRGF0ZSgpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ0FsbCB0aW1lJyxcbiAgICAgICAgICAgIGdldFJhbmdlOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgIHN0YXJ0OiBuZXcgRGF0ZSgyMDAwLCAwLCAxKSxcbiAgICAgICAgICAgICAgICBlbmQ6IG1vbWVudCgpLmVuZE9mKCdkYXknKS50b0RhdGUoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIF07XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBfZWxlbWVudDogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5LFxuICAgICAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHByaXZhdGUgX3RyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZVxuICAgICkgeyB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jaGVja01vYmlsZSgpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICAgIG9uUmVzaXplKCkge1xuICAgICAgICB0aGlzLmNoZWNrTW9iaWxlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja01vYmlsZSgpIHtcbiAgICAgICAgdGhpcy5tb2JpbGUgPSB3aW5kb3cuaW5uZXJXaWR0aCA8IHRoaXMubW9iaWxlQnJlYWtwb2ludDtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzWydkYXRlJ10gJiYgdGhpcy5kYXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZERhdGUgPSBuZXcgRGF0ZSh0aGlzLmRhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzWydzdGFydERhdGUnXSAmJiB0aGlzLnN0YXJ0RGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRTdGFydCA9IG5ldyBEYXRlKHRoaXMuc3RhcnREYXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlc1snZW5kRGF0ZSddICYmIHRoaXMuZW5kRGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRFbmQgPSBuZXcgRGF0ZSh0aGlzLmVuZERhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2xvc2VPdmVybGF5KCk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93Om1vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gICAgb3V0c2lkZUhhbmRsaW5nKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmICghZG9jdW1lbnQuYm9keS5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSByZXR1cm47XG4gICAgICAgIC8vIENoZWNrIGlmIGNsaWNrIGlzIGluc2lkZSBvdmVybGF5XG4gICAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlFbGVtZW50ID0gdGhpcy5vdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50O1xuICAgICAgICAgICAgaWYgKG92ZXJsYXlFbGVtZW50ICYmIG92ZXJsYXlFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBnZXQgYWN0aXZlUHJlc2V0cygpOiBEYXRlUGlja2VyUHJlc2V0W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVzZXRzIHx8IHRoaXMuZGVmYXVsdFByZXNldHM7XG4gICAgfVxuXG4gICAgZ2V0IHNob3dQcmVzZXRzU2lkZWJhcigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ3JhbmdlJyAmJiAhdGhpcy5tb2JpbGU7XG4gICAgfVxuXG4gICAgZ2V0IHNob3dEdWFsQ2FsZW5kYXJzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09PSAncmFuZ2UnICYmICF0aGlzLm1vYmlsZTtcbiAgICB9XG5cbiAgICBnZXQgdHJpZ2dlckxhYmVsKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0RGF0ZSh0aGlzLmRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGxhY2Vob2xkZXIgfHwgdGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ1NlbGVjdCBkYXRlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3RhcnREYXRlICYmIHRoaXMuZW5kRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGAke3RoaXMuZm9ybWF0RGF0ZSh0aGlzLnN0YXJ0RGF0ZSl9IC0gJHt0aGlzLmZvcm1hdERhdGUodGhpcy5lbmREYXRlKX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBsYWNlaG9sZGVyIHx8IHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCdTZWxlY3QgZGF0ZXMnKTtcbiAgICB9XG5cbiAgICBnZXQgaGFzVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdzaW5nbGUnKSByZXR1cm4gISF0aGlzLmRhdGU7XG4gICAgICAgIHJldHVybiAhISh0aGlzLnN0YXJ0RGF0ZSAmJiB0aGlzLmVuZERhdGUpO1xuICAgIH1cblxuICAgIGdldCBmb3JtYXR0ZWRTZWxlY3RlZERhdGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkRGF0ZSA/IHRoaXMuZm9ybWF0RGF0ZSh0aGlzLl9zZWxlY3RlZERhdGUpIDogJyc7XG4gICAgfVxuXG4gICAgZ2V0IGZvcm1hdHRlZFN0YXJ0RGF0ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRTdGFydCA/IHRoaXMuZm9ybWF0RGF0ZSh0aGlzLl9zZWxlY3RlZFN0YXJ0KSA6ICcnO1xuICAgIH1cblxuICAgIGdldCBmb3JtYXR0ZWRFbmREYXRlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZEVuZCA/IHRoaXMuZm9ybWF0RGF0ZSh0aGlzLl9zZWxlY3RlZEVuZCkgOiAnJztcbiAgICB9XG5cbiAgICBmb3JtYXREYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBlbk1vbnRoID0gbW9tZW50KGRhdGUpLmZvcm1hdCgnTU1NJyk7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWRNb250aCA9IHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KGVuTW9udGgpO1xuICAgICAgICByZXR1cm4gbW9tZW50KGRhdGUpLmZvcm1hdCgnTU1NIEQsIFlZWVknKS5yZXBsYWNlKGVuTW9udGgsIHRyYW5zbGF0ZWRNb250aCk7XG4gICAgfVxuXG4gICAgdG9nZ2xlKCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3BlbigpIHtcbiAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICB0aGlzLl9zZWxlY3RlZERhdGUgPSB0aGlzLmRhdGUgPyBuZXcgRGF0ZSh0aGlzLmRhdGUpIDogbnVsbDtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRTdGFydCA9IHRoaXMuc3RhcnREYXRlID8gbmV3IERhdGUodGhpcy5zdGFydERhdGUpIDogbnVsbDtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRFbmQgPSB0aGlzLmVuZERhdGUgPyBuZXcgRGF0ZSh0aGlzLmVuZERhdGUpIDogbnVsbDtcbiAgICAgICAgdGhpcy5fYWN0aXZlUHJlc2V0ID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgdGhpcy5sZWZ0Q3VycmVudFNsb3QgPSB0aGlzLl9zZWxlY3RlZERhdGUgPyBuZXcgRGF0ZSh0aGlzLl9zZWxlY3RlZERhdGUpIDogbmV3IERhdGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGVmdEN1cnJlbnRTbG90ID0gdGhpcy5fc2VsZWN0ZWRTdGFydCA/IG5ldyBEYXRlKHRoaXMuX3NlbGVjdGVkU3RhcnQpIDogbmV3IERhdGUoKTtcbiAgICAgICAgICAgIHRoaXMucmlnaHRDdXJyZW50U2xvdCA9IG1vbWVudCh0aGlzLmxlZnRDdXJyZW50U2xvdCkuYWRkKDEsICdtb250aCcpLnRvRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVPdmVybGF5KCk7XG4gICAgfVxuXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2xvc2VPdmVybGF5KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVPdmVybGF5KCkge1xuICAgICAgICBjb25zdCBwb3NpdGlvbjogQ29ubmVjdGVkUG9zaXRpb24gPSB7XG4gICAgICAgICAgICBvcmlnaW5YOiAnZW5kJyxcbiAgICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgICAgICAgb3ZlcmxheVk6ICd0b3AnXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMub3ZlcmxheS5wb3NpdGlvbigpXG4gICAgICAgICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLnRyaWdnZXJCdG4pXG4gICAgICAgICAgICAud2l0aFBvc2l0aW9ucyhbXG4gICAgICAgICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgeyBvcmlnaW5YOiAnZW5kJywgb3JpZ2luWTogJ3RvcCcsIG92ZXJsYXlYOiAnZW5kJywgb3ZlcmxheVk6ICdib3R0b20nIH0sXG4gICAgICAgICAgICAgICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAnYm90dG9tJywgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAndG9wJyB9LFxuICAgICAgICAgICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcsIG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ2JvdHRvbScgfVxuICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIC53aXRoRmxleGlibGVEaW1lbnNpb25zKGZhbHNlKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0T2Zmc2V0WSg4KVxuICAgICAgICAgICAgLndpdGhQdXNoKGZhbHNlKTtcblxuICAgICAgICB0aGlzLm92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHtcbiAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3ksXG4gICAgICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6ICdjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCcsXG4gICAgICAgICAgICBwYW5lbENsYXNzOiAnemVuLWRhdGUtcGlja2VyLWRyb3Bkb3duLW92ZXJsYXknLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLmRyb3Bkb3duVGVtcGxhdGUsIHRoaXMudmlld0NvbnRhaW5lclJlZikpO1xuXG4gICAgICAgIHRoaXMub3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbG9zZU92ZXJsYXkoKSB7XG4gICAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZi5kZXRhY2goKTtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZi5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlSZWYgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FsZW5kYXIgbmF2aWdhdGlvblxuICAgIGxlZnRQcmV2TW9udGgoKSB7XG4gICAgICAgIHRoaXMubGVmdEN1cnJlbnRTbG90ID0gbW9tZW50KHRoaXMubGVmdEN1cnJlbnRTbG90KS5zdWJ0cmFjdCgxLCAnbW9udGgnKS50b0RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvd0R1YWxDYWxlbmRhcnMpIHtcbiAgICAgICAgICAgIHRoaXMucmlnaHRDdXJyZW50U2xvdCA9IG1vbWVudCh0aGlzLmxlZnRDdXJyZW50U2xvdCkuYWRkKDEsICdtb250aCcpLnRvRGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gICAgfVxuXG4gICAgbGVmdE5leHRNb250aCgpIHtcbiAgICAgICAgdGhpcy5sZWZ0Q3VycmVudFNsb3QgPSBtb21lbnQodGhpcy5sZWZ0Q3VycmVudFNsb3QpLmFkZCgxLCAnbW9udGgnKS50b0RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvd0R1YWxDYWxlbmRhcnMpIHtcbiAgICAgICAgICAgIHRoaXMucmlnaHRDdXJyZW50U2xvdCA9IG1vbWVudCh0aGlzLmxlZnRDdXJyZW50U2xvdCkuYWRkKDEsICdtb250aCcpLnRvRGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gICAgfVxuXG4gICAgcmlnaHRQcmV2TW9udGgoKSB7XG4gICAgICAgIHRoaXMucmlnaHRDdXJyZW50U2xvdCA9IG1vbWVudCh0aGlzLnJpZ2h0Q3VycmVudFNsb3QpLnN1YnRyYWN0KDEsICdtb250aCcpLnRvRGF0ZSgpO1xuICAgICAgICB0aGlzLmxlZnRDdXJyZW50U2xvdCA9IG1vbWVudCh0aGlzLnJpZ2h0Q3VycmVudFNsb3QpLnN1YnRyYWN0KDEsICdtb250aCcpLnRvRGF0ZSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNhbGVuZGFycygpO1xuICAgIH1cblxuICAgIHJpZ2h0TmV4dE1vbnRoKCkge1xuICAgICAgICB0aGlzLnJpZ2h0Q3VycmVudFNsb3QgPSBtb21lbnQodGhpcy5yaWdodEN1cnJlbnRTbG90KS5hZGQoMSwgJ21vbnRoJykudG9EYXRlKCk7XG4gICAgICAgIHRoaXMubGVmdEN1cnJlbnRTbG90ID0gbW9tZW50KHRoaXMucmlnaHRDdXJyZW50U2xvdCkuc3VidHJhY3QoMSwgJ21vbnRoJykudG9EYXRlKCk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gICAgfVxuXG4gICAgLy8gRm9yIG1vYmlsZS9zaW5nbGUgbW9kZSB3aGVuIHRoZXJlJ3Mgb25seSBvbmUgY2FsZW5kYXJcbiAgICBwcmV2TW9udGgoKSB7XG4gICAgICAgIHRoaXMubGVmdFByZXZNb250aCgpO1xuICAgIH1cblxuICAgIG5leHRNb250aCgpIHtcbiAgICAgICAgdGhpcy5sZWZ0TmV4dE1vbnRoKCk7XG4gICAgfVxuXG4gICAgc2VsZWN0RGF5KGRheTogRGF0ZVBpY2tlckRheSkge1xuICAgICAgICBpZiAoZGF5LmlzRGlzYWJsZWQgfHwgZGF5LmlzT3V0c2lkZSkgcmV0dXJuO1xuXG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZERhdGUgPSBuZXcgRGF0ZShkYXkuZGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBSYW5nZSBzZWxlY3Rpb24gbG9naWNcbiAgICAgICAgICAgIGlmICghdGhpcy5fc2VsZWN0ZWRTdGFydCB8fCAodGhpcy5fc2VsZWN0ZWRTdGFydCAmJiB0aGlzLl9zZWxlY3RlZEVuZCkpIHtcbiAgICAgICAgICAgICAgICAvLyBTdGFydCBuZXcgc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRTdGFydCA9IG5ldyBEYXRlKGRheS5kYXRlKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEVuZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlUHJlc2V0ID0gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQ29tcGxldGUgdGhlIHJhbmdlXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKGRheS5kYXRlKTtcbiAgICAgICAgICAgICAgICBpZiAobW9tZW50KG5ld0RhdGUpLmlzQmVmb3JlKHRoaXMuX3NlbGVjdGVkU3RhcnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkRW5kID0gbmV3IERhdGUodGhpcy5fc2VsZWN0ZWRTdGFydCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkU3RhcnQgPSBuZXdEYXRlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkRW5kID0gbmV3RGF0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgICB9XG5cbiAgICBzZWxlY3RQcmVzZXQocHJlc2V0OiBEYXRlUGlja2VyUHJlc2V0KSB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gcHJlc2V0LmdldFJhbmdlKCk7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkU3RhcnQgPSByYW5nZS5zdGFydDtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRFbmQgPSByYW5nZS5lbmQ7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVByZXNldCA9IHByZXNldC5sYWJlbDtcbiAgICAgICAgdGhpcy5sZWZ0Q3VycmVudFNsb3QgPSBuZXcgRGF0ZShyYW5nZS5zdGFydCk7XG4gICAgICAgIGlmICh0aGlzLnNob3dEdWFsQ2FsZW5kYXJzKSB7XG4gICAgICAgICAgICB0aGlzLnJpZ2h0Q3VycmVudFNsb3QgPSBtb21lbnQodGhpcy5sZWZ0Q3VycmVudFNsb3QpLmFkZCgxLCAnbW9udGgnKS50b0RhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUNhbGVuZGFycygpO1xuICAgIH1cblxuICAgIGdvVG9Ub2RheSgpIHtcbiAgICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB0aGlzLl9zZWxlY3RlZERhdGUgPSBtb21lbnQodG9kYXkpLnN0YXJ0T2YoJ2RheScpLnRvRGF0ZSgpO1xuICAgICAgICB0aGlzLmxlZnRDdXJyZW50U2xvdCA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICAgICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgICB9XG5cbiAgICBhcHBseSgpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZERhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGUgPSBuZXcgRGF0ZSh0aGlzLl9zZWxlY3RlZERhdGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZUNoYW5nZS5lbWl0KHRoaXMuZGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWRTdGFydCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlID0gbmV3IERhdGUodGhpcy5fc2VsZWN0ZWRTdGFydCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydERhdGVDaGFuZ2UuZW1pdCh0aGlzLnN0YXJ0RGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWRFbmQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZERhdGUgPSBuZXcgRGF0ZSh0aGlzLl9zZWxlY3RlZEVuZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmREYXRlQ2hhbmdlLmVtaXQodGhpcy5lbmREYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZFN0YXJ0ICYmIHRoaXMuX3NlbGVjdGVkRW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yYW5nZUNoYW5nZS5lbWl0KHsgc3RhcnQ6IHRoaXMuc3RhcnREYXRlLCBlbmQ6IHRoaXMuZW5kRGF0ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgY2FuY2VsKCkge1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgZ2V0IGNhbkFwcGx5KCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnc2luZ2xlJykgcmV0dXJuICEhdGhpcy5fc2VsZWN0ZWREYXRlO1xuICAgICAgICByZXR1cm4gISEodGhpcy5fc2VsZWN0ZWRTdGFydCAmJiB0aGlzLl9zZWxlY3RlZEVuZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVDYWxlbmRhcnMoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRGF5cyh0aGlzLmxlZnRDdXJyZW50U2xvdCwgJ2xlZnQnKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvd0R1YWxDYWxlbmRhcnMpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGF5cyh0aGlzLnJpZ2h0Q3VycmVudFNsb3QsICdyaWdodCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVEYXlzKHNsb3Q6IERhdGUsIHNpZGU6ICdsZWZ0JyB8ICdyaWdodCcpIHtcbiAgICAgICAgY29uc3QgZW5Nb250aCA9IG1vbWVudChzbG90KS5mb3JtYXQoJ01NTScpO1xuICAgICAgICBjb25zdCB0cmFuc2xhdGVkTW9udGggPSB0aGlzLl90cmFuc2xhdGUuaW5zdGFudChlbk1vbnRoKTtcbiAgICAgICAgY29uc3QgdGl0bGUgPSBtb21lbnQoc2xvdCkuZm9ybWF0KCdNTU1NIFlZWVknKTtcblxuICAgICAgICBjb25zdCBkYXlSb3dzOiBBcnJheTx7IGRheXM6IERhdGVQaWNrZXJEYXlbXSB9PiA9IFtdO1xuICAgICAgICBsZXQgY3VycmVudCA9IG1vbWVudChzbG90KS5zdGFydE9mKCdtb250aCcpLnN0YXJ0T2YoJ2lzb1dlZWsnKTtcbiAgICAgICAgY29uc3QgZW5kID0gbW9tZW50KHNsb3QpLmVuZE9mKCdtb250aCcpLmVuZE9mKCdpc29XZWVrJyk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNb250aCA9IG1vbWVudChzbG90KS5tb250aCgpO1xuXG4gICAgICAgIHdoaWxlIChjdXJyZW50LmlzU2FtZU9yQmVmb3JlKGVuZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IHsgZGF5czogW10gYXMgRGF0ZVBpY2tlckRheVtdIH07XG4gICAgICAgICAgICBkYXlSb3dzLnB1c2gocm93KTtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IDc7IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNPdXRzaWRlID0gY3VycmVudE1vbnRoICE9PSBjdXJyZW50Lm1vbnRoKCk7XG5cbiAgICAgICAgICAgICAgICBsZXQgaXNEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1pbkRhdGUgJiYgY3VycmVudC50b0RhdGUoKSA8IHRoaXMubWluRGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpc0Rpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWF4RGF0ZSAmJiBjdXJyZW50LnRvRGF0ZSgpID4gdGhpcy5tYXhEYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBpc0hpZ2hsaWdodGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0RGF5cyAmJiB0aGlzLmhpZ2hsaWdodERheXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzSGlnaGxpZ2h0ZWQgPSB0aGlzLmhpZ2hsaWdodERheXMuaW5kZXhPZihjdXJyZW50LnZhbHVlT2YoKSkgPj0gMDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gaXNPdXRzaWRlID8gZmFsc2UgOiB0aGlzLmlzRGF5U2VsZWN0ZWQoY3VycmVudCk7XG5cbiAgICAgICAgICAgICAgICByb3cuZGF5cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZTogY3VycmVudC50b0RhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgbGJsOiBpc091dHNpZGUgPyAnJyA6IGN1cnJlbnQuZGF0ZSgpLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgIGlzT3V0c2lkZSxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGlzU2VsZWN0ZWQsXG4gICAgICAgICAgICAgICAgICAgIGlzRGlzYWJsZWQ6IGlzT3V0c2lkZSA/IHRydWUgOiBpc0Rpc2FibGVkLFxuICAgICAgICAgICAgICAgICAgICBpc0hpZ2hsaWdodGVkOiBpc091dHNpZGUgPyBmYWxzZSA6IGlzSGlnaGxpZ2h0ZWRcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNsb25lKCkuYWRkKDEsICdkYXknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaWRlID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgIHRoaXMubGVmdERheVJvd3MgPSBkYXlSb3dzO1xuICAgICAgICAgICAgdGhpcy5sZWZ0RGF5c1RpdGxlID0gdGl0bGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJpZ2h0RGF5Um93cyA9IGRheVJvd3M7XG4gICAgICAgICAgICB0aGlzLnJpZ2h0RGF5c1RpdGxlID0gdGl0bGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRGF5U2VsZWN0ZWQoZGF0ZTogbW9tZW50Lk1vbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkRGF0ZSA/IGRhdGUuaXNTYW1lKG1vbWVudCh0aGlzLl9zZWxlY3RlZERhdGUpLCAnZGF5JykgOiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWRTdGFydCAmJiBkYXRlLmlzU2FtZShtb21lbnQodGhpcy5fc2VsZWN0ZWRTdGFydCksICdkYXknKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZEVuZCAmJiBkYXRlLmlzU2FtZShtb21lbnQodGhpcy5fc2VsZWN0ZWRFbmQpLCAnZGF5JykpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaXNUb2RheShkYXk6IERhdGVQaWNrZXJEYXkpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGRheS5pc091dHNpZGUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG1vbWVudChkYXkuZGF0ZSkuaXNTYW1lKG1vbWVudCgpLCAnZGF5Jyk7XG4gICAgfVxuXG4gICAgaXNJblJhbmdlKGRheTogRGF0ZVBpY2tlckRheSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoZGF5LmlzT3V0c2lkZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy50eXBlICE9PSAncmFuZ2UnIHx8ICF0aGlzLl9zZWxlY3RlZFN0YXJ0IHx8ICF0aGlzLl9zZWxlY3RlZEVuZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBkID0gbW9tZW50KGRheS5kYXRlKTtcbiAgICAgICAgcmV0dXJuIGQuaXNBZnRlcihtb21lbnQodGhpcy5fc2VsZWN0ZWRTdGFydCksICdkYXknKSAmJiBkLmlzQmVmb3JlKG1vbWVudCh0aGlzLl9zZWxlY3RlZEVuZCksICdkYXknKTtcbiAgICB9XG5cbiAgICBpc1JhbmdlU3RhcnQoZGF5OiBEYXRlUGlja2VyRGF5KTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChkYXkuaXNPdXRzaWRlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09ICdyYW5nZScgfHwgIXRoaXMuX3NlbGVjdGVkU3RhcnQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG1vbWVudChkYXkuZGF0ZSkuaXNTYW1lKG1vbWVudCh0aGlzLl9zZWxlY3RlZFN0YXJ0KSwgJ2RheScpO1xuICAgIH1cblxuICAgIGlzUmFuZ2VFbmQoZGF5OiBEYXRlUGlja2VyRGF5KTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChkYXkuaXNPdXRzaWRlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09ICdyYW5nZScgfHwgIXRoaXMuX3NlbGVjdGVkRW5kKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBtb21lbnQoZGF5LmRhdGUpLmlzU2FtZShtb21lbnQodGhpcy5fc2VsZWN0ZWRFbmQpLCAnZGF5Jyk7XG4gICAgfVxufVxuIiwiPCEtLSBUcmlnZ2VyIEJ1dHRvbiAtLT5cbjxidXR0b24gY2xhc3M9XCJkcm9wZG93bi10cmlnZ2VyXCJcbiAgICAgICAgI3RyaWdnZXJCdG5cbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpc09wZW5cIlxuICAgICAgICBbY2xhc3MuaGFzLXZhbHVlXT1cImhhc1ZhbHVlXCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZSgpXCI+XG4gICAgPHplbi1pY29uIGNsYXNzPVwidHJpZ2dlci1pY29uXCJcbiAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvY2FsZW5kYXIuc3ZnXCI+XG4gICAgPC96ZW4taWNvbj5cbiAgICA8c3BhbiBjbGFzcz1cInRyaWdnZXItbGFiZWxcIj57eyB0cmlnZ2VyTGFiZWwgfX08L3NwYW4+XG48L2J1dHRvbj5cblxuPCEtLSBEcm9wZG93biBQYW5lbCAtLT5cbjxuZy10ZW1wbGF0ZSAjZHJvcGRvd25UZW1wbGF0ZT5cbiAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIFtjbGFzcy5tb2JpbGVdPVwibW9iaWxlXCI+XG4gICAgICAgIDwhLS0gUkFOR0UgREVTS1RPUDogcHJlc2V0cyBzaWRlYmFyICsgZHVhbCBjYWxlbmRhciAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInR5cGUgPT09ICdyYW5nZScgJiYgIW1vYmlsZVwiPlxuICAgICAgICAgICAgPCEtLSBQcmVzZXRzIHNpZGViYXIgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJlc2V0cy1zaWRlYmFyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByZXNldC1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBwcmVzZXQgb2YgYWN0aXZlUHJlc2V0c1wiXG4gICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cIl9hY3RpdmVQcmVzZXQgPT09IHByZXNldC5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UHJlc2V0KHByZXNldClcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgcHJlc2V0LmxhYmVsIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpZGViYXItZGl2aWRlclwiPjwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIENhbGVuZGFycyArIGJvdHRvbSBwYW5lbCAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhcnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR1YWwtY2FsZW5kYXJzXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTGVmdCBjYWxlbmRhciAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLXBhbmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb250aC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdi1idG5cIiAoY2xpY2spPVwibGVmdFByZXZNb250aCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWljb24gc3JjPVwiYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvYXJyb3ctbGVmdC5zdmdcIj48L3plbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb250aC10aXRsZVwiPnt7IGxlZnREYXlzVGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJuYXYtYnRuXCIgKGNsaWNrKT1cImxlZnROZXh0TW9udGgoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1pY29uIHNyYz1cImFzc2V0cy9uZy16ZW5kdWl0L2ljb25zL2Fycm93LXJpZ2h0LnN2Z1wiPjwvemVuLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjYWxlbmRhckdyaWQ7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBsZWZ0RGF5Um93cyB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWRpdmlkZXJcIj48L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIFJpZ2h0IGNhbGVuZGFyIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItcGFuZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibmF2LWJ0blwiIChjbGljayk9XCJyaWdodFByZXZNb250aCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWljb24gc3JjPVwiYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvYXJyb3ctbGVmdC5zdmdcIj48L3plbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb250aC10aXRsZVwiPnt7IHJpZ2h0RGF5c1RpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibmF2LWJ0blwiIChjbGljayk9XCJyaWdodE5leHRNb250aCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWljb24gc3JjPVwiYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvYXJyb3ctcmlnaHQuc3ZnXCI+PC96ZW4taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNhbGVuZGFyR3JpZDsgY29udGV4dDogeyAkaW1wbGljaXQ6IHJpZ2h0RGF5Um93cyB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm90dG9tLWRpdmlkZXJcIj48L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gQm90dG9tIHBhbmVsOiBpbnB1dHMgKyBhY3Rpb25zIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3R0b20tcGFuZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWZpZWxkc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtaW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGUtaW5wdXQtdGV4dFwiIFtjbGFzcy5wbGFjZWhvbGRlcl09XCIhX3NlbGVjdGVkU3RhcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgX3NlbGVjdGVkU3RhcnQgPyBmb3JtYXR0ZWRTdGFydERhdGUgOiAoJ1N0YXJ0IGRhdGUnIHwgdHJhbnNsYXRlKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXRlLXNlcGFyYXRvclwiPiZuZGFzaDs8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1pbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0ZS1pbnB1dC10ZXh0XCIgW2NsYXNzLnBsYWNlaG9sZGVyXT1cIiFfc2VsZWN0ZWRFbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgX3NlbGVjdGVkRW5kID8gZm9ybWF0dGVkRW5kRGF0ZSA6ICgnRW5kIGRhdGUnIHwgdHJhbnNsYXRlKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tY2FuY2VsXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+e3sgJ0NhbmNlbCcgfCB0cmFuc2xhdGUgfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tYXBwbHlcIiBbZGlzYWJsZWRdPVwiIWNhbkFwcGx5XCIgKGNsaWNrKT1cImFwcGx5KClcIj57eyAnQXBwbHknIHwgdHJhbnNsYXRlIH19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gUkFOR0UgTU9CSUxFOiBzaW5nbGUgY2FsZW5kYXIgd2l0aCBkdWFsIGlucHV0cyBvbiB0b3AgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0eXBlID09PSAncmFuZ2UnICYmIG1vYmlsZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZS1jYWxlbmRhci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibmF2LWJ0blwiIChjbGljayk9XCJwcmV2TW9udGgoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4taWNvbiBzcmM9XCJhc3NldHMvbmctemVuZHVpdC9pY29ucy9hcnJvdy1sZWZ0LnN2Z1wiPjwvemVuLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9udGgtdGl0bGVcIj57eyBsZWZ0RGF5c1RpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdi1idG5cIiAoY2xpY2spPVwibmV4dE1vbnRoKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWljb24gc3JjPVwiYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvYXJyb3ctcmlnaHQuc3ZnXCI+PC96ZW4taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIFJhbmdlIGlucHV0cyAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1yYW5nZS1pbnB1dHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLWlucHV0IGNvbXBhY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGUtaW5wdXQtdGV4dFwiIFtjbGFzcy5wbGFjZWhvbGRlcl09XCIhX3NlbGVjdGVkU3RhcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgX3NlbGVjdGVkU3RhcnQgPyBmb3JtYXR0ZWRTdGFydERhdGUgOiAoJ1NlbGVjdCBkYXRlJyB8IHRyYW5zbGF0ZSkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0ZS1zZXBhcmF0b3JcIj4mbmRhc2g7PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtaW5wdXQgY29tcGFjdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0ZS1pbnB1dC10ZXh0XCIgW2NsYXNzLnBsYWNlaG9sZGVyXT1cIiFfc2VsZWN0ZWRFbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgX3NlbGVjdGVkRW5kID8gZm9ybWF0dGVkRW5kRGF0ZSA6ICgnU2VsZWN0IGRhdGUnIHwgdHJhbnNsYXRlKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2FsZW5kYXJHcmlkOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogbGVmdERheVJvd3MgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvdHRvbS1kaXZpZGVyXCI+PC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm90dG9tLXBhbmVsIGNvbXBhY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnMgZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1jYW5jZWxcIiAoY2xpY2spPVwiY2FuY2VsKClcIj57eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1hcHBseVwiIFtkaXNhYmxlZF09XCIhY2FuQXBwbHlcIiAoY2xpY2spPVwiYXBwbHkoKVwiPnt7ICdBcHBseScgfCB0cmFuc2xhdGUgfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBTSU5HTEUgREFURTogc2luZ2xlIGNhbGVuZGFyICsgaW5wdXQgKyB0b2RheSBidXR0b24gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0eXBlID09PSAnc2luZ2xlJ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZS1jYWxlbmRhci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibmF2LWJ0blwiIChjbGljayk9XCJwcmV2TW9udGgoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4taWNvbiBzcmM9XCJhc3NldHMvbmctemVuZHVpdC9pY29ucy9hcnJvdy1sZWZ0LnN2Z1wiPjwvemVuLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9udGgtdGl0bGVcIj57eyBsZWZ0RGF5c1RpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdi1idG5cIiAoY2xpY2spPVwibmV4dE1vbnRoKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWljb24gc3JjPVwiYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvYXJyb3ctcmlnaHQuc3ZnXCI+PC96ZW4taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIERhdGUgaW5wdXQgKyBUb2RheSBidXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGUtYWN0aW9ucy1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLWlucHV0IGZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0ZS1pbnB1dC10ZXh0XCIgW2NsYXNzLnBsYWNlaG9sZGVyXT1cIiFfc2VsZWN0ZWREYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IF9zZWxlY3RlZERhdGUgPyBmb3JtYXR0ZWRTZWxlY3RlZERhdGUgOiAoJ1NlbGVjdCBkYXRlJyB8IHRyYW5zbGF0ZSkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tdG9kYXlcIiAoY2xpY2spPVwiZ29Ub1RvZGF5KClcIj57eyAnVG9kYXknIHwgdHJhbnNsYXRlIH19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjYWxlbmRhckdyaWQ7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBsZWZ0RGF5Um93cyB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm90dG9tLWRpdmlkZXJcIj48L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3R0b20tcGFuZWwgY29tcGFjdFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9ucyBmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWNhbmNlbFwiIChjbGljayk9XCJjYW5jZWwoKVwiPnt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWFwcGx5XCIgW2Rpc2FibGVkXT1cIiFjYW5BcHBseVwiIChjbGljayk9XCJhcHBseSgpXCI+e3sgJ0FwcGx5JyB8IHRyYW5zbGF0ZSB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gU2hhcmVkIGNhbGVuZGFyIGdyaWQgdGVtcGxhdGUgLS0+XG48bmctdGVtcGxhdGUgI2NhbGVuZGFyR3JpZCBsZXQtZGF5Um93cz5cbiAgICA8ZGl2IGNsYXNzPVwiZGF0ZXMtZ3JpZFwiPlxuICAgICAgICA8IS0tIFdlZWsgZGF5IGhlYWRlcnMgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3ZWVrLWhlYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlbGwgaGVhZGVyLWNlbGxcIiAqbmdGb3I9XCJsZXQgd2Qgb2Ygd2Vla0RheXNcIj57eyB3ZCB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBEYXkgcm93cyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRheS1yb3dcIiAqbmdGb3I9XCJsZXQgcm93IG9mIGRheVJvd3NcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZWxsIGRheS1jZWxsXCJcbiAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRheSBvZiByb3cuZGF5c1wiXG4gICAgICAgICAgICAgICAgIFtjbGFzcy5vdXRzaWRlXT1cImRheS5pc091dHNpZGVcIlxuICAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiZGF5LnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgW2NsYXNzLnRvZGF5XT1cImlzVG9kYXkoZGF5KVwiXG4gICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJkYXkuaXNEaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgIFtjbGFzcy5pbi1yYW5nZV09XCJpc0luUmFuZ2UoZGF5KVwiXG4gICAgICAgICAgICAgICAgIFtjbGFzcy5yYW5nZS1zdGFydF09XCJpc1JhbmdlU3RhcnQoZGF5KVwiXG4gICAgICAgICAgICAgICAgIFtjbGFzcy5yYW5nZS1lbmRdPVwiaXNSYW5nZUVuZChkYXkpXCJcbiAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdERheShkYXkpXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXktbnVtYmVyXCI+e3sgZGF5LmxibCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhpZ2hsaWdodC1kb3RcIiAqbmdJZj1cImRheS5pc0hpZ2hsaWdodGVkXCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==