UNPKG

theme-lib

Version:

This is a simple example Angular Library published to npm.

748 lines 46.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; /* * @license * Copyright Akveo. All Rights Reserved. * Licensed under the MIT License. See License.txt in the project root for license information. */ import { Injectable } from '@angular/core'; import { Location } from '@angular/common'; import { BehaviorSubject, ReplaySubject, Subject } from 'rxjs'; import { share } from 'rxjs/operators'; import { isUrlPathContain, isUrlPathEqual } from './url-matching-helpers'; /** * @record */ export function NbMenuBag() { } if (false) { /** @type {?} */ NbMenuBag.prototype.tag; /** @type {?} */ NbMenuBag.prototype.item; } /** @type {?} */ var itemClick$ = new Subject(); /** @type {?} */ var addItems$ = new ReplaySubject(1); /** @type {?} */ var navigateHome$ = new ReplaySubject(1); /** @type {?} */ var getSelectedItem$ = new ReplaySubject(1); /** @type {?} */ var itemSelect$ = new ReplaySubject(1); /** @type {?} */ var itemHover$ = new ReplaySubject(1); /** @type {?} */ var submenuToggle$ = new ReplaySubject(1); /** @type {?} */ var collapseAll$ = new ReplaySubject(1); // TODO: check if we need both URL and LINK /* * Menu Item options */ var // TODO: check if we need both URL and LINK /* * Menu Item options */ NbMenuItem = /** @class */ (function () { function NbMenuItem() { /* * Item is selected when partly or fully equal to the current url * @type {string} */ this.pathMatch = 'full'; } /* * @returns item parents in top-down order */ /* * @returns item parents in top-down order */ /** * @param {?} item * @return {?} */ NbMenuItem.getParents = /* * @returns item parents in top-down order */ /** * @param {?} item * @return {?} */ function (item) { /** @type {?} */ var parents = []; /** @type {?} */ var parent = item.parent; while (parent) { parents.unshift(parent); parent = parent.parent; } return parents; }; /** * @param {?} item * @param {?} possibleChild * @return {?} */ NbMenuItem.isParent = /** * @param {?} item * @param {?} possibleChild * @return {?} */ function (item, possibleChild) { return possibleChild.parent ? possibleChild.parent === item || this.isParent(item, possibleChild.parent) : false; }; return NbMenuItem; }()); // TODO: check if we need both URL and LINK /* * Menu Item options */ export { NbMenuItem }; if (false) { /** @type {?} */ NbMenuItem.prototype.title; /** @type {?} */ NbMenuItem.prototype.link; /** @type {?} */ NbMenuItem.prototype.url; /** @type {?} */ NbMenuItem.prototype.icon; /** @type {?} */ NbMenuItem.prototype.expanded; /** @type {?} */ NbMenuItem.prototype.children; /** @type {?} */ NbMenuItem.prototype.target; /** @type {?} */ NbMenuItem.prototype.hidden; /** @type {?} */ NbMenuItem.prototype.pathMatch; /** @type {?} */ NbMenuItem.prototype.home; /** @type {?} */ NbMenuItem.prototype.group; /** @type {?} */ NbMenuItem.prototype.queryParams; /** @type {?} */ NbMenuItem.prototype.parent; /** @type {?} */ NbMenuItem.prototype.selected; /** @type {?} */ NbMenuItem.prototype.data; /** @type {?} */ NbMenuItem.prototype.fragment; } // TODO: map select events to router change events // TODO: review the interface /* * Menu Service. Allows you to listen to menu events, or to interact with a menu. */ var NbMenuService = /** @class */ (function () { function NbMenuService() { } /* * Add items to the end of the menu items list * @param {List<NbMenuItem>} items * @param {string} tag */ /* * Add items to the end of the menu items list * @param {List<NbMenuItem>} items * @param {string} tag */ /** * @param {?} items * @param {?=} tag * @return {?} */ NbMenuService.prototype.addItems = /* * Add items to the end of the menu items list * @param {List<NbMenuItem>} items * @param {string} tag */ /** * @param {?} items * @param {?=} tag * @return {?} */ function (items, tag) { addItems$.next({ tag: tag, items: items }); }; /* * Collapses all menu items * @param {string} tag */ /* * Collapses all menu items * @param {string} tag */ /** * @param {?=} tag * @return {?} */ NbMenuService.prototype.collapseAll = /* * Collapses all menu items * @param {string} tag */ /** * @param {?=} tag * @return {?} */ function (tag) { collapseAll$.next({ tag: tag }); }; /* * Navigate to the home menu item * @param {string} tag */ /* * Navigate to the home menu item * @param {string} tag */ /** * @param {?=} tag * @return {?} */ NbMenuService.prototype.navigateHome = /* * Navigate to the home menu item * @param {string} tag */ /** * @param {?=} tag * @return {?} */ function (tag) { navigateHome$.next({ tag: tag }); }; /* * Returns currently selected item. Won't subscribe to the future events. * @param {string} tag * @returns {Observable<{tag: string; item: NbMenuItem}>} */ /* * Returns currently selected item. Won't subscribe to the future events. * @param {string} tag * @returns {Observable<{tag: string; item: NbMenuItem}>} */ /** * @param {?=} tag * @return {?} */ NbMenuService.prototype.getSelectedItem = /* * Returns currently selected item. Won't subscribe to the future events. * @param {string} tag * @returns {Observable<{tag: string; item: NbMenuItem}>} */ /** * @param {?=} tag * @return {?} */ function (tag) { /** @type {?} */ var listener = new BehaviorSubject(null); getSelectedItem$.next({ tag: tag, listener: listener }); return listener.asObservable(); }; /** * @return {?} */ NbMenuService.prototype.onItemClick = /** * @return {?} */ function () { return itemClick$.pipe(share()); }; /** * @return {?} */ NbMenuService.prototype.onItemSelect = /** * @return {?} */ function () { return itemSelect$.pipe(share()); }; /** * @return {?} */ NbMenuService.prototype.onItemHover = /** * @return {?} */ function () { return itemHover$.pipe(share()); }; /** * @return {?} */ NbMenuService.prototype.onSubmenuToggle = /** * @return {?} */ function () { return submenuToggle$.pipe(share()); }; NbMenuService.decorators = [ { type: Injectable } ]; return NbMenuService; }()); export { NbMenuService }; var NbMenuInternalService = /** @class */ (function () { function NbMenuInternalService(location) { this.location = location; } /** * @param {?} items * @return {?} */ NbMenuInternalService.prototype.prepareItems = /** * @param {?} items * @return {?} */ function (items) { var _this = this; /** @type {?} */ var defaultItem = new NbMenuItem(); items.forEach(function (i) { _this.applyDefaults(i, defaultItem); _this.setParent(i); }); }; /** * @param {?} items * @param {?} tag * @param {?=} collapseOther * @return {?} */ NbMenuInternalService.prototype.selectFromUrl = /** * @param {?} items * @param {?} tag * @param {?=} collapseOther * @return {?} */ function (items, tag, collapseOther) { if (collapseOther === void 0) { collapseOther = false; } /** @type {?} */ var selectedItem = this.findItemByUrl(items); if (selectedItem) { this.selectItem(selectedItem, items, collapseOther, tag); } }; /** * @param {?} item * @param {?} items * @param {?=} collapseOther * @param {?=} tag * @return {?} */ NbMenuInternalService.prototype.selectItem = /** * @param {?} item * @param {?} items * @param {?=} collapseOther * @param {?=} tag * @return {?} */ function (item, items, collapseOther, tag) { if (collapseOther === void 0) { collapseOther = false; } var e_1, _a, e_2, _b; /** @type {?} */ var unselectedItems = this.resetSelection(items); /** @type {?} */ var collapsedItems = collapseOther ? this.collapseItems(items) : []; try { for (var _c = tslib_1.__values(NbMenuItem.getParents(item)), _d = _c.next(); !_d.done; _d = _c.next()) { var parent_1 = _d.value; parent_1.selected = true; // emit event only for items that weren't selected before ('unselectedItems' contains items that were selected) if (!unselectedItems.includes(parent_1)) { this.itemSelect(parent_1, tag); } /** @type {?} */ var wasNotExpanded = !parent_1.expanded; parent_1.expanded = true; /** @type {?} */ var i = collapsedItems.indexOf(parent_1); // emit event only for items that weren't expanded before. // 'collapsedItems' contains items that were expanded, so no need to emit event. // in case 'collapseOther' is false, 'collapsedItems' will be empty, // so also check if item isn't expanded already ('wasNotExpanded'). if (i === -1 && wasNotExpanded) { this.submenuToggle(parent_1, tag); } else { collapsedItems.splice(i, 1); } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_d && !_d.done && (_a = _c.return)) _a.call(_c); } finally { if (e_1) throw e_1.error; } } item.selected = true; // emit event only for items that weren't selected before ('unselectedItems' contains items that were selected) if (!unselectedItems.includes(item)) { this.itemSelect(item, tag); } try { // remaining items which wasn't expanded back after expanding all currently selected items for (var collapsedItems_1 = tslib_1.__values(collapsedItems), collapsedItems_1_1 = collapsedItems_1.next(); !collapsedItems_1_1.done; collapsedItems_1_1 = collapsedItems_1.next()) { var collapsedItem = collapsedItems_1_1.value; this.submenuToggle(collapsedItem, tag); } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (collapsedItems_1_1 && !collapsedItems_1_1.done && (_b = collapsedItems_1.return)) _b.call(collapsedItems_1); } finally { if (e_2) throw e_2.error; } } }; /** * @param {?} items * @param {?} tag * @param {?=} except * @return {?} */ NbMenuInternalService.prototype.collapseAll = /** * @param {?} items * @param {?} tag * @param {?=} except * @return {?} */ function (items, tag, except) { var e_3, _a; /** @type {?} */ var collapsedItems = this.collapseItems(items, except); try { for (var collapsedItems_2 = tslib_1.__values(collapsedItems), collapsedItems_2_1 = collapsedItems_2.next(); !collapsedItems_2_1.done; collapsedItems_2_1 = collapsedItems_2.next()) { var item = collapsedItems_2_1.value; this.submenuToggle(item, tag); } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (collapsedItems_2_1 && !collapsedItems_2_1.done && (_a = collapsedItems_2.return)) _a.call(collapsedItems_2); } finally { if (e_3) throw e_3.error; } } }; /** * @return {?} */ NbMenuInternalService.prototype.onAddItem = /** * @return {?} */ function () { return addItems$.pipe(share()); }; /** * @return {?} */ NbMenuInternalService.prototype.onNavigateHome = /** * @return {?} */ function () { return navigateHome$.pipe(share()); }; /** * @return {?} */ NbMenuInternalService.prototype.onCollapseAll = /** * @return {?} */ function () { return collapseAll$.pipe(share()); }; /** * @return {?} */ NbMenuInternalService.prototype.onGetSelectedItem = /** * @return {?} */ function () { return getSelectedItem$.pipe(share()); }; /** * @param {?} item * @param {?=} tag * @return {?} */ NbMenuInternalService.prototype.itemHover = /** * @param {?} item * @param {?=} tag * @return {?} */ function (item, tag) { itemHover$.next({ tag: tag, item: item }); }; /** * @param {?} item * @param {?=} tag * @return {?} */ NbMenuInternalService.prototype.submenuToggle = /** * @param {?} item * @param {?=} tag * @return {?} */ function (item, tag) { submenuToggle$.next({ tag: tag, item: item }); }; /** * @param {?} item * @param {?=} tag * @return {?} */ NbMenuInternalService.prototype.itemSelect = /** * @param {?} item * @param {?=} tag * @return {?} */ function (item, tag) { itemSelect$.next({ tag: tag, item: item }); }; /** * @param {?} item * @param {?=} tag * @return {?} */ NbMenuInternalService.prototype.itemClick = /** * @param {?} item * @param {?=} tag * @return {?} */ function (item, tag) { itemClick$.next({ tag: tag, item: item }); }; /* * Unselect all given items deeply. * @param items array of items to unselect. * @returns items which selected value was changed. */ /* * Unselect all given items deeply. * @param items array of items to unselect. * @returns items which selected value was changed. */ /** * @private * @param {?} items * @return {?} */ NbMenuInternalService.prototype.resetSelection = /* * Unselect all given items deeply. * @param items array of items to unselect. * @returns items which selected value was changed. */ /** * @private * @param {?} items * @return {?} */ function (items) { var e_4, _a; /** @type {?} */ var unselectedItems = []; try { for (var items_1 = tslib_1.__values(items), items_1_1 = items_1.next(); !items_1_1.done; items_1_1 = items_1.next()) { var item = items_1_1.value; if (item.selected) { unselectedItems.push(item); } item.selected = false; if (item.children) { unselectedItems.push.apply(unselectedItems, tslib_1.__spread(this.resetSelection(item.children))); } } } catch (e_4_1) { e_4 = { error: e_4_1 }; } finally { try { if (items_1_1 && !items_1_1.done && (_a = items_1.return)) _a.call(items_1); } finally { if (e_4) throw e_4.error; } } return unselectedItems; }; /* * Collapse all given items deeply. * @param items array of items to collapse. * @param except menu item which shouldn't be collapsed, also disables collapsing for parents of this item. * @returns items which expanded value was changed. */ /* * Collapse all given items deeply. * @param items array of items to collapse. * @param except menu item which shouldn't be collapsed, also disables collapsing for parents of this item. * @returns items which expanded value was changed. */ /** * @private * @param {?} items * @param {?=} except * @return {?} */ NbMenuInternalService.prototype.collapseItems = /* * Collapse all given items deeply. * @param items array of items to collapse. * @param except menu item which shouldn't be collapsed, also disables collapsing for parents of this item. * @returns items which expanded value was changed. */ /** * @private * @param {?} items * @param {?=} except * @return {?} */ function (items, except) { var e_5, _a; /** @type {?} */ var collapsedItems = []; try { for (var items_2 = tslib_1.__values(items), items_2_1 = items_2.next(); !items_2_1.done; items_2_1 = items_2.next()) { var item = items_2_1.value; if (except && (item === except || NbMenuItem.isParent(item, except))) { continue; } if (item.expanded) { collapsedItems.push(item); } item.expanded = false; if (item.children) { collapsedItems.push.apply(collapsedItems, tslib_1.__spread(this.collapseItems(item.children))); } } } catch (e_5_1) { e_5 = { error: e_5_1 }; } finally { try { if (items_2_1 && !items_2_1.done && (_a = items_2.return)) _a.call(items_2); } finally { if (e_5) throw e_5.error; } } return collapsedItems; }; /** * @private * @param {?} item * @param {?} defaultItem * @return {?} */ NbMenuInternalService.prototype.applyDefaults = /** * @private * @param {?} item * @param {?} defaultItem * @return {?} */ function (item, defaultItem) { var _this = this; /** @type {?} */ var menuItem = tslib_1.__assign({}, item); Object.assign(item, defaultItem, menuItem); item.children && item.children.forEach(function (child) { _this.applyDefaults(child, defaultItem); }); }; /** * @private * @param {?} item * @return {?} */ NbMenuInternalService.prototype.setParent = /** * @private * @param {?} item * @return {?} */ function (item) { var _this = this; item.children && item.children.forEach(function (child) { child.parent = item; _this.setParent(child); }); }; /* * Find deepest item which link matches current URL path. * @param items array of items to search in. * @returns found item of undefined. */ /* * Find deepest item which link matches current URL path. * @param items array of items to search in. * @returns found item of undefined. */ /** * @private * @param {?} items * @return {?} */ NbMenuInternalService.prototype.findItemByUrl = /* * Find deepest item which link matches current URL path. * @param items array of items to search in. * @returns found item of undefined. */ /** * @private * @param {?} items * @return {?} */ function (items) { var _this = this; /** @type {?} */ var selectedItem; items.some(function (item) { if (item.children) { selectedItem = _this.findItemByUrl(item.children); } if (!selectedItem && _this.isSelectedInUrl(item)) { selectedItem = item; } return selectedItem; }); return selectedItem; }; /** * @private * @param {?} item * @return {?} */ NbMenuInternalService.prototype.isSelectedInUrl = /** * @private * @param {?} item * @return {?} */ function (item) { /** @type {?} */ var exact = item.pathMatch === 'full'; return exact ? isUrlPathEqual(this.location.path(), item.link) : isUrlPathContain(this.location.path(), item.link); }; NbMenuInternalService.decorators = [ { type: Injectable } ]; /** @nocollapse */ NbMenuInternalService.ctorParameters = function () { return [ { type: Location } ]; }; return NbMenuInternalService; }()); export { NbMenuInternalService }; if (false) { /** * @type {?} * @private */ NbMenuInternalService.prototype.location; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vdGhlbWUtbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvbWVudS9tZW51LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQU1BLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNDLE9BQU8sRUFBYyxlQUFlLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7O0FBRTFFLCtCQUE0RDs7O0lBQS9CLHdCQUFZOztJQUFDLHlCQUFnQjs7O0lBRXBELFVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBYTs7SUFDckMsU0FBUyxHQUFHLElBQUksYUFBYSxDQUF1QyxDQUFDLENBQUM7O0lBQ3RFLGFBQWEsR0FBRyxJQUFJLGFBQWEsQ0FBa0IsQ0FBQyxDQUFDOztJQUNyRCxnQkFBZ0IsR0FDbEIsSUFBSSxhQUFhLENBQXdELENBQUMsQ0FBQzs7SUFDekUsV0FBVyxHQUFHLElBQUksYUFBYSxDQUFZLENBQUMsQ0FBQzs7SUFDN0MsVUFBVSxHQUFHLElBQUksYUFBYSxDQUFZLENBQUMsQ0FBQzs7SUFDNUMsY0FBYyxHQUFHLElBQUksYUFBYSxDQUFZLENBQUMsQ0FBQzs7SUFDaEQsWUFBWSxHQUFHLElBQUksYUFBYSxDQUFrQixDQUFDLENBQUM7Ozs7O0FBTTFEOzs7Ozs7SUFBQTs7Ozs7UUE2Q0UsY0FBUyxHQUFZLE1BQU0sQ0FBQztJQXdDOUIsQ0FBQztJQXBCQzs7T0FFRzs7Ozs7Ozs7SUFDSSxxQkFBVTs7Ozs7OztJQUFqQixVQUFrQixJQUFnQjs7WUFDMUIsT0FBTyxH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LENBQUM7YUFDckI7WUFFRCxPQUFPLFlBQVksQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7Ozs7OztJQUVPLCtDQUFlOzs7OztJQUF2QixVQUF3QixJQUFnQjs7WUFDaEMsS0FBSyxHQUFZLElBQUksQ0FBQyxTQUFTLEtBQUssTUFBTTtRQUNoRCxPQUFPLEtBQUs7WUFDVixDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNqRCxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEQsQ0FBQzs7Z0JBNUxGLFVBQVU7Ozs7Z0JBNUtGLFFBQVE7O0lBeVdqQiw0QkFBQztDQUFBLEFBN0xELElBNkxDO1NBNUxZLHFCQUFxQjs7Ozs7O0lBRXBCLHlDQUEwQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCBBa3Zlby4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuICovXHJcblxyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0LCBSZXBsYXlTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHNoYXJlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBpc1VybFBhdGhDb250YWluLCBpc1VybFBhdGhFcXVhbCB9IGZyb20gJy4vdXJsLW1hdGNoaW5nLWhlbHBlcnMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOYk1lbnVCYWcgeyB0YWc6IHN0cmluZzsgaXRlbTogTmJNZW51SXRlbSB9XHJcblxyXG5jb25zdCBpdGVtQ2xpY2skID0gbmV3IFN1YmplY3Q8TmJNZW51QmFnPigpO1xyXG5jb25zdCBhZGRJdGVtcyQgPSBuZXcgUmVwbGF5U3ViamVjdDx7IHRhZzogc3RyaW5nOyBpdGVtczogTmJNZW51SXRlbVtdIH0+KDEpO1xyXG5jb25zdCBuYXZpZ2F0ZUhvbWUkID0gbmV3IFJlcGxheVN1YmplY3Q8eyB0YWc6IHN0cmluZyB9PigxKTtcclxuY29uc3QgZ2V0U2VsZWN0ZWRJdGVtJFxyXG4gID0gbmV3IFJlcGxheVN1YmplY3Q8eyB0YWc6IHN0cmluZzsgbGlzdGVuZXI6IEJlaGF2aW9yU3ViamVjdDxOYk1lbnVCYWc+IH0+KDEpO1xyXG5jb25zdCBpdGVtU2VsZWN0JCA9IG5ldyBSZXBsYXlTdWJqZWN0PE5iTWVudUJhZz4oMSk7XHJcbmNvbnN0IGl0ZW1Ib3ZlciQgPSBuZXcgUmVwbGF5U3ViamVjdDxOYk1lbnVCYWc+KDEpO1xyXG5jb25zdCBzdWJtZW51VG9nZ2xlJCA9IG5ldyBSZXBsYXlTdWJqZWN0PE5iTWVudUJhZz4oMSk7XHJcbmNvbnN0IGNvbGxhcHNlQWxsJCA9IG5ldyBSZXBsYXlTdWJqZWN0PHsgdGFnOiBzdHJpbmcgfT4oMSk7XHJcblxyXG4vLyBUT0RPOiBjaGVjayBpZiB3ZSBuZWVkIGJvdGggVVJMIGFuZCBMSU5LXHJcbi8qXHJcbiAqIE1lbnUgSXRlbSBvcHRpb25zXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTmJNZW51SXRlbSB7XHJcbiAgLypcclxuICAgKiBJdGVtIFRpdGxlXHJcbiAgICogQHR5cGUge3N0cmluZ31cclxuICAgKi9cclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIC8qXHJcbiAgICogSXRlbSByZWxhdGl2ZSBsaW5rIChmb3Igcm91dGVyTGluaylcclxuICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAqL1xyXG4gIGxpbms/OiBzdHJpbmc7XHJcbiAgLypcclxuICAgKiBJdGVtIFVSTCAoYWJzb2x1dGUpXHJcbiAgICogQHR5cGUge3N0cmluZ31cclxuICAgKi9cclxuICB1cmw/OiBzdHJpbmc7XHJcbiAgLypcclxuICAgKiBJY29uIGNsYXNzIG5hbWVcclxuICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAqL1xyXG4gIGljb24/OiBzdHJpbmc7XHJcbiAgLypcclxuICAgKiBFeHBhbmRlZCBieSBkZWZhdWxcclxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgKi9cclxuICBleHBhbmRlZD86IGJvb2xlYW47XHJcbiAgLypcclxuICAgKiBDaGlsZHJlbiBpdGVtc1xyXG4gICAqIEB0eXBlIHtMaXN0PE5iTWVudUl0ZW0+fVxyXG4gICAqL1xyXG4gIGNoaWxkcmVuPzogTmJNZW51SXRlbVtdO1xyXG4gIC8qXHJcbiAgICogSFRNTCBMaW5rIHRhcmdldFxyXG4gICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICovXHJcbiAgdGFyZ2V0Pzogc3RyaW5nO1xyXG4gIC8qXHJcbiAgICogSGlkZGVuIEl0ZW1cclxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgKi9cclxuICBoaWRkZW4/OiBib29sZWFuO1xyXG4gIC8qXHJcbiAgICogSXRlbSBpcyBzZWxlY3RlZCB3aGVuIHBhcnRseSBvciBmdWxseSBlcXVhbCB0byB0aGUgY3VycmVudCB1cmxcclxuICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAqL1xyXG4gIHBhdGhNYXRjaD86IHN0cmluZyA9ICdmdWxsJztcclxuICAvKlxyXG4gICAqIFdoZXJlIHRoaXMgaXMgYSBob21lIGl0ZW1cclxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgKi9cclxuICBob21lPzogYm9vbGVhbjtcclxuICAvKlxyXG4gICAqIFdoZXRoZXIgdGhlIGl0ZW0gaXMganVzdCBhIGdyb3VwIChub24tY2xpY2thYmxlKVxyXG4gICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAqL1xyXG4gIGdyb3VwPzogYm9vbGVhbjtcclxuICAvKiBNYXAgb2YgcXVlcnkgcGFyYW1ldGVyc1xyXG4gICAqQHR5cGUge1BhcmFtc31cclxuICAgKi9cclxuICBxdWVyeVBhcmFtcz86IFBhcmFtcztcclxuICBwYXJlbnQ/OiBOYk1lbnVJdGVtO1xyXG4gIHNlbGVjdGVkPzogYm9vbGVhbjtcclxuICBkYXRhPzogYW55O1xyXG4gIGZyYWdtZW50Pzogc3RyaW5nO1xyXG5cclxuICAvKlxyXG4gICAqIEByZXR1cm5zIGl0ZW0gcGFyZW50cyBpbiB0b3AtZG93biBvcmRlclxyXG4gICAqL1xyXG4gIHN0YXRpYyBnZXRQYXJlbnRzKGl0ZW06IE5iTWVudUl0ZW0pOiBOYk1lbnVJdGVtW10ge1xyXG4gICAgY29uc3QgcGFyZW50cyA9IFtdO1xyXG5cclxuICAgIGxldCBwYXJlbnQgPSBpdGVtLnBhcmVudDtcclxuICAgIHdoaWxlIChwYXJlbnQpIHtcclxuICAgICAgcGFyZW50cy51bnNoaWZ0KHBhcmVudCk7XHJcbiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBhcmVudHM7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgaXNQYXJlbnQoaXRlbTogTmJNZW51SXRlbSwgcG9zc2libGVDaGlsZDogTmJNZW51SXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHBvc3NpYmxlQ2hpbGQucGFyZW50XHJcbiAgICAgID8gcG9zc2libGVDaGlsZC5wYXJlbnQgPT09IGl0ZW0gfHwgdGhpcy5pc1BhcmVudChpdGVtLCBwb3NzaWJsZUNoaWxkLnBhcmVudClcclxuICAgICAgOiBmYWxzZTtcclxuICB9XHJcbn1cclxuXHJcbi8vIFRPRE86IG1hcCBzZWxlY3QgZXZlbnRzIHRvIHJvdXRlciBjaGFuZ2UgZXZlbnRzXHJcbi8vIFRPRE86IHJldmlldyB0aGUgaW50ZXJmYWNlXHJcbi8qXHJcbiAqIE1lbnUgU2VydmljZS4gQWxsb3dzIHlvdSB0byBsaXN0ZW4gdG8gbWVudSBldmVudHMsIG9yIHRvIGludGVyYWN0IHdpdGggYSBtZW51LlxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTmJNZW51U2VydmljZSB7XHJcblxyXG4gIC8qXHJcbiAgICogQWRkIGl0ZW1zIHRvIHRoZSBlbmQgb2YgdGhlIG1lbnUgaXRlbXMgbGlzdFxyXG4gICAqIEBwYXJhbSB7TGlzdDxOYk1lbnVJdGVtPn0gaXRlbXNcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnXHJcbiAgICovXHJcbiAgYWRkSXRlbXMoaXRlbXM6IE5iTWVudUl0ZW1bXSwgdGFnPzogc3RyaW5nKSB7XHJcbiAgICBhZGRJdGVtcyQubmV4dCh7IHRhZywgaXRlbXMgfSk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIENvbGxhcHNlcyBhbGwgbWVudSBpdGVtc1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcclxuICAgKi9cclxuICBjb2xsYXBzZUFsbCh0YWc/OiBzdHJpbmcpIHtcclxuICAgIGNvbGxhcHNlQWxsJC5uZXh0KHsgdGFnIH0pO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBOYXZpZ2F0ZSB0byB0aGUgaG9tZSBtZW51IGl0ZW1cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnXHJcbiAgICovXHJcbiAgbmF2aWdhdGVIb21lKHRhZz86IHN0cmluZykge1xyXG4gICAgbmF2aWdhdGVIb21lJC5uZXh0KHsgdGFnIH0pO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBSZXR1cm5zIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtLiBXb24ndCBzdWJzY3JpYmUgdG8gdGhlIGZ1dHVyZSBldmVudHMuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPHt0YWc6IHN0cmluZzsgaXRlbTogTmJNZW51SXRlbX0+fVxyXG4gICAqL1xyXG4gIGdldFNlbGVjdGVkSXRlbSh0YWc/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPE5iTWVudUJhZz4ge1xyXG4gICAgY29uc3QgbGlzdGVuZXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE5iTWVudUJhZz4obnVsbCk7XHJcblxyXG4gICAgZ2V0U2VsZWN0ZWRJdGVtJC5uZXh0KHsgdGFnLCBsaXN0ZW5lciB9KTtcclxuXHJcbiAgICByZXR1cm4gbGlzdGVuZXIuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBvbkl0ZW1DbGljaygpOiBPYnNlcnZhYmxlPE5iTWVudUJhZz4ge1xyXG4gICAgcmV0dXJuIGl0ZW1DbGljayQucGlwZShzaGFyZSgpKTtcclxuICB9XHJcblxyXG4gIG9uSXRlbVNlbGVjdCgpOiBPYnNlcnZhYmxlPE5iTWVudUJhZz4ge1xyXG4gICAgcmV0dXJuIGl0ZW1TZWxlY3QkLnBpcGUoc2hhcmUoKSk7XHJcbiAgfVxyXG5cclxuICBvbkl0ZW1Ib3ZlcigpOiBPYnNlcnZhYmxlPE5iTWVudUJhZz4ge1xyXG4gICAgcmV0dXJuIGl0ZW1Ib3ZlciQucGlwZShzaGFyZSgpKTtcclxuICB9XHJcblxyXG4gIG9uU3VibWVudVRvZ2dsZSgpOiBPYnNlcnZhYmxlPE5iTWVudUJhZz4ge1xyXG4gICAgcmV0dXJuIHN1Ym1lbnVUb2dnbGUkLnBpcGUoc2hhcmUoKSk7XHJcbiAgfVxyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOYk1lbnVJbnRlcm5hbFNlcnZpY2Uge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbikge31cclxuXHJcbiAgcHJlcGFyZUl0ZW1zKGl0ZW1zOiBOYk1lbnVJdGVtW10pIHtcclxuICAgIGNvbnN0IGRlZmF1bHRJdGVtID0gbmV3IE5iTWVudUl0ZW0oKTtcclxuICAgIGl0ZW1zLmZvckVhY2goaSA9PiB7XHJcbiAgICAgIHRoaXMuYXBwbHlEZWZhdWx0cyhpLCBkZWZhdWx0SXRlbSk7XHJcbiAgICAgIHRoaXMuc2V0UGFyZW50KGkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RGcm9tVXJsKGl0ZW1zOiBOYk1lbnVJdGVtW10sIHRhZzogc3RyaW5nLCBjb2xsYXBzZU90aGVyOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IHRoaXMuZmluZEl0ZW1CeVVybChpdGVtcyk7XHJcbiAgICBpZiAoc2VsZWN0ZWRJdGVtKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0SXRlbShzZWxlY3RlZEl0ZW0sIGl0ZW1zLCBjb2xsYXBzZU90aGVyLCB0YWcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VsZWN0SXRlbShpdGVtOiBOYk1lbnVJdGVtLCBpdGVtczogTmJNZW51SXRlbVtdLCBjb2xsYXBzZU90aGVyOiBib29sZWFuID0gZmFsc2UsIHRhZzogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB1bnNlbGVjdGVkSXRlbXMgPSB0aGlzLnJlc2V0U2VsZWN0aW9uKGl0ZW1zKTtcclxuICAgIGNvbnN0IGNvbGxhcHNlZEl0ZW1zID0gY29sbGFwc2VPdGhlciA/IHRoaXMuY29sbGFwc2VJdGVtcyhpdGVtcykgOiBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHBhcmVudCBvZiBOYk1lbnVJdGVtLmdldFBhcmVudHMoaXRlbSkpIHtcclxuICAgICAgcGFyZW50LnNlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgLy8gZW1pdCBldmVudCBvbmx5IGZvciBpdGVtcyB0aGF0IHdlcmVuJ3Qgc2VsZWN0ZWQgYmVmb3JlICgndW5zZWxlY3RlZEl0ZW1zJyBjb250YWlucyBpdGVtcyB0aGF0IHdlcmUgc2VsZWN0ZWQpXHJcbiAgICAgIGlmICghdW5zZWxlY3RlZEl0ZW1zLmluY2x1ZGVzKHBhcmVudCkpIHtcclxuICAgICAgICB0aGlzLml0ZW1TZWxlY3QocGFyZW50LCB0YWcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCB3YXNOb3RFeHBhbmRlZCA9ICFwYXJlbnQuZXhwYW5kZWQ7XHJcbiAgICAgIHBhcmVudC5leHBhbmRlZCA9IHRydWU7XHJcbiAgICAgIGNvbnN0IGkgPSBjb2xsYXBzZWRJdGVtcy5pbmRleE9mKHBhcmVudCk7XHJcbiAgICAgIC8vIGVtaXQgZXZlbnQgb25seSBmb3IgaXRlbXMgdGhhdCB3ZXJlbid0IGV4cGFuZGVkIGJlZm9yZS5cclxuICAgICAgLy8gJ2NvbGxhcHNlZEl0ZW1zJyBjb250YWlucyBpdGVtcyB0aGF0IHdlcmUgZXhwYW5kZWQsIHNvIG5vIG5lZWQgdG8gZW1pdCBldmVudC5cclxuICAgICAgLy8gaW4gY2FzZSAnY29sbGFwc2VPdGhlcicgaXMgZmFsc2UsICdjb2xsYXBzZWRJdGVtcycgd2lsbCBiZSBlbXB0eSxcclxuICAgICAgLy8gc28gYWxzbyBjaGVjayBpZiBpdGVtIGlzbid0IGV4cGFuZGVkIGFscmVhZHkgKCd3YXNOb3RFeHBhbmRlZCcpLlxyXG4gICAgICBpZiAoaSA9PT0gLTEgJiYgd2FzTm90RXhwYW5kZWQpIHtcclxuICAgICAgICB0aGlzLnN1Ym1lbnVUb2dnbGUocGFyZW50LCB0YWcpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbGxhcHNlZEl0ZW1zLnNwbGljZShpLCAxKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGl0ZW0uc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgLy8gZW1pdCBldmVudCBvbmx5IGZvciBpdGVtcyB0aGF0IHdlcmVuJ3Qgc2VsZWN0ZWQgYmVmb3JlICgndW5zZWxlY3RlZEl0ZW1zJyBjb250YWlucyBpdGVtcyB0aGF0IHdlcmUgc2VsZWN0ZWQpXHJcbiAgICBpZiAoIXVuc2VsZWN0ZWRJdGVtcy5pbmNsdWRlcyhpdGVtKSkge1xyXG4gICAgICB0aGlzLml0ZW1TZWxlY3QoaXRlbSwgdGFnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyByZW1haW5pbmcgaXRlbXMgd2hpY2ggd2Fzbid0IGV4cGFuZGVkIGJhY2sgYWZ0ZXIgZXhwYW5kaW5nIGFsbCBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbXNcclxuICAgIGZvciAoY29uc3QgY29sbGFwc2VkSXRlbSBvZiBjb2xsYXBzZWRJdGVtcykge1xyXG4gICAgICB0aGlzLnN1Ym1lbnVUb2dnbGUoY29sbGFwc2VkSXRlbSwgdGFnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbGxhcHNlQWxsKGl0ZW1zOiBOYk1lbnVJdGVtW10sIHRhZzogc3RyaW5nLCBleGNlcHQ/OiBOYk1lbnVJdGVtKSB7XHJcbiAgICBjb25zdCBjb2xsYXBzZWRJdGVtcyA9IHRoaXMuY29sbGFwc2VJdGVtcyhpdGVtcywgZXhjZXB0KTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY29sbGFwc2VkSXRlbXMpIHtcclxuICAgICAgdGhpcy5zdWJtZW51VG9nZ2xlKGl0ZW0sIHRhZyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkFkZEl0ZW0oKTogT2JzZXJ2YWJsZTx7IHRhZzogc3RyaW5nOyBpdGVtczogTmJNZW51SXRlbVtdIH0+IHtcclxuICAgIHJldHVybiBhZGRJdGVtcyQucGlwZShzaGFyZSgpKTtcclxuICB9XHJcblxyXG4gIG9uTmF2aWdhdGVIb21lKCk6IE9ic2VydmFibGU8eyB0YWc6IHN0cmluZyB9PiB7XHJcbiAgICByZXR1cm4gbmF2aWdhdGVIb21lJC5waXBlKHNoYXJlKCkpO1xyXG4gIH1cclxuXHJcbiAgb25Db2xsYXBzZUFsbCgpOiBPYnNlcnZhYmxlPHsgdGFnOiBzdHJpbmcgfT4ge1xyXG4gICAgcmV0dXJuIGNvbGxhcHNlQWxsJC5waXBlKHNoYXJlKCkpO1xyXG4gIH1cclxuXHJcbiAgb25HZXRTZWxlY3RlZEl0ZW0oKTogT2JzZXJ2YWJsZTx7IHRhZzogc3RyaW5nOyBsaXN0ZW5lcjogQmVoYXZpb3JTdWJqZWN0PE5iTWVudUJhZz4gfT4ge1xyXG4gICAgcmV0dXJuIGdldFNlbGVjdGVkSXRlbSQucGlwZShzaGFyZSgpKTtcclxuICB9XHJcblxyXG4gIGl0ZW1Ib3ZlcihpdGVtOiBOYk1lbnVJdGVtLCB0YWc/OiBzdHJpbmcpIHtcclxuICAgIGl0ZW1Ib3ZlciQubmV4dCh7dGFnLCBpdGVtfSk7XHJcbiAgfVxyXG5cclxuICBzdWJtZW51VG9nZ2xlKGl0ZW06IE5iTWVudUl0ZW0sIHRhZz86IHN0cmluZykge1xyXG4gICAgc3VibWVudVRvZ2dsZSQubmV4dCh7dGFnLCBpdGVtfSk7XHJcbiAgfVxyXG5cclxuICBpdGVtU2VsZWN0KGl0ZW06IE5iTWVudUl0ZW0sIHRhZz86IHN0cmluZykge1xyXG4gICAgaXRlbVNlbGVjdCQubmV4dCh7dGFnLCBpdGVtfSk7XHJcbiAgfVxyXG5cclxuICBpdGVtQ2xpY2soaXRlbTogTmJNZW51SXRlbSwgdGFnPzogc3RyaW5nKSB7XHJcbiAgICBpdGVtQ2xpY2skLm5leHQoe3RhZywgaXRlbX0pO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBVbnNlbGVjdCBhbGwgZ2l2ZW4gaXRlbXMgZGVlcGx5LlxyXG4gICAqIEBwYXJhbSBpdGVtcyBhcnJheSBvZiBpdGVtcyB0byB1bnNlbGVjdC5cclxuICAgKiBAcmV0dXJucyBpdGVtcyB3aGljaCBzZWxlY3RlZCB2YWx1ZSB3YXMgY2hhbmdlZC5cclxuICAgKi9cclxuICBwcml2YXRlIHJlc2V0U2VsZWN0aW9uKGl0ZW1zOiBOYk1lbnVJdGVtW10pOiBOYk1lbnVJdGVtW10ge1xyXG4gICAgY29uc3QgdW5zZWxlY3RlZEl0ZW1zID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XHJcbiAgICAgIGlmIChpdGVtLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgdW5zZWxlY3RlZEl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgIH1cclxuICAgICAgaXRlbS5zZWxlY3RlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4pIHtcclxuICAgICAgICB1bnNlbGVjdGVkSXRlbXMucHVzaCguLi50aGlzLnJlc2V0U2VsZWN0aW9uKGl0ZW0uY2hpbGRyZW4pKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB1bnNlbGVjdGVkSXRlbXM7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIENvbGxhcHNlIGFsbCBnaXZlbiBpdGVtcyBkZWVwbHkuXHJcbiAgICogQHBhcmFtIGl0ZW1zIGFycmF5IG9mIGl0ZW1zIHRvIGNvbGxhcHNlLlxyXG4gICAqIEBwYXJhbSBleGNlcHQgbWVudSBpdGVtIHdoaWNoIHNob3VsZG4ndCBiZSBjb2xsYXBzZWQsIGFsc28gZGlzYWJsZXMgY29sbGFwc2luZyBmb3IgcGFyZW50cyBvZiB0aGlzIGl0ZW0uXHJcbiAgICogQHJldHVybnMgaXRlbXMgd2hpY2ggZXhwYW5kZWQgdmFsdWUgd2FzIGNoYW5nZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjb2xsYXBzZUl0ZW1zKGl0ZW1zOiBOYk1lbnVJdGVtW10sIGV4Y2VwdD86IE5iTWVudUl0ZW0pOiBOYk1lbnVJdGVtW10ge1xyXG4gICAgY29uc3QgY29sbGFwc2VkSXRlbXMgPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgICAgaWYgKGV4Y2VwdCAmJiAoaXRlbSA9PT0gZXhjZXB0IHx8IE5iTWVudUl0ZW0uaXNQYXJlbnQoaXRlbSwgZXhjZXB0KSkpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGl0ZW0uZXhwYW5kZWQpIHtcclxuICAgICAgICBjb2xsYXBzZWRJdGVtcy5wdXNoKGl0ZW0pXHJcbiAgICAgIH1cclxuICAgICAgaXRlbS5leHBhbmRlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4pIHtcclxuICAgICAgICBjb2xsYXBzZWRJdGVtcy5wdXNoKC4uLnRoaXMuY29sbGFwc2VJdGVtcyhpdGVtLmNoaWxkcmVuKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY29sbGFwc2VkSXRlbXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5RGVmYXVsdHMoaXRlbSwgZGVmYXVsdEl0ZW0pIHtcclxuICAgIGNvbnN0IG1lbnVJdGVtID0gey4uLml0ZW19O1xyXG4gICAgT2JqZWN0LmFzc2lnbihpdGVtLCBkZWZhdWx0SXRlbSwgbWVudUl0ZW0pO1xyXG4gICAgaXRlbS5jaGlsZHJlbiAmJiBpdGVtLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICB0aGlzLmFwcGx5RGVmYXVsdHMoY2hpbGQsIGRlZmF1bHRJdGVtKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRQYXJlbnQoaXRlbTogTmJNZW51SXRlbSkge1xyXG4gICAgaXRlbS5jaGlsZHJlbiAmJiBpdGVtLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICBjaGlsZC5wYXJlbnQgPSBpdGVtO1xyXG4gICAgICB0aGlzLnNldFBhcmVudChjaGlsZCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogRmluZCBkZWVwZXN0IGl0ZW0gd2hpY2ggbGluayBtYXRjaGVzIGN1cnJlbnQgVVJMIHBhdGguXHJcbiAgICogQHBhcmFtIGl0ZW1zIGFycmF5IG9mIGl0ZW1zIHRvIHNlYXJjaCBpbi5cclxuICAgKiBAcmV0dXJucyBmb3VuZCBpdGVtIG9mIHVuZGVmaW5lZC5cclxuICAgKi9cclxuICBwcml2YXRlIGZpbmRJdGVtQnlVcmwoaXRlbXM6IE5iTWVudUl0ZW1bXSk6IE5iTWVudUl0ZW0gfCB1bmRlZmluZWQge1xyXG4gICAgbGV0IHNlbGVjdGVkSXRlbTtcclxuXHJcbiAgICBpdGVtcy5zb21lKGl0ZW0gPT4ge1xyXG4gICAgICBpZiAoaXRlbS5jaGlsZHJlbikge1xyXG4gICAgICAgIHNlbGVjdGVkSXRlbSA9IHRoaXMuZmluZEl0ZW1CeVVybChpdGVtLmNoaWxkcmVuKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXNlbGVjdGVkSXRlbSAmJiB0aGlzLmlzU2VsZWN0ZWRJblVybChpdGVtKSkge1xyXG4gICAgICAgIHNlbGVjdGVkSXRlbSA9IGl0ZW07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBzZWxlY3RlZEl0ZW07XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gc2VsZWN0ZWRJdGVtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1NlbGVjdGVkSW5VcmwoaXRlbTogTmJNZW51SXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgZXhhY3Q6IGJvb2xlYW4gPSBpdGVtLnBhdGhNYXRjaCA9PT0gJ2Z1bGwnO1xyXG4gICAgcmV0dXJuIGV4YWN0XHJcbiAgICAgID8gaXNVcmxQYXRoRXF1YWwodGhpcy5sb2NhdGlvbi5wYXRoKCksIGl0ZW0ubGluaylcclxuICAgICAgOiBpc1VybFBhdGhDb250YWluKHRoaXMubG9jYXRpb24ucGF0aCgpLCBpdGVtLmxpbmspO1xyXG4gIH1cclxufVxyXG4iXX0=