@exalif/ngx-breadcrumbs
Version:
Angular 4+ breadcrumbs on top of native Angular router
276 lines (266 loc) • 23.2 kB
JavaScript
import { Injectable, Injector, Component, NgModule } from '@angular/core';
import { Observable, of, from, BehaviorSubject, concat } from 'rxjs';
import * as template from 'lodash.template';
import * as templateSettings from 'lodash.templatesettings';
import { ActivatedRoute, NavigationEnd, Router, RouterModule } from '@angular/router';
import { filter, flatMap, distinct, toArray, first } from 'rxjs/operators';
import { CommonModule } from '@angular/common';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class BreadcrumbsConfig {
}
BreadcrumbsConfig.decorators = [
{ type: Injectable },
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
const /** @type {?} */ _ = {
template: template,
templateSettings: templateSettings
};
_.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
/**
* @abstract
*/
class BreadcrumbsUtils {
/**
* @param {?} rawTemplate
* @param {?} binding
* @return {?}
*/
static stringFormat(rawTemplate, binding) {
const /** @type {?} */ compiled = _.template(rawTemplate);
return compiled(binding);
}
/**
* @template T
* @param {?} value
* @return {?}
*/
static wrapIntoObservable(value) {
if (value instanceof Observable) {
return value;
}
if (this.isPromise(value)) {
return from(Promise.resolve(value));
}
return of(/** @type {?} */ (value));
}
/**
* @param {?} value
* @return {?}
*/
static isPromise(value) {
return value && (typeof value.then === 'function');
}
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class BreadcrumbsResolver {
/**
* @param {?} route
* @param {?} state
* @return {?}
*/
resolve(route, state) {
const /** @type {?} */ data = route.routeConfig.data;
const /** @type {?} */ path = this.getFullPath(route);
let /** @type {?} */ text = typeof (data["breadcrumbs"]) === 'string' ? data["breadcrumbs"] : data["breadcrumbs"].text || data["text"] || path;
text = BreadcrumbsUtils.stringFormat(text, route.data);
const /** @type {?} */ crumbs = [{
text,
path
}];
return of(crumbs);
}
/**
* @param {?} route
* @return {?}
*/
getFullPath(route) {
return this.fetchFullPath(route.pathFromRoot);
}
/**
* @param {?} routes
* @return {?}
*/
fetchFullPath(routes) {
return routes.reduce((path, route) => path += this.fetchRelativePath(route.url), '');
}
/**
* @param {?} urlSegments
* @return {?}
*/
fetchRelativePath(urlSegments) {
return urlSegments.reduce((path, urlSegment) => path += '/' + urlSegment.path, '');
}
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class BreadcrumbsService {
/**
* @param {?} _router
* @param {?} route
* @param {?} _config
* @param {?} _injector
*/
constructor(_router, route, _config, _injector) {
this._router = _router;
this.route = route;
this._config = _config;
this._injector = _injector;
this._breadcrumbs = new BehaviorSubject([]);
this._defaultResolver = new BreadcrumbsResolver();
this._router.events.pipe(filter((x) => x instanceof NavigationEnd))
.subscribe((event) => {
const /** @type {?} */ routeRoot = _router.routerState.snapshot.root;
this._resolveCrumbs(routeRoot).pipe(flatMap((crumbs) => crumbs), distinct((crumb) => crumb.text), toArray(), flatMap((crumbs) => {
if (this._config.postProcess) {
const /** @type {?} */ postProcessedCrumb = this._config.postProcess(crumbs);
return BreadcrumbsUtils.wrapIntoObservable(postProcessedCrumb).pipe(first());
}
else {
return of(crumbs);
}
}))
.subscribe((crumbs) => {
this._breadcrumbs.next(crumbs);
});
});
}
/**
* @return {?}
*/
get crumbs$() {
return this._breadcrumbs;
}
/**
* @return {?}
*/
getCrumbs() {
return this.crumbs$;
}
/**
* @param {?} route
* @return {?}
*/
_resolveCrumbs(route) {
let /** @type {?} */ crumbs$;
const /** @type {?} */ data = route.routeConfig && route.routeConfig.data;
if (data && data["breadcrumbs"]) {
let /** @type {?} */ resolver;
if (data["breadcrumbs"].prototype instanceof BreadcrumbsResolver) {
resolver = this._injector.get(data["breadcrumbs"]);
}
else {
resolver = this._defaultResolver;
}
const /** @type {?} */ result = resolver.resolve(route, this._router.routerState.snapshot);
crumbs$ = BreadcrumbsUtils.wrapIntoObservable(result).pipe(first());
}
else {
crumbs$ = of([]);
}
if (route.firstChild) {
crumbs$ = concat(crumbs$, this._resolveCrumbs(route.firstChild));
}
return crumbs$;
}
}
BreadcrumbsService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
BreadcrumbsService.ctorParameters = () => [
{ type: Router },
{ type: ActivatedRoute },
{ type: BreadcrumbsConfig },
{ type: Injector }
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class BreadcrumbsComponent {
/**
* @param {?} breadcrumbsService
*/
constructor(breadcrumbsService) {
this.breadcrumbsService = breadcrumbsService;
this.crumbs$ = this.breadcrumbsService.getCrumbs();
}
}
BreadcrumbsComponent.decorators = [
{ type: Component, args: [{
selector: 'lib-breadcrumbs',
template: `
<ol *ngIf="crumbs$ | async as crumbs" class="breadcrumbs__container">
<li *ngFor="let crumb of crumbs; let last = last"
[ngClass]="{ 'breadcrumbs__item--active': last }"
class="breadcrumbs__item"
>
<a *ngIf="!last" [routerLink]="crumb.path">{{ crumb.text }}</a>
<span *ngIf="last">{{ crumb.text }}</span>
</li>
</ol>
`
},] },
];
/** @nocollapse */
BreadcrumbsComponent.ctorParameters = () => [
{ type: BreadcrumbsService }
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class BreadcrumbsModule {
/**
* @return {?}
*/
static forRoot() {
return {
ngModule: BreadcrumbsModule,
providers: [
BreadcrumbsConfig,
BreadcrumbsService
]
};
}
/**
* @return {?}
*/
static forChild() {
return {
ngModule: BreadcrumbsModule
};
}
}
BreadcrumbsModule.decorators = [
{ type: NgModule, args: [{
imports: [
CommonModule,
RouterModule
],
declarations: [BreadcrumbsComponent],
exports: [BreadcrumbsComponent]
},] },
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
export { BreadcrumbsModule, BreadcrumbsComponent, BreadcrumbsService, BreadcrumbsConfig, BreadcrumbsResolver };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbGlmLW5neC1icmVhZGNydW1icy5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vQGV4YWxpZi9uZ3gtYnJlYWRjcnVtYnMvbGliL3NlcnZpY2VzL2JyZWFkY3J1bWJzLmNvbmZpZy50cyIsIm5nOi8vQGV4YWxpZi9uZ3gtYnJlYWRjcnVtYnMvbGliL3V0aWxzL2JyZWFkY3J1bWJzLnV0aWxzLnRzIiwibmc6Ly9AZXhhbGlmL25neC1icmVhZGNydW1icy9saWIvc2VydmljZXMvYnJlYWRjcnVtYnMucmVzb2x2ZXIudHMiLCJuZzovL0BleGFsaWYvbmd4LWJyZWFkY3J1bWJzL2xpYi9zZXJ2aWNlcy9icmVhZGNydW1icy5zZXJ2aWNlLnRzIiwibmc6Ly9AZXhhbGlmL25neC1icmVhZGNydW1icy9saWIvY29tcG9uZW50L2JyZWFkY3J1bWJzLmNvbXBvbmVudC50cyIsIm5nOi8vQGV4YWxpZi9uZ3gtYnJlYWRjcnVtYnMvbGliL2JyZWFkY3J1bWJzLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQnJlYWRjcnVtYiB9IGZyb20gJy4uL21vZGVscy9icmVhZGNydW1iJztcblxuZXhwb3J0IHR5cGUgUG9zdFByb2Nlc3NGdW5jdGlvbiA9XG4gIChjcnVtYnM6IEJyZWFkY3J1bWJbXSkgPT4gUHJvbWlzZTxCcmVhZGNydW1iW10+IHwgT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+IHwgQnJlYWRjcnVtYltdO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQnJlYWRjcnVtYnNDb25maWcge1xuICBwb3N0UHJvY2VzczogUG9zdFByb2Nlc3NGdW5jdGlvbjtcbn1cbiIsImltcG9ydCB7IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIFJlc29sdmUsIFJvdXRlclN0YXRlU25hcHNob3QgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgZnJvbSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgKiBhcyB0ZW1wbGF0ZSBmcm9tICdsb2Rhc2gudGVtcGxhdGUnO1xuaW1wb3J0ICogYXMgdGVtcGxhdGVTZXR0aW5ncyBmcm9tICdsb2Rhc2gudGVtcGxhdGVzZXR0aW5ncyc7XG5cbmNvbnN0IF8gPSB7XG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZSxcbiAgdGVtcGxhdGVTZXR0aW5nczogdGVtcGxhdGVTZXR0aW5nc1xufTtcbl8udGVtcGxhdGVTZXR0aW5ncy5pbnRlcnBvbGF0ZSA9IC97eyhbXFxzXFxTXSs/KX19L2c7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCcmVhZGNydW1ic1V0aWxzIHtcbiAgcHVibGljIHN0YXRpYyBzdHJpbmdGb3JtYXQocmF3VGVtcGxhdGU6IHN0cmluZywgYmluZGluZzogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBjb21waWxlZCA9IF8udGVtcGxhdGUocmF3VGVtcGxhdGUpO1xuXG4gICAgcmV0dXJuIGNvbXBpbGVkKGJpbmRpbmcpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB3cmFwSW50b09ic2VydmFibGU8VD4odmFsdWU6IFQgfCBQcm9taXNlPFQ+IHwgT2JzZXJ2YWJsZTxUPik6IE9ic2VydmFibGU8VD4ge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1Byb21pc2UodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZnJvbShQcm9taXNlLnJlc29sdmUodmFsdWUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2YodmFsdWUgYXMgVCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBpc1Byb21pc2UodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZSAmJiAodHlwZW9mIHZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbicpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBSZXNvbHZlLCBSb3V0ZXJTdGF0ZVNuYXBzaG90LCBVcmxTZWdtZW50IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQnJlYWRjcnVtYiB9IGZyb20gJy4uL21vZGVscy9icmVhZGNydW1iJztcbmltcG9ydCB7IEJyZWFkY3J1bWJzVXRpbHMgfSBmcm9tICcuLi91dGlscy9icmVhZGNydW1icy51dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBCcmVhZGNydW1ic1Jlc29sdmVyIGltcGxlbWVudHMgUmVzb2x2ZTxCcmVhZGNydW1iW10+IHtcbiAgcHVibGljIHJlc29sdmUocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90KVxuICAgIDogT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+IHwgUHJvbWlzZTxCcmVhZGNydW1iW10+IHwgQnJlYWRjcnVtYltdIHtcblxuICAgIGNvbnN0IGRhdGEgPSByb3V0ZS5yb3V0ZUNvbmZpZy5kYXRhO1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLmdldEZ1bGxQYXRoKHJvdXRlKTtcblxuICAgIGxldCB0ZXh0ID0gdHlwZW9mIChkYXRhLmJyZWFkY3J1bWJzKSA9PT0gJ3N0cmluZycgPyBkYXRhLmJyZWFkY3J1bWJzIDogZGF0YS5icmVhZGNydW1icy50ZXh0IHx8IGRhdGEudGV4dCB8fCBwYXRoO1xuICAgIHRleHQgPSBCcmVhZGNydW1ic1V0aWxzLnN0cmluZ0Zvcm1hdCh0ZXh0LCByb3V0ZS5kYXRhKTtcblxuICAgIGNvbnN0IGNydW1iczogQnJlYWRjcnVtYltdID0gW3tcbiAgICAgIHRleHQsXG4gICAgICBwYXRoXG4gICAgfV07XG5cbiAgICByZXR1cm4gb2YoY3J1bWJzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGdWxsUGF0aChyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hGdWxsUGF0aChyb3V0ZS5wYXRoRnJvbVJvb3QpO1xuICB9XG5cbiAgcHJpdmF0ZSBmZXRjaEZ1bGxQYXRoKHJvdXRlczogQWN0aXZhdGVkUm91dGVTbmFwc2hvdFtdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcm91dGVzLnJlZHVjZSgocGF0aCwgcm91dGUpID0+IHBhdGggKz0gdGhpcy5mZXRjaFJlbGF0aXZlUGF0aChyb3V0ZS51cmwpLCAnJyk7XG4gIH1cblxuICBwcml2YXRlIGZldGNoUmVsYXRpdmVQYXRoKHVybFNlZ21lbnRzOiBVcmxTZWdtZW50W10pOiBzdHJpbmcge1xuICAgIHJldHVybiB1cmxTZWdtZW50cy5yZWR1Y2UoKHBhdGgsIHVybFNlZ21lbnQpID0+IHBhdGggKz0gJy8nICsgdXJsU2VnbWVudC5wYXRoLCAnJyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgTmF2aWdhdGlvbkVuZCwgUm91dGVyLCBSb3V0ZXJTdGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbiwgY29uY2F0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IGZpbHRlciwgZmxhdE1hcCwgZGlzdGluY3QsIHRvQXJyYXksIGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBCcmVhZGNydW1ic0NvbmZpZyB9IGZyb20gJy4vYnJlYWRjcnVtYnMuY29uZmlnJztcbmltcG9ydCB7IEJyZWFkY3J1bWJzUmVzb2x2ZXIgfSBmcm9tICcuL2JyZWFkY3J1bWJzLnJlc29sdmVyJztcbmltcG9ydCB7IEJyZWFkY3J1bWIgfSBmcm9tICcuLi9tb2RlbHMvYnJlYWRjcnVtYic7XG5pbXBvcnQgeyBCcmVhZGNydW1ic1V0aWxzIH0gZnJvbSAnLi4vdXRpbHMvYnJlYWRjcnVtYnMudXRpbHMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQnJlYWRjcnVtYnNTZXJ2aWNlIHtcblxuICBwcml2YXRlIF9icmVhZGNydW1icyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QnJlYWRjcnVtYltdPihbXSk7XG4gIHByaXZhdGUgX2RlZmF1bHRSZXNvbHZlciA9IG5ldyBCcmVhZGNydW1ic1Jlc29sdmVyKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIsXG4gICAgcHVibGljIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIF9jb25maWc6IEJyZWFkY3J1bWJzQ29uZmlnLFxuICAgIHByaXZhdGUgX2luamVjdG9yOiBJbmplY3RvclxuICApIHtcblxuICAgIHRoaXMuX3JvdXRlci5ldmVudHMucGlwZShmaWx0ZXIoKHgpID0+IHggaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSlcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKSA9PiB7XG4gICAgICAgIGNvbnN0IHJvdXRlUm9vdCA9IF9yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3Qucm9vdDtcblxuICAgICAgICB0aGlzLl9yZXNvbHZlQ3J1bWJzKHJvdXRlUm9vdCkucGlwZShcbiAgICAgICAgICBmbGF0TWFwKChjcnVtYnM6IEJyZWFkY3J1bWJbXSkgPT4gY3J1bWJzKSxcbiAgICAgICAgICBkaXN0aW5jdCgoY3J1bWI6IEJyZWFkY3J1bWIpID0+IGNydW1iLnRleHQpLFxuICAgICAgICAgIHRvQXJyYXkoKSxcbiAgICAgICAgICBmbGF0TWFwKChjcnVtYnM6IEJyZWFkY3J1bWJbXSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5wb3N0UHJvY2Vzcykge1xuICAgICAgICAgICAgICBjb25zdCBwb3N0UHJvY2Vzc2VkQ3J1bWIgPSB0aGlzLl9jb25maWcucG9zdFByb2Nlc3MoY3J1bWJzKTtcbiAgICAgICAgICAgICAgcmV0dXJuIEJyZWFkY3J1bWJzVXRpbHMud3JhcEludG9PYnNlcnZhYmxlPEJyZWFkY3J1bWJbXT4ocG9zdFByb2Nlc3NlZENydW1iKS5waXBlKFxuICAgICAgICAgICAgICAgIGZpcnN0KClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBvZihjcnVtYnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgICAuc3Vic2NyaWJlKChjcnVtYnM6IEJyZWFkY3J1bWJbXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fYnJlYWRjcnVtYnMubmV4dChjcnVtYnMpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBnZXQgY3J1bWJzJCgpOiBPYnNlcnZhYmxlPEJyZWFkY3J1bWJbXT4ge1xuICAgIHJldHVybiB0aGlzLl9icmVhZGNydW1icztcbiAgfVxuXG4gIHB1YmxpYyBnZXRDcnVtYnMoKTogT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+IHtcbiAgICByZXR1cm4gdGhpcy5jcnVtYnMkO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzb2x2ZUNydW1icyhyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdClcbiAgICA6IE9ic2VydmFibGU8QnJlYWRjcnVtYltdPiB7XG5cbiAgICBsZXQgY3J1bWJzJDogT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+O1xuXG4gICAgY29uc3QgZGF0YSA9IHJvdXRlLnJvdXRlQ29uZmlnICYmIHJvdXRlLnJvdXRlQ29uZmlnLmRhdGE7XG5cbiAgICBpZiAoZGF0YSAmJiBkYXRhLmJyZWFkY3J1bWJzKSB7XG4gICAgICBsZXQgcmVzb2x2ZXI6IEJyZWFkY3J1bWJzUmVzb2x2ZXI7XG5cbiAgICAgIGlmIChkYXRhLmJyZWFkY3J1bWJzLnByb3RvdHlwZSBpbnN0YW5jZW9mIEJyZWFkY3J1bWJzUmVzb2x2ZXIpIHtcbiAgICAgICAgcmVzb2x2ZXIgPSB0aGlzLl9pbmplY3Rvci5nZXQoZGF0YS5icmVhZGNydW1icyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlciA9IHRoaXMuX2RlZmF1bHRSZXNvbHZlcjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzb2x2ZXIucmVzb2x2ZShyb3V0ZSwgdGhpcy5fcm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90KTtcbiAgICAgIGNydW1icyQgPSBCcmVhZGNydW1ic1V0aWxzLndyYXBJbnRvT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+KHJlc3VsdCkucGlwZShcbiAgICAgICAgZmlyc3QoKVxuICAgICAgKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBjcnVtYnMkID0gb2YoW10pO1xuICAgIH1cblxuICAgIGlmIChyb3V0ZS5maXJzdENoaWxkKSB7XG4gICAgICBjcnVtYnMkID0gY29uY2F0KGNydW1icyQsIHRoaXMuX3Jlc29sdmVDcnVtYnMocm91dGUuZmlyc3RDaGlsZCkpO1xuICAgIH1cblxuICAgIHJldHVybiBjcnVtYnMkO1xuICB9XG59XG4iLCJcbmltcG9ydCB7IENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEJyZWFkY3J1bWJzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2JyZWFkY3J1bWJzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQnJlYWRjcnVtYiB9IGZyb20gJy4uL21vZGVscy9icmVhZGNydW1iJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWJyZWFkY3J1bWJzJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8b2wgKm5nSWY9XCJjcnVtYnMkIHwgYXN5bmMgYXMgY3J1bWJzXCIgY2xhc3M9XCJicmVhZGNydW1ic19fY29udGFpbmVyXCI+XG4gICAgICA8bGkgKm5nRm9yPVwibGV0IGNydW1iIG9mIGNydW1iczsgbGV0IGxhc3QgPSBsYXN0XCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyAnYnJlYWRjcnVtYnNfX2l0ZW0tLWFjdGl2ZSc6IGxhc3QgfVwiXG4gICAgICAgIGNsYXNzPVwiYnJlYWRjcnVtYnNfX2l0ZW1cIlxuICAgICAgPlxuICAgICAgICA8YSAqbmdJZj1cIiFsYXN0XCIgW3JvdXRlckxpbmtdPVwiY3J1bWIucGF0aFwiPnt7IGNydW1iLnRleHQgfX08L2E+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwibGFzdFwiPnt7IGNydW1iLnRleHQgfX08L3NwYW4+XG4gICAgICA8L2xpPlxuICAgIDwvb2w+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgQnJlYWRjcnVtYnNDb21wb25lbnQge1xuICBwdWJsaWMgY3J1bWJzJDogT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+ID0gdGhpcy5icmVhZGNydW1ic1NlcnZpY2UuZ2V0Q3J1bWJzKCk7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGJyZWFkY3J1bWJzU2VydmljZTogQnJlYWRjcnVtYnNTZXJ2aWNlKSB7IH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlLCBNb2R1bGVXaXRoUHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgUm91dGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgQnJlYWRjcnVtYnNDb25maWcgfSBmcm9tICcuL3NlcnZpY2VzL2JyZWFkY3J1bWJzLmNvbmZpZyc7XG5pbXBvcnQgeyBCcmVhZGNydW1ic1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2JyZWFkY3J1bWJzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQnJlYWRjcnVtYnNDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudC9icmVhZGNydW1icy5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJvdXRlck1vZHVsZVxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtCcmVhZGNydW1ic0NvbXBvbmVudF0sXG4gIGV4cG9ydHM6IFtCcmVhZGNydW1ic0NvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgQnJlYWRjcnVtYnNNb2R1bGUge1xuICBwdWJsaWMgc3RhdGljIGZvclJvb3QoKTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBCcmVhZGNydW1ic01vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICBCcmVhZGNydW1ic0NvbmZpZyxcbiAgICAgICAgQnJlYWRjcnVtYnNTZXJ2aWNlXG4gICAgICBdXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZm9yQ2hpbGQoKTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBCcmVhZGNydW1ic01vZHVsZVxuICAgIH07XG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTs7O1lBU0MsVUFBVTs7Ozs7OztBQ1BYLEFBS0EsdUJBQU0sQ0FBQyxHQUFHO0lBQ1IsUUFBUSxFQUFFLFFBQVE7SUFDbEIsZ0JBQWdCLEVBQUUsZ0JBQWdCO0NBQ25DLENBQUM7QUFDRixDQUFDLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxHQUFHLGlCQUFpQixDQUFDOzs7O0FBRW5EOzs7Ozs7SUFDUyxPQUFPLFlBQVksQ0FBQyxXQUFtQixFQUFFLE9BQVk7UUFDMUQsdUJBQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxD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