bfend
Version:
Admin template base on ng-zorro-antd
294 lines • 24.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
import { Subject, ReplaySubject } from 'rxjs';
import { distinct, filter, map, publishReplay, refCount, scan, tap } from 'rxjs/operators';
import { Injectable } from '@angular/core';
import { BfACLService } from './auth/acl.service';
import * as i0 from "@angular/core";
import * as i1 from "./auth/acl.service";
/**
* @record
*/
export function Menu() { }
if (false) {
/** @type {?} */
Menu.prototype.text;
/** @type {?|undefined} */
Menu.prototype.translate;
/** @type {?|undefined} */
Menu.prototype.group;
/** @type {?|undefined} */
Menu.prototype.link;
/** @type {?|undefined} */
Menu.prototype.externalLink;
/** @type {?|undefined} */
Menu.prototype.target;
/** @type {?|undefined} */
Menu.prototype.icon;
/** @type {?|undefined} */
Menu.prototype.badge;
/** @type {?|undefined} */
Menu.prototype.badge_dot;
/** @type {?|undefined} */
Menu.prototype.badge_status;
/** @type {?|undefined} */
Menu.prototype.hide;
/** @type {?|undefined} */
Menu.prototype.acl;
/** @type {?|undefined} */
Menu.prototype.children;
/** @type {?|undefined} */
Menu.prototype._type;
/** @type {?|undefined} */
Menu.prototype._selected;
/** @type {?|undefined} */
Menu.prototype._open;
/** @type {?|undefined} */
Menu.prototype._depth;
/* Skipping unhandled member: [key: string]: any;*/
}
export class BfMenuService {
/**
* @param {?} aclService
*/
constructor(aclService) {
this.aclService = aclService;
this.data = [];
this.updateSubject = new ReplaySubject();
this.setSubject = new Subject();
this.toggleOpenSubject = new Subject();
this.currentSubject = new Subject();
this.refreshSubject = new Subject();
// 最新的菜单数据
this.menus$ = this.updateSubject.pipe(scan((menus, mutation) => [...mutation(menus)], []), tap(menus => (this.data = menus)), publishReplay(1), refCount());
this.valid$ = this.menus$.pipe(map(menus => menus && menus.length > 0), filter(state => state), // select true
distinct());
// 设置整个菜单数据结构
this.setSubject.pipe(map(this.setMutation.bind(this)))
.subscribe(this.updateSubject);
// 菜单的打开或关闭
this.toggleOpenSubject.pipe(map(this.toggleOpenMutation.bind(this)))
.subscribe(this.updateSubject);
// 当前菜单,一般是和 URL 关联起来的
this.currentSubject.pipe(map(this.setCurrentMutation.bind(this)))
.subscribe(this.updateSubject);
this.refreshSubject.pipe(map(this.refreshMutation.bind(this)))
.subscribe(this.updateSubject);
// 用户权限改变时,重新计算菜单权限
this.aclService.rules$.subscribe(this.refreshSubject);
}
/**
* @param {?} menus
* @param {?} callback
* @return {?}
*/
walk(menus, callback) {
/** @type {?} */
const _walk = (list, parentMenu, depth) => {
for (const item of list) {
callback(item, parentMenu, depth);
if (item.children && item.children.length > 0) {
_walk(item.children, item, depth + 1);
}
else {
item.children = [];
}
}
};
_walk(menus, null, 0);
}
/**
* @param {?} menus
* @return {?}
*/
prune(menus) {
/** @type {?} */
const result = [];
for (const item of menus) {
if (item.hide) {
continue;
}
if (item.children && item.children.length > 0) {
item.children = this.prune(item.children);
if ((item._type === 3 || item.group) && item.children.length === 0) {
continue; // 父菜单和分组如果没有了孩子,自己也消失
}
}
result.push(item);
}
return result;
}
/**
* @param {?} menus
* @return {?}
*/
normalize(menus) {
/** @type {?} */
let i = 1;
this.walk(menus, (item, parent, depth) => {
item.__id = i++;
item.__parent = parent;
item._depth = depth;
// badge
if (item.badge) {
if (item.badge_dot !== true) {
item.badge_dot = false;
}
if (!item.badge_status) {
item.badge_status = 'error';
}
}
item.hide = item.acl && !this.aclService.can(item.acl);
item._type = item.externalLink ? 2 : 1;
if (item.children && item.children.length > 0) {
item._type = 3;
}
});
return this.prune(menus);
}
/**
* @param {?} items
* @return {?}
*/
set(items) {
this.setSubject.next(items);
}
/**
* @param {?} menu
* @return {?}
*/
setCurrent(menu) {
this.currentSubject.next(menu);
}
/**
* @param {?} url
* @return {?}
*/
getByUrl(url) {
/** @type {?} */
let findItem = null;
this.walk(this.data, item => {
item._open = false;
if (!item.link) {
return;
}
if (!findItem && new RegExp(`^${url}\\b`).test(item.link)) {
findItem = item;
}
});
return findItem;
}
/**
* @param {?} url
* @return {?}
*/
getPathByUrl(url) {
/** @type {?} */
let item = null;
this.walk(this.data, (i, parent, depth) => {
if (i.link === url) {
item = i;
}
});
/** @type {?} */
const ret = [];
if (!item) {
return ret;
}
do {
ret.splice(0, 0, item);
item = item.__parent;
} while (item);
return ret;
}
/**
* @param {?} item
* @return {?}
*/
toggleOpen(item) {
this.toggleOpenSubject.next(item);
}
/**
* @param {?} menus
* @return {?}
*/
setMutation(menus) {
return () => {
// 规范化,添加部分计算属性
return this.normalize(menus);
};
}
/**
* @param {?} menu
* @return {?}
*/
toggleOpenMutation(menu) {
return menus => {
this.walk(menus, m => {
if (m.__id !== menu.__id) {
m._open = false;
return;
}
menu._open = !menu._open;
});
return menus;
};
}
/**
* @param {?} menu
* @return {?}
*/
setCurrentMutation(menu) {
return menus => {
/** @type {?} */
let p = menu;
if (p) {
do {
p._open = true;
p = p.__parent;
} while (p);
}
return menus;
};
}
/**
* @return {?}
*/
refreshMutation() {
return menus => {
return this.normalize(menus);
};
}
}
BfMenuService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] },
];
BfMenuService.ctorParameters = () => [
{ type: BfACLService }
];
/** @nocollapse */ BfMenuService.ngInjectableDef = i0.defineInjectable({ factory: function BfMenuService_Factory() { return new BfMenuService(i0.inject(i1.BfACLService)); }, token: BfMenuService, providedIn: "root" });
if (false) {
/** @type {?} */
BfMenuService.prototype.menus$;
/** @type {?} */
BfMenuService.prototype.data;
/** @type {?} */
BfMenuService.prototype.updateSubject;
/** @type {?} */
BfMenuService.prototype.setSubject;
/** @type {?} */
BfMenuService.prototype.toggleOpenSubject;
/** @type {?} */
BfMenuService.prototype.currentSubject;
/** @type {?} */
BfMenuService.prototype.refreshSubject;
/** @type {?} */
BfMenuService.prototype.valid$;
/** @type {?} */
BfMenuService.prototype.aclService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYmZlbmQvIiwic291cmNlcyI6WyJsaWIvbWVudS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQWMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFXLE1BQU0sb0JBQW9CLENBQUM7Ozs7OztBQUUzRCwwQkF1Q0M7OztJQXJDQyxvQkFBYTs7SUFFYix5QkFBbUI7O0lBRW5CLHFCQUFnQjs7SUFFaEIsb0JBQWM7O0lBRWQsNEJBQXNCOztJQUV0QixzQkFBaUQ7O0lBRWpELG9CQUFjOztJQUVkLHFCQUFlOztJQUVmLHlCQUFvQjs7SUFFcEIsNEJBQXNCOztJQUV0QixvQkFBZTs7SUFFZixtQkFBa0M7O0lBRWxDLHdCQUFrQjs7SUFLbEIscUJBQWU7O0lBRWYseUJBQW9COztJQUVwQixxQkFBZ0I7O0lBQ2hCLHNCQUFnQjs7O0FBVWxCLE1BQU07Ozs7SUFpQkosWUFBb0IsVUFBd0I7UUFBeEIsZUFBVSxHQUFWLFVBQVUsQ0FBYztRQWRwQyxTQUFJLEdBQVcsRUFBRSxDQUFDO1FBRWxCLGtCQUFhLEdBQUcsSUFBSSxhQUFhLEVBQVksQ0FBQztRQUU5QyxlQUFVLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUVuQyxzQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRXhDLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUVyQyxtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFLckMsVUFBVTtRQUNWLElBQUks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QyxJQUFVO1FBQ25DLE9BQU8sS0FBSyxDQUFDLEVBQUU7O2dCQUNULENBQUMsR0FBRyxJQUFJO1lBRVosSUFBSSxDQUFDLEVBQUU7Z0JBQ0wsR0FBRztvQkFDRCxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztvQkFDZixDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQztpQkFDaEIsUUFBUSxDQUFDLEVBQUU7YUFDYjtZQUVELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs7OztJQUVPLGVBQWU7UUFDckIsT0FBTyxLQUFLLENBQUMsRUFBRTtZQUNiLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUM7SUFDSixDQUFDOzs7WUFoTkYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7WUEvQ1EsWUFBWTs7Ozs7SUFpRG5CLCtCQUEyQjs7SUFFM0IsNkJBQTBCOztJQUUxQixzQ0FBc0Q7O0lBRXRELG1DQUEyQzs7SUFFM0MsMENBQWdEOztJQUVoRCx1Q0FBNkM7O0lBRTdDLHVDQUF1Qzs7SUFFdkMsK0JBQTRCOztJQUVoQixtQ0FBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdCwgZmlsdGVyLCBtYXAsIHB1Ymxpc2hSZXBsYXksIHJlZkNvdW50LCBzY2FuLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZkFDTFNlcnZpY2UsIEFDTFR5cGUgfSBmcm9tICcuL2F1dGgvYWNsLnNlcnZpY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1lbnUge1xuICAvLyDmlofmnKxcbiAgdGV4dDogc3RyaW5nO1xuICAvLyBpMThu5Li76ZSuXG4gIHRyYW5zbGF0ZT86IHN0cmluZztcbiAgLy8g5piv5ZCm6I+c5Y2V57uEXG4gIGdyb3VwPzogYm9vbGVhbjtcbiAgLy8gYW5ndWxhciDpk77mjqVcbiAgbGluaz86IHN0cmluZztcbiAgLy8g5aSW6YOo6ZO+5o6lXG4gIGV4dGVybmFsTGluaz86IHN0cmluZztcbiAgLy8g6ZO+5o6lIHRhcmdldFxuICB0YXJnZXQ/OiAnX2JsYW5rJyB8ICdfc2VsZicgfCAnX3BhcmVudCcgfCAnX3RvcCc7XG4gIC8vIOWbvuagh1xuICBpY29uPzogc3RyaW5nO1xuICAvLyDlvr3moIfmlbDvvIzlsZXnpLrnmoTmlbDlrZdcbiAgYmFkZ2U/OiBudW1iZXI7XG4gIC8vIOW+veagh+aVsO+8jOaYvuekuuWwj+e6oueCuVxuICBiYWRnZV9kb3Q/OiBib29sZWFuO1xuICAvLyDlvr3moIfmlbDvvIzorr7nva4gQmFkZ2Ug6aKc6ImyIO+8iOm7mOiupO+8mmVycm9y77yJXG4gIGJhZGdlX3N0YXR1cz86IHN0cmluZztcbiAgLy8g5piv5ZCm6ZqQ6JePXG4gIGhpZGU/OiBib29sZWFuO1xuICAvLyBBQ0zphY3nva5cbiAgYWNsPzogc3RyaW5nIHwgc3RyaW5nW10gfCBBQ0xUeXBlO1xuICAvLyDkuoznuqfoj5zljZVcbiAgY2hpbGRyZW4/OiBNZW51W107XG4gIC8vIOiPnOWNleexu+Wei++8jOaXoOmhu+aMh+WumueUsSBTZXJ2aWNlIOiHquWKqOivhuWIq1xuICAvLyAx77ya6ZO+5o6lXG4gIC8vIDLvvJrlpJbpg6jpk77mjqVcbiAgLy8gM++8mumTvuaOpe+8iOWtkOiPnOWNle+8iVxuICBfdHlwZT86IG51bWJlcjtcbiAgLy8g5piv5ZCm6YCJ5LitXG4gIF9zZWxlY3RlZD86IGJvb2xlYW47XG4gIC8vIOaYr+WQpuaJk+W8gFxuICBfb3Blbj86IGJvb2xlYW47XG4gIF9kZXB0aD86IG51bWJlcjtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbnR5cGUgTXV0YXRpb24gPSAobWVudXM6IE1lbnVbXSkgPT4gTWVudVtdO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBCZk1lbnVTZXJ2aWNlIHtcbiAgbWVudXMkOiBPYnNlcnZhYmxlPE1lbnVbXT47XG5cbiAgcHJpdmF0ZSBkYXRhOiBNZW51W10gPSBbXTtcblxuICBwcml2YXRlIHVwZGF0ZVN1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxNdXRhdGlvbj4oKTtcblxuICBwcml2YXRlIHNldFN1YmplY3QgPSBuZXcgU3ViamVjdDxNZW51W10+KCk7XG5cbiAgcHJpdmF0ZSB0b2dnbGVPcGVuU3ViamVjdCA9IG5ldyBTdWJqZWN0PE1lbnU+KCk7XG5cbiAgcHJpdmF0ZSBjdXJyZW50U3ViamVjdCA9IG5ldyBTdWJqZWN0PE1lbnU+KCk7XG5cbiAgcHJpdmF0ZSByZWZyZXNoU3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgdmFsaWQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYWNsU2VydmljZTogQmZBQ0xTZXJ2aWNlKSB7XG4gICAgLy8g5pyA5paw55qE6I+c5Y2V5pWw5o2uXG4gICAgdGhpcy5tZW51cyQgPSB0aGlzLnVwZGF0ZVN1YmplY3QucGlwZShcbiAgICAgIHNjYW4oKG1lbnVzOiBNZW51W10sIG11dGF0aW9uOiBNdXRhdGlvbikgPT4gWy4uLm11dGF0aW9uKG1lbnVzKV0sIFtdKSxcbiAgICAgIHRhcChtZW51cyA9PiAodGhpcy5kYXRhID0gbWVudXMpKSxcbiAgICAgIHB1Ymxpc2hSZXBsYXkoMSksXG4gICAgICByZWZDb3VudCgpXG4gICAgKTtcblxuICAgIHRoaXMudmFsaWQkID0gdGhpcy5tZW51cyQucGlwZShcbiAgICAgIG1hcChtZW51cyA9PiBtZW51cyAmJiBtZW51cy5sZW5ndGggPiAwKSxcbiAgICAgIGZpbHRlcihzdGF0ZSA9PiBzdGF0ZSksIC8vIHNlbGVjdCB0cnVlXG4gICAgICBkaXN0aW5jdCgpXG4gICAgKTtcblxuICAgIC8vIOiuvue9ruaVtOS4quiPnOWNleaVsOaNrue7k+aehFxuICAgIHRoaXMuc2V0U3ViamVjdC5waXBlKG1hcCh0aGlzLnNldE11dGF0aW9uLmJpbmQodGhpcykpKVxuICAgICAgLnN1YnNjcmliZSh0aGlzLnVwZGF0ZVN1YmplY3QpO1xuXG4gICAgLy8g6I+c5Y2V55qE5omT5byA5oiW5YWz6ZetXG4gICAgdGhpcy50b2dnbGVPcGVuU3ViamVjdC5waXBlKG1hcCh0aGlzLnRvZ2dsZU9wZW5NdXRhdGlvbi5iaW5kKHRoaXMpKSlcbiAgICAgIC5zdWJzY3JpYmUodGhpcy51cGRhdGVTdWJqZWN0KTtcblxuICAgIC8vIOW9k+WJjeiPnOWNle+8jOS4gOiIrOaYr+WSjCBVUkwg5YWz6IGU6LW35p2l55qEXG4gICAgdGhpcy5jdXJyZW50U3ViamVjdC5waXBlKG1hcCh0aGlzLnNldEN1cnJlbnRNdXRhdGlvbi5iaW5kKHRoaXMpKSlcbiAgICAgIC5zdWJzY3JpYmUodGhpcy51cGRhdGVTdWJqZWN0KTtcblxuICAgIHRoaXMucmVmcmVzaFN1YmplY3QucGlwZShtYXAodGhpcy5yZWZyZXNoTXV0YXRpb24uYmluZCh0aGlzKSkpXG4gICAgICAuc3Vic2NyaWJlKHRoaXMudXBkYXRlU3ViamVjdCk7XG5cbiAgICAvLyDnlKjmiLfmnYPpmZDmlLnlj5jml7bvvIzph43mlrDorqHnrpfoj5zljZXmnYPpmZBcbiAgICB0aGlzLmFjbFNlcnZpY2UucnVsZXMkLnN1YnNjcmliZSh0aGlzLnJlZnJlc2hTdWJqZWN0KTtcbiAgfVxuXG4gIHByaXZhdGUgd2FsayhtZW51cywgY2FsbGJhY2s6IChpdGVtOiBNZW51LCBwYXJlbnRNZW51OiBNZW51LCBkZXB0aD86IG51bWJlcikgPT4gdm9pZCkge1xuICAgIGNvbnN0IF93YWxrID0gKGxpc3Q6IE1lbnVbXSwgcGFyZW50TWVudTogTWVudSwgZGVwdGg6IG51bWJlcikgPT4ge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGxpc3QpIHtcbiAgICAgICAgY2FsbGJhY2soaXRlbSwgcGFyZW50TWVudSwgZGVwdGgpO1xuICAgICAgICBpZiAoaXRlbS5jaGlsZHJlbiAmJiBpdGVtLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBfd2FsayhpdGVtLmNoaWxkcmVuLCBpdGVtLCBkZXB0aCArIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW0uY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBfd2FsayhtZW51cywgbnVsbCwgMCk7XG4gIH1cblxuICBwcml2YXRlIHBydW5lKG1lbnVzOiBNZW51W10pOiBNZW51W10ge1xuICAgIGNvbnN0IHJlc3VsdDogTWVudVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbWVudXMpIHtcbiAgICAgIGlmIChpdGVtLmhpZGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtLmNoaWxkcmVuICYmIGl0ZW0uY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICBpdGVtLmNoaWxkcmVuID0gdGhpcy5wcnVuZShpdGVtLmNoaWxkcmVuKTtcbiAgICAgICAgaWYgKChpdGVtLl90eXBlID09PSAzIHx8IGl0ZW0uZ3JvdXApICYmIGl0ZW0uY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29udGludWU7IC8vIOeItuiPnOWNleWSjOWIhue7hOWmguaenOayoeacieS6huWtqeWtkO+8jOiHquW3seS5n+a2iOWksVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZShtZW51czogTWVudVtdKTogTWVudVtdIHtcbiAgICBsZXQgaSA9IDE7XG5cbiAgICB0aGlzLndhbGsobWVudXMsIChpdGVtLCBwYXJlbnQsIGRlcHRoKSA9PiB7XG4gICAgICBpdGVtLl9faWQgPSBpKys7XG4gICAgICBpdGVtLl9fcGFyZW50ID0gcGFyZW50O1xuICAgICAgaXRlbS5fZGVwdGggPSBkZXB0aDtcblxuICAgICAgLy8gYmFkZ2VcbiAgICAgIGlmIChpdGVtLmJhZGdlKSB7XG4gICAgICAgIGlmIChpdGVtLmJhZGdlX2RvdCAhPT0gdHJ1ZSkge1xuICAgICAgICAgIGl0ZW0uYmFkZ2VfZG90ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpdGVtLmJhZGdlX3N0YXR1cykge1xuICAgICAgICAgIGl0ZW0uYmFkZ2Vfc3RhdHVzID0gJ2Vycm9yJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpdGVtLmhpZGUgPSBpdGVtLmFjbCAmJiAhdGhpcy5hY2xTZXJ2aWNlLmNhbihpdGVtLmFjbCk7XG5cbiAgICAgIGl0ZW0uX3R5cGUgPSBpdGVtLmV4dGVybmFsTGluayA/IDIgOiAxO1xuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4gJiYgaXRlbS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGl0ZW0uX3R5cGUgPSAzO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMucHJ1bmUobWVudXMpO1xuICB9XG5cbiAgc2V0KGl0ZW1zOiBNZW51W10pIHtcbiAgICB0aGlzLnNldFN1YmplY3QubmV4dChpdGVtcyk7XG4gIH1cblxuICBzZXRDdXJyZW50KG1lbnU6IE1lbnUpIHtcbiAgICB0aGlzLmN1cnJlbnRTdWJqZWN0Lm5leHQobWVudSk7XG4gIH1cblxuICBnZXRCeVVybCh1cmwpIHtcbiAgICBsZXQgZmluZEl0ZW06IE1lbnUgPSBudWxsO1xuICAgIHRoaXMud2Fsayh0aGlzLmRhdGEsIGl0ZW0gPT4ge1xuICAgICAgaXRlbS5fb3BlbiA9IGZhbHNlO1xuICAgICAgaWYgKCFpdGVtLmxpbmspIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFmaW5kSXRlbSAmJiBuZXcgUmVnRXhwKGBeJHt1cmx9XFxcXGJgKS50ZXN0KGl0ZW0ubGluaykpIHtcbiAgICAgICAgZmluZEl0ZW0gPSBpdGVtO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZpbmRJdGVtO1xuICB9XG5cbiAgZ2V0UGF0aEJ5VXJsKHVybCkge1xuICAgIGxldCBpdGVtOiBNZW51ID0gbnVsbDtcbiAgICB0aGlzLndhbGsodGhpcy5kYXRhLCAoaSwgcGFyZW50LCBkZXB0aCkgPT4ge1xuICAgICAgaWYgKGkubGluayA9PT0gdXJsKSB7XG4gICAgICAgIGl0ZW0gPSBpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmV0OiBNZW51W10gPSBbXTtcbiAgICBpZiAoIWl0ZW0pIHtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgZG8ge1xuICAgICAgcmV0LnNwbGljZSgwLCAwLCBpdGVtKTtcbiAgICAgIGl0ZW0gPSBpdGVtLl9fcGFyZW50O1xuICAgIH0gd2hpbGUgKGl0ZW0pO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHRvZ2dsZU9wZW4oaXRlbTogTWVudSkge1xuICAgIHRoaXMudG9nZ2xlT3BlblN1YmplY3QubmV4dChpdGVtKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TXV0YXRpb24obWVudXM6IE1lbnVbXSk6IE11dGF0aW9uIHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgLy8g6KeE6IyD5YyW77yM5re75Yqg6YOo5YiG6K6h566X5bGe5oCnXG4gICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUobWVudXMpO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHRvZ2dsZU9wZW5NdXRhdGlvbihtZW51OiBNZW51KTogTXV0YXRpb24ge1xuICAgIHJldHVybiBtZW51cyA9PiB7XG4gICAgICB0aGlzLndhbGsobWVudXMsIG0gPT4ge1xuICAgICAgICBpZiAobS5fX2lkICE9PSBtZW51Ll9faWQpIHtcbiAgICAgICAgICBtLl9vcGVuID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbWVudS5fb3BlbiA9ICFtZW51Ll9vcGVuO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBtZW51cztcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRDdXJyZW50TXV0YXRpb24obWVudTogTWVudSk6IE11dGF0aW9uIHtcbiAgICByZXR1cm4gbWVudXMgPT4ge1xuICAgICAgbGV0IHAgPSBtZW51O1xuXG4gICAgICBpZiAocCkge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgcC5fb3BlbiA9IHRydWU7XG4gICAgICAgICAgcCA9IHAuX19wYXJlbnQ7XG4gICAgICAgIH0gd2hpbGUgKHApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWVudXM7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaE11dGF0aW9uKCk6IE11dGF0aW9uIHtcbiAgICByZXR1cm4gbWVudXMgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplKG1lbnVzKTtcbiAgICB9O1xuICB9XG59XG4iXX0=