UNPKG

@ux-aspects/ux-aspects

Version:

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

110 lines 18 kB
import { Component, ContentChildren, ElementRef, inject, Input, Renderer2 } from '@angular/core'; import { NavigationEnd, Router } from '@angular/router'; import { Subject } from 'rxjs'; import { filter, takeUntil } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; export class NavigationItemComponent { /** Get the active state of this item from the router */ get active() { return this.link ? this._router.isActive(this.link, true) : false; } get children() { return this._children.filter(item => item !== this); } constructor() { this._elementRef = inject(ElementRef); this._renderer = inject(Renderer2); this._router = inject(Router); this._parent = inject(NavigationItemComponent, { optional: true, skipSelf: true }); /** Whether the navigation item is expanded, displaying the items from the `children` array. */ this.expanded = false; /** Indicate whether the indentation should include the arrow */ this._indentWithoutArrow = true; /** Automatically unsubscribe when the component is destroyed */ this._onDestroy = new Subject(); this._level = this._parent ? this._parent._level + 1 : 1; // Expand this component if it or a descendant is active. this._router.events.pipe(filter(event => event instanceof NavigationEnd), takeUntil(this._onDestroy)).subscribe(() => { this.expanded = this.hasActiveLink(this.link); }); } ngAfterViewInit() { // Add classes to parent for styling const parentListElement = this._elementRef.nativeElement.parentElement; if (parentListElement) { const levelClass = this.getLevelClass(); if (levelClass.length > 0) { this._renderer.addClass(parentListElement, 'nav'); this._renderer.addClass(parentListElement, levelClass); } } } ngAfterContentInit() { // Set 'indentWithoutArrow' this.setIndentWithoutArrow(); // Update 'indentWithoutArrow' in response to changes to children this._children.changes.pipe(takeUntil(this._onDestroy)).subscribe(() => this.setIndentWithoutArrow()); } ngOnDestroy() { this._onDestroy.next(); this._onDestroy.complete(); } /** Check if this item or any children are active */ hasActiveLink(link) { // If this component has a link, check if it is active. if (link && this._router.isActive(link, true)) { return true; } // If this component has children, check if any of them, or their descendants, are active. return this.children.some(item => item.hasActiveLink(item.link)); } getLevelClass() { switch (this._level) { case 2: return 'nav-second-level'; case 3: return 'nav-third-level'; case 4: return 'nav-fourth-level'; case 5: return 'nav-fifth-level'; } return ''; } setIndentWithoutArrow() { if (this.children.length > 0) { // If this element has children it will be indented and will have an arrow this._indentWithoutArrow = false; } else if (this._parent) { // If this element has a parent, indent it if any of its siblings have children this._indentWithoutArrow = !this._parent.children.every((item) => item.children.length === 0); } else { // Top-level elements should be indented this._indentWithoutArrow = true; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NavigationItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: NavigationItemComponent, selector: "[ux-navigation-item]", inputs: { header: "header", icon: "icon", expanded: "expanded", link: "link" }, host: { properties: { "class.active": "active", "class.selected": "expanded" } }, queries: [{ propertyName: "_children", predicate: NavigationItemComponent, descendants: true }], ngImport: i0, template: "@if (link) {\n <a\n [class.has-arrow]=\"children.length > 0\"\n [class.no-arrow]=\"_indentWithoutArrow\"\n [routerLink]=\"link\"\n >\n <span>{{ header }}</span>\n </a>\n}\n\n@if (!link) {\n <a\n (click)=\"expanded = !expanded\"\n [class.has-arrow]=\"children.length > 0\"\n [class.no-arrow]=\"_indentWithoutArrow\"\n >\n <span>{{ header }}</span>\n </a>\n}\n\n<ng-content></ng-content>\n", dependencies: [{ kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NavigationItemComponent, decorators: [{ type: Component, args: [{ selector: '[ux-navigation-item]', host: { '[class.active]': 'active', '[class.selected]': 'expanded', }, template: "@if (link) {\n <a\n [class.has-arrow]=\"children.length > 0\"\n [class.no-arrow]=\"_indentWithoutArrow\"\n [routerLink]=\"link\"\n >\n <span>{{ header }}</span>\n </a>\n}\n\n@if (!link) {\n <a\n (click)=\"expanded = !expanded\"\n [class.has-arrow]=\"children.length > 0\"\n [class.no-arrow]=\"_indentWithoutArrow\"\n >\n <span>{{ header }}</span>\n </a>\n}\n\n<ng-content></ng-content>\n" }] }], ctorParameters: () => [], propDecorators: { header: [{ type: Input }], icon: [{ type: Input }], expanded: [{ type: Input }], link: [{ type: Input }], _children: [{ type: ContentChildren, args: [NavigationItemComponent, { descendants: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL25hdmlnYXRpb24vbmF2aWdhdGlvbi1pdGVtL25hdmlnYXRpb24taXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9uYXZpZ2F0aW9uL25hdmlnYXRpb24taXRlbS9uYXZpZ2F0aW9uLWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFtQyxTQUFTLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUF3QixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEosT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQVcsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQVVuRCxNQUFNLE9BQU8sdUJBQXVCO0lBcUJoQyx3REFBd0Q7SUFDeEQsSUFBSSxNQUFNO1FBQ04sT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDdEUsQ0FBQztJQVdELElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUtEO1FBekNpQixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVqQyxjQUFTLEdBQUcsTUFBTSxDQUFD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LE9BQU8sa0JBQWtCLENBQUM7WUFDOUIsS0FBSyxDQUFDO2dCQUNGLE9BQU8saUJBQWlCLENBQUM7UUFDakMsQ0FBQztRQUVELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVPLHFCQUFxQjtRQUN6QixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNCLDBFQUEwRTtZQUMxRSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQ3JDLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN0QiwrRUFBK0U7WUFDL0UsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNsRyxDQUFDO2FBQU0sQ0FBQztZQUNKLHdDQUF3QztZQUN4QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1FBQ3BDLENBQUM7SUFDTCxDQUFDOytHQWxIUSx1QkFBdUI7bUdBQXZCLHVCQUF1Qix3UEFnQ2YsdUJBQXVCLGdEQzdDNUMsdWFBcUJBOzs0RkRSYSx1QkFBdUI7a0JBUm5DLFNBQVM7K0JBQ0ksc0JBQXNCLFFBRTFCO3dCQUNGLGdCQUFnQixFQUFFLFFBQVE7d0JBQzFCLGtCQUFrQixFQUFFLFVBQVU7cUJBQ2pDO3dEQVlRLE1BQU07c0JBQWQsS0FBSztnQkFHRyxJQUFJO3NCQUFaLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxJQUFJO3NCQUFaLEtBQUs7Z0JBY1csU0FBUztzQkFEekIsZUFBZTt1QkFBQyx1QkFBdUIsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIENvbnRlbnRDaGlsZHJlbiwgRWxlbWVudFJlZiwgaW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBRdWVyeUxpc3QsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkVuZCwgUm91dGVyLCBVcmxUcmVlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ1t1eC1uYXZpZ2F0aW9uLWl0ZW1dJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbmF2aWdhdGlvbi1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgICBob3N0OiB7XG4gICAgICAgICdbY2xhc3MuYWN0aXZlXSc6ICdhY3RpdmUnLFxuICAgICAgICAnW2NsYXNzLnNlbGVjdGVkXSc6ICdleHBhbmRlZCcsXG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBOYXZpZ2F0aW9uSXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3BhcmVudCA9IGluamVjdChOYXZpZ2F0aW9uSXRlbUNvbXBvbmVudCwgeyBvcHRpb25hbDogdHJ1ZSwgc2tpcFNlbGY6IHRydWUgfSk7XG5cbiAgICAvKiogVGhlIHRleHQgdG8gZGlzcGxheSBpbiB0aGUgbmF2aWdhdGlvbiBtZW51IGl0ZW0uICovXG4gICAgQElucHV0KCkgaGVhZGVyOiBzdHJpbmc7XG5cbiAgICAvKiogVGhlIG5hbWUgb2YgYW4gaWNvbiBmcm9tIHRoZSBVWCBBc3BlY3RzIGljb24gc2V0LCB0byBiZSBkaXNwbGF5ZWQgdG8gdGhlIGxlZnQgb2YgdGhlIHRpdGxlLiAqL1xuICAgIEBJbnB1dCgpIGljb246IHN0cmluZztcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBuYXZpZ2F0aW9uIGl0ZW0gaXMgZXhwYW5kZWQsIGRpc3BsYXlpbmcgdGhlIGl0ZW1zIGZyb20gdGhlIGBjaGlsZHJlbmAgYXJyYXkuICovXG4gICAgQElucHV0KCkgZXhwYW5kZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBUaGUgbGluayB0aGF0IHdpbGwgYmUgbmF2aWdhdGVkIHRvIGlmIHRoaXMgaXRlbSBpcyBzZWxlY3RlZCAqL1xuICAgIEBJbnB1dCgpIGxpbms6IHN0cmluZztcblxuICAgIC8qKiBHZXQgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGlzIGl0ZW0gZnJvbSB0aGUgcm91dGVyICovXG4gICAgZ2V0IGFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGluayA/IHRoaXMuX3JvdXRlci5pc0FjdGl2ZSh0aGlzLmxpbmssIHRydWUpIDogZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqIEluZGljYXRlIHRoZSBkZXB0aCBvZiB0aGUgaXRlbSAqL1xuICAgIF9sZXZlbDogbnVtYmVyO1xuXG4gICAgLyoqIEluZGljYXRlIHdoZXRoZXIgdGhlIGluZGVudGF0aW9uIHNob3VsZCBpbmNsdWRlIHRoZSBhcnJvdyAqL1xuICAgIF9pbmRlbnRXaXRob3V0QXJyb3c6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgQENvbnRlbnRDaGlsZHJlbihOYXZpZ2F0aW9uSXRlbUNvbXBvbmVudCwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoaWxkcmVuOiBRdWVyeUxpc3Q8TmF2aWdhdGlvbkl0ZW1Db21wb25lbnQ+O1xuXG4gICAgZ2V0IGNoaWxkcmVuKCk6IE5hdmlnYXRpb25JdGVtQ29tcG9uZW50W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW4uZmlsdGVyKGl0ZW0gPT4gaXRlbSAhPT0gdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqIEF1dG9tYXRpY2FsbHkgdW5zdWJzY3JpYmUgd2hlbiB0aGUgY29tcG9uZW50IGlzIGRlc3Ryb3llZCAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcblxuICAgICAgICB0aGlzLl9sZXZlbCA9IHRoaXMuX3BhcmVudCA/IHRoaXMuX3BhcmVudC5fbGV2ZWwgKyAxIDogMTtcblxuICAgICAgICAvLyBFeHBhbmQgdGhpcyBjb21wb25lbnQgaWYgaXQgb3IgYSBkZXNjZW5kYW50IGlzIGFjdGl2ZS5cbiAgICAgICAgdGhpcy5fcm91dGVyLmV2ZW50cy5waXBlKGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpLCB0YWtlVW50aWwodGhpcy5fb25EZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kZWQgPSB0aGlzLmhhc0FjdGl2ZUxpbmsodGhpcy5saW5rKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICAvLyBBZGQgY2xhc3NlcyB0byBwYXJlbnQgZm9yIHN0eWxpbmdcbiAgICAgICAgY29uc3QgcGFyZW50TGlzdEVsZW1lbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgaWYgKHBhcmVudExpc3RFbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBsZXZlbENsYXNzOiBzdHJpbmcgPSB0aGlzLmdldExldmVsQ2xhc3MoKTtcbiAgICAgICAgICAgIGlmIChsZXZlbENsYXNzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5hZGRDbGFzcyhwYXJlbnRMaXN0RWxlbWVudCwgJ25hdicpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLmFkZENsYXNzKHBhcmVudExpc3RFbGVtZW50LCBsZXZlbENsYXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgLy8gU2V0ICdpbmRlbnRXaXRob3V0QXJyb3cnXG4gICAgICAgIHRoaXMuc2V0SW5kZW50V2l0aG91dEFycm93KCk7XG5cbiAgICAgICAgLy8gVXBkYXRlICdpbmRlbnRXaXRob3V0QXJyb3cnIGluIHJlc3BvbnNlIHRvIGNoYW5nZXMgdG8gY2hpbGRyZW5cbiAgICAgICAgdGhpcy5fY2hpbGRyZW4uY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zZXRJbmRlbnRXaXRob3V0QXJyb3coKSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveS5uZXh0KCk7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveS5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKiBDaGVjayBpZiB0aGlzIGl0ZW0gb3IgYW55IGNoaWxkcmVuIGFyZSBhY3RpdmUgKi9cbiAgICBwcml2YXRlIGhhc0FjdGl2ZUxpbmsobGluazogc3RyaW5nIHwgVXJsVHJlZSk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBJZiB0aGlzIGNvbXBvbmVudCBoYXMgYSBsaW5rLCBjaGVjayBpZiBpdCBpcyBhY3RpdmUuXG4gICAgICAgIGlmIChsaW5rICYmIHRoaXMuX3JvdXRlci5pc0FjdGl2ZShsaW5rLCB0cnVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGlzIGNvbXBvbmVudCBoYXMgY2hpbGRyZW4sIGNoZWNrIGlmIGFueSBvZiB0aGVtLCBvciB0aGVpciBkZXNjZW5kYW50cywgYXJlIGFjdGl2ZS5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uc29tZShpdGVtID0+IGl0ZW0uaGFzQWN0aXZlTGluayhpdGVtLmxpbmspKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldExldmVsQ2xhc3MoKTogc3RyaW5nIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLl9sZXZlbCkge1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHJldHVybiAnbmF2LXNlY29uZC1sZXZlbCc7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgcmV0dXJuICduYXYtdGhpcmQtbGV2ZWwnO1xuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnbmF2LWZvdXJ0aC1sZXZlbCc7XG4gICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICduYXYtZmlmdGgtbGV2ZWwnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0SW5kZW50V2l0aG91dEFycm93KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGlzIGVsZW1lbnQgaGFzIGNoaWxkcmVuIGl0IHdpbGwgYmUgaW5kZW50ZWQgYW5kIHdpbGwgaGF2ZSBhbiBhcnJvd1xuICAgICAgICAgICAgdGhpcy5faW5kZW50V2l0aG91dEFycm93ID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fcGFyZW50KSB7XG4gICAgICAgICAgICAvLyBJZiB0aGlzIGVsZW1lbnQgaGFzIGEgcGFyZW50LCBpbmRlbnQgaXQgaWYgYW55IG9mIGl0cyBzaWJsaW5ncyBoYXZlIGNoaWxkcmVuXG4gICAgICAgICAgICB0aGlzLl9pbmRlbnRXaXRob3V0QXJyb3cgPSAhdGhpcy5fcGFyZW50LmNoaWxkcmVuLmV2ZXJ5KChpdGVtKSA9PiBpdGVtLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUb3AtbGV2ZWwgZWxlbWVudHMgc2hvdWxkIGJlIGluZGVudGVkXG4gICAgICAgICAgICB0aGlzLl9pbmRlbnRXaXRob3V0QXJyb3cgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiQGlmIChsaW5rKSB7XG4gIDxhXG4gICAgW2NsYXNzLmhhcy1hcnJvd109XCJjaGlsZHJlbi5sZW5ndGggPiAwXCJcbiAgICBbY2xhc3Mubm8tYXJyb3ddPVwiX2luZGVudFdpdGhvdXRBcnJvd1wiXG4gICAgW3JvdXRlckxpbmtdPVwibGlua1wiXG4gICAgPlxuICAgIDxzcGFuPnt7IGhlYWRlciB9fTwvc3Bhbj5cbiAgPC9hPlxufVxuXG5AaWYgKCFsaW5rKSB7XG4gIDxhXG4gICAgKGNsaWNrKT1cImV4cGFuZGVkID0gIWV4cGFuZGVkXCJcbiAgICBbY2xhc3MuaGFzLWFycm93XT1cImNoaWxkcmVuLmxlbmd0aCA+IDBcIlxuICAgIFtjbGFzcy5uby1hcnJvd109XCJfaW5kZW50V2l0aG91dEFycm93XCJcbiAgICA+XG4gICAgPHNwYW4+e3sgaGVhZGVyIH19PC9zcGFuPlxuICA8L2E+XG59XG5cbjxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiJdfQ==