UNPKG

@ux-aspects/ux-aspects

Version:

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

105 lines 16.3 kB
import { DOWN_ARROW, ENTER, ESCAPE, LEFT_ARROW, RIGHT_ARROW, UP_ARROW } from '@angular/cdk/keycodes'; import { Attribute, ChangeDetectionStrategy, Component, HostListener, inject, Input, ViewChild } from '@angular/core'; import { BehaviorSubject, Subject } from 'rxjs'; import { filter, takeUntil } from 'rxjs/operators'; import { TooltipDirective } from '../tooltip/index'; import { FloatingActionButtonsService } from './floating-action-buttons.service'; import * as i0 from "@angular/core"; import * as i1 from "../../directives/accessibility/focus-indicator/focus-indicator.directive"; import * as i2 from "@angular/common"; export class FloatingActionButtonComponent { constructor(primary) { this.fab = inject(FloatingActionButtonsService); this._tooltip = inject(TooltipDirective, { optional: true }); /** Determine if this is the primary button in the set */ this.primary = false; /** Store the tabindex */ this.tabindex$ = new BehaviorSubject(-1); /** Unsubscribe from all observables on component destroy */ this._onDestroy = new Subject(); this.primary = primary !== null; } ngAfterViewInit() { if (this._tooltip) { // ensure the tooltip gets hidden when the button is hidden this.fab.open$.pipe(takeUntil(this._onDestroy), filter(isOpen => !isOpen && !this.primary)) .subscribe(() => this._tooltip.hide()); } } ngOnDestroy() { this._onDestroy.next(); this._onDestroy.complete(); } focus() { this.button.nativeElement.focus(); } onFocus() { // ensure the tooltip gets shown if (this._tooltip) { this._tooltip.show(); } } onBlur() { // ensure the tooltip gets hidden if (this._tooltip) { this._tooltip.hide(); } } close() { this.fab.close(); } onKeydown(event) { switch (event.which) { case UP_ARROW: if (this.fab.isVertical()) { this.fab.focusSibling(this.fab.direction$.value !== 'bottom'); event.preventDefault(); } break; case DOWN_ARROW: if (this.fab.isVertical()) { this.fab.focusSibling(this.fab.direction$.value === 'bottom'); event.preventDefault(); } break; case LEFT_ARROW: if (this.fab.isHorizontal()) { this.fab.focusSibling(this.fab.direction$.value !== 'right'); event.preventDefault(); } break; case RIGHT_ARROW: if (this.fab.isHorizontal()) { this.fab.focusSibling(this.fab.direction$.value === 'right'); event.preventDefault(); } break; case ENTER: this.fab.focusPrimaryButton(); break; case ESCAPE: this.fab.focusPrimaryButton(); this.fab.close(); break; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: FloatingActionButtonComponent, deps: [{ token: 'fab-primary', attribute: true }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: FloatingActionButtonComponent, selector: "ux-floating-action-button", inputs: { ariaLabel: ["aria-label", "ariaLabel"] }, host: { listeners: { "keydown": "onKeydown($event)" } }, viewQueries: [{ propertyName: "button", first: true, predicate: ["button"], descendants: true, static: true }], ngImport: i0, template: "<button #button\n uxFocusIndicator\n [programmaticFocusIndicator]=\"true\"\n type=\"button\"\n class=\"btn floating-action-button\"\n [class.button-primary]=\"primary\"\n [class.button-secondary]=\"!primary\"\n [attr.aria-label]=\"ariaLabel\"\n [tabIndex]=\"tabindex$ | async\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (click)=\"primary ? fab.toggle() : close()\">\n\n <ng-content></ng-content>\n\n</button>", dependencies: [{ kind: "directive", type: i1.FocusIndicatorDirective, selector: "[uxFocusIndicator]", inputs: ["checkChildren", "mouseFocusIndicator", "touchFocusIndicator", "keyboardFocusIndicator", "programmaticFocusIndicator"], outputs: ["indicator"], exportAs: ["ux-focus-indicator"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: FloatingActionButtonComponent, decorators: [{ type: Component, args: [{ selector: 'ux-floating-action-button', changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, template: "<button #button\n uxFocusIndicator\n [programmaticFocusIndicator]=\"true\"\n type=\"button\"\n class=\"btn floating-action-button\"\n [class.button-primary]=\"primary\"\n [class.button-secondary]=\"!primary\"\n [attr.aria-label]=\"ariaLabel\"\n [tabIndex]=\"tabindex$ | async\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (click)=\"primary ? fab.toggle() : close()\">\n\n <ng-content></ng-content>\n\n</button>" }] }], ctorParameters: () => [{ type: undefined, decorators: [{ type: Attribute, args: ['fab-primary'] }] }], propDecorators: { ariaLabel: [{ type: Input, args: ['aria-label'] }], button: [{ type: ViewChild, args: ['button', { static: true }] }], onKeydown: [{ type: HostListener, args: ['keydown', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvYXRpbmctYWN0aW9uLWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy1hY3Rpb24tYnV0dG9ucy9mbG9hdGluZy1hY3Rpb24tYnV0dG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLWFjdGlvbi1idXR0b25zL2Zsb2F0aW5nLWFjdGlvbi1idXR0b24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckcsT0FBTyxFQUFpQixTQUFTLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFhLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1SixPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOzs7O0FBUWpGLE1BQU0sT0FBTyw2QkFBNkI7SUFvQnRDLFlBQXNDLE9BQWU7UUFuQjVDLFFBQUcsR0FBRyxNQUFNLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUVuQyxhQUFRLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFHLElBQUksRUFBQyxDQUFDLENBQUM7UUFRekUseURBQXlEO1FBQ3pELFlBQU8sR0FBWSxLQUFLLENBQUM7UUFFekIseUJBQXlCO1FBQ3pCLGNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTVDLDREQUE0RDtRQUMzQyxlQUFVLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUc5QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sS0FBSyxJQUFJLENBQUM7SUFDcEMsQ0FBQztJQUVELGVBQWU7UUFFWCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQiwyREFBMkQ7WUFDM0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ3RGLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxLQUFLO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVELE9BQU87UUFDSCxnQ0FBZ0M7UUFDaEMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6QixDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU07UUFDRixpQ0FBaUM7UUFDakMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6QixDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUs7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFHRCxTQUFTLENBQUMsS0FBb0I7UUFFMUIsUUFBUSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFbEIsS0FBSyxRQUFRO2dCQUNULElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO29CQUN4QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUM7b0JBQzlELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDM0IsQ0FBQztnQkFDRCxNQUFNO1lBRVYsS0FBSyxVQUFVO2dCQUNYLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO29CQUN4QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUM7b0JBQzlELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDM0IsQ0FBQztnQkFDRCxNQUFNO1lBRVYsS0FBSyxVQUFVO2dCQUNYLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO29CQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDLENBQUM7b0JBQzdELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDM0IsQ0FBQztnQkFDRCxNQUFNO1lBRVYsS0FBSyxXQUFXO2dCQUNaLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO29CQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDLENBQUM7b0JBQzdELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDM0IsQ0FBQztnQkFDRCxNQUFNO1lBRVYsS0FBSyxLQUFLO2dCQUNOLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDOUIsTUFBTTtZQUVWLEtBQUssTUFBTTtnQkFDUCxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2pCLE1BQU07UUFFZCxDQUFDO0lBRUwsQ0FBQzsrR0F4R1EsNkJBQTZCLGtCQW9CZixhQUFhO21HQXBCM0IsNkJBQTZCLDhSQ2IxQyxnZkFlUzs7NEZERkksNkJBQTZCO2tCQU56QyxTQUFTOytCQUNJLDJCQUEyQixtQkFFcEIsdUJBQXVCLENBQUMsTUFBTSx1QkFDMUIsS0FBSzs7MEJBc0JiLFNBQVM7MkJBQUMsYUFBYTt5Q0FkZixTQUFTO3NCQUE3QixLQUFLO3VCQUFDLFlBQVk7Z0JBR29CLE1BQU07c0JBQTVDLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFvRHJDLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET1dOX0FSUk9XLCBFTlRFUiwgRVNDQVBFLCBMRUZUX0FSUk9XLCBSSUdIVF9BUlJPVywgVVBfQVJST1cgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQXR0cmlidXRlLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIGluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgVG9vbHRpcERpcmVjdGl2ZSB9IGZyb20gJy4uL3Rvb2x0aXAvaW5kZXgnO1xuaW1wb3J0IHsgRmxvYXRpbmdBY3Rpb25CdXR0b25zU2VydmljZSB9IGZyb20gJy4vZmxvYXRpbmctYWN0aW9uLWJ1dHRvbnMuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndXgtZmxvYXRpbmctYWN0aW9uLWJ1dHRvbicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Zsb2F0aW5nLWFjdGlvbi1idXR0b24uY29tcG9uZW50Lmh0bWwnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlXG59KVxuZXhwb3J0IGNsYXNzIEZsb2F0aW5nQWN0aW9uQnV0dG9uQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICByZWFkb25seSBmYWIgPSBpbmplY3QoRmxvYXRpbmdBY3Rpb25CdXR0b25zU2VydmljZSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF90b29sdGlwID0gaW5qZWN0KFRvb2x0aXBEaXJlY3RpdmUsIHsgb3B0aW9uYWwgOiB0cnVlfSk7XG5cbiAgICAvKiogRGVmaW5lIHRoZSBhcmlhIGxhYmVsIGZvciB0aGUgYnV0dG9uICovXG4gICAgQElucHV0KCdhcmlhLWxhYmVsJykgYXJpYUxhYmVsOiBzdHJpbmc7XG5cbiAgICAvKiogQWNjZXNzIHRoZSBlbGVtZW50IHJlZiBvZiB0aGUgYnV0dG9uIGVsZW1lbnQgKi9cbiAgICBAVmlld0NoaWxkKCdidXR0b24nLCB7IHN0YXRpYzogdHJ1ZSB9KSBidXR0b246IEVsZW1lbnRSZWY7XG5cbiAgICAvKiogRGV0ZXJtaW5lIGlmIHRoaXMgaXMgdGhlIHByaW1hcnkgYnV0dG9uIGluIHRoZSBzZXQgKi9cbiAgICBwcmltYXJ5OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogU3RvcmUgdGhlIHRhYmluZGV4ICovXG4gICAgdGFiaW5kZXgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KC0xKTtcblxuICAgIC8qKiBVbnN1YnNjcmliZSBmcm9tIGFsbCBvYnNlcnZhYmxlcyBvbiBjb21wb25lbnQgZGVzdHJveSAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcihAQXR0cmlidXRlKCdmYWItcHJpbWFyeScpIHByaW1hcnk6IHN0cmluZykge1xuICAgICAgICB0aGlzLnByaW1hcnkgPSBwcmltYXJ5ICE9PSBudWxsO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcblxuICAgICAgICBpZiAodGhpcy5fdG9vbHRpcCkge1xuICAgICAgICAgICAgLy8gZW5zdXJlIHRoZSB0b29sdGlwIGdldHMgaGlkZGVuIHdoZW4gdGhlIGJ1dHRvbiBpcyBoaWRkZW5cbiAgICAgICAgICAgIHRoaXMuZmFiLm9wZW4kLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSksIGZpbHRlcihpc09wZW4gPT4gIWlzT3BlbiAmJiAhdGhpcy5wcmltYXJ5KSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX3Rvb2x0aXAuaGlkZSgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kubmV4dCgpO1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBmb2N1cygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5idXR0b24ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIG9uRm9jdXMoKTogdm9pZCB7XG4gICAgICAgIC8vIGVuc3VyZSB0aGUgdG9vbHRpcCBnZXRzIHNob3duXG4gICAgICAgIGlmICh0aGlzLl90b29sdGlwKSB7XG4gICAgICAgICAgICB0aGlzLl90b29sdGlwLnNob3coKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQmx1cigpOiB2b2lkIHtcbiAgICAgICAgLy8gZW5zdXJlIHRoZSB0b29sdGlwIGdldHMgaGlkZGVuXG4gICAgICAgIGlmICh0aGlzLl90b29sdGlwKSB7XG4gICAgICAgICAgICB0aGlzLl90b29sdGlwLmhpZGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZhYi5jbG9zZSgpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICAgIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuXG4gICAgICAgIHN3aXRjaCAoZXZlbnQud2hpY2gpIHtcblxuICAgICAgICAgICAgY2FzZSBVUF9BUlJPVzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5mYWIuaXNWZXJ0aWNhbCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmFiLmZvY3VzU2libGluZyh0aGlzLmZhYi5kaXJlY3Rpb24kLnZhbHVlICE9PSAnYm90dG9tJyk7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIERPV05fQVJST1c6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmFiLmlzVmVydGljYWwoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZhYi5mb2N1c1NpYmxpbmcodGhpcy5mYWIuZGlyZWN0aW9uJC52YWx1ZSA9PT0gJ2JvdHRvbScpO1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBMRUZUX0FSUk9XOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZhYi5pc0hvcml6b250YWwoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZhYi5mb2N1c1NpYmxpbmcodGhpcy5mYWIuZGlyZWN0aW9uJC52YWx1ZSAhPT0gJ3JpZ2h0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFJJR0hUX0FSUk9XOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZhYi5pc0hvcml6b250YWwoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZhYi5mb2N1c1NpYmxpbmcodGhpcy5mYWIuZGlyZWN0aW9uJC52YWx1ZSA9PT0gJ3JpZ2h0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIEVOVEVSOlxuICAgICAgICAgICAgICAgIHRoaXMuZmFiLmZvY3VzUHJpbWFyeUJ1dHRvbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIEVTQ0FQRTpcbiAgICAgICAgICAgICAgICB0aGlzLmZhYi5mb2N1c1ByaW1hcnlCdXR0b24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZhYi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIH1cblxuICAgIH1cbn1cbiIsIjxidXR0b24gI2J1dHRvblxuICAgICAgICB1eEZvY3VzSW5kaWNhdG9yXG4gICAgICAgIFtwcm9ncmFtbWF0aWNGb2N1c0luZGljYXRvcl09XCJ0cnVlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiYnRuIGZsb2F0aW5nLWFjdGlvbi1idXR0b25cIlxuICAgICAgICBbY2xhc3MuYnV0dG9uLXByaW1hcnldPVwicHJpbWFyeVwiXG4gICAgICAgIFtjbGFzcy5idXR0b24tc2Vjb25kYXJ5XT1cIiFwcmltYXJ5XCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIlxuICAgICAgICBbdGFiSW5kZXhdPVwidGFiaW5kZXgkIHwgYXN5bmNcIlxuICAgICAgICAoZm9jdXMpPVwib25Gb2N1cygpXCJcbiAgICAgICAgKGJsdXIpPVwib25CbHVyKClcIlxuICAgICAgICAoY2xpY2spPVwicHJpbWFyeSA/IGZhYi50b2dnbGUoKSA6IGNsb3NlKClcIj5cblxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cblxuPC9idXR0b24+Il19