@ecip/permission
Version:
404 lines • 37.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ViewChild } from '@angular/core';
import { ModalHelper } from '@delon/theme';
import { STComponent } from '@delon/abc';
import { NzMessageService } from 'ng-zorro-antd';
import { PermissionRoleEditComponent } from "./edit/edit.component";
import { PermissionRoleViewComponent } from "./view/view.component";
import { TreeService } from "@ecip/shared";
import { PermissionRoleUserComponent } from "./user/role.user.component";
import { AppsService, ResourceService, RoleService } from "@ecip/service";
export class PermissionRoleComponent {
/**
* @param {?} modal
* @param {?} msgSrv
* @param {?} roleService
* @param {?} resourceService
* @param {?} treeService
* @param {?} appsService
*/
constructor(modal, msgSrv, roleService, resourceService, treeService, appsService) {
this.modal = modal;
this.msgSrv = msgSrv;
this.roleService = roleService;
this.resourceService = resourceService;
this.treeService = treeService;
this.appsService = appsService;
this.url = `api/v1/sysrRole/list`;
this.searchSchema = {
properties: {
id: {
type: 'string',
title: '编号'
}
}
};
this.columns = [
// { title: '编号', index: 'id' },
{ title: '', index: 'id', type: 'radio' },
// { title: '应用系统', index: 'appId' },
{ title: '角色名称', index: 'roleName' },
{ title: '编码', index: 'code' },
{ title: '角色状态', index: 'statusText' },
// { title: '排序', index: 'sortNum' },
// { title: '创建时间', type: 'date', index: 'createTime' },
{
title: '操作',
width: '100px',
buttons: [
{ text: '删除', type: 'del', click: (/**
* @param {?} item
* @return {?}
*/
(item) => {
//删除
this.roleService.deleteById(item.id).subscribe((/**
* @param {?} res
* @return {?}
*/
res => {
this.msgSrv.success('删除成功');
this.st.reload();
}));
}),
acl: { ability: ['permission:remove'] }
},
{
text: '',
children: [
{ text: '查看', type: 'static', component: PermissionRoleViewComponent, click: 'reload', acl: { ability: ['role:view'] } },
{ text: '编辑', type: 'none',
click: (/**
* @param {?} record
* @return {?}
*/
(record) => {
this.modal
.createStatic(PermissionRoleEditComponent, { appId: this.appId, record: record })
.subscribe((/**
* @return {?}
*/
() => this.st.reload()));
}),
acl: { ability: ['role:edit'] }
},
{ text: '人员', type: 'static', component: PermissionRoleUserComponent, click: 'reload', acl: { ability: ['member:choose'] } }
],
},
]
}
];
this.appId = -1;
this.data = [];
this.dataList = []; //所有节点数组
//所有节点数组
this.expandDataCache = {};
this.allChecked = false;
this.indeterminate = false;
this.listOfSelection = [
{
text: '全选',
onSelect: (/**
* @return {?}
*/
() => {
this.checkAll(true);
})
},
{
text: '全不选',
onSelect: (/**
* @return {?}
*/
() => {
this.checkAll(false);
})
}
];
}
/**
* @param {?=} $event
* @return {?}
*/
refreshStatus($event) {
if (!this.selectedRole) {
this.msgSrv.warning('请选择角色');
return;
}
/** @type {?} */
const allChecked = this.dataList.every((/**
* @param {?} value
* @return {?}
*/
value => value.checked === true));
/** @type {?} */
const allUnChecked = this.dataList.every((/**
* @param {?} value
* @return {?}
*/
value => !value.checked));
this.allChecked = allChecked;
this.indeterminate = (!allChecked) && (!allUnChecked);
}
/**
* @param {?} value
* @return {?}
*/
checkAll(value) {
if (!this.selectedRole) {
this.msgSrv.warning('请选择要授权的角色');
return;
}
this.dataList.forEach((/**
* @param {?} data
* @return {?}
*/
data => {
if (!data.disabled) {
data.checked = value;
}
}));
this.refreshStatus();
}
/**
* @param {?} value
* @return {?}
*/
expandAll(value) {
this.dataList.forEach((/**
* @param {?} data
* @return {?}
*/
data => {
data.expand = value;
}));
}
/**
* @return {?}
*/
ngOnInit() {
this.st.req.params = { appId: this.appId };
this.appsService.getList().subscribe((/**
* @param {?} appList
* @return {?}
*/
appList => {
this.appList = appList;
}));
this.appChange();
}
/**
* @return {?}
*/
appChange() {
this.selectedRole = null;
this.st.reload({ appId: this.appId });
this.resourceService.findTree({ appId: this.appId }).subscribe((/**
* @param {?} res
* @return {?}
*/
(res) => {
this.data = res;
this.data.forEach((/**
* @param {?} item
* @return {?}
*/
item => {
this.expandDataCache[item.id] = TreeService.convertTreeToList(item);
this.dataList = [...this.dataList, ...this.expandDataCache[item.id]];
}));
}));
}
/**
* @return {?}
*/
add() {
this.modal
.createStatic(PermissionRoleEditComponent, { appId: this.appId })
.subscribe((/**
* @return {?}
*/
() => this.st.reload({ appId: this.appId })));
}
/**
* @param {?} item
* @return {?}
*/
radioChange(item) {
if (!item.radio) {
return;
}
item = item.radio;
this.selectedRole = item;
this.roleService.findResource(item.id).subscribe((/**
* @param {?} res
* @return {?}
*/
(res) => {
this.dataList.forEach((/**
* @param {?} _item
* @return {?}
*/
_item => {
if (res.includes(_item.id)) {
_item.assign = '已授权';
}
else {
_item.assign = '未授权';
}
}));
}));
}
/**
* @return {?}
*/
assign() {
if (!this.selectedRole) {
this.msgSrv.warning('请选择要授权的角色');
return;
}
console.log('assign');
/** @type {?} */
let resourceIds = this.getCheckIds();
if (resourceIds.length == 0) {
this.msgSrv.warning('请选择要授权的资源');
return;
}
this.roleService.saveResource(this.selectedRole.id, resourceIds).subscribe((/**
* @param {?} res
* @return {?}
*/
res => {
this.msgSrv.success('授权成功');
// this.dataList.filter(item => item.).checked = true;
this.dataList.forEach((/**
* @param {?} item
* @return {?}
*/
item => {
if (item.checked === true) {
item.assign = '已授权';
}
}));
}));
}
/**
* @return {?}
*/
cancel() {
if (!this.selectedRole) {
this.msgSrv.warning('请选择要取消授权的角色');
return;
}
console.log('cancel');
/** @type {?} */
let resourceIds = this.getCheckIds();
if (resourceIds.length == 0) {
this.msgSrv.warning('请选择要取消授权的资源');
return;
}
this.roleService.deleteResource(this.selectedRole.id, resourceIds).subscribe((/**
* @param {?} res
* @return {?}
*/
res => {
this.msgSrv.success('取消授权成功');
// this.dataList.filter(item => item.).checked = true;
this.dataList.forEach((/**
* @param {?} item
* @return {?}
*/
item => {
if (item.checked === true) {
item.assign = '未授权';
}
}));
}));
}
/**
* @return {?}
*/
getCheckIds() {
/** @type {?} */
let checkIds = [];
this.dataList.forEach((/**
* @param {?} item
* @return {?}
*/
item => {
if (item.checked === true) {
checkIds.push(item.id);
}
}));
return checkIds;
}
}
PermissionRoleComponent.decorators = [
{ type: Component, args: [{
selector: 'app-permission-role',
template: "<page-header [action]=\"phPhAction\">\r\n <ng-template #phPhAction>\r\n <button acl [acl-ability]=\"'role:add'\" (click)=\"add()\" nz-button nzType=\"primary\">\u65B0\u5EFA</button>\r\n </ng-template>\r\n</page-header>\r\n<nz-card>\r\n <div nz-row>\r\n <div nz-col nzSpan=\"12\">\r\n <!--<sf mode=\"search\" [schema]=\"searchSchema\" (formSubmit)=\"st.reset($event)\" (formReset)=\"st.reset($event)\"></sf>-->\r\n <nz-affix [nzOffsetTop]=\"80\">\r\n <form nz-form [nzLayout]=\"'inline'\">\r\n <!--<nz-form-item> <nz-col class=\"ant-form-item-control-wrapper\"> <div class=\"ant-form-item-control\"> <button nz-popconfirm nzTitle=\"\u786E\u8BA4\u6388\u6743\u5417?\" (nzOnConfirm)=\"assign()\" nz-button nzType=\"primary\">\u6388\u6743</button> <button nz-popconfirm nzTitle=\"\u786E\u8BA4\u53D6\u6D88\u6388\u6743\u5417?\" (nzOnConfirm)=\"cancel()\" nz-button nzType=\"warning\">\u53D6\u6D88\u6388\u6743</button> </div> </nz-col> </nz-form-item>-->\r\n <nz-form-item>\r\n <nz-form-label>\u7CFB\u7EDF</nz-form-label>\r\n <nz-col class=\"ant-form-item-control-wrapper\">\r\n <div class=\"ant-form-item-control\">\r\n <nz-select style=\"width: 240px\" name=\"appId\" nzShowSearch [(ngModel)]=\"appId\" (ngModelChange)=\"appChange()\">\r\n <nz-option *ngFor=\"let option of appList\" [nzLabel]=\"option.appName\" [nzValue]=\"option.appId\"></nz-option>\r\n </nz-select>\r\n </div>\r\n </nz-col>\r\n </nz-form-item>\r\n </form>\r\n </nz-affix>\r\n <st #st [data]=\"url\" [columns]=\"columns\" (change)=\"radioChange($event)\"></st>\r\n </div>\r\n <div nz-col nzSpan=\"11\" nzOffset=\"1\">\r\n <nz-affix [nzOffsetTop]=\"80\">\r\n <form nz-form [nzLayout]=\"'inline'\">\r\n <nz-form-item>\r\n <nz-col class=\"ant-form-item-control-wrapper\">\r\n <div class=\"ant-form-item-control\">\r\n <button acl [acl-ability]=\"'permission:add'\" nz-popconfirm nzTitle=\"\u786E\u8BA4\u6388\u6743\u5417?\" (nzOnConfirm)=\"assign()\" nz-button nzType=\"primary\">\u6388\u6743</button>\r\n <button acl [acl-ability]=\"'permission:remove'\" nz-popconfirm nzTitle=\"\u786E\u8BA4\u53D6\u6D88\u6388\u6743\u5417?\" (nzOnConfirm)=\"cancel()\" nz-button nzType=\"warning\">\u53D6\u6D88\u6388\u6743</button>\r\n </div>\r\n </nz-col>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-col class=\"ant-form-item-control-wrapper\">\r\n <div class=\"ant-form-item-control\">\r\n <nz-dropdown>\r\n <button nz-button nz-dropdown>\r\n \u64CD\u4F5C\r\n <i class=\"anticon anticon-down\"></i>\r\n </button>\r\n <ul nz-menu>\r\n <li (click)=\"expandAll(true)\" nz-menu-item>\r\n <a>\u5C55\u5F00\u6240\u6709</a>\r\n </li>\r\n <li (click)=\"expandAll(false)\" nz-menu-item>\r\n <a>\u6536\u8D77\u6240\u6709</a>\r\n </li>\r\n </ul>\r\n </nz-dropdown>\r\n </div>\r\n </nz-col>\r\n </nz-form-item>\r\n </form>\r\n </nz-affix>\r\n <nz-table #nzTable [nzData]=\"data\" [nzShowPagination]=\"false\" [nzFrontPagination]=\"false\" [nzBordered]=\"true\">\r\n <thead>\r\n <tr>\r\n <th nzShowCheckbox [(nzChecked)]=\"allChecked\" [nzIndeterminate]=\"indeterminate\" nzShowRowSelection [nzSelections]=\"listOfSelection\" (nzCheckedChange)=\"checkAll($event)\"></th>\r\n <th>\u8D44\u6E90\u540D\u79F0</th>\r\n <!--<th nzWidth=\"30%\">\u6743\u9650\u6807\u5FD7</th>-->\r\n <th>\u542F\u7528\u72B6\u6001</th>\r\n <th>\u6388\u6743\u72B6\u6001</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-template ngFor let-data [ngForOf]=\"nzTable.data\">\r\n <ng-template ngFor let-item [ngForOf]=\"expandDataCache[data.id]\">\r\n <tr *ngIf=\"(item.parent&&item.parent.expand)||!(item.parent)\">\r\n <td nzShowCheckbox [(nzChecked)]=\"item.checked\" (nzCheckedChange)=\"refreshStatus($event)\"></td>\r\n <td [nzIndentSize]=\"item.level*20\" [nzShowExpand]=\"!!item.children\" [(nzExpand)]=\"item.expand\" (nzExpandChange)=\"treeService.collapse(expandDataCache[data.id],item,$event)\">{{item.rsrcName}}</td>\r\n <!--<td>{{item.permission}}</td>-->\r\n <td>{{item.rsrcStatusText}}</td>\r\n <td>{{item.assign}}</td>\r\n </tr>\r\n </ng-template>\r\n </ng-template>\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n </div>\r\n</nz-card>",
styles: [":host ::ng-deep .ant-table-wrapper{margin-top:16px}"]
}] }
];
/** @nocollapse */
PermissionRoleComponent.ctorParameters = () => [
{ type: ModalHelper },
{ type: NzMessageService },
{ type: RoleService },
{ type: ResourceService },
{ type: TreeService },
{ type: AppsService }
];
PermissionRoleComponent.propDecorators = {
st: [{ type: ViewChild, args: ['st',] }]
};
if (false) {
/** @type {?} */
PermissionRoleComponent.prototype.url;
/** @type {?} */
PermissionRoleComponent.prototype.searchSchema;
/** @type {?} */
PermissionRoleComponent.prototype.st;
/** @type {?} */
PermissionRoleComponent.prototype.columns;
/** @type {?} */
PermissionRoleComponent.prototype.appId;
/** @type {?} */
PermissionRoleComponent.prototype.appList;
/** @type {?} */
PermissionRoleComponent.prototype.selectedRole;
/** @type {?} */
PermissionRoleComponent.prototype.data;
/** @type {?} */
PermissionRoleComponent.prototype.dataList;
/** @type {?} */
PermissionRoleComponent.prototype.expandDataCache;
/** @type {?} */
PermissionRoleComponent.prototype.allChecked;
/** @type {?} */
PermissionRoleComponent.prototype.indeterminate;
/** @type {?} */
PermissionRoleComponent.prototype.listOfSelection;
/**
* @type {?}
* @private
*/
PermissionRoleComponent.prototype.modal;
/**
* @type {?}
* @private
*/
PermissionRoleComponent.prototype.msgSrv;
/** @type {?} */
PermissionRoleComponent.prototype.roleService;
/** @type {?} */
PermissionRoleComponent.prototype.resourceService;
/** @type {?} */
PermissionRoleComponent.prototype.treeService;
/** @type {?} */
PermissionRoleComponent.prototype.appsService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZWNpcC9wZXJtaXNzaW9uLyIsInNvdXJjZXMiOlsic3JjL3JvbGUvcm9sZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQXFCLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN0RSxPQUFPLEVBQWUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3hELE9BQU8sRUFBWSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFbkQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQy9DLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFDLDJCQUEyQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDdkUsT0FBTyxFQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBT3hFLE1BQU0sT0FBTyx1QkFBdUI7Ozs7Ozs7OztJQTRHbEMsWUFBb0IsS0FBa0IsRUFBVSxNQUF3QixFQUNyRCxXQUF3QixFQUFTLGVBQWdDLEVBQ2pFLFdBQXdCLEVBQVMsV0FBd0I7UUFGeEQsVUFBSyxHQUFMLEtBQUssQ0FBYTtRQUFVLFdBQU0sR0FBTixNQUFNLENBQWtCO1FBQ3JELGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQVMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2pFLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQVMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUE3RzVFLFFBQUcsR0FBRyxzQkFBc0IsQ0FBQztRQUM3QixpQkFBWSxHQUFhO1lBQ3ZCLFVBQVUsRUFBRTtnQkFDVixFQUFFLEVB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Qjs7SUFDbkIsZ0RBQXNCOztJQUN0QixrREFhRTs7Ozs7SUFpQ1Usd0NBQTBCOzs7OztJQUFFLHlDQUFnQzs7SUFDNUQsOENBQStCOztJQUFFLGtEQUF1Qzs7SUFDeEUsOENBQStCOztJQUFFLDhDQUErQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgX0h0dHBDbGllbnQsIE1vZGFsSGVscGVyIH0gZnJvbSAnQGRlbG9uL3RoZW1lJztcclxuaW1wb3J0IHsgU1RDb2x1bW4sIFNUQ29tcG9uZW50IH0gZnJvbSAnQGRlbG9uL2FiYyc7XHJcbmltcG9ydCB7IFNGU2NoZW1hIH0gZnJvbSAnQGRlbG9uL2Zvcm0nO1xyXG5pbXBvcnQge056TWVzc2FnZVNlcnZpY2V9IGZyb20gJ25nLXpvcnJvLWFudGQnO1xyXG5pbXBvcnQge1Blcm1pc3Npb25Sb2xlRWRpdENvbXBvbmVudH0gZnJvbSBcIi4vZWRpdC9lZGl0LmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge1Blcm1pc3Npb25Sb2xlVmlld0NvbXBvbmVudH0gZnJvbSBcIi4vdmlldy92aWV3LmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge1RyZWVTZXJ2aWNlfSBmcm9tIFwiQGVjaXAvc2hhcmVkXCI7XHJcbmltcG9ydCB7UGVybWlzc2lvblJvbGVVc2VyQ29tcG9uZW50fSBmcm9tIFwiLi91c2VyL3JvbGUudXNlci5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtBcHBzU2VydmljZSwgUmVzb3VyY2VTZXJ2aWNlLCBSb2xlU2VydmljZX0gZnJvbSBcIkBlY2lwL3NlcnZpY2VcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXBlcm1pc3Npb24tcm9sZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3JvbGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3JvbGUuY29tcG9uZW50Lmxlc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvblJvbGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHVybCA9IGBhcGkvdjEvc3lzclJvbGUvbGlzdGA7XHJcbiAgc2VhcmNoU2NoZW1hOiBTRlNjaGVtYSA9IHtcclxuICAgIHByb3BlcnRpZXM6IHtcclxuICAgICAgaWQ6IHtcclxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcclxuICAgICAgICB0aXRsZTogJ+e8luWPtydcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcbiAgQFZpZXdDaGlsZCgnc3QnKSBzdDogU1RDb21wb25lbnQ7XHJcbiAgY29sdW1uczogU1RDb2x1bW5bXSA9IFtcclxuICAgIC8vIHsgdGl0bGU6ICfnvJblj7cnLCBpbmRleDogJ2lkJyB9LFxyXG4gICAgeyB0aXRsZTogJycsIGluZGV4OiAnaWQnLCB0eXBlOiAncmFkaW8nIH0sXHJcbiAgICAvLyB7IHRpdGxlOiAn5bqU55So57O757ufJywgaW5kZXg6ICdhcHBJZCcgfSxcclxuICAgIHsgdGl0bGU6ICfop5LoibLlkI3np7AnLCBpbmRleDogJ3JvbGVOYW1lJyB9LFxyXG4gICAgeyB0aXRsZTogJ+e8lueggScsIGluZGV4OiAnY29kZScgfSxcclxuICAgIHsgdGl0bGU6ICfop5LoibLnirbmgIEnLCBpbmRleDogJ3N0YXR1c1RleHQnIH0sXHJcbiAgICAvLyB7IHRpdGxlOiAn5o6S5bqPJywgaW5kZXg6ICdzb3J0TnVtJyB9LFxyXG4gICAgLy8geyB0aXRsZTogJ+WIm+W7uuaXtumXtCcsIHR5cGU6ICdkYXRlJywgaW5kZXg6ICdjcmVhdGVUaW1lJyB9LFxyXG4gICAge1xyXG4gICAgICB0aXRsZTogJ+aTjeS9nCcsXHJcbiAgICAgIHdpZHRoOiAnMTAwcHgnLFxyXG4gICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgeyB0ZXh0OiAn5Yig6ZmkJywgdHlwZTogJ2RlbCcsIGNsaWNrOiAoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIC8v5Yig6ZmkXHJcbiAgICAgICAgICAgIHRoaXMucm9sZVNlcnZpY2UuZGVsZXRlQnlJZChpdGVtLmlkKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLm1zZ1Nydi5zdWNjZXNzKCfliKDpmaTmiJDlip8nKTtcclxuICAgICAgICAgICAgICB0aGlzLnN0LnJlbG9hZCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBhY2w6IHsgYWJpbGl0eTogWydwZXJtaXNzaW9uOnJlbW92ZSddIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRleHQ6ICcnLFxyXG4gICAgICAgICAgY2hpbGRyZW46IFtcclxuICAgICAgICAgICAgeyB0ZXh0OiAn5p+l55yLJywgdHlwZTogJ3N0YXRpYycsIGNvbXBvbmVudDogUGVybWlzc2lvblJvbGVWaWV3Q29tcG9uZW50LCBjbGljazogJ3JlbG9hZCcsIGFjbDogeyBhYmlsaXR5OiBbJ3JvbGU6dmlldyddIH0gfSxcclxuICAgICAgICAgICAgeyB0ZXh0OiAn57yW6L6RJywgdHlwZTogJ25vbmUnLFxyXG4gICAgICAgICAgICAgIGNsaWNrOiAocmVjb3JkOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kYWxcclxuICAgICAgICAgICAgICAgICAgLmNyZWF0ZVN0YXRpYyhQZXJtaXNzaW9uUm9sZUVkaXRDb21wb25lbnQsIHthcHBJZDogdGhpcy5hcHBJZCwgcmVjb3JkOiByZWNvcmR9KVxyXG4gICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuc3QucmVsb2FkKCkpO1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgYWNsOiB7IGFiaWxpdHk6IFsncm9sZTplZGl0J10gfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7IHRleHQ6ICfkurrlkZgnLCB0eXBlOiAnc3RhdGljJywgY29tcG9uZW50OiBQZXJtaXNzaW9uUm9sZVVzZXJDb21wb25lbnQsIGNsaWNrOiAncmVsb2FkJywgYWNsOiB7IGFiaWxpdHk6IFsnbWVtYmVyOmNob29zZSddIH0gfVxyXG4gICAgICAgICAgXSxcclxuICAgICAgICB9LFxyXG4gICAgICBdXHJcbiAgICB9XHJcbiAgXTtcclxuXHJcbiAgYXBwSWQgPSAtMTtcclxuICBhcHBMaXN0O1xyXG5cclxuICBzZWxlY3RlZFJvbGU6IGFueTtcclxuICBkYXRhOmFueSA9IFtdO1xyXG4gIGRhdGFMaXN0OmFueSA9IFtdOyAvL+aJgOacieiKgueCueaVsOe7hFxyXG4gIGV4cGFuZERhdGFDYWNoZSA9IHt9O1xyXG5cclxuICBhbGxDaGVja2VkID0gZmFsc2U7XHJcbiAgaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xyXG4gIGxpc3RPZlNlbGVjdGlvbiA9IFtcclxuICAgIHtcclxuICAgICAgdGV4dCAgICA6ICflhajpgIknLFxyXG4gICAgICBvblNlbGVjdDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2hlY2tBbGwodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQgICAgOiAn5YWo5LiN6YCJJyxcclxuICAgICAgb25TZWxlY3Q6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmNoZWNrQWxsKGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIF07XHJcblxyXG4gIHJlZnJlc2hTdGF0dXMoJGV2ZW50ID86IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUm9sZSkge1xyXG4gICAgICB0aGlzLm1zZ1Nydi53YXJuaW5nKCfor7fpgInmi6nop5LoibInKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFsbENoZWNrZWQgPSB0aGlzLmRhdGFMaXN0LmV2ZXJ5KHZhbHVlID0+IHZhbHVlLmNoZWNrZWQgPT09IHRydWUpO1xyXG4gICAgY29uc3QgYWxsVW5DaGVja2VkID0gdGhpcy5kYXRhTGlzdC5ldmVyeSh2YWx1ZSA9PiAhdmFsdWUuY2hlY2tlZCk7XHJcbiAgICB0aGlzLmFsbENoZWNrZWQgPSBhbGxDaGVja2VkO1xyXG4gICAgdGhpcy5pbmRldGVybWluYXRlID0gKCFhbGxDaGVja2VkKSAmJiAoIWFsbFVuQ2hlY2tlZCk7XHJcbiAgfVxyXG5cclxuICBjaGVja0FsbCh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUm9sZSkge1xyXG4gICAgICB0aGlzLm1zZ1Nydi53YXJuaW5nKCfor7fpgInmi6nopoHmjojmnYPnmoTop5LoibInKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kYXRhTGlzdC5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICBpZiAoIWRhdGEuZGlzYWJsZWQpIHtcclxuICAgICAgICBkYXRhLmNoZWNrZWQgPSB2YWx1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJlZnJlc2hTdGF0dXMoKTtcclxuICB9XHJcblxyXG4gIGV4cGFuZEFsbCh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5kYXRhTGlzdC5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICBkYXRhLmV4cGFuZCA9IHZhbHVlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vZGFsOiBNb2RhbEhlbHBlciwgcHJpdmF0ZSBtc2dTcnY6IE56TWVzc2FnZVNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHVibGljIHJvbGVTZXJ2aWNlOiBSb2xlU2VydmljZSwgcHVibGljIHJlc291cmNlU2VydmljZTogUmVzb3VyY2VTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHB1YmxpYyB0cmVlU2VydmljZTogVHJlZVNlcnZpY2UsIHB1YmxpYyBhcHBzU2VydmljZTogQXBwc1NlcnZpY2UsICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5zdC5yZXEucGFyYW1zID0ge2FwcElkOiB0aGlzLmFwcElkfTtcclxuICAgIHRoaXMuYXBwc1NlcnZpY2UuZ2V0TGlzdCgpLnN1YnNjcmliZShhcHBMaXN0ID0+IHtcclxuICAgICAgdGhpcy5hcHBMaXN0ID0gYXBwTGlzdDtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5hcHBDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIGFwcENoYW5nZSgpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRSb2xlID0gbnVsbDtcclxuICAgIHRoaXMuc3QucmVsb2FkKHthcHBJZDogdGhpcy5hcHBJZH0pO1xyXG4gICAgdGhpcy5yZXNvdXJjZVNlcnZpY2UuZmluZFRyZWUoe2FwcElkOiB0aGlzLmFwcElkfSkuc3Vic2NyaWJlKChyZXM6YW55KSA9PiB7XHJcbiAgICAgIHRoaXMuZGF0YSA9IHJlcztcclxuICAgICAgdGhpcy5kYXRhLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgdGhpcy5leHBhbmREYXRhQ2FjaGVbIGl0ZW0uaWQgXSA9IFRyZWVTZXJ2aWNlLmNvbnZlcnRUcmVlVG9MaXN0KGl0ZW0pO1xyXG4gICAgICAgIHRoaXMuZGF0YUxpc3QgPSBbLi4udGhpcy5kYXRhTGlzdCwgLi4udGhpcy5leHBhbmREYXRhQ2FjaGVbaXRlbS5pZF1dO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkKCkge1xyXG4gICAgdGhpcy5tb2RhbFxyXG4gICAgICAuY3JlYXRlU3RhdGljKFBlcm1pc3Npb25Sb2xlRWRpdENvbXBvbmVudCwge2FwcElkOiB0aGlzLmFwcElkfSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnN0LnJlbG9hZCh7YXBwSWQ6IHRoaXMuYXBwSWR9KSk7XHJcbiAgfVxyXG5cclxuICByYWRpb0NoYW5nZShpdGVtOiBhbnkpIHtcclxuICAgIGlmICghaXRlbS5yYWRpbykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpdGVtID0gaXRlbS5yYWRpbztcclxuICAgIHRoaXMuc2VsZWN0ZWRSb2xlID0gaXRlbTtcclxuICAgIHRoaXMucm9sZVNlcnZpY2UuZmluZFJlc291cmNlKGl0ZW0uaWQpLnN1YnNjcmliZSgocmVzOnN0cmluZ1tdKSA9PiB7XHJcbiAgICAgIHRoaXMuZGF0YUxpc3QuZm9yRWFjaChfaXRlbSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcy5pbmNsdWRlcyhfaXRlbS5pZCkpIHtcclxuICAgICAgICAgIF9pdGVtLmFzc2lnbiA9ICflt7LmjojmnYMnO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBfaXRlbS5hc3NpZ24gPSAn5pyq5o6I5p2DJztcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3NpZ24oKSB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRSb2xlKSB7XHJcbiAgICAgIHRoaXMubXNnU3J2Lndhcm5pbmcoJ+ivt+mAieaLqeimgeaOiOadg+eahOinkuiJsicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZygnYXNzaWduJyk7XHJcbiAgICBsZXQgcmVzb3VyY2VJZHMgPSB0aGlzLmdldENoZWNrSWRzKCk7XHJcbiAgICBpZiAocmVzb3VyY2VJZHMubGVuZ3RoID09IDApIHtcclxuICAgICAgdGhpcy5tc2dTcnYud2FybmluZygn6K+36YCJ5oup6KaB5o6I5p2D55qE6LWE5rqQJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMucm9sZVNlcnZpY2Uuc2F2ZVJlc291cmNlKHRoaXMuc2VsZWN0ZWRSb2xlLmlkLCByZXNvdXJjZUlkcykuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgIHRoaXMubXNnU3J2LnN1Y2Nlc3MoJ+aOiOadg+aIkOWKnycpO1xyXG4gICAgICAvLyB0aGlzLmRhdGFMaXN0LmZpbHRlcihpdGVtID0+IGl0ZW0uKS5jaGVja2VkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5kYXRhTGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLmNoZWNrZWQgPT09IHRydWUpIHtcclxuICAgICAgICAgIGl0ZW0uYXNzaWduID0gJ+W3suaOiOadgyc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsKCkge1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUm9sZSkge1xyXG4gICAgICB0aGlzLm1zZ1Nydi53YXJuaW5nKCfor7fpgInmi6nopoHlj5bmtojmjojmnYPnmoTop5LoibInKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coJ2NhbmNlbCcpO1xyXG4gICAgbGV0IHJlc291cmNlSWRzID0gdGhpcy5nZXRDaGVja0lkcygpO1xyXG4gICAgaWYgKHJlc291cmNlSWRzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIHRoaXMubXNnU3J2Lndhcm5pbmcoJ+ivt+mAieaLqeimgeWPlua2iOaOiOadg+eahOi1hOa6kCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJvbGVTZXJ2aWNlLmRlbGV0ZVJlc291cmNlKHRoaXMuc2VsZWN0ZWRSb2xlLmlkLCByZXNvdXJjZUlkcykuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgIHRoaXMubXNnU3J2LnN1Y2Nlc3MoJ+WPlua2iOaOiOadg+aIkOWKnycpO1xyXG4gICAgICAvLyB0aGlzLmRhdGFMaXN0LmZpbHRlcihpdGVtID0+IGl0ZW0uKS5jaGVja2VkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5kYXRhTGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLmNoZWNrZWQgPT09IHRydWUpIHtcclxuICAgICAgICAgIGl0ZW0uYXNzaWduID0gJ+acquaOiOadgyc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2hlY2tJZHMoKTpzdHJpbmdbXSB7XHJcbiAgICBsZXQgY2hlY2tJZHMgPSBbXTtcclxuICAgIHRoaXMuZGF0YUxpc3QuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgaWYgKGl0ZW0uY2hlY2tlZCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIGNoZWNrSWRzLnB1c2goaXRlbS5pZCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNoZWNrSWRzO1xyXG4gIH1cclxuXHJcbn1cclxuIl19