truly-ui
Version:
Web Components for Desktop Applications.
284 lines (282 loc) • 59.9 kB
JavaScript
/*
MIT License
Copyright (c) 2019 Temainfo Software
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
import { Component, EventEmitter, Input, Output, ViewChild, ViewChildren } from '@angular/core';
import { Subject } from 'rxjs';
import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
import { PermissionGroupDirective } from './parts/directives/permission-group.directive';
import { FocusKeyManager } from '@angular/cdk/a11y';
import { ListOptionDirective } from '../misc/listoption.directive';
import * as i0 from "@angular/core";
import * as i1 from "../i18n/i18n.service";
import * as i2 from "@angular/common";
import * as i3 from "@angular/forms";
import * as i4 from "../input/input";
import * as i5 from "../checkbox/checkbox";
import * as i6 from "../loader/loader";
import * as i7 from "../misc/listoption.directive";
import * as i8 from "./parts/directives/permission-group.directive";
export class TlPermissions {
constructor(changes, i18n) {
this.changes = changes;
this.i18n = i18n;
this.data = [];
this.permissions = [];
this.height = '300px';
this.color = 'basic';
this.loading = true;
this.keyGroup = 'description';
this.keyPermissions = 'permissions';
this.keyPermissionValue = 'permission';
this.keyPermissionDescription = 'description';
this.searchGroup = this.i18n.getLocale().Permissions.searchGroup;
this.searchFunctionality = this.i18n.getLocale().Permissions.searchFunctionality;
this.allowColumnText = this.i18n.getLocale().Permissions.allowColumnText;
this.changePermission = new EventEmitter();
this.dataSource = [];
this.filterGroup = new Subject();
this.filterPermissions = new Subject();
this.selectedGroup = [];
this.selectedGroupIndex = 0;
this.selected = false;
this.dataSourceSelected = [];
this.loadingMessage = this.i18n.getLocale().Permissions.loadingMessage;
this.notFound = this.i18n.getLocale().Permissions.notFound;
}
ngOnInit() {
this.setUpDataSource();
this.handleFilterGroup();
this.handleFilterPermissions();
}
ngAfterContentInit() {
this.handleChangePermissions();
this.setFirstGroupSelected();
}
ngAfterViewInit() {
this.keyManagerPermissionGroup = new FocusKeyManager(this.permissionGroup);
this.keyManagerPermissionList = new FocusKeyManager(this.permissionList);
}
filterPermissionAllowed(dataSourceItem) {
if (this.permissions) {
return this.permissions.filter((item, index, array) => item[this.keyPermissionValue] === dataSourceItem[this.keyPermissionValue]);
}
return [];
}
handleChangePermissions() {
if (this.dataSource.length > 0) {
this.dataSource.forEach((item) => {
item[this.keyPermissions].forEach((itemPermission) => {
itemPermission['allow'] = this.filterPermissionAllowed(itemPermission).length > 0;
});
const allowed = item[this.keyPermissions].filter((permission, index, array) => permission['allow']);
if (allowed.length === item[this.keyPermissions].length) {
item['checked'] = true;
}
else if (allowed.length === 0) {
item['checked'] = false;
}
else {
item['checked'] = 'indeterminate';
}
});
}
}
handleFilterGroup() {
this.filterGroup.pipe(debounceTime(300), distinctUntilChanged()).subscribe((term) => {
term.length > 0 ? this.filterByGroup(term) : this.setUpDataSource();
});
}
handleFilterPermissions() {
this.filterPermissions.pipe(debounceTime(100), distinctUntilChanged()).subscribe((term) => {
term.length > 0 ? this.filterByRule(term) : this.setSelectedGroup();
});
}
handleCheckPermission() {
if (!(this.dataSource.length > 0)) {
return;
}
const selected = this.selectedGroup.filter((item) => item.allow);
if (selected.length === 0) {
this.dataSource[this.selectedGroupIndex].checked = false;
return;
}
(selected.length === this.selectedGroup.length) ? this.dataSource[this.selectedGroupIndex].checked = true :
this.dataSource[this.selectedGroupIndex].checked = 'indeterminate';
}
emitChange() {
const allowed = [];
this.dataSource.forEach((item) => {
item[this.keyPermissions].forEach((permission) => {
if (permission['allow']) {
const clone = Object.assign({}, permission);
delete clone['allow'];
allowed.push(clone);
}
});
});
this.changePermission.emit(allowed);
}
setSelectedGroup() {
if (this.permissionGroup.length > 0) {
this.dataSourceSelected = this.permissionGroup.filter((item) => item.selected)[0].permissions;
return;
}
return [];
}
selectGroup(selectGroup, index) {
if (selectGroup) {
this.deselectGroups(selectGroup);
this.selectedGroupIndex = index;
this.selectedGroup = selectGroup.permissions;
this.dataSourceSelected = selectGroup.permissions;
this.selected = true;
}
}
deselectGroups(selectGroup) {
this.permissionGroup.forEach((item) => {
item.selected = selectGroup === item;
});
}
filterByGroup(term) {
const filtered = this.data.filter((item) => item[this.keyGroup].toLowerCase().includes(term.toLowerCase()));
this.dataSource = JSON.parse(JSON.stringify(filtered));
this.handleChangePermissions();
}
filterByRule(term) {
this.dataSourceSelected = this.selectedGroup.filter((item) => item[this.keyPermissionDescription].toLowerCase().includes(term.toLowerCase()));
}
setFirstPermissionSelected() {
setTimeout(() => {
this.keyManagerPermissionList.setFirstItemActive();
}, 100);
}
setFirstGroupSelected() {
setTimeout(() => {
this.keyManagerPermissionGroup.setFirstItemActive();
this.selectGroup(this.permissionGroup.toArray()[0], 0);
this.handleCheckPermission();
}, 100);
}
setUpDataSource() {
this.dataSource = JSON.parse(JSON.stringify(this.data));
this.setFirstGroupSelected();
this.handleChangePermissions();
}
setRightListFocus() {
this.keyManagerPermissionList.setFirstItemActive();
}
setLeftListFocus() {
this.keyManagerPermissionGroup.setActiveItem(this.selectedGroupIndex);
}
onCheckGroup(checked) {
setTimeout(() => {
this.selectedGroup.forEach((item) => {
item['allow'] = checked;
});
this.emitChange();
});
}
handleKeyManager($event, manager) {
manager.onKeydown($event);
}
detectChanges() {
this.changes.detectChanges();
}
handleSelectPermission($event, item) {
this.stopEvent($event);
item['allow'] = !item['allow'];
this.handleCheckPermission();
this.emitChange();
}
handleSpaceSelect($event, item) {
this.stopEvent($event);
if (item.checked === 'indeterminate') {
item.checked = true;
return this.onCheckGroup(item.checked);
}
item.checked = !item.checked;
this.onCheckGroup(item.checked);
}
stopEvent($event) {
$event.preventDefault();
$event.stopPropagation();
}
inputFilterGroup($event) {
this.filterGroup.next($event);
}
inputFilterPermissions($event) {
this.filterPermissions.next($event);
}
ngOnChanges(changes) {
if (changes['permissions']) {
this.handleChangePermissions();
}
if (changes['data']) {
this.setUpDataSource();
if (!changes['data'].firstChange) {
this.loading = false;
}
}
}
}
/** @nocollapse */ TlPermissions.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlPermissions, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.I18nService }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ TlPermissions.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlPermissions, selector: "tl-permissions", inputs: { data: "data", permissions: "permissions", height: "height", color: "color", loading: "loading", keyGroup: "keyGroup", keyPermissions: "keyPermissions", keyPermissionValue: "keyPermissionValue", keyPermissionDescription: "keyPermissionDescription", searchGroup: "searchGroup", searchFunctionality: "searchFunctionality", allowColumnText: "allowColumnText" }, outputs: { changePermission: "changePermission" }, viewQueries: [{ propertyName: "listGroup", first: true, predicate: ["listGroup"], descendants: true, static: true }, { propertyName: "listPermission", first: true, predicate: ["listPermission"], descendants: true, static: true }, { propertyName: "permissionGroup", predicate: PermissionGroupDirective, descendants: true }, { propertyName: "permissionList", predicate: ListOptionDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [class]=\"'tl-permissions ' + color\" [style.height]=\"height\">\n <div class=\"ui-wrapper-permissions\" [style.height]=\"height\">\n <div class=\"ui-permissions-header\">\n <div class=\"ui-panel-search-1\">\n <tl-input #filterGroup\n (input)=\"inputFilterGroup($event.target.value)\"\n (keydown.ArrowDown)=\"setFirstGroupSelected()\"\n (clear)=\"setUpDataSource(); setFirstGroupSelected()\"\n [flatBorder]=\"true\"\n [withBorder]=\"false\"\n [iconBefore]=\"'ion ion-ios-search'\" [placeholder]=\"searchGroup\"\n [clearButton]=\"true\" [height]=\"'30px'\">\n </tl-input>\n </div>\n <div class=\"ui-panel-search-2\">\n <div class=\"ui-panel-search\">\n <tl-input\n #filterPermission\n (input)=\"inputFilterPermissions($event.target.value)\"\n (keydown.ArrowDown)=\"setFirstPermissionSelected()\"\n (clear)=\"setSelectedGroup(); setFirstPermissionSelected()\"\n [flatBorder]=\"true\"\n [withBorder]=\"false\"\n [iconBefore]=\"'ion ion-ios-search'\"\n [placeholder]=\"searchFunctionality\"\n [clearButton]=\"true\" [height]=\"'30px'\">\n </tl-input>\n </div>\n <div class=\"ui-check-header\">\n <div><span>{{ allowColumnText }}</span></div>\n </div>\n </div>\n </div>\n <div class=\"ui-container-permissions\">\n <div class=\"ui-permissions-panel\">\n <div class=\"ui-loader-wrapper\" *ngIf=\"loading\">\n <div class=\"ui-loader\">\n <tl-loader></tl-loader>\n </div>\n <span class=\"ui-loader-message\">{{ loadingMessage }}</span>\n </div>\n <div class=\"nothing-shown\" *ngIf=\"dataSource?.length === 0 && !loading\">\n <span class=\"not-found-text\">{{ notFound }}</span>\n </div>\n <ul #listGroup class=\"ui-permission-list\" [style.display]=\"dataSource?.length > 0 ? 'block' : 'none'\">\n <li tabindex=\"-1\" *ngFor=\"let item of dataSource; let i = index\"\n permissionGroup\n [permissions]=\"item[keyPermissions]\"\n (selectGroup)=\"selectGroup($event, i)\"\n (click)=\"keyManagerPermissionGroup.setActiveItem(i)\"\n (keydown)=\"handleKeyManager($event, keyManagerPermissionGroup)\"\n (keydown.ArrowRight)=\"setRightListFocus()\"\n (keydown.space)=\"handleSpaceSelect($event, item)\">\n <span>{{ item[keyGroup] }}</span>\n <span class=\"ui-checkbox\">\n <tl-checkbox [label]=\"' '\"\n (checkBox)=\"onCheckGroup($event)\"\n [(ngModel)]=\"item.checked\"\n [indeterminate]=\"item.checked === 'indeterminate'\"\n [color]=\"'primary'\">\n </tl-checkbox>\n </span>\n </li>\n </ul>\n </div>\n <div class=\"ui-permissions-detail-panel\">\n <div class=\"ui-loader-wrapper\" *ngIf=\"loading\">\n <div class=\"ui-loader\">\n <tl-loader></tl-loader>\n </div>\n <span class=\"ui-loader-message\">{{ loadingMessage }}</span>\n </div>\n <div class=\"nothing-shown\" *ngIf=\"(!selected || dataSourceSelected?.length === 0) && !loading\">\n <i *ngIf=\"dataSourceSelected?.length !== 0 && !selected\" class=\"ion-android-time\"></i>\n <span *ngIf=\"dataSourceSelected?.length === 0\" class=\"not-found-text\">{{ notFound }}</span>\n </div>\n <ul #listPermission class=\"ui-permission-list\" [style.display]=\"selected ? 'block' : 'none'\">\n <li tabindex=\"-1\" *ngFor=\"let item of dataSourceSelected; let i = index\"\n role=\"option\"\n (click)=\"keyManagerPermissionList.setActiveItem(i)\"\n (keydown)=\"handleKeyManager($event, keyManagerPermissionList)\"\n (keydown.space)=\"handleSelectPermission($event, item)\"\n (keydown.ArrowLeft)=\"setLeftListFocus()\"\n class=\"ui-detail-list\">\n <span>{{ item[keyPermissionDescription] }}</span>\n <div class=\"ui-checkbox permission\">\n <tl-checkbox [label]=\"' '\"\n [(ngModel)]=\"item.allow\"\n (checkBox)=\"handleCheckPermission(); emitChange()\"\n [color]=\"'primary'\">\n </tl-checkbox>\n </div>\n </li>\n </ul>\n </div>\n </div>\n </div>\n</div>\n", styles: ["*{box-sizing:border-box}.tl-permissions,.ui-wrapper-permissions{position:relative}.ui-wrapper-permissions>.ui-container-permissions{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:flex-start;align-content:stretch;align-items:flex-start;height:calc(100% - 30px)}.ui-wrapper-permissions>.ui-container-permissions>.ui-permissions-panel{flex:0 0 40%;height:100%;overflow-y:auto}.ui-wrapper-permissions>.ui-container-permissions>.ui-permissions-panel::-webkit-scrollbar{width:7px}.ui-wrapper-permissions>.ui-container-permissions>.ui-permissions-panel::-webkit-scrollbar-thumb{border-radius:3px}.ui-wrapper-permissions>.ui-container-permissions>.ui-permissions-detail-panel{flex:0 0 60%;height:100%;overflow-y:auto}.ui-wrapper-permissions>.ui-container-permissions>.ui-permissions-detail-panel::-webkit-scrollbar{width:7px}.ui-wrapper-permissions>.ui-container-permissions>.ui-permissions-detail-panel::-webkit-scrollbar-thumb{border-radius:3px}.ui-wrapper-permissions .nothing-shown{display:flex;height:100%;align-items:center;justify-content:center}.ui-wrapper-permissions .nothing-shown i{font-size:8em}.ui-wrapper-permissions .nothing-shown .not-found-text{font-size:2em;font-variant:all-petite-caps}.ui-loader-wrapper{width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-flow:column}.ui-loader-wrapper .ui-loader{width:50px;height:50px}.ui-loader-wrapper .ui-loader-message{font-size:16px;white-space:nowrap;font-variant:all-petite-caps}.ui-permissions-header{display:flex}.ui-permissions-header>.ui-panel-search-1{flex:0 0 40%;height:30px;line-height:30px}.ui-permissions-header>.ui-panel-search-2{display:flex;flex:0 0 60%;height:30px;line-height:30px}.ui-permissions-header>.ui-panel-search-2>.ui-panel-search{width:calc(100% - 100px);height:30px;line-height:30px}.ui-permissions-header>.ui-panel-search-2>.ui-check-header{display:flex;height:30px;line-height:30px}.ui-permissions-header>.ui-panel-search-2>.ui-check-header div{width:100px;text-align:center}.ui-permissions-header>.ui-panel-search-2>.ui-check-header div:last-child{border-right:none}.ui-permission-list{margin:0;padding:0;list-style:none;font-family:Segoe UI}.ui-permission-list>.ui-detail-list{display:flex;width:100%}.ui-permission-list>.ui-detail-list span{width:calc(100% - 100px)}.ui-permission-list>.ui-detail-list div{width:100px}.ui-permission-list li{display:grid;grid-template-columns:1fr 50px;height:35px;line-height:35px}.ui-permission-list li:hover{cursor:pointer}.ui-permission-list li:focus{outline:none}.ui-permission-list li span:first-child{padding-left:20px}.ui-permission-list li .ui-checkbox{text-align:center;line-height:30px}.ui-permission-list li .ui-checkbox:last-child{border-right:none}.ui-permission-list li .ui-checkbox.permission{border-left:none}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.TlInput, selector: "tl-input", inputs: ["textBefore", "textAfter", "labelPlacement", "labelSize", "name", "label", "color", "iconBefore", "iconAfter", "clearButton", "readonly", "required", "disabled", "autocomplete", "maxlength", "tabindex", "textAlign", "mask", "placeholder", "type", "height", "withBorder", "flatBorder"], outputs: ["clear", "overlayOrigin", "clickAddon", "click", "focus", "blur", "valid", "completeMask"] }, { kind: "component", type: i5.TlCheckBox, selector: "tl-checkbox", inputs: ["checked", "label", "tabindex", "disabled", "color", "indeterminate", "labelWidth"], outputs: ["checkBox", "focusBox"] }, { kind: "component", type: i6.TlLoader, selector: "tl-loader", inputs: ["color", "strokeWidth"] }, { kind: "directive", type: i7.ListOptionDirective, selector: "[role=\"option\"]" }, { kind: "directive", type: i8.PermissionGroupDirective, selector: "[permissionGroup]", inputs: ["permissions"], outputs: ["selectGroup"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlPermissions, decorators: [{
type: Component,
args: [{ selector: 'tl-permissions', template: "<div [class]=\"'tl-permissions ' + color\" [style.height]=\"height\">\n <div class=\"ui-wrapper-permissions\" [style.height]=\"height\">\n <div class=\"ui-permissions-header\">\n <div class=\"ui-panel-search-1\">\n <tl-input #filterGroup\n (input)=\"inputFilterGroup($event.target.value)\"\n (keydown.ArrowDown)=\"setFirstGroupSelected()\"\n (clear)=\"setUpDataSource(); setFirstGroupSelected()\"\n [flatBorder]=\"true\"\n [withBorder]=\"false\"\n [iconBefore]=\"'ion ion-ios-search'\" [placeholder]=\"searchGroup\"\n [clearButton]=\"true\" [height]=\"'30px'\">\n </tl-input>\n </div>\n <div class=\"ui-panel-search-2\">\n <div class=\"ui-panel-search\">\n <tl-input\n #filterPermission\n (input)=\"inputFilterPermissions($event.target.value)\"\n (keydown.ArrowDown)=\"setFirstPermissionSelected()\"\n (clear)=\"setSelectedGroup(); setFirstPermissionSelected()\"\n [flatBorder]=\"true\"\n [withBorder]=\"false\"\n [iconBefore]=\"'ion ion-ios-search'\"\n [placeholder]=\"searchFunctionality\"\n [clearButton]=\"true\" [height]=\"'30px'\">\n </tl-input>\n </div>\n <div class=\"ui-check-header\">\n <div><span>{{ allowColumnText }}</span></div>\n </div>\n </div>\n </div>\n <div class=\"ui-container-permissions\">\n <div class=\"ui-permissions-panel\">\n <div class=\"ui-loader-wrapper\" *ngIf=\"loading\">\n <div class=\"ui-loader\">\n <tl-loader></tl-loader>\n </div>\n <span class=\"ui-loader-message\">{{ loadingMessage }}</span>\n </div>\n <div class=\"nothing-shown\" *ngIf=\"dataSource?.length === 0 && !loading\">\n <span class=\"not-found-text\">{{ notFound }}</span>\n </div>\n <ul #listGroup class=\"ui-permission-list\" [style.display]=\"dataSource?.length > 0 ? 'block' : 'none'\">\n <li tabindex=\"-1\" *ngFor=\"let item of dataSource; let i = index\"\n permissionGroup\n [permissions]=\"item[keyPermissions]\"\n (selectGroup)=\"selectGroup($event, i)\"\n (click)=\"keyManagerPermissionGroup.setActiveItem(i)\"\n (keydown)=\"handleKeyManager($event, keyManagerPermissionGroup)\"\n (keydown.ArrowRight)=\"setRightListFocus()\"\n (keydown.space)=\"handleSpaceSelect($event, item)\">\n <span>{{ item[keyGroup] }}</span>\n <span class=\"ui-checkbox\">\n <tl-checkbox [label]=\"' '\"\n (checkBox)=\"onCheckGroup($event)\"\n [(ngModel)]=\"item.checked\"\n [indeterminate]=\"item.checked === 'indeterminate'\"\n [color]=\"'primary'\">\n </tl-checkbox>\n </span>\n </li>\n </ul>\n </div>\n <div class=\"ui-permissions-detail-panel\">\n <div class=\"ui-loader-wrapper\" *ngIf=\"loading\">\n <div class=\"ui-loader\">\n <tl-loader></tl-loader>\n </div>\n <span class=\"ui-loader-message\">{{ loadingMessage }}</span>\n </div>\n <div class=\"nothing-shown\" *ngIf=\"(!selected || dataSourceSelected?.length === 0) && !loading\">\n <i *ngIf=\"dataSourceSelected?.length !== 0 && !selected\" class=\"ion-android-time\"></i>\n <span *ngIf=\"dataSourceSelected?.length === 0\" class=\"not-found-text\">{{ notFound }}</span>\n </div>\n <ul #listPermission class=\"ui-permission-list\" [style.display]=\"selected ? 'block' : 'none'\">\n <li tabindex=\"-1\" *ngFor=\"let item of dataSourceSelected; let i = index\"\n role=\"option\"\n (click)=\"keyManagerPermissionList.setActiveItem(i)\"\n (keydown)=\"handleKeyManager($event, keyManagerPermissionList)\"\n (keydown.space)=\"handleSelectPermission($event, item)\"\n (keydown.ArrowLeft)=\"setLeftListFocus()\"\n class=\"ui-detail-list\">\n <span>{{ item[keyPermissionDescription] }}</span>\n <div class=\"ui-checkbox permission\">\n <tl-checkbox [label]=\"' '\"\n [(ngModel)]=\"item.allow\"\n (checkBox)=\"handleCheckPermission(); emitChange()\"\n [color]=\"'primary'\">\n </tl-checkbox>\n </div>\n </li>\n </ul>\n </div>\n </div>\n </div>\n</div>\n", styles: ["*{box-sizing:border-box}.tl-permissions,.ui-wrapper-permissions{position:relative}.ui-wrapper-permissions>.ui-container-permissions{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:flex-start;align-content:stretch;align-items:flex-start;height:calc(100% - 30px)}.ui-wrapper-permissions>.ui-container-permissions>.ui-permissions-panel{flex:0 0 40%;height:100%;overflow-y:auto}.ui-wrapper-permissions>.ui-container-permissions>.ui-permissions-panel::-webkit-scrollbar{width:7px}.ui-wrapper-permissions>.ui-container-permissions>.ui-permissions-panel::-webkit-scrollbar-thumb{border-radius:3px}.ui-wrapper-permissions>.ui-container-permissions>.ui-permissions-detail-panel{flex:0 0 60%;height:100%;overflow-y:auto}.ui-wrapper-permissions>.ui-container-permissions>.ui-permissions-detail-panel::-webkit-scrollbar{width:7px}.ui-wrapper-permissions>.ui-container-permissions>.ui-permissions-detail-panel::-webkit-scrollbar-thumb{border-radius:3px}.ui-wrapper-permissions .nothing-shown{display:flex;height:100%;align-items:center;justify-content:center}.ui-wrapper-permissions .nothing-shown i{font-size:8em}.ui-wrapper-permissions .nothing-shown .not-found-text{font-size:2em;font-variant:all-petite-caps}.ui-loader-wrapper{width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-flow:column}.ui-loader-wrapper .ui-loader{width:50px;height:50px}.ui-loader-wrapper .ui-loader-message{font-size:16px;white-space:nowrap;font-variant:all-petite-caps}.ui-permissions-header{display:flex}.ui-permissions-header>.ui-panel-search-1{flex:0 0 40%;height:30px;line-height:30px}.ui-permissions-header>.ui-panel-search-2{display:flex;flex:0 0 60%;height:30px;line-height:30px}.ui-permissions-header>.ui-panel-search-2>.ui-panel-search{width:calc(100% - 100px);height:30px;line-height:30px}.ui-permissions-header>.ui-panel-search-2>.ui-check-header{display:flex;height:30px;line-height:30px}.ui-permissions-header>.ui-panel-search-2>.ui-check-header div{width:100px;text-align:center}.ui-permissions-header>.ui-panel-search-2>.ui-check-header div:last-child{border-right:none}.ui-permission-list{margin:0;padding:0;list-style:none;font-family:Segoe UI}.ui-permission-list>.ui-detail-list{display:flex;width:100%}.ui-permission-list>.ui-detail-list span{width:calc(100% - 100px)}.ui-permission-list>.ui-detail-list div{width:100px}.ui-permission-list li{display:grid;grid-template-columns:1fr 50px;height:35px;line-height:35px}.ui-permission-list li:hover{cursor:pointer}.ui-permission-list li:focus{outline:none}.ui-permission-list li span:first-child{padding-left:20px}.ui-permission-list li .ui-checkbox{text-align:center;line-height:30px}.ui-permission-list li .ui-checkbox:last-child{border-right:none}.ui-permission-list li .ui-checkbox.permission{border-left:none}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.I18nService }]; }, propDecorators: { data: [{
type: Input
}], permissions: [{
type: Input
}], height: [{
type: Input
}], color: [{
type: Input
}], loading: [{
type: Input
}], keyGroup: [{
type: Input
}], keyPermissions: [{
type: Input
}], keyPermissionValue: [{
type: Input
}], keyPermissionDescription: [{
type: Input
}], searchGroup: [{
type: Input
}], searchFunctionality: [{
type: Input
}], allowColumnText: [{
type: Input
}], permissionGroup: [{
type: ViewChildren,
args: [PermissionGroupDirective]
}], permissionList: [{
type: ViewChildren,
args: [ListOptionDirective]
}], listGroup: [{
type: ViewChild,
args: ['listGroup', { static: true }]
}], listPermission: [{
type: ViewChild,
args: ['listPermission', { static: true }]
}], changePermission: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90cnVseS11aS9zcmMvY29tcG9uZW50cy9wZXJtaXNzaW9ucy9wZXJtaXNzaW9ucy50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL3Blcm1pc3Npb25zL3Blcm1pc3Npb25zLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBRUgsT0FBTyxFQUM0QixTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLFNBQVMsRUFDakgsWUFBWSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3BFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7OztBQVFuRSxNQUFNLE9BQU8sYUFBYTtJQTBEeEIsWUFBcUIsT0FBMEIsRUFBVSxJQUFpQjtRQUFyRCxZQUFPLEdBQVAsT0FBTyxDQUFtQjtRQUFVLFNBQUksR0FBSixJQUFJLENBQWE7UUF4RGpFLFNBQUksR0FBZ0MsRUFBRSxDQUFDO1FBRXZDLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBRTNCLFdBQU0sR0FBRyxPQUFPLENBQUM7UUFFakIsVUFBSyxHQUFHLE9BQU8sQ0FBQztRQUVoQixZQUFPLEdBQUcsSUFBSSxDQUFDO1FBRWYsYUFBUSxHQUFHLGFBQWEsQ0FBQztRQUV6QixtQkFBYyxHQUFHLGFBQWEsQ0FBQztRQUUvQix1QkFBa0Is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RyxjQUFjO3NCQUF0QixLQUFLO2dCQUVHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUcsZUFBZTtzQkFBdkIsS0FBSztnQkFFb0MsZUFBZTtzQkFBeEQsWUFBWTt1QkFBRSx3QkFBd0I7Z0JBRUYsY0FBYztzQkFBbEQsWUFBWTt1QkFBRSxtQkFBbUI7Z0JBRVEsU0FBUztzQkFBbEQsU0FBUzt1QkFBRSxXQUFXLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUVRLGNBQWM7c0JBQTVELFNBQVM7dUJBQUUsZ0JBQWdCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUVsQyxnQkFBZ0I7c0JBQXpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuIE1JVCBMaWNlbnNlXG5cbiBDb3B5cmlnaHQgKGMpIDIwMTkgVGVtYWluZm8gU29mdHdhcmVcblxuIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIFF1ZXJ5TGlzdCwgT3V0cHV0LCBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbiwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBDaGFuZ2VEZXRlY3RvclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFBlcm1pc3Npb25EYXRhQ29uZmlnIH0gZnJvbSAnLi9wYXJ0cy9pbnRlcmZhY2VzL3Blcm1pc3Npb24tZGF0YWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUGVybWlzc2lvbiB9IGZyb20gJy4vcGFydHMvbW9kZWxzL3Blcm1pc3Npb24ubW9kZWwnO1xuaW1wb3J0IHsgUGVybWlzc2lvbkdyb3VwRGlyZWN0aXZlIH0gZnJvbSAnLi9wYXJ0cy9kaXJlY3RpdmVzL3Blcm1pc3Npb24tZ3JvdXAuZGlyZWN0aXZlJztcbmltcG9ydCB7IEZvY3VzS2V5TWFuYWdlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7IExpc3RPcHRpb25EaXJlY3RpdmUgfSBmcm9tICcuLi9taXNjL2xpc3RvcHRpb24uZGlyZWN0aXZlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vaTE4bi9pMThuLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KCB7XG4gIHNlbGVjdG9yOiAndGwtcGVybWlzc2lvbnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vcGVybWlzc2lvbnMuaHRtbCcsXG4gIHN0eWxlVXJsczogWyAnLi9wZXJtaXNzaW9ucy5zY3NzJyBdLFxufSApXG5leHBvcnQgY2xhc3MgVGxQZXJtaXNzaW9ucyBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoKSBkYXRhOiBBcnJheTxQZXJtaXNzaW9uRGF0YUNvbmZpZz4gPSBbXTtcblxuICBASW5wdXQoKSBwZXJtaXNzaW9uczogc3RyaW5nW10gPSBbXTtcblxuICBASW5wdXQoKSBoZWlnaHQgPSAnMzAwcHgnO1xuXG4gIEBJbnB1dCgpIGNvbG9yID0gJ2Jhc2ljJztcblxuICBASW5wdXQoKSBsb2FkaW5nID0gdHJ1ZTtcblxuICBASW5wdXQoKSBrZXlHcm91cCA9ICdkZXNjcmlwdGlvbic7XG5cbiAgQElucHV0KCkga2V5UGVybWlzc2lvbnMgPSAncGVybWlzc2lvbnMnO1xuXG4gIEBJbnB1dCgpIGtleVBlcm1pc3Npb25WYWx1ZSA9ICdwZXJtaXNzaW9uJztcblxuICBASW5wdXQoKSBrZXlQZXJtaXNzaW9uRGVzY3JpcHRpb24gPSAnZGVzY3JpcHRpb24nO1xuXG4gIEBJbnB1dCgpIHNlYXJjaEdyb3VwID0gdGhpcy5pMThuLmdldExvY2FsZSgpLlBlcm1pc3Npb25zLnNlYXJjaEdyb3VwO1xuXG4gIEBJbnB1dCgpIHNlYXJjaEZ1bmN0aW9uYWxpdHkgPSB0aGlzLmkxOG4uZ2V0TG9jYWxlKCkuUGVybWlzc2lvbnMuc2VhcmNoRnVuY3Rpb25hbGl0eTtcblxuICBASW5wdXQoKSBhbGxvd0NvbHVtblRleHQgPSB0aGlzLmkxOG4uZ2V0TG9jYWxlKCkuUGVybWlzc2lvbnMuYWxsb3dDb2x1bW5UZXh0O1xuXG4gIEBWaWV3Q2hpbGRyZW4oIFBlcm1pc3Npb25Hcm91cERpcmVjdGl2ZSApIHBlcm1pc3Npb25Hcm91cDogUXVlcnlMaXN0PFBlcm1pc3Npb25Hcm91cERpcmVjdGl2ZT47XG5cbiAgQFZpZXdDaGlsZHJlbiggTGlzdE9wdGlvbkRpcmVjdGl2ZSApIHBlcm1pc3Npb25MaXN0OiBRdWVyeUxpc3Q8TGlzdE9wdGlvbkRpcmVjdGl2ZT47XG5cbiAgQFZpZXdDaGlsZCggJ2xpc3RHcm91cCcsIHtzdGF0aWM6IHRydWV9ICkgbGlzdEdyb3VwOiBFbGVtZW50UmVmO1xuXG4gIEBWaWV3Q2hpbGQoICdsaXN0UGVybWlzc2lvbicsIHtzdGF0aWM6IHRydWV9ICkgbGlzdFBlcm1pc3Npb246IEVsZW1lbnRSZWY7XG5cbiAgQE91dHB1dCgpIGNoYW5nZVBlcm1pc3Npb246IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHB1YmxpYyBrZXlNYW5hZ2VyUGVybWlzc2lvbkdyb3VwOiBGb2N1c0tleU1hbmFnZXI8UGVybWlzc2lvbkdyb3VwRGlyZWN0aXZlPjtcblxuICBwdWJsaWMga2V5TWFuYWdlclBlcm1pc3Npb25MaXN0OiBGb2N1c0tleU1hbmFnZXI8TGlzdE9wdGlvbkRpcmVjdGl2ZT47XG5cbiAgcHVibGljIGRhdGFTb3VyY2UgPSBbXTtcblxuICBwdWJsaWMgZmlsdGVyR3JvdXA6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHVibGljIGZpbHRlclBlcm1pc3Npb25zOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIHB1YmxpYyBzZWxlY3RlZEdyb3VwOiBhbnkgPSBbXTtcblxuICBwdWJsaWMgc2VsZWN0ZWRHcm91cEluZGV4ID0gMDtcblxuICBwdWJsaWMgc2VsZWN0ZWQgPSBmYWxzZTtcblxuICBwdWJsaWMgZGF0YVNvdXJjZVNlbGVjdGVkOiBhbnkgPSBbXTtcblxuICBwdWJsaWMgbG9hZGluZ01lc3NhZ2UgPSB0aGlzLmkxOG4uZ2V0TG9jYWxlKCkuUGVybWlzc2lvbnMubG9hZGluZ01lc3NhZ2U7XG5cbiAgcHVibGljIG5vdEZvdW5kID0gdGhpcy5pMThuLmdldExvY2FsZSgpLlBlcm1pc3Npb25zLm5vdEZvdW5kO1xuXG4gIGNvbnN0cnVjdG9yKCBwcml2YXRlIGNoYW5nZXM6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIGkxOG46IEkxOG5TZXJ2aWNlICkge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zZXRVcERhdGFTb3VyY2UoKTtcbiAgICB0aGlzLmhhbmRsZUZpbHRlckdyb3VwKCk7XG4gICAgdGhpcy5oYW5kbGVGaWx0ZXJQZXJtaXNzaW9ucygpO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMuaGFuZGxlQ2hhbmdlUGVybWlzc2lvbnMoKTtcbiAgICB0aGlzLnNldEZpcnN0R3JvdXBTZWxlY3RlZCgpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMua2V5TWFuYWdlclBlcm1pc3Npb25Hcm91cCA9IG5ldyBGb2N1c0tleU1hbmFnZXIoIHRoaXMucGVybWlzc2lvbkdyb3VwICk7XG4gICAgdGhpcy5rZXlNYW5hZ2VyUGVybWlzc2lvbkxpc3QgPSBuZXcgRm9jdXNLZXlNYW5hZ2VyKCB0aGlzLnBlcm1pc3Npb25MaXN0ICk7XG4gIH1cblxuICBmaWx0ZXJQZXJtaXNzaW9uQWxsb3dlZCggZGF0YVNvdXJjZUl0ZW0gKSB7XG4gICAgaWYgKHRoaXMucGVybWlzc2lvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLnBlcm1pc3Npb25zLmZpbHRlciggKCBpdGVtLCBpbmRleCwgYXJyYXkgKSA9PlxuICAgICAgaXRlbVsgdGhpcy5rZXlQZXJtaXNzaW9uVmFsdWUgXSA9PT0gZGF0YVNvdXJjZUl0ZW1bIHRoaXMua2V5UGVybWlzc2lvblZhbHVlIF0gKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaGFuZGxlQ2hhbmdlUGVybWlzc2lvbnMoKSB7XG4gICAgaWYgKCB0aGlzLmRhdGFTb3VyY2UubGVuZ3RoID4gMCApIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5mb3JFYWNoKCAoIGl0ZW06IFBlcm1pc3Npb25EYXRhQ29uZmlnICkgPT4ge1xuICAgICAgICBpdGVtWyB0aGlzLmtleVBlcm1pc3Npb25zIF0uZm9yRWFjaCggKCBpdGVtUGVybWlzc2lvbiApID0+IHtcbiAgICAgICAgICBpdGVtUGVybWlzc2lvblsnYWxsb3cnXSA9IHRoaXMuZmlsdGVyUGVybWlzc2lvbkFsbG93ZWQoIGl0ZW1QZXJtaXNzaW9uICkubGVuZ3RoID4gMDtcbiAgICAgICAgfSApO1xuICAgICAgICBjb25zdCBhbGxvd2VkID0gaXRlbVsgdGhpcy5rZXlQZXJtaXNzaW9ucyBdLmZpbHRlciggKCBwZXJtaXNzaW9uLCBpbmRleCwgYXJyYXkgKSA9PiBwZXJtaXNzaW9uWyAnYWxsb3cnIF0gKTtcbiAgICAgICAgaWYgKCBhbGxvd2VkLmxlbmd0aCA9PT0gaXRlbVsgdGhpcy5rZXlQZXJtaXNzaW9ucyBdLmxlbmd0aCApIHtcbiAgICAgICAgICBpdGVtWyAnY2hlY2tlZCcgXSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoIGFsbG93ZWQubGVuZ3RoID09PSAwICkge1xuICAgICAgICAgIGl0ZW1bICdjaGVja2VkJyBdID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsgJ2NoZWNrZWQnIF0gPSAnaW5kZXRlcm1pbmF0ZSc7XG4gICAgICAgIH1cbiAgICAgIH0gKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVGaWx0ZXJHcm91cCgpIHtcbiAgICB0aGlzLmZpbHRlckdyb3VwLnBpcGUoXG4gICAgICBkZWJvdW5jZVRpbWUoIDMwMCApLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSApLnN1YnNjcmliZSggKCB0ZXJtICkgPT4ge1xuICAgICAgdGVybS5sZW5ndGggPiAwID8gdGhpcy5maWx0ZXJCeUdyb3VwKCB0ZXJtICkgOiB0aGlzLnNldFVwRGF0YVNvdXJjZSgpO1xuICAgIH0gKTtcbiAgfVxuXG4gIGhhbmRsZUZpbHRlclBlcm1pc3Npb25zKCkge1xuICAgIHRoaXMuZmlsdGVyUGVybWlzc2lvbnMucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSggMTAwICksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpICkuc3Vic2NyaWJlKCAoIHRlcm0gKSA9PiB7XG4gICAgICB0ZXJtLmxlbmd0aCA+IDAgPyB0aGlzLmZpbHRlckJ5UnVsZSggdGVybSApIDogdGhpcy5zZXRTZWxlY3RlZEdyb3VwKCk7XG4gICAgfSApO1xuICB9XG5cbiAgaGFuZGxlQ2hlY2tQZXJtaXNzaW9uKCkge1xuICAgIGlmICghICggdGhpcy5kYXRhU291cmNlLmxlbmd0aCA+IDApICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRHcm91cC5maWx0ZXIoICggaXRlbSApID0+IGl0ZW0uYWxsb3cgKTtcbiAgICBpZiAoIHNlbGVjdGVkLmxlbmd0aCA9PT0gMCApIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZVsgdGhpcy5zZWxlY3RlZEdyb3VwSW5kZXggXS5jaGVja2VkID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIChzZWxlY3RlZC5sZW5ndGggPT09IHRoaXMuc2VsZWN0ZWRHcm91cC5sZW5ndGgpID8gdGhpcy5kYXRhU291cmNlWyB0aGlzLnNlbGVjdGVkR3JvdXBJbmRleCBdLmNoZWNrZWQgPSB0cnVlIDpcbiAgICAgIHRoaXMuZGF0YVNvdXJjZVsgdGhpcy5zZWxlY3RlZEdyb3VwSW5kZXggXS5jaGVja2VkID0gJ2luZGV0ZXJtaW5hdGUnO1xuICB9XG5cbiAgZW1pdENoYW5nZSgpIHtcbiAgICBjb25zdCBhbGxvd2VkID0gW107XG4gICAgdGhpcy5kYXRhU291cmNlLmZvckVhY2goICggaXRlbSApID0+IHtcbiAgICAgIGl0ZW1bIHRoaXMua2V5UGVybWlzc2lvbnMgXS5mb3JFYWNoKCAoIHBlcm1pc3Npb246IFBlcm1pc3Npb24gKSA9PiB7XG4gICAgICAgIGlmIChwZXJtaXNzaW9uWyAnYWxsb3cnIF0pIHtcbiAgICAgICAgIGNvbnN0IGNsb25lID0gT2JqZWN0LmFzc2lnbih7fSwgcGVybWlzc2lvbik7XG4gICAgICAgICBkZWxldGUgY2xvbmVbJ2FsbG93J107XG4gICAgICAgICBhbGxvd2VkLnB1c2goY2xvbmUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLmNoYW5nZVBlcm1pc3Npb24uZW1pdChhbGxvd2VkKTtcbiAgfVxuXG4gIHNldFNlbGVjdGVkR3JvdXAoKSB7XG4gICAgaWYgKHRoaXMucGVybWlzc2lvbkdyb3VwLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZVNlbGVjdGVkID0gdGhpcy5wZXJtaXNzaW9uR3JvdXAuZmlsdGVyKCAoIGl0ZW0gKSA9PiBpdGVtLnNlbGVjdGVkIClbIDAgXS5wZXJtaXNzaW9ucztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgc2VsZWN0R3JvdXAoIHNlbGVjdEdyb3VwOiBQZXJtaXNzaW9uR3JvdXBEaXJlY3RpdmUsIGluZGV4OiBudW1iZXIgKSB7XG4gICAgaWYgKHNlbGVjdEdyb3VwKSB7XG4gICAgICB0aGlzLmRlc2VsZWN0R3JvdXBzKCBzZWxlY3RHcm91cCApO1xuICAgICAgdGhpcy5zZWxlY3RlZEdyb3VwSW5kZXggPSBpbmRleDtcbiAgICAgIHRoaXMuc2VsZWN0ZWRHcm91cCA9IHNlbGVjdEdyb3VwLnBlcm1pc3Npb25zO1xuICAgICAgdGhpcy5kYXRhU291cmNlU2VsZWN0ZWQgPSBzZWxlY3RHcm91cC5wZXJtaXNzaW9ucztcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGRlc2VsZWN0R3JvdXBzKCBzZWxlY3RHcm91cCApIHtcbiAgICB0aGlzLnBlcm1pc3Npb25Hcm91cC5mb3JFYWNoKCAoIGl0ZW0gKSA9PiB7XG4gICAgICBpdGVtLnNlbGVjdGVkID0gc2VsZWN0R3JvdXAgPT09IGl0ZW07XG4gICAgfSApO1xuICB9XG5cbiAgZmlsdGVyQnlHcm91cCggdGVybSApIHtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IHRoaXMuZG