@firestitch/app-acl 12.2.0 → 12.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/app/components/acl-entries/acl-entries.component.d.ts +32 -32
  2. package/app/components/acl-entry/acl-entry.component.d.ts +31 -29
  3. package/app/components/acl-object-roles/acl-object-roles.component.d.ts +18 -18
  4. package/app/components/acl-permission-popover/acl-permission-popover.component.d.ts +12 -12
  5. package/app/components/acl-role/acl-role.component.d.ts +46 -46
  6. package/app/components/acl-role-popover/acl-role-popover.component.d.ts +13 -13
  7. package/app/components/acl-roles/acl-roles.component.d.ts +35 -35
  8. package/app/consts/acl-role-accesses.d.ts +5 -5
  9. package/app/enums/acl-role-access.d.ts +6 -6
  10. package/app/fs-app-acl.module.d.ts +31 -31
  11. package/app/injectors/app-acl-config.injector.d.ts +2 -2
  12. package/app/interfaces/acl-entry-data.d.ts +11 -11
  13. package/app/interfaces/acl-entry.d.ts +18 -18
  14. package/app/interfaces/acl-level.d.ts +3 -3
  15. package/app/interfaces/acl-object-entry.d.ts +11 -11
  16. package/app/interfaces/acl-object-role.d.ts +6 -6
  17. package/app/interfaces/acl-object.d.ts +4 -4
  18. package/app/interfaces/acl-permission.d.ts +7 -7
  19. package/app/interfaces/acl-role.d.ts +15 -15
  20. package/app/interfaces/app-acl-config.d.ts +7 -7
  21. package/app/interfaces/name-value.d.ts +4 -4
  22. package/app/services/app-acl.service.d.ts +16 -18
  23. package/bundles/firestitch-app-acl.umd.js +1130 -1158
  24. package/bundles/firestitch-app-acl.umd.js.map +1 -1
  25. package/esm2015/app/components/acl-entries/acl-entries.component.js +164 -166
  26. package/esm2015/app/components/acl-entry/acl-entry.component.js +90 -93
  27. package/esm2015/app/components/acl-object-roles/acl-object-roles.component.js +56 -56
  28. package/esm2015/app/components/acl-permission-popover/acl-permission-popover.component.js +32 -32
  29. package/esm2015/app/components/acl-role/acl-role.component.js +201 -202
  30. package/esm2015/app/components/acl-role-popover/acl-role-popover.component.js +37 -37
  31. package/esm2015/app/components/acl-roles/acl-roles.component.js +146 -146
  32. package/esm2015/app/consts/acl-role-accesses.js +7 -7
  33. package/esm2015/app/enums/acl-role-access.js +7 -7
  34. package/esm2015/app/fs-app-acl.module.js +123 -123
  35. package/esm2015/app/injectors/app-acl-config.injector.js +2 -2
  36. package/esm2015/app/interfaces/acl-entry-data.js +1 -1
  37. package/esm2015/app/interfaces/acl-entry.js +1 -1
  38. package/esm2015/app/interfaces/acl-level.js +1 -1
  39. package/esm2015/app/interfaces/acl-object-entry.js +1 -1
  40. package/esm2015/app/interfaces/acl-object-role.js +1 -1
  41. package/esm2015/app/interfaces/acl-object.js +1 -1
  42. package/esm2015/app/interfaces/acl-permission.js +1 -1
  43. package/esm2015/app/interfaces/acl-role.js +1 -1
  44. package/esm2015/app/interfaces/app-acl-config.js +1 -1
  45. package/esm2015/app/interfaces/name-value.js +1 -1
  46. package/esm2015/app/services/app-acl.service.js +55 -78
  47. package/esm2015/firestitch-app-acl.js +4 -4
  48. package/esm2015/public_api.js +10 -10
  49. package/fesm2015/firestitch-app-acl.js +770 -797
  50. package/fesm2015/firestitch-app-acl.js.map +1 -1
  51. package/firestitch-app-acl.d.ts +5 -5
  52. package/package.json +1 -1
  53. package/public_api.d.ts +20 -20
@@ -1,202 +1,201 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, ViewChild } from '@angular/core';
2
- import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
3
- import { AclRoleAccesses } from './../../consts/acl-role-accesses';
4
- import { map, takeUntil, tap } from 'rxjs/operators';
5
- import { FsMessage } from '@firestitch/message';
6
- import { list } from '@firestitch/common';
7
- import { FsListComponent } from '@firestitch/list';
8
- import { forkJoin, of, Subject } from 'rxjs';
9
- import { FsAppAclService } from './../../services/app-acl.service';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "./../../services/app-acl.service";
12
- import * as i2 from "@angular/material/dialog";
13
- import * as i3 from "@firestitch/message";
14
- import * as i4 from "@firestitch/dialog";
15
- import * as i5 from "@angular/material/form-field";
16
- import * as i6 from "@firestitch/label";
17
- import * as i7 from "@firestitch/radiogroup";
18
- import * as i8 from "@angular/material/radio";
19
- import * as i9 from "@angular/material/checkbox";
20
- import * as i10 from "@angular/material/select";
21
- import * as i11 from "@angular/material/core";
22
- import * as i12 from "@firestitch/list";
23
- import * as i13 from "@angular/material/button";
24
- import * as i14 from "@angular/forms";
25
- import * as i15 from "@firestitch/form";
26
- import * as i16 from "@angular/common";
27
- import * as i17 from "@angular/flex-layout/flex";
28
- import * as i18 from "@angular/material/input";
29
- export class FsAclRoleComponent {
30
- constructor(_appAclService, _dialogRef, _message, _data, _cdRef) {
31
- this._appAclService = _appAclService;
32
- this._dialogRef = _dialogRef;
33
- this._message = _message;
34
- this._data = _data;
35
- this._cdRef = _cdRef;
36
- this.aclRole = null;
37
- this.permissions = [];
38
- this.levelPermissions = [];
39
- this.AclRoleAccesses = AclRoleAccesses;
40
- this.indexedAccesses = {};
41
- this.aclLevels = [];
42
- this.indexedAclLevels = {};
43
- this.onlyFullAccess = false;
44
- this.AclLevels = {};
45
- this.aclRoleConfigs = [];
46
- this.levelAclRoleConfigs = [];
47
- this._destroy$ = new Subject();
48
- this.save = () => {
49
- const aclRole = Object.assign(Object.assign({}, this.aclRole), { permissions: this.levelPermissions.map((permission) => {
50
- return {
51
- value: permission.value,
52
- access: this.aclRole.permissions[permission.value] || 0,
53
- };
54
- }), aclRoleConfigs: this.levelAclRoleConfigs.map((item) => {
55
- return {
56
- id: item.id,
57
- value: item.value,
58
- data: item.data,
59
- };
60
- }) });
61
- return this._data.saveAclRole(this._appAclService.output(aclRole))
62
- .pipe(tap((response) => {
63
- this._message.success('Saved Changes');
64
- this.close(response);
65
- }));
66
- };
67
- }
68
- ngOnInit() {
69
- forkJoin(this.getRole(), this._appAclService.getPermissions())
70
- .pipe(takeUntil(this._destroy$))
71
- .subscribe(([aclRole, aclPermissions,]) => {
72
- this.permissions = aclPermissions;
73
- this.aclLevels = this._data.aclLevels;
74
- this.indexedAclLevels = list(this.aclLevels, 'name', 'value');
75
- this.indexedAccesses = list(AclRoleAccesses, 'name', 'value');
76
- this.aclRole = Object.assign({
77
- aclPermissions: [],
78
- allPermissions: true,
79
- aclRoleConfigs: [],
80
- permissions: {},
81
- level: this.aclLevels[0].value,
82
- }, aclRole);
83
- if (this.aclRole.id) {
84
- this.permissions.forEach((permission) => {
85
- let access = 0;
86
- const aclPermission = this.aclRole.aclPermissions.find((item) => {
87
- return item.permission === permission.value;
88
- });
89
- if (aclPermission) {
90
- access = aclPermission.access;
91
- }
92
- this.aclRole.permissions[permission.value] = access;
93
- });
94
- }
95
- if (this.aclRole.allPermissions) {
96
- this._applyMaxPermissionAccess();
97
- }
98
- this._updatePermissions();
99
- this._updateAclRoleConfigs();
100
- this._cdRef.markForCheck();
101
- });
102
- this.listConfig = {
103
- status: false,
104
- paging: false,
105
- noResults: {
106
- message: '',
107
- },
108
- group: {
109
- initialExpand: true,
110
- groupBy: (data) => {
111
- return data;
112
- },
113
- compareBy: (data) => {
114
- return data.category || 'General';
115
- },
116
- },
117
- fetch: () => {
118
- return of({
119
- data: this.levelPermissions.sort((a, b) => {
120
- a = a.name.toUpperCase();
121
- b = b.name.toUpperCase();
122
- if (a < b) {
123
- return -1;
124
- }
125
- else if (a > b) {
126
- return 1;
127
- }
128
- return 0;
129
- }),
130
- });
131
- },
132
- };
133
- }
134
- levelChange() {
135
- this._updatePermissions();
136
- this._updateAclRoleConfigs();
137
- setTimeout(() => {
138
- this.list.reload();
139
- });
140
- }
141
- getRole() {
142
- if (!this._data.aclRole.id) {
143
- return of(this._data.aclRole);
144
- }
145
- const query = {
146
- aclPermissions: true,
147
- aclRoleConfigs: true,
148
- };
149
- if (!this.environment) {
150
- query.environmentId = null;
151
- }
152
- return this._data.loadAclRole(this._data.aclRole, query)
153
- .pipe(map((data) => this._appAclService.input(data)));
154
- }
155
- close(data = null) {
156
- this._dialogRef.close(data);
157
- }
158
- allPermissionsChange(all) {
159
- this._updatePermissions();
160
- if (all) {
161
- this._applyMaxPermissionAccess();
162
- }
163
- }
164
- ngOnDestroy() {
165
- this._destroy$.next();
166
- this._destroy$.complete();
167
- }
168
- _updatePermissions() {
169
- this.levelPermissions = this.permissions.filter((permission) => {
170
- return permission.levels.some((item) => {
171
- return item === this.aclRole.level;
172
- });
173
- });
174
- }
175
- _updateAclRoleConfigs() {
176
- this.levelAclRoleConfigs = this.aclRoleConfigs.filter((item) => {
177
- return this.aclRole.level === item.level;
178
- });
179
- }
180
- _applyMaxPermissionAccess() {
181
- this.permissions.forEach((permission) => {
182
- this.aclRole.permissions[permission.value] = Math.max(...permission.accesses);
183
- });
184
- }
185
- }
186
- FsAclRoleComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsAclRoleComponent, deps: [{ token: i1.FsAppAclService }, { token: i2.MatDialogRef }, { token: i3.FsMessage }, { token: MAT_DIALOG_DATA }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
187
- FsAclRoleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: FsAclRoleComponent, selector: "ng-component", viewQueries: [{ propertyName: "list", first: true, predicate: FsListComponent, descendants: true }], ngImport: i0, template: "<form fsForm [submit]=\"save\">\n <fs-dialog>\n <ng-container *ngIf=\"aclRole\">\n <div mat-dialog-title>{{ aclRole.id ? 'Edit' : 'Create' }} Role</div>\n <mat-dialog-content>\n <div fxLayout=\"row\" fxLayout.lt-md=\"column\" fxLayoutGap=\"40px\" fxLayoutGap.lt-md=\"0\">\n <div fxLayout=\"column\" fxFlex fxFlex.lt-md=\"0\">\n <mat-form-field>\n <input matInput placeholder=\"Name\" [(ngModel)]=\"aclRole.name\" name=\"name\" fsFormRequired>\n </mat-form-field>\n\n <fs-label-field *ngIf=\"aclRole.id || aclLevels.length === 1; else levels\">\n <fs-label>Level</fs-label>\n {{indexedAclLevels[aclRole.level]}}\n </fs-label-field>\n\n <ng-template #levels>\n <div class=\"level\">\n <fs-radio-group\n [(ngModel)]=\"aclRole.level\"\n (ngModelChange)=\"levelChange()\"\n fsFormRequired\n label=\"Level\"\n orientation=\"vertical\"\n name=\"level\">\n <mat-radio-button\n *ngFor=\"let item of aclLevels\"\n [value]=\"item.value\"\n [disabled]=\"!!aclRole.protected\">\n {{ item.name }}\n </mat-radio-button>\n </fs-radio-group>\n </div>\n </ng-template>\n\n <fs-label-field *ngIf=\"levelPermissions.length\">\n <fs-label>All Permissions</fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRole.allPermissions\"\n (ngModelChange)=\"allPermissionsChange($event)\"\n [disabled]=\"!!aclRole.protected\"\n name=\"allPermissions\">\n </mat-checkbox>\n </fs-label-field>\n\n <div fxLayout=\"column\" *ngFor=\"let config of levelAclRoleConfigs\">\n <fs-label-field *ngIf=\"config.interface === 'checkbox'\">\n <fs-label>{{config.name}}</fs-label>\n <mat-checkbox\n [(ngModel)]=\"config.data\"\n [name]=\"config.name\">\n </mat-checkbox>\n <fs-label-message>\n <mat-hint>{{config.description}}</mat-hint>\n </fs-label-message>\n </fs-label-field>\n\n <mat-form-field *ngIf=\"config.interface === 'select'\">\n <mat-select\n [(ngModel)]=\"config.data\"\n [name]=\"config.value\"\n [required]=\"config.required\"\n [placeholder]=\"config.name\">\n <mat-option\n *ngFor=\"let item of config.values\"\n [value]=\"item.value\">\n {{ item.name }}\n </mat-option>\n </mat-select>\n <mat-hint>{{config.description}}</mat-hint>\n </mat-form-field>\n </div>\n </div>\n\n <div fxLayout=\"column\" fxFlex=\"65\" fxFlex.lt-md=\"0\" *ngIf=\"aclRole.level\" [hidden]=\"!levelPermissions.length\" class=\"permissions\">\n\n <fs-list [config]=\"listConfig\">\n <fs-list-column title=\"Permissions\">\n <ng-template colspan=\"2\" fs-list-group-cell let-row=\"row\" class=\"permission-group\">\n <small><b>{{row.category || 'General'}}</b></small>\n </ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <div class=\"permission\">{{ row.name }}</div>\n <div class=\"description small\">{{ row.description }}</div>\n </ng-template>\n </fs-list-column>\n <fs-list-column title=\"Access\" width=\"1%\" class=\"access\">\n <ng-template fs-list-cell let-row=\"permission\" let-permission=\"row\">\n <span *ngIf=\"aclRole.allPermissions; else elseAll\">\n {{ indexedAccesses[aclRole.permissions[permission.value]] }}\n </span>\n <ng-template #elseAll>\n <mat-form-field>\n <mat-select\n [(ngModel)]=\"aclRole.permissions[permission.value]\"\n [disabled]=\"!!aclRole.protected\"\n fsFormRequired\n name=\"access-{{ permission.value }}\">\n <ng-container *ngFor=\"let access of AclRoleAccesses\">\n <mat-option\n *ngIf=\"access.value === 0 || permission.accesses.indexOf(access.value) !== -1\"\n [value]=\"access.value\">\n {{ access.name }}\n </mat-option>\n </ng-container>\n </mat-select>\n </mat-form-field>\n </ng-template>\n </ng-template>\n </fs-list-column>\n </fs-list>\n </div>\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button mat-button type=\"submit\" color=\"primary\">{{ aclRole.id ? 'Save' : 'Create' }}</button>\n <button mat-button [mat-dialog-close]=\"null\" type=\"button\">Cancel</button>\n </mat-dialog-actions>\n </ng-container>\n </fs-dialog>\n</form>\n", styles: [":host .permissions ::ng-deep .fs-list-row-group{background-color:#f6f6f6}:host .permissions ::ng-deep fs-list .access{white-space:nowrap}:host .permissions ::ng-deep .mat-form-field{width:100px}:host .permissions ::ng-deep .mat-form-field .mat-form-field-wrapper{padding-bottom:0}:host .permissions ::ng-deep .mat-form-field .mat-form-field-infix{border-top:0}:host .permissions ::ng-deep .mat-form-field .mat-form-field-underline{bottom:0}:host ::ng-deep fs-radio-group{width:100%}:host ::ng-deep fs-label-field{width:100%}:host .level{width:100%}\n"], components: [{ type: i4.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode"] }, { type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i6.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["bottomMargin", "topMargin", "labelMargin"] }, { type: i6.FsLabelComponent, selector: "fs-label" }, { type: i7.FsRadioGroupComponent, selector: "fs-radio-group", inputs: ["orientation", "label", "name", "disabled", "radioPosition", "compareWith", "required"] }, { type: i8.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { type: i9.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "id", "labelPosition", "name", "required", "checked", "disabled", "indeterminate", "aria-describedby", "value"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i6.FsLabelMessageComponent, selector: "fs-label-message" }, { type: i10.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i11.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i12.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines"], outputs: ["filtersReady"] }, { type: i13.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i14.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i14.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i14.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i15.FsFormDirective, selector: "[fsForm]", inputs: ["wrapperSelector", "messageSelector", "hintSelector", "labelSelector", "autocomplete", "shortcuts", "confirm", "confirmDialog", "confirmDrawer", "confirmBrowser", "confirmTabs", "dirtySubmitButton", "submit", "successDelay", "errorDelay", "tabGroup"], outputs: ["fsForm", "invalid", "valid", "submitted", "reseted", "cleared"] }, { type: i16.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i2.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i17.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i17.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i17.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i18.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i14.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i15.FsFormRequiredDirective, selector: "[fsFormRequired],[ngModel][required]", inputs: ["fsFormRequired", "required", "fsFormRequiredMessage"] }, { type: i14.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i14.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i16.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { type: i14.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i12.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customize", "sortable", "sortableDefault", "direction", "align", "width", "class"] }, { type: i12.FsListGroupHeaderDirective, selector: "[fs-list-group-cell],[fs-list-group-header]" }, { type: i12.FsListCellDirective, selector: "[fs-list-cell]", inputs: ["colspan", "align", "class"] }, { type: i2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i15.FsSubmitButtonDirective, selector: "button[type=\"submit\"]", inputs: ["name", "dirtySubmit"] }, { type: i2.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["type", "mat-dialog-close", "aria-label", "matDialogClose"], exportAs: ["matDialogClose"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
188
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsAclRoleComponent, decorators: [{
189
- type: Component,
190
- args: [{
191
- templateUrl: './acl-role.component.html',
192
- styleUrls: ['./acl-role.component.scss'],
193
- changeDetection: ChangeDetectionStrategy.OnPush,
194
- }]
195
- }], ctorParameters: function () { return [{ type: i1.FsAppAclService }, { type: i2.MatDialogRef }, { type: i3.FsMessage }, { type: undefined, decorators: [{
196
- type: Inject,
197
- args: [MAT_DIALOG_DATA]
198
- }] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { list: [{
199
- type: ViewChild,
200
- args: [FsListComponent]
201
- }] } });
202
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNsLXJvbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb21wb25lbnRzL2FjbC1yb2xlL2FjbC1yb2xlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9hY2wtcm9sZS9hY2wtcm9sZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsTUFBTSxFQUdOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXpFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVuRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxlQUFlLEVBQWdCLE1BQU0sa0JBQWtCLENBQUM7QUFFakUsT0FBTyxFQUFFLFFBQVEsRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRbkUsTUFBTSxPQUFPLGtCQUFrQjtJQW9CN0IsWUFDbUIsY0FBK0IsRUFDL0IsVUFBNEMsRUFDNUMsUUFBbUIsRUFDTSxLQUFVLEVBQzVDLE1BQXlCO1FBSmhCLG1CQUFjLEdBQWQsY0FBYyxDQUFpQjtRQUMvQixlQUFVLEdBQVYsVUFBVSxDQUFrQztRQUM1QyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FB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SSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyx5QkFBeUI7UUFDL0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O2dIQTVNVSxrQkFBa0Isc0dBd0JuQixlQUFlO29HQXhCZCxrQkFBa0IsMEZBRWxCLGVBQWUsZ0RDOUI1QixnNUtBeUhBOzRGRDdGYSxrQkFBa0I7a0JBTDlCLFNBQVM7bUJBQUM7b0JBQ1QsV0FBVyxFQUFFLDJCQUEyQjtvQkFDeEMsU0FBUyxFQUFFLENBQUMsMkJBQTJCLENBQUM7b0JBQ3hDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNoRDs7MEJBeUJJLE1BQU07MkJBQUMsZUFBZTs0RUF0QlUsSUFBSTtzQkFBdEMsU0FBUzt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEluamVjdCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuaW1wb3J0IHsgQWNsUm9sZUFjY2Vzc2VzIH0gZnJvbSAnLi8uLi8uLi9jb25zdHMvYWNsLXJvbGUtYWNjZXNzZXMnO1xuaW1wb3J0IHsgQWNsUm9sZSB9IGZyb20gJy4vLi4vLi4vaW50ZXJmYWNlcy9hY2wtcm9sZSc7XG5pbXBvcnQgeyBtYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBGc01lc3NhZ2UgfSBmcm9tICdAZmlyZXN0aXRjaC9tZXNzYWdlJztcbmltcG9ydCB7IGxpc3QgfSBmcm9tICdAZmlyZXN0aXRjaC9jb21tb24nO1xuaW1wb3J0IHsgRnNMaXN0Q29tcG9uZW50LCBGc0xpc3RDb25maWcgfSBmcm9tICdAZmlyZXN0aXRjaC9saXN0JztcblxuaW1wb3J0IHsgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBGc0FwcEFjbFNlcnZpY2UgfSBmcm9tICcuLy4uLy4uL3NlcnZpY2VzL2FwcC1hY2wuc2VydmljZSc7XG5cblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnLi9hY2wtcm9sZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FjbC1yb2xlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBGc0FjbFJvbGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgQFZpZXdDaGlsZChGc0xpc3RDb21wb25lbnQpIHB1YmxpYyBsaXN0OiBGc0xpc3RDb21wb25lbnQ7XG5cbiAgcHVibGljIGFjbFJvbGU6IEFjbFJvbGUgPSBudWxsO1xuICBwdWJsaWMgZW52aXJvbm1lbnQ7XG4gIHB1YmxpYyBwZXJtaXNzaW9uczogYW55W10gPSBbXTtcbiAgcHVibGljIGxpc3RDb25maWc6IEZzTGlzdENvbmZpZztcbiAgcHVibGljIGxldmVsUGVybWlzc2lvbnMgPSBbXTtcbiAgcHVibGljIEFjbFJvbGVBY2Nlc3NlcyA9IEFjbFJvbGVBY2Nlc3NlcztcbiAgcHVibGljIGluZGV4ZWRBY2Nlc3NlcyA9IHt9O1xuICBwdWJsaWMgYWNsTGV2ZWxzOiBhbnlbXSA9IFtdO1xuICBwdWJsaWMgaW5kZXhlZEFjbExldmVscyA9IHt9O1xuICBwdWJsaWMgb25seUZ1bGxBY2Nlc3MgPSBmYWxzZTtcbiAgcHVibGljIEFjbExldmVscyA9IHt9O1xuICBwdWJsaWMgYWNsUm9sZUNvbmZpZ3MgPSBbXTtcbiAgcHVibGljIGxldmVsQWNsUm9sZUNvbmZpZ3MgPSBbXTtcblxuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfYXBwQWNsU2VydmljZTogRnNBcHBBY2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPEZzQWNsUm9sZUNvbXBvbmVudD4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWVzc2FnZTogRnNNZXNzYWdlLFxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwcml2YXRlIHJlYWRvbmx5IF9kYXRhOiBhbnksXG4gICAgcHJpdmF0ZSBfY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHt9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGZvcmtKb2luKFxuICAgICAgdGhpcy5nZXRSb2xlKCksXG4gICAgICB0aGlzLl9hcHBBY2xTZXJ2aWNlLmdldFBlcm1pc3Npb25zKCksXG4gICAgKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKFtcbiAgICAgICAgYWNsUm9sZSxcbiAgICAgICAgYWNsUGVybWlzc2lvbnMsXG4gICAgICBdKSA9PiB7XG5cbiAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IGFjbFBlcm1pc3Npb25zO1xuICAgICAgICB0aGlzLmFjbExldmVscyA9IHRoaXMuX2RhdGEuYWNsTGV2ZWxzO1xuXG4gICAgICAgIHRoaXMuaW5kZXhlZEFjbExldmVscyA9IGxpc3QodGhpcy5hY2xMZXZlbHMsICduYW1lJywgJ3ZhbHVlJyk7XG4gICAgICAgIHRoaXMuaW5kZXhlZEFjY2Vzc2VzID0gbGlzdChBY2xSb2xlQWNjZXNzZXMsICduYW1lJywgJ3ZhbHVlJyk7XG5cbiAgICAgICAgdGhpcy5hY2xSb2xlID0ge1xuICAgICAgICAgIC4uLntcbiAgICAgICAgICAgIGFjbFBlcm1pc3Npb25zOiBbXSxcbiAgICAgICAgICAgIGFsbFBlcm1pc3Npb25zOiB0cnVlLFxuICAgICAgICAgICAgYWNsUm9sZUNvbmZpZ3M6IFtdLFxuICAgICAgICAgICAgcGVybWlzc2lvbnM6IHt9LFxuICAgICAgICAgICAgbGV2ZWw6IHRoaXMuYWNsTGV2ZWxzWzBdLnZhbHVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uYWNsUm9sZSxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy5hY2xSb2xlLmlkKSB7XG4gICAgICAgICAgdGhpcy5wZXJtaXNzaW9ucy5mb3JFYWNoKChwZXJtaXNzaW9uKSA9PiB7XG4gICAgICAgICAgICBsZXQgYWNjZXNzID0gMDtcblxuICAgICAgICAgICAgY29uc3QgYWNsUGVybWlzc2lvbiA9IHRoaXMuYWNsUm9sZS5hY2xQZXJtaXNzaW9ucy5maW5kKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBpdGVtLnBlcm1pc3Npb24gPT09IHBlcm1pc3Npb24udmFsdWU7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGFjbFBlcm1pc3Npb24pIHtcbiAgICAgICAgICAgICAgYWNjZXNzID0gYWNsUGVybWlzc2lvbi5hY2Nlc3M7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYWNsUm9sZS5wZXJtaXNzaW9uc1twZXJtaXNzaW9uLnZhbHVlXSA9IGFjY2VzcztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFjbFJvbGUuYWxsUGVybWlzc2lvbnMpIHtcbiAgICAgICAgICB0aGlzLl9hcHBseU1heFBlcm1pc3Npb25BY2Nlc3MoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VwZGF0ZVBlcm1pc3Npb25zKCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUFjbFJvbGVDb25maWdzKCk7XG5cbiAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMubGlzdENvbmZpZyA9IHtcbiAgICAgIHN0YXR1czogZmFsc2UsXG4gICAgICBwYWdpbmc6IGZhbHNlLFxuICAgICAgbm9SZXN1bHRzOiB7XG4gICAgICAgIG1lc3NhZ2U6ICcnLFxuICAgICAgfSxcbiAgICAgIGdyb3VwOiB7XG4gICAgICAgIGluaXRpYWxFeHBhbmQ6IHRydWUsXG4gICAgICAgIGdyb3VwQnk6IChkYXRhKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBhcmVCeTogKGRhdGEpID0+IHtcbiAgICAgICAgICByZXR1cm4gZGF0YS5jYXRlZ29yeSB8fCAnR2VuZXJhbCc7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZmV0Y2g6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG9mKHtcbiAgICAgICAgICBkYXRhOiB0aGlzLmxldmVsUGVybWlzc2lvbnMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgYSA9IGEubmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgYiA9IGIubmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKGEgPCBiKSB7XG4gICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYSA+IGIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBsZXZlbENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLl91cGRhdGVQZXJtaXNzaW9ucygpO1xuICAgIHRoaXMuX3VwZGF0ZUFjbFJvbGVDb25maWdzKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmxpc3QucmVsb2FkKCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Um9sZSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmICghdGhpcy5fZGF0YS5hY2xSb2xlLmlkKSB7XG4gICAgICByZXR1cm4gb2YodGhpcy5fZGF0YS5hY2xSb2xlKTtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeTogYW55ID0ge1xuICAgICAgYWNsUGVybWlzc2lvbnM6IHRydWUsXG4gICAgICBhY2xSb2xlQ29uZmlnczogdHJ1ZSxcbiAgICB9O1xuXG4gICAgaWYgKCF0aGlzLmVudmlyb25tZW50KSB7XG4gICAgICBxdWVyeS5lbnZpcm9ubWVudElkID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZGF0YS5sb2FkQWNsUm9sZSh0aGlzLl9kYXRhLmFjbFJvbGUsIHF1ZXJ5KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoZGF0YSkgPT4gdGhpcy5fYXBwQWNsU2VydmljZS5pbnB1dChkYXRhKSksXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIHNhdmUgPSAoKTogT2JzZXJ2YWJsZTxhbnk+ID0+IHtcbiAgICBjb25zdCBhY2xSb2xlID0ge1xuICAgICAgLi4udGhpcy5hY2xSb2xlLFxuICAgICAgcGVybWlzc2lvbnM6IHRoaXMubGV2ZWxQZXJtaXNzaW9ucy5tYXAoKHBlcm1pc3Npb24pID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2YWx1ZTogcGVybWlzc2lvbi52YWx1ZSxcbiAgICAgICAgICBhY2Nlc3M6IHRoaXMuYWNsUm9sZS5wZXJtaXNzaW9uc1twZXJtaXNzaW9uLnZhbHVlXSB8fCAwLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgICBhY2xSb2xlQ29uZmlnczogdGhpcy5sZXZlbEFjbFJvbGVDb25maWdzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlkOiBpdGVtLmlkLFxuICAgICAgICAgIHZhbHVlOiBpdGVtLnZhbHVlLFxuICAgICAgICAgIGRhdGE6IGl0ZW0uZGF0YSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5fZGF0YS5zYXZlQWNsUm9sZSh0aGlzLl9hcHBBY2xTZXJ2aWNlLm91dHB1dChhY2xSb2xlKSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdTYXZlZCBDaGFuZ2VzJyk7XG4gICAgICAgICAgdGhpcy5jbG9zZShyZXNwb25zZSk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZShkYXRhOiBhbnkgPSBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fZGlhbG9nUmVmLmNsb3NlKGRhdGEpO1xuICB9XG5cbiAgcHVibGljIGFsbFBlcm1pc3Npb25zQ2hhbmdlKGFsbDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX3VwZGF0ZVBlcm1pc3Npb25zKCk7XG4gICAgaWYgKGFsbCkge1xuICAgICAgdGhpcy5fYXBwbHlNYXhQZXJtaXNzaW9uQWNjZXNzKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlUGVybWlzc2lvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5sZXZlbFBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9ucy5maWx0ZXIoKHBlcm1pc3Npb24pID0+IHtcbiAgICAgIHJldHVybiBwZXJtaXNzaW9uLmxldmVscy5zb21lKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtID09PSB0aGlzLmFjbFJvbGUubGV2ZWw7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUFjbFJvbGVDb25maWdzKCk6IHZvaWQge1xuICAgIHRoaXMubGV2ZWxBY2xSb2xlQ29uZmlncyA9IHRoaXMuYWNsUm9sZUNvbmZpZ3MuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5hY2xSb2xlLmxldmVsID09PSBpdGVtLmxldmVsO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXBwbHlNYXhQZXJtaXNzaW9uQWNjZXNzKCk6IHZvaWQge1xuICAgIHRoaXMucGVybWlzc2lvbnMuZm9yRWFjaCgocGVybWlzc2lvbikgPT4ge1xuICAgICAgdGhpcy5hY2xSb2xlLnBlcm1pc3Npb25zW3Blcm1pc3Npb24udmFsdWVdID0gTWF0aC5tYXgoLi4ucGVybWlzc2lvbi5hY2Nlc3Nlcyk7XG4gICAgfSk7XG4gIH1cblxufVxuIiwiPGZvcm0gZnNGb3JtIFtzdWJtaXRdPVwic2F2ZVwiPlxuICA8ZnMtZGlhbG9nPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY2xSb2xlXCI+XG4gICAgICA8ZGl2IG1hdC1kaWFsb2ctdGl0bGU+e3sgYWNsUm9sZS5pZCA/ICdFZGl0JyA6ICdDcmVhdGUnIH19IFJvbGU8L2Rpdj5cbiAgICAgIDxtYXQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dC5sdC1tZD1cImNvbHVtblwiIGZ4TGF5b3V0R2FwPVwiNDBweFwiIGZ4TGF5b3V0R2FwLmx0LW1kPVwiMFwiPlxuICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeEZsZXggZnhGbGV4Lmx0LW1kPVwiMFwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJOYW1lXCIgWyhuZ01vZGVsKV09XCJhY2xSb2xlLm5hbWVcIiBuYW1lPVwibmFtZVwiIGZzRm9ybVJlcXVpcmVkPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgPGZzLWxhYmVsLWZpZWxkICpuZ0lmPVwiYWNsUm9sZS5pZCB8fCBhY2xMZXZlbHMubGVuZ3RoID09PSAxOyBlbHNlIGxldmVsc1wiPlxuICAgICAgICAgICAgICA8ZnMtbGFiZWw+TGV2ZWw8L2ZzLWxhYmVsPlxuICAgICAgICAgICAgICB7e2luZGV4ZWRBY2xMZXZlbHNbYWNsUm9sZS5sZXZlbF19fVxuICAgICAgICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNsZXZlbHM+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZXZlbFwiPlxuICAgICAgICAgICAgICAgIDxmcy1yYWRpby1ncm91cFxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhY2xSb2xlLmxldmVsXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImxldmVsQ2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgZnNGb3JtUmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgIGxhYmVsPVwiTGV2ZWxcIlxuICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb249XCJ2ZXJ0aWNhbFwiXG4gICAgICAgICAgICAgICAgICBuYW1lPVwibGV2ZWxcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGFjbExldmVsc1wiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhYWNsUm9sZS5wcm90ZWN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2ZzLXJhZGlvLWdyb3VwPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgIDxmcy1sYWJlbC1maWVsZCAqbmdJZj1cImxldmVsUGVybWlzc2lvbnMubGVuZ3RoXCI+XG4gICAgICAgICAgICAgIDxmcy1sYWJlbD5BbGwgUGVybWlzc2lvbnM8L2ZzLWxhYmVsPlxuICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhY2xSb2xlLmFsbFBlcm1pc3Npb25zXCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJhbGxQZXJtaXNzaW9uc0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiISFhY2xSb2xlLnByb3RlY3RlZFwiXG4gICAgICAgICAgICAgICAgbmFtZT1cImFsbFBlcm1pc3Npb25zXCI+XG4gICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgICAgICAgPGRpdiBmeExheW91dD1cImNvbHVtblwiICpuZ0Zvcj1cImxldCBjb25maWcgb2YgbGV2ZWxBY2xSb2xlQ29uZmlnc1wiPlxuICAgICAgICAgICAgICA8ZnMtbGFiZWwtZmllbGQgKm5nSWY9XCJjb25maWcuaW50ZXJmYWNlID09PSAnY2hlY2tib3gnXCI+XG4gICAgICAgICAgICAgICAgPGZzLWxhYmVsPnt7Y29uZmlnLm5hbWV9fTwvZnMtbGFiZWw+XG4gICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb25maWcuZGF0YVwiXG4gICAgICAgICAgICAgICAgICBbbmFtZV09XCJjb25maWcubmFtZVwiPlxuICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIDxmcy1sYWJlbC1tZXNzYWdlPlxuICAgICAgICAgICAgICAgICAgPG1hdC1oaW50Pnt7Y29uZmlnLmRlc2NyaXB0aW9ufX08L21hdC1oaW50PlxuICAgICAgICAgICAgICAgIDwvZnMtbGFiZWwtbWVzc2FnZT5cbiAgICAgICAgICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJjb25maWcuaW50ZXJmYWNlID09PSAnc2VsZWN0J1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbmZpZy5kYXRhXCJcbiAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImNvbmZpZy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiY29uZmlnLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJjb25maWcubmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNvbmZpZy52YWx1ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8bWF0LWhpbnQ+e3tjb25maWcuZGVzY3JpcHRpb259fTwvbWF0LWhpbnQ+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeEZsZXg9XCI2NVwiIGZ4RmxleC5sdC1tZD1cIjBcIiAqbmdJZj1cImFjbFJvbGUubGV2ZWxcIiBbaGlkZGVuXT1cIiFsZXZlbFBlcm1pc3Npb25zLmxlbmd0aFwiIGNsYXNzPVwicGVybWlzc2lvbnNcIj5cblxuICAgICAgICAgICAgPGZzLWxpc3QgW2NvbmZpZ109XCJsaXN0Q29uZmlnXCI+XG4gICAgICAgICAgICAgIDxmcy1saXN0LWNvbHVtbiB0aXRsZT1cIlBlcm1pc3Npb25zXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGNvbHNwYW49XCIyXCIgZnMtbGlzdC1ncm91cC1jZWxsIGxldC1yb3c9XCJyb3dcIiBjbGFzcz1cInBlcm1pc3Npb24tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxzbWFsbD48Yj57e3Jvdy5jYXRlZ29yeSB8fCAnR2VuZXJhbCd9fTwvYj48L3NtYWxsPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtY2VsbCBsZXQtcm93PVwicm93XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVybWlzc2lvblwiPnt7IHJvdy5uYW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzY3JpcHRpb24gc21hbGxcIj57eyByb3cuZGVzY3JpcHRpb24gfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L2ZzLWxpc3QtY29sdW1uPlxuICAgICAgICAgICAgICA8ZnMtbGlzdC1jb2x1bW4gdGl0bGU9XCJBY2Nlc3NcIiB3aWR0aD1cIjElXCIgY2xhc3M9XCJhY2Nlc3NcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1jZWxsIGxldC1yb3c9XCJwZXJtaXNzaW9uXCIgbGV0LXBlcm1pc3Npb249XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiYWNsUm9sZS5hbGxQZXJtaXNzaW9uczsgZWxzZSBlbHNlQWxsXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGluZGV4ZWRBY2Nlc3Nlc1thY2xSb2xlLnBlcm1pc3Npb25zW3Blcm1pc3Npb24udmFsdWVdXSB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbHNlQWxsPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYWNsUm9sZS5wZXJtaXNzaW9uc1twZXJtaXNzaW9uLnZhbHVlXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiISFhY2xSb2xlLnByb3RlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBmc0Zvcm1SZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImFjY2Vzcy17eyBwZXJtaXNzaW9uLnZhbHVlIH19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhY2Nlc3Mgb2YgQWNsUm9sZUFjY2Vzc2VzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhY2Nlc3MudmFsdWUgPT09IDAgfHwgcGVybWlzc2lvbi5hY2Nlc3Nlcy5pbmRleE9mKGFjY2Vzcy52YWx1ZSkgIT09IC0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiYWNjZXNzLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBhY2Nlc3MubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvZnMtbGlzdC1jb2x1bW4+XG4gICAgICAgICAgICA8L2ZzLWxpc3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgICA8bWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gdHlwZT1cInN1Ym1pdFwiIGNvbG9yPVwicHJpbWFyeVwiPnt7IGFjbFJvbGUuaWQgPyAnU2F2ZScgOiAnQ3JlYXRlJyB9fTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gW21hdC1kaWFsb2ctY2xvc2VdPVwibnVsbFwiIHR5cGU9XCJidXR0b25cIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2ZzLWRpYWxvZz5cbjwvZm9ybT5cbiJdfQ==
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, ViewChild } from '@angular/core';
2
+ import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
3
+ import { AclRoleAccesses } from './../../consts/acl-role-accesses';
4
+ import { takeUntil, tap } from 'rxjs/operators';
5
+ import { FsMessage } from '@firestitch/message';
6
+ import { list } from '@firestitch/common';
7
+ import { FsListComponent } from '@firestitch/list';
8
+ import { forkJoin, of, Subject } from 'rxjs';
9
+ import { FsAppAclService } from './../../services/app-acl.service';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "./../../services/app-acl.service";
12
+ import * as i2 from "@angular/material/dialog";
13
+ import * as i3 from "@firestitch/message";
14
+ import * as i4 from "@firestitch/dialog";
15
+ import * as i5 from "@angular/material/form-field";
16
+ import * as i6 from "@firestitch/label";
17
+ import * as i7 from "@firestitch/radiogroup";
18
+ import * as i8 from "@angular/material/radio";
19
+ import * as i9 from "@angular/material/checkbox";
20
+ import * as i10 from "@angular/material/select";
21
+ import * as i11 from "@angular/material/core";
22
+ import * as i12 from "@firestitch/list";
23
+ import * as i13 from "@angular/material/button";
24
+ import * as i14 from "@angular/forms";
25
+ import * as i15 from "@firestitch/form";
26
+ import * as i16 from "@angular/common";
27
+ import * as i17 from "@angular/flex-layout/flex";
28
+ import * as i18 from "@angular/material/input";
29
+ export class FsAclRoleComponent {
30
+ constructor(_appAclService, _dialogRef, _message, _data, _cdRef) {
31
+ this._appAclService = _appAclService;
32
+ this._dialogRef = _dialogRef;
33
+ this._message = _message;
34
+ this._data = _data;
35
+ this._cdRef = _cdRef;
36
+ this.aclRole = null;
37
+ this.permissions = [];
38
+ this.levelPermissions = [];
39
+ this.AclRoleAccesses = AclRoleAccesses;
40
+ this.indexedAccesses = {};
41
+ this.aclLevels = [];
42
+ this.indexedAclLevels = {};
43
+ this.onlyFullAccess = false;
44
+ this.AclLevels = {};
45
+ this.aclRoleConfigs = [];
46
+ this.levelAclRoleConfigs = [];
47
+ this._destroy$ = new Subject();
48
+ this.save = () => {
49
+ const aclRole = Object.assign(Object.assign({}, this.aclRole), { permissions: this.levelPermissions.map((permission) => {
50
+ return {
51
+ value: permission.value,
52
+ access: this.aclRole.permissions[permission.value] || 0,
53
+ };
54
+ }), aclRoleConfigs: this.levelAclRoleConfigs.map((item) => {
55
+ return {
56
+ id: item.id,
57
+ value: item.value,
58
+ data: item.data,
59
+ };
60
+ }) });
61
+ return this._data.saveAclRole(aclRole)
62
+ .pipe(tap((response) => {
63
+ this._message.success('Saved Changes');
64
+ this.close(response);
65
+ }));
66
+ };
67
+ }
68
+ ngOnInit() {
69
+ forkJoin(this.getRole(), this._appAclService.getPermissions())
70
+ .pipe(takeUntil(this._destroy$))
71
+ .subscribe(([aclRole, aclPermissions,]) => {
72
+ this.permissions = aclPermissions;
73
+ this.aclLevels = this._data.aclLevels;
74
+ this.indexedAclLevels = list(this.aclLevels, 'name', 'value');
75
+ this.indexedAccesses = list(AclRoleAccesses, 'name', 'value');
76
+ this.aclRole = Object.assign({
77
+ aclPermissions: [],
78
+ allPermissions: true,
79
+ aclRoleConfigs: [],
80
+ permissions: {},
81
+ level: this.aclLevels[0].value,
82
+ }, aclRole);
83
+ if (this.aclRole.id) {
84
+ this.permissions.forEach((permission) => {
85
+ let access = 0;
86
+ const aclPermission = this.aclRole.aclPermissions.find((item) => {
87
+ return item.permission === permission.value;
88
+ });
89
+ if (aclPermission) {
90
+ access = aclPermission.access;
91
+ }
92
+ this.aclRole.permissions[permission.value] = access;
93
+ });
94
+ }
95
+ if (this.aclRole.allPermissions) {
96
+ this._applyMaxPermissionAccess();
97
+ }
98
+ this._updatePermissions();
99
+ this._updateAclRoleConfigs();
100
+ this._cdRef.markForCheck();
101
+ });
102
+ this.listConfig = {
103
+ status: false,
104
+ paging: false,
105
+ noResults: {
106
+ message: '',
107
+ },
108
+ group: {
109
+ initialExpand: true,
110
+ groupBy: (data) => {
111
+ return data;
112
+ },
113
+ compareBy: (data) => {
114
+ return data.category || 'General';
115
+ },
116
+ },
117
+ fetch: () => {
118
+ return of({
119
+ data: this.levelPermissions.sort((a, b) => {
120
+ a = a.name.toUpperCase();
121
+ b = b.name.toUpperCase();
122
+ if (a < b) {
123
+ return -1;
124
+ }
125
+ else if (a > b) {
126
+ return 1;
127
+ }
128
+ return 0;
129
+ }),
130
+ });
131
+ },
132
+ };
133
+ }
134
+ levelChange() {
135
+ this._updatePermissions();
136
+ this._updateAclRoleConfigs();
137
+ setTimeout(() => {
138
+ this.list.reload();
139
+ });
140
+ }
141
+ getRole() {
142
+ if (!this._data.aclRole.id) {
143
+ return of(this._data.aclRole);
144
+ }
145
+ const query = {
146
+ aclPermissions: true,
147
+ aclRoleConfigs: true,
148
+ };
149
+ if (!this.environment) {
150
+ query.environmentId = null;
151
+ }
152
+ return this._data.loadAclRole(this._data.aclRole, query);
153
+ }
154
+ close(data = null) {
155
+ this._dialogRef.close(data);
156
+ }
157
+ allPermissionsChange(all) {
158
+ this._updatePermissions();
159
+ if (all) {
160
+ this._applyMaxPermissionAccess();
161
+ }
162
+ }
163
+ ngOnDestroy() {
164
+ this._destroy$.next();
165
+ this._destroy$.complete();
166
+ }
167
+ _updatePermissions() {
168
+ this.levelPermissions = this.permissions.filter((permission) => {
169
+ return permission.levels.some((item) => {
170
+ return item === this.aclRole.level;
171
+ });
172
+ });
173
+ }
174
+ _updateAclRoleConfigs() {
175
+ this.levelAclRoleConfigs = this.aclRoleConfigs.filter((item) => {
176
+ return this.aclRole.level === item.level;
177
+ });
178
+ }
179
+ _applyMaxPermissionAccess() {
180
+ this.permissions.forEach((permission) => {
181
+ this.aclRole.permissions[permission.value] = Math.max(...permission.accesses);
182
+ });
183
+ }
184
+ }
185
+ FsAclRoleComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsAclRoleComponent, deps: [{ token: i1.FsAppAclService }, { token: i2.MatDialogRef }, { token: i3.FsMessage }, { token: MAT_DIALOG_DATA }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
186
+ FsAclRoleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: FsAclRoleComponent, selector: "ng-component", viewQueries: [{ propertyName: "list", first: true, predicate: FsListComponent, descendants: true }], ngImport: i0, template: "<form fsForm [submit]=\"save\">\n <fs-dialog>\n <ng-container *ngIf=\"aclRole\">\n <div mat-dialog-title>{{ aclRole.id ? 'Edit' : 'Create' }} Role</div>\n <mat-dialog-content>\n <div fxLayout=\"row\" fxLayout.lt-md=\"column\" fxLayoutGap=\"40px\" fxLayoutGap.lt-md=\"0\">\n <div fxLayout=\"column\" fxFlex fxFlex.lt-md=\"0\">\n <mat-form-field>\n <input matInput placeholder=\"Name\" [(ngModel)]=\"aclRole.name\" name=\"name\" fsFormRequired>\n </mat-form-field>\n\n <fs-label-field *ngIf=\"aclRole.id || aclLevels.length === 1; else levels\">\n <fs-label>Level</fs-label>\n {{indexedAclLevels[aclRole.level]}}\n </fs-label-field>\n\n <ng-template #levels>\n <div class=\"level\">\n <fs-radio-group\n [(ngModel)]=\"aclRole.level\"\n (ngModelChange)=\"levelChange()\"\n fsFormRequired\n label=\"Level\"\n orientation=\"vertical\"\n name=\"level\">\n <mat-radio-button\n *ngFor=\"let item of aclLevels\"\n [value]=\"item.value\"\n [disabled]=\"!!aclRole.protected\">\n {{ item.name }}\n </mat-radio-button>\n </fs-radio-group>\n </div>\n </ng-template>\n\n <fs-label-field *ngIf=\"levelPermissions.length\">\n <fs-label>All Permissions</fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRole.allPermissions\"\n (ngModelChange)=\"allPermissionsChange($event)\"\n [disabled]=\"!!aclRole.protected\"\n name=\"allPermissions\">\n </mat-checkbox>\n </fs-label-field>\n\n <div fxLayout=\"column\" *ngFor=\"let config of levelAclRoleConfigs\">\n <fs-label-field *ngIf=\"config.interface === 'checkbox'\">\n <fs-label>{{config.name}}</fs-label>\n <mat-checkbox\n [(ngModel)]=\"config.data\"\n [name]=\"config.name\">\n </mat-checkbox>\n <fs-label-message>\n <mat-hint>{{config.description}}</mat-hint>\n </fs-label-message>\n </fs-label-field>\n\n <mat-form-field *ngIf=\"config.interface === 'select'\">\n <mat-select\n [(ngModel)]=\"config.data\"\n [name]=\"config.value\"\n [required]=\"config.required\"\n [placeholder]=\"config.name\">\n <mat-option\n *ngFor=\"let item of config.values\"\n [value]=\"item.value\">\n {{ item.name }}\n </mat-option>\n </mat-select>\n <mat-hint>{{config.description}}</mat-hint>\n </mat-form-field>\n </div>\n </div>\n\n <div fxLayout=\"column\" fxFlex=\"65\" fxFlex.lt-md=\"0\" *ngIf=\"aclRole.level\" [hidden]=\"!levelPermissions.length\" class=\"permissions\">\n\n <fs-list [config]=\"listConfig\">\n <fs-list-column title=\"Permissions\">\n <ng-template colspan=\"2\" fs-list-group-cell let-row=\"row\" class=\"permission-group\">\n <small><b>{{row.category || 'General'}}</b></small>\n </ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <div class=\"permission\">{{ row.name }}</div>\n <div class=\"description small\">{{ row.description }}</div>\n </ng-template>\n </fs-list-column>\n <fs-list-column title=\"Access\" width=\"1%\" class=\"access\">\n <ng-template fs-list-cell let-row=\"permission\" let-permission=\"row\">\n <span *ngIf=\"aclRole.allPermissions; else elseAll\">\n {{ indexedAccesses[aclRole.permissions[permission.value]] }}\n </span>\n <ng-template #elseAll>\n <mat-form-field>\n <mat-select\n [(ngModel)]=\"aclRole.permissions[permission.value]\"\n [disabled]=\"!!aclRole.protected\"\n fsFormRequired\n name=\"access-{{ permission.value }}\">\n <ng-container *ngFor=\"let access of AclRoleAccesses\">\n <mat-option\n *ngIf=\"access.value === 0 || permission.accesses.indexOf(access.value) !== -1\"\n [value]=\"access.value\">\n {{ access.name }}\n </mat-option>\n </ng-container>\n </mat-select>\n </mat-form-field>\n </ng-template>\n </ng-template>\n </fs-list-column>\n </fs-list>\n </div>\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button mat-button type=\"submit\" color=\"primary\">{{ aclRole.id ? 'Save' : 'Create' }}</button>\n <button mat-button [mat-dialog-close]=\"null\" type=\"button\">Cancel</button>\n </mat-dialog-actions>\n </ng-container>\n </fs-dialog>\n</form>\n", styles: [":host .permissions ::ng-deep .fs-list-row-group{background-color:#f6f6f6}:host .permissions ::ng-deep fs-list .access{white-space:nowrap}:host .permissions ::ng-deep .mat-form-field{width:100px}:host .permissions ::ng-deep .mat-form-field .mat-form-field-wrapper{padding-bottom:0}:host .permissions ::ng-deep .mat-form-field .mat-form-field-infix{border-top:0}:host .permissions ::ng-deep .mat-form-field .mat-form-field-underline{bottom:0}:host ::ng-deep fs-radio-group{width:100%}:host ::ng-deep fs-label-field{width:100%}:host .level{width:100%}\n"], components: [{ type: i4.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode"] }, { type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i6.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["bottomMargin", "topMargin", "labelMargin"] }, { type: i6.FsLabelComponent, selector: "fs-label" }, { type: i7.FsRadioGroupComponent, selector: "fs-radio-group", inputs: ["orientation", "label", "name", "disabled", "radioPosition", "compareWith", "required"] }, { type: i8.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { type: i9.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "id", "labelPosition", "name", "required", "checked", "disabled", "indeterminate", "aria-describedby", "value"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i6.FsLabelMessageComponent, selector: "fs-label-message" }, { type: i10.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i11.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i12.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines"], outputs: ["filtersReady"] }, { type: i13.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i14.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i14.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i14.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i15.FsFormDirective, selector: "[fsForm]", inputs: ["wrapperSelector", "messageSelector", "hintSelector", "labelSelector", "autocomplete", "shortcuts", "confirm", "confirmDialog", "confirmDrawer", "confirmBrowser", "confirmTabs", "dirtySubmitButton", "submit", "successDelay", "errorDelay", "tabGroup"], outputs: ["fsForm", "invalid", "valid", "submitted", "reseted", "cleared"] }, { type: i16.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i2.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i17.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i17.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i17.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i18.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i14.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i15.FsFormRequiredDirective, selector: "[fsFormRequired],[ngModel][required]", inputs: ["fsFormRequired", "required", "fsFormRequiredMessage"] }, { type: i14.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i14.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i16.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { type: i14.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i12.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customize", "sortable", "sortableDefault", "direction", "align", "width", "class"] }, { type: i12.FsListGroupHeaderDirective, selector: "[fs-list-group-cell],[fs-list-group-header]" }, { type: i12.FsListCellDirective, selector: "[fs-list-cell]", inputs: ["colspan", "align", "class"] }, { type: i2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i15.FsSubmitButtonDirective, selector: "button[type=\"submit\"]", inputs: ["name", "dirtySubmit"] }, { type: i2.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["type", "mat-dialog-close", "aria-label", "matDialogClose"], exportAs: ["matDialogClose"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
187
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsAclRoleComponent, decorators: [{
188
+ type: Component,
189
+ args: [{
190
+ templateUrl: './acl-role.component.html',
191
+ styleUrls: ['./acl-role.component.scss'],
192
+ changeDetection: ChangeDetectionStrategy.OnPush,
193
+ }]
194
+ }], ctorParameters: function () { return [{ type: i1.FsAppAclService }, { type: i2.MatDialogRef }, { type: i3.FsMessage }, { type: undefined, decorators: [{
195
+ type: Inject,
196
+ args: [MAT_DIALOG_DATA]
197
+ }] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { list: [{
198
+ type: ViewChild,
199
+ args: [FsListComponent]
200
+ }] } });
201
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNsLXJvbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb21wb25lbnRzL2FjbC1yb2xlL2FjbC1yb2xlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9hY2wtcm9sZS9hY2wtcm9sZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsTUFBTSxFQUdOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXpFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVuRSxPQUFPLEVBQU8sU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUMsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRSxPQUFPLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVFuRSxNQUFNLE9BQU8sa0JBQWtCO0lBb0I3QixZQUNtQixjQUErQixFQUMvQixVQUE0QyxFQUM1QyxRQUFtQixFQUNNLEtBQVUsRUFDNUMsTUFBeUI7UUFKaEIsbUJBQWMsR0FBZCxjQUFjLENBQWlCO1FBQy9CLGVBQVUsR0FBVixVQUFVLENBQWtDO1FBQzVDLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDTSxVQUFLLEdB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WUFDdEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztnSEF6TVUsa0JBQWtCLHNHQXdCbkIsZUFBZTtvR0F4QmQsa0JBQWtCLDBGQUVsQixlQUFlLGdEQzlCNUIsZzVLQXlIQTs0RkQ3RmEsa0JBQWtCO2tCQUw5QixTQUFTO21CQUFDO29CQUNULFdBQVcsRUFBRSwyQkFBMkI7b0JBQ3hDLFNBQVMsRUFBRSxDQUFDLDJCQUEyQixDQUFDO29CQUN4QyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDaEQ7OzBCQXlCSSxNQUFNOzJCQUFDLGVBQWU7NEVBdEJVLElBQUk7c0JBQXRDLFNBQVM7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBJbmplY3QsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5cbmltcG9ydCB7IEFjbFJvbGVBY2Nlc3NlcyB9IGZyb20gJy4vLi4vLi4vY29uc3RzL2FjbC1yb2xlLWFjY2Vzc2VzJztcbmltcG9ydCB7IEFjbFJvbGUgfSBmcm9tICcuLy4uLy4uL2ludGVyZmFjZXMvYWNsLXJvbGUnO1xuaW1wb3J0IHsgbWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgRnNNZXNzYWdlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbWVzc2FnZSc7XG5pbXBvcnQgeyBsaXN0IH0gZnJvbSAnQGZpcmVzdGl0Y2gvY29tbW9uJztcbmltcG9ydCB7IEZzTGlzdENvbXBvbmVudCwgRnNMaXN0Q29uZmlnIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbGlzdCc7XG5cbmltcG9ydCB7IGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRnNBcHBBY2xTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi9zZXJ2aWNlcy9hcHAtYWNsLnNlcnZpY2UnO1xuXG5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJy4vYWNsLXJvbGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hY2wtcm9sZS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRnNBY2xSb2xlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBWaWV3Q2hpbGQoRnNMaXN0Q29tcG9uZW50KSBwdWJsaWMgbGlzdDogRnNMaXN0Q29tcG9uZW50O1xuXG4gIHB1YmxpYyBhY2xSb2xlOiBBY2xSb2xlID0gbnVsbDtcbiAgcHVibGljIGVudmlyb25tZW50O1xuICBwdWJsaWMgcGVybWlzc2lvbnM6IGFueVtdID0gW107XG4gIHB1YmxpYyBsaXN0Q29uZmlnOiBGc0xpc3RDb25maWc7XG4gIHB1YmxpYyBsZXZlbFBlcm1pc3Npb25zID0gW107XG4gIHB1YmxpYyBBY2xSb2xlQWNjZXNzZXMgPSBBY2xSb2xlQWNjZXNzZXM7XG4gIHB1YmxpYyBpbmRleGVkQWNjZXNzZXMgPSB7fTtcbiAgcHVibGljIGFjbExldmVsczogYW55W10gPSBbXTtcbiAgcHVibGljIGluZGV4ZWRBY2xMZXZlbHMgPSB7fTtcbiAgcHVibGljIG9ubHlGdWxsQWNjZXNzID0gZmFsc2U7XG4gIHB1YmxpYyBBY2xMZXZlbHMgPSB7fTtcbiAgcHVibGljIGFjbFJvbGVDb25maWdzID0gW107XG4gIHB1YmxpYyBsZXZlbEFjbFJvbGVDb25maWdzID0gW107XG5cbiAgcHJpdmF0ZSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2FwcEFjbFNlcnZpY2U6IEZzQXBwQWNsU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxGc0FjbFJvbGVDb21wb25lbnQ+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX21lc3NhZ2U6IEZzTWVzc2FnZSxcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHJpdmF0ZSByZWFkb25seSBfZGF0YTogYW55LFxuICAgIHByaXZhdGUgX2NkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7fVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBmb3JrSm9pbihcbiAgICAgIHRoaXMuZ2V0Um9sZSgpLFxuICAgICAgdGhpcy5fYXBwQWNsU2VydmljZS5nZXRQZXJtaXNzaW9ucygpLFxuICAgIClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKChbXG4gICAgICAgIGFjbFJvbGUsXG4gICAgICAgIGFjbFBlcm1pc3Npb25zLFxuICAgICAgXSkgPT4ge1xuXG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBhY2xQZXJtaXNzaW9ucztcbiAgICAgICAgdGhpcy5hY2xMZXZlbHMgPSB0aGlzLl9kYXRhLmFjbExldmVscztcblxuICAgICAgICB0aGlzLmluZGV4ZWRBY2xMZXZlbHMgPSBsaXN0KHRoaXMuYWNsTGV2ZWxzLCAnbmFtZScsICd2YWx1ZScpO1xuICAgICAgICB0aGlzLmluZGV4ZWRBY2Nlc3NlcyA9IGxpc3QoQWNsUm9sZUFjY2Vzc2VzLCAnbmFtZScsICd2YWx1ZScpO1xuXG4gICAgICAgIHRoaXMuYWNsUm9sZSA9IHtcbiAgICAgICAgICAuLi57XG4gICAgICAgICAgICBhY2xQZXJtaXNzaW9uczogW10sXG4gICAgICAgICAgICBhbGxQZXJtaXNzaW9uczogdHJ1ZSxcbiAgICAgICAgICAgIGFjbFJvbGVDb25maWdzOiBbXSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiB7fSxcbiAgICAgICAgICAgIGxldmVsOiB0aGlzLmFjbExldmVsc1swXS52YWx1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLmFjbFJvbGUsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMuYWNsUm9sZS5pZCkge1xuICAgICAgICAgIHRoaXMucGVybWlzc2lvbnMuZm9yRWFjaCgocGVybWlzc2lvbikgPT4ge1xuICAgICAgICAgICAgbGV0IGFjY2VzcyA9IDA7XG5cbiAgICAgICAgICAgIGNvbnN0IGFjbFBlcm1pc3Npb24gPSB0aGlzLmFjbFJvbGUuYWNsUGVybWlzc2lvbnMuZmluZCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gaXRlbS5wZXJtaXNzaW9uID09PSBwZXJtaXNzaW9uLnZhbHVlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChhY2xQZXJtaXNzaW9uKSB7XG4gICAgICAgICAgICAgIGFjY2VzcyA9IGFjbFBlcm1pc3Npb24uYWNjZXNzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmFjbFJvbGUucGVybWlzc2lvbnNbcGVybWlzc2lvbi52YWx1ZV0gPSBhY2Nlc3M7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hY2xSb2xlLmFsbFBlcm1pc3Npb25zKSB7XG4gICAgICAgICAgdGhpcy5fYXBwbHlNYXhQZXJtaXNzaW9uQWNjZXNzKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91cGRhdGVQZXJtaXNzaW9ucygpO1xuICAgICAgICB0aGlzLl91cGRhdGVBY2xSb2xlQ29uZmlncygpO1xuXG4gICAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmxpc3RDb25maWcgPSB7XG4gICAgICBzdGF0dXM6IGZhbHNlLFxuICAgICAgcGFnaW5nOiBmYWxzZSxcbiAgICAgIG5vUmVzdWx0czoge1xuICAgICAgICBtZXNzYWdlOiAnJyxcbiAgICAgIH0sXG4gICAgICBncm91cDoge1xuICAgICAgICBpbml0aWFsRXhwYW5kOiB0cnVlLFxuICAgICAgICBncm91cEJ5OiAoZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9LFxuICAgICAgICBjb21wYXJlQnk6IChkYXRhKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGRhdGEuY2F0ZWdvcnkgfHwgJ0dlbmVyYWwnO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGZldGNoOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBvZih7XG4gICAgICAgICAgZGF0YTogdGhpcy5sZXZlbFBlcm1pc3Npb25zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGEgPSBhLm5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIGIgPSBiLm5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChhIDwgYikge1xuICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGEgPiBiKSB7XG4gICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgbGV2ZWxDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5fdXBkYXRlUGVybWlzc2lvbnMoKTtcbiAgICB0aGlzLl91cGRhdGVBY2xSb2xlQ29uZmlncygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5saXN0LnJlbG9hZCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFJvbGUoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuX2RhdGEuYWNsUm9sZS5pZCkge1xuICAgICAgcmV0dXJuIG9mKHRoaXMuX2RhdGEuYWNsUm9sZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnk6IGFueSA9IHtcbiAgICAgIGFjbFBlcm1pc3Npb25zOiB0cnVlLFxuICAgICAgYWNsUm9sZUNvbmZpZ3M6IHRydWUsXG4gICAgfTtcblxuICAgIGlmICghdGhpcy5lbnZpcm9ubWVudCkge1xuICAgICAgcXVlcnkuZW52aXJvbm1lbnRJZCA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2RhdGEubG9hZEFjbFJvbGUodGhpcy5fZGF0YS5hY2xSb2xlLCBxdWVyeSk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZSA9ICgpOiBPYnNlcnZhYmxlPGFueT4gPT4ge1xuICAgIGNvbnN0IGFjbFJvbGUgPSB7XG4gICAgICAuLi50aGlzLmFjbFJvbGUsXG4gICAgICBwZXJtaXNzaW9uczogdGhpcy5sZXZlbFBlcm1pc3Npb25zLm1hcCgocGVybWlzc2lvbikgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZhbHVlOiBwZXJtaXNzaW9uLnZhbHVlLFxuICAgICAgICAgIGFjY2VzczogdGhpcy5hY2xSb2xlLnBlcm1pc3Npb25zW3Blcm1pc3Npb24udmFsdWVdIHx8IDAsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICAgIGFjbFJvbGVDb25maWdzOiB0aGlzLmxldmVsQWNsUm9sZUNvbmZpZ3MubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaWQ6IGl0ZW0uaWQsXG4gICAgICAgICAgdmFsdWU6IGl0ZW0udmFsdWUsXG4gICAgICAgICAgZGF0YTogaXRlbS5kYXRhLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLl9kYXRhLnNhdmVBY2xSb2xlKGFjbFJvbGUpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnU2F2ZWQgQ2hhbmdlcycpO1xuICAgICAgICAgIHRoaXMuY2xvc2UocmVzcG9uc2UpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2UoZGF0YTogYW55ID0gbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX2RpYWxvZ1JlZi5jbG9zZShkYXRhKTtcbiAgfVxuXG4gIHB1YmxpYyBhbGxQZXJtaXNzaW9uc0NoYW5nZShhbGw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl91cGRhdGVQZXJtaXNzaW9ucygpO1xuICAgIGlmIChhbGwpIHtcbiAgICAgIHRoaXMuX2FwcGx5TWF4UGVybWlzc2lvbkFjY2VzcygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVBlcm1pc3Npb25zKCk6IHZvaWQge1xuICAgIHRoaXMubGV2ZWxQZXJtaXNzaW9ucyA9IHRoaXMucGVybWlzc2lvbnMuZmlsdGVyKChwZXJtaXNzaW9uKSA9PiB7XG4gICAgICByZXR1cm4gcGVybWlzc2lvbi5sZXZlbHMuc29tZSgoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbSA9PT0gdGhpcy5hY2xSb2xlLmxldmVsO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVBY2xSb2xlQ29uZmlncygpOiB2b2lkIHtcbiAgICB0aGlzLmxldmVsQWNsUm9sZUNvbmZpZ3MgPSB0aGlzLmFjbFJvbGVDb25maWdzLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuYWNsUm9sZS5sZXZlbCA9PT0gaXRlbS5sZXZlbDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2FwcGx5TWF4UGVybWlzc2lvbkFjY2VzcygpOiB2b2lkIHtcbiAgICB0aGlzLnBlcm1pc3Npb25zLmZvckVhY2goKHBlcm1pc3Npb24pID0+IHtcbiAgICAgIHRoaXMuYWNsUm9sZS5wZXJtaXNzaW9uc1twZXJtaXNzaW9uLnZhbHVlXSA9IE1hdGgubWF4KC4uLnBlcm1pc3Npb24uYWNjZXNzZXMpO1xuICAgIH0pO1xuICB9XG5cbn1cbiIsIjxmb3JtIGZzRm9ybSBbc3VibWl0XT1cInNhdmVcIj5cbiAgPGZzLWRpYWxvZz5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWNsUm9sZVwiPlxuICAgICAgPGRpdiBtYXQtZGlhbG9nLXRpdGxlPnt7IGFjbFJvbGUuaWQgPyAnRWRpdCcgOiAnQ3JlYXRlJyB9fSBSb2xlPC9kaXY+XG4gICAgICA8bWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXQubHQtbWQ9XCJjb2x1bW5cIiBmeExheW91dEdhcD1cIjQwcHhcIiBmeExheW91dEdhcC5sdC1tZD1cIjBcIj5cbiAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhGbGV4IGZ4RmxleC5sdC1tZD1cIjBcIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiTmFtZVwiIFsobmdNb2RlbCldPVwiYWNsUm9sZS5uYW1lXCIgbmFtZT1cIm5hbWVcIiBmc0Zvcm1SZXF1aXJlZD5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgIDxmcy1sYWJlbC1maWVsZCAqbmdJZj1cImFjbFJvbGUuaWQgfHwgYWNsTGV2ZWxzLmxlbmd0aCA9PT0gMTsgZWxzZSBsZXZlbHNcIj5cbiAgICAgICAgICAgICAgPGZzLWxhYmVsPkxldmVsPC9mcy1sYWJlbD5cbiAgICAgICAgICAgICAge3tpbmRleGVkQWNsTGV2ZWxzW2FjbFJvbGUubGV2ZWxdfX1cbiAgICAgICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbGV2ZWxzPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGV2ZWxcIj5cbiAgICAgICAgICAgICAgICA8ZnMtcmFkaW8tZ3JvdXBcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYWNsUm9sZS5sZXZlbFwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJsZXZlbENoYW5nZSgpXCJcbiAgICAgICAgICAgICAgICAgIGZzRm9ybVJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICBsYWJlbD1cIkxldmVsXCJcbiAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uPVwidmVydGljYWxcIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cImxldmVsXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBhY2xMZXZlbHNcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbS52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIWFjbFJvbGUucHJvdGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5uYW1lIH19XG4gICAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9mcy1yYWRpby1ncm91cD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICA8ZnMtbGFiZWwtZmllbGQgKm5nSWY9XCJsZXZlbFBlcm1pc3Npb25zLmxlbmd0aFwiPlxuICAgICAgICAgICAgICA8ZnMtbGFiZWw+QWxsIFBlcm1pc3Npb25zPC9mcy1sYWJlbD5cbiAgICAgICAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYWNsUm9sZS5hbGxQZXJtaXNzaW9uc1wiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiYWxsUGVybWlzc2lvbnNDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhYWNsUm9sZS5wcm90ZWN0ZWRcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJhbGxQZXJtaXNzaW9uc1wiPlxuICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiAqbmdGb3I9XCJsZXQgY29uZmlnIG9mIGxldmVsQWNsUm9sZUNvbmZpZ3NcIj5cbiAgICAgICAgICAgICAgPGZzLWxhYmVsLWZpZWxkICpuZ0lmPVwiY29uZmlnLmludGVyZmFjZSA9PT0gJ2NoZWNrYm94J1wiPlxuICAgICAgICAgICAgICAgIDxmcy1sYWJlbD57e2NvbmZpZy5uYW1lfX08L2ZzLWxhYmVsPlxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29uZmlnLmRhdGFcIlxuICAgICAgICAgICAgICAgICAgW25hbWVdPVwiY29uZmlnLm5hbWVcIj5cbiAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICA8ZnMtbGFiZWwtbWVzc2FnZT5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaGludD57e2NvbmZpZy5kZXNjcmlwdGlvbn19PC9tYXQtaGludD5cbiAgICAgICAgICAgICAgICA8L2ZzLWxhYmVsLW1lc3NhZ2U+XG4gICAgICAgICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiY29uZmlnLmludGVyZmFjZSA9PT0gJ3NlbGVjdCdcIj5cbiAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb25maWcuZGF0YVwiXG4gICAgICAgICAgICAgICAgICBbbmFtZV09XCJjb25maWcudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImNvbmZpZy5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiY29uZmlnLm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjb25maWcudmFsdWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbS52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPG1hdC1oaW50Pnt7Y29uZmlnLmRlc2NyaXB0aW9ufX08L21hdC1oaW50PlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhGbGV4PVwiNjVcIiBmeEZsZXgubHQtbWQ9XCIwXCIgKm5nSWY9XCJhY2xSb2xlLmxldmVsXCIgW2hpZGRlbl09XCIhbGV2ZWxQZXJtaXNzaW9ucy5sZW5ndGhcIiBjbGFzcz1cInBlcm1pc3Npb25zXCI+XG5cbiAgICAgICAgICAgIDxmcy1saXN0IFtjb25maWddPVwibGlzdENvbmZpZ1wiPlxuICAgICAgICAgICAgICA8ZnMtbGlzdC1jb2x1bW4gdGl0bGU9XCJQZXJtaXNzaW9uc1wiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBjb2xzcGFuPVwiMlwiIGZzLWxpc3QtZ3JvdXAtY2VsbCBsZXQtcm93PVwicm93XCIgY2xhc3M9XCJwZXJtaXNzaW9uLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICA8c21hbGw+PGI+e3tyb3cuY2F0ZWdvcnkgfHwgJ0dlbmVyYWwnfX08L2I+PC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWNlbGwgbGV0LXJvdz1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBlcm1pc3Npb25cIj57eyByb3cubmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uIHNtYWxsXCI+e3sgcm93LmRlc2NyaXB0aW9uIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9mcy1saXN0LWNvbHVtbj5cbiAgICAgICAgICAgICAgPGZzLWxpc3QtY29sdW1uIHRpdGxlPVwiQWNjZXNzXCIgd2lkdGg9XCIxJVwiIGNsYXNzPVwiYWNjZXNzXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtY2VsbCBsZXQtcm93PVwicGVybWlzc2lvblwiIGxldC1wZXJtaXNzaW9uPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImFjbFJvbGUuYWxsUGVybWlzc2lvbnM7IGVsc2UgZWxzZUFsbFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBpbmRleGVkQWNjZXNzZXNbYWNsUm9sZS5wZXJtaXNzaW9uc1twZXJtaXNzaW9uLnZhbHVlXV0gfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWxzZUFsbD5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImFjbFJvbGUucGVybWlzc2lvbnNbcGVybWlzc2lvbi52YWx1ZV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhYWNsUm9sZS5wcm90ZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZnNGb3JtUmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJhY2Nlc3Mte3sgcGVybWlzc2lvbi52YWx1ZSB9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYWNjZXNzIG9mIEFjbFJvbGVBY2Nlc3Nlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiYWNjZXNzLnZhbHVlID09PSAwIHx8IHBlcm1pc3Npb24uYWNjZXNzZXMuaW5kZXhPZihhY2Nlc3MudmFsdWUpICE9PSAtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImFjY2Vzcy52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYWNjZXNzLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L2ZzLWxpc3QtY29sdW1uPlxuICAgICAgICAgICAgPC9mcy1saXN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgPG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjb2xvcj1cInByaW1hcnlcIj57eyBhY2xSb2xlLmlkID8gJ1NhdmUnIDogJ0NyZWF0ZScgfX08L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIFttYXQtZGlhbG9nLWNsb3NlXT1cIm51bGxcIiB0eXBlPVwiYnV0dG9uXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9mcy1kaWFsb2c+XG48L2Zvcm0+XG4iXX0=