@alfresco/adf-content-services
Version:
Alfresco ADF content services
66 lines • 20 kB
JavaScript
/*!
* @license
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* 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 { Component, ViewChild, ViewEncapsulation } from '@angular/core';
import { MatSelect, MatSelectModule } from '@angular/material/select';
import { BreadcrumbComponent } from './breadcrumb.component';
import { CommonModule } from '@angular/common';
import { MatIconModule } from '@angular/material/icon';
import { TranslateModule } from '@ngx-translate/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/material/icon";
import * as i3 from "@angular/material/select";
import * as i4 from "@angular/material/core";
import * as i5 from "@ngx-translate/core";
export class DropdownBreadcrumbComponent extends BreadcrumbComponent {
/**
* Calculate the current and previous nodes from the route array
*/
recalculateNodes() {
const node = this.transform ? this.transform(this.folderNode) : this.folderNode;
this.route = this.parseRoute(node);
this.currentNode = this.route[this.route.length - 1];
this.previousNodes = this.route.slice(0, this.route.length - 1).reverse();
}
/**
* Opens the node picker menu
*/
open() {
if (this.dropdown) {
this.dropdown.open();
this.dropdown.focus();
}
}
/**
* Check if route has more than one element (means: we are not in the root directory)
*
* @returns `true` if there are previous nodes, otherwise `false`
*/
hasPreviousNodes() {
return this.previousNodes.length > 0;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: DropdownBreadcrumbComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: DropdownBreadcrumbComponent, isStandalone: true, selector: "adf-dropdown-breadcrumb", host: { classAttribute: "adf-dropdown-breadcrumb" }, viewQueries: [{ propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<nav *ngIf=\"route.length > 0\" class=\"adf-dropdown-breadcrumb-container\"\n role=\"navigation\"\n [attr.aria-label]=\"'BREADCRUMB.ARIA-LABEL.BREADCRUMB' | translate\">\n\n <button\n id=\"dropdown-breadcrumb-button\"\n [tabindex]=\"hasPreviousNodes() ? 0 : -1\"\n class=\"adf-dropdown-breadcrumb-trigger\"\n (click)=\"open()\"\n [attr.aria-label]=\"'BREADCRUMB.ARIA-LABEL.DROPDOWN' | translate\"\n data-automation-id=\"dropdown-breadcrumb-trigger\">\n <mat-icon class=\"adf-dropdown-breadcrumb-icon\" [class.adf-isRoot]=\"!hasPreviousNodes()\">folder</mat-icon>\n </button>\n\n <mat-icon class=\"adf-dropdown-breadcrumb-icon adf-dropdown-breadcrumb-item-chevron\">chevron_right</mat-icon>\n\n <div class=\"adf-dropdown-breadcrumb-path\">\n <mat-select\n #dropdown\n *ngIf=\"hasPreviousNodes()\"\n panelClass=\"adf-breadcrumb-dropdown-panel\"\n class=\"adf-dropdown-breadcrumb-path-select\"\n tabindex=\"-1\"\n role=\"button\"\n data-automation-id=\"dropdown-breadcrumb-path\"\n aria-labelledby=\"dropdown-breadcrumb-button\">\n\n <mat-option\n *ngFor=\"let node of previousNodes;\"\n (click)=\"onRoutePathClick(node, $event)\"\n (onSelectionChange)=\"onRouteClick(node)\"\n class=\"adf-dropdown-breadcrumb-path-option adf-dropdown-breadcrumb-path-option-node\"\n data-automation-class=\"dropdown-breadcrumb-path-option\"\n [disabled]=\"readOnly\">\n {{ node.name | translate }}\n </mat-option>\n </mat-select>\n </div>\n\n <span\n class=\"adf-current-folder\"\n [class.adf-isRoot]=\"!hasPreviousNodes()\"\n data-automation-id=\"current-folder\"\n aria-current=\"location\">{{ currentNode.name }}\n </span>\n</nav>\n", styles: [".adf-dropdown-breadcrumb{display:flex;flex:1;line-height:24px;font-size:var(--theme-body-1-font-size);font-weight:600;letter-spacing:-.2px;color:var(--adf-theme-foreground-text-color-054);overflow:hidden;margin-top:10px}.adf-dropdown-breadcrumb-icon{height:35px}.adf-dropdown-breadcrumb-container{margin:0;padding:0;list-style-type:none;cursor:default;display:flex;overflow:hidden}.adf-dropdown-breadcrumb-trigger{cursor:pointer;padding:0;border:none;background:transparent;width:25px}.adf-dropdown-breadcrumb-trigger:focus{color:var(--theme-primary-color);outline:none}.adf-dropdown-breadcrumb-trigger.adf-isRoot{cursor:not-allowed}.adf-dropdown-breadcrumb-path{width:0;height:0;overflow:hidden}.adf-dropdown-breadcrumb-path-select{width:0}.adf-current-folder{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;width:75%;color:var(--adf-theme-foreground-text-color)}.adf-dropdown-breadcrumb-path-option.adf-dropdown-breadcrumb-path-option-node{padding:0 12px;font-size:var(--theme-caption-font-size)}.adf-dropdown-breadcrumb-path-option.adf-dropdown-breadcrumb-path-option-node:first-child{padding-top:4px}.adf-dropdown-breadcrumb-path-option.adf-dropdown-breadcrumb-path-option-node:last-child{padding-bottom:4px}[dir=ltr] .adf-dropdown-breadcrumb-path{margin-left:-30px}[dir=ltr] .adf-current-folder{margin-left:30px}[dir=rtl] .adf-dropdown-breadcrumb-path{margin-right:-30px}[dir=rtl] .adf-current-folder{margin-right:30px}.cdk-overlay-pane:has(>.adf-breadcrumb-dropdown-panel){min-width:fit-content}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i3.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i4.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: DropdownBreadcrumbComponent, decorators: [{
type: Component,
args: [{ selector: 'adf-dropdown-breadcrumb', standalone: true, imports: [CommonModule, MatIconModule, MatSelectModule, TranslateModule], encapsulation: ViewEncapsulation.None, host: { class: 'adf-dropdown-breadcrumb' }, template: "<nav *ngIf=\"route.length > 0\" class=\"adf-dropdown-breadcrumb-container\"\n role=\"navigation\"\n [attr.aria-label]=\"'BREADCRUMB.ARIA-LABEL.BREADCRUMB' | translate\">\n\n <button\n id=\"dropdown-breadcrumb-button\"\n [tabindex]=\"hasPreviousNodes() ? 0 : -1\"\n class=\"adf-dropdown-breadcrumb-trigger\"\n (click)=\"open()\"\n [attr.aria-label]=\"'BREADCRUMB.ARIA-LABEL.DROPDOWN' | translate\"\n data-automation-id=\"dropdown-breadcrumb-trigger\">\n <mat-icon class=\"adf-dropdown-breadcrumb-icon\" [class.adf-isRoot]=\"!hasPreviousNodes()\">folder</mat-icon>\n </button>\n\n <mat-icon class=\"adf-dropdown-breadcrumb-icon adf-dropdown-breadcrumb-item-chevron\">chevron_right</mat-icon>\n\n <div class=\"adf-dropdown-breadcrumb-path\">\n <mat-select\n #dropdown\n *ngIf=\"hasPreviousNodes()\"\n panelClass=\"adf-breadcrumb-dropdown-panel\"\n class=\"adf-dropdown-breadcrumb-path-select\"\n tabindex=\"-1\"\n role=\"button\"\n data-automation-id=\"dropdown-breadcrumb-path\"\n aria-labelledby=\"dropdown-breadcrumb-button\">\n\n <mat-option\n *ngFor=\"let node of previousNodes;\"\n (click)=\"onRoutePathClick(node, $event)\"\n (onSelectionChange)=\"onRouteClick(node)\"\n class=\"adf-dropdown-breadcrumb-path-option adf-dropdown-breadcrumb-path-option-node\"\n data-automation-class=\"dropdown-breadcrumb-path-option\"\n [disabled]=\"readOnly\">\n {{ node.name | translate }}\n </mat-option>\n </mat-select>\n </div>\n\n <span\n class=\"adf-current-folder\"\n [class.adf-isRoot]=\"!hasPreviousNodes()\"\n data-automation-id=\"current-folder\"\n aria-current=\"location\">{{ currentNode.name }}\n </span>\n</nav>\n", styles: [".adf-dropdown-breadcrumb{display:flex;flex:1;line-height:24px;font-size:var(--theme-body-1-font-size);font-weight:600;letter-spacing:-.2px;color:var(--adf-theme-foreground-text-color-054);overflow:hidden;margin-top:10px}.adf-dropdown-breadcrumb-icon{height:35px}.adf-dropdown-breadcrumb-container{margin:0;padding:0;list-style-type:none;cursor:default;display:flex;overflow:hidden}.adf-dropdown-breadcrumb-trigger{cursor:pointer;padding:0;border:none;background:transparent;width:25px}.adf-dropdown-breadcrumb-trigger:focus{color:var(--theme-primary-color);outline:none}.adf-dropdown-breadcrumb-trigger.adf-isRoot{cursor:not-allowed}.adf-dropdown-breadcrumb-path{width:0;height:0;overflow:hidden}.adf-dropdown-breadcrumb-path-select{width:0}.adf-current-folder{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;width:75%;color:var(--adf-theme-foreground-text-color)}.adf-dropdown-breadcrumb-path-option.adf-dropdown-breadcrumb-path-option-node{padding:0 12px;font-size:var(--theme-caption-font-size)}.adf-dropdown-breadcrumb-path-option.adf-dropdown-breadcrumb-path-option-node:first-child{padding-top:4px}.adf-dropdown-breadcrumb-path-option.adf-dropdown-breadcrumb-path-option-node:last-child{padding-bottom:4px}[dir=ltr] .adf-dropdown-breadcrumb-path{margin-left:-30px}[dir=ltr] .adf-current-folder{margin-left:30px}[dir=rtl] .adf-dropdown-breadcrumb-path{margin-right:-30px}[dir=rtl] .adf-current-folder{margin-right:30px}.cdk-overlay-pane:has(>.adf-breadcrumb-dropdown-panel){min-width:fit-content}\n"] }]
}], propDecorators: { dropdown: [{
type: ViewChild,
args: ['dropdown']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tYnJlYWRjcnVtYi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWIvY29udGVudC1zZXJ2aWNlcy9zcmMvbGliL2JyZWFkY3J1bWIvZHJvcGRvd24tYnJlYWRjcnVtYi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWIvY29udGVudC1zZXJ2aWNlcy9zcmMvbGliL2JyZWFkY3J1bWIvZHJvcGRvd24tYnJlYWRjcnVtYi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFhLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRixPQUFPLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXRFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7O0FBV3RELE1BQU0sT0FBTywyQkFBNEIsU0FBUSxtQkFBbUI7SUFPaEU7O09BRUc7SUFDTyxnQkFBZ0I7UUFDdEIsTUFBTSxJQUFJLEdBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFdEYsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM5RSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJO1FBQ0EsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFCLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGdCQUFnQjtRQUNaLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7OEdBbkNRLDJCQUEyQjtrR0FBM0IsMkJBQTJCLHFRQ2xDeEMsaTZEQThDQSx1akREbEJjLFlBQVksK1BBQUUsYUFBYSxtTEFBRSxlQUFlLG1yQkFBRSxlQUFlOzsyRkFNOUQsMkJBQTJCO2tCQVR2QyxTQUFTOytCQUNJLHlCQUF5QixjQUN2QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUMsaUJBR3pELGlCQUFpQixDQUFDLElBQUksUUFDL0IsRUFBRSxLQUFLLEVBQUUseUJBQXlCLEVBQUU7OEJBSTFDLFFBQVE7c0JBRFAsU0FBUzt1QkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IMKpIDIwMDUtMjAyNSBIeWxhbmQgU29mdHdhcmUsIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uQ2hhbmdlcywgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0U2VsZWN0LCBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgUGF0aEVsZW1lbnQsIE5vZGUgfSBmcm9tICdAYWxmcmVzY28vanMtYXBpJztcbmltcG9ydCB7IEJyZWFkY3J1bWJDb21wb25lbnQgfSBmcm9tICcuL2JyZWFkY3J1bWIuY29tcG9uZW50JztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhZGYtZHJvcGRvd24tYnJlYWRjcnVtYicsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBNYXRTZWxlY3RNb2R1bGUsIFRyYW5zbGF0ZU1vZHVsZV0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Ryb3Bkb3duLWJyZWFkY3J1bWIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2Ryb3Bkb3duLWJyZWFkY3J1bWIuY29tcG9uZW50LnNjc3MnXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGhvc3Q6IHsgY2xhc3M6ICdhZGYtZHJvcGRvd24tYnJlYWRjcnVtYicgfVxufSlcbmV4cG9ydCBjbGFzcyBEcm9wZG93bkJyZWFkY3J1bWJDb21wb25lbnQgZXh0ZW5kcyBCcmVhZGNydW1iQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgICBAVmlld0NoaWxkKCdkcm9wZG93bicpXG4gICAgZHJvcGRvd246IE1hdFNlbGVjdDtcblxuICAgIGN1cnJlbnROb2RlOiBQYXRoRWxlbWVudDtcbiAgICBwcmV2aW91c05vZGVzOiBQYXRoRWxlbWVudFtdO1xuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBub2RlcyBmcm9tIHRoZSByb3V0ZSBhcnJheVxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWNhbGN1bGF0ZU5vZGVzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBub2RlOiBOb2RlID0gdGhpcy50cmFuc2Zvcm0gPyB0aGlzLnRyYW5zZm9ybSh0aGlzLmZvbGRlck5vZGUpIDogdGhpcy5mb2xkZXJOb2RlO1xuXG4gICAgICAgIHRoaXMucm91dGUgPSB0aGlzLnBhcnNlUm91dGUobm9kZSk7XG4gICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLnJvdXRlW3RoaXMucm91dGUubGVuZ3RoIC0gMV07XG4gICAgICAgIHRoaXMucHJldmlvdXNOb2RlcyA9IHRoaXMucm91dGUuc2xpY2UoMCwgdGhpcy5yb3V0ZS5sZW5ndGggLSAxKS5yZXZlcnNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIG5vZGUgcGlja2VyIG1lbnVcbiAgICAgKi9cbiAgICBvcGVuKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kcm9wZG93bikge1xuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5vcGVuKCk7XG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiByb3V0ZSBoYXMgbW9yZSB0aGFuIG9uZSBlbGVtZW50IChtZWFuczogd2UgYXJlIG5vdCBpbiB0aGUgcm9vdCBkaXJlY3RvcnkpXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlcmUgYXJlIHByZXZpb3VzIG5vZGVzLCBvdGhlcndpc2UgYGZhbHNlYFxuICAgICAqL1xuICAgIGhhc1ByZXZpb3VzTm9kZXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXZpb3VzTm9kZXMubGVuZ3RoID4gMDtcbiAgICB9XG59XG4iLCI8bmF2ICpuZ0lmPVwicm91dGUubGVuZ3RoID4gMFwiIGNsYXNzPVwiYWRmLWRyb3Bkb3duLWJyZWFkY3J1bWItY29udGFpbmVyXCJcbiAgICAgcm9sZT1cIm5hdmlnYXRpb25cIlxuICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidCUkVBRENSVU1CLkFSSUEtTEFCRUwuQlJFQURDUlVNQicgfCB0cmFuc2xhdGVcIj5cblxuICAgIDxidXR0b25cbiAgICAgICAgaWQ9XCJkcm9wZG93bi1icmVhZGNydW1iLWJ1dHRvblwiXG4gICAgICAgIFt0YWJpbmRleF09XCJoYXNQcmV2aW91c05vZGVzKCkgPyAwIDogLTFcIlxuICAgICAgICBjbGFzcz1cImFkZi1kcm9wZG93bi1icmVhZGNydW1iLXRyaWdnZXJcIlxuICAgICAgICAoY2xpY2spPVwib3BlbigpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQlJFQURDUlVNQi5BUklBLUxBQkVMLkRST1BET1dOJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIGRhdGEtYXV0b21hdGlvbi1pZD1cImRyb3Bkb3duLWJyZWFkY3J1bWItdHJpZ2dlclwiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJhZGYtZHJvcGRvd24tYnJlYWRjcnVtYi1pY29uXCIgW2NsYXNzLmFkZi1pc1Jvb3RdPVwiIWhhc1ByZXZpb3VzTm9kZXMoKVwiPmZvbGRlcjwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG5cbiAgICA8bWF0LWljb24gY2xhc3M9XCJhZGYtZHJvcGRvd24tYnJlYWRjcnVtYi1pY29uIGFkZi1kcm9wZG93bi1icmVhZGNydW1iLWl0ZW0tY2hldnJvblwiPmNoZXZyb25fcmlnaHQ8L21hdC1pY29uPlxuXG4gICAgPGRpdiBjbGFzcz1cImFkZi1kcm9wZG93bi1icmVhZGNydW1iLXBhdGhcIj5cbiAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICNkcm9wZG93blxuICAgICAgICAgICAgKm5nSWY9XCJoYXNQcmV2aW91c05vZGVzKClcIlxuICAgICAgICAgICAgcGFuZWxDbGFzcz1cImFkZi1icmVhZGNydW1iLWRyb3Bkb3duLXBhbmVsXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYWRmLWRyb3Bkb3duLWJyZWFkY3J1bWItcGF0aC1zZWxlY3RcIlxuICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGRhdGEtYXV0b21hdGlvbi1pZD1cImRyb3Bkb3duLWJyZWFkY3J1bWItcGF0aFwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJkcm9wZG93bi1icmVhZGNydW1iLWJ1dHRvblwiPlxuXG4gICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBub2RlIG9mIHByZXZpb3VzTm9kZXM7XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Sb3V0ZVBhdGhDbGljayhub2RlLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAob25TZWxlY3Rpb25DaGFuZ2UpPVwib25Sb3V0ZUNsaWNrKG5vZGUpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFkZi1kcm9wZG93bi1icmVhZGNydW1iLXBhdGgtb3B0aW9uIGFkZi1kcm9wZG93bi1icmVhZGNydW1iLXBhdGgtb3B0aW9uLW5vZGVcIlxuICAgICAgICAgICAgICAgIGRhdGEtYXV0b21hdGlvbi1jbGFzcz1cImRyb3Bkb3duLWJyZWFkY3J1bWItcGF0aC1vcHRpb25cIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyZWFkT25seVwiPlxuICAgICAgICAgICAgICAgIHt7IG5vZGUubmFtZSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgPC9kaXY+XG5cbiAgICA8c3BhblxuICAgICAgICBjbGFzcz1cImFkZi1jdXJyZW50LWZvbGRlclwiXG4gICAgICAgIFtjbGFzcy5hZGYtaXNSb290XT1cIiFoYXNQcmV2aW91c05vZGVzKClcIlxuICAgICAgICBkYXRhLWF1dG9tYXRpb24taWQ9XCJjdXJyZW50LWZvbGRlclwiXG4gICAgICAgIGFyaWEtY3VycmVudD1cImxvY2F0aW9uXCI+e3sgY3VycmVudE5vZGUubmFtZSB9fVxuICAgIDwvc3Bhbj5cbjwvbmF2PlxuIl19