UNPKG

@engie-group/fluid-design-system-angular

Version:

Fluid Design System Angular

149 lines 21.1 kB
import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core'; import { Subject, takeUntil } from 'rxjs'; import { Utils } from '../../utils/utils.util'; import { TabComponent } from '../tab/tab.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class TabsComponent { constructor(cdr) { this.cdr = cdr; this.tabClass = 'nj-tab'; this.unsubscribe = new Subject(); /** * Tabs density */ this.density = 'normal'; /** * Output that emits selected tab index */ this.selectedTab = new EventEmitter(); } ngAfterViewInit() { // A render is being done after view init so setTimeout allows us to delay any attribute modification // in the call stack so it can be taken account on next render only setTimeout(() => { this.tabs = this.tabsList?.toArray(); this.initializeClickListener(); this.initializeKeydownListener(); const activeIndex = this.tabs?.findIndex(tab => tab?.isActive); this.goToTab(activeIndex === -1 ? 0 : activeIndex, false); }); } ngOnDestroy() { this.unsubscribe.next(); this.unsubscribe.complete(); } /** * Check if tab is active * @param index index of tab to check */ isActiveTab(index) { return this.activeTabIndex === index; } /** * Allows you to navigate to tab * @param index index of tab to select * @param emit emits if set to true */ goToTab(index, emit = true) { const validIndex = (Utils.isUndefinedOrNull(index) || index < 0) ? 0 : index; this.activeTabIndex = validIndex; this.renderTemplate(validIndex); if (emit) { this.selectedTab.emit(validIndex); } this.cdr.markForCheck(); } /** * @ignore */ focusNextFocusableTab() { const focusableTabs = Array.from(this.tabs).filter(tab => !tab.isDisabled); const focusedTabIndex = focusableTabs.findIndex(tab => document.activeElement === tab.tab.nativeElement); const nextFocusableTab = focusableTabs[(focusedTabIndex + 1) % focusableTabs.length]; nextFocusableTab.tab.nativeElement.focus(); } /** * @ignore */ focusPreviousFocusableTab() { const focusableTabs = Array.from(this.tabs).filter(tab => !tab.isDisabled); const focusedTabIndex = focusableTabs.findIndex(tab => document.activeElement === tab.tab.nativeElement); const previousFocusableTabIndex = focusedTabIndex === 0 ? focusableTabs.length - 1 : focusedTabIndex - 1; const previousFocusableTab = focusableTabs[previousFocusableTabIndex]; previousFocusableTab.tab.nativeElement.focus(); } /** * @ignore */ handleTabKeydown(event) { switch (event.key) { case 'ArrowRight': event.preventDefault(); this.focusNextFocusableTab(); break; case 'ArrowLeft': event.preventDefault(); this.focusPreviousFocusableTab(); break; default: } } getDensityClass() { if (!this.density || this.density === 'normal') { return; } return `${this.tabClass}--${this.density}`; } initializeClickListener() { if (Utils.isUndefinedOrNull(this.tabs)) { return; } this.tabs.forEach((tab, index) => { tab.tabSelect .pipe(takeUntil(this.unsubscribe)) .subscribe(_ => { this.goToTab(index); }); }); } initializeKeydownListener() { if (Utils.isUndefinedOrNull(this.tabs)) { return; } this.tabs.forEach(tab => { tab.tabMove.pipe(takeUntil(this.unsubscribe)) .subscribe(event => { this.handleTabKeydown(event); }); }); } renderTemplate(index) { for (const tab of this.tabs) { if (tab?.isActive) { tab.setIsActive(false); } } this.tabToRender = this.tabs?.[index]; this.tabToRender.setIsActive(true); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TabsComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TabsComponent, isStandalone: true, selector: "nj-tabs", inputs: { label: "label", density: "density" }, outputs: { selectedTab: "selectedTab" }, queries: [{ propertyName: "tabsList", predicate: TabComponent }], ngImport: i0, template: "<div class=\"nj-tab\" [ngClass]=\"getDensityClass()\">\n <div class=\"nj-tab__items\" role=\"tablist\" [attr.aria-label]=\"label\">\n <ng-content></ng-content>\n </div>\n <div class=\"nj-tab__content-wrapper\">\n <div class=\"nj-tab__content nj-tab__content--active\" *ngIf=\"tabToRender\"\n [attr.id]=\"tabToRender.tabContentId\"\n [attr.aria-labelledby]=\"tabToRender.tabContentAriaLabelledBy\"\n role=\"tabpanel\"\n tabIndex=\"0\">\n <ng-container *ngTemplateOutlet=\"tabToRender.contentTemplateRef\"></ng-container>\n </div>\n </div>\n</div>\n", styles: [".nj-tab__content-wrapper{margin:var(--nj-semantic-size-spacing-24) 0}.nj-tab--stretched nj-tab{display:inline-flex;flex-grow:1}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TabsComponent, decorators: [{ type: Component, args: [{ selector: 'nj-tabs', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, standalone: true, imports: [TabComponent, CommonModule], template: "<div class=\"nj-tab\" [ngClass]=\"getDensityClass()\">\n <div class=\"nj-tab__items\" role=\"tablist\" [attr.aria-label]=\"label\">\n <ng-content></ng-content>\n </div>\n <div class=\"nj-tab__content-wrapper\">\n <div class=\"nj-tab__content nj-tab__content--active\" *ngIf=\"tabToRender\"\n [attr.id]=\"tabToRender.tabContentId\"\n [attr.aria-labelledby]=\"tabToRender.tabContentAriaLabelledBy\"\n role=\"tabpanel\"\n tabIndex=\"0\">\n <ng-container *ngTemplateOutlet=\"tabToRender.contentTemplateRef\"></ng-container>\n </div>\n </div>\n</div>\n", styles: [".nj-tab__content-wrapper{margin:var(--nj-semantic-size-spacing-24) 0}.nj-tab--stretched nj-tab{display:inline-flex;flex-grow:1}\n"] }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { label: [{ type: Input }], density: [{ type: Input }], tabsList: [{ type: ContentChildren, args: [TabComponent] }], selectedTab: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy90YWJzL3RhYnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdGFicy90YWJzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4saUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxPQUFPLEVBQUUsU0FBUyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUM3QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7OztBQVlsRCxNQUFNLE9BQU8sYUFBYTtJQXNDeEIsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFsQ3pCLGFBQVEsR0FBRyxRQUFRLENBQUM7UUFFN0IsZ0JBQVcsR0FBa0IsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQWlCekQ7O1dBRUc7UUFDTSxZQUFPLEdBQWdCLFFBQVEsQ0FBQztRQU96Qzs7V0FFRztRQUNPLGdCQUFXLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7SUFHekUsQ0FBQztJQUVELGVBQWU7UUFDYixxR0FBcUc7UUFDckcsbUVBQW1FO1FBQ25FLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFFckMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENB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Q0FBQyxDQUFDO2lCQUM1QyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGNBQWMsQ0FBQyxLQUFhO1FBQ2xDLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUMzQixJQUFJLEdBQUcsRUFBRSxRQUFRLEVBQUU7Z0JBQ2pCLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDeEI7U0FDRjtRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7K0dBeEtVLGFBQWE7bUdBQWIsYUFBYSxxTEErQlAsWUFBWSw2QkMzRC9CLHVsQkFjQSwwTERZMEIsWUFBWTs7NEZBRXpCLGFBQWE7a0JBVHpCLFNBQVM7K0JBQ0UsU0FBUyxtQkFHRix1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLGNBQ3pCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUM7d0dBdUI1QixLQUFLO3NCQUFiLEtBQUs7Z0JBS0csT0FBTztzQkFBZixLQUFLO2dCQUt5QixRQUFRO3NCQUF0QyxlQUFlO3VCQUFDLFlBQVk7Z0JBS25CLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbW1vbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtTdWJqZWN0LCB0YWtlVW50aWx9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtVdGlsc30gZnJvbSAnLi4vLi4vdXRpbHMvdXRpbHMudXRpbCc7XG5pbXBvcnQge1RhYkNvbXBvbmVudH0gZnJvbSAnLi4vdGFiL3RhYi5jb21wb25lbnQnO1xuaW1wb3J0IHtUYWJzRGVuc2l0eX0gZnJvbSAnLi90YWJzLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmotdGFicycsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFicy5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1RhYkNvbXBvbmVudCwgQ29tbW9uTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBUYWJzQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICBwcml2YXRlIGFjdGl2ZVRhYkluZGV4O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdGFiQ2xhc3MgPSAnbmotdGFiJztcblxuICBwcml2YXRlIHVuc3Vic2NyaWJlOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcHVibGljIHRhYlRvUmVuZGVyOiBUYWJDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHB1YmxpYyB0YWJzOiBUYWJDb21wb25lbnRbXTtcblxuICAvKipcbiAgICogTGFiZWwgZm9yIHRoZSB0YWJsaXN0IGVsZW1lbnRcbiAgICovXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRhYnMgZGVuc2l0eVxuICAgKi9cbiAgQElucHV0KCkgZGVuc2l0eTogVGFic0RlbnNpdHkgPSAnbm9ybWFsJztcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgQENvbnRlbnRDaGlsZHJlbihUYWJDb21wb25lbnQpIHRhYnNMaXN0OiBRdWVyeUxpc3Q8VGFiQ29tcG9uZW50PjtcblxuICAvKipcbiAgICogT3V0cHV0IHRoYXQgZW1pdHMgc2VsZWN0ZWQgdGFiIGluZGV4XG4gICAqL1xuICBAT3V0cHV0KCkgc2VsZWN0ZWRUYWI6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gQSByZW5kZXIgaXMgYmVpbmcgZG9uZSBhZnRlciB2aWV3IGluaXQgc28gc2V0VGltZW91dCBhbGxvd3MgdXMgdG8gZGVsYXkgYW55IGF0dHJpYnV0ZSBtb2RpZmljYXRpb25cbiAgICAvLyBpbiB0aGUgY2FsbCBzdGFjayBzbyBpdCBjYW4gYmUgdGFrZW4gYWNjb3VudCBvbiBuZXh0IHJlbmRlciBvbmx5XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnRhYnMgPSB0aGlzLnRhYnNMaXN0Py50b0FycmF5KCk7XG5cbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUNsaWNrTGlzdGVuZXIoKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUtleWRvd25MaXN0ZW5lcigpO1xuXG4gICAgICBjb25zdCBhY3RpdmVJbmRleCA9IHRoaXMudGFicz8uZmluZEluZGV4KHRhYiA9PiB0YWI/LmlzQWN0aXZlKTtcbiAgICAgIHRoaXMuZ29Ub1RhYihhY3RpdmVJbmRleCA9PT0gLTEgPyAwIDogYWN0aXZlSW5kZXgsIGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMudW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0YWIgaXMgYWN0aXZlXG4gICAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiB0YWIgdG8gY2hlY2tcbiAgICovXG4gIGlzQWN0aXZlVGFiKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVUYWJJbmRleCA9PT0gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIHlvdSB0byBuYXZpZ2F0ZSB0byB0YWJcbiAgICogQHBhcmFtIGluZGV4IGluZGV4IG9mIHRhYiB0byBzZWxlY3RcbiAgICogQHBhcmFtIGVtaXQgZW1pdHMgaWYgc2V0IHRvIHRydWVcbiAgICovXG4gIGdvVG9UYWIoaW5kZXg6IG51bWJlciwgZW1pdCA9IHRydWUpIHtcbiAgICBjb25zdCB2YWxpZEluZGV4ID0gKFV0aWxzLmlzVW5kZWZpbmVkT3JOdWxsKGluZGV4KSB8fCBpbmRleCA8IDApID8gMCA6IGluZGV4O1xuXG4gICAgdGhpcy5hY3RpdmVUYWJJbmRleCA9IHZhbGlkSW5kZXg7XG4gICAgdGhpcy5yZW5kZXJUZW1wbGF0ZSh2YWxpZEluZGV4KTtcbiAgICBpZiAoZW1pdCkge1xuICAgICAgdGhpcy5zZWxlY3RlZFRhYi5lbWl0KHZhbGlkSW5kZXgpO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBmb2N1c05leHRGb2N1c2FibGVUYWIoKSB7XG4gICAgY29uc3QgZm9jdXNhYmxlVGFicyA9IEFycmF5LmZyb20odGhpcy50YWJzKS5maWx0ZXIodGFiID0+ICF0YWIuaXNEaXNhYmxlZCk7XG4gICAgY29uc3QgZm9jdXNlZFRhYkluZGV4ID0gZm9jdXNhYmxlVGFicy5maW5kSW5kZXgodGFiID0+IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRhYi50YWIubmF0aXZlRWxlbWVudCk7XG4gICAgY29uc3QgbmV4dEZvY3VzYWJsZVRhYiA9IGZvY3VzYWJsZVRhYnNbKGZvY3VzZWRUYWJJbmRleCArIDEpICUgZm9jdXNhYmxlVGFicy5sZW5ndGhdO1xuXG4gICAgbmV4dEZvY3VzYWJsZVRhYi50YWIubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGZvY3VzUHJldmlvdXNGb2N1c2FibGVUYWIoKSB7XG4gICAgY29uc3QgZm9jdXNhYmxlVGFicyA9IEFycmF5LmZyb20odGhpcy50YWJzKS5maWx0ZXIodGFiID0+ICF0YWIuaXNEaXNhYmxlZCk7XG4gICAgY29uc3QgZm9jdXNlZFRhYkluZGV4ID0gZm9jdXNhYmxlVGFicy5maW5kSW5kZXgodGFiID0+IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRhYi50YWIubmF0aXZlRWxlbWVudCk7XG5cbiAgICBjb25zdCBwcmV2aW91c0ZvY3VzYWJsZVRhYkluZGV4ID0gZm9jdXNlZFRhYkluZGV4ID09PSAwXG4gICAgICA/IGZvY3VzYWJsZVRhYnMubGVuZ3RoIC0gMVxuICAgICAgOiBmb2N1c2VkVGFiSW5kZXggLSAxO1xuXG4gICAgY29uc3QgcHJldmlvdXNGb2N1c2FibGVUYWIgPSBmb2N1c2FibGVUYWJzW3ByZXZpb3VzRm9jdXNhYmxlVGFiSW5kZXhdO1xuXG4gICAgcHJldmlvdXNGb2N1c2FibGVUYWIudGFiLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBoYW5kbGVUYWJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmZvY3VzTmV4dEZvY3VzYWJsZVRhYigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuZm9jdXNQcmV2aW91c0ZvY3VzYWJsZVRhYigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICB9XG5cbiAgZ2V0RGVuc2l0eUNsYXNzKCkge1xuICAgIGlmKCF0aGlzLmRlbnNpdHkgfHwgdGhpcy5kZW5zaXR5ID09PSAnbm9ybWFsJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy50YWJDbGFzc30tLSR7dGhpcy5kZW5zaXR5fWA7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVDbGlja0xpc3RlbmVyKCkge1xuICAgIGlmIChVdGlscy5pc1VuZGVmaW5lZE9yTnVsbCh0aGlzLnRhYnMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudGFicy5mb3JFYWNoKCh0YWIsIGluZGV4KSA9PiB7XG4gICAgICB0YWIudGFiU2VsZWN0XG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlKSlcbiAgICAgICAgLnN1YnNjcmliZShfID0+IHtcbiAgICAgICAgICB0aGlzLmdvVG9UYWIoaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUtleWRvd25MaXN0ZW5lcigpIHtcbiAgICBpZiAoVXRpbHMuaXNVbmRlZmluZWRPck51bGwodGhpcy50YWJzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRhYnMuZm9yRWFjaCh0YWIgPT4ge1xuICAgICAgdGFiLnRhYk1vdmUucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVUYWJLZXlkb3duKGV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJUZW1wbGF0ZShpbmRleDogbnVtYmVyKSB7XG4gICAgZm9yIChjb25zdCB0YWIgb2YgdGhpcy50YWJzKSB7XG4gICAgICBpZiAodGFiPy5pc0FjdGl2ZSkge1xuICAgICAgICB0YWIuc2V0SXNBY3RpdmUoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnRhYlRvUmVuZGVyID0gdGhpcy50YWJzPy5baW5kZXhdO1xuICAgIHRoaXMudGFiVG9SZW5kZXIuc2V0SXNBY3RpdmUodHJ1ZSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJuai10YWJcIiBbbmdDbGFzc109XCJnZXREZW5zaXR5Q2xhc3MoKVwiPlxuICA8ZGl2IGNsYXNzPVwibmotdGFiX19pdGVtc1wiIHJvbGU9XCJ0YWJsaXN0XCIgW2F0dHIuYXJpYS1sYWJlbF09XCJsYWJlbFwiPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJuai10YWJfX2NvbnRlbnQtd3JhcHBlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJuai10YWJfX2NvbnRlbnQgbmotdGFiX19jb250ZW50LS1hY3RpdmVcIiAqbmdJZj1cInRhYlRvUmVuZGVyXCJcbiAgICAgICAgIFthdHRyLmlkXT1cInRhYlRvUmVuZGVyLnRhYkNvbnRlbnRJZFwiXG4gICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwidGFiVG9SZW5kZXIudGFiQ29udGVudEFyaWFMYWJlbGxlZEJ5XCJcbiAgICAgICAgIHJvbGU9XCJ0YWJwYW5lbFwiXG4gICAgICAgICB0YWJJbmRleD1cIjBcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJUb1JlbmRlci5jb250ZW50VGVtcGxhdGVSZWZcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==