UNPKG

@visa/nova-angular

Version:

Visa Product Design System Nova Angular library

220 lines 27.9 kB
/** * © 2025 Visa * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **/ import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { ChangeDetectorRef, ContentChildren, Directive, ElementRef, EventEmitter, HostBinding, Input, Output, QueryList } from '@angular/core'; import { ButtonDirective } from '../button/button.directive'; import { NovaLibService } from '../nova-lib.service'; import { TabItemDirective } from '../tab-item/tab-item.directive'; import * as i0 from "@angular/core"; import * as i1 from "../nova-lib.service"; export class TabListDirective { /** * Provides custom class(es) for custom styling. * @default .v-tabs.v-tabs-<orientation> */ get class() { return [this._class, 'v-tabs', this.vertical ? 'v-tabs-vertical' : 'v-tabs-horizontal'].join(' '); } set class(value) { this._class = value; } get hostClass() { return this.class; } /** * Sets tab list to vertical orientation when true. * @default false */ get vertical() { return this._vertical; } set vertical(value) { this._vertical = coerceBooleanProperty(value); } get hostOrientation() { if (this.vertical && !this._inNav) return 'vertical'; } /** * Sets custom role. * @default 'tablist' * @default null if nested tab list or within Navigation. * @builtin true */ get role() { return this._role; } set role(value) { this._role = value; this._roleSetByUser = true; } get hostRole() { return this.role; } constructor(novaLibService, cdRef, el) { this.novaLibService = novaLibService; this.cdRef = cdRef; this.el = el; this._roleSetByUser = false; // prevents parent component from overriding if role if role is given directly by user this.clickSubscriptions = []; this.activeSubscriptions = []; this._nestedTabs = false; this._inNav = false; this._class = ''; this._vertical = false; this._role = 'tablist'; /** * Emits selected tab index when new tab is selected. */ this.activeTabIndex = new EventEmitter(); } ngAfterContentInit() { if (this.tabLists) { if (this.tabLists.length > 0) { this._nestedTabs = true; this.setUpNestedTabs(); } this.tabLists.changes.subscribe(() => { if (this.tabLists.length > 0) { this._nestedTabs = true; this.setUpNestedTabs(); } }); } if (this.tabs) { if (this.tabs.length > 0) this.setUpTabs(); this.tabs.changes.subscribe(() => { this.activeSubscriptions.forEach((subscription) => subscription.unsubscribe()); this.clickSubscriptions.forEach((subscription) => subscription.unsubscribe()); this.activeSubscriptions = []; this.clickSubscriptions = []; this.setUpTabs(); this.cdRef.detectChanges(); }); } } setUpNestedTabs() { // remove tab/tablist roles in nested tab lists // child button/a tags use aria-current="page" instead of aria-selected this.role = this._roleSetByUser ? this.role : null; this.tabLists.forEach((tablist) => { tablist.role = tablist._roleSetByUser ? tablist.role : null; tablist.tabs.toArray().forEach((tab) => { tab.role = tab._roleSetByUser && !tab._roleSetByTab ? tab.role : null; if (tab.button) { tab.button._isInNavOrNested = true; tab.button.role = tab.button._roleSetByUser && !tab.button._roleSetByTab ? tab.button.role : null; tab.button.ariaCurrent = tab.button.ariaSelected ? 'page' : null; } }); }); } setUpTabs() { if (this.buttons.length > 0) { if (!this._inNav) { this.setUpFocusListener(); this.novaLibService.addArrowKeyNavigation(this.buttons.toArray(), true, this.vertical ? 'vertical' : 'horizontal'); } } this.tabs.toArray().forEach((tab, index) => { if (tab._roleSetByUser && !tab._roleSetByTab) { return; } else if (this.role && !tab.sectionTitle && !tab.disclosureTab && !tab.trigger) { tab.role = 'none'; } else { tab.role = null; } this.activeSubscriptions[index] = tab.tabActive.subscribe(() => { this.novaLibService.deselectItems(this.tabs.toArray(), index); }); this.clickSubscriptions[index] = tab.clicked.subscribe(() => { this.novaLibService.selectItem(this.tabs.toArray(), index); }); if (tab.button) { if (!tab.button._roleSetByUser) { tab.button.role = this._nestedTabs ? null : 'tab'; tab.button._roleSetByTab = true; } // if uer did not set button role on vertical tab, make medium if (this.vertical && (!tab.button._buttonSizeSetByUser || (tab.button._buttonSizeSetByUser && tab._sizeSetByTab))) { tab.button.buttonSize = 'medium'; } if (!tab.disclosureTab && !tab.trigger && !tab.button.toggleIcon) { if (this.tabLists.length > 0) { tab.button.ariaCurrent = tab.active ? 'page' : null; } else { tab.button.ariaSelected = tab.active; } } this.cdRef.detectChanges(); } }); } setUpFocusListener() { this.buttons.toArray().forEach((button) => { button.listeners.push(button.blurred.subscribe((event) => { // if focus is leaving the tab list, find the starting focusable tab for when the list receives focus again // if focus stays in the tab list, relatedTarget will be a button within the tab list if (!event.relatedTarget || !!this.el.nativeElement.contains(event.target)) { this.novaLibService.findStartingFocus(this.buttons.toArray()); } })); }); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TabListDirective, deps: [{ token: i1.NovaLibService }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: TabListDirective, isStandalone: true, selector: "[v-tabs]", inputs: { class: "class", vertical: "vertical", role: "role" }, outputs: { activeTabIndex: "activeTabIndex" }, host: { properties: { "class": "this.hostClass", "attr.aria-orientation": "this.hostOrientation", "attr.role": "this.hostRole" } }, queries: [{ propertyName: "tabLists", predicate: TabListDirective, descendants: true }, { propertyName: "tabs", predicate: TabItemDirective }, { propertyName: "buttons", predicate: ButtonDirective, descendants: true }], ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TabListDirective, decorators: [{ type: Directive, args: [{ standalone: true, // tslint:disable-next-line:directive-selector selector: '[v-tabs]' }] }], ctorParameters: () => [{ type: i1.NovaLibService }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }], propDecorators: { tabLists: [{ type: ContentChildren, args: [TabListDirective, { descendants: true }] }], tabs: [{ type: ContentChildren, args: [TabItemDirective] }], buttons: [{ type: ContentChildren, args: [ButtonDirective, { descendants: true }] }], class: [{ type: Input }], hostClass: [{ type: HostBinding, args: ['class'] }], vertical: [{ type: Input }], hostOrientation: [{ type: HostBinding, args: ['attr.aria-orientation'] }], role: [{ type: Input }], hostRole: [{ type: HostBinding, args: ['attr.role'] }], activeTabIndex: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWxpc3QuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9ub3ZhLWxpYi9zcmMvbGliL3RhYi1saXN0L3RhYi1saXN0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0lBZUk7QUFDSixPQUFPLEVBQWdCLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7OztBQU9sRSxNQUFNLE9BQU8sZ0JBQWdCO0lBVTNCOzs7T0FHRztJQUNILElBQ0ksS0FBSztRQUNQLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEcsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLEtBQWE7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQ0ksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFDSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFDRCxJQUFJ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ZUFBZSxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtnQkFZbkQsS0FBSztzQkFEUixLQUFLO2dCQVNGLFNBQVM7c0JBRFosV0FBVzt1QkFBQyxPQUFPO2dCQVVoQixRQUFRO3NCQURYLEtBQUs7Z0JBU0YsZUFBZTtzQkFEbEIsV0FBVzt1QkFBQyx1QkFBdUI7Z0JBWWhDLElBQUk7c0JBRFAsS0FBSztnQkFVRixRQUFRO3NCQURYLFdBQVc7dUJBQUMsV0FBVztnQkFRZCxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAgICAgICAgICAgICAgwqkgMjAyNSBWaXNhXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiovXG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29udGVudENoaWxkcmVuLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJ1dHRvbkRpcmVjdGl2ZSB9IGZyb20gJy4uL2J1dHRvbi9idXR0b24uZGlyZWN0aXZlJztcbmltcG9ydCB7IE5vdmFMaWJTZXJ2aWNlIH0gZnJvbSAnLi4vbm92YS1saWIuc2VydmljZSc7XG5pbXBvcnQgeyBUYWJJdGVtRGlyZWN0aXZlIH0gZnJvbSAnLi4vdGFiLWl0ZW0vdGFiLWl0ZW0uZGlyZWN0aXZlJztcblxuQERpcmVjdGl2ZSh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdbdi10YWJzXSdcbn0pXG5leHBvcnQgY2xhc3MgVGFiTGlzdERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuICBAQ29udGVudENoaWxkcmVuKFRhYkxpc3REaXJlY3RpdmUsIHsgZGVzY2VuZGFudHM6IHRydWUgfSkgdGFiTGlzdHM6IFF1ZXJ5TGlzdDxUYWJMaXN0RGlyZWN0aXZlPjtcbiAgQENvbnRlbnRDaGlsZHJlbihUYWJJdGVtRGlyZWN0aXZlKSB0YWJzOiBRdWVyeUxpc3Q8VGFiSXRlbURpcmVjdGl2ZT47XG4gIEBDb250ZW50Q2hpbGRyZW4oQnV0dG9uRGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pIGJ1dHRvbnM6IFF1ZXJ5TGlzdDxCdXR0b25EaXJlY3RpdmU+O1xuICBfcm9sZVNldEJ5VXNlciA9IGZhbHNlOyAvLyBwcmV2ZW50cyBwYXJlbnQgY29tcG9uZW50IGZyb20gb3ZlcnJpZGluZyBpZiByb2xlIGlmIHJvbGUgaXMgZ2l2ZW4gZGlyZWN0bHkgYnkgdXNlclxuICBjbGlja1N1YnNjcmlwdGlvbnM6IGFueVtdID0gW107XG4gIGFjdGl2ZVN1YnNjcmlwdGlvbnM6IGFueVtdID0gW107XG4gIF9uZXN0ZWRUYWJzOiBib29sZWFuID0gZmFsc2U7XG4gIF9pbk5hdjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBjdXN0b20gY2xhc3MmIzQwO2VzJiM0MTsgZm9yIGN1c3RvbSBzdHlsaW5nLlxuICAgKiBAZGVmYXVsdCAudi10YWJzLnYtdGFicy0mbHQ7b3JpZW50YXRpb24mZ3Q7XG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgY2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW3RoaXMuX2NsYXNzLCAndi10YWJzJywgdGhpcy52ZXJ0aWNhbCA/ICd2LXRhYnMtdmVydGljYWwnIDogJ3YtdGFicy1ob3Jpem9udGFsJ10uam9pbignICcpO1xuICB9XG4gIHNldCBjbGFzcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY2xhc3MgPSB2YWx1ZTtcbiAgfVxuICBfY2xhc3M6IHN0cmluZyA9ICcnO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgZ2V0IGhvc3RDbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNsYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGFiIGxpc3QgdG8gdmVydGljYWwgb3JpZW50YXRpb24gd2hlbiB0cnVlLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZlcnRpY2FsKCk6IEJvb2xlYW5JbnB1dCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnRpY2FsO1xuICB9XG4gIHNldCB2ZXJ0aWNhbCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdmVydGljYWwgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF92ZXJ0aWNhbDogQm9vbGVhbklucHV0ID0gZmFsc2U7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLW9yaWVudGF0aW9uJylcbiAgZ2V0IGhvc3RPcmllbnRhdGlvbigpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICBpZiAodGhpcy52ZXJ0aWNhbCAmJiAhdGhpcy5faW5OYXYpIHJldHVybiAndmVydGljYWwnO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgY3VzdG9tIHJvbGUuXG4gICAqIEBkZWZhdWx0ICd0YWJsaXN0J1xuICAgKiBAZGVmYXVsdCBudWxsIGlmIG5lc3RlZCB0YWIgbGlzdCBvciB3aXRoaW4gTmF2aWdhdGlvbi5cbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHJvbGUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3JvbGU7XG4gIH1cbiAgc2V0IHJvbGUodmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICB0aGlzLl9yb2xlID0gdmFsdWU7XG4gICAgdGhpcy5fcm9sZVNldEJ5VXNlciA9IHRydWU7XG4gIH1cbiAgX3JvbGU6IHN0cmluZyB8IG51bGwgPSAndGFibGlzdCc7XG4gIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJylcbiAgZ2V0IGhvc3RSb2xlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJvbGU7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgc2VsZWN0ZWQgdGFiIGluZGV4IHdoZW4gbmV3IHRhYiBpcyBzZWxlY3RlZC5cbiAgICovXG4gIEBPdXRwdXQoKSBhY3RpdmVUYWJJbmRleCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbm92YUxpYlNlcnZpY2U6IE5vdmFMaWJTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWZcbiAgKSB7fVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50YWJMaXN0cykge1xuICAgICAgaWYgKHRoaXMudGFiTGlzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLl9uZXN0ZWRUYWJzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZXRVcE5lc3RlZFRhYnMoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudGFiTGlzdHMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy50YWJMaXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5fbmVzdGVkVGFicyA9IHRydWU7XG4gICAgICAgICAgdGhpcy5zZXRVcE5lc3RlZFRhYnMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRhYnMpIHtcbiAgICAgIGlmICh0aGlzLnRhYnMubGVuZ3RoID4gMCkgdGhpcy5zZXRVcFRhYnMoKTtcbiAgICAgIHRoaXMudGFicy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuYWN0aXZlU3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWJzY3JpcHRpb24pID0+IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgdGhpcy5jbGlja1N1YnNjcmlwdGlvbnMuZm9yRWFjaCgoc3Vic2NyaXB0aW9uKSA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIHRoaXMuYWN0aXZlU3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLmNsaWNrU3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLnNldFVwVGFicygpO1xuICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHNldFVwTmVzdGVkVGFicygpIHtcbiAgICAvLyByZW1vdmUgdGFiL3RhYmxpc3Qgcm9sZXMgaW4gbmVzdGVkIHRhYiBsaXN0c1xuICAgIC8vIGNoaWxkIGJ1dHRvbi9hIHRhZ3MgdXNlIGFyaWEtY3VycmVudD1cInBhZ2VcIiBpbnN0ZWFkIG9mIGFyaWEtc2VsZWN0ZWRcbiAgICB0aGlzLnJvbGUgPSB0aGlzLl9yb2xlU2V0QnlVc2VyID8gdGhpcy5yb2xlIDogbnVsbDtcbiAgICB0aGlzLnRhYkxpc3RzLmZvckVhY2goKHRhYmxpc3QpID0+IHtcbiAgICAgIHRhYmxpc3Qucm9sZSA9IHRhYmxpc3QuX3JvbGVTZXRCeVVzZXIgPyB0YWJsaXN0LnJvbGUgOiBudWxsO1xuXG4gICAgICB0YWJsaXN0LnRhYnMudG9BcnJheSgpLmZvckVhY2goKHRhYikgPT4ge1xuICAgICAgICB0YWIucm9sZSA9IHRhYi5fcm9sZVNldEJ5VXNlciAmJiAhdGFiLl9yb2xlU2V0QnlUYWIgPyB0YWIucm9sZSA6IG51bGw7XG4gICAgICAgIGlmICh0YWIuYnV0dG9uKSB7XG4gICAgICAgICAgdGFiLmJ1dHRvbi5faXNJbk5hdk9yTmVzdGVkID0gdHJ1ZTtcbiAgICAgICAgICB0YWIuYnV0dG9uLnJvbGUgPSB0YWIuYnV0dG9uLl9yb2xlU2V0QnlVc2VyICYmICF0YWIuYnV0dG9uLl9yb2xlU2V0QnlUYWIgPyB0YWIuYnV0dG9uLnJvbGUgOiBudWxsO1xuICAgICAgICAgIHRhYi5idXR0b24uYXJpYUN1cnJlbnQgPSB0YWIuYnV0dG9uLmFyaWFTZWxlY3RlZCA/ICdwYWdlJyA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0VXBUYWJzKCkge1xuICAgIGlmICh0aGlzLmJ1dHRvbnMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKCF0aGlzLl9pbk5hdikge1xuICAgICAgICB0aGlzLnNldFVwRm9jdXNMaXN0ZW5lcigpO1xuICAgICAgICB0aGlzLm5vdmFMaWJTZXJ2aWNlLmFkZEFycm93S2V5TmF2aWdhdGlvbihcbiAgICAgICAgICB0aGlzLmJ1dHRvbnMudG9BcnJheSgpLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgdGhpcy52ZXJ0aWNhbCA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy50YWJzLnRvQXJyYXkoKS5mb3JFYWNoKCh0YWIsIGluZGV4KSA9PiB7XG4gICAgICBpZiAodGFiLl9yb2xlU2V0QnlVc2VyICYmICF0YWIuX3JvbGVTZXRCeVRhYikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucm9sZSAmJiAhdGFiLnNlY3Rpb25UaXRsZSAmJiAhdGFiLmRpc2Nsb3N1cmVUYWIgJiYgIXRhYi50cmlnZ2VyKSB7XG4gICAgICAgIHRhYi5yb2xlID0gJ25vbmUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFiLnJvbGUgPSBudWxsO1xuICAgICAgfVxuICAgICAgdGhpcy5hY3RpdmVTdWJzY3JpcHRpb25zW2luZGV4XSA9IHRhYi50YWJBY3RpdmUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5ub3ZhTGliU2VydmljZS5kZXNlbGVjdEl0ZW1zKHRoaXMudGFicy50b0FycmF5KCksIGluZGV4KTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmNsaWNrU3Vic2NyaXB0aW9uc1tpbmRleF0gPSB0YWIuY2xpY2tlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLm5vdmFMaWJTZXJ2aWNlLnNlbGVjdEl0ZW0odGhpcy50YWJzLnRvQXJyYXkoKSwgaW5kZXgpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh0YWIuYnV0dG9uKSB7XG4gICAgICAgIGlmICghdGFiLmJ1dHRvbi5fcm9sZVNldEJ5VXNlcikge1xuICAgICAgICAgIHRhYi5idXR0b24ucm9sZSA9IHRoaXMuX25lc3RlZFRhYnMgPyBudWxsIDogJ3RhYic7XG4gICAgICAgICAgdGFiLmJ1dHRvbi5fcm9sZVNldEJ5VGFiID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHVlciBkaWQgbm90IHNldCBidXR0b24gcm9sZSBvbiB2ZXJ0aWNhbCB0YWIsIG1ha2UgbWVkaXVtXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnZlcnRpY2FsICYmXG4gICAgICAgICAgKCF0YWIuYnV0dG9uLl9idXR0b25TaXplU2V0QnlVc2VyIHx8ICh0YWIuYnV0dG9uLl9idXR0b25TaXplU2V0QnlVc2VyICYmIHRhYi5fc2l6ZVNldEJ5VGFiKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGFiLmJ1dHRvbi5idXR0b25TaXplID0gJ21lZGl1bSc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRhYi5kaXNjbG9zdXJlVGFiICYmICF0YWIudHJpZ2dlciAmJiAhdGFiLmJ1dHRvbi50b2dnbGVJY29uKSB7XG4gICAgICAgICAgaWYgKHRoaXMudGFiTGlzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGFiLmJ1dHRvbi5hcmlhQ3VycmVudCA9IHRhYi5hY3RpdmUgPyAncGFnZScgOiBudWxsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YWIuYnV0dG9uLmFyaWFTZWxlY3RlZCA9IHRhYi5hY3RpdmU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0VXBGb2N1c0xpc3RlbmVyKCkge1xuICAgIHRoaXMuYnV0dG9ucy50b0FycmF5KCkuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICBidXR0b24ubGlzdGVuZXJzLnB1c2goXG4gICAgICAgIGJ1dHRvbi5ibHVycmVkLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAvLyBpZiBmb2N1cyBpcyBsZWF2aW5nIHRoZSB0YWIgbGlzdCwgZmluZCB0aGUgc3RhcnRpbmcgZm9jdXNhYmxlIHRhYiBmb3Igd2hlbiB0aGUgbGlzdCByZWNlaXZlcyBmb2N1cyBhZ2FpblxuICAgICAgICAgIC8vIGlmIGZvY3VzIHN0YXlzIGluIHRoZSB0YWIgbGlzdCwgcmVsYXRlZFRhcmdldCB3aWxsIGJlIGEgYnV0dG9uIHdpdGhpbiB0aGUgdGFiIGxpc3RcbiAgICAgICAgICBpZiAoIWV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgISF0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgICAgdGhpcy5ub3ZhTGliU2VydmljZS5maW5kU3RhcnRpbmdGb2N1cyh0aGlzLmJ1dHRvbnMudG9BcnJheSgpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuICB9XG59XG4iXX0=