pdm-ui-kit 0.1.32 → 0.1.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, ViewChild } from '@angular/core';
2
2
  import { format as formatDateFns } from 'date-fns';
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "@angular/common";
@@ -14,6 +14,7 @@ export class PdmDatePickerComponent {
14
14
  this._open = false;
15
15
  this.instanceId = `pdm-date-picker-${++nextDatePickerId}`;
16
16
  this.triggerFocused = false;
17
+ this.panelPlacement = 'bottom';
17
18
  this.id = '';
18
19
  this.variant = 'single';
19
20
  this.label = '';
@@ -43,6 +44,12 @@ export class PdmDatePickerComponent {
43
44
  }
44
45
  set open(value) {
45
46
  this._open = !!value;
47
+ if (this._open) {
48
+ this.schedulePanelPlacementUpdate();
49
+ }
50
+ else {
51
+ this.panelPlacement = 'bottom';
52
+ }
46
53
  this.cdr.markForCheck();
47
54
  }
48
55
  get open() {
@@ -124,7 +131,9 @@ export class PdmDatePickerComponent {
124
131
  }
125
132
  get panelClasses() {
126
133
  return [
127
- 'absolute left-0 top-full z-30 mt-2',
134
+ this.panelPlacement === 'top'
135
+ ? 'absolute bottom-full left-0 z-30 mb-2'
136
+ : 'absolute left-0 top-full z-30 mt-2',
128
137
  this.panelClassName
129
138
  ];
130
139
  }
@@ -188,14 +197,47 @@ export class PdmDatePickerComponent {
188
197
  this.setOpen(false);
189
198
  }
190
199
  }
200
+ onViewportChange() {
201
+ this.updatePanelPlacement();
202
+ }
191
203
  setOpen(nextOpen) {
192
204
  if (this._open === nextOpen) {
193
205
  return;
194
206
  }
195
207
  this._open = nextOpen;
196
208
  this.openChange.emit(this._open);
209
+ if (this._open) {
210
+ this.schedulePanelPlacementUpdate();
211
+ }
212
+ else {
213
+ this.panelPlacement = 'bottom';
214
+ }
197
215
  this.cdr.markForCheck();
198
216
  }
217
+ schedulePanelPlacementUpdate() {
218
+ setTimeout(() => this.updatePanelPlacement());
219
+ }
220
+ updatePanelPlacement() {
221
+ if (!this._open) {
222
+ return;
223
+ }
224
+ const triggerEl = this.triggerRef?.nativeElement;
225
+ const panelEl = this.panelRef?.nativeElement;
226
+ if (!triggerEl || !panelEl || typeof window === 'undefined') {
227
+ return;
228
+ }
229
+ const viewportHeight = window.innerHeight;
230
+ const gap = 8;
231
+ const triggerRect = triggerEl.getBoundingClientRect();
232
+ const panelHeight = panelEl.offsetHeight;
233
+ const spaceBelow = Math.max(0, viewportHeight - triggerRect.bottom - gap);
234
+ const spaceAbove = Math.max(0, triggerRect.top - gap);
235
+ const nextPlacement = spaceBelow < panelHeight && spaceAbove > spaceBelow ? 'top' : 'bottom';
236
+ if (this.panelPlacement !== nextPlacement) {
237
+ this.panelPlacement = nextPlacement;
238
+ this.cdr.markForCheck();
239
+ }
240
+ }
199
241
  formatDate(date) {
200
242
  try {
201
243
  return formatDateFns(date, this.format || 'MMM d, yyyy');
@@ -215,11 +257,17 @@ export class PdmDatePickerComponent {
215
257
  }
216
258
  }
217
259
  PdmDatePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDatePickerComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
218
- PdmDatePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmDatePickerComponent, selector: "pdm-date-picker", inputs: { id: "id", variant: "variant", label: "label", labelClassName: "labelClassName", className: "className", triggerClassName: "triggerClassName", panelClassName: "panelClassName", placeholder: "placeholder", rangePlaceholder: "rangePlaceholder", format: "format", disabled: "disabled", readonly: "readonly", required: "required", invalid: "invalid", allowSameDayRange: "allowSameDayRange", closeOnSelect: "closeOnSelect", minDate: "minDate", maxDate: "maxDate", minYear: "minYear", maxYear: "maxYear", disabledDates: "disabledDates", isDateDisabled: "isDateDisabled", open: "open", value: "value", rangeValue: "rangeValue" }, outputs: { valueChange: "valueChange", rangeValueChange: "rangeValueChange", openChange: "openChange", monthChange: "monthChange" }, host: { listeners: { "document:keydown.escape": "onEscape()", "document:click": "onDocumentClick($event)" } }, ngImport: i0, template: "<div [ngClass]=\"rootClasses\">\n <pdm-label *ngIf=\"label\" [forId]=\"triggerId\" [required]=\"required\" [className]=\"labelClassName\">\n {{ label }}\n </pdm-label>\n\n <div class=\"relative inline-block w-full\">\n <button\n type=\"button\"\n [id]=\"triggerId\"\n [disabled]=\"disabled\"\n [attr.aria-expanded]=\"open\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-invalid]=\"invalid\"\n [ngClass]=\"triggerClasses\"\n [attr.title]=\"displayText\"\n (click)=\"toggleOpen()\"\n (focus)=\"onTriggerFocus()\"\n (blur)=\"onTriggerBlur()\"\n >\n <span class=\"flex h-5 w-5 shrink-0 items-center justify-center p-0.5 text-muted-foreground\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n <path d=\"M8 2v4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path d=\"M16 2v4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <rect x=\"3\" y=\"4.5\" width=\"18\" height=\"16.5\" rx=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></rect>\n <path d=\"M3 9.5h18\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </span>\n\n <span [ngClass]=\"textClasses\">{{ displayText }}</span>\n </button>\n\n <div *ngIf=\"open\" [id]=\"panelId\" [ngClass]=\"panelClasses\" role=\"dialog\" [attr.aria-labelledby]=\"label ? triggerId : null\">\n <pdm-calendar\n [variant]=\"resolvedVariant\"\n [value]=\"value\"\n [rangeValue]=\"rangeValue\"\n [readonly]=\"readonly\"\n [allowSameDayRange]=\"allowSameDayRange\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [minYear]=\"minYear\"\n [maxYear]=\"maxYear\"\n [disabledDates]=\"disabledDates\"\n [isDateDisabled]=\"isDateDisabled\"\n (valueChange)=\"onCalendarValueChange($event)\"\n (rangeValueChange)=\"onCalendarRangeValueChange($event)\"\n (monthChange)=\"onCalendarMonthChange($event)\"\n ></pdm-calendar>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.PdmCalendarComponent, selector: "pdm-calendar", inputs: ["variant", "className", "disabledDates", "minDate", "maxDate", "minYear", "maxYear", "isDateDisabled", "allowSameDayRange", "readonly", "value", "rangeValue", "month"], outputs: ["valueChange", "rangeValueChange", "monthChange", "dateClick", "disabledDateClick"] }, { kind: "component", type: i3.PdmLabelComponent, selector: "pdm-label", inputs: ["forId", "required", "className"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
260
+ PdmDatePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmDatePickerComponent, selector: "pdm-date-picker", inputs: { id: "id", variant: "variant", label: "label", labelClassName: "labelClassName", className: "className", triggerClassName: "triggerClassName", panelClassName: "panelClassName", placeholder: "placeholder", rangePlaceholder: "rangePlaceholder", format: "format", disabled: "disabled", readonly: "readonly", required: "required", invalid: "invalid", allowSameDayRange: "allowSameDayRange", closeOnSelect: "closeOnSelect", minDate: "minDate", maxDate: "maxDate", minYear: "minYear", maxYear: "maxYear", disabledDates: "disabledDates", isDateDisabled: "isDateDisabled", open: "open", value: "value", rangeValue: "rangeValue" }, outputs: { valueChange: "valueChange", rangeValueChange: "rangeValueChange", openChange: "openChange", monthChange: "monthChange" }, host: { listeners: { "document:keydown.escape": "onEscape()", "document:click": "onDocumentClick($event)", "window:resize": "onViewportChange()", "window:scroll": "onViewportChange()" } }, viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["triggerEl"], descendants: true }, { propertyName: "panelRef", first: true, predicate: ["panelEl"], descendants: true }], ngImport: i0, template: "<div [ngClass]=\"rootClasses\">\n <pdm-label *ngIf=\"label\" [forId]=\"triggerId\" [required]=\"required\" [className]=\"labelClassName\">\n {{ label }}\n </pdm-label>\n\n <div class=\"relative inline-block w-full\">\n <button\n #triggerEl\n type=\"button\"\n [id]=\"triggerId\"\n [disabled]=\"disabled\"\n [attr.aria-expanded]=\"open\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-invalid]=\"invalid\"\n [ngClass]=\"triggerClasses\"\n [attr.title]=\"displayText\"\n (click)=\"toggleOpen()\"\n (focus)=\"onTriggerFocus()\"\n (blur)=\"onTriggerBlur()\"\n >\n <span class=\"flex h-5 w-5 shrink-0 items-center justify-center p-0.5 text-muted-foreground\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n <path d=\"M8 2v4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path d=\"M16 2v4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <rect x=\"3\" y=\"4.5\" width=\"18\" height=\"16.5\" rx=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></rect>\n <path d=\"M3 9.5h18\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </span>\n\n <span [ngClass]=\"textClasses\">{{ displayText }}</span>\n </button>\n\n <div *ngIf=\"open\" #panelEl [id]=\"panelId\" [ngClass]=\"panelClasses\" role=\"dialog\" [attr.aria-labelledby]=\"label ? triggerId : null\">\n <pdm-calendar\n [variant]=\"resolvedVariant\"\n [value]=\"value\"\n [rangeValue]=\"rangeValue\"\n [readonly]=\"readonly\"\n [allowSameDayRange]=\"allowSameDayRange\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [minYear]=\"minYear\"\n [maxYear]=\"maxYear\"\n [disabledDates]=\"disabledDates\"\n [isDateDisabled]=\"isDateDisabled\"\n (valueChange)=\"onCalendarValueChange($event)\"\n (rangeValueChange)=\"onCalendarRangeValueChange($event)\"\n (monthChange)=\"onCalendarMonthChange($event)\"\n ></pdm-calendar>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.PdmCalendarComponent, selector: "pdm-calendar", inputs: ["variant", "className", "disabledDates", "minDate", "maxDate", "minYear", "maxYear", "isDateDisabled", "allowSameDayRange", "readonly", "value", "rangeValue", "month"], outputs: ["valueChange", "rangeValueChange", "monthChange", "dateClick", "disabledDateClick"] }, { kind: "component", type: i3.PdmLabelComponent, selector: "pdm-label", inputs: ["forId", "required", "className"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
219
261
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDatePickerComponent, decorators: [{
220
262
  type: Component,
221
- args: [{ selector: 'pdm-date-picker', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"rootClasses\">\n <pdm-label *ngIf=\"label\" [forId]=\"triggerId\" [required]=\"required\" [className]=\"labelClassName\">\n {{ label }}\n </pdm-label>\n\n <div class=\"relative inline-block w-full\">\n <button\n type=\"button\"\n [id]=\"triggerId\"\n [disabled]=\"disabled\"\n [attr.aria-expanded]=\"open\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-invalid]=\"invalid\"\n [ngClass]=\"triggerClasses\"\n [attr.title]=\"displayText\"\n (click)=\"toggleOpen()\"\n (focus)=\"onTriggerFocus()\"\n (blur)=\"onTriggerBlur()\"\n >\n <span class=\"flex h-5 w-5 shrink-0 items-center justify-center p-0.5 text-muted-foreground\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n <path d=\"M8 2v4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path d=\"M16 2v4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <rect x=\"3\" y=\"4.5\" width=\"18\" height=\"16.5\" rx=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></rect>\n <path d=\"M3 9.5h18\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </span>\n\n <span [ngClass]=\"textClasses\">{{ displayText }}</span>\n </button>\n\n <div *ngIf=\"open\" [id]=\"panelId\" [ngClass]=\"panelClasses\" role=\"dialog\" [attr.aria-labelledby]=\"label ? triggerId : null\">\n <pdm-calendar\n [variant]=\"resolvedVariant\"\n [value]=\"value\"\n [rangeValue]=\"rangeValue\"\n [readonly]=\"readonly\"\n [allowSameDayRange]=\"allowSameDayRange\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [minYear]=\"minYear\"\n [maxYear]=\"maxYear\"\n [disabledDates]=\"disabledDates\"\n [isDateDisabled]=\"isDateDisabled\"\n (valueChange)=\"onCalendarValueChange($event)\"\n (rangeValueChange)=\"onCalendarRangeValueChange($event)\"\n (monthChange)=\"onCalendarMonthChange($event)\"\n ></pdm-calendar>\n </div>\n </div>\n</div>\n" }]
222
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { id: [{
263
+ args: [{ selector: 'pdm-date-picker', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"rootClasses\">\n <pdm-label *ngIf=\"label\" [forId]=\"triggerId\" [required]=\"required\" [className]=\"labelClassName\">\n {{ label }}\n </pdm-label>\n\n <div class=\"relative inline-block w-full\">\n <button\n #triggerEl\n type=\"button\"\n [id]=\"triggerId\"\n [disabled]=\"disabled\"\n [attr.aria-expanded]=\"open\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-invalid]=\"invalid\"\n [ngClass]=\"triggerClasses\"\n [attr.title]=\"displayText\"\n (click)=\"toggleOpen()\"\n (focus)=\"onTriggerFocus()\"\n (blur)=\"onTriggerBlur()\"\n >\n <span class=\"flex h-5 w-5 shrink-0 items-center justify-center p-0.5 text-muted-foreground\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\n <path d=\"M8 2v4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path d=\"M16 2v4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <rect x=\"3\" y=\"4.5\" width=\"18\" height=\"16.5\" rx=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></rect>\n <path d=\"M3 9.5h18\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </span>\n\n <span [ngClass]=\"textClasses\">{{ displayText }}</span>\n </button>\n\n <div *ngIf=\"open\" #panelEl [id]=\"panelId\" [ngClass]=\"panelClasses\" role=\"dialog\" [attr.aria-labelledby]=\"label ? triggerId : null\">\n <pdm-calendar\n [variant]=\"resolvedVariant\"\n [value]=\"value\"\n [rangeValue]=\"rangeValue\"\n [readonly]=\"readonly\"\n [allowSameDayRange]=\"allowSameDayRange\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [minYear]=\"minYear\"\n [maxYear]=\"maxYear\"\n [disabledDates]=\"disabledDates\"\n [isDateDisabled]=\"isDateDisabled\"\n (valueChange)=\"onCalendarValueChange($event)\"\n (rangeValueChange)=\"onCalendarRangeValueChange($event)\"\n (monthChange)=\"onCalendarMonthChange($event)\"\n ></pdm-calendar>\n </div>\n </div>\n</div>\n" }]
264
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { triggerRef: [{
265
+ type: ViewChild,
266
+ args: ['triggerEl']
267
+ }], panelRef: [{
268
+ type: ViewChild,
269
+ args: ['panelEl']
270
+ }], id: [{
223
271
  type: Input
224
272
  }], variant: [{
225
273
  type: Input
@@ -283,5 +331,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
283
331
  }], onDocumentClick: [{
284
332
  type: HostListener,
285
333
  args: ['document:click', ['$event']]
334
+ }], onViewportChange: [{
335
+ type: HostListener,
336
+ args: ['window:resize']
337
+ }, {
338
+ type: HostListener,
339
+ args: ['window:scroll']
286
340
  }] } });
287
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2RhdGUtcGlja2VyL2RhdGUtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE1BQU0sSUFBSSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7Ozs7O0FBR25ELElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBT3pCLE1BQU0sT0FBTyxzQkFBc0I7SUFRakMsWUFDbUIsVUFBbUMsRUFDbkMsR0FBc0I7UUFEdEIsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFDbkMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFUakMsV0FBTSxHQUFnQixJQUFJLENBQUM7UUFDM0IsZ0JBQVcsR0FBNEIsSUFBSSxDQUFDO1FBQzVDLFVBQUssR0FBRyxLQUFLLENBQUM7UUFFTCxlQUFVLEdBQUcsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztRQUM5RCxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQU90QixPQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ1IsWUFBTyxHQUFnQyxRQUFRLENBQUM7UUFDaEQsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUNYLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDZixxQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDdEIsbUJBQWMsR0FBRyxFQUFFLENBQUM7UUFDcEIsZ0JBQVcsR0FBRyxhQUFhLENB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RyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUdILElBQUk7c0JBRFAsS0FBSztnQkFVRixLQUFLO3NCQURSLEtBQUs7Z0JBVUYsVUFBVTtzQkFEYixLQUFLO2dCQXFKTixRQUFRO3NCQURQLFlBQVk7dUJBQUMseUJBQXlCO2dCQVF2QyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPdXRwdXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmb3JtYXQgYXMgZm9ybWF0RGF0ZUZucyB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IFBkbUNhbGVuZGFyUmFuZ2UsIFBkbUNhbGVuZGFyVmFyaWFudCB9IGZyb20gJy4uL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudCc7XG5cbmxldCBuZXh0RGF0ZVBpY2tlcklkID0gMDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncGRtLWRhdGUtcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgUGRtRGF0ZVBpY2tlckNvbXBvbmVudCB7XG4gIHByaXZhdGUgX3ZhbHVlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3JhbmdlVmFsdWU6IFBkbUNhbGVuZGFyUmFuZ2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfb3BlbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdGFuY2VJZCA9IGBwZG0tZGF0ZS1waWNrZXItJHsrK25leHREYXRlUGlja2VySWR9YDtcbiAgcHJpdmF0ZSB0cmlnZ2VyRm9jdXNlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge31cblxuICBASW5wdXQoKSBpZCA9ICcnO1xuICBASW5wdXQoKSB2YXJpYW50OiBQZG1DYWxlbmRhclZhcmlhbnQgfCBzdHJpbmcgPSAnc2luZ2xlJztcbiAgQElucHV0KCkgbGFiZWwgPSAnJztcbiAgQElucHV0KCkgbGFiZWxDbGFzc05hbWUgPSAnJztcbiAgQElucHV0KCkgY2xhc3NOYW1lID0gJyc7XG4gIEBJbnB1dCgpIHRyaWdnZXJDbGFzc05hbWUgPSAnJztcbiAgQElucHV0KCkgcGFuZWxDbGFzc05hbWUgPSAnJztcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnUGljayBhIGRhdGUnO1xuICBASW5wdXQoKSByYW5nZVBsYWNlaG9sZGVyID0gJ1BpY2sgYSBkYXRlIHJhbmdlJztcbiAgQElucHV0KCkgZm9ybWF0ID0gJ01NTSBkLCB5eXl5JztcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgcmVhZG9ubHkgPSBmYWxzZTtcbiAgQElucHV0KCkgcmVxdWlyZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgaW52YWxpZCA9IGZhbHNlO1xuICBASW5wdXQoKSBhbGxvd1NhbWVEYXlSYW5nZSA9IHRydWU7XG4gIEBJbnB1dCgpIGNsb3NlT25TZWxlY3QgPSB0cnVlO1xuICBASW5wdXQoKSBtaW5EYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIG1heERhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbWluWWVhcjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIG1heFllYXI6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBkaXNhYmxlZERhdGVzOiBEYXRlW10gPSBbXTtcbiAgQElucHV0KCkgaXNEYXRlRGlzYWJsZWQ6ICgoZGF0ZTogRGF0ZSkgPT4gYm9vbGVhbikgfCBudWxsID0gbnVsbDtcblxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGUgfCBudWxsPigpO1xuICBAT3V0cHV0KCkgcmFuZ2VWYWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UGRtQ2FsZW5kYXJSYW5nZSB8IG51bGw+KCk7XG4gIEBPdXRwdXQoKSBvcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgbW9udGhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XG5cbiAgQElucHV0KClcbiAgc2V0IG9wZW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9vcGVuID0gISF2YWx1ZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBnZXQgb3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlbjtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCB2YWx1ZSh2YWx1ZTogRGF0ZSB8IG51bGwpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHRoaXMubm9ybWFsaXplRGF0ZSh2YWx1ZSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IERhdGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgcmFuZ2VWYWx1ZSh2YWx1ZTogUGRtQ2FsZW5kYXJSYW5nZSB8IG51bGwpIHtcbiAgICB0aGlzLl9yYW5nZVZhbHVlID0gdmFsdWVcbiAgICAgID8ge1xuICAgICAgICAgIHN0YXJ0OiB0aGlzLm5vcm1hbGl6ZURhdGUodmFsdWUuc3RhcnQpLFxuICAgICAgICAgIGVuZDogdGhpcy5ub3JtYWxpemVEYXRlKHZhbHVlLmVuZClcbiAgICAgICAgfVxuICAgICAgOiBudWxsO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIGdldCByYW5nZVZhbHVlKCk6IFBkbUNhbGVuZGFyUmFuZ2UgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcmFuZ2VWYWx1ZTtcbiAgfVxuXG4gIGdldCByZXNvbHZlZFZhcmlhbnQoKTogUGRtQ2FsZW5kYXJWYXJpYW50IHtcbiAgICByZXR1cm4gdGhpcy52YXJpYW50ID09PSAncmFuZ2UnID8gJ3JhbmdlJyA6ICdzaW5nbGUnO1xuICB9XG5cbiAgZ2V0IHRyaWdnZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkIHx8IGAke3RoaXMuaW5zdGFuY2VJZH0tdHJpZ2dlcmA7XG4gIH1cblxuICBnZXQgcGFuZWxJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmlkIHx8IHRoaXMuaW5zdGFuY2VJZH0tcGFuZWxgO1xuICB9XG5cbiAgZ2V0IGhhc1NpbmdsZVZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkVmFyaWFudCA9PT0gJ3NpbmdsZScgJiYgISF0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIGdldCBoYXNSYW5nZVZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkVmFyaWFudCA9PT0gJ3JhbmdlJyAmJiAhIXRoaXMuX3JhbmdlVmFsdWU/LnN0YXJ0O1xuICB9XG5cbiAgZ2V0IGRpc3BsYXlUZXh0KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMucmVzb2x2ZWRWYXJpYW50ID09PSAnc2luZ2xlJykge1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlID8gdGhpcy5mb3JtYXREYXRlKHRoaXMuX3ZhbHVlKSA6IHRoaXMucGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLl9yYW5nZVZhbHVlPy5zdGFydCA/PyBudWxsO1xuICAgIGNvbnN0IGVuZCA9IHRoaXMuX3JhbmdlVmFsdWU/LmVuZCA/PyBudWxsO1xuXG4gICAgaWYgKCFzdGFydCkge1xuICAgICAgcmV0dXJuIHRoaXMucmFuZ2VQbGFjZWhvbGRlcjtcbiAgICB9XG5cbiAgICBpZiAoIWVuZCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMuZm9ybWF0RGF0ZShzdGFydCl9IC1gO1xuICAgIH1cblxuICAgIHJldHVybiBgJHt0aGlzLmZvcm1hdERhdGUoc3RhcnQpfSAtICR7dGhpcy5mb3JtYXREYXRlKGVuZCl9YDtcbiAgfVxuXG4gIGdldCB0ZXh0Q2xhc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgaGFzVmFsdWUgPSB0aGlzLnJlc29sdmVkVmFyaWFudCA9PT0gJ3NpbmdsZScgPyB0aGlzLmhhc1NpbmdsZVZhbHVlIDogdGhpcy5oYXNSYW5nZVZhbHVlO1xuICAgIHJldHVybiBbXG4gICAgICAnbWluLXctMCBmbGV4LTEgdHJ1bmNhdGUgdGV4dC1sZWZ0IHRleHQtc20gbGVhZGluZy01JyxcbiAgICAgIGhhc1ZhbHVlID8gJ3RleHQtZm9yZWdyb3VuZCcgOiAndGV4dC1tdXRlZC1mb3JlZ3JvdW5kJ1xuICAgIF07XG4gIH1cblxuICBnZXQgcm9vdENsYXNzZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAnZ3JpZCBnYXAtMicsXG4gICAgICB0aGlzLnJlc29sdmVkVmFyaWFudCA9PT0gJ3JhbmdlJyA/ICd3LVsyODBweF0nIDogJ3ctWzE5N3B4XScsXG4gICAgICB0aGlzLmNsYXNzTmFtZVxuICAgIF07XG4gIH1cblxuICBnZXQgdHJpZ2dlckNsYXNzZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGZvY3VzU3R5bGUgPSB0aGlzLm9wZW4gfHwgdGhpcy50cmlnZ2VyRm9jdXNlZDtcblxuICAgIHJldHVybiBbXG4gICAgICAnYm9yZGVyLWlucHV0IGZvY3VzLXZpc2libGU6Ym9yZGVyLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLTIgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcvNTAgYXJpYS1pbnZhbGlkOnJpbmctMiBhcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZSBhcmlhLWludmFsaWQ6Ym9yZGVyLWRlc3RydWN0aXZlIHJlbGF0aXZlIGZsZXggdy1mdWxsIGFwcGVhcmFuY2Utbm9uZSBpdGVtcy1jZW50ZXIgZ2FwLTIgb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtbGcgYm9yZGVyIGJnLWJhY2tncm91bmQgcHgtMyBweS1bNy41cHhdIHRleHQtbGVmdCB0ZXh0LXNtIHNoYWRvdy1zbSBvdXRsaW5lLW5vbmUgdHJhbnNpdGlvbi1jb2xvcnMnLFxuICAgICAgJ21pbi1oLVszNnB4XSBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpvcGFjaXR5LTUwJyxcbiAgICAgIGZvY3VzU3R5bGVcbiAgICAgICAgPyAnYm9yZGVyLXJpbmcgcmluZy0yIHJpbmctcmluZy81MCdcbiAgICAgICAgOiAnJyxcbiAgICAgIHRoaXMuaW52YWxpZCA/ICdib3JkZXItZGVzdHJ1Y3RpdmUgcmluZy1kZXN0cnVjdGl2ZS8yMCcgOiAnJyxcbiAgICAgIHRoaXMudHJpZ2dlckNsYXNzTmFtZVxuICAgIF07XG4gIH1cblxuICBnZXQgcGFuZWxDbGFzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ2Fic29sdXRlIGxlZnQtMCB0b3AtZnVsbCB6LTMwIG10LTInLFxuICAgICAgdGhpcy5wYW5lbENsYXNzTmFtZVxuICAgIF07XG4gIH1cblxuICB0b2dnbGVPcGVuKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldE9wZW4oIXRoaXMub3Blbik7XG4gIH1cblxuICBvblRyaWdnZXJGb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLnRyaWdnZXJGb2N1c2VkID0gdHJ1ZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uVHJpZ2dlckJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy50cmlnZ2VyRm9jdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25DYWxlbmRhclZhbHVlQ2hhbmdlKHZhbHVlOiBEYXRlIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5ub3JtYWxpemVEYXRlKHZhbHVlKTtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy5fdmFsdWUgPyB0aGlzLmNsb25lRGF0ZSh0aGlzLl92YWx1ZSkgOiBudWxsKTtcblxuICAgIGlmICh0aGlzLmNsb3NlT25TZWxlY3QgJiYgdGhpcy5fdmFsdWUpIHtcbiAgICAgIHRoaXMuc2V0T3BlbihmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2FsZW5kYXJSYW5nZVZhbHVlQ2hhbmdlKHZhbHVlOiBQZG1DYWxlbmRhclJhbmdlIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX3JhbmdlVmFsdWUgPSB2YWx1ZVxuICAgICAgPyB7XG4gICAgICAgICAgc3RhcnQ6IHRoaXMubm9ybWFsaXplRGF0ZSh2YWx1ZS5zdGFydCksXG4gICAgICAgICAgZW5kOiB0aGlzLm5vcm1hbGl6ZURhdGUodmFsdWUuZW5kKVxuICAgICAgICB9XG4gICAgICA6IG51bGw7XG5cbiAgICB0aGlzLnJhbmdlVmFsdWVDaGFuZ2UuZW1pdChcbiAgICAgIHRoaXMuX3JhbmdlVmFsdWVcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBzdGFydDogdGhpcy5fcmFuZ2VWYWx1ZS5zdGFydCA/IHRoaXMuY2xvbmVEYXRlKHRoaXMuX3JhbmdlVmFsdWUuc3RhcnQpIDogbnVsbCxcbiAgICAgICAgICAgIGVuZDogdGhpcy5fcmFuZ2VWYWx1ZS5lbmQgPyB0aGlzLmNsb25lRGF0ZSh0aGlzLl9yYW5nZVZhbHVlLmVuZCkgOiBudWxsXG4gICAgICAgICAgfVxuICAgICAgICA6IG51bGxcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuY2xvc2VPblNlbGVjdCAmJiB0aGlzLl9yYW5nZVZhbHVlPy5zdGFydCAmJiB0aGlzLl9yYW5nZVZhbHVlPy5lbmQpIHtcbiAgICAgIHRoaXMuc2V0T3BlbihmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvbkNhbGVuZGFyTW9udGhDaGFuZ2UobW9udGg6IERhdGUpOiB2b2lkIHtcbiAgICB0aGlzLm1vbnRoQ2hhbmdlLmVtaXQodGhpcy5jbG9uZURhdGUobW9udGgpKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJylcbiAgb25Fc2NhcGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3Blbikge1xuICAgICAgdGhpcy5zZXRPcGVuKGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5vcGVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIE5vZGUgfCBudWxsO1xuICAgIGlmICh0YXJnZXQgJiYgIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgIHRoaXMuc2V0T3BlbihmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRPcGVuKG5leHRPcGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX29wZW4gPT09IG5leHRPcGVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fb3BlbiA9IG5leHRPcGVuO1xuICAgIHRoaXMub3BlbkNoYW5nZS5lbWl0KHRoaXMuX29wZW4pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXREYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZm9ybWF0RGF0ZUZucyhkYXRlLCB0aGlzLmZvcm1hdCB8fCAnTU1NIGQsIHl5eXknKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmb3JtYXREYXRlRm5zKGRhdGUsICdNTU0gZCwgeXl5eScpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplRGF0ZSh2YWx1ZTogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBEYXRlIHwgbnVsbCB7XG4gICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB8fCBOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlLmdldEZ1bGxZZWFyKCksIHZhbHVlLmdldE1vbnRoKCksIHZhbHVlLmdldERhdGUoKSk7XG4gIH1cblxuICBwcml2YXRlIGNsb25lRGF0ZShkYXRlOiBEYXRlKTogRGF0ZSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSk7XG4gIH1cbn1cbiIsIjxkaXYgW25nQ2xhc3NdPVwicm9vdENsYXNzZXNcIj5cbiAgPHBkbS1sYWJlbCAqbmdJZj1cImxhYmVsXCIgW2ZvcklkXT1cInRyaWdnZXJJZFwiIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiIFtjbGFzc05hbWVdPVwibGFiZWxDbGFzc05hbWVcIj5cbiAgICB7eyBsYWJlbCB9fVxuICA8L3BkbS1sYWJlbD5cblxuICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgaW5saW5lLWJsb2NrIHctZnVsbFwiPlxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgW2lkXT1cInRyaWdnZXJJZFwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJvcGVuXCJcbiAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwicGFuZWxJZFwiXG4gICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cIidkaWFsb2cnXCJcbiAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJpbnZhbGlkXCJcbiAgICAgIFtuZ0NsYXNzXT1cInRyaWdnZXJDbGFzc2VzXCJcbiAgICAgIFthdHRyLnRpdGxlXT1cImRpc3BsYXlUZXh0XCJcbiAgICAgIChjbGljayk9XCJ0b2dnbGVPcGVuKClcIlxuICAgICAgKGZvY3VzKT1cIm9uVHJpZ2dlckZvY3VzKClcIlxuICAgICAgKGJsdXIpPVwib25UcmlnZ2VyQmx1cigpXCJcbiAgICA+XG4gICAgICA8c3BhbiBjbGFzcz1cImZsZXggaC01IHctNSBzaHJpbmstMCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcC0wLjUgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGNsYXNzPVwiaC00IHctNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCI+XG4gICAgICAgICAgPHBhdGggZD1cIk04IDJ2NFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjwvcGF0aD5cbiAgICAgICAgICA8cGF0aCBkPVwiTTE2IDJ2NFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjwvcGF0aD5cbiAgICAgICAgICA8cmVjdCB4PVwiM1wiIHk9XCI0LjVcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMTYuNVwiIHJ4PVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjwvcmVjdD5cbiAgICAgICAgICA8cGF0aCBkPVwiTTMgOS41aDE4XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PC9wYXRoPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPHNwYW4gW25nQ2xhc3NdPVwidGV4dENsYXNzZXNcIj57eyBkaXNwbGF5VGV4dCB9fTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxkaXYgKm5nSWY9XCJvcGVuXCIgW2lkXT1cInBhbmVsSWRcIiBbbmdDbGFzc109XCJwYW5lbENsYXNzZXNcIiByb2xlPVwiZGlhbG9nXCIgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImxhYmVsID8gdHJpZ2dlcklkIDogbnVsbFwiPlxuICAgICAgPHBkbS1jYWxlbmRhclxuICAgICAgICBbdmFyaWFudF09XCJyZXNvbHZlZFZhcmlhbnRcIlxuICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICBbcmFuZ2VWYWx1ZV09XCJyYW5nZVZhbHVlXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICAgICAgW2FsbG93U2FtZURheVJhbmdlXT1cImFsbG93U2FtZURheVJhbmdlXCJcbiAgICAgICAgW21pbkRhdGVdPVwibWluRGF0ZVwiXG4gICAgICAgIFttYXhEYXRlXT1cIm1heERhdGVcIlxuICAgICAgICBbbWluWWVhcl09XCJtaW5ZZWFyXCJcbiAgICAgICAgW21heFllYXJdPVwibWF4WWVhclwiXG4gICAgICAgIFtkaXNhYmxlZERhdGVzXT1cImRpc2FibGVkRGF0ZXNcIlxuICAgICAgICBbaXNEYXRlRGlzYWJsZWRdPVwiaXNEYXRlRGlzYWJsZWRcIlxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25DYWxlbmRhclZhbHVlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAocmFuZ2VWYWx1ZUNoYW5nZSk9XCJvbkNhbGVuZGFyUmFuZ2VWYWx1ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKG1vbnRoQ2hhbmdlKT1cIm9uQ2FsZW5kYXJNb250aENoYW5nZSgkZXZlbnQpXCJcbiAgICAgID48L3BkbS1jYWxlbmRhcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
341
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2RhdGUtcGlja2VyL2RhdGUtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxNQUFNLElBQUksYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDOzs7OztBQUduRCxJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQU96QixNQUFNLE9BQU8sc0JBQXNCO0lBWWpDLFlBQ21CLFVBQW1DLEVBQ25DLEdBQXNCO1FBRHRCLGVBQVUsR0FBVixVQUFVLENBQXlCO1FBQ25DLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBYmpDLFdBQU0sR0FBZ0IsSUFBSSxDQUFDO1FBQzNCLGdCQUFXLEdBQTRCLElBQUksQ0FBQztRQUM1QyxVQUFLLEdBQUcsS0FBSyxDQUFDO1FBRUwsZUFBVSxHQUFHLG1CQUFtQixFQUFFLGdCQUFnQixFQUFFLENBQUM7UUFDOUQsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDL0IsbUJBQWMsR0FBcUIsUUFBUSxDQUFDO1FBVW5DLE9BQUUsR0FBRyxFQUFFLENBQUM7UUFDUixZQUFPLEdBQWdDLFFBQVEsQ0FBQztRQUNoRCxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ1gsbUJBQWMsR0FBRyxFQUFFLENBQUM7UUFDcEIsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNmLHFCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUN0QixtQkFBYyxH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UztnQkFPWCxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFHSCxJQUFJO3NCQURQLEtBQUs7Z0JBZUYsS0FBSztzQkFEUixLQUFLO2dCQVVGLFVBQVU7c0JBRGIsS0FBSztnQkF1Sk4sUUFBUTtzQkFEUCxZQUFZO3VCQUFDLHlCQUF5QjtnQkFRdkMsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWMxQyxnQkFBZ0I7c0JBRmYsWUFBWTt1QkFBQyxlQUFlOztzQkFDNUIsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmb3JtYXQgYXMgZm9ybWF0RGF0ZUZucyB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IFBkbUNhbGVuZGFyUmFuZ2UsIFBkbUNhbGVuZGFyVmFyaWFudCB9IGZyb20gJy4uL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudCc7XG5cbmxldCBuZXh0RGF0ZVBpY2tlcklkID0gMDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncGRtLWRhdGUtcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgUGRtRGF0ZVBpY2tlckNvbXBvbmVudCB7XG4gIHByaXZhdGUgX3ZhbHVlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3JhbmdlVmFsdWU6IFBkbUNhbGVuZGFyUmFuZ2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfb3BlbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdGFuY2VJZCA9IGBwZG0tZGF0ZS1waWNrZXItJHsrK25leHREYXRlUGlja2VySWR9YDtcbiAgcHJpdmF0ZSB0cmlnZ2VyRm9jdXNlZCA9IGZhbHNlO1xuICBwYW5lbFBsYWNlbWVudDogJ3RvcCcgfCAnYm90dG9tJyA9ICdib3R0b20nO1xuXG4gIEBWaWV3Q2hpbGQoJ3RyaWdnZXJFbCcpIHByaXZhdGUgdHJpZ2dlclJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdwYW5lbEVsJykgcHJpdmF0ZSBwYW5lbFJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge31cblxuICBASW5wdXQoKSBpZCA9ICcnO1xuICBASW5wdXQoKSB2YXJpYW50OiBQZG1DYWxlbmRhclZhcmlhbnQgfCBzdHJpbmcgPSAnc2luZ2xlJztcbiAgQElucHV0KCkgbGFiZWwgPSAnJztcbiAgQElucHV0KCkgbGFiZWxDbGFzc05hbWUgPSAnJztcbiAgQElucHV0KCkgY2xhc3NOYW1lID0gJyc7XG4gIEBJbnB1dCgpIHRyaWdnZXJDbGFzc05hbWUgPSAnJztcbiAgQElucHV0KCkgcGFuZWxDbGFzc05hbWUgPSAnJztcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnUGljayBhIGRhdGUnO1xuICBASW5wdXQoKSByYW5nZVBsYWNlaG9sZGVyID0gJ1BpY2sgYSBkYXRlIHJhbmdlJztcbiAgQElucHV0KCkgZm9ybWF0ID0gJ01NTSBkLCB5eXl5JztcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgcmVhZG9ubHkgPSBmYWxzZTtcbiAgQElucHV0KCkgcmVxdWlyZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgaW52YWxpZCA9IGZhbHNlO1xuICBASW5wdXQoKSBhbGxvd1NhbWVEYXlSYW5nZSA9IHRydWU7XG4gIEBJbnB1dCgpIGNsb3NlT25TZWxlY3QgPSB0cnVlO1xuICBASW5wdXQoKSBtaW5EYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIG1heERhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbWluWWVhcjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIG1heFllYXI6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBkaXNhYmxlZERhdGVzOiBEYXRlW10gPSBbXTtcbiAgQElucHV0KCkgaXNEYXRlRGlzYWJsZWQ6ICgoZGF0ZTogRGF0ZSkgPT4gYm9vbGVhbikgfCBudWxsID0gbnVsbDtcblxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGUgfCBudWxsPigpO1xuICBAT3V0cHV0KCkgcmFuZ2VWYWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UGRtQ2FsZW5kYXJSYW5nZSB8IG51bGw+KCk7XG4gIEBPdXRwdXQoKSBvcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgbW9udGhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XG5cbiAgQElucHV0KClcbiAgc2V0IG9wZW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9vcGVuID0gISF2YWx1ZTtcbiAgICBpZiAodGhpcy5fb3Blbikge1xuICAgICAgdGhpcy5zY2hlZHVsZVBhbmVsUGxhY2VtZW50VXBkYXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFuZWxQbGFjZW1lbnQgPSAnYm90dG9tJztcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgZ2V0IG9wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX29wZW47XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgdmFsdWUodmFsdWU6IERhdGUgfCBudWxsKSB7XG4gICAgdGhpcy5fdmFsdWUgPSB0aGlzLm5vcm1hbGl6ZURhdGUodmFsdWUpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIGdldCB2YWx1ZSgpOiBEYXRlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHJhbmdlVmFsdWUodmFsdWU6IFBkbUNhbGVuZGFyUmFuZ2UgfCBudWxsKSB7XG4gICAgdGhpcy5fcmFuZ2VWYWx1ZSA9IHZhbHVlXG4gICAgICA/IHtcbiAgICAgICAgICBzdGFydDogdGhpcy5ub3JtYWxpemVEYXRlKHZhbHVlLnN0YXJ0KSxcbiAgICAgICAgICBlbmQ6IHRoaXMubm9ybWFsaXplRGF0ZSh2YWx1ZS5lbmQpXG4gICAgICAgIH1cbiAgICAgIDogbnVsbDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBnZXQgcmFuZ2VWYWx1ZSgpOiBQZG1DYWxlbmRhclJhbmdlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3JhbmdlVmFsdWU7XG4gIH1cblxuICBnZXQgcmVzb2x2ZWRWYXJpYW50KCk6IFBkbUNhbGVuZGFyVmFyaWFudCB7XG4gICAgcmV0dXJuIHRoaXMudmFyaWFudCA9PT0gJ3JhbmdlJyA/ICdyYW5nZScgOiAnc2luZ2xlJztcbiAgfVxuXG4gIGdldCB0cmlnZ2VySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZCB8fCBgJHt0aGlzLmluc3RhbmNlSWR9LXRyaWdnZXJgO1xuICB9XG5cbiAgZ2V0IHBhbmVsSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5pZCB8fCB0aGlzLmluc3RhbmNlSWR9LXBhbmVsYDtcbiAgfVxuXG4gIGdldCBoYXNTaW5nbGVWYWx1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZFZhcmlhbnQgPT09ICdzaW5nbGUnICYmICEhdGhpcy5fdmFsdWU7XG4gIH1cblxuICBnZXQgaGFzUmFuZ2VWYWx1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZFZhcmlhbnQgPT09ICdyYW5nZScgJiYgISF0aGlzLl9yYW5nZVZhbHVlPy5zdGFydDtcbiAgfVxuXG4gIGdldCBkaXNwbGF5VGV4dCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnJlc29sdmVkVmFyaWFudCA9PT0gJ3NpbmdsZScpIHtcbiAgICAgIHJldHVybiB0aGlzLl92YWx1ZSA/IHRoaXMuZm9ybWF0RGF0ZSh0aGlzLl92YWx1ZSkgOiB0aGlzLnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fcmFuZ2VWYWx1ZT8uc3RhcnQgPz8gbnVsbDtcbiAgICBjb25zdCBlbmQgPSB0aGlzLl9yYW5nZVZhbHVlPy5lbmQgPz8gbnVsbDtcblxuICAgIGlmICghc3RhcnQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJhbmdlUGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgaWYgKCFlbmQpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmZvcm1hdERhdGUoc3RhcnQpfSAtYDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7dGhpcy5mb3JtYXREYXRlKHN0YXJ0KX0gLSAke3RoaXMuZm9ybWF0RGF0ZShlbmQpfWA7XG4gIH1cblxuICBnZXQgdGV4dENsYXNzZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGhhc1ZhbHVlID0gdGhpcy5yZXNvbHZlZFZhcmlhbnQgPT09ICdzaW5nbGUnID8gdGhpcy5oYXNTaW5nbGVWYWx1ZSA6IHRoaXMuaGFzUmFuZ2VWYWx1ZTtcbiAgICByZXR1cm4gW1xuICAgICAgJ21pbi13LTAgZmxleC0xIHRydW5jYXRlIHRleHQtbGVmdCB0ZXh0LXNtIGxlYWRpbmctNScsXG4gICAgICBoYXNWYWx1ZSA/ICd0ZXh0LWZvcmVncm91bmQnIDogJ3RleHQtbXV0ZWQtZm9yZWdyb3VuZCdcbiAgICBdO1xuICB9XG5cbiAgZ2V0IHJvb3RDbGFzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ2dyaWQgZ2FwLTInLFxuICAgICAgdGhpcy5yZXNvbHZlZFZhcmlhbnQgPT09ICdyYW5nZScgPyAndy1bMjgwcHhdJyA6ICd3LVsxOTdweF0nLFxuICAgICAgdGhpcy5jbGFzc05hbWVcbiAgICBdO1xuICB9XG5cbiAgZ2V0IHRyaWdnZXJDbGFzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBmb2N1c1N0eWxlID0gdGhpcy5vcGVuIHx8IHRoaXMudHJpZ2dlckZvY3VzZWQ7XG5cbiAgICByZXR1cm4gW1xuICAgICAgJ2JvcmRlci1pbnB1dCBmb2N1cy12aXNpYmxlOmJvcmRlci1yaW5nIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIGFyaWEtaW52YWxpZDpyaW5nLTIgYXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUgYXJpYS1pbnZhbGlkOmJvcmRlci1kZXN0cnVjdGl2ZSByZWxhdGl2ZSBmbGV4IHctZnVsbCBhcHBlYXJhbmNlLW5vbmUgaXRlbXMtY2VudGVyIGdhcC0yIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLWxnIGJvcmRlciBiZy1iYWNrZ3JvdW5kIHB4LTMgcHktWzcuNXB4XSB0ZXh0LWxlZnQgdGV4dC1zbSBzaGFkb3ctc20gb3V0bGluZS1ub25lIHRyYW5zaXRpb24tY29sb3JzJyxcbiAgICAgICdtaW4taC1bMzZweF0gZGlzYWJsZWQ6cG9pbnRlci1ldmVudHMtbm9uZSBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6b3BhY2l0eS01MCcsXG4gICAgICBmb2N1c1N0eWxlXG4gICAgICAgID8gJ2JvcmRlci1yaW5nIHJpbmctMiByaW5nLXJpbmcvNTAnXG4gICAgICAgIDogJycsXG4gICAgICB0aGlzLmludmFsaWQgPyAnYm9yZGVyLWRlc3RydWN0aXZlIHJpbmctZGVzdHJ1Y3RpdmUvMjAnIDogJycsXG4gICAgICB0aGlzLnRyaWdnZXJDbGFzc05hbWVcbiAgICBdO1xuICB9XG5cbiAgZ2V0IHBhbmVsQ2xhc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMucGFuZWxQbGFjZW1lbnQgPT09ICd0b3AnXG4gICAgICAgID8gJ2Fic29sdXRlIGJvdHRvbS1mdWxsIGxlZnQtMCB6LTMwIG1iLTInXG4gICAgICAgIDogJ2Fic29sdXRlIGxlZnQtMCB0b3AtZnVsbCB6LTMwIG10LTInLFxuICAgICAgdGhpcy5wYW5lbENsYXNzTmFtZVxuICAgIF07XG4gIH1cblxuICB0b2dnbGVPcGVuKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldE9wZW4oIXRoaXMub3Blbik7XG4gIH1cblxuICBvblRyaWdnZXJGb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLnRyaWdnZXJGb2N1c2VkID0gdHJ1ZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uVHJpZ2dlckJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy50cmlnZ2VyRm9jdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25DYWxlbmRhclZhbHVlQ2hhbmdlKHZhbHVlOiBEYXRlIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5ub3JtYWxpemVEYXRlKHZhbHVlKTtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy5fdmFsdWUgPyB0aGlzLmNsb25lRGF0ZSh0aGlzLl92YWx1ZSkgOiBudWxsKTtcblxuICAgIGlmICh0aGlzLmNsb3NlT25TZWxlY3QgJiYgdGhpcy5fdmFsdWUpIHtcbiAgICAgIHRoaXMuc2V0T3BlbihmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2FsZW5kYXJSYW5nZVZhbHVlQ2hhbmdlKHZhbHVlOiBQZG1DYWxlbmRhclJhbmdlIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX3JhbmdlVmFsdWUgPSB2YWx1ZVxuICAgICAgPyB7XG4gICAgICAgICAgc3RhcnQ6IHRoaXMubm9ybWFsaXplRGF0ZSh2YWx1ZS5zdGFydCksXG4gICAgICAgICAgZW5kOiB0aGlzLm5vcm1hbGl6ZURhdGUodmFsdWUuZW5kKVxuICAgICAgICB9XG4gICAgICA6IG51bGw7XG5cbiAgICB0aGlzLnJhbmdlVmFsdWVDaGFuZ2UuZW1pdChcbiAgICAgIHRoaXMuX3JhbmdlVmFsdWVcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBzdGFydDogdGhpcy5fcmFuZ2VWYWx1ZS5zdGFydCA/IHRoaXMuY2xvbmVEYXRlKHRoaXMuX3JhbmdlVmFsdWUuc3RhcnQpIDogbnVsbCxcbiAgICAgICAgICAgIGVuZDogdGhpcy5fcmFuZ2VWYWx1ZS5lbmQgPyB0aGlzLmNsb25lRGF0ZSh0aGlzLl9yYW5nZVZhbHVlLmVuZCkgOiBudWxsXG4gICAgICAgICAgfVxuICAgICAgICA6IG51bGxcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuY2xvc2VPblNlbGVjdCAmJiB0aGlzLl9yYW5nZVZhbHVlPy5zdGFydCAmJiB0aGlzLl9yYW5nZVZhbHVlPy5lbmQpIHtcbiAgICAgIHRoaXMuc2V0T3BlbihmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvbkNhbGVuZGFyTW9udGhDaGFuZ2UobW9udGg6IERhdGUpOiB2b2lkIHtcbiAgICB0aGlzLm1vbnRoQ2hhbmdlLmVtaXQodGhpcy5jbG9uZURhdGUobW9udGgpKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJylcbiAgb25Fc2NhcGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3Blbikge1xuICAgICAgdGhpcy5zZXRPcGVuKGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5vcGVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIE5vZGUgfCBudWxsO1xuICAgIGlmICh0YXJnZXQgJiYgIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgIHRoaXMuc2V0T3BlbihmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnKVxuICBvblZpZXdwb3J0Q2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlUGFuZWxQbGFjZW1lbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0T3BlbihuZXh0T3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9vcGVuID09PSBuZXh0T3Blbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX29wZW4gPSBuZXh0T3BlbjtcbiAgICB0aGlzLm9wZW5DaGFuZ2UuZW1pdCh0aGlzLl9vcGVuKTtcbiAgICBpZiAodGhpcy5fb3Blbikge1xuICAgICAgdGhpcy5zY2hlZHVsZVBhbmVsUGxhY2VtZW50VXBkYXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFuZWxQbGFjZW1lbnQgPSAnYm90dG9tJztcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlUGFuZWxQbGFjZW1lbnRVcGRhdGUoKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVBhbmVsUGxhY2VtZW50KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQYW5lbFBsYWNlbWVudCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX29wZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0cmlnZ2VyRWwgPSB0aGlzLnRyaWdnZXJSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgcGFuZWxFbCA9IHRoaXMucGFuZWxSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF0cmlnZ2VyRWwgfHwgIXBhbmVsRWwgfHwgdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICBjb25zdCBnYXAgPSA4O1xuICAgIGNvbnN0IHRyaWdnZXJSZWN0ID0gdHJpZ2dlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHBhbmVsSGVpZ2h0ID0gcGFuZWxFbC5vZmZzZXRIZWlnaHQ7XG4gICAgY29uc3Qgc3BhY2VCZWxvdyA9IE1hdGgubWF4KDAsIHZpZXdwb3J0SGVpZ2h0IC0gdHJpZ2dlclJlY3QuYm90dG9tIC0gZ2FwKTtcbiAgICBjb25zdCBzcGFjZUFib3ZlID0gTWF0aC5tYXgoMCwgdHJpZ2dlclJlY3QudG9wIC0gZ2FwKTtcbiAgICBjb25zdCBuZXh0UGxhY2VtZW50OiAndG9wJyB8ICdib3R0b20nID1cbiAgICAgIHNwYWNlQmVsb3cgPCBwYW5lbEhlaWdodCAmJiBzcGFjZUFib3ZlID4gc3BhY2VCZWxvdyA/ICd0b3AnIDogJ2JvdHRvbSc7XG5cbiAgICBpZiAodGhpcy5wYW5lbFBsYWNlbWVudCAhPT0gbmV4dFBsYWNlbWVudCkge1xuICAgICAgdGhpcy5wYW5lbFBsYWNlbWVudCA9IG5leHRQbGFjZW1lbnQ7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdERhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmb3JtYXREYXRlRm5zKGRhdGUsIHRoaXMuZm9ybWF0IHx8ICdNTU0gZCwgeXl5eScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZvcm1hdERhdGVGbnMoZGF0ZSwgJ01NTSBkLCB5eXl5Jyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVEYXRlKHZhbHVlOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IERhdGUgfCBudWxsIHtcbiAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHx8IE51bWJlci5pc05hTih2YWx1ZS5nZXRUaW1lKCkpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERhdGUodmFsdWUuZ2V0RnVsbFllYXIoKSwgdmFsdWUuZ2V0TW9udGgoKSwgdmFsdWUuZ2V0RGF0ZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvbmVEYXRlKGRhdGU6IERhdGUpOiBEYXRlIHtcbiAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKTtcbiAgfVxufVxuIiwiPGRpdiBbbmdDbGFzc109XCJyb290Q2xhc3Nlc1wiPlxuICA8cGRtLWxhYmVsICpuZ0lmPVwibGFiZWxcIiBbZm9ySWRdPVwidHJpZ2dlcklkXCIgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCIgW2NsYXNzTmFtZV09XCJsYWJlbENsYXNzTmFtZVwiPlxuICAgIHt7IGxhYmVsIH19XG4gIDwvcGRtLWxhYmVsPlxuXG4gIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBpbmxpbmUtYmxvY2sgdy1mdWxsXCI+XG4gICAgPGJ1dHRvblxuICAgICAgI3RyaWdnZXJFbFxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBbaWRdPVwidHJpZ2dlcklkXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIm9wZW5cIlxuICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJwYW5lbElkXCJcbiAgICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiJ2RpYWxvZydcIlxuICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cImludmFsaWRcIlxuICAgICAgW25nQ2xhc3NdPVwidHJpZ2dlckNsYXNzZXNcIlxuICAgICAgW2F0dHIudGl0bGVdPVwiZGlzcGxheVRleHRcIlxuICAgICAgKGNsaWNrKT1cInRvZ2dsZU9wZW4oKVwiXG4gICAgICAoZm9jdXMpPVwib25UcmlnZ2VyRm9jdXMoKVwiXG4gICAgICAoYmx1cik9XCJvblRyaWdnZXJCbHVyKClcIlxuICAgID5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZmxleCBoLTUgdy01IHNocmluay0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBwLTAuNSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgY2xhc3M9XCJoLTQgdy00XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjhcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTggMnY0XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PC9wYXRoPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTYgMnY0XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PC9wYXRoPlxuICAgICAgICAgIDxyZWN0IHg9XCIzXCIgeT1cIjQuNVwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxNi41XCIgcng9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PC9yZWN0PlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMyA5LjVoMThcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48L3BhdGg+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8c3BhbiBbbmdDbGFzc109XCJ0ZXh0Q2xhc3Nlc1wiPnt7IGRpc3BsYXlUZXh0IH19PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPGRpdiAqbmdJZj1cIm9wZW5cIiAjcGFuZWxFbCBbaWRdPVwicGFuZWxJZFwiIFtuZ0NsYXNzXT1cInBhbmVsQ2xhc3Nlc1wiIHJvbGU9XCJkaWFsb2dcIiBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwibGFiZWwgPyB0cmlnZ2VySWQgOiBudWxsXCI+XG4gICAgICA8cGRtLWNhbGVuZGFyXG4gICAgICAgIFt2YXJpYW50XT1cInJlc29sdmVkVmFyaWFudFwiXG4gICAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICAgIFtyYW5nZVZhbHVlXT1cInJhbmdlVmFsdWVcIlxuICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgICAgICBbYWxsb3dTYW1lRGF5UmFuZ2VdPVwiYWxsb3dTYW1lRGF5UmFuZ2VcIlxuICAgICAgICBbbWluRGF0ZV09XCJtaW5EYXRlXCJcbiAgICAgICAgW21heERhdGVdPVwibWF4RGF0ZVwiXG4gICAgICAgIFttaW5ZZWFyXT1cIm1pblllYXJcIlxuICAgICAgICBbbWF4WWVhcl09XCJtYXhZZWFyXCJcbiAgICAgICAgW2Rpc2FibGVkRGF0ZXNdPVwiZGlzYWJsZWREYXRlc1wiXG4gICAgICAgIFtpc0RhdGVEaXNhYmxlZF09XCJpc0RhdGVEaXNhYmxlZFwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkNhbGVuZGFyVmFsdWVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIChyYW5nZVZhbHVlQ2hhbmdlKT1cIm9uQ2FsZW5kYXJSYW5nZVZhbHVlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAobW9udGhDaGFuZ2UpPVwib25DYWxlbmRhck1vbnRoQ2hhbmdlKCRldmVudClcIlxuICAgICAgPjwvcGRtLWNhbGVuZGFyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -1,15 +1,38 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, ViewChild } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  import * as i1 from "@angular/common";
4
4
  export class PdmPopoverComponent {
5
- constructor(elementRef) {
5
+ constructor(elementRef, cdr) {
6
6
  this.elementRef = elementRef;
7
- this.open = false;
7
+ this.cdr = cdr;
8
+ this._open = false;
8
9
  this.triggerText = 'Open';
9
10
  this.className = '';
10
11
  this.panelClassName = '';
11
12
  this.showTrigger = true;
12
13
  this.openChange = new EventEmitter();
14
+ this.panelPlacement = 'bottom';
15
+ }
16
+ set open(value) {
17
+ this._open = !!value;
18
+ if (this._open) {
19
+ this.schedulePanelPlacementUpdate();
20
+ }
21
+ else {
22
+ this.panelPlacement = 'bottom';
23
+ }
24
+ this.cdr.markForCheck();
25
+ }
26
+ get open() {
27
+ return this._open;
28
+ }
29
+ get panelClasses() {
30
+ return [
31
+ this.panelPlacement === 'top'
32
+ ? 'absolute bottom-full left-0 z-30 mb-2 min-w-80 rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md'
33
+ : 'absolute left-0 top-full z-30 mt-2 min-w-80 rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md',
34
+ this.panelClassName
35
+ ];
13
36
  }
14
37
  toggle() {
15
38
  this.open = !this.open;
@@ -30,15 +53,39 @@ export class PdmPopoverComponent {
30
53
  this.openChange.emit(false);
31
54
  }
32
55
  }
56
+ onViewportChange() {
57
+ this.updatePanelPlacement();
58
+ }
59
+ schedulePanelPlacementUpdate() {
60
+ setTimeout(() => this.updatePanelPlacement());
61
+ }
62
+ updatePanelPlacement() {
63
+ if (!this.open)
64
+ return;
65
+ const anchorEl = this.triggerRef?.nativeElement || this.anchorRef?.nativeElement;
66
+ const panelEl = this.panelRef?.nativeElement;
67
+ if (!anchorEl || !panelEl || typeof window === 'undefined') {
68
+ return;
69
+ }
70
+ const viewportHeight = window.innerHeight;
71
+ const gap = 8;
72
+ const anchorRect = anchorEl.getBoundingClientRect();
73
+ const panelHeight = panelEl.offsetHeight;
74
+ const spaceBelow = Math.max(0, viewportHeight - anchorRect.bottom - gap);
75
+ const spaceAbove = Math.max(0, anchorRect.top - gap);
76
+ const nextPlacement = spaceBelow < panelHeight && spaceAbove > spaceBelow ? 'top' : 'bottom';
77
+ if (this.panelPlacement !== nextPlacement) {
78
+ this.panelPlacement = nextPlacement;
79
+ this.cdr.markForCheck();
80
+ }
81
+ }
33
82
  }
34
- PdmPopoverComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmPopoverComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
35
- PdmPopoverComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmPopoverComponent, selector: "pdm-popover", inputs: { open: "open", triggerText: "triggerText", className: "className", panelClassName: "panelClassName", showTrigger: "showTrigger" }, outputs: { openChange: "openChange" }, host: { listeners: { "document:keydown.escape": "onEsc()", "document:click": "onDocumentClick($event)" } }, ngImport: i0, template: "<div class=\"relative inline-block\" [ngClass]=\"className\">\n <button *ngIf=\"showTrigger\" type=\"button\" class=\"inline-flex h-9 appearance-none items-center justify-center rounded-md border border-input bg-background px-3 text-sm font-medium text-foreground shadow-sm\" [attr.aria-expanded]=\"open\" (click)=\"toggle()\">{{ triggerText }}</button>\n <div *ngIf=\"open || !showTrigger\" [ngClass]=\"['absolute left-0 top-full z-30 mt-2 min-w-80 rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md', panelClassName]\">\n <ng-content></ng-content>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
83
+ PdmPopoverComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmPopoverComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
84
+ PdmPopoverComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmPopoverComponent, selector: "pdm-popover", inputs: { triggerText: "triggerText", className: "className", panelClassName: "panelClassName", showTrigger: "showTrigger", open: "open" }, outputs: { openChange: "openChange" }, host: { listeners: { "document:keydown.escape": "onEsc()", "document:click": "onDocumentClick($event)", "window:resize": "onViewportChange()", "window:scroll": "onViewportChange()" } }, viewQueries: [{ propertyName: "anchorRef", first: true, predicate: ["anchorEl"], descendants: true }, { propertyName: "triggerRef", first: true, predicate: ["triggerEl"], descendants: true }, { propertyName: "panelRef", first: true, predicate: ["panelEl"], descendants: true }], ngImport: i0, template: "<div #anchorEl class=\"relative inline-block\" [ngClass]=\"className\">\n <button #triggerEl *ngIf=\"showTrigger\" type=\"button\" class=\"inline-flex h-9 appearance-none items-center justify-center rounded-md border border-input bg-background px-3 text-sm font-medium text-foreground shadow-sm\" [attr.aria-expanded]=\"open\" (click)=\"toggle()\">{{ triggerText }}</button>\n <div #panelEl *ngIf=\"open || !showTrigger\" [ngClass]=\"panelClasses\">\n <ng-content></ng-content>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
36
85
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmPopoverComponent, decorators: [{
37
86
  type: Component,
38
- args: [{ selector: 'pdm-popover', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"relative inline-block\" [ngClass]=\"className\">\n <button *ngIf=\"showTrigger\" type=\"button\" class=\"inline-flex h-9 appearance-none items-center justify-center rounded-md border border-input bg-background px-3 text-sm font-medium text-foreground shadow-sm\" [attr.aria-expanded]=\"open\" (click)=\"toggle()\">{{ triggerText }}</button>\n <div *ngIf=\"open || !showTrigger\" [ngClass]=\"['absolute left-0 top-full z-30 mt-2 min-w-80 rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md', panelClassName]\">\n <ng-content></ng-content>\n </div>\n</div>\n" }]
39
- }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { open: [{
40
- type: Input
41
- }], triggerText: [{
87
+ args: [{ selector: 'pdm-popover', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #anchorEl class=\"relative inline-block\" [ngClass]=\"className\">\n <button #triggerEl *ngIf=\"showTrigger\" type=\"button\" class=\"inline-flex h-9 appearance-none items-center justify-center rounded-md border border-input bg-background px-3 text-sm font-medium text-foreground shadow-sm\" [attr.aria-expanded]=\"open\" (click)=\"toggle()\">{{ triggerText }}</button>\n <div #panelEl *ngIf=\"open || !showTrigger\" [ngClass]=\"panelClasses\">\n <ng-content></ng-content>\n </div>\n</div>\n" }]
88
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { triggerText: [{
42
89
  type: Input
43
90
  }], className: [{
44
91
  type: Input
@@ -48,11 +95,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
48
95
  type: Input
49
96
  }], openChange: [{
50
97
  type: Output
98
+ }], anchorRef: [{
99
+ type: ViewChild,
100
+ args: ['anchorEl']
101
+ }], triggerRef: [{
102
+ type: ViewChild,
103
+ args: ['triggerEl']
104
+ }], panelRef: [{
105
+ type: ViewChild,
106
+ args: ['panelEl']
107
+ }], open: [{
108
+ type: Input
51
109
  }], onEsc: [{
52
110
  type: HostListener,
53
111
  args: ['document:keydown.escape']
54
112
  }], onDocumentClick: [{
55
113
  type: HostListener,
56
114
  args: ['document:click', ['$event']]
115
+ }], onViewportChange: [{
116
+ type: HostListener,
117
+ args: ['window:resize']
118
+ }, {
119
+ type: HostListener,
120
+ args: ['window:scroll']
57
121
  }] } });
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvcG9wb3Zlci9wb3BvdmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9wb3BvdmVyL3BvcG92ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQU8xSCxNQUFNLE9BQU8sbUJBQW1CO0lBUTlCLFlBQTZCLFVBQW1DO1FBQW5DLGVBQVUsR0FBVixVQUFVLENBQXlCO1FBUHZELFNBQUksR0FBRyxLQUFLLENBQUM7UUFDYixnQkFBVyxHQUFHLE1BQU0sQ0FBQztRQUNyQixjQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ2YsbUJBQWMsR0FBRyxFQUFFLENBQUM7UUFDcEIsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFDbEIsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7SUFFZ0IsQ0FBQztJQUVwRSxNQUFNO1FBQ0osSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFHRCxLQUFLO1FBQ0gsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2IsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7WUFDbEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDN0I7SUFDSCxDQUFDO0lBR0QsZUFBZSxDQUFDLEtBQWlCO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU87UUFDdkIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQXFCLENBQUM7UUFDM0MsSUFBSSxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDN0QsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7WUFDbEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDN0I7SUFDSCxDQUFDOztnSEEvQlUsbUJBQW1CO29HQUFuQixtQkFBbUIsa1ZDUGhDLDhsQkFNQTsyRkRDYSxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0UsYUFBYSxtQkFFTix1QkFBdUIsQ0FBQyxNQUFNO2lHQUd0QyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDSSxVQUFVO3NCQUFuQixNQUFNO2dCQVVQLEtBQUs7c0JBREosWUFBWTt1QkFBQyx5QkFBeUI7Z0JBU3ZDLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3BkbS1wb3BvdmVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3BvcG92ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBQZG1Qb3BvdmVyQ29tcG9uZW50IHtcbiAgQElucHV0KCkgb3BlbiA9IGZhbHNlO1xuICBASW5wdXQoKSB0cmlnZ2VyVGV4dCA9ICdPcGVuJztcbiAgQElucHV0KCkgY2xhc3NOYW1lID0gJyc7XG4gIEBJbnB1dCgpIHBhbmVsQ2xhc3NOYW1lID0gJyc7XG4gIEBJbnB1dCgpIHNob3dUcmlnZ2VyID0gdHJ1ZTtcbiAgQE91dHB1dCgpIG9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pikge31cblxuICB0b2dnbGUoKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuID0gIXRoaXMub3BlbjtcbiAgICB0aGlzLm9wZW5DaGFuZ2UuZW1pdCh0aGlzLm9wZW4pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bi5lc2NhcGUnKVxuICBvbkVzYygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vcGVuKSB7XG4gICAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMub3BlbkNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5vcGVuKSByZXR1cm47XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIE5vZGUgfCBudWxsO1xuICAgIGlmICh0YXJnZXQgJiYgIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5vcGVuQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInJlbGF0aXZlIGlubGluZS1ibG9ja1wiIFtuZ0NsYXNzXT1cImNsYXNzTmFtZVwiPlxuICA8YnV0dG9uICpuZ0lmPVwic2hvd1RyaWdnZXJcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJpbmxpbmUtZmxleCBoLTkgYXBwZWFyYW5jZS1ub25lIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItaW5wdXQgYmctYmFja2dyb3VuZCBweC0zIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1mb3JlZ3JvdW5kIHNoYWRvdy1zbVwiIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwib3BlblwiIChjbGljayk9XCJ0b2dnbGUoKVwiPnt7IHRyaWdnZXJUZXh0IH19PC9idXR0b24+XG4gIDxkaXYgKm5nSWY9XCJvcGVuIHx8ICFzaG93VHJpZ2dlclwiIFtuZ0NsYXNzXT1cIlsnYWJzb2x1dGUgbGVmdC0wIHRvcC1mdWxsIHotMzAgbXQtMiBtaW4tdy04MCByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItYm9yZGVyIGJnLXBvcG92ZXIgcC00IHRleHQtcG9wb3Zlci1mb3JlZ3JvdW5kIHNoYWRvdy1tZCcsIHBhbmVsQ2xhc3NOYW1lXVwiPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvcG9wb3Zlci9wb3BvdmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9wb3BvdmVyL3BvcG92ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQzs7O0FBT3ZCLE1BQU0sT0FBTyxtQkFBbUI7SUFjOUIsWUFDbUIsVUFBbUMsRUFDbkMsR0FBc0I7UUFEdEIsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFDbkMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFmakMsVUFBSyxHQUFHLEtBQUssQ0FBQztRQUNiLGdCQUFXLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDZixtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUNwQixnQkFBVyxHQUFHLElBQUksQ0FBQztRQUNsQixlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUVuRCxtQkFBYyxHQUFxQixRQUFRLENBQUM7SUFTekMsQ0FBQztJQUVKLElBQ0ksSUFBSSxDQUFDLEtBQWM7UUFDckIsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3JCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNkLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1NBQ3JDO2FBQU07WUFDTCxJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQztTQUNoQztRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUNELElBQUksSUFB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QUFTOytCQUNFLGFBQWEsbUJBRU4sdUJBQXVCLENBQUMsTUFBTTtpSUFJdEMsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDSSxVQUFVO3NCQUFuQixNQUFNO2dCQUl3QixTQUFTO3NCQUF2QyxTQUFTO3VCQUFDLFVBQVU7Z0JBQ1csVUFBVTtzQkFBekMsU0FBUzt1QkFBQyxXQUFXO2dCQUNRLFFBQVE7c0JBQXJDLFNBQVM7dUJBQUMsU0FBUztnQkFRaEIsSUFBSTtzQkFEUCxLQUFLO2dCQTZCTixLQUFLO3NCQURKLFlBQVk7dUJBQUMseUJBQXlCO2dCQVN2QyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBWTFDLGdCQUFnQjtzQkFGZixZQUFZO3VCQUFDLGVBQWU7O3NCQUM1QixZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncGRtLXBvcG92ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vcG9wb3Zlci5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFBkbVBvcG92ZXJDb21wb25lbnQge1xuICBwcml2YXRlIF9vcGVuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRyaWdnZXJUZXh0ID0gJ09wZW4nO1xuICBASW5wdXQoKSBjbGFzc05hbWUgPSAnJztcbiAgQElucHV0KCkgcGFuZWxDbGFzc05hbWUgPSAnJztcbiAgQElucHV0KCkgc2hvd1RyaWdnZXIgPSB0cnVlO1xuICBAT3V0cHV0KCkgb3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBwYW5lbFBsYWNlbWVudDogJ3RvcCcgfCAnYm90dG9tJyA9ICdib3R0b20nO1xuXG4gIEBWaWV3Q2hpbGQoJ2FuY2hvckVsJykgcHJpdmF0ZSBhbmNob3JSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgndHJpZ2dlckVsJykgcHJpdmF0ZSB0cmlnZ2VyUmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BhbmVsRWwnKSBwcml2YXRlIHBhbmVsUmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIEBJbnB1dCgpXG4gIHNldCBvcGVuKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fb3BlbiA9ICEhdmFsdWU7XG4gICAgaWYgKHRoaXMuX29wZW4pIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVQYW5lbFBsYWNlbWVudFVwZGF0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhbmVsUGxhY2VtZW50ID0gJ2JvdHRvbSc7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIGdldCBvcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9vcGVuO1xuICB9XG5cbiAgZ2V0IHBhbmVsQ2xhc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMucGFuZWxQbGFjZW1lbnQgPT09ICd0b3AnXG4gICAgICAgID8gJ2Fic29sdXRlIGJvdHRvbS1mdWxsIGxlZnQtMCB6LTMwIG1iLTIgbWluLXctODAgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWJvcmRlciBiZy1wb3BvdmVyIHAtNCB0ZXh0LXBvcG92ZXItZm9yZWdyb3VuZCBzaGFkb3ctbWQnXG4gICAgICAgIDogJ2Fic29sdXRlIGxlZnQtMCB0b3AtZnVsbCB6LTMwIG10LTIgbWluLXctODAgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWJvcmRlciBiZy1wb3BvdmVyIHAtNCB0ZXh0LXBvcG92ZXItZm9yZWdyb3VuZCBzaGFkb3ctbWQnLFxuICAgICAgdGhpcy5wYW5lbENsYXNzTmFtZVxuICAgIF07XG4gIH1cblxuICB0b2dnbGUoKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuID0gIXRoaXMub3BlbjtcbiAgICB0aGlzLm9wZW5DaGFuZ2UuZW1pdCh0aGlzLm9wZW4pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bi5lc2NhcGUnKVxuICBvbkVzYygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vcGVuKSB7XG4gICAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMub3BlbkNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5vcGVuKSByZXR1cm47XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIE5vZGUgfCBudWxsO1xuICAgIGlmICh0YXJnZXQgJiYgIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5vcGVuQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2Nyb2xsJylcbiAgb25WaWV3cG9ydENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZVBhbmVsUGxhY2VtZW50KCk7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlUGFuZWxQbGFjZW1lbnRVcGRhdGUoKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVBhbmVsUGxhY2VtZW50KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQYW5lbFBsYWNlbWVudCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub3BlbikgcmV0dXJuO1xuXG4gICAgY29uc3QgYW5jaG9yRWwgPSB0aGlzLnRyaWdnZXJSZWY/Lm5hdGl2ZUVsZW1lbnQgfHwgdGhpcy5hbmNob3JSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgcGFuZWxFbCA9IHRoaXMucGFuZWxSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFhbmNob3JFbCB8fCAhcGFuZWxFbCB8fCB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZpZXdwb3J0SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgIGNvbnN0IGdhcCA9IDg7XG4gICAgY29uc3QgYW5jaG9yUmVjdCA9IGFuY2hvckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHBhbmVsSGVpZ2h0ID0gcGFuZWxFbC5vZmZzZXRIZWlnaHQ7XG4gICAgY29uc3Qgc3BhY2VCZWxvdyA9IE1hdGgubWF4KDAsIHZpZXdwb3J0SGVpZ2h0IC0gYW5jaG9yUmVjdC5ib3R0b20gLSBnYXApO1xuICAgIGNvbnN0IHNwYWNlQWJvdmUgPSBNYXRoLm1heCgwLCBhbmNob3JSZWN0LnRvcCAtIGdhcCk7XG4gICAgY29uc3QgbmV4dFBsYWNlbWVudDogJ3RvcCcgfCAnYm90dG9tJyA9XG4gICAgICBzcGFjZUJlbG93IDwgcGFuZWxIZWlnaHQgJiYgc3BhY2VBYm92ZSA+IHNwYWNlQmVsb3cgPyAndG9wJyA6ICdib3R0b20nO1xuXG4gICAgaWYgKHRoaXMucGFuZWxQbGFjZW1lbnQgIT09IG5leHRQbGFjZW1lbnQpIHtcbiAgICAgIHRoaXMucGFuZWxQbGFjZW1lbnQgPSBuZXh0UGxhY2VtZW50O1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2ICNhbmNob3JFbCBjbGFzcz1cInJlbGF0aXZlIGlubGluZS1ibG9ja1wiIFtuZ0NsYXNzXT1cImNsYXNzTmFtZVwiPlxuICA8YnV0dG9uICN0cmlnZ2VyRWwgKm5nSWY9XCJzaG93VHJpZ2dlclwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImlubGluZS1mbGV4IGgtOSBhcHBlYXJhbmNlLW5vbmUgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIHB4LTMgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWZvcmVncm91bmQgc2hhZG93LXNtXCIgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJvcGVuXCIgKGNsaWNrKT1cInRvZ2dsZSgpXCI+e3sgdHJpZ2dlclRleHQgfX08L2J1dHRvbj5cbiAgPGRpdiAjcGFuZWxFbCAqbmdJZj1cIm9wZW4gfHwgIXNob3dUcmlnZ2VyXCIgW25nQ2xhc3NdPVwicGFuZWxDbGFzc2VzXCI+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -1,10 +1,11 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, ViewChild } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  import * as i1 from "@angular/common";
4
4
  import * as i2 from "../icon/icon.component";
5
5
  export class PdmSelectComponent {
6
- constructor(elementRef) {
6
+ constructor(elementRef, cdr) {
7
7
  this.elementRef = elementRef;
8
+ this.cdr = cdr;
8
9
  this.id = '';
9
10
  this.value = '';
10
11
  this.options = [];
@@ -13,6 +14,8 @@ export class PdmSelectComponent {
13
14
  this.className = '';
14
15
  this.placeholder = 'Select an option';
15
16
  this.open = false;
17
+ this.panelPlacement = 'bottom';
18
+ this.panelMaxHeightPx = null;
16
19
  this.valueChange = new EventEmitter();
17
20
  }
18
21
  get selectedOption() {
@@ -21,10 +24,22 @@ export class PdmSelectComponent {
21
24
  get selectedLabel() {
22
25
  return this.selectedOption?.label || this.placeholder;
23
26
  }
27
+ get panelClasses() {
28
+ return [
29
+ 'absolute left-0 z-50 w-full overflow-y-auto rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md',
30
+ this.panelPlacement === 'top' ? 'bottom-[calc(100%+4px)]' : 'top-[calc(100%+4px)]'
31
+ ];
32
+ }
24
33
  toggle() {
25
34
  if (this.disabled)
26
35
  return;
27
36
  this.open = !this.open;
37
+ if (this.open) {
38
+ this.schedulePanelPlacementUpdate();
39
+ return;
40
+ }
41
+ this.panelPlacement = 'bottom';
42
+ this.panelMaxHeightPx = null;
28
43
  }
29
44
  onChange(event) {
30
45
  this.valueChange.emit(event.target.value);
@@ -45,13 +60,39 @@ export class PdmSelectComponent {
45
60
  onEscape() {
46
61
  this.open = false;
47
62
  }
63
+ onViewportChange() {
64
+ this.updatePanelPlacement();
65
+ }
66
+ schedulePanelPlacementUpdate() {
67
+ setTimeout(() => this.updatePanelPlacement());
68
+ }
69
+ updatePanelPlacement() {
70
+ if (!this.open)
71
+ return;
72
+ const triggerEl = this.triggerRef?.nativeElement;
73
+ const panelEl = this.panelRef?.nativeElement;
74
+ if (!triggerEl || !panelEl || typeof window === 'undefined') {
75
+ return;
76
+ }
77
+ const viewportHeight = window.innerHeight;
78
+ const gap = 4;
79
+ const triggerRect = triggerEl.getBoundingClientRect();
80
+ const panelHeight = panelEl.offsetHeight;
81
+ const spaceBelow = Math.max(0, viewportHeight - triggerRect.bottom - gap);
82
+ const spaceAbove = Math.max(0, triggerRect.top - gap);
83
+ const nextPlacement = spaceBelow < panelHeight && spaceAbove > spaceBelow ? 'top' : 'bottom';
84
+ const availableHeight = nextPlacement === 'top' ? spaceAbove : spaceBelow;
85
+ this.panelPlacement = nextPlacement;
86
+ this.panelMaxHeightPx = Math.max(120, Math.min(384, Math.floor(availableHeight)));
87
+ this.cdr.markForCheck();
88
+ }
48
89
  }
49
- PdmSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmSelectComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
50
- PdmSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmSelectComponent, selector: "pdm-select", inputs: { id: "id", value: "value", options: "options", disabled: "disabled", invalid: "invalid", className: "className", placeholder: "placeholder" }, outputs: { valueChange: "valueChange" }, host: { listeners: { "document:click": "onDocumentClick($event)", "document:keydown.escape": "onEscape()" } }, ngImport: i0, template: "<div [ngClass]=\"['relative', className || 'w-full']\">\n <button\n type=\"button\"\n [id]=\"id\"\n [disabled]=\"disabled\"\n [attr.aria-invalid]=\"invalid\"\n [attr.aria-expanded]=\"open\"\n [attr.data-state]=\"open ? 'open' : 'closed'\"\n aria-haspopup=\"listbox\"\n (click)=\"toggle()\"\n [ngClass]=\"[\n 'border-input focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/50 aria-invalid:ring-2 aria-invalid:ring-destructive aria-invalid:border-destructive flex h-9 w-full appearance-none items-center justify-between rounded-md border bg-background px-3 py-2 text-sm shadow-sm outline-none disabled:cursor-not-allowed disabled:opacity-50',\n ]\"\n >\n <span\n [ngClass]=\"[\n 'min-w-0 flex-1 truncate text-left leading-5',\n selectedOption\n ? 'font-medium text-foreground'\n : 'font-normal text-muted-foreground',\n ]\"\n >\n {{ selectedLabel }}\n </span>\n <pdm-icon\n name=\"chevron-down\"\n [size]=\"16\"\n className=\"shrink-0 text-muted-foreground\"\n ></pdm-icon>\n </button>\n\n <div\n *ngIf=\"open\"\n role=\"listbox\"\n [attr.aria-labelledby]=\"id || null\"\n class=\"absolute left-0 top-[calc(100%+4px)] z-50 max-h-96 w-full overflow-y-auto rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md\"\n >\n <button\n *ngFor=\"let option of options\"\n type=\"button\"\n role=\"option\"\n [attr.aria-selected]=\"option.value === value\"\n [disabled]=\"option.disabled\"\n (click)=\"selectOption(option)\"\n [ngClass]=\"[\n 'flex w-full appearance-none items-center justify-between rounded-sm border-0 bg-transparent px-2 py-1.5 text-left text-sm outline-none transition-colors',\n option.disabled\n ? 'cursor-not-allowed opacity-50'\n : 'hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground',\n option.value === value ? 'text-foreground' : '',\n ]\"\n >\n <span class=\"min-w-0 flex-1 truncate leading-5\">{{ option.label }}</span>\n <span\n *ngIf=\"option.value === value\"\n class=\"ml-2 flex shrink-0 items-center justify-end\"\n >\n <pdm-icon\n name=\"check\"\n [size]=\"16\"\n className=\"shrink-0 text-current\"\n ></pdm-icon>\n </span>\n </button>\n </div>\n\n <select\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [value]=\"value\"\n (change)=\"onChange($event)\"\n >\n <option\n *ngFor=\"let option of options\"\n [value]=\"option.value\"\n [disabled]=\"option.disabled\"\n >\n {{ option.label }}\n </option>\n </select>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.PdmIconComponent, selector: "pdm-icon", inputs: ["name", "library", "assetUrl", "size", "strokeWidth", "className", "ariaLabel", "decorative"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
90
+ PdmSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmSelectComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
91
+ PdmSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmSelectComponent, selector: "pdm-select", inputs: { id: "id", value: "value", options: "options", disabled: "disabled", invalid: "invalid", className: "className", placeholder: "placeholder" }, outputs: { valueChange: "valueChange" }, host: { listeners: { "document:click": "onDocumentClick($event)", "document:keydown.escape": "onEscape()", "window:resize": "onViewportChange()", "window:scroll": "onViewportChange()" } }, viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["triggerEl"], descendants: true }, { propertyName: "panelRef", first: true, predicate: ["panelEl"], descendants: true }], ngImport: i0, template: "<div [ngClass]=\"['relative', className || 'w-full']\">\n <button\n #triggerEl\n type=\"button\"\n [id]=\"id\"\n [disabled]=\"disabled\"\n [attr.aria-invalid]=\"invalid\"\n [attr.aria-expanded]=\"open\"\n [attr.data-state]=\"open ? 'open' : 'closed'\"\n aria-haspopup=\"listbox\"\n (click)=\"toggle()\"\n [ngClass]=\"[\n 'border-input focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/50 aria-invalid:ring-2 aria-invalid:ring-destructive aria-invalid:border-destructive flex h-9 w-full appearance-none items-center justify-between rounded-md border bg-background px-3 py-2 text-sm shadow-sm outline-none disabled:cursor-not-allowed disabled:opacity-50',\n ]\"\n >\n <span\n [ngClass]=\"[\n 'min-w-0 flex-1 truncate text-left leading-5',\n selectedOption\n ? 'font-medium text-foreground'\n : 'font-normal text-muted-foreground',\n ]\"\n >\n {{ selectedLabel }}\n </span>\n <pdm-icon\n name=\"chevron-down\"\n [size]=\"16\"\n className=\"shrink-0 text-muted-foreground\"\n ></pdm-icon>\n </button>\n\n <div\n *ngIf=\"open\"\n #panelEl\n role=\"listbox\"\n [attr.aria-labelledby]=\"id || null\"\n [ngClass]=\"panelClasses\"\n [style.max-height.px]=\"panelMaxHeightPx\"\n >\n <button\n *ngFor=\"let option of options\"\n type=\"button\"\n role=\"option\"\n [attr.aria-selected]=\"option.value === value\"\n [disabled]=\"option.disabled\"\n (click)=\"selectOption(option)\"\n [ngClass]=\"[\n 'flex w-full appearance-none items-center justify-between rounded-sm border-0 bg-transparent px-2 py-1.5 text-left text-sm outline-none transition-colors',\n option.disabled\n ? 'cursor-not-allowed opacity-50'\n : 'hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground',\n option.value === value ? 'text-foreground' : '',\n ]\"\n >\n <span class=\"min-w-0 flex-1 truncate leading-5\">{{ option.label }}</span>\n <span\n *ngIf=\"option.value === value\"\n class=\"ml-2 flex shrink-0 items-center justify-end\"\n >\n <pdm-icon\n name=\"check\"\n [size]=\"16\"\n className=\"shrink-0 text-current\"\n ></pdm-icon>\n </span>\n </button>\n </div>\n\n <select\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [value]=\"value\"\n (change)=\"onChange($event)\"\n >\n <option\n *ngFor=\"let option of options\"\n [value]=\"option.value\"\n [disabled]=\"option.disabled\"\n >\n {{ option.label }}\n </option>\n </select>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.PdmIconComponent, selector: "pdm-icon", inputs: ["name", "library", "assetUrl", "size", "strokeWidth", "className", "ariaLabel", "decorative"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
51
92
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmSelectComponent, decorators: [{
52
93
  type: Component,
53
- args: [{ selector: 'pdm-select', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"['relative', className || 'w-full']\">\n <button\n type=\"button\"\n [id]=\"id\"\n [disabled]=\"disabled\"\n [attr.aria-invalid]=\"invalid\"\n [attr.aria-expanded]=\"open\"\n [attr.data-state]=\"open ? 'open' : 'closed'\"\n aria-haspopup=\"listbox\"\n (click)=\"toggle()\"\n [ngClass]=\"[\n 'border-input focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/50 aria-invalid:ring-2 aria-invalid:ring-destructive aria-invalid:border-destructive flex h-9 w-full appearance-none items-center justify-between rounded-md border bg-background px-3 py-2 text-sm shadow-sm outline-none disabled:cursor-not-allowed disabled:opacity-50',\n ]\"\n >\n <span\n [ngClass]=\"[\n 'min-w-0 flex-1 truncate text-left leading-5',\n selectedOption\n ? 'font-medium text-foreground'\n : 'font-normal text-muted-foreground',\n ]\"\n >\n {{ selectedLabel }}\n </span>\n <pdm-icon\n name=\"chevron-down\"\n [size]=\"16\"\n className=\"shrink-0 text-muted-foreground\"\n ></pdm-icon>\n </button>\n\n <div\n *ngIf=\"open\"\n role=\"listbox\"\n [attr.aria-labelledby]=\"id || null\"\n class=\"absolute left-0 top-[calc(100%+4px)] z-50 max-h-96 w-full overflow-y-auto rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md\"\n >\n <button\n *ngFor=\"let option of options\"\n type=\"button\"\n role=\"option\"\n [attr.aria-selected]=\"option.value === value\"\n [disabled]=\"option.disabled\"\n (click)=\"selectOption(option)\"\n [ngClass]=\"[\n 'flex w-full appearance-none items-center justify-between rounded-sm border-0 bg-transparent px-2 py-1.5 text-left text-sm outline-none transition-colors',\n option.disabled\n ? 'cursor-not-allowed opacity-50'\n : 'hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground',\n option.value === value ? 'text-foreground' : '',\n ]\"\n >\n <span class=\"min-w-0 flex-1 truncate leading-5\">{{ option.label }}</span>\n <span\n *ngIf=\"option.value === value\"\n class=\"ml-2 flex shrink-0 items-center justify-end\"\n >\n <pdm-icon\n name=\"check\"\n [size]=\"16\"\n className=\"shrink-0 text-current\"\n ></pdm-icon>\n </span>\n </button>\n </div>\n\n <select\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [value]=\"value\"\n (change)=\"onChange($event)\"\n >\n <option\n *ngFor=\"let option of options\"\n [value]=\"option.value\"\n [disabled]=\"option.disabled\"\n >\n {{ option.label }}\n </option>\n </select>\n</div>\n" }]
54
- }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { id: [{
94
+ args: [{ selector: 'pdm-select', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"['relative', className || 'w-full']\">\n <button\n #triggerEl\n type=\"button\"\n [id]=\"id\"\n [disabled]=\"disabled\"\n [attr.aria-invalid]=\"invalid\"\n [attr.aria-expanded]=\"open\"\n [attr.data-state]=\"open ? 'open' : 'closed'\"\n aria-haspopup=\"listbox\"\n (click)=\"toggle()\"\n [ngClass]=\"[\n 'border-input focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/50 aria-invalid:ring-2 aria-invalid:ring-destructive aria-invalid:border-destructive flex h-9 w-full appearance-none items-center justify-between rounded-md border bg-background px-3 py-2 text-sm shadow-sm outline-none disabled:cursor-not-allowed disabled:opacity-50',\n ]\"\n >\n <span\n [ngClass]=\"[\n 'min-w-0 flex-1 truncate text-left leading-5',\n selectedOption\n ? 'font-medium text-foreground'\n : 'font-normal text-muted-foreground',\n ]\"\n >\n {{ selectedLabel }}\n </span>\n <pdm-icon\n name=\"chevron-down\"\n [size]=\"16\"\n className=\"shrink-0 text-muted-foreground\"\n ></pdm-icon>\n </button>\n\n <div\n *ngIf=\"open\"\n #panelEl\n role=\"listbox\"\n [attr.aria-labelledby]=\"id || null\"\n [ngClass]=\"panelClasses\"\n [style.max-height.px]=\"panelMaxHeightPx\"\n >\n <button\n *ngFor=\"let option of options\"\n type=\"button\"\n role=\"option\"\n [attr.aria-selected]=\"option.value === value\"\n [disabled]=\"option.disabled\"\n (click)=\"selectOption(option)\"\n [ngClass]=\"[\n 'flex w-full appearance-none items-center justify-between rounded-sm border-0 bg-transparent px-2 py-1.5 text-left text-sm outline-none transition-colors',\n option.disabled\n ? 'cursor-not-allowed opacity-50'\n : 'hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground',\n option.value === value ? 'text-foreground' : '',\n ]\"\n >\n <span class=\"min-w-0 flex-1 truncate leading-5\">{{ option.label }}</span>\n <span\n *ngIf=\"option.value === value\"\n class=\"ml-2 flex shrink-0 items-center justify-end\"\n >\n <pdm-icon\n name=\"check\"\n [size]=\"16\"\n className=\"shrink-0 text-current\"\n ></pdm-icon>\n </span>\n </button>\n </div>\n\n <select\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [value]=\"value\"\n (change)=\"onChange($event)\"\n >\n <option\n *ngFor=\"let option of options\"\n [value]=\"option.value\"\n [disabled]=\"option.disabled\"\n >\n {{ option.label }}\n </option>\n </select>\n</div>\n" }]
95
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { id: [{
55
96
  type: Input
56
97
  }], value: [{
57
98
  type: Input
@@ -67,11 +108,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
67
108
  type: Input
68
109
  }], valueChange: [{
69
110
  type: Output
111
+ }], triggerRef: [{
112
+ type: ViewChild,
113
+ args: ['triggerEl']
114
+ }], panelRef: [{
115
+ type: ViewChild,
116
+ args: ['panelEl']
70
117
  }], onDocumentClick: [{
71
118
  type: HostListener,
72
119
  args: ['document:click', ['$event']]
73
120
  }], onEscape: [{
74
121
  type: HostListener,
75
122
  args: ['document:keydown.escape']
123
+ }], onViewportChange: [{
124
+ type: HostListener,
125
+ args: ['window:resize']
126
+ }, {
127
+ type: HostListener,
128
+ args: ['window:scroll']
76
129
  }] } });
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBYTFILE1BQU0sT0FBTyxrQkFBa0I7SUFhN0IsWUFBNkIsVUFBbUM7UUFBbkMsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFadkQsT0FBRSxHQUFHLEVBQUUsQ0FBQztRQUNSLFVBQUssR0FBRyxFQUFFLENBQUM7UUFDWCxZQUFPLEdBQXNCLEVBQUUsQ0FBQztRQUNoQyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNmLGdCQUFXLEdBQUcsa0JBQWtCLENBQUM7UUFFMUMsU0FBSSxHQUFHLEtBQUssQ0FBQztRQUVILGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQUVnQixDQUFDO0lBRXBFLElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQ3hELENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDekIsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFZO1FBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFFLEtBQUssQ0FBQyxNQUE0QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxZQUFZLENBQUMsTUFBdUI7UUFDbEMsSUFBSSxNQUFNLENBQUMsUUFBUTtZQUFFLE9BQU87UUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFHRCxlQUFlLENBQUMsS0FBaUI7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFjLENBQUMsRUFBRTtZQUNqRSxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztTQUNuQjtJQUNILENBQUM7SUFHRCxRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7SUFDcEIsQ0FBQzs7K0dBakRVLGtCQUFrQjttR0FBbEIsa0JBQWtCLGtXQ2IvQixzdkZBa0ZBOzJGRHJFYSxrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0UsWUFBWSxtQkFFTCx1QkFBdUIsQ0FBQyxNQUFNO2lHQUd0QyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBSUksV0FBVztzQkFBcEIsTUFBTTtnQkE0QlAsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVMxQyxRQUFRO3NCQURQLFlBQVk7dUJBQUMseUJBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBQZG1TZWxlY3RPcHRpb24ge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3BkbS1zZWxlY3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgUGRtU2VsZWN0Q29tcG9uZW50IHtcbiAgQElucHV0KCkgaWQgPSAnJztcbiAgQElucHV0KCkgdmFsdWUgPSAnJztcbiAgQElucHV0KCkgb3B0aW9uczogUGRtU2VsZWN0T3B0aW9uW10gPSBbXTtcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgaW52YWxpZCA9IGZhbHNlO1xuICBASW5wdXQoKSBjbGFzc05hbWUgPSAnJztcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnU2VsZWN0IGFuIG9wdGlvbic7XG5cbiAgb3BlbiA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pIHt9XG5cbiAgZ2V0IHNlbGVjdGVkT3B0aW9uKCk6IFBkbVNlbGVjdE9wdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5maW5kKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSA9PT0gdGhpcy52YWx1ZSk7XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkT3B0aW9uPy5sYWJlbCB8fCB0aGlzLnBsYWNlaG9sZGVyO1xuICB9XG5cbiAgdG9nZ2xlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG4gICAgdGhpcy5vcGVuID0gIXRoaXMub3BlbjtcbiAgfVxuXG4gIG9uQ2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCgoZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50KS52YWx1ZSk7XG4gIH1cblxuICBzZWxlY3RPcHRpb24ob3B0aW9uOiBQZG1TZWxlY3RPcHRpb24pOiB2b2lkIHtcbiAgICBpZiAob3B0aW9uLmRpc2FibGVkKSByZXR1cm47XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KG9wdGlvbi52YWx1ZSk7XG4gICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5vcGVuKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJylcbiAgb25Fc2NhcGUoKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gIH1cbn1cbiIsIjxkaXYgW25nQ2xhc3NdPVwiWydyZWxhdGl2ZScsIGNsYXNzTmFtZSB8fCAndy1mdWxsJ11cIj5cbiAgPGJ1dHRvblxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIFtpZF09XCJpZFwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwiaW52YWxpZFwiXG4gICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJvcGVuXCJcbiAgICBbYXR0ci5kYXRhLXN0YXRlXT1cIm9wZW4gPyAnb3BlbicgOiAnY2xvc2VkJ1wiXG4gICAgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIlxuICAgIChjbGljayk9XCJ0b2dnbGUoKVwiXG4gICAgW25nQ2xhc3NdPVwiW1xuICAgICAgJ2JvcmRlci1pbnB1dCBmb2N1cy12aXNpYmxlOmJvcmRlci1yaW5nIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIGFyaWEtaW52YWxpZDpyaW5nLTIgYXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUgYXJpYS1pbnZhbGlkOmJvcmRlci1kZXN0cnVjdGl2ZSBmbGV4IGgtOSB3LWZ1bGwgYXBwZWFyYW5jZS1ub25lIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcm91bmRlZC1tZCBib3JkZXIgYmctYmFja2dyb3VuZCBweC0zIHB5LTIgdGV4dC1zbSBzaGFkb3ctc20gb3V0bGluZS1ub25lIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpvcGFjaXR5LTUwJyxcbiAgICBdXCJcbiAgPlxuICAgIDxzcGFuXG4gICAgICBbbmdDbGFzc109XCJbXG4gICAgICAgICdtaW4tdy0wIGZsZXgtMSB0cnVuY2F0ZSB0ZXh0LWxlZnQgbGVhZGluZy01JyxcbiAgICAgICAgc2VsZWN0ZWRPcHRpb25cbiAgICAgICAgICA/ICdmb250LW1lZGl1bSB0ZXh0LWZvcmVncm91bmQnXG4gICAgICAgICAgOiAnZm9udC1ub3JtYWwgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kJyxcbiAgICAgIF1cIlxuICAgID5cbiAgICAgIHt7IHNlbGVjdGVkTGFiZWwgfX1cbiAgICA8L3NwYW4+XG4gICAgPHBkbS1pY29uXG4gICAgICBuYW1lPVwiY2hldnJvbi1kb3duXCJcbiAgICAgIFtzaXplXT1cIjE2XCJcbiAgICAgIGNsYXNzTmFtZT1cInNocmluay0wIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiXG4gICAgPjwvcGRtLWljb24+XG4gIDwvYnV0dG9uPlxuXG4gIDxkaXZcbiAgICAqbmdJZj1cIm9wZW5cIlxuICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiaWQgfHwgbnVsbFwiXG4gICAgY2xhc3M9XCJhYnNvbHV0ZSBsZWZ0LTAgdG9wLVtjYWxjKDEwMCUrNHB4KV0gei01MCBtYXgtaC05NiB3LWZ1bGwgb3ZlcmZsb3cteS1hdXRvIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1ib3JkZXIgYmctcG9wb3ZlciBwLTEgdGV4dC1wb3BvdmVyLWZvcmVncm91bmQgc2hhZG93LW1kXCJcbiAgPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygb3B0aW9uc1wiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJvcHRpb24udmFsdWUgPT09IHZhbHVlXCJcbiAgICAgIFtkaXNhYmxlZF09XCJvcHRpb24uZGlzYWJsZWRcIlxuICAgICAgKGNsaWNrKT1cInNlbGVjdE9wdGlvbihvcHRpb24pXCJcbiAgICAgIFtuZ0NsYXNzXT1cIltcbiAgICAgICAgJ2ZsZXggdy1mdWxsIGFwcGVhcmFuY2Utbm9uZSBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHJvdW5kZWQtc20gYm9yZGVyLTAgYmctdHJhbnNwYXJlbnQgcHgtMiBweS0xLjUgdGV4dC1sZWZ0IHRleHQtc20gb3V0bGluZS1ub25lIHRyYW5zaXRpb24tY29sb3JzJyxcbiAgICAgICAgb3B0aW9uLmRpc2FibGVkXG4gICAgICAgICAgPyAnY3Vyc29yLW5vdC1hbGxvd2VkIG9wYWNpdHktNTAnXG4gICAgICAgICAgOiAnaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQgZm9jdXMtdmlzaWJsZTpiZy1hY2NlbnQgZm9jdXMtdmlzaWJsZTp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kJyxcbiAgICAgICAgb3B0aW9uLnZhbHVlID09PSB2YWx1ZSA/ICd0ZXh0LWZvcmVncm91bmQnIDogJycsXG4gICAgICBdXCJcbiAgICA+XG4gICAgICA8c3BhbiBjbGFzcz1cIm1pbi13LTAgZmxleC0xIHRydW5jYXRlIGxlYWRpbmctNVwiPnt7IG9wdGlvbi5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuXG4gICAgICAgICpuZ0lmPVwib3B0aW9uLnZhbHVlID09PSB2YWx1ZVwiXG4gICAgICAgIGNsYXNzPVwibWwtMiBmbGV4IHNocmluay0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWVuZFwiXG4gICAgICA+XG4gICAgICAgIDxwZG0taWNvblxuICAgICAgICAgIG5hbWU9XCJjaGVja1wiXG4gICAgICAgICAgW3NpemVdPVwiMTZcIlxuICAgICAgICAgIGNsYXNzTmFtZT1cInNocmluay0wIHRleHQtY3VycmVudFwiXG4gICAgICAgID48L3BkbS1pY29uPlxuICAgICAgPC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8c2VsZWN0XG4gICAgY2xhc3M9XCJzci1vbmx5XCJcbiAgICB0YWJpbmRleD1cIi0xXCJcbiAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgKGNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCJcbiAgPlxuICAgIDxvcHRpb25cbiAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygb3B0aW9uc1wiXG4gICAgICBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCJcbiAgICAgIFtkaXNhYmxlZF09XCJvcHRpb24uZGlzYWJsZWRcIlxuICAgID5cbiAgICAgIHt7IG9wdGlvbi5sYWJlbCB9fVxuICAgIDwvb3B0aW9uPlxuICA8L3NlbGVjdD5cbjwvZGl2PlxuIl19
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7Ozs7QUFhdkIsTUFBTSxPQUFPLGtCQUFrQjtJQWtCN0IsWUFDbUIsVUFBbUMsRUFDbkMsR0FBc0I7UUFEdEIsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFDbkMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFuQmhDLE9BQUUsR0FBRyxFQUFFLENBQUM7UUFDUixVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ1gsWUFBTyxHQUFzQixFQUFFLENBQUM7UUFDaEMsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDZixnQkFBVyxHQUFHLGtCQUFrQixDQUFDO1FBRTFDLFNBQUksR0FBRyxLQUFLLENBQUM7UUFDYixtQkFBYyxHQUFxQixRQUFRLENBQUM7UUFDNUMscUJBQWdCLEdBQWtCLElBQUksQ0FBQztRQUU3QixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7SUFRaEQsQ0FBQztJQUVKLElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsSUFB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UUFBUSxDQUFDO1FBQ3pFLE1BQU0sZUFBZSxHQUFHLGFBQWEsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1FBRTFFLElBQUksQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7OytHQTFHVSxrQkFBa0I7bUdBQWxCLGtCQUFrQiwrbUJDdkIvQiwwckZBcUZBOzJGRDlEYSxrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0UsWUFBWSxtQkFFTCx1QkFBdUIsQ0FBQyxNQUFNO2lJQUd0QyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBTUksV0FBVztzQkFBcEIsTUFBTTtnQkFFeUIsVUFBVTtzQkFBekMsU0FBUzt1QkFBQyxXQUFXO2dCQUNRLFFBQVE7c0JBQXJDLFNBQVM7dUJBQUMsU0FBUztnQkE4Q3BCLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFTMUMsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLHlCQUF5QjtnQkFPdkMsZ0JBQWdCO3NCQUZmLFlBQVk7dUJBQUMsZUFBZTs7c0JBQzVCLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBkbVNlbGVjdE9wdGlvbiB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncGRtLXNlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBQZG1TZWxlY3RDb21wb25lbnQge1xuICBASW5wdXQoKSBpZCA9ICcnO1xuICBASW5wdXQoKSB2YWx1ZSA9ICcnO1xuICBASW5wdXQoKSBvcHRpb25zOiBQZG1TZWxlY3RPcHRpb25bXSA9IFtdO1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBpbnZhbGlkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNsYXNzTmFtZSA9ICcnO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICdTZWxlY3QgYW4gb3B0aW9uJztcblxuICBvcGVuID0gZmFsc2U7XG4gIHBhbmVsUGxhY2VtZW50OiAndG9wJyB8ICdib3R0b20nID0gJ2JvdHRvbSc7XG4gIHBhbmVsTWF4SGVpZ2h0UHg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3RyaWdnZXJFbCcpIHByaXZhdGUgdHJpZ2dlclJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdwYW5lbEVsJykgcHJpdmF0ZSBwYW5lbFJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge31cblxuICBnZXQgc2VsZWN0ZWRPcHRpb24oKTogUGRtU2VsZWN0T3B0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSB0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRPcHRpb24/LmxhYmVsIHx8IHRoaXMucGxhY2Vob2xkZXI7XG4gIH1cblxuICBnZXQgcGFuZWxDbGFzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ2Fic29sdXRlIGxlZnQtMCB6LTUwIHctZnVsbCBvdmVyZmxvdy15LWF1dG8gcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWJvcmRlciBiZy1wb3BvdmVyIHAtMSB0ZXh0LXBvcG92ZXItZm9yZWdyb3VuZCBzaGFkb3ctbWQnLFxuICAgICAgdGhpcy5wYW5lbFBsYWNlbWVudCA9PT0gJ3RvcCcgPyAnYm90dG9tLVtjYWxjKDEwMCUrNHB4KV0nIDogJ3RvcC1bY2FsYygxMDAlKzRweCldJ1xuICAgIF07XG4gIH1cblxuICB0b2dnbGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcbiAgICB0aGlzLm9wZW4gPSAhdGhpcy5vcGVuO1xuXG4gICAgaWYgKHRoaXMub3Blbikge1xuICAgICAgdGhpcy5zY2hlZHVsZVBhbmVsUGxhY2VtZW50VXBkYXRlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wYW5lbFBsYWNlbWVudCA9ICdib3R0b20nO1xuICAgIHRoaXMucGFuZWxNYXhIZWlnaHRQeCA9IG51bGw7XG4gIH1cblxuICBvbkNoYW5nZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoKGV2ZW50LnRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudCkudmFsdWUpO1xuICB9XG5cbiAgc2VsZWN0T3B0aW9uKG9wdGlvbjogUGRtU2VsZWN0T3B0aW9uKTogdm9pZCB7XG4gICAgaWYgKG9wdGlvbi5kaXNhYmxlZCkgcmV0dXJuO1xuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChvcHRpb24udmFsdWUpO1xuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub3BlbikgcmV0dXJuO1xuICAgIGlmICghdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVzY2FwZScpXG4gIG9uRXNjYXBlKCk6IHZvaWQge1xuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnKVxuICBvblZpZXdwb3J0Q2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlUGFuZWxQbGFjZW1lbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVQYW5lbFBsYWNlbWVudFVwZGF0ZSgpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlUGFuZWxQbGFjZW1lbnQoKSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhbmVsUGxhY2VtZW50KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5vcGVuKSByZXR1cm47XG5cbiAgICBjb25zdCB0cmlnZ2VyRWwgPSB0aGlzLnRyaWdnZXJSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgcGFuZWxFbCA9IHRoaXMucGFuZWxSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF0cmlnZ2VyRWwgfHwgIXBhbmVsRWwgfHwgdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICBjb25zdCBnYXAgPSA0O1xuICAgIGNvbnN0IHRyaWdnZXJSZWN0ID0gdHJpZ2dlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHBhbmVsSGVpZ2h0ID0gcGFuZWxFbC5vZmZzZXRIZWlnaHQ7XG4gICAgY29uc3Qgc3BhY2VCZWxvdyA9IE1hdGgubWF4KDAsIHZpZXdwb3J0SGVpZ2h0IC0gdHJpZ2dlclJlY3QuYm90dG9tIC0gZ2FwKTtcbiAgICBjb25zdCBzcGFjZUFib3ZlID0gTWF0aC5tYXgoMCwgdHJpZ2dlclJlY3QudG9wIC0gZ2FwKTtcbiAgICBjb25zdCBuZXh0UGxhY2VtZW50OiAndG9wJyB8ICdib3R0b20nID1cbiAgICAgIHNwYWNlQmVsb3cgPCBwYW5lbEhlaWdodCAmJiBzcGFjZUFib3ZlID4gc3BhY2VCZWxvdyA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gICAgY29uc3QgYXZhaWxhYmxlSGVpZ2h0ID0gbmV4dFBsYWNlbWVudCA9PT0gJ3RvcCcgPyBzcGFjZUFib3ZlIDogc3BhY2VCZWxvdztcblxuICAgIHRoaXMucGFuZWxQbGFjZW1lbnQgPSBuZXh0UGxhY2VtZW50O1xuICAgIHRoaXMucGFuZWxNYXhIZWlnaHRQeCA9IE1hdGgubWF4KDEyMCwgTWF0aC5taW4oMzg0LCBNYXRoLmZsb29yKGF2YWlsYWJsZUhlaWdodCkpKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiPGRpdiBbbmdDbGFzc109XCJbJ3JlbGF0aXZlJywgY2xhc3NOYW1lIHx8ICd3LWZ1bGwnXVwiPlxuICA8YnV0dG9uXG4gICAgI3RyaWdnZXJFbFxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIFtpZF09XCJpZFwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwiaW52YWxpZFwiXG4gICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJvcGVuXCJcbiAgICBbYXR0ci5kYXRhLXN0YXRlXT1cIm9wZW4gPyAnb3BlbicgOiAnY2xvc2VkJ1wiXG4gICAgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIlxuICAgIChjbGljayk9XCJ0b2dnbGUoKVwiXG4gICAgW25nQ2xhc3NdPVwiW1xuICAgICAgJ2JvcmRlci1pbnB1dCBmb2N1cy12aXNpYmxlOmJvcmRlci1yaW5nIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIGFyaWEtaW52YWxpZDpyaW5nLTIgYXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUgYXJpYS1pbnZhbGlkOmJvcmRlci1kZXN0cnVjdGl2ZSBmbGV4IGgtOSB3LWZ1bGwgYXBwZWFyYW5jZS1ub25lIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcm91bmRlZC1tZCBib3JkZXIgYmctYmFja2dyb3VuZCBweC0zIHB5LTIgdGV4dC1zbSBzaGFkb3ctc20gb3V0bGluZS1ub25lIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpvcGFjaXR5LTUwJyxcbiAgICBdXCJcbiAgPlxuICAgIDxzcGFuXG4gICAgICBbbmdDbGFzc109XCJbXG4gICAgICAgICdtaW4tdy0wIGZsZXgtMSB0cnVuY2F0ZSB0ZXh0LWxlZnQgbGVhZGluZy01JyxcbiAgICAgICAgc2VsZWN0ZWRPcHRpb25cbiAgICAgICAgICA/ICdmb250LW1lZGl1bSB0ZXh0LWZvcmVncm91bmQnXG4gICAgICAgICAgOiAnZm9udC1ub3JtYWwgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kJyxcbiAgICAgIF1cIlxuICAgID5cbiAgICAgIHt7IHNlbGVjdGVkTGFiZWwgfX1cbiAgICA8L3NwYW4+XG4gICAgPHBkbS1pY29uXG4gICAgICBuYW1lPVwiY2hldnJvbi1kb3duXCJcbiAgICAgIFtzaXplXT1cIjE2XCJcbiAgICAgIGNsYXNzTmFtZT1cInNocmluay0wIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiXG4gICAgPjwvcGRtLWljb24+XG4gIDwvYnV0dG9uPlxuXG4gIDxkaXZcbiAgICAqbmdJZj1cIm9wZW5cIlxuICAgICNwYW5lbEVsXG4gICAgcm9sZT1cImxpc3Rib3hcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJpZCB8fCBudWxsXCJcbiAgICBbbmdDbGFzc109XCJwYW5lbENsYXNzZXNcIlxuICAgIFtzdHlsZS5tYXgtaGVpZ2h0LnB4XT1cInBhbmVsTWF4SGVpZ2h0UHhcIlxuICA+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cIm9wdGlvbi52YWx1ZSA9PT0gdmFsdWVcIlxuICAgICAgW2Rpc2FibGVkXT1cIm9wdGlvbi5kaXNhYmxlZFwiXG4gICAgICAoY2xpY2spPVwic2VsZWN0T3B0aW9uKG9wdGlvbilcIlxuICAgICAgW25nQ2xhc3NdPVwiW1xuICAgICAgICAnZmxleCB3LWZ1bGwgYXBwZWFyYW5jZS1ub25lIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcm91bmRlZC1zbSBib3JkZXItMCBiZy10cmFuc3BhcmVudCBweC0yIHB5LTEuNSB0ZXh0LWxlZnQgdGV4dC1zbSBvdXRsaW5lLW5vbmUgdHJhbnNpdGlvbi1jb2xvcnMnLFxuICAgICAgICBvcHRpb24uZGlzYWJsZWRcbiAgICAgICAgICA/ICdjdXJzb3Itbm90LWFsbG93ZWQgb3BhY2l0eS01MCdcbiAgICAgICAgICA6ICdob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCBmb2N1cy12aXNpYmxlOmJnLWFjY2VudCBmb2N1cy12aXNpYmxlOnRleHQtYWNjZW50LWZvcmVncm91bmQnLFxuICAgICAgICBvcHRpb24udmFsdWUgPT09IHZhbHVlID8gJ3RleHQtZm9yZWdyb3VuZCcgOiAnJyxcbiAgICAgIF1cIlxuICAgID5cbiAgICAgIDxzcGFuIGNsYXNzPVwibWluLXctMCBmbGV4LTEgdHJ1bmNhdGUgbGVhZGluZy01XCI+e3sgb3B0aW9uLmxhYmVsIH19PC9zcGFuPlxuICAgICAgPHNwYW5cbiAgICAgICAgKm5nSWY9XCJvcHRpb24udmFsdWUgPT09IHZhbHVlXCJcbiAgICAgICAgY2xhc3M9XCJtbC0yIGZsZXggc2hyaW5rLTAgaXRlbXMtY2VudGVyIGp1c3RpZnktZW5kXCJcbiAgICAgID5cbiAgICAgICAgPHBkbS1pY29uXG4gICAgICAgICAgbmFtZT1cImNoZWNrXCJcbiAgICAgICAgICBbc2l6ZV09XCIxNlwiXG4gICAgICAgICAgY2xhc3NOYW1lPVwic2hyaW5rLTAgdGV4dC1jdXJyZW50XCJcbiAgICAgICAgPjwvcGRtLWljb24+XG4gICAgICA8L3NwYW4+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDxzZWxlY3RcbiAgICBjbGFzcz1cInNyLW9ubHlcIlxuICAgIHRhYmluZGV4PVwiLTFcIlxuICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIlxuICA+XG4gICAgPG9wdGlvblxuICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zXCJcbiAgICAgIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIlxuICAgICAgW2Rpc2FibGVkXT1cIm9wdGlvbi5kaXNhYmxlZFwiXG4gICAgPlxuICAgICAge3sgb3B0aW9uLmxhYmVsIH19XG4gICAgPC9vcHRpb24+XG4gIDwvc2VsZWN0PlxuPC9kaXY+XG4iXX0=