cfc-ds
Version:
Design System do Conselho Federal de Contabilidade baseado no govbr-ds
118 lines • 18.8 kB
JavaScript
import { Component, Input } from '@angular/core';
import { NavigationEnd } from '@angular/router';
import { filter } from 'rxjs';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "@angular/common";
export class BreadcrumbComponent {
router;
activatedRoute;
/** Lista de breadcrumbs gerados */
links = [];
homeUrl;
/** Inscrição para monitorar mudanças na rota */
routeSubscription;
constructor(router, activatedRoute) {
this.router = router;
this.activatedRoute = activatedRoute;
}
/** Inicializa o componente e observa mudanças de rota */
ngOnInit() {
this.updateBreadcrumbs();
this.routeSubscription = this.router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe(() => {
this.updateBreadcrumbs();
});
}
getHomeUrl() {
if (!this.homeUrl) {
return '/';
}
return this.homeUrl;
}
/** Atualiza os breadcrumbs com base na rota ativa */
updateBreadcrumbs() {
const breadcrumbs = this.buildBreadcrumbs(this.router.routerState.root);
this.removeLastBreadcrumbUrl(breadcrumbs);
this.links = breadcrumbs;
}
/**
* Constrói os breadcrumbs recursivamente com base nas rotas ativadas.
* @param route Rota ativa.
* @param breadcrumbs Lista de breadcrumbs acumulada.
* @returns Lista de BreadcrumbLink atualizada.
*/
buildBreadcrumbs(route, breadcrumbs = []) {
route.children.forEach((child) => {
const routeSegment = this.getRouteURL(child);
const label = this.getBreadcrumbLabel(child.snapshot.data);
const fullPath = this.buildFullPath(routeSegment, breadcrumbs);
if (label && !this.isDuplicateBreadcrumb(breadcrumbs, label)) {
breadcrumbs.push({ label, url: fullPath, target: '_self' });
}
this.buildBreadcrumbs(child, breadcrumbs);
});
return breadcrumbs;
}
/**
* Obtém o segmento da URL da rota atual.
* @param route Rota atual.
* @returns Segmento da URL ou string vazia.
*/
getRouteURL(route) {
return route.snapshot.url.length > 0
? route.snapshot.url.map(segment => segment.path).join('/')
: '';
}
/**
* Constrói o caminho completo concatenando segmentos anteriores.
* @param routeSegment Segmento atual da rota.
* @param breadcrumbs Lista de breadcrumbs acumulada.
* @returns Caminho completo da URL.
*/
buildFullPath(routeSegment, breadcrumbs) {
if (!routeSegment)
return '';
const previousPath = breadcrumbs.length > 0 ? breadcrumbs[breadcrumbs.length - 1].url : '';
return previousPath ? `${previousPath}/${routeSegment}` : `/${routeSegment}`;
}
/**
* Obtém o rótulo do breadcrumb a partir dos dados da rota.
* @param data Dados da rota.
* @returns Rótulo do breadcrumb ou null.
*/
getBreadcrumbLabel(data) {
const label = data['breadcrumb'];
return label && typeof label === 'string' && label.trim() ? label.trim() : null;
}
/**
* Remove a URL do último breadcrumb para evitar que seja clicável.
* @param breadcrumbs Lista de breadcrumbs.
*/
removeLastBreadcrumbUrl(breadcrumbs) {
if (breadcrumbs.length > 0) {
breadcrumbs[breadcrumbs.length - 1].url = undefined;
}
}
/**
* Verifica se um breadcrumb já existe na lista para evitar duplicatas.
* @param breadcrumbs Lista de breadcrumbs acumulada.
* @param label Nome do breadcrumb a verificar.
* @returns Verdadeiro se o breadcrumb já existir, falso caso contrário.
*/
isDuplicateBreadcrumb(breadcrumbs, label) {
return breadcrumbs.some(bc => bc.label === label);
}
/** Cancela a inscrição ao destruir o componente */
ngOnDestroy() {
this.routeSubscription?.unsubscribe();
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BreadcrumbComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: BreadcrumbComponent, selector: "cfc-breadcrumb", inputs: { homeUrl: "homeUrl" }, ngImport: i0, template: "<nav\r\n class=\"br-breadcrumb\"\r\n aria-label=\"Breadcrumbs\">\r\n <ul\r\n class=\"crumb-list\"\r\n style=\"padding-left: 0;\"\r\n role=\"list\">\r\n <li\r\n class=\"crumb\">\r\n <a\r\n class=\"br-button circle\"\r\n [href]=\"getHomeUrl()\"\r\n target=\"_self\">\r\n <i class=\"fas fa-home\"></i>\r\n </a>\r\n </li>\r\n\r\n <li\r\n class=\"crumb\"\r\n *ngFor=\"let link of links; let last = last\">\r\n <i\r\n class=\"icon fas fa-chevron-right\">\r\n </i>\r\n\r\n <a\r\n *ngIf=\"!last\"\r\n [href]=\"link.url\"\r\n [target]=\"link.target\">\r\n <span>\r\n {{ link.label | titlecase }}\r\n </span>\r\n </a>\r\n\r\n\r\n <span\r\n *ngIf=\"last\"\r\n tabindex=\"0\"\r\n aria-current=\"page\">\r\n {{ link.label | titlecase }}\r\n </span>\r\n\r\n </li>\r\n </ul>\r\n</nav>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.TitleCasePipe, name: "titlecase" }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BreadcrumbComponent, decorators: [{
type: Component,
args: [{ selector: 'cfc-breadcrumb', template: "<nav\r\n class=\"br-breadcrumb\"\r\n aria-label=\"Breadcrumbs\">\r\n <ul\r\n class=\"crumb-list\"\r\n style=\"padding-left: 0;\"\r\n role=\"list\">\r\n <li\r\n class=\"crumb\">\r\n <a\r\n class=\"br-button circle\"\r\n [href]=\"getHomeUrl()\"\r\n target=\"_self\">\r\n <i class=\"fas fa-home\"></i>\r\n </a>\r\n </li>\r\n\r\n <li\r\n class=\"crumb\"\r\n *ngFor=\"let link of links; let last = last\">\r\n <i\r\n class=\"icon fas fa-chevron-right\">\r\n </i>\r\n\r\n <a\r\n *ngIf=\"!last\"\r\n [href]=\"link.url\"\r\n [target]=\"link.target\">\r\n <span>\r\n {{ link.label | titlecase }}\r\n </span>\r\n </a>\r\n\r\n\r\n <span\r\n *ngIf=\"last\"\r\n tabindex=\"0\"\r\n aria-current=\"page\">\r\n {{ link.label | titlecase }}\r\n </span>\r\n\r\n </li>\r\n </ul>\r\n</nav>\r\n" }]
}], ctorParameters: () => [{ type: i1.Router }, { type: i1.ActivatedRoute }], propDecorators: { homeUrl: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2JyZWFkY3J1bWIvYnJlYWRjcnVtYi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2JyZWFkY3J1bWIvYnJlYWRjcnVtYi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUEwQixhQUFhLEVBQVEsTUFBTSxpQkFBaUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsTUFBTSxFQUFnQixNQUFNLE1BQU0sQ0FBQzs7OztBQVE1QyxNQUFNLE9BQU8sbUJBQW1CO0lBVXBCO0lBQ0E7SUFWVixtQ0FBbUM7SUFDbkMsS0FBSyxHQUFxQixFQUFFLENBQUM7SUFFcEIsT0FBTyxDQUFVO0lBRTFCLGdEQUFnRDtJQUN4QyxpQkFBaUIsQ0FBZ0I7SUFFekMsWUFDVSxNQUFjLEVBQ2QsY0FBOEI7UUFEOUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtJQUNyQyxDQUFDO0lBRUoseURBQXlEO0lBQ3pELFFBQVE7UUFDTixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUV6QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUM5QyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLFlBQVksYUFBYSxDQUFDLENBQ2hELENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNmLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJ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Q0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUM7UUFDdEQsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLHFCQUFxQixDQUFDLFdBQTZCLEVBQUUsS0FBYTtRQUN4RSxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxtREFBbUQ7SUFDbkQsV0FBVztRQUNULElBQUksQ0FBQyxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUN4QyxDQUFDO3dHQXRIVSxtQkFBbUI7NEZBQW5CLG1CQUFtQixzRkNWaEMsazhCQTRDQTs7NEZEbENhLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxnQkFBZ0I7d0dBUWpCLE9BQU87c0JBQWYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlciwgQWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FbmQsIERhdGEgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBCcmVhZGNydW1iTGluayB9IGZyb20gJy4uLy4uL21vZGVscy9icmVhZGNydW1iLm1vZGVsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY2ZjLWJyZWFkY3J1bWInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9icmVhZGNydW1iLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9icmVhZGNydW1iLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEJyZWFkY3J1bWJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgLyoqIExpc3RhIGRlIGJyZWFkY3J1bWJzIGdlcmFkb3MgKi9cclxuICBsaW5rczogQnJlYWRjcnVtYkxpbmtbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKSBob21lVXJsPzogc3RyaW5nO1xyXG5cclxuICAvKiogSW5zY3Jpw6fDo28gcGFyYSBtb25pdG9yYXIgbXVkYW7Dp2FzIG5hIHJvdGEgKi9cclxuICBwcml2YXRlIHJvdXRlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVxyXG4gICkge31cclxuXHJcbiAgLyoqIEluaWNpYWxpemEgbyBjb21wb25lbnRlIGUgb2JzZXJ2YSBtdWRhbsOnYXMgZGUgcm90YSAqL1xyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVCcmVhZGNydW1icygpO1xyXG5cclxuICAgIHRoaXMucm91dGVTdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlci5ldmVudHMucGlwZShcclxuICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZClcclxuICAgICkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy51cGRhdGVCcmVhZGNydW1icygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRIb21lVXJsKCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuaG9tZVVybCkge1xyXG4gICAgICByZXR1cm4gJy8nO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmhvbWVVcmw7XHJcbiAgfVxyXG5cclxuICAvKiogQXR1YWxpemEgb3MgYnJlYWRjcnVtYnMgY29tIGJhc2UgbmEgcm90YSBhdGl2YSAqL1xyXG4gIHByaXZhdGUgdXBkYXRlQnJlYWRjcnVtYnMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBicmVhZGNydW1icyA9IHRoaXMuYnVpbGRCcmVhZGNydW1icyh0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5yb290KTtcclxuICAgIHRoaXMucmVtb3ZlTGFzdEJyZWFkY3J1bWJVcmwoYnJlYWRjcnVtYnMpO1xyXG4gICAgdGhpcy5saW5rcyA9IGJyZWFkY3J1bWJzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29uc3Ryw7NpIG9zIGJyZWFkY3J1bWJzIHJlY3Vyc2l2YW1lbnRlIGNvbSBiYXNlIG5hcyByb3RhcyBhdGl2YWRhcy5cclxuICAgKiBAcGFyYW0gcm91dGUgUm90YSBhdGl2YS5cclxuICAgKiBAcGFyYW0gYnJlYWRjcnVtYnMgTGlzdGEgZGUgYnJlYWRjcnVtYnMgYWN1bXVsYWRhLlxyXG4gICAqIEByZXR1cm5zIExpc3RhIGRlIEJyZWFkY3J1bWJMaW5rIGF0dWFsaXphZGEuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBidWlsZEJyZWFkY3J1bWJzKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSwgYnJlYWRjcnVtYnM6IEJyZWFkY3J1bWJMaW5rW10gPSBbXSk6IEJyZWFkY3J1bWJMaW5rW10ge1xyXG4gICAgcm91dGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgY29uc3Qgcm91dGVTZWdtZW50ID0gdGhpcy5nZXRSb3V0ZVVSTChjaGlsZCk7XHJcbiAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5nZXRCcmVhZGNydW1iTGFiZWwoY2hpbGQuc25hcHNob3QuZGF0YSk7XHJcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gdGhpcy5idWlsZEZ1bGxQYXRoKHJvdXRlU2VnbWVudCwgYnJlYWRjcnVtYnMpO1xyXG5cclxuICAgICAgaWYgKGxhYmVsICYmICF0aGlzLmlzRHVwbGljYXRlQnJlYWRjcnVtYihicmVhZGNydW1icywgbGFiZWwpKSB7XHJcbiAgICAgICAgYnJlYWRjcnVtYnMucHVzaCh7IGxhYmVsLCB1cmw6IGZ1bGxQYXRoLCB0YXJnZXQ6ICdfc2VsZicgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYnVpbGRCcmVhZGNydW1icyhjaGlsZCwgYnJlYWRjcnVtYnMpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGJyZWFkY3J1bWJzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT2J0w6ltIG8gc2VnbWVudG8gZGEgVVJMIGRhIHJvdGEgYXR1YWwuXHJcbiAgICogQHBhcmFtIHJvdXRlIFJvdGEgYXR1YWwuXHJcbiAgICogQHJldHVybnMgU2VnbWVudG8gZGEgVVJMIG91IHN0cmluZyB2YXppYS5cclxuICAgKi9cclxuICBwcml2YXRlIGdldFJvdXRlVVJMKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm91dGUuc25hcHNob3QudXJsLmxlbmd0aCA+IDBcclxuICAgICAgPyByb3V0ZS5zbmFwc2hvdC51cmwubWFwKHNlZ21lbnQgPT4gc2VnbWVudC5wYXRoKS5qb2luKCcvJylcclxuICAgICAgOiAnJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnN0csOzaSBvIGNhbWluaG8gY29tcGxldG8gY29uY2F0ZW5hbmRvIHNlZ21lbnRvcyBhbnRlcmlvcmVzLlxyXG4gICAqIEBwYXJhbSByb3V0ZVNlZ21lbnQgU2VnbWVudG8gYXR1YWwgZGEgcm90YS5cclxuICAgKiBAcGFyYW0gYnJlYWRjcnVtYnMgTGlzdGEgZGUgYnJlYWRjcnVtYnMgYWN1bXVsYWRhLlxyXG4gICAqIEByZXR1cm5zIENhbWluaG8gY29tcGxldG8gZGEgVVJMLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYnVpbGRGdWxsUGF0aChyb3V0ZVNlZ21lbnQ6IHN0cmluZywgYnJlYWRjcnVtYnM6IEJyZWFkY3J1bWJMaW5rW10pOiBzdHJpbmcge1xyXG4gICAgaWYgKCFyb3V0ZVNlZ21lbnQpIHJldHVybiAnJztcclxuICAgIGNvbnN0IHByZXZpb3VzUGF0aCA9IGJyZWFkY3J1bWJzLmxlbmd0aCA+IDAgPyBicmVhZGNydW1ic1ticmVhZGNydW1icy5sZW5ndGggLSAxXS51cmwgOiAnJztcclxuICAgIHJldHVybiBwcmV2aW91c1BhdGggPyBgJHtwcmV2aW91c1BhdGh9LyR7cm91dGVTZWdtZW50fWAgOiBgLyR7cm91dGVTZWdtZW50fWA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPYnTDqW0gbyByw7N0dWxvIGRvIGJyZWFkY3J1bWIgYSBwYXJ0aXIgZG9zIGRhZG9zIGRhIHJvdGEuXHJcbiAgICogQHBhcmFtIGRhdGEgRGFkb3MgZGEgcm90YS5cclxuICAgKiBAcmV0dXJucyBSw7N0dWxvIGRvIGJyZWFkY3J1bWIgb3UgbnVsbC5cclxuICAgKi9cclxuICBwcml2YXRlIGdldEJyZWFkY3J1bWJMYWJlbChkYXRhOiBEYXRhKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBjb25zdCBsYWJlbCA9IGRhdGFbJ2JyZWFkY3J1bWInXTtcclxuICAgIHJldHVybiBsYWJlbCAmJiB0eXBlb2YgbGFiZWwgPT09ICdzdHJpbmcnICYmIGxhYmVsLnRyaW0oKSA/IGxhYmVsLnRyaW0oKSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgYSBVUkwgZG8gw7psdGltbyBicmVhZGNydW1iIHBhcmEgZXZpdGFyIHF1ZSBzZWphIGNsaWPDoXZlbC5cclxuICAgKiBAcGFyYW0gYnJlYWRjcnVtYnMgTGlzdGEgZGUgYnJlYWRjcnVtYnMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZW1vdmVMYXN0QnJlYWRjcnVtYlVybChicmVhZGNydW1iczogQnJlYWRjcnVtYkxpbmtbXSk6IHZvaWQge1xyXG4gICAgaWYgKGJyZWFkY3J1bWJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgYnJlYWRjcnVtYnNbYnJlYWRjcnVtYnMubGVuZ3RoIC0gMV0udXJsID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmVyaWZpY2Egc2UgdW0gYnJlYWRjcnVtYiBqw6EgZXhpc3RlIG5hIGxpc3RhIHBhcmEgZXZpdGFyIGR1cGxpY2F0YXMuXHJcbiAgICogQHBhcmFtIGJyZWFkY3J1bWJzIExpc3RhIGRlIGJyZWFkY3J1bWJzIGFjdW11bGFkYS5cclxuICAgKiBAcGFyYW0gbGFiZWwgTm9tZSBkbyBicmVhZGNydW1iIGEgdmVyaWZpY2FyLlxyXG4gICAqIEByZXR1cm5zIFZlcmRhZGVpcm8gc2UgbyBicmVhZGNydW1iIGrDoSBleGlzdGlyLCBmYWxzbyBjYXNvIGNvbnRyw6FyaW8uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc0R1cGxpY2F0ZUJyZWFkY3J1bWIoYnJlYWRjcnVtYnM6IEJyZWFkY3J1bWJMaW5rW10sIGxhYmVsOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBicmVhZGNydW1icy5zb21lKGJjID0+IGJjLmxhYmVsID09PSBsYWJlbCk7XHJcbiAgfVxyXG5cclxuICAvKiogQ2FuY2VsYSBhIGluc2NyacOnw6NvIGFvIGRlc3RydWlyIG8gY29tcG9uZW50ZSAqL1xyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5yb3V0ZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcbn1cclxuIiwiPG5hdlxyXG4gIGNsYXNzPVwiYnItYnJlYWRjcnVtYlwiXHJcbiAgYXJpYS1sYWJlbD1cIkJyZWFkY3J1bWJzXCI+XHJcbiAgPHVsXHJcbiAgICBjbGFzcz1cImNydW1iLWxpc3RcIlxyXG4gICAgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDA7XCJcclxuICAgIHJvbGU9XCJsaXN0XCI+XHJcbiAgICA8bGlcclxuICAgICAgY2xhc3M9XCJjcnVtYlwiPlxyXG4gICAgICA8YVxyXG4gICAgICAgIGNsYXNzPVwiYnItYnV0dG9uIGNpcmNsZVwiXHJcbiAgICAgICAgW2hyZWZdPVwiZ2V0SG9tZVVybCgpXCJcclxuICAgICAgICB0YXJnZXQ9XCJfc2VsZlwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWhvbWVcIj48L2k+XHJcbiAgICAgIDwvYT5cclxuICAgIDwvbGk+XHJcblxyXG4gICAgPGxpXHJcbiAgICAgIGNsYXNzPVwiY3J1bWJcIlxyXG4gICAgICAqbmdGb3I9XCJsZXQgbGluayBvZiBsaW5rczsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgIDxpXHJcbiAgICAgICAgY2xhc3M9XCJpY29uIGZhcyBmYS1jaGV2cm9uLXJpZ2h0XCI+XHJcbiAgICAgIDwvaT5cclxuXHJcbiAgICAgIDxhXHJcbiAgICAgICAgKm5nSWY9XCIhbGFzdFwiXHJcbiAgICAgICAgW2hyZWZdPVwibGluay51cmxcIlxyXG4gICAgICAgIFt0YXJnZXRdPVwibGluay50YXJnZXRcIj5cclxuICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgIHt7IGxpbmsubGFiZWwgfCB0aXRsZWNhc2UgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYT5cclxuXHJcblxyXG4gICAgICA8c3BhblxyXG4gICAgICAgICpuZ0lmPVwibGFzdFwiXHJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcclxuICAgICAgICBhcmlhLWN1cnJlbnQ9XCJwYWdlXCI+XHJcbiAgICAgICAge3sgbGluay5sYWJlbCB8IHRpdGxlY2FzZSB9fVxyXG4gICAgICA8L3NwYW4+XHJcblxyXG4gICAgPC9saT5cclxuICA8L3VsPlxyXG48L25hdj5cclxuIl19