UNPKG

@ux-aspects/ux-aspects

Version:

Open source user interface framework for building modern, responsive, mobile big data applications

167 lines 21.7 kB
import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, HostBinding, HostListener, inject, Input, Output } from '@angular/core'; import { Subject } from 'rxjs'; import { distinctUntilChanged, skip, takeUntil } from 'rxjs/operators'; import { FocusIndicatorOriginService } from '../../directives/accessibility/index'; import { SidePanelAnimationState, sidePanelStateAnimation } from './side-panel-animations'; import { SidePanelService } from './side-panel.service'; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/a11y"; import * as i2 from "../../directives/focus-if/focus-if.directive"; export class SidePanelComponent { constructor() { this.service = inject(SidePanelService); this._elementRef = inject(ElementRef); this._focusOrigin = inject(FocusIndicatorOriginService); this.inline = false; this.attachTo = 'window'; this.width = '50%'; this.top = '0'; this.modal = false; this.animate = false; this.closeOnExternalClick = false; this.focusOnShow = false; this.openChange = new EventEmitter(); this.closeOnEscape = true; this.animationPanelState = SidePanelAnimationState.Closed; this._onDestroy = new Subject(); } get open() { return this.service.open$.value; } set open(value) { this.service.open$.next(value); } get position() { if (this.inline) { return 'static'; } if (this.attachTo === 'container') { return 'absolute'; } return 'fixed'; } get cssWidth() { return this.getCssValue(this.width); } get cssTop() { return this.getCssValue(this.top); } get cssMinWidth() { return this.getCssValue(this.minWidth); } get cssMaxWidth() { return this.getCssValue(this.maxWidth); } get componentWidth() { if (this.inline) { return this.open ? this.cssWidth : '0'; } return null; } get hostWidth() { return this.inline ? '100%' : this.cssWidth; } get hostMinWidth() { return this.inline ? undefined : this.cssMinWidth; } get hostMaxWidth() { return this.inline ? undefined : this.cssMaxWidth; } ngOnInit() { this.service.open$.pipe(skip(1), distinctUntilChanged(), takeUntil(this._onDestroy)) .subscribe(isOpen => this.openChange.emit(isOpen)); this.service.open$.pipe(distinctUntilChanged(), takeUntil(this._onDestroy)).subscribe(isOpen => { this.animationPanelState = isOpen ? this.animate ? SidePanelAnimationState.Open : SidePanelAnimationState.OpenImmediate : SidePanelAnimationState.Closed; }); } ngOnDestroy() { this._onDestroy.next(); this._onDestroy.complete(); } openPanel() { this.service.open(); } closePanel() { this.service.close(); } _onDocumentEscape() { if (this.open && this.closeOnEscape) { this._focusOrigin.setOrigin('keyboard'); this.closePanel(); } } _onDocumentClick(target) { if (!this.open || !this.closeOnExternalClick) { return; } if (!this._elementRef.nativeElement.contains(target) || (target && target.classList.contains('modal-backdrop'))) { this.closePanel(); } } getCssValue(value) { if (typeof value === 'number') { return value === 0 ? '0' : value + 'px'; } return value; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SidePanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: SidePanelComponent, selector: "ux-side-panel", inputs: { open: "open", inline: "inline", attachTo: "attachTo", width: "width", minWidth: "minWidth", maxWidth: "maxWidth", top: "top", modal: "modal", animate: "animate", closeOnExternalClick: "closeOnExternalClick", focusOnShow: "focusOnShow", closeOnEscape: "closeOnEscape" }, outputs: { openChange: "openChange" }, host: { listeners: { "document:keyup.escape": "_onDocumentEscape()", "document:click": "_onDocumentClick($event.target)" }, properties: { "class.open": "this.open", "class.inline": "this.inline", "attr.aria-modal": "this.modal", "class.animate": "this.animate", "style.width": "this.componentWidth" }, classAttribute: "ux-side-panel" }, providers: [SidePanelService], exportAs: ["ux-side-panel"], ngImport: i0, template: "@if (modal && open) {\n <div class=\"modal-backdrop\"\n [style.position]=\"position\"\n [style.top]=\"cssTop\"></div>\n}\n\n@if (open) {\n <div class=\"ux-side-panel-host\"\n [class.modal-panel]=\"modal\"\n [style.position]=\"position\"\n [style.width]=\"hostWidth\"\n [style.min-width]=\"hostMinWidth\"\n [style.max-width]=\"hostMaxWidth\"\n [style.top]=\"cssTop\"\n [tabindex]=\"open ? 0 : -1\"\n [@panelState]=\"animationPanelState\"\n [focusIf]=\"open && focusOnShow\"\n [focusIfScroll]=\"false\"\n [cdkTrapFocus]=\"open && modal\"\n >\n <ng-content></ng-content>\n </div>\n}\n", dependencies: [{ kind: "directive", type: i1.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i2.FocusIfDirective, selector: "[focusIf]", inputs: ["focusIfDelay", "focusIfScroll", "focusIf"] }], animations: [sidePanelStateAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SidePanelComponent, decorators: [{ type: Component, args: [{ selector: 'ux-side-panel', exportAs: 'ux-side-panel', providers: [SidePanelService], animations: [sidePanelStateAnimation], changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'ux-side-panel' }, template: "@if (modal && open) {\n <div class=\"modal-backdrop\"\n [style.position]=\"position\"\n [style.top]=\"cssTop\"></div>\n}\n\n@if (open) {\n <div class=\"ux-side-panel-host\"\n [class.modal-panel]=\"modal\"\n [style.position]=\"position\"\n [style.width]=\"hostWidth\"\n [style.min-width]=\"hostMinWidth\"\n [style.max-width]=\"hostMaxWidth\"\n [style.top]=\"cssTop\"\n [tabindex]=\"open ? 0 : -1\"\n [@panelState]=\"animationPanelState\"\n [focusIf]=\"open && focusOnShow\"\n [focusIfScroll]=\"false\"\n [cdkTrapFocus]=\"open && modal\"\n >\n <ng-content></ng-content>\n </div>\n}\n" }] }], propDecorators: { open: [{ type: Input }, { type: HostBinding, args: ['class.open'] }], inline: [{ type: Input }, { type: HostBinding, args: ['class.inline'] }], attachTo: [{ type: Input }], width: [{ type: Input }], minWidth: [{ type: Input }], maxWidth: [{ type: Input }], top: [{ type: Input }], modal: [{ type: Input }, { type: HostBinding, args: ['attr.aria-modal'] }], animate: [{ type: Input }, { type: HostBinding, args: ['class.animate'] }], closeOnExternalClick: [{ type: Input }], focusOnShow: [{ type: Input }], openChange: [{ type: Output }], closeOnEscape: [{ type: Input }], componentWidth: [{ type: HostBinding, args: ['style.width'] }], _onDocumentEscape: [{ type: HostListener, args: ['document:keyup.escape'] }], _onDocumentClick: [{ type: HostListener, args: ['document:click', ['$event.target']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZS1wYW5lbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zaWRlLXBhbmVsL3NpZGUtcGFuZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc2lkZS1wYW5lbC9zaWRlLXBhbmVsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsSyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDbkYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLHVCQUF1QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0YsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7QUFheEQsTUFBTSxPQUFPLGtCQUFrQjtJQVgvQjtRQVl1QixZQUFPLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFckMsZ0JBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFakMsaUJBQVksR0FBRyxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQWNwRSxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBR2YsYUFBUSxHQUEyQixRQUFRLENBQUM7UUFHNUMsVUFBSyxHQUFvQixLQUFLLENBQUM7UUFTL0IsUUFBRyxHQUFvQixHQUFHLENBQUM7UUFJM0IsVUFBSyxHQUFHLEtBQUssQ0FB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QUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBpbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgc2tpcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRm9jdXNJbmRpY2F0b3JPcmlnaW5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9hY2Nlc3NpYmlsaXR5L2luZGV4JztcbmltcG9ydCB7IFNpZGVQYW5lbEFuaW1hdGlvblN0YXRlLCBzaWRlUGFuZWxTdGF0ZUFuaW1hdGlvbiB9IGZyb20gJy4vc2lkZS1wYW5lbC1hbmltYXRpb25zJztcbmltcG9ydCB7IFNpZGVQYW5lbFNlcnZpY2UgfSBmcm9tICcuL3NpZGUtcGFuZWwuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndXgtc2lkZS1wYW5lbCcsXG4gICAgZXhwb3J0QXM6ICd1eC1zaWRlLXBhbmVsJyxcbiAgICB0ZW1wbGF0ZVVybDogJ3NpZGUtcGFuZWwuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW1NpZGVQYW5lbFNlcnZpY2VdLFxuICAgIGFuaW1hdGlvbnM6IFtzaWRlUGFuZWxTdGF0ZUFuaW1hdGlvbl0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgaG9zdDoge1xuICAgICAgICBjbGFzczogJ3V4LXNpZGUtcGFuZWwnXG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBTaWRlUGFuZWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcnZpY2UgPSBpbmplY3QoU2lkZVBhbmVsU2VydmljZSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9lbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZm9jdXNPcmlnaW4gPSBpbmplY3QoRm9jdXNJbmRpY2F0b3JPcmlnaW5TZXJ2aWNlKTtcblxuICAgIEBJbnB1dCgpXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5vcGVuJylcbiAgICBnZXQgb3BlbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZS5vcGVuJC52YWx1ZTtcbiAgICB9XG5cbiAgICBzZXQgb3Blbih2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNlcnZpY2Uub3BlbiQubmV4dCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlubGluZScpXG4gICAgaW5saW5lID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIGF0dGFjaFRvOiAnd2luZG93JyB8ICdjb250YWluZXInID0gJ3dpbmRvdyc7XG5cbiAgICBASW5wdXQoKVxuICAgIHdpZHRoOiBzdHJpbmcgfCBudW1iZXIgPSAnNTAlJztcblxuICAgIEBJbnB1dCgpXG4gICAgbWluV2lkdGg6IHN0cmluZyB8IG51bWJlcjtcblxuICAgIEBJbnB1dCgpXG4gICAgbWF4V2lkdGg6IHN0cmluZyB8IG51bWJlcjtcblxuICAgIEBJbnB1dCgpXG4gICAgdG9wOiBzdHJpbmcgfCBudW1iZXIgPSAnMCc7XG5cbiAgICBASW5wdXQoKVxuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLW1vZGFsJylcbiAgICBtb2RhbCA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFuaW1hdGUnKVxuICAgIGFuaW1hdGUgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgY2xvc2VPbkV4dGVybmFsQ2xpY2sgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgZm9jdXNPblNob3c6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBPdXRwdXQoKVxuICAgIG9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICBASW5wdXQoKVxuICAgIGNsb3NlT25Fc2NhcGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgZ2V0IHBvc2l0aW9uKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmlubGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICdzdGF0aWMnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmF0dGFjaFRvID09PSAnY29udGFpbmVyJykge1xuICAgICAgICAgICAgcmV0dXJuICdhYnNvbHV0ZSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdmaXhlZCc7XG4gICAgfVxuXG4gICAgZ2V0IGNzc1dpZHRoKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENzc1ZhbHVlKHRoaXMud2lkdGgpO1xuICAgIH1cblxuICAgIGdldCBjc3NUb3AoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3NzVmFsdWUodGhpcy50b3ApO1xuICAgIH1cblxuICAgIGdldCBjc3NNaW5XaWR0aCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRDc3NWYWx1ZSh0aGlzLm1pbldpZHRoKTtcbiAgICB9XG5cbiAgICBnZXQgY3NzTWF4V2lkdGgoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3NzVmFsdWUodGhpcy5tYXhXaWR0aCk7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS53aWR0aCcpXG4gICAgZ2V0IGNvbXBvbmVudFdpZHRoKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmlubGluZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbiA/IHRoaXMuY3NzV2lkdGggOiAnMCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IGhvc3RXaWR0aCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmxpbmUgPyAnMTAwJScgOiB0aGlzLmNzc1dpZHRoO1xuICAgIH1cblxuICAgIGdldCBob3N0TWluV2lkdGgoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5saW5lID8gdW5kZWZpbmVkIDogdGhpcy5jc3NNaW5XaWR0aDtcbiAgICB9XG5cbiAgICBnZXQgaG9zdE1heFdpZHRoKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmlubGluZSA/IHVuZGVmaW5lZCA6IHRoaXMuY3NzTWF4V2lkdGg7XG4gICAgfVxuXG4gICAgYW5pbWF0aW9uUGFuZWxTdGF0ZTogU2lkZVBhbmVsQW5pbWF0aW9uU3RhdGUgPSBTaWRlUGFuZWxBbmltYXRpb25TdGF0ZS5DbG9zZWQ7XG5cbiAgICBwcm90ZWN0ZWQgX29uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLnNlcnZpY2Uub3BlbiQucGlwZShza2lwKDEpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCB0YWtlVW50aWwodGhpcy5fb25EZXN0cm95KSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoaXNPcGVuID0+IHRoaXMub3BlbkNoYW5nZS5lbWl0KGlzT3BlbikpO1xuXG4gICAgICAgIHRoaXMuc2VydmljZS5vcGVuJC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kpKS5zdWJzY3JpYmUoaXNPcGVuID0+IHtcbiAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uUGFuZWxTdGF0ZSA9IGlzT3BlblxuICAgICAgICAgICAgICAgID8gdGhpcy5hbmltYXRlXG4gICAgICAgICAgICAgICAgICAgID8gU2lkZVBhbmVsQW5pbWF0aW9uU3RhdGUuT3BlblxuICAgICAgICAgICAgICAgICAgICA6IFNpZGVQYW5lbEFuaW1hdGlvblN0YXRlLk9wZW5JbW1lZGlhdGVcbiAgICAgICAgICAgICAgICA6IFNpZGVQYW5lbEFuaW1hdGlvblN0YXRlLkNsb3NlZDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveS5uZXh0KCk7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveS5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIG9wZW5QYW5lbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLm9wZW4oKTtcbiAgICB9XG5cbiAgICBjbG9zZVBhbmVsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlcnZpY2UuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXl1cC5lc2NhcGUnKVxuICAgIF9vbkRvY3VtZW50RXNjYXBlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcGVuICYmIHRoaXMuY2xvc2VPbkVzY2FwZSkge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXNPcmlnaW4uc2V0T3JpZ2luKCdrZXlib2FyZCcpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50LnRhcmdldCddKVxuICAgIF9vbkRvY3VtZW50Q2xpY2sodGFyZ2V0OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMub3BlbiB8fCAhdGhpcy5jbG9zZU9uRXh0ZXJuYWxDbGljaykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSB8fCAodGFyZ2V0ICYmIHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ21vZGFsLWJhY2tkcm9wJykpKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q3NzVmFsdWUodmFsdWU6IG51bWJlciB8IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IDAgPyAnMCcgOiB2YWx1ZSArICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn1cbiIsIkBpZiAobW9kYWwgJiYgb3Blbikge1xuICA8ZGl2IGNsYXNzPVwibW9kYWwtYmFja2Ryb3BcIlxuICAgIFtzdHlsZS5wb3NpdGlvbl09XCJwb3NpdGlvblwiXG4gIFtzdHlsZS50b3BdPVwiY3NzVG9wXCI+PC9kaXY+XG59XG5cbkBpZiAob3Blbikge1xuICA8ZGl2IGNsYXNzPVwidXgtc2lkZS1wYW5lbC1ob3N0XCJcbiAgICBbY2xhc3MubW9kYWwtcGFuZWxdPVwibW9kYWxcIlxuICAgIFtzdHlsZS5wb3NpdGlvbl09XCJwb3NpdGlvblwiXG4gICAgW3N0eWxlLndpZHRoXT1cImhvc3RXaWR0aFwiXG4gICAgW3N0eWxlLm1pbi13aWR0aF09XCJob3N0TWluV2lkdGhcIlxuICAgIFtzdHlsZS5tYXgtd2lkdGhdPVwiaG9zdE1heFdpZHRoXCJcbiAgICBbc3R5bGUudG9wXT1cImNzc1RvcFwiXG4gICAgW3RhYmluZGV4XT1cIm9wZW4gPyAwIDogLTFcIlxuICAgIFtAcGFuZWxTdGF0ZV09XCJhbmltYXRpb25QYW5lbFN0YXRlXCJcbiAgICBbZm9jdXNJZl09XCJvcGVuICYmIGZvY3VzT25TaG93XCJcbiAgICBbZm9jdXNJZlNjcm9sbF09XCJmYWxzZVwiXG4gICAgW2Nka1RyYXBGb2N1c109XCJvcGVuICYmIG1vZGFsXCJcbiAgICA+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cbn1cbiJdfQ==