UNPKG

dbweb-common

Version:

用`yarn add dbweb-common`安装,不要忘记修改`angular.json`里的 `architect\build\options\assets`,加上

363 lines 38.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { NestedTreeControl } from '@angular/cdk/tree'; import { Component, ViewChild, HostBinding } from '@angular/core'; import { FormControl } from '@angular/forms'; import { MatTreeNestedDataSource } from '@angular/material'; import { Element, ElementsService, CurrentService } from 'dbweb-core'; import { debounceTime, startWith } from 'rxjs/operators'; import { BillComponent } from '../bill/bill.component'; import { RoleBack } from './back'; import { TreeNode } from './tree-node'; var ValidElement = /** @class */ (function (_super) { tslib_1.__extends(ValidElement, _super); function ValidElement(data) { var _this = _super.call(this, tslib_1.__assign({}, data, { NotMenu: true, URL: '' })) || this; _this.Dept = data.Dept; return _this; } return ValidElement; }(Element)); if (false) { /** @type {?} */ ValidElement.prototype.Dept; } var RoleComponent = /** @class */ (function () { function RoleComponent(eles, back, current) { this.eles = eles; this.back = back; this.current = current; this.menuSelectAll = 'all'; this.menuSelectChecked = 'checked'; this.menuSelectNotChecked = 'not-checked'; this.hostClass = true; this.ctrlElementName = new FormControl(); this.ctrlMenuRange = new FormControl(); this.subs = []; this.treeControl = new NestedTreeControl((/** * @param {?} node * @return {?} */ function (node) { return node.children; })); this.dataSource = new MatTreeNestedDataSource(); this.ctrlDeptSelect = new FormControl(); this.hasChild = (/** * @param {?} _ * @param {?} node * @return {?} */ function (_, node) { return !!node.children && node.children.length > 0; }); } /** * @return {?} */ RoleComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.subs.forEach((/** * @param {?} v * @return {?} */ function (v) { return v.unsubscribe(); })); }; /** * @return {?} */ RoleComponent.prototype.refreshFilterElements = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var val = this.ctrlElementName.value || ''; /** @type {?} */ var selectRange = this.ctrlMenuRange.value; /** @type {?} */ var selectDepts = (/** @type {?} */ (this.ctrlDeptSelect.value)); this.filterElements = this.validElements.filter((/** * @param {?} v * @return {?} */ function (v) { return v.title().includes(val) || v.Category.includes(val); })); switch (selectRange) { case this.menuSelectChecked: this.filterElements = this.filterElements.filter((/** * @param {?} v * @return {?} */ function (v) { return _this.roles.find((/** * @param {?} sv * @return {?} */ function (sv) { return sv.EleName === v.Name; })) !== undefined; })); break; case this.menuSelectNotChecked: this.filterElements = this.filterElements.filter((/** * @param {?} v * @return {?} */ function (v) { return _this.roles.find((/** * @param {?} sv * @return {?} */ function (sv) { return sv.EleName === v.Name; })) === undefined; })); break; } // 过滤部门代码 this.filterElements = this.filterElements.filter((/** * @param {?} v * @return {?} */ function (v) { return selectDepts.find((/** * @param {?} sv * @return {?} */ function (sv) { return sv.Code === v.Dept; })); })); this.filterElements = this.filterElements.sort((/** * @param {?} a * @param {?} b * @return {?} */ function (a, b) { return a.title().localeCompare(b.title()); })); this.rootNode = new TreeNode('root', null); this.filterElements.forEach((/** * @param {?} v * @return {?} */ function (v) { _this.rootNode.forceCreate(tslib_1.__spread(v.Category.split('/'), [v.Label || v.Name]), v); })); this.dataSource.data = this.rootNode.children; this.treeControl.dataNodes = this.rootNode.children; // 状态保存不住,总是缩起,所以每次全展开 this.treeControl.expandAll(); }; /** * @return {?} */ RoleComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.subs.push(this.bill.init.subscribe((/** * @return {?} */ function () { _this.bill.typeRecord.Eles = _this.bill.typeRecord.Eles || []; // 新增或编辑,将显示所有的菜单项,否则只显示已经选中的 if (_this.bill.isAdd() || _this.bill.isEdit()) { _this.ctrlMenuRange.patchValue(_this.menuSelectAll); } else { _this.ctrlMenuRange.patchValue(_this.menuSelectChecked); } _this.subs.push(_this.current.change$.subscribe((/** * @return {?} */ function () { _this.back.fetchHasRoleDepts().subscribe((/** * @param {?} depts * @return {?} */ function (depts) { _this.hasRoleDepts = depts; _this.ctrlDeptSelect.patchValue(depts); })); _this.back.fetchEles().subscribe((/** * @param {?} v * @return {?} */ function (v) { // 转换成Element,主要目的是用到它的title函数 _this.validElements = v.map((/** * @param {?} sv * @return {?} */ function (sv) { return new ValidElement(sv); })); _this.subs.push(_this.ctrlElementName.valueChanges .pipe(startWith(''), debounceTime(500)) .subscribe((/** * @return {?} */ function () { return _this.refreshFilterElements(); })), _this.ctrlMenuRange.valueChanges.subscribe((/** * @return {?} */ function () { return _this.refreshFilterElements(); })), _this.ctrlDeptSelect.valueChanges.subscribe((/** * @return {?} */ function () { return _this.refreshFilterElements(); }))); })); }))); }))); }; Object.defineProperty(RoleComponent.prototype, "roles", { get: /** * @return {?} */ function () { return (/** @type {?} */ (this.bill.typeRecord.Eles)); }, enumerable: true, configurable: true }); /** * @param {?} node * @return {?} */ RoleComponent.prototype.treeNodeChecked = /** * @param {?} node * @return {?} */ function (node) { var _this = this; if (node.ele) { return this.roles.find((/** * @param {?} v * @return {?} */ function (v) { return v.EleName === node.ele.Name; })) !== undefined; } else { /** @type {?} */ var foundNotChecked = node.children.find((/** * @param {?} v * @return {?} */ function (v) { return !_this.treeNodeChecked(v); })); return foundNotChecked === undefined; } }; /** * @param {?} node * @param {?} event * @return {?} */ RoleComponent.prototype.changeNodeChecked = /** * @param {?} node * @param {?} event * @return {?} */ function (node, event) { var _this = this; if (event.checked) { if (node.ele) { if (!this.roles.find((/** * @param {?} v * @return {?} */ function (v) { return v.EleName === node.ele.Name; }))) { this.roles.push({ EleName: node.ele.Name, RoleName: this.bill.formGroup.get('Name').value }); } } } else { if (node.ele) { /** @type {?} */ var idx = this.roles.findIndex((/** * @param {?} v * @return {?} */ function (v) { return v.EleName === node.ele.Name; })); if (idx > -1) { this.roles.splice(idx, 1); } } } node.children.forEach((/** * @param {?} v * @return {?} */ function (v) { return _this.changeNodeChecked(v, event); })); }; /** * @param {?} ele * @return {?} */ RoleComponent.prototype.dropEle = /** * @param {?} ele * @return {?} */ function (ele) { /** @type {?} */ var idx = this.roles.findIndex((/** * @param {?} v * @return {?} */ function (v) { return v.EleName === ele.EleName; })); if (idx > -1) { this.roles.splice(idx, 1); } }; RoleComponent.decorators = [ { type: Component, args: [{ selector: 'common-role', template: "<common-bill #bill>\r\n\t<div [formGroup]=\"bill.formGroup\" *ngIf=\"bill.formGroup\" class=\"role mat-elevation-z2\">\r\n\t\t<div class=\"modify-role\">\r\n\t\t\t<div class=\"modify-role-title title-color\">\u4FEE\u6539\u89D2\u8272</div>\r\n\t\t\t<div class=\"modify-role-content\">\r\n\t\t\t\t<div class=\"modify-role-content-input\">\r\n\t\t\t\t\t<span class=\"tips-color\">\u540D\u79F0</span>\r\n\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t<input matInput formControlName=\"Name\" commonBillField>\r\n\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class=\"modify-role-content-input\">\r\n\t\t\t\t\t<span class=\"tips-color\">\u90E8\u95E8</span>\r\n\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t<input matInput formControlName=\"Dept\" commonBillField>\r\n\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class=\"modify-role-content-input role-select\">\r\n\t\t\t\t\t<span class=\"tips-color\">\u4E0B\u7EA7\u53EF\u89C1</span>\r\n\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t<mat-select formControlName=\"VisibleLower\" commonBillField>\r\n\t\t\t\t\t\t\t<mat-option [value]=\"0\">\r\n\t\t\t\t\t\t\t\t\u4E0B\u7EA7\u4E0D\u53EF\u89C1\r\n\t\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t\t\t<mat-option [value]=\"1\">\r\n\t\t\t\t\t\t\t\t\u6240\u6709\u4E0B\u7EA7\r\n\t\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t\t\t<mat-option [value]=\"2\">\r\n\t\t\t\t\t\t\t\t\u4EC5\u76F4\u63A5\u4E0B\u7EA7\r\n\t\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t\t</mat-select>\r\n\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t</div>\r\n\t\t\t\t<!-- \u6682\u65F6\u4E0D\u9700\u8981,\u4E0D\u7528\u5220\u9664 -->\r\n\t\t\t\t<!-- <div class=\"modify-role-content-input\">\r\n\t\t\t\t\t<span class=\"tips-color\">\u53EF\u89C1\u6027\u8868\u8FBE\u5F0F</span>\r\n\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t<input matInput formControlName=\"Visible\" commonBillField>\r\n\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t</div> -->\r\n\t\t\t\t<mat-checkbox class=\"title-color\" #check trueFalseValue [trueValue]=\"1\" [falseValue]=\"0\"\r\n\t\t\t\t\tformControlName=\"VisibleSelf\" commonBillField>\u672C\u7EA7\u53EF\u89C1</mat-checkbox>\r\n\t\t\t</div>\r\n\t\t\t<div class=\"menu-item-title tips-color\">\u83DC\u5355\u9879</div>\r\n\t\t\t<div class=\"menu-item-content\">\r\n\t\t\t\t<div class=\"menu-item-role\" *ngFor=\"let ele of roles\">{{ele.EleName}}<mat-icon\r\n\t\t\t\t\t\t*ngIf=\"bill.isAdd()||bill.isEdit()\" svgIcon=\"cancel\" (click)=\"dropEle(ele)\">\r\n\t\t\t\t\t</mat-icon>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<div class=\"menu-tree\">\r\n\t\t\t<div class=\"menu-tree-title\">\r\n\t\t\t\t<span class=\"tips-color\">\u53EF\u6DFB\u52A0\u83DC\u5355\u9879</span>\r\n\t\t\t\t<mat-form-field class=\"tips-color\">\r\n\t\t\t\t\t<mat-select [formControl]=\"ctrlDeptSelect\" multiple>\r\n\t\t\t\t\t\t<mat-option *ngFor=\"let oneDept of hasRoleDepts\"\r\n\t\t\t\t\t\t\t[value]=\"oneDept\">\r\n\t\t\t\t\t\t\t{{oneDept.Name}}</mat-option>\r\n\t\t\t\t\t</mat-select>\r\n\t\t\t\t</mat-form-field>\r\n\t\t\t</div>\r\n\t\t\t<div class=\"menu-tree-screen\">\r\n\t\t\t\t<mat-form-field appearance=\"outline\" class=\"ctrlMenuRange\">\r\n\t\t\t\t\t<mat-select [formControl]=\"ctrlMenuRange\">\r\n\t\t\t\t\t\t<mat-option [value]=\"menuSelectAll\"> \u6240\u6709 </mat-option>\r\n\t\t\t\t\t\t<mat-option [value]=\"menuSelectChecked\"> \u9009\u4E2D</mat-option>\r\n\t\t\t\t\t\t<mat-option [value]=\"menuSelectNotChecked\"> \u672A\u9009\u4E2D</mat-option>\r\n\t\t\t\t\t</mat-select>\r\n\t\t\t\t</mat-form-field>\r\n\t\t\t\t<mat-form-field appearance=\"outline\" class=\"ctrlElementName\" *ngIf=\"bill.isEdit()||bill.isAdd()\">\r\n\t\t\t\t\t<input matInput [formControl]=\"ctrlElementName\" placeholder=\"\u8F93\u5165\u5173\u952E\u5B57\u7B5B\u9009\">\r\n\t\t\t\t</mat-form-field>\r\n\t\t\t</div>\r\n\t\t\t<div class=\"tree\">\r\n\t\t\t\t<mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\r\n\t\t\t\t\t<!-- This is the tree node template for leaf nodes -->\r\n\t\t\t\t\t<mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle>\r\n\t\t\t\t\t\t<li class=\"mat-tree-node tips-color\">\r\n\t\t\t\t\t\t\t<!-- use a disabled button to provide padding for tree leaf -->\r\n\t\t\t\t\t\t\t<button mat-icon-button disabled></button>\r\n\t\t\t\t\t\t\t<mat-checkbox [checked]=\"treeNodeChecked(node)\"\r\n\t\t\t\t\t\t\t\t[disabled]=\"bill.isBrowse()||bill.isDelete()\" (change)=\"changeNodeChecked(node,$event)\">\r\n\t\t\t\t\t\t\t\t{{node.item}}</mat-checkbox>\r\n\t\t\t\t\t\t\t<mat-icon *ngIf=\"node.iconName\" class=\"tree-icon\" svgIcon=\"{{node.iconName}}\"></mat-icon>\r\n\t\t\t\t\t\t\t{{node.title()}}\r\n\t\t\t\t\t\t</li>\r\n\t\t\t\t\t</mat-tree-node>\r\n\t\t\t\t\t<!-- This is the tree node template for expandable nodes -->\r\n\t\t\t\t\t<mat-nested-tree-node *matTreeNodeDef=\"let node; when: hasChild\">\r\n\t\t\t\t\t\t<li>\r\n\t\t\t\t\t\t\t<div class=\"mat-tree-node tips-color\">\r\n\t\t\t\t\t\t\t\t<button mat-icon-button matTreeNodeToggle [attr.aria-label]=\"'toggle ' + node.name\">\r\n\t\t\t\t\t\t\t\t\t<mat-icon class=\"mat-icon-rtl-mirror\"\r\n\t\t\t\t\t\t\t\t\t\t[svgIcon]=\"treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'\">\r\n\t\t\t\t\t\t\t\t\t</mat-icon>\r\n\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t<mat-checkbox [checked]=\"treeNodeChecked(node)\"\r\n\t\t\t\t\t\t\t\t\t[disabled]=\"bill.isBrowse()||bill.isDelete()\"\r\n\t\t\t\t\t\t\t\t\t(change)=\"changeNodeChecked(node,$event)\">\r\n\t\t\t\t\t\t\t\t\t{{node.item}}</mat-checkbox>\r\n\t\t\t\t\t\t\t\t<mat-icon *ngIf=\"node.iconName\" class=\"tree-icon\" svgIcon=\"{{node.iconName}}\">\r\n\t\t\t\t\t\t\t\t</mat-icon>\r\n\t\t\t\t\t\t\t\t{{node.title()}}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<ul [class.tree-invisible]=\"!treeControl.isExpanded(node)\">\r\n\t\t\t\t\t\t\t\t<ng-container matTreeNodeOutlet></ng-container>\r\n\t\t\t\t\t\t\t</ul>\r\n\t\t\t\t\t\t</li>\r\n\t\t\t\t\t</mat-nested-tree-node>\r\n\t\t\t\t</mat-tree>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</common-bill>", providers: [RoleBack], styles: [".tree-invisible{display:none}.tree li,.tree ul{margin-top:0;margin-bottom:0;list-style-type:none}.tree ul{padding-left:28px}.role{max-width:960px;margin:14px auto;height:calc(100% - 28px);border-radius:4px;display:flex}.role .modify-role{width:0;flex-grow:1;height:100%;padding:24px 24px 8px;box-sizing:border-box;display:flex;flex-direction:column}.role .modify-role .modify-role-title{font-size:20px;font-weight:700;margin-bottom:24px}.role .modify-role .modify-role-content{width:100%;display:flex;flex-wrap:wrap;align-items:flex-end}.role .modify-role .modify-role-content .modify-role-content-input{width:168px;margin:0 24px 16px 0}.role .modify-role .modify-role-content .modify-role-content-input span{display:block;font-size:12px;margin-bottom:8px}.role .modify-role .modify-role-content .modify-role-content-input .mat-form-field{width:100%;font-size:14px}.role .modify-role .modify-role-content .role-select{width:120px}.role .modify-role .modify-role-content .mat-checkbox{font-size:14px;margin:0 0 16px}.role .modify-role .menu-item-title{font-size:12px;margin-top:8px}.role .modify-role .menu-item-content{width:100%;flex-grow:1;overflow-y:auto;display:flex;flex-wrap:wrap;align-content:flex-start}.role .modify-role .menu-item-content .menu-item-role{height:32px;padding:0 8px 0 16px;font-size:14px;border-radius:16px;margin:8px 16px 0 0;display:flex;justify-content:space-between;align-items:center}.role .modify-role .menu-item-content .menu-item-role .mat-icon{width:18px;height:18px;line-height:18px;margin-left:8px;cursor:pointer}.role .menu-tree{max-height:100%;width:298px;flex-shrink:0;padding:16px 0 8px;box-sizing:border-box;display:flex;flex-direction:column}.role .menu-tree .menu-tree-title .mat-form-field ::ng-deep .mat-form-field-underline{display:none}.role .menu-tree .menu-tree-screen{padding:0 8px 8px 16px;font-size:12px;display:flex;align-items:center}.role .menu-tree .menu-tree-screen .ctrlElementName{width:170px;font-size:12px;margin-left:8px}.role .menu-tree .menu-tree-screen .ctrlMenuRange{width:88px;font-size:12px}.role .menu-tree .menu-tree-title{padding:0 8px 8px 16px;display:flex;justify-content:space-between;align-items:center}.role .menu-tree .menu-tree-title span{font-size:20px;font-weight:700}.role .menu-tree .menu-tree-title .mat-form-field{width:128px;font-size:12px;font-weight:700;text-align:right;box-sizing:border-box}.role .menu-tree .tree{flex-grow:1;padding-right:8px;box-sizing:border-box;overflow-y:auto;font-size:14px}.role .menu-tree .tree .mat-tree-node{min-height:40px;height:40px}.role .menu-tree .tree .mat-checkbox{margin-right:8px;vertical-align:top;line-height:16px;height:16px}.role .menu-tree .tree .tree-icon{vertical-align:top;width:16px;height:16px;line-height:16px;margin-right:8px}.role .mat-form-field ::ng-deep .mat-form-field-wrapper{margin:0;padding-bottom:0}.role .mat-form-field ::ng-deep .mat-form-field-infix{border:0;padding:8px 0;height:30px;box-sizing:border-box}.role .mat-form-field ::ng-deep .mat-select-arrow-wrapper{display:block}"] }] } ]; /** @nocollapse */ RoleComponent.ctorParameters = function () { return [ { type: ElementsService }, { type: RoleBack }, { type: CurrentService } ]; }; RoleComponent.propDecorators = { hostClass: [{ type: HostBinding, args: ['class.c-role',] }], bill: [{ type: ViewChild, args: ['bill', { static: true },] }] }; return RoleComponent; }()); export { RoleComponent }; if (false) { /** @type {?} */ RoleComponent.prototype.menuSelectAll; /** @type {?} */ RoleComponent.prototype.menuSelectChecked; /** @type {?} */ RoleComponent.prototype.menuSelectNotChecked; /** @type {?} */ RoleComponent.prototype.hostClass; /** @type {?} */ RoleComponent.prototype.bill; /** @type {?} */ RoleComponent.prototype.ctrlElementName; /** @type {?} */ RoleComponent.prototype.ctrlMenuRange; /** @type {?} */ RoleComponent.prototype.filterElements; /** * @type {?} * @private */ RoleComponent.prototype.subs; /** @type {?} */ RoleComponent.prototype.rootNode; /** @type {?} */ RoleComponent.prototype.treeControl; /** @type {?} */ RoleComponent.prototype.dataSource; /** @type {?} */ RoleComponent.prototype.validElements; /** @type {?} */ RoleComponent.prototype.ctrlDeptSelect; /** @type {?} */ RoleComponent.prototype.hasRoleDepts; /** @type {?} */ RoleComponent.prototype.hasChild; /** @type {?} */ RoleComponent.prototype.eles; /** * @type {?} * @private */ RoleComponent.prototype.back; /** @type {?} */ RoleComponent.prototype.current; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9kYndlYi1jb21tb24vIiwic291cmNlcyI6WyJsaWIvcm9sZS9yb2xlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQXFCLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBcUIsdUJBQXVCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMvRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQW1CLE1BQU0sWUFBWSxDQUFDO0FBRXZGLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBVyxRQUFRLEVBQW9CLE1BQU0sUUFBUSxDQUFDO0FBQzdELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFdkM7SUFBMkIsd0NBQU87SUFFakMsc0JBQVksSUFBc0I7UUFBbEMsWUFDQyx1Q0FBVyxJQUFJLElBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFHLFNBRTFDO1FBREEsS0FBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDOztJQUN2QixDQUFDO0lBQ0YsbUJBQUM7QUFBRCxDQUFDLEFBTkQsQ0FBMkIsT0FBTyxHQU1qQzs7O0lBTEEsNEJBQWE7O0FBTWQ7SUF1QkMsdUJBQW1CLElBQXFCLEVBQVUsSUFBYyxFQUFTLE9BQXVCO1FBQTdFLFNBQUksR0FBSixJQUFJLENBQWlCO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBVTtR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TUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUMxQjtJQUNGLENBQUM7O2dCQTNIRCxTQUFTLFNBQUM7b0JBQ1YsUUFBUSxFQUFFLGFBQWE7b0JBQ3ZCLHk2TEFBb0M7b0JBRXBDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7aUJBQ3JCOzs7O2dCQW5CaUIsZUFBZTtnQkFJZixRQUFRO2dCQUpTLGNBQWM7Ozs0QkF3Qi9DLFdBQVcsU0FBQyxjQUFjO3VCQUMxQixTQUFTLFNBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTs7SUFpSHBDLG9CQUFDO0NBQUEsQUE1SEQsSUE0SEM7U0F0SFksYUFBYTs7O0lBQ3pCLHNDQUErQjs7SUFDL0IsMENBQXVDOztJQUN2Qyw2Q0FBOEM7O0lBQzlDLGtDQUE4Qzs7SUFDOUMsNkJBQ29COztJQUNwQix3Q0FBb0M7O0lBQ3BDLHNDQUFrQzs7SUFDbEMsdUNBQStCOzs7OztJQUMvQiw2QkFBa0M7O0lBQ2xDLGlDQUFtQjs7SUFDbkIsb0NBQXFFOztJQUNyRSxtQ0FBcUQ7O0lBQ3JELHNDQUE4Qjs7SUFDOUIsdUNBQW1DOztJQUNuQyxxQ0FBc0I7O0lBc0V0QixpQ0FBc0Y7O0lBckUxRSw2QkFBNEI7Ozs7O0lBQUUsNkJBQXNCOztJQUFFLGdDQUE4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5lc3RlZFRyZWVDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RyZWUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3Q2hpbGQsIEhvc3RCaW5kaW5nIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveENoYW5nZSwgTWF0VHJlZU5lc3RlZERhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XHJcbmltcG9ydCB7IEVsZW1lbnQsIEVsZW1lbnRzU2VydmljZSwgQ3VycmVudFNlcnZpY2UsIElEZXB0LCBJRWxlbWVudCB9IGZyb20gJ2Rid2ViLWNvcmUnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIGZvcmtKb2luIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgc3RhcnRXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBCaWxsQ29tcG9uZW50IH0gZnJvbSAnLi4vYmlsbC9iaWxsLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFJvbGVFbGUsIFJvbGVCYWNrLCBSb2xlVmFsaWRFbGVtZW50IH0gZnJvbSAnLi9iYWNrJztcclxuaW1wb3J0IHsgVHJlZU5vZGUgfSBmcm9tICcuL3RyZWUtbm9kZSc7XHJcblxyXG5jbGFzcyBWYWxpZEVsZW1lbnQgZXh0ZW5kcyBFbGVtZW50IHtcclxuXHREZXB0OiBTdHJpbmc7XHJcblx0Y29uc3RydWN0b3IoZGF0YTogUm9sZVZhbGlkRWxlbWVudCkge1xyXG5cdFx0c3VwZXIoeyAuLi5kYXRhLCBOb3RNZW51OiB0cnVlLCBVUkw6ICcnIH0pO1xyXG5cdFx0dGhpcy5EZXB0ID0gZGF0YS5EZXB0O1xyXG5cdH1cclxufVxyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogJ2NvbW1vbi1yb2xlJyxcclxuXHR0ZW1wbGF0ZVVybDogJy4vcm9sZS5jb21wb25lbnQuaHRtbCcsXHJcblx0c3R5bGVVcmxzOiBbJy4vcm9sZS5jb21wb25lbnQuc2NzcyddLFxyXG5cdHByb3ZpZGVyczogW1JvbGVCYWNrXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUm9sZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHRyZWFkb25seSBtZW51U2VsZWN0QWxsID0gJ2FsbCc7XHJcblx0cmVhZG9ubHkgbWVudVNlbGVjdENoZWNrZWQgPSAnY2hlY2tlZCc7XHJcblx0cmVhZG9ubHkgbWVudVNlbGVjdE5vdENoZWNrZWQgPSAnbm90LWNoZWNrZWQnO1xyXG5cdEBIb3N0QmluZGluZygnY2xhc3MuYy1yb2xlJykgaG9zdENsYXNzID0gdHJ1ZTtcclxuXHRAVmlld0NoaWxkKCdiaWxsJywgeyBzdGF0aWM6IHRydWUgfSlcclxuXHRiaWxsOiBCaWxsQ29tcG9uZW50O1xyXG5cdGN0cmxFbGVtZW50TmFtZSA9IG5ldyBGb3JtQ29udHJvbCgpO1xyXG5cdGN0cmxNZW51UmFuZ2UgPSBuZXcgRm9ybUNvbnRyb2woKTtcclxuXHRmaWx0ZXJFbGVtZW50czogVmFsaWRFbGVtZW50W107XHJcblx0cHJpdmF0ZSBzdWJzOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG5cdHJvb3ROb2RlOiBUcmVlTm9kZTtcclxuXHR0cmVlQ29udHJvbCA9IG5ldyBOZXN0ZWRUcmVlQ29udHJvbDxUcmVlTm9kZT4obm9kZSA9PiBub2RlLmNoaWxkcmVuKTtcclxuXHRkYXRhU291cmNlID0gbmV3IE1hdFRyZWVOZXN0ZWREYXRhU291cmNlPFRyZWVOb2RlPigpO1xyXG5cdHZhbGlkRWxlbWVudHM6IFZhbGlkRWxlbWVudFtdO1xyXG5cdGN0cmxEZXB0U2VsZWN0ID0gbmV3IEZvcm1Db250cm9sKCk7XHJcblx0aGFzUm9sZURlcHRzOiBJRGVwdFtdO1xyXG5cdGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVzOiBFbGVtZW50c1NlcnZpY2UsIHByaXZhdGUgYmFjazogUm9sZUJhY2ssIHB1YmxpYyBjdXJyZW50OiBDdXJyZW50U2VydmljZSkge31cclxuXHRuZ09uRGVzdHJveSgpIHtcclxuXHRcdHRoaXMuc3Vicy5mb3JFYWNoKHYgPT4gdi51bnN1YnNjcmliZSgpKTtcclxuXHR9XHJcblx0cmVmcmVzaEZpbHRlckVsZW1lbnRzKCkge1xyXG5cdFx0Y29uc3QgdmFsID0gdGhpcy5jdHJsRWxlbWVudE5hbWUudmFsdWUgfHwgJyc7XHJcblx0XHRjb25zdCBzZWxlY3RSYW5nZSA9IHRoaXMuY3RybE1lbnVSYW5nZS52YWx1ZTtcclxuXHRcdGNvbnN0IHNlbGVjdERlcHRzID0gdGhpcy5jdHJsRGVwdFNlbGVjdC52YWx1ZSBhcyBJRGVwdFtdO1xyXG5cdFx0dGhpcy5maWx0ZXJFbGVtZW50cyA9IHRoaXMudmFsaWRFbGVtZW50cy5maWx0ZXIodiA9PiB2LnRpdGxlKCkuaW5jbHVkZXModmFsKSB8fCB2LkNhdGVnb3J5LmluY2x1ZGVzKHZhbCkpO1xyXG5cdFx0c3dpdGNoIChzZWxlY3RSYW5nZSkge1xyXG5cdFx0XHRjYXNlIHRoaXMubWVudVNlbGVjdENoZWNrZWQ6XHJcblx0XHRcdFx0dGhpcy5maWx0ZXJFbGVtZW50cyA9IHRoaXMuZmlsdGVyRWxlbWVudHMuZmlsdGVyKFxyXG5cdFx0XHRcdFx0diA9PiB0aGlzLnJvbGVzLmZpbmQoc3YgPT4gc3YuRWxlTmFtZSA9PT0gdi5OYW1lKSAhPT0gdW5kZWZpbmVkXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSB0aGlzLm1lbnVTZWxlY3ROb3RDaGVja2VkOlxyXG5cdFx0XHRcdHRoaXMuZmlsdGVyRWxlbWVudHMgPSB0aGlzLmZpbHRlckVsZW1lbnRzLmZpbHRlcihcclxuXHRcdFx0XHRcdHYgPT4gdGhpcy5yb2xlcy5maW5kKHN2ID0+IHN2LkVsZU5hbWUgPT09IHYuTmFtZSkgPT09IHVuZGVmaW5lZFxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHR9XHJcblx0XHQvLyDov4fmu6Tpg6jpl6jku6PnoIFcclxuXHRcdHRoaXMuZmlsdGVyRWxlbWVudHMgPSB0aGlzLmZpbHRlckVsZW1lbnRzLmZpbHRlcih2ID0+IHNlbGVjdERlcHRzLmZpbmQoc3YgPT4gc3YuQ29kZSA9PT0gdi5EZXB0KSk7XHJcblx0XHR0aGlzLmZpbHRlckVsZW1lbnRzID0gdGhpcy5maWx0ZXJFbGVtZW50cy5zb3J0KChhLCBiKSA9PiBhLnRpdGxlKCkubG9jYWxlQ29tcGFyZShiLnRpdGxlKCkpKTtcclxuXHRcdHRoaXMucm9vdE5vZGUgPSBuZXcgVHJlZU5vZGUoJ3Jvb3QnLCBudWxsKTtcclxuXHRcdHRoaXMuZmlsdGVyRWxlbWVudHMuZm9yRWFjaCh2ID0+IHtcclxuXHRcdFx0dGhpcy5yb290Tm9kZS5mb3JjZUNyZWF0ZShbLi4udi5DYXRlZ29yeS5zcGxpdCgnLycpLCB2LkxhYmVsIHx8IHYuTmFtZV0sIHYpO1xyXG5cdFx0fSk7XHJcblx0XHR0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMucm9vdE5vZGUuY2hpbGRyZW47XHJcblx0XHR0aGlzLnRyZWVDb250cm9sLmRhdGFOb2RlcyA9IHRoaXMucm9vdE5vZGUuY2hpbGRyZW47XHJcblx0XHQvLyDnirbmgIHkv53lrZjkuI3kvY/vvIzmgLvmmK/nvKnotbfvvIzmiYDku6Xmr4/mrKHlhajlsZXlvIBcclxuXHRcdHRoaXMudHJlZUNvbnRyb2wuZXhwYW5kQWxsKCk7XHJcblx0fVxyXG5cdG5nT25Jbml0KCkge1xyXG5cdFx0dGhpcy5zdWJzLnB1c2goXHJcblx0XHRcdHRoaXMuYmlsbC5pbml0LnN1YnNjcmliZSgoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5iaWxsLnR5cGVSZWNvcmQuRWxlcyA9IHRoaXMuYmlsbC50eXBlUmVjb3JkLkVsZXMgfHwgW107XHJcblx0XHRcdFx0Ly8g5paw5aKe5oiW57yW6L6R77yM5bCG5pi+56S65omA5pyJ55qE6I+c5Y2V6aG577yM5ZCm5YiZ5Y+q5pi+56S65bey57uP6YCJ5Lit55qEXHJcblx0XHRcdFx0aWYgKHRoaXMuYmlsbC5pc0FkZCgpIHx8IHRoaXMuYmlsbC5pc0VkaXQoKSkge1xyXG5cdFx0XHRcdFx0dGhpcy5jdHJsTWVudVJhbmdlLnBhdGNoVmFsdWUodGhpcy5tZW51U2VsZWN0QWxsKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dGhpcy5jdHJsTWVudVJhbmdlLnBhdGNoVmFsdWUodGhpcy5tZW51U2VsZWN0Q2hlY2tlZCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRoaXMuc3Vicy5wdXNoKFxyXG5cdFx0XHRcdFx0dGhpcy5jdXJyZW50LmNoYW5nZSQuc3Vic2NyaWJlKCgpID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5iYWNrLmZldGNoSGFzUm9sZURlcHRzKCkuc3Vic2NyaWJlKGRlcHRzID0+IHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmhhc1JvbGVEZXB0cyA9IGRlcHRzO1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuY3RybERlcHRTZWxlY3QucGF0Y2hWYWx1ZShkZXB0cyk7XHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdFx0dGhpcy5iYWNrLmZldGNoRWxlcygpLnN1YnNjcmliZSh2ID0+IHtcclxuXHRcdFx0XHRcdFx0XHQvLyDovazmjaLmiJBFbGVtZW5077yM5Li76KaB55uu55qE5piv55So5Yiw5a6D55qEdGl0bGXlh73mlbBcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnZhbGlkRWxlbWVudHMgPSB2Lm1hcChzdiA9PiBuZXcgVmFsaWRFbGVtZW50KHN2KSk7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5zdWJzLnB1c2goXHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmN0cmxFbGVtZW50TmFtZS52YWx1ZUNoYW5nZXNcclxuXHRcdFx0XHRcdFx0XHRcdFx0LnBpcGUoc3RhcnRXaXRoKCcnKSwgZGVib3VuY2VUaW1lKDUwMCkpXHJcblx0XHRcdFx0XHRcdFx0XHRcdC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZWZyZXNoRmlsdGVyRWxlbWVudHMoKSksXHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmN0cmxNZW51UmFuZ2UudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlZnJlc2hGaWx0ZXJFbGVtZW50cygpKSxcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuY3RybERlcHRTZWxlY3QudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlZnJlc2hGaWx0ZXJFbGVtZW50cygpKVxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fSlcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHR9XHJcblx0Z2V0IHJvbGVzKCk6IFJvbGVFbGVbXSB7XHJcblx0XHRyZXR1cm4gdGhpcy5iaWxsLnR5cGVSZWNvcmQuRWxlcyBhcyBSb2xlRWxlW107XHJcblx0fVxyXG5cdGhhc0NoaWxkID0gKF86IG51bWJlciwgbm9kZTogVHJlZU5vZGUpID0+ICEhbm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDA7XHJcblx0dHJlZU5vZGVDaGVja2VkKG5vZGU6IFRyZWVOb2RlKTogYm9vbGVhbiB7XHJcblx0XHRpZiAobm9kZS5lbGUpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMucm9sZXMuZmluZCh2ID0+IHYuRWxlTmFtZSA9PT0gbm9kZS5lbGUuTmFtZSkgIT09IHVuZGVmaW5lZDtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGNvbnN0IGZvdW5kTm90Q2hlY2tlZCA9IG5vZGUuY2hpbGRyZW4uZmluZCh2ID0+ICF0aGlzLnRyZWVOb2RlQ2hlY2tlZCh2KSk7XHJcblx0XHRcdHJldHVybiBmb3VuZE5vdENoZWNrZWQgPT09IHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHR9XHJcblx0Y2hhbmdlTm9kZUNoZWNrZWQobm9kZTogVHJlZU5vZGUsIGV2ZW50OiBNYXRDaGVja2JveENoYW5nZSkge1xyXG5cdFx0aWYgKGV2ZW50LmNoZWNrZWQpIHtcclxuXHRcdFx0aWYgKG5vZGUuZWxlKSB7XHJcblx0XHRcdFx0aWYgKCF0aGlzLnJvbGVzLmZpbmQodiA9PiB2LkVsZU5hbWUgPT09IG5vZGUuZWxlLk5hbWUpKSB7XHJcblx0XHRcdFx0XHR0aGlzLnJvbGVzLnB1c2goeyBFbGVOYW1lOiBub2RlLmVsZS5OYW1lLCBSb2xlTmFtZTogdGhpcy5iaWxsLmZvcm1Hcm91cC5nZXQoJ05hbWUnKS52YWx1ZSB9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGlmIChub2RlLmVsZSkge1xyXG5cdFx0XHRcdGNvbnN0IGlkeCA9IHRoaXMucm9sZXMuZmluZEluZGV4KHYgPT4gdi5FbGVOYW1lID09PSBub2RlLmVsZS5OYW1lKTtcclxuXHRcdFx0XHRpZiAoaWR4ID4gLTEpIHtcclxuXHRcdFx0XHRcdHRoaXMucm9sZXMuc3BsaWNlKGlkeCwgMSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRub2RlLmNoaWxkcmVuLmZvckVhY2godiA9PiB0aGlzLmNoYW5nZU5vZGVDaGVja2VkKHYsIGV2ZW50KSk7XHJcblx0fVxyXG5cdGRyb3BFbGUoZWxlOiBSb2xlRWxlKSB7XHJcblx0XHRjb25zdCBpZHggPSB0aGlzLnJvbGVzLmZpbmRJbmRleCh2ID0+IHYuRWxlTmFtZSA9PT0gZWxlLkVsZU5hbWUpO1xyXG5cdFx0aWYgKGlkeCA+IC0xKSB7XHJcblx0XHRcdHRoaXMucm9sZXMuc3BsaWNlKGlkeCwgMSk7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbiJdfQ==