UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

104 lines 14.5 kB
import { Injectable, InjectionToken, Injector } from '@angular/core'; import { Router } from '@angular/router'; import { distinctUntilChanged, map, shareReplay } from 'rxjs/operators'; import { fromTriggerOnce, hookGeneric, getInjectedHooks, sortByPriority, stateToFactory, ExtensionPointForPlugins } from '../common/extension-hooks'; import { PluginsResolveService } from '../plugins/plugins-resolve.service'; import { NavigatorNodeRoot } from './navigator-node-root'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; import * as i2 from "../plugins/plugins-resolve.service"; /** * A hook to use for Multi Provider extension. * @deprecated Consider using the `hookNavigator` function instead. */ export const HOOK_NAVIGATOR_NODES = new InjectionToken('HOOK_NAVIGATOR_NODES'); /** * You can either provide a single `NavigatorNode` or `NavigatorNodeData` as parameter: * ```typescript * hookNavigator(...) * ``` * * Or an array to directly register multiple: * ```typescript * hookNavigator([...]) * ``` * * Or you provide an Service that implements `ExtensionFactory<NavigatorNode | NavigatorNodeData>` * ```typescript * export class MyNavigatorFactory implements ExtensionFactory<NavigatorNode | NavigatorNodeData> {...} * ... * hookNavigator(MyNavigatorFactory) * ``` * A typed alternative to `HOOK_NAVIGATOR_NODES`. * @param nodes The `NavigatorNode`'s, `NavigatorNodeData`'s or `ExtensionFactory` to be provided. * @returns An `Provider` to be provided in your module. */ export function hookNavigator(nodes, options) { return hookGeneric(nodes, HOOK_NAVIGATOR_NODES, options); } /** * A service which defines the navigator. */ export class NavigatorService extends ExtensionPointForPlugins { constructor(rootInjector, router, plugins) { super(rootInjector, plugins); this.router = router; /** * Indicates whether the menu entry associated with the given URL should be expanded. */ this.firstUrl = true; this.items$ = this.setupItemsObservable(); this.hasItemsInNavigator$ = this.items$.pipe(map(({ length }) => !!length), distinctUntilChanged()); } /** * Returns the current state. * @readonly * @returns The current set of actions. */ get state() { return this.state$.value; } /** * Adds a new node to the navigator. * @param {NavigatorNode} node Navigator node to add. */ add(node) { this.state.add(node); this.emitNewState(); } /** * Removes a node from the navigator. * @param {NavigatorNode} node Navigator node to remove. */ remove(node) { this.state.delete(node); this.emitNewState(); } setupItemsObservable() { const rootNode = new NavigatorNodeRoot(); return fromTriggerOnce(this.router, this.refresh$, [ getInjectedHooks(HOOK_NAVIGATOR_NODES, this.injectors), () => this.factories, stateToFactory(this.state$) ]).pipe(distinctUntilChanged(), map((nodes) => { const noParent = nodes.filter(node => !node.parent); const withParent = nodes.filter(node => node.parent); // Based on the sortedNodes array, the nodes are sequentially created. // Nodes sorting is done in two steps to have the top-level nodes first. // This way, by the time we are adding a child node, the parent node is already present. const sortedNodes = sortByPriority(noParent).concat(sortByPriority(withParent)); rootNode.empty(); sortedNodes.forEach(node => rootNode.addRoot(node)); return rootNode.children; }), shareReplay(1)); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NavigatorService, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i2.PluginsResolveService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NavigatorService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NavigatorService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.Router }, { type: i2.PluginsResolveService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL25hdmlnYXRvci9uYXZpZ2F0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEUsT0FBTyxFQUVMLGVBQWUsRUFFZixXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZCxjQUFjLEVBQ2Qsd0JBQXdCLEVBRXpCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFHM0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7QUFzQjFEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLElBQUksY0FBYyxDQUNwRCxzQkFBc0IsQ0FDdkIsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQzNCLEtBQXlELEVBQ3pELE9BQXFDO0lBRXJDLE9BQU8sV0FBVyxDQUFvQyxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDOUYsQ0FBQztBQUVEOztHQUVHO0FBSUgsTUFBTSxPQUFPLGdCQUFpQixTQUFRLHdCQUF1QztJQU8zRSxZQUNFLFlBQXNCLEVBQ2QsTUFBYyxFQUN0QixPQUE4QjtRQUU5QixLQUFLLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBSHJCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFSeEI7O1dBRUc7UUFDSCxhQUFRLEdBQUcsSUFBSSxDQUFDO1FBU2QsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQzFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFDN0Isb0JBQW9CLEVBQUUsQ0FDdkIsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsR0FBRyxDQUFDLElBQW1CO1FBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLElBQW1CO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRVMsb0JBQW9CO1FBQzVCLE1BQU0sUUFBUSxHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUN6QyxPQUFPLGVBQWUsQ0FBcUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3JFLGdCQUFnQixDQUFnQixvQkFBb0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ3JFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQ3BCLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQzVCLENBQUMsQ0FBQyxJQUFJLENBQ0wsb0JBQW9CLEVBQUUsRUFDdEIsR0FBRyxDQUFDLENBQUMsS0FBbUMsRUFBRSxFQUFFO1lBQzFDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXJELHNFQUFzRTtZQUN0RSx3RUFBd0U7WUFDeEUsd0ZBQXdGO1lBQ3hGLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDaEYsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pCLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDcEQsT0FBTyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQzNCLENBQUMsQ0FBQyxFQUNGLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FDZixDQUFDO0lBQ0osQ0FBQzsrR0FyRVUsZ0JBQWdCO21IQUFoQixnQkFBZ0IsY0FGZixNQUFNOzs0RkFFUCxnQkFBZ0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBFeHRlbnNpb25GYWN0b3J5LFxuICBmcm9tVHJpZ2dlck9uY2UsXG4gIEdlbmVyaWNIb29rVHlwZSxcbiAgaG9va0dlbmVyaWMsXG4gIGdldEluamVjdGVkSG9va3MsXG4gIHNvcnRCeVByaW9yaXR5LFxuICBzdGF0ZVRvRmFjdG9yeSxcbiAgRXh0ZW5zaW9uUG9pbnRGb3JQbHVnaW5zLFxuICBHZW5lcmljSG9va09wdGlvbnNcbn0gZnJvbSAnLi4vY29tbW9uL2V4dGVuc2lvbi1ob29rcyc7XG5pbXBvcnQgeyBQbHVnaW5zUmVzb2x2ZVNlcnZpY2UgfSBmcm9tICcuLi9wbHVnaW5zL3BsdWdpbnMtcmVzb2x2ZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5hdmlnYXRvck5vZGUgfSBmcm9tICcuL25hdmlnYXRvci1ub2RlJztcbmltcG9ydCB7IE5hdmlnYXRvck5vZGVEYXRhIH0gZnJvbSAnLi9uYXZpZ2F0b3Itbm9kZS1kYXRhJztcbmltcG9ydCB7IE5hdmlnYXRvck5vZGVSb290IH0gZnJvbSAnLi9uYXZpZ2F0b3Itbm9kZS1yb290JztcblxuLyoqXG4gKiBBbiBleHRlbnNpb24gSE9PSyBjYW4gdXNlIGVpdGhlciBhIHB1cmUgdmFsdWU6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAgeyBwcm92aWRlOiBIT09LX1gsIHVzZVZhbHVlOiB7IC4uLmhvb2tWYWx1ZSB9LCBtdWx0aTogdHJ1ZSB9XG4gKiBgYGBcbiAqXG4gKiBPciBhbiBhcnJheSB0byBkaXJlY3RseSByZWdpc3RlciBtdWx0aXBsZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqICB7IHByb3ZpZGU6IEhPT0tfWCwgdXNlVmFsdWU6IFt7IC4uLmhvb2tWYWx1ZXMgfV0sIG11bHRpOiB0cnVlIH1cbiAqIGBgYFxuICpcbiAqIE9yIGFuIEV4dGVuc2lvbkZhY3Rvcnkgd2hpY2ggYWxsb3dzIHRvIGRlZmluZSBhIGdldCgpIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uXG4gKiBnZXRzIGNhbGxlZCBvbiBlYWNoIG5hdmlnYXRpb24gd2l0aCB0aGUgY3VycmVudCByb3V0ZSBhbmQgY2FuIHJldHVybiB2YWx1ZXNcbiAqIGFzeW5jIChvYnNlcnZhYmxlIG9yIHByb21pc2UpLlxuICogYGBgdHlwZXNjcmlwdFxuICogIHsgcHJvdmlkZTogSE9PS19YLCB1c2VGYWN0b3J5OiB7IGdldDogKHJvdXRlKSA9PiBkb1NvbWV0aGluZ0FzeW5jKHJvdXRlKSB9LCBtdWx0aTogdHJ1ZSB9XG4gKiBgYGBcbiAqL1xudHlwZSBOYXZpZ2F0b3JFeHRlbnNpb24gPSBOYXZpZ2F0b3JOb2RlIHwgTmF2aWdhdG9yTm9kZVtdIHwgRXh0ZW5zaW9uRmFjdG9yeTxOYXZpZ2F0b3JOb2RlPjtcblxuLyoqXG4gKiBBIGhvb2sgdG8gdXNlIGZvciBNdWx0aSBQcm92aWRlciBleHRlbnNpb24uXG4gKiBAZGVwcmVjYXRlZCBDb25zaWRlciB1c2luZyB0aGUgYGhvb2tOYXZpZ2F0b3JgIGZ1bmN0aW9uIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBIT09LX05BVklHQVRPUl9OT0RFUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxOYXZpZ2F0b3JFeHRlbnNpb25bXT4oXG4gICdIT09LX05BVklHQVRPUl9OT0RFUydcbik7XG5cbi8qKlxuICogWW91IGNhbiBlaXRoZXIgcHJvdmlkZSBhIHNpbmdsZSBgTmF2aWdhdG9yTm9kZWAgb3IgYE5hdmlnYXRvck5vZGVEYXRhYCBhcyBwYXJhbWV0ZXI6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAgaG9va05hdmlnYXRvciguLi4pXG4gKiBgYGBcbiAqXG4gKiBPciBhbiBhcnJheSB0byBkaXJlY3RseSByZWdpc3RlciBtdWx0aXBsZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqICBob29rTmF2aWdhdG9yKFsuLi5dKVxuICogYGBgXG4gKlxuICogT3IgeW91IHByb3ZpZGUgYW4gU2VydmljZSB0aGF0IGltcGxlbWVudHMgYEV4dGVuc2lvbkZhY3Rvcnk8TmF2aWdhdG9yTm9kZSB8IE5hdmlnYXRvck5vZGVEYXRhPmBcbiAqIGBgYHR5cGVzY3JpcHRcbiAqICBleHBvcnQgY2xhc3MgTXlOYXZpZ2F0b3JGYWN0b3J5IGltcGxlbWVudHMgRXh0ZW5zaW9uRmFjdG9yeTxOYXZpZ2F0b3JOb2RlIHwgTmF2aWdhdG9yTm9kZURhdGE+IHsuLi59XG4gKiAgLi4uXG4gKiAgaG9va05hdmlnYXRvcihNeU5hdmlnYXRvckZhY3RvcnkpXG4gKiBgYGBcbiAqIEEgdHlwZWQgYWx0ZXJuYXRpdmUgdG8gYEhPT0tfTkFWSUdBVE9SX05PREVTYC5cbiAqIEBwYXJhbSBub2RlcyBUaGUgYE5hdmlnYXRvck5vZGVgJ3MsIGBOYXZpZ2F0b3JOb2RlRGF0YWAncyBvciBgRXh0ZW5zaW9uRmFjdG9yeWAgdG8gYmUgcHJvdmlkZWQuXG4gKiBAcmV0dXJucyBBbiBgUHJvdmlkZXJgIHRvIGJlIHByb3ZpZGVkIGluIHlvdXIgbW9kdWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaG9va05hdmlnYXRvcihcbiAgbm9kZXM6IEdlbmVyaWNIb29rVHlwZTxOYXZpZ2F0b3JOb2RlIHwgTmF2aWdhdG9yTm9kZURhdGE+LFxuICBvcHRpb25zPzogUGFydGlhbDxHZW5lcmljSG9va09wdGlvbnM+XG4pIHtcbiAgcmV0dXJuIGhvb2tHZW5lcmljPE5hdmlnYXRvck5vZGUgfCBOYXZpZ2F0b3JOb2RlRGF0YT4obm9kZXMsIEhPT0tfTkFWSUdBVE9SX05PREVTLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBBIHNlcnZpY2Ugd2hpY2ggZGVmaW5lcyB0aGUgbmF2aWdhdG9yLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBOYXZpZ2F0b3JTZXJ2aWNlIGV4dGVuZHMgRXh0ZW5zaW9uUG9pbnRGb3JQbHVnaW5zPE5hdmlnYXRvck5vZGU+IHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBtZW51IGVudHJ5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gVVJMIHNob3VsZCBiZSBleHBhbmRlZC5cbiAgICovXG4gIGZpcnN0VXJsID0gdHJ1ZTtcbiAgaGFzSXRlbXNJbk5hdmlnYXRvciQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcm9vdEluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHBsdWdpbnM6IFBsdWdpbnNSZXNvbHZlU2VydmljZVxuICApIHtcbiAgICBzdXBlcihyb290SW5qZWN0b3IsIHBsdWdpbnMpO1xuICAgIHRoaXMuaXRlbXMkID0gdGhpcy5zZXR1cEl0ZW1zT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMuaGFzSXRlbXNJbk5hdmlnYXRvciQgPSB0aGlzLml0ZW1zJC5waXBlKFxuICAgICAgbWFwKCh7IGxlbmd0aCB9KSA9PiAhIWxlbmd0aCksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlLlxuICAgKiBAcmVhZG9ubHlcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgc2V0IG9mIGFjdGlvbnMuXG4gICAqL1xuICBnZXQgc3RhdGUoKTogU2V0PE5hdmlnYXRvck5vZGU+IHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZSQudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5ldyBub2RlIHRvIHRoZSBuYXZpZ2F0b3IuXG4gICAqIEBwYXJhbSB7TmF2aWdhdG9yTm9kZX0gbm9kZSBOYXZpZ2F0b3Igbm9kZSB0byBhZGQuXG4gICAqL1xuICBhZGQobm9kZTogTmF2aWdhdG9yTm9kZSkge1xuICAgIHRoaXMuc3RhdGUuYWRkKG5vZGUpO1xuICAgIHRoaXMuZW1pdE5ld1N0YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIG5vZGUgZnJvbSB0aGUgbmF2aWdhdG9yLlxuICAgKiBAcGFyYW0ge05hdmlnYXRvck5vZGV9IG5vZGUgTmF2aWdhdG9yIG5vZGUgdG8gcmVtb3ZlLlxuICAgKi9cbiAgcmVtb3ZlKG5vZGU6IE5hdmlnYXRvck5vZGUpIHtcbiAgICB0aGlzLnN0YXRlLmRlbGV0ZShub2RlKTtcbiAgICB0aGlzLmVtaXROZXdTdGF0ZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldHVwSXRlbXNPYnNlcnZhYmxlKCk6IE9ic2VydmFibGU8TmF2aWdhdG9yTm9kZVtdPiB7XG4gICAgY29uc3Qgcm9vdE5vZGUgPSBuZXcgTmF2aWdhdG9yTm9kZVJvb3QoKTtcbiAgICByZXR1cm4gZnJvbVRyaWdnZXJPbmNlPE5hdmlnYXRvckV4dGVuc2lvbj4odGhpcy5yb3V0ZXIsIHRoaXMucmVmcmVzaCQsIFtcbiAgICAgIGdldEluamVjdGVkSG9va3M8TmF2aWdhdG9yTm9kZT4oSE9PS19OQVZJR0FUT1JfTk9ERVMsIHRoaXMuaW5qZWN0b3JzKSxcbiAgICAgICgpID0+IHRoaXMuZmFjdG9yaWVzLFxuICAgICAgc3RhdGVUb0ZhY3RvcnkodGhpcy5zdGF0ZSQpXG4gICAgXSkucGlwZShcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICBtYXAoKG5vZGVzOiBQYXJ0aWFsPE5hdmlnYXRvck5vZGVEYXRhW10+KSA9PiB7XG4gICAgICAgIGNvbnN0IG5vUGFyZW50ID0gbm9kZXMuZmlsdGVyKG5vZGUgPT4gIW5vZGUucGFyZW50KTtcbiAgICAgICAgY29uc3Qgd2l0aFBhcmVudCA9IG5vZGVzLmZpbHRlcihub2RlID0+IG5vZGUucGFyZW50KTtcblxuICAgICAgICAvLyBCYXNlZCBvbiB0aGUgc29ydGVkTm9kZXMgYXJyYXksIHRoZSBub2RlcyBhcmUgc2VxdWVudGlhbGx5IGNyZWF0ZWQuXG4gICAgICAgIC8vIE5vZGVzIHNvcnRpbmcgaXMgZG9uZSBpbiB0d28gc3RlcHMgdG8gaGF2ZSB0aGUgdG9wLWxldmVsIG5vZGVzIGZpcnN0LlxuICAgICAgICAvLyBUaGlzIHdheSwgYnkgdGhlIHRpbWUgd2UgYXJlIGFkZGluZyBhIGNoaWxkIG5vZGUsIHRoZSBwYXJlbnQgbm9kZSBpcyBhbHJlYWR5IHByZXNlbnQuXG4gICAgICAgIGNvbnN0IHNvcnRlZE5vZGVzID0gc29ydEJ5UHJpb3JpdHkobm9QYXJlbnQpLmNvbmNhdChzb3J0QnlQcmlvcml0eSh3aXRoUGFyZW50KSk7XG4gICAgICAgIHJvb3ROb2RlLmVtcHR5KCk7XG4gICAgICAgIHNvcnRlZE5vZGVzLmZvckVhY2gobm9kZSA9PiByb290Tm9kZS5hZGRSb290KG5vZGUpKTtcbiAgICAgICAgcmV0dXJuIHJvb3ROb2RlLmNoaWxkcmVuO1xuICAgICAgfSksXG4gICAgICBzaGFyZVJlcGxheSgxKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==