@mediusinc/mng-commons-audit 3.0.0-rc.1 → 3.0.0-rc.4

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 (48) hide show
  1. package/assets/i18n/en.json +17 -1
  2. package/assets/i18n/sl.json +18 -2
  3. package/esm2022/lib/api/models/entityChange.mjs +9 -9
  4. package/esm2022/lib/api/models/guiEntityModel.mjs +9 -9
  5. package/esm2022/lib/api/models/guiPropertyModel.mjs +9 -9
  6. package/esm2022/lib/api/models/guiPropertyType.mjs +12 -12
  7. package/esm2022/lib/api/models/guiRelationModel.mjs +9 -9
  8. package/esm2022/lib/api/models/revEntityWithChangesDto.mjs +9 -9
  9. package/esm2022/lib/api/models/revEntityWithStateDto.mjs +9 -9
  10. package/esm2022/lib/api/models/revisionType.mjs +8 -8
  11. package/esm2022/lib/api/services/audit-revisions-api.service.mjs +14 -10
  12. package/esm2022/lib/api/services/audit.service.mjs +3 -3
  13. package/esm2022/lib/audit.routes.mjs +2 -9
  14. package/esm2022/lib/components/entity-changes-field/entity-changes-field.component.mjs +55 -24
  15. package/esm2022/lib/components/pages/entity-revisions/audit-entity-revisions-page.component.mjs +70 -38
  16. package/esm2022/lib/components/pages/revisions/audit-revisions-page.component.mjs +34 -25
  17. package/esm2022/lib/models/entity-revision-change-state.model.mjs +8 -0
  18. package/esm2022/lib/models/entity-revision-changes.model.mjs +8 -0
  19. package/esm2022/lib/models/rev-entity-detailed.model.mjs +9 -0
  20. package/esm2022/lib/models/rev-entity.model.mjs +8 -0
  21. package/esm2022/lib/models/revEntityWithId.model.mjs +8 -7
  22. package/esm2022/lib/utils/audit.util.mjs +101 -187
  23. package/fesm2022/mediusinc-mng-commons-audit.mjs +362 -479
  24. package/fesm2022/mediusinc-mng-commons-audit.mjs.map +1 -1
  25. package/lib/api/models/entityChange.d.ts +3 -3
  26. package/lib/api/models/guiEntityModel.d.ts +3 -3
  27. package/lib/api/models/guiPropertyModel.d.ts +5 -5
  28. package/lib/api/models/guiPropertyType.d.ts +1 -1
  29. package/lib/api/models/guiRelationModel.d.ts +1 -1
  30. package/lib/api/models/revEntityWithChangesDto.d.ts +3 -3
  31. package/lib/api/models/revEntityWithStateDto.d.ts +3 -3
  32. package/lib/api/models/revisionType.d.ts +1 -1
  33. package/lib/api/services/audit-revisions-api.service.d.ts +7 -6
  34. package/lib/api/services/audit.service.d.ts +3 -3
  35. package/lib/components/entity-changes-field/entity-changes-field.component.d.ts +6 -3
  36. package/lib/components/pages/entity-revisions/audit-entity-revisions-page.component.d.ts +12 -11
  37. package/lib/components/pages/revisions/audit-revisions-page.component.d.ts +9 -8
  38. package/lib/models/entity-revision-change-state.model.d.ts +6 -0
  39. package/lib/models/entity-revision-changes.model.d.ts +5 -0
  40. package/lib/models/rev-entity-detailed.model.d.ts +10 -0
  41. package/lib/models/rev-entity.model.d.ts +6 -0
  42. package/lib/models/revEntityWithId.model.d.ts +2 -2
  43. package/lib/utils/audit.util.d.ts +8 -4
  44. package/package.json +1 -1
  45. package/esm2022/lib/api/models/index.mjs +0 -9
  46. package/esm2022/lib/models/entity-changes.model.mjs +0 -8
  47. package/lib/api/models/index.d.ts +0 -8
  48. package/lib/models/entity-changes.model.d.ts +0 -4
@@ -1,37 +1,61 @@
1
1
  import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
2
- import { Component, Injector, Input } from '@angular/core';
2
+ import { Component, DestroyRef, Injector, Input, inject } from '@angular/core';
3
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
4
  import { BehaviorSubject } from 'rxjs';
4
5
  import { AMngFormlyCustomFieldComponent, MngTableComponent, TableDescriptor, TablePaginationModeEnum } from '@mediusinc/mng-commons';
5
- import { RevisionType } from '../../api/models';
6
+ import { MngRevisionTypeDto } from '../../api/models/revisionType';
6
7
  import { MngAuditService } from '../../api/services/audit.service';
7
- import { EntityChanges } from '../../models/entity-changes.model';
8
+ import { MngEntityRevisionChangeState } from '../../models/entity-revision-change-state.model';
9
+ import { MngEntityRevisionChanges } from '../../models/entity-revision-changes.model';
8
10
  import { AuditUtil } from '../../utils/audit.util';
9
11
  import * as i0 from "@angular/core";
10
12
  export class EntityChangesFieldComponent extends AMngFormlyCustomFieldComponent {
11
13
  constructor() {
12
14
  super(...arguments);
15
+ this.destroyRef = inject(DestroyRef);
13
16
  this.entityChanges = [];
14
17
  this.modelFetched = new BehaviorSubject(false);
18
+ this.auditModel = [];
15
19
  }
16
20
  ngOnInit() {
17
- this.injector?.get(MngAuditService, undefined, { optional: true })?.auditModel$.subscribe({
21
+ this.fieldValue = this.formControl.value;
22
+ this.injector
23
+ ?.get(MngAuditService, undefined, { optional: true })
24
+ ?.auditModel$.pipe(takeUntilDestroyed(this.destroyRef))
25
+ .subscribe({
18
26
  next: model => {
19
27
  this.auditModel = model;
20
- if ('entityNameChangesMap' in this.model) {
21
- for (const key of Object.keys(this.model['entityNameChangesMap'])) {
22
- const ec = new EntityChanges();
28
+ if (this.fieldValue) {
29
+ for (const key of Object.keys(this.fieldValue)) {
30
+ const ec = new MngEntityRevisionChanges();
23
31
  ec.entityType = key;
24
32
  ec.items = [];
25
- for (const change of this.model['entityNameChangesMap'][key]) {
26
- if (change.revType === RevisionType.Add) {
27
- ec.items.push({ revType: change.revType, ...change.entityNewState, color: 'green' });
33
+ for (const change of this.fieldValue[key]) {
34
+ if (change.revType === MngRevisionTypeDto.Add && change.entityNewState) {
35
+ const item = new MngEntityRevisionChangeState();
36
+ item.revType = change.revType;
37
+ item.color = 'green';
38
+ Object.entries(change.entityNewState).forEach(([key, value]) => (item[key] = value));
39
+ ec.items.push(item);
28
40
  }
29
- else if (change.revType === RevisionType.Del) {
30
- ec.items.push({ revType: change.revType, ...change.entityOldState, color: 'red' });
41
+ else if (change.revType === MngRevisionTypeDto.Del && change.entityOldState) {
42
+ const item = new MngEntityRevisionChangeState();
43
+ item.revType = change.revType;
44
+ item.color = 'red';
45
+ Object.entries(change.entityOldState).forEach(([key, value]) => (item[key] = value));
46
+ ec.items.push(item);
31
47
  }
32
- else {
33
- ec.items.push({ revType: change.revType, ...change.entityOldState, color: 'red' });
34
- ec.items.push({ revType: change.revType, ...change.entityNewState, color: 'green' });
48
+ else if (change.revType === MngRevisionTypeDto.Mod && change.entityOldState && change.entityNewState) {
49
+ const itemOld = new MngEntityRevisionChangeState();
50
+ itemOld.revType = change.revType;
51
+ itemOld.color = 'red';
52
+ Object.entries(change.entityOldState).forEach(([key, value]) => (itemOld[key] = value));
53
+ const itemNew = new MngEntityRevisionChangeState();
54
+ itemNew.revType = change.revType;
55
+ itemNew.color = 'green';
56
+ Object.entries(change.entityNewState).forEach(([key, value]) => (itemNew[key] = value));
57
+ ec.items.push(itemOld);
58
+ ec.items.push(itemNew);
35
59
  }
36
60
  }
37
61
  this.entityChanges.push(ec);
@@ -43,7 +67,7 @@ export class EntityChangesFieldComponent extends AMngFormlyCustomFieldComponent
43
67
  }
44
68
  createDescriptor(entityChanges) {
45
69
  const changedFields = [];
46
- if (entityChanges.items && entityChanges.items[0].revType === RevisionType.Mod) {
70
+ if (entityChanges.items && entityChanges.items[0].revType === MngRevisionTypeDto.Mod) {
47
71
  for (const key in entityChanges.items[0]) {
48
72
  if (entityChanges.items[0][key] !== entityChanges.items[1][key]) {
49
73
  changedFields.push(key);
@@ -51,26 +75,33 @@ export class EntityChangesFieldComponent extends AMngFormlyCustomFieldComponent
51
75
  }
52
76
  }
53
77
  const guiEntityModel = this.auditModel.filter(m => m.entityName === entityChanges.entityType)[0];
54
- const desc = new TableDescriptor({}, undefined, undefined, guiEntityModel.entityName).withTitle(guiEntityModel.entityName).withClassName('py-2');
55
- desc.addColumn('revType').asEnum(RevisionType);
56
- AuditUtil.addColumnsFromModel(desc, guiEntityModel.properties);
57
- desc.withRowClassName(undefined, (_, item) => (item.color === 'green' ? 'audit-row-added' : 'audit-row-deleted'));
78
+ const desc = new TableDescriptor(MngEntityRevisionChangeState, undefined, undefined, guiEntityModel.entityName).withClassName('py-2');
79
+ if (guiEntityModel.entityName) {
80
+ desc.withTitle(guiEntityModel.entityName);
81
+ }
82
+ desc.addColumn('revType').withTitle('MngEntityRevisionChangeState.properties.revType').asEnum(MngRevisionTypeDto);
83
+ if (guiEntityModel.properties) {
84
+ AuditUtil.addColumnsFromModel(desc, guiEntityModel.properties, undefined, false, false);
85
+ }
86
+ desc.withRowClassName(undefined, (_, item) => (item ? (item.color === 'green' ? 'audit-row-added' : 'audit-row-deleted') : ''));
58
87
  desc.columns.forEach(col => {
59
- col.withSort(false);
60
88
  if (changedFields.length > 0 && changedFields.some(val => col.property === val)) {
61
89
  col.withClassName('audit-cell');
62
90
  }
63
91
  });
64
92
  desc.withPaginationMode(TablePaginationModeEnum.Pagination);
93
+ desc.withCurrentColumnsReorderable();
94
+ desc.withCurrentColumnsToggleable();
95
+ desc.withDataKey(`EntityChangeField_${entityChanges.entityType ?? 'default'}`);
65
96
  return desc;
66
97
  }
67
98
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EntityChangesFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
68
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: EntityChangesFieldComponent, isStandalone: true, selector: "mng-entity-changes-field", inputs: { injector: "injector" }, usesInheritance: true, ngImport: i0, template: "<div *ngIf=\"modelFetched | async\">\n <mng-table *ngFor=\"let ec of entityChanges\" [items]=\"ec.items\" [descriptor]=\"createDescriptor(ec)\"></mng-table>\n</div>\n", styles: ["::ng-deep tr.audit-row-deleted{background:hsla(3,100%,60%,.1)!important}::ng-deep tr.audit-row-deleted .audit-cell{background:hsla(3,90%,63%,.3)!important}::ng-deep tr.audit-row-added{background-color:#1bc5621a!important}::ng-deep tr.audit-row-added .audit-cell{background:hsla(145,76%,44%,.3)!important}\n"], dependencies: [{ kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: MngTableComponent, selector: "mng-table", inputs: ["descriptor", "items", "queryResult", "loading", "dataProvider", "useQueryParams", "selectionMode", "selectionEnabled", "actions", "isColumnClickable", "viewContainer", "captionComponent", "columnActionComponent", "columnActionMinWidth", "globalFilterFields"], outputs: ["tableLoad", "cellClick", "selectionChange", "captionComponentInstance", "columnActionComponentInstance"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
99
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: EntityChangesFieldComponent, isStandalone: true, selector: "mng-entity-changes-field", inputs: { injector: "injector" }, usesInheritance: true, ngImport: i0, template: "<div *ngIf=\"modelFetched | async; else loading\">\n <mng-table *ngFor=\"let ec of entityChanges\" [items]=\"ec.items\" [descriptor]=\"createDescriptor(ec)\"></mng-table>\n</div>\n<ng-template #loading>\n <div class=\"text-center\">\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem\"></i>\n </div>\n</ng-template>\n", styles: ["::ng-deep tr.audit-row-deleted{background:hsla(3,100%,60%,.1)!important}::ng-deep tr.audit-row-deleted .audit-cell{background:hsla(3,90%,63%,.3)!important}::ng-deep tr.audit-row-added{background-color:#1bc5621a!important}::ng-deep tr.audit-row-added .audit-cell{background:hsla(145,76%,44%,.3)!important}\n"], dependencies: [{ kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: MngTableComponent, selector: "mng-table", inputs: ["descriptor", "items", "queryResult", "loading", "dataProvider", "useQueryParams", "selectionMode", "selectionEnabled", "actions", "isColumnClickable", "viewContainer", "captionComponent", "columnActionComponent", "columnActionMinWidth", "globalFilterFields"], outputs: ["tableLoad", "cellClick", "selectionChange", "captionComponentInstance", "columnActionComponentInstance"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
69
100
  }
70
101
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: EntityChangesFieldComponent, decorators: [{
71
102
  type: Component,
72
- args: [{ standalone: true, selector: 'mng-entity-changes-field', imports: [NgForOf, MngTableComponent, NgIf, AsyncPipe], template: "<div *ngIf=\"modelFetched | async\">\n <mng-table *ngFor=\"let ec of entityChanges\" [items]=\"ec.items\" [descriptor]=\"createDescriptor(ec)\"></mng-table>\n</div>\n", styles: ["::ng-deep tr.audit-row-deleted{background:hsla(3,100%,60%,.1)!important}::ng-deep tr.audit-row-deleted .audit-cell{background:hsla(3,90%,63%,.3)!important}::ng-deep tr.audit-row-added{background-color:#1bc5621a!important}::ng-deep tr.audit-row-added .audit-cell{background:hsla(145,76%,44%,.3)!important}\n"] }]
103
+ args: [{ standalone: true, selector: 'mng-entity-changes-field', imports: [NgForOf, MngTableComponent, NgIf, AsyncPipe], template: "<div *ngIf=\"modelFetched | async; else loading\">\n <mng-table *ngFor=\"let ec of entityChanges\" [items]=\"ec.items\" [descriptor]=\"createDescriptor(ec)\"></mng-table>\n</div>\n<ng-template #loading>\n <div class=\"text-center\">\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem\"></i>\n </div>\n</ng-template>\n", styles: ["::ng-deep tr.audit-row-deleted{background:hsla(3,100%,60%,.1)!important}::ng-deep tr.audit-row-deleted .audit-cell{background:hsla(3,90%,63%,.3)!important}::ng-deep tr.audit-row-added{background-color:#1bc5621a!important}::ng-deep tr.audit-row-added .audit-cell{background:hsla(145,76%,44%,.3)!important}\n"] }]
73
104
  }], propDecorators: { injector: [{
74
105
  type: Input
75
106
  }] } });
76
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWNoYW5nZXMtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2VudGl0eS1jaGFuZ2VzLWZpZWxkL2VudGl0eS1jaGFuZ2VzLWZpZWxkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9lbnRpdHktY2hhbmdlcy1maWVsZC9lbnRpdHktY2hhbmdlcy1maWVsZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQVMsTUFBTSxlQUFlLENBQUM7QUFFakUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUVyQyxPQUFPLEVBQUMsOEJBQThCLEVBQWEsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLHVCQUF1QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFOUksT0FBTyxFQUFpQixZQUFZLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUM5RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQzs7QUFTakQsTUFBTSxPQUFPLDJCQUE0QixTQUFRLDhCQUE4QjtJQVAvRTs7UUFVVyxrQkFBYSxHQUFvQixFQUFFLENBQUM7UUFDcEMsaUJBQVksR0FBRyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQXlEcEQ7SUFyREcsUUFBUTtRQUNKLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsRUFB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LENBQUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxTQUFTLENBQUM7OEJBS3RDLFFBQVE7c0JBQXZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FzeW5jUGlwZSwgTmdGb3JPZiwgTmdJZn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7Q29tcG9uZW50LCBJbmplY3RvciwgSW5wdXQsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0fSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtBTW5nRm9ybWx5Q3VzdG9tRmllbGRDb21wb25lbnQsIENsYXNzVHlwZSwgTW5nVGFibGVDb21wb25lbnQsIFRhYmxlRGVzY3JpcHRvciwgVGFibGVQYWdpbmF0aW9uTW9kZUVudW19IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMnO1xuXG5pbXBvcnQge0d1aUVudGl0eU1vZGVsLCBSZXZpc2lvblR5cGV9IGZyb20gJy4uLy4uL2FwaS9tb2RlbHMnO1xuaW1wb3J0IHtNbmdBdWRpdFNlcnZpY2V9IGZyb20gJy4uLy4uL2FwaS9zZXJ2aWNlcy9hdWRpdC5zZXJ2aWNlJztcbmltcG9ydCB7RW50aXR5Q2hhbmdlc30gZnJvbSAnLi4vLi4vbW9kZWxzL2VudGl0eS1jaGFuZ2VzLm1vZGVsJztcbmltcG9ydCB7QXVkaXRVdGlsfSBmcm9tICcuLi8uLi91dGlscy9hdWRpdC51dGlsJztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ21uZy1lbnRpdHktY2hhbmdlcy1maWVsZCcsXG4gICAgaW1wb3J0czogW05nRm9yT2YsIE1uZ1RhYmxlQ29tcG9uZW50LCBOZ0lmLCBBc3luY1BpcGVdLFxuICAgIHN0eWxlVXJsczogWydlbnRpdHktY2hhbmdlcy1maWVsZC5jb21wb25lbnQuc2NzcyddLFxuICAgIHRlbXBsYXRlVXJsOiAnZW50aXR5LWNoYW5nZXMtZmllbGQuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEVudGl0eUNoYW5nZXNGaWVsZENvbXBvbmVudCBleHRlbmRzIEFNbmdGb3JtbHlDdXN0b21GaWVsZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgQElucHV0KCkgcHVibGljIGluamVjdG9yPzogSW5qZWN0b3I7XG5cbiAgICBwdWJsaWMgZW50aXR5Q2hhbmdlczogRW50aXR5Q2hhbmdlc1tdID0gW107XG4gICAgcHVibGljIG1vZGVsRmV0Y2hlZCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gICAgcHJpdmF0ZSBhdWRpdE1vZGVsITogR3VpRW50aXR5TW9kZWxbXTtcblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmluamVjdG9yPy5nZXQoTW5nQXVkaXRTZXJ2aWNlLCB1bmRlZmluZWQsIHtvcHRpb25hbDogdHJ1ZX0pPy5hdWRpdE1vZGVsJC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogbW9kZWwgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYXVkaXRNb2RlbCA9IG1vZGVsO1xuXG4gICAgICAgICAgICAgICAgaWYgKCdlbnRpdHlOYW1lQ2hhbmdlc01hcCcgaW4gdGhpcy5tb2RlbCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLm1vZGVsWydlbnRpdHlOYW1lQ2hhbmdlc01hcCddKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWMgPSBuZXcgRW50aXR5Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWMuZW50aXR5VHlwZSA9IGtleTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVjLml0ZW1zID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNoYW5nZSBvZiB0aGlzLm1vZGVsWydlbnRpdHlOYW1lQ2hhbmdlc01hcCddW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlLnJldlR5cGUgPT09IFJldmlzaW9uVHlwZS5BZGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWMuaXRlbXMucHVzaCh7cmV2VHlwZTogY2hhbmdlLnJldlR5cGUsIC4uLmNoYW5nZS5lbnRpdHlOZXdTdGF0ZSwgY29sb3I6ICdncmVlbid9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZS5yZXZUeXBlID09PSBSZXZpc2lvblR5cGUuRGVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjLml0ZW1zLnB1c2goe3JldlR5cGU6IGNoYW5nZS5yZXZUeXBlLCAuLi5jaGFuZ2UuZW50aXR5T2xkU3RhdGUsIGNvbG9yOiAncmVkJ30pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjLml0ZW1zLnB1c2goe3JldlR5cGU6IGNoYW5nZS5yZXZUeXBlLCAuLi5jaGFuZ2UuZW50aXR5T2xkU3RhdGUsIGNvbG9yOiAncmVkJ30pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYy5pdGVtcy5wdXNoKHtyZXZUeXBlOiBjaGFuZ2UucmV2VHlwZSwgLi4uY2hhbmdlLmVudGl0eU5ld1N0YXRlLCBjb2xvcjogJ2dyZWVuJ30pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW50aXR5Q2hhbmdlcy5wdXNoKGVjKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsRmV0Y2hlZC5uZXh0KHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZURlc2NyaXB0b3IoZW50aXR5Q2hhbmdlczogRW50aXR5Q2hhbmdlcykge1xuICAgICAgICBjb25zdCBjaGFuZ2VkRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAoZW50aXR5Q2hhbmdlcy5pdGVtcyAmJiBlbnRpdHlDaGFuZ2VzLml0ZW1zWzBdLnJldlR5cGUgPT09IFJldmlzaW9uVHlwZS5Nb2QpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGVudGl0eUNoYW5nZXMuaXRlbXNbMF0pIHtcbiAgICAgICAgICAgICAgICBpZiAoZW50aXR5Q2hhbmdlcy5pdGVtc1swXVtrZXldICE9PSBlbnRpdHlDaGFuZ2VzLml0ZW1zWzFdW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZEZpZWxkcy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZ3VpRW50aXR5TW9kZWwgPSB0aGlzLmF1ZGl0TW9kZWwuZmlsdGVyKG0gPT4gbS5lbnRpdHlOYW1lID09PSBlbnRpdHlDaGFuZ2VzLmVudGl0eVR5cGUpWzBdO1xuXG4gICAgICAgIGNvbnN0IGRlc2MgPSBuZXcgVGFibGVEZXNjcmlwdG9yKHt9IGFzIENsYXNzVHlwZTxhbnk+LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZ3VpRW50aXR5TW9kZWwuZW50aXR5TmFtZSkud2l0aFRpdGxlKGd1aUVudGl0eU1vZGVsLmVudGl0eU5hbWUhKS53aXRoQ2xhc3NOYW1lKCdweS0yJyk7XG4gICAgICAgIGRlc2MuYWRkQ29sdW1uKCdyZXZUeXBlJykuYXNFbnVtKFJldmlzaW9uVHlwZSk7XG4gICAgICAgIEF1ZGl0VXRpbC5hZGRDb2x1bW5zRnJvbU1vZGVsKGRlc2MsIGd1aUVudGl0eU1vZGVsLnByb3BlcnRpZXMhKTtcbiAgICAgICAgZGVzYy53aXRoUm93Q2xhc3NOYW1lKHVuZGVmaW5lZCwgKF8sIGl0ZW0pID0+IChpdGVtLmNvbG9yID09PSAnZ3JlZW4nID8gJ2F1ZGl0LXJvdy1hZGRlZCcgOiAnYXVkaXQtcm93LWRlbGV0ZWQnKSk7XG4gICAgICAgIGRlc2MuY29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICAgICAgICBjb2wud2l0aFNvcnQoZmFsc2UpO1xuICAgICAgICAgICAgaWYgKGNoYW5nZWRGaWVsZHMubGVuZ3RoID4gMCAmJiBjaGFuZ2VkRmllbGRzLnNvbWUodmFsID0+IGNvbC5wcm9wZXJ0eSA9PT0gdmFsKSkge1xuICAgICAgICAgICAgICAgIGNvbC53aXRoQ2xhc3NOYW1lKCdhdWRpdC1jZWxsJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBkZXNjLndpdGhQYWdpbmF0aW9uTW9kZShUYWJsZVBhZ2luYXRpb25Nb2RlRW51bS5QYWdpbmF0aW9uKTtcbiAgICAgICAgcmV0dXJuIGRlc2M7XG4gICAgfVxufVxuIiwiPGRpdiAqbmdJZj1cIm1vZGVsRmV0Y2hlZCB8IGFzeW5jXCI+XG4gICAgPG1uZy10YWJsZSAqbmdGb3I9XCJsZXQgZWMgb2YgZW50aXR5Q2hhbmdlc1wiIFtpdGVtc109XCJlYy5pdGVtc1wiIFtkZXNjcmlwdG9yXT1cImNyZWF0ZURlc2NyaXB0b3IoZWMpXCI+PC9tbmctdGFibGU+XG48L2Rpdj5cbiJdfQ==
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWNoYW5nZXMtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2VudGl0eS1jaGFuZ2VzLWZpZWxkL2VudGl0eS1jaGFuZ2VzLWZpZWxkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9lbnRpdHktY2hhbmdlcy1maWVsZC9lbnRpdHktY2hhbmdlcy1maWVsZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyRixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUU5RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXJDLE9BQU8sRUFBQyw4QkFBOEIsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUluSSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0saURBQWlELENBQUM7QUFDN0YsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sNENBQTRDLENBQUM7QUFDcEYsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHdCQUF3QixDQUFDOztBQVNqRCxNQUFNLE9BQU8sMkJBQTRCLFNBQVEsOEJBQThCO0lBUC9FOztRQVVZLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENB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QUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdkIsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxHQUFHLENBQUMsRUFBRTtnQkFDN0UsR0FBRyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUNuQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxXQUFXLENBQUMscUJBQXFCLGFBQWEsQ0FBQyxVQUFVLElBQUksU0FBUyxFQUFFLENBQUMsQ0FBQztRQUUvRSxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDOzhHQWpHUSwyQkFBMkI7a0dBQTNCLDJCQUEyQiw2SUN2QnhDLHlWQVFBLDRXRFdjLE9BQU8sbUhBQUUsaUJBQWlCLHliQUFFLElBQUksd0ZBQUUsU0FBUzs7MkZBSTVDLDJCQUEyQjtrQkFQdkMsU0FBUztpQ0FDTSxJQUFJLFlBQ04sMEJBQTBCLFdBQzNCLENBQUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxTQUFTLENBQUM7OEJBS3RDLFFBQVE7c0JBQXZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FzeW5jUGlwZSwgTmdGb3JPZiwgTmdJZn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7Q29tcG9uZW50LCBEZXN0cm95UmVmLCBJbmplY3RvciwgSW5wdXQsIE9uSW5pdCwgaW5qZWN0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0fSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtBTW5nRm9ybWx5Q3VzdG9tRmllbGRDb21wb25lbnQsIE1uZ1RhYmxlQ29tcG9uZW50LCBUYWJsZURlc2NyaXB0b3IsIFRhYmxlUGFnaW5hdGlvbk1vZGVFbnVtfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zJztcblxuaW1wb3J0IHtNbmdFbnRpdHlDaGFuZ2VEdG99IGZyb20gJy4uLy4uL2FwaS9tb2RlbHMvZW50aXR5Q2hhbmdlJztcbmltcG9ydCB7TW5nR3VpRW50aXR5TW9kZWxEdG99IGZyb20gJy4uLy4uL2FwaS9tb2RlbHMvZ3VpRW50aXR5TW9kZWwnO1xuaW1wb3J0IHtNbmdSZXZpc2lvblR5cGVEdG99IGZyb20gJy4uLy4uL2FwaS9tb2RlbHMvcmV2aXNpb25UeXBlJztcbmltcG9ydCB7TW5nQXVkaXRTZXJ2aWNlfSBmcm9tICcuLi8uLi9hcGkvc2VydmljZXMvYXVkaXQuc2VydmljZSc7XG5pbXBvcnQge01uZ0VudGl0eVJldmlzaW9uQ2hhbmdlU3RhdGV9IGZyb20gJy4uLy4uL21vZGVscy9lbnRpdHktcmV2aXNpb24tY2hhbmdlLXN0YXRlLm1vZGVsJztcbmltcG9ydCB7TW5nRW50aXR5UmV2aXNpb25DaGFuZ2VzfSBmcm9tICcuLi8uLi9tb2RlbHMvZW50aXR5LXJldmlzaW9uLWNoYW5nZXMubW9kZWwnO1xuaW1wb3J0IHtBdWRpdFV0aWx9IGZyb20gJy4uLy4uL3V0aWxzL2F1ZGl0LnV0aWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnbW5nLWVudGl0eS1jaGFuZ2VzLWZpZWxkJyxcbiAgICBpbXBvcnRzOiBbTmdGb3JPZiwgTW5nVGFibGVDb21wb25lbnQsIE5nSWYsIEFzeW5jUGlwZV0sXG4gICAgc3R5bGVVcmxzOiBbJ2VudGl0eS1jaGFuZ2VzLWZpZWxkLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgdGVtcGxhdGVVcmw6ICdlbnRpdHktY2hhbmdlcy1maWVsZC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgRW50aXR5Q2hhbmdlc0ZpZWxkQ29tcG9uZW50IGV4dGVuZHMgQU1uZ0Zvcm1seUN1c3RvbUZpZWxkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBASW5wdXQoKSBwdWJsaWMgaW5qZWN0b3I/OiBJbmplY3RvcjtcblxuICAgIHByaXZhdGUgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAgIHB1YmxpYyBlbnRpdHlDaGFuZ2VzOiBNbmdFbnRpdHlSZXZpc2lvbkNoYW5nZXNbXSA9IFtdO1xuICAgIHB1YmxpYyBtb2RlbEZldGNoZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuICAgIHByaXZhdGUgYXVkaXRNb2RlbDogTW5nR3VpRW50aXR5TW9kZWxEdG9bXSA9IFtdO1xuICAgIHByaXZhdGUgZmllbGRWYWx1ZT86IHtba2V5OiBzdHJpbmddOiBBcnJheTxNbmdFbnRpdHlDaGFuZ2VEdG8+fTtcblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZpZWxkVmFsdWUgPSB0aGlzLmZvcm1Db250cm9sLnZhbHVlIGFzIHtba2V5OiBzdHJpbmddOiBBcnJheTxNbmdFbnRpdHlDaGFuZ2VEdG8+fTtcbiAgICAgICAgdGhpcy5pbmplY3RvclxuICAgICAgICAgICAgPy5nZXQoTW5nQXVkaXRTZXJ2aWNlLCB1bmRlZmluZWQsIHtvcHRpb25hbDogdHJ1ZX0pXG4gICAgICAgICAgICA/LmF1ZGl0TW9kZWwkLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiBtb2RlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXVkaXRNb2RlbCA9IG1vZGVsO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuZmllbGRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlYyA9IG5ldyBNbmdFbnRpdHlSZXZpc2lvbkNoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYy5lbnRpdHlUeXBlID0ga2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjLml0ZW1zID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjaGFuZ2Ugb2YgdGhpcy5maWVsZFZhbHVlW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZS5yZXZUeXBlID09PSBNbmdSZXZpc2lvblR5cGVEdG8uQWRkICYmIGNoYW5nZS5lbnRpdHlOZXdTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IG5ldyBNbmdFbnRpdHlSZXZpc2lvbkNoYW5nZVN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnJldlR5cGUgPSBjaGFuZ2UucmV2VHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY29sb3IgPSAnZ3JlZW4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoY2hhbmdlLmVudGl0eU5ld1N0YXRlKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IChpdGVtW2tleV0gPSB2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWMuaXRlbXMucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2UucmV2VHlwZSA9PT0gTW5nUmV2aXNpb25UeXBlRHRvLkRlbCAmJiBjaGFuZ2UuZW50aXR5T2xkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBuZXcgTW5nRW50aXR5UmV2aXNpb25DaGFuZ2VTdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5yZXZUeXBlID0gY2hhbmdlLnJldlR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNvbG9yID0gJ3JlZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhjaGFuZ2UuZW50aXR5T2xkU3RhdGUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4gKGl0ZW1ba2V5XSA9IHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYy5pdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZS5yZXZUeXBlID09PSBNbmdSZXZpc2lvblR5cGVEdG8uTW9kICYmIGNoYW5nZS5lbnRpdHlPbGRTdGF0ZSAmJiBjaGFuZ2UuZW50aXR5TmV3U3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1PbGQgPSBuZXcgTW5nRW50aXR5UmV2aXNpb25DaGFuZ2VTdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbU9sZC5yZXZUeXBlID0gY2hhbmdlLnJldlR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtT2xkLmNvbG9yID0gJ3JlZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhjaGFuZ2UuZW50aXR5T2xkU3RhdGUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4gKGl0ZW1PbGRba2V5XSA9IHZhbHVlKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1OZXcgPSBuZXcgTW5nRW50aXR5UmV2aXNpb25DaGFuZ2VTdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbU5ldy5yZXZUeXBlID0gY2hhbmdlLnJldlR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtTmV3LmNvbG9yID0gJ2dyZWVuJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGNoYW5nZS5lbnRpdHlOZXdTdGF0ZSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiAoaXRlbU5ld1trZXldID0gdmFsdWUpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWMuaXRlbXMucHVzaChpdGVtT2xkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjLml0ZW1zLnB1c2goaXRlbU5ldyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbnRpdHlDaGFuZ2VzLnB1c2goZWMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbEZldGNoZWQubmV4dCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGVEZXNjcmlwdG9yKGVudGl0eUNoYW5nZXM6IE1uZ0VudGl0eVJldmlzaW9uQ2hhbmdlcykge1xuICAgICAgICBjb25zdCBjaGFuZ2VkRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAoZW50aXR5Q2hhbmdlcy5pdGVtcyAmJiBlbnRpdHlDaGFuZ2VzLml0ZW1zWzBdLnJldlR5cGUgPT09IE1uZ1JldmlzaW9uVHlwZUR0by5Nb2QpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGVudGl0eUNoYW5nZXMuaXRlbXNbMF0pIHtcbiAgICAgICAgICAgICAgICBpZiAoZW50aXR5Q2hhbmdlcy5pdGVtc1swXVtrZXldICE9PSBlbnRpdHlDaGFuZ2VzLml0ZW1zWzFdW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZEZpZWxkcy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZ3VpRW50aXR5TW9kZWwgPSB0aGlzLmF1ZGl0TW9kZWwuZmlsdGVyKG0gPT4gbS5lbnRpdHlOYW1lID09PSBlbnRpdHlDaGFuZ2VzLmVudGl0eVR5cGUpWzBdO1xuXG4gICAgICAgIGNvbnN0IGRlc2MgPSBuZXcgVGFibGVEZXNjcmlwdG9yKE1uZ0VudGl0eVJldmlzaW9uQ2hhbmdlU3RhdGUsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBndWlFbnRpdHlNb2RlbC5lbnRpdHlOYW1lKS53aXRoQ2xhc3NOYW1lKCdweS0yJyk7XG4gICAgICAgIGlmIChndWlFbnRpdHlNb2RlbC5lbnRpdHlOYW1lKSB7XG4gICAgICAgICAgICBkZXNjLndpdGhUaXRsZShndWlFbnRpdHlNb2RlbC5lbnRpdHlOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlc2MuYWRkQ29sdW1uKCdyZXZUeXBlJykud2l0aFRpdGxlKCdNbmdFbnRpdHlSZXZpc2lvbkNoYW5nZVN0YXRlLnByb3BlcnRpZXMucmV2VHlwZScpLmFzRW51bShNbmdSZXZpc2lvblR5cGVEdG8pO1xuXG4gICAgICAgIGlmIChndWlFbnRpdHlNb2RlbC5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBBdWRpdFV0aWwuYWRkQ29sdW1uc0Zyb21Nb2RlbChkZXNjLCBndWlFbnRpdHlNb2RlbC5wcm9wZXJ0aWVzLCB1bmRlZmluZWQsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZXNjLndpdGhSb3dDbGFzc05hbWUodW5kZWZpbmVkLCAoXywgaXRlbSkgPT4gKGl0ZW0gPyAoaXRlbS5jb2xvciA9PT0gJ2dyZWVuJyA/ICdhdWRpdC1yb3ctYWRkZWQnIDogJ2F1ZGl0LXJvdy1kZWxldGVkJykgOiAnJykpO1xuICAgICAgICBkZXNjLmNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xuICAgICAgICAgICAgaWYgKGNoYW5nZWRGaWVsZHMubGVuZ3RoID4gMCAmJiBjaGFuZ2VkRmllbGRzLnNvbWUodmFsID0+IGNvbC5wcm9wZXJ0eSA9PT0gdmFsKSkge1xuICAgICAgICAgICAgICAgIGNvbC53aXRoQ2xhc3NOYW1lKCdhdWRpdC1jZWxsJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2Mud2l0aFBhZ2luYXRpb25Nb2RlKFRhYmxlUGFnaW5hdGlvbk1vZGVFbnVtLlBhZ2luYXRpb24pO1xuICAgICAgICBkZXNjLndpdGhDdXJyZW50Q29sdW1uc1Jlb3JkZXJhYmxlKCk7XG4gICAgICAgIGRlc2Mud2l0aEN1cnJlbnRDb2x1bW5zVG9nZ2xlYWJsZSgpO1xuICAgICAgICBkZXNjLndpdGhEYXRhS2V5KGBFbnRpdHlDaGFuZ2VGaWVsZF8ke2VudGl0eUNoYW5nZXMuZW50aXR5VHlwZSA/PyAnZGVmYXVsdCd9YCk7XG5cbiAgICAgICAgcmV0dXJuIGRlc2M7XG4gICAgfVxufVxuIiwiPGRpdiAqbmdJZj1cIm1vZGVsRmV0Y2hlZCB8IGFzeW5jOyBlbHNlIGxvYWRpbmdcIj5cbiAgICA8bW5nLXRhYmxlICpuZ0Zvcj1cImxldCBlYyBvZiBlbnRpdHlDaGFuZ2VzXCIgW2l0ZW1zXT1cImVjLml0ZW1zXCIgW2Rlc2NyaXB0b3JdPVwiY3JlYXRlRGVzY3JpcHRvcihlYylcIj48L21uZy10YWJsZT5cbjwvZGl2PlxuPG5nLXRlbXBsYXRlICNsb2FkaW5nPlxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICA8aSBjbGFzcz1cInBpIHBpLXNwaW4gcGktc3Bpbm5lclwiIHN0eWxlPVwiZm9udC1zaXplOiAycmVtXCI+PC9pPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -1,16 +1,17 @@
1
1
  import { AsyncPipe, NgIf } from '@angular/common';
2
- import { Component, inject, signal } from '@angular/core';
2
+ import { Component, DestroyRef, inject, signal } from '@angular/core';
3
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
4
  import { FormsModule } from '@angular/forms';
4
5
  import { Router } from '@angular/router';
5
6
  import { FormlyModule } from '@ngx-formly/core';
6
7
  import { TranslateModule } from '@ngx-translate/core';
7
- import { switchMap } from 'rxjs';
8
+ import { combineLatest, throwError } from 'rxjs';
8
9
  import { map } from 'rxjs/operators';
9
- import { AMngTableviewRouteComponent, ActionDataProviderUtil, ActionEditorDescriptor, ActionEditorSubmitDescriptor, ActionEditorSubmitTypeEnum, ActionPositionEnum, LookupDataProvider, MediusQueryResult, MngDropdownComponent, MngTableviewRouteComponent, TableFilterDisplayEnum, TableviewActionDefaultCategories, TableviewDataProvider, TableviewDescriptor } from '@mediusinc/mng-commons';
10
- import { GuiEntityModel } from '../../../api/models';
10
+ import { AMngTableviewRouteComponent, ActionDataProviderUtil, ActionEditorDescriptor, ActionEditorSubmitDescriptor, ActionEditorSubmitTypeEnum, ActionPositionEnum, LookupDataProvider, MediusQueryResult, MngDropdownComponent, MngErrorInternal, MngTableviewRouteComponent, TableviewActionDefaultCategories, TableviewDataProvider, TableviewDescriptor } from '@mediusinc/mng-commons';
11
+ import { MngGuiEntityModelDto } from '../../../api/models/guiEntityModel';
11
12
  import { MngAuditRevisionsApiService } from '../../../api/services/audit-revisions-api.service';
12
13
  import { MngAuditService } from '../../../api/services/audit.service';
13
- import { RevEntityWithId } from '../../../models/revEntityWithId.model';
14
+ import { MngRevEntityWithId } from '../../../models/revEntityWithId.model';
14
15
  import { AuditUtil } from '../../../utils/audit.util';
15
16
  import * as i0 from "@angular/core";
16
17
  import * as i1 from "@angular/router";
@@ -20,24 +21,33 @@ export class MngAuditEntityRevisionsPageComponent extends AMngTableviewRouteComp
20
21
  constructor(router) {
21
22
  super();
22
23
  this.router = router;
24
+ this.destroyRef = inject(DestroyRef);
23
25
  this.auditService = inject(MngAuditService);
24
26
  this.revisisonsApiService = inject(MngAuditRevisionsApiService);
25
- this.showTable = signal(false);
26
- this.revisionEntitiesLookupProvider = new LookupDataProvider(GuiEntityModel).withLookup(() => this.auditService.auditModel$);
27
- this.auditService.revModel$.subscribe({
28
- next: model => (this.revModel = model)
29
- });
27
+ this.showTableview = signal(false);
28
+ this.revisionEntitiesLookupProvider = new LookupDataProvider(MngGuiEntityModelDto).withLookup(() => this.auditService.auditModel$.pipe(map(model => model.sort((m1, m2) => {
29
+ if (m1.entityName && m2.entityName) {
30
+ return m1.entityName.localeCompare(m2.entityName);
31
+ }
32
+ else if (m1.entityName && !m2.entityName) {
33
+ return 1;
34
+ }
35
+ else {
36
+ return -1;
37
+ }
38
+ }))));
30
39
  }
31
40
  ngOnInit() {
32
- this.route.paramMap.subscribe(params => {
41
+ this.route.paramMap.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {
33
42
  const entityClass = params.get('entityClass');
34
43
  if (entityClass) {
35
- this.auditService.auditModel$.subscribe(entities => {
44
+ combineLatest([this.auditService.auditModel$, this.auditService.revModel$]).subscribe(([entities, revModel]) => {
45
+ this.revModel = revModel;
36
46
  for (const e of entities) {
37
47
  if (e.entityName === entityClass) {
38
48
  this.selectedRevisionEntity = e;
39
49
  super.ngOnInit();
40
- setTimeout(() => this.showTable.set(true));
50
+ setTimeout(() => this.showTableview.set(true));
41
51
  }
42
52
  }
43
53
  });
@@ -45,7 +55,7 @@ export class MngAuditEntityRevisionsPageComponent extends AMngTableviewRouteComp
45
55
  });
46
56
  }
47
57
  onRevisionEntityChange() {
48
- this.showTable.set(false);
58
+ this.showTableview.set(false);
49
59
  if (this.selectedRevisionEntity) {
50
60
  this.router.navigate(['/audit/entity-revisions/' + this.selectedRevisionEntity.entityName]);
51
61
  }
@@ -54,48 +64,70 @@ export class MngAuditEntityRevisionsPageComponent extends AMngTableviewRouteComp
54
64
  }
55
65
  }
56
66
  createTableviewDescriptor() {
57
- const desc = new TableviewDescriptor(RevEntityWithId, 'mergedId', undefined, this.selectedRevisionEntity.entityName);
58
- desc.table.withFilterDisplay(TableFilterDisplayEnum.Row);
59
- return AuditUtil.buildDescriptorForEntityRevision(desc, this.revModel, this.selectedRevisionEntity);
67
+ if (!this.revModel || !this.selectedRevisionEntity?.entityName) {
68
+ throw new MngErrorInternal('No revision model or revision entity is provided for tableview.');
69
+ }
70
+ const desc = new TableviewDescriptor(MngRevEntityWithId, 'mergedId', undefined, this.selectedRevisionEntity.entityName);
71
+ AuditUtil.buildDescriptorForEntityRevision(desc, this.revModel, this.selectedRevisionEntity);
72
+ desc.table.withColumnsResizable();
73
+ desc.table.withCurrentColumnsReorderable();
74
+ desc.table.withCurrentColumnsToggleable();
75
+ desc.table.withDataKey(`EntityRevisionsPage_${this.selectedRevisionEntity.entityName}`);
76
+ return desc;
60
77
  }
61
78
  createTableviewDataProvider() {
62
- let allDataCount = 0;
63
- return new TableviewDataProvider(RevEntityWithId).withGetAll(qp => this.revisisonsApiService.countRevisionsWithStateForEntityType(qp, this.selectedRevisionEntity.entityName).pipe(switchMap(revisionCount => {
64
- allDataCount = revisionCount;
65
- return this.revisisonsApiService.listRevisionsWithStateForEntityType(qp, this.selectedRevisionEntity.entityName);
66
- }), map(values => {
67
- const revEntityWithStateAndIdList = [];
68
- for (const revEntityWithState of values) {
69
- const revEntityWithStateAndId = new RevEntityWithId();
70
- revEntityWithStateAndId.mergedId = revEntityWithState.revEntity['rev'] + '_' + revEntityWithState.entityState['id'];
71
- revEntityWithStateAndId.revType = revEntityWithState.revType;
72
- revEntityWithStateAndId.revEntity = revEntityWithState.revEntity;
73
- revEntityWithStateAndId.entityState = revEntityWithState.entityState;
74
- revEntityWithStateAndId.entityClassName = revEntityWithState.entityClassName;
75
- revEntityWithStateAndIdList.push(revEntityWithStateAndId);
76
- }
77
- return MediusQueryResult.fromArray(revEntityWithStateAndIdList, allDataCount);
78
- })));
79
+ if (!this.revModel || !this.selectedRevisionEntity?.entityName) {
80
+ throw new MngErrorInternal('No revision model or revision entity is provided for tableview.');
81
+ }
82
+ const entityName = this.selectedRevisionEntity.entityName;
83
+ return new TableviewDataProvider(MngRevEntityWithId).withGetAll(qp => this.selectedRevisionEntity?.entityName
84
+ ? combineLatest([
85
+ this.revisisonsApiService.countRevisionsWithStateForEntityType(qp, entityName),
86
+ this.revisisonsApiService.listRevisionsWithStateForEntityType(qp, entityName)
87
+ ]).pipe(map(([count, values]) => {
88
+ const revEntityWithStateAndIdList = [];
89
+ for (const revEntityWithState of values) {
90
+ const revEntityWithStateAndId = new MngRevEntityWithId();
91
+ revEntityWithStateAndId.mergedId = revEntityWithState.revEntity?.['rev'] + '_' + revEntityWithState.entityState?.['id'];
92
+ revEntityWithStateAndId.revType = revEntityWithState.revType;
93
+ revEntityWithStateAndId.revEntity = revEntityWithState.revEntity;
94
+ revEntityWithStateAndId.entityState = revEntityWithState.entityState;
95
+ revEntityWithStateAndId.entityClassName = revEntityWithState.entityClassName;
96
+ revEntityWithStateAndIdList.push(revEntityWithStateAndId);
97
+ }
98
+ return MediusQueryResult.fromArray(revEntityWithStateAndIdList, count);
99
+ }))
100
+ : throwError(() => new MngErrorInternal('No revision entity is provided for list.')));
79
101
  }
80
102
  createActionDescriptors() {
103
+ if (!this.revModel || !this.selectedRevisionEntity?.entityName) {
104
+ throw new MngErrorInternal('No revision model or revision entity is provided for tableview.');
105
+ }
106
+ const entityName = this.selectedRevisionEntity.entityName;
81
107
  const detailsAction = new ActionEditorDescriptor(this.descriptor.detailsEditor, 'entity-revision-details')
82
108
  .withPosition(ActionPositionEnum.RowClick)
83
109
  .withRouteTrigger(':itemId')
84
110
  .withFetchFunction(ActionDataProviderUtil.runFetchOrFail)
85
111
  .withTableviewCategory(TableviewActionDefaultCategories.DETAILS)
86
112
  .withFetchFunction(ctx => {
113
+ if (!entityName) {
114
+ return throwError(() => new MngErrorInternal('No revision entity is provided for details.'));
115
+ }
116
+ if (!ctx.parameters.itemId) {
117
+ return throwError(() => new MngErrorInternal('No item id for revision entity details is provided.'));
118
+ }
87
119
  const revId = ctx.parameters.itemId.toString().split('_')[0];
88
120
  const itemId = ctx.parameters.itemId.toString().split('_')[1];
89
- return this.revisisonsApiService.fetchRevisionsWithStateForEntityType(this.selectedRevisionEntity.entityName, revId, itemId);
121
+ return this.revisisonsApiService.fetchRevisionsWithStateForEntityType(entityName, revId, itemId);
90
122
  });
91
123
  detailsAction.withEditorActions([new ActionEditorSubmitDescriptor(detailsAction, ActionEditorSubmitTypeEnum.Cancel)]);
92
124
  return [detailsAction];
93
125
  }
94
126
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MngAuditEntityRevisionsPageComponent, deps: [{ token: i1.Router }], target: i0.ɵɵFactoryTarget.Component }); }
95
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MngAuditEntityRevisionsPageComponent, isStandalone: true, selector: "mng-audit-entity-revisions-page", usesInheritance: true, ngImport: i0, template: "<div class=\"card\">\n <div class=\"field mb-0\">\n <mng-dropdown\n id=\"revisionEntityDropdown\"\n [placeholder]=\"'pages.entityRevisions.dropdown.placeholder' | translate\"\n [itemsLabelProperty]=\"'entityName'\"\n [(ngModel)]=\"selectedRevisionEntity\"\n (valueChange)=\"onRevisionEntityChange()\"\n [dataProvider]=\"revisionEntitiesLookupProvider\"></mng-dropdown>\n <small *ngIf=\"!selectedRevisionEntity\" class=\"block\">\n {{ 'pages.entityRevisions.dropdown.helpText' | translate }}\n </small>\n </div>\n</div>\n<div *ngIf=\"showTable()\">\n <mng-tableview-route [descriptor]=\"descriptor\" [dataProvider]=\"dataProvider\" [actions]=\"actions\"></mng-tableview-route>\n</div>\n", dependencies: [{ kind: "component", type: MngDropdownComponent, selector: "mng-dropdown", inputs: ["dataProvider", "dataKeyProperty", "itemsLabelProperty", "itemsLabelTranslate", "itemsValueProperty", "itemsDisabledProperty", "multiselect", "placeholder", "showClear", "selectFirstItem", "className", "dropdownClassName", "changeValueOnBlur"], outputs: ["valueChange"] }, { kind: "component", type: MngTableviewRouteComponent, selector: "mng-tableview-route", inputs: ["descriptor", "dataProvider", "actions"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormlyModule }] }); }
127
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MngAuditEntityRevisionsPageComponent, isStandalone: true, selector: "mng-audit-entity-revisions-page", usesInheritance: true, ngImport: i0, template: "<div class=\"card\">\n <div class=\"field mb-0\">\n <mng-dropdown\n id=\"revisionEntityDropdown\"\n [placeholder]=\"'pages.entityRevisions.dropdown.placeholder' | translate\"\n [itemsLabelProperty]=\"'entityName'\"\n [(ngModel)]=\"selectedRevisionEntity\"\n (valueChange)=\"onRevisionEntityChange()\"\n [dataProvider]=\"revisionEntitiesLookupProvider\"></mng-dropdown>\n <small *ngIf=\"!selectedRevisionEntity\" class=\"block\">\n {{ 'pages.entityRevisions.dropdown.helpText' | translate }}\n </small>\n </div>\n</div>\n<div *ngIf=\"showTableview()\">\n <mng-tableview-route [descriptor]=\"descriptor\" [dataProvider]=\"dataProvider\" [actions]=\"actions\"></mng-tableview-route>\n</div>\n", dependencies: [{ kind: "component", type: MngDropdownComponent, selector: "mng-dropdown", inputs: ["dataProvider", "dataKeyProperty", "itemsLabelProperty", "itemsLabelTranslate", "itemsValueProperty", "itemsDisabledProperty", "multiselect", "placeholder", "showClear", "selectFirstItem", "className", "dropdownClassName", "changeValueOnBlur"], outputs: ["valueChange"] }, { kind: "component", type: MngTableviewRouteComponent, selector: "mng-tableview-route", inputs: ["descriptor", "dataProvider", "actions"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormlyModule }] }); }
96
128
  }
97
129
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MngAuditEntityRevisionsPageComponent, decorators: [{
98
130
  type: Component,
99
- args: [{ standalone: true, selector: 'mng-audit-entity-revisions-page', imports: [MngDropdownComponent, MngTableviewRouteComponent, FormsModule, AsyncPipe, NgIf, TranslateModule, FormlyModule], template: "<div class=\"card\">\n <div class=\"field mb-0\">\n <mng-dropdown\n id=\"revisionEntityDropdown\"\n [placeholder]=\"'pages.entityRevisions.dropdown.placeholder' | translate\"\n [itemsLabelProperty]=\"'entityName'\"\n [(ngModel)]=\"selectedRevisionEntity\"\n (valueChange)=\"onRevisionEntityChange()\"\n [dataProvider]=\"revisionEntitiesLookupProvider\"></mng-dropdown>\n <small *ngIf=\"!selectedRevisionEntity\" class=\"block\">\n {{ 'pages.entityRevisions.dropdown.helpText' | translate }}\n </small>\n </div>\n</div>\n<div *ngIf=\"showTable()\">\n <mng-tableview-route [descriptor]=\"descriptor\" [dataProvider]=\"dataProvider\" [actions]=\"actions\"></mng-tableview-route>\n</div>\n" }]
131
+ args: [{ standalone: true, selector: 'mng-audit-entity-revisions-page', imports: [MngDropdownComponent, MngTableviewRouteComponent, FormsModule, AsyncPipe, NgIf, TranslateModule, FormlyModule], template: "<div class=\"card\">\n <div class=\"field mb-0\">\n <mng-dropdown\n id=\"revisionEntityDropdown\"\n [placeholder]=\"'pages.entityRevisions.dropdown.placeholder' | translate\"\n [itemsLabelProperty]=\"'entityName'\"\n [(ngModel)]=\"selectedRevisionEntity\"\n (valueChange)=\"onRevisionEntityChange()\"\n [dataProvider]=\"revisionEntitiesLookupProvider\"></mng-dropdown>\n <small *ngIf=\"!selectedRevisionEntity\" class=\"block\">\n {{ 'pages.entityRevisions.dropdown.helpText' | translate }}\n </small>\n </div>\n</div>\n<div *ngIf=\"showTableview()\">\n <mng-tableview-route [descriptor]=\"descriptor\" [dataProvider]=\"dataProvider\" [actions]=\"actions\"></mng-tableview-route>\n</div>\n" }]
100
132
  }], ctorParameters: function () { return [{ type: i1.Router }]; } });
101
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtZW50aXR5LXJldmlzaW9ucy1wYWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9wYWdlcy9lbnRpdHktcmV2aXNpb25zL2F1ZGl0LWVudGl0eS1yZXZpc2lvbnMtcGFnZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvcGFnZXMvZW50aXR5LXJldmlzaW9ucy9hdWRpdC1lbnRpdHktcmV2aXNpb25zLXBhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMsU0FBUyxFQUFrQixNQUFNLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRCxPQUFPLEVBQUssU0FBUyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuQyxPQUFPLEVBQ0gsMkJBQTJCLEVBQzNCLHNCQUFzQixFQUV0QixzQkFBc0IsRUFDdEIsNEJBQTRCLEVBQzVCLDBCQUEwQixFQUMxQixrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQixvQkFBb0IsRUFDcEIsMEJBQTBCLEVBQzFCLHNCQUFzQixFQUN0QixnQ0FBZ0MsRUFDaEMscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUN0QixNQUFNLHdCQUF3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QUFhLElBQUksNEZBQUUsZUFBZSwyRkFBRSxZQUFZOzsyRkFHOUcsb0NBQW9DO2tCQU5oRCxTQUFTO2lDQUNNLElBQUksWUFDTixpQ0FBaUMsV0FDbEMsQ0FBQyxvQkFBb0IsRUFBRSwwQkFBMEIsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBc3luY1BpcGUsIE5nSWZ9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge0NvbXBvbmVudCwgV3JpdGFibGVTaWduYWwsIGluamVjdCwgc2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Rm9ybXNNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7Um91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge0Zvcm1seU1vZHVsZX0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge29mLCBzd2l0Y2hNYXB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHttYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgICBBTW5nVGFibGV2aWV3Um91dGVDb21wb25lbnQsXG4gICAgQWN0aW9uRGF0YVByb3ZpZGVyVXRpbCxcbiAgICBBY3Rpb25EZXNjcmlwdG9yLFxuICAgIEFjdGlvbkVkaXRvckRlc2NyaXB0b3IsXG4gICAgQWN0aW9uRWRpdG9yU3VibWl0RGVzY3JpcHRvcixcbiAgICBBY3Rpb25FZGl0b3JTdWJtaXRUeXBlRW51bSxcbiAgICBBY3Rpb25Qb3NpdGlvbkVudW0sXG4gICAgTG9va3VwRGF0YVByb3ZpZGVyLFxuICAgIE1lZGl1c1F1ZXJ5UmVzdWx0LFxuICAgIE1uZ0Ryb3Bkb3duQ29tcG9uZW50LFxuICAgIE1uZ1RhYmxldmlld1JvdXRlQ29tcG9uZW50LFxuICAgIFRhYmxlRmlsdGVyRGlzcGxheUVudW0sXG4gICAgVGFibGV2aWV3QWN0aW9uRGVmYXVsdENhdGVnb3JpZXMsXG4gICAgVGFibGV2aWV3RGF0YVByb3ZpZGVyLFxuICAgIFRhYmxldmlld0Rlc2NyaXB0b3Jcbn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucyc7XG5cbmltcG9ydCB7R3VpRW50aXR5TW9kZWx9IGZyb20gJy4uLy4uLy4uL2FwaS9tb2RlbHMnO1xuaW1wb3J0IHtNbmdBdWRpdFJldmlzaW9uc0FwaVNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2FwaS9zZXJ2aWNlcy9hdWRpdC1yZXZpc2lvbnMtYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHtNbmdBdWRpdFNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2FwaS9zZXJ2aWNlcy9hdWRpdC5zZXJ2aWNlJztcbmltcG9ydCB7UmV2RW50aXR5V2l0aElkfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvcmV2RW50aXR5V2l0aElkLm1vZGVsJztcbmltcG9ydCB7QXVkaXRVdGlsfSBmcm9tICcuLi8uLi8uLi91dGlscy9hdWRpdC51dGlsJztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ21uZy1hdWRpdC1lbnRpdHktcmV2aXNpb25zLXBhZ2UnLFxuICAgIGltcG9ydHM6IFtNbmdEcm9wZG93bkNvbXBvbmVudCwgTW5nVGFibGV2aWV3Um91dGVDb21wb25lbnQsIEZvcm1zTW9kdWxlLCBBc3luY1BpcGUsIE5nSWYsIFRyYW5zbGF0ZU1vZHVsZSwgRm9ybWx5TW9kdWxlXSxcbiAgICB0ZW1wbGF0ZVVybDogJ2F1ZGl0LWVudGl0eS1yZXZpc2lvbnMtcGFnZS5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgTW5nQXVkaXRFbnRpdHlSZXZpc2lvbnNQYWdlQ29tcG9uZW50IGV4dGVuZHMgQU1uZ1RhYmxldmlld1JvdXRlQ29tcG9uZW50PFJldkVudGl0eVdpdGhJZCwgYW55PiB7XG4gICAgcHJpdmF0ZSBhdWRpdFNlcnZpY2UgPSBpbmplY3QoTW5nQXVkaXRTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJldmlzaXNvbnNBcGlTZXJ2aWNlID0gaW5qZWN0KE1uZ0F1ZGl0UmV2aXNpb25zQXBpU2VydmljZSk7XG5cbiAgICBwdWJsaWMgcmV2TW9kZWwhOiBHdWlFbnRpdHlNb2RlbDtcbiAgICBwdWJsaWMgc2VsZWN0ZWRSZXZpc2lvbkVudGl0eSE6IEd1aUVudGl0eU1vZGVsO1xuICAgIHB1YmxpYyByZXZpc2lvbkVudGl0aWVzTG9va3VwUHJvdmlkZXI/OiBMb29rdXBEYXRhUHJvdmlkZXI8R3VpRW50aXR5TW9kZWwsIG5ldmVyPjtcblxuICAgIHB1YmxpYyBzaG93VGFibGU6IFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+ID0gc2lnbmFsKGZhbHNlKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcm91dGVyOiBSb3V0ZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZXZpc2lvbkVudGl0aWVzTG9va3VwUHJvdmlkZXIgPSBuZXcgTG9va3VwRGF0YVByb3ZpZGVyPEd1aUVudGl0eU1vZGVsLCBuZXZlcj4oR3VpRW50aXR5TW9kZWwpLndpdGhMb29rdXAoKCkgPT4gdGhpcy5hdWRpdFNlcnZpY2UuYXVkaXRNb2RlbCQpO1xuXG4gICAgICAgIHRoaXMuYXVkaXRTZXJ2aWNlLnJldk1vZGVsJC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogbW9kZWwgPT4gKHRoaXMucmV2TW9kZWwgPSBtb2RlbClcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMucm91dGUucGFyYW1NYXAuc3Vic2NyaWJlKHBhcmFtcyA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHlDbGFzcyA9IHBhcmFtcy5nZXQoJ2VudGl0eUNsYXNzJyk7XG4gICAgICAgICAgICBpZiAoZW50aXR5Q2xhc3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF1ZGl0U2VydmljZS5hdWRpdE1vZGVsJC5zdWJzY3JpYmUoZW50aXRpZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgZW50aXRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmVudGl0eU5hbWUgPT09IGVudGl0eUNsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJldmlzaW9uRW50aXR5ID0gZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zaG93VGFibGUuc2V0KHRydWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25SZXZpc2lvbkVudGl0eUNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5zaG93VGFibGUuc2V0KGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSZXZpc2lvbkVudGl0eSkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvYXVkaXQvZW50aXR5LXJldmlzaW9ucy8nICsgdGhpcy5zZWxlY3RlZFJldmlzaW9uRW50aXR5LmVudGl0eU5hbWVdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2F1ZGl0L2VudGl0eS1yZXZpc2lvbnMvJ10pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNyZWF0ZVRhYmxldmlld0Rlc2NyaXB0b3IoKSB7XG4gICAgICAgIGNvbnN0IGRlc2MgPSBuZXcgVGFibGV2aWV3RGVzY3JpcHRvcihSZXZFbnRpdHlXaXRoSWQsICdtZXJnZWRJZCcsIHVuZGVmaW5lZCwgdGhpcy5zZWxlY3RlZFJldmlzaW9uRW50aXR5LmVudGl0eU5hbWUpO1xuICAgICAgICBkZXNjLnRhYmxlLndpdGhGaWx0ZXJEaXNwbGF5KFRhYmxlRmlsdGVyRGlzcGxheUVudW0uUm93KTtcbiAgICAgICAgcmV0dXJuIEF1ZGl0VXRpbC5idWlsZERlc2NyaXB0b3JGb3JFbnRpdHlSZXZpc2lvbihkZXNjLCB0aGlzLnJldk1vZGVsLCB0aGlzLnNlbGVjdGVkUmV2aXNpb25FbnRpdHkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjcmVhdGVUYWJsZXZpZXdEYXRhUHJvdmlkZXIoKSB7XG4gICAgICAgIGxldCBhbGxEYXRhQ291bnQgPSAwO1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxldmlld0RhdGFQcm92aWRlcihSZXZFbnRpdHlXaXRoSWQpLndpdGhHZXRBbGwocXAgPT5cbiAgICAgICAgICAgIHRoaXMucmV2aXNpc29uc0FwaVNlcnZpY2UuY291bnRSZXZpc2lvbnNXaXRoU3RhdGVGb3JFbnRpdHlUeXBlKHFwLCB0aGlzLnNlbGVjdGVkUmV2aXNpb25FbnRpdHkuZW50aXR5TmFtZSEpLnBpcGUoXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKHJldmlzaW9uQ291bnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhbGxEYXRhQ291bnQgPSByZXZpc2lvbkNvdW50O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXZpc2lzb25zQXBpU2VydmljZS5saXN0UmV2aXNpb25zV2l0aFN0YXRlRm9yRW50aXR5VHlwZShxcCwgdGhpcy5zZWxlY3RlZFJldmlzaW9uRW50aXR5LmVudGl0eU5hbWUhKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBtYXAodmFsdWVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV2RW50aXR5V2l0aFN0YXRlQW5kSWRMaXN0ID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmV2RW50aXR5V2l0aFN0YXRlIG9mIHZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV2RW50aXR5V2l0aFN0YXRlQW5kSWQgPSBuZXcgUmV2RW50aXR5V2l0aElkKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXZFbnRpdHlXaXRoU3RhdGVBbmRJZC5tZXJnZWRJZCA9IHJldkVudGl0eVdpdGhTdGF0ZS5yZXZFbnRpdHkhWydyZXYnXSArICdfJyArIHJldkVudGl0eVdpdGhTdGF0ZS5lbnRpdHlTdGF0ZSFbJ2lkJ107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXZFbnRpdHlXaXRoU3RhdGVBbmRJZC5yZXZUeXBlID0gcmV2RW50aXR5V2l0aFN0YXRlLnJldlR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXZFbnRpdHlXaXRoU3RhdGVBbmRJZC5yZXZFbnRpdHkgPSByZXZFbnRpdHlXaXRoU3RhdGUucmV2RW50aXR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV2RW50aXR5V2l0aFN0YXRlQW5kSWQuZW50aXR5U3RhdGUgPSByZXZFbnRpdHlXaXRoU3RhdGUuZW50aXR5U3RhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXZFbnRpdHlXaXRoU3RhdGVBbmRJZC5lbnRpdHlDbGFzc05hbWUgPSByZXZFbnRpdHlXaXRoU3RhdGUuZW50aXR5Q2xhc3NOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV2RW50aXR5V2l0aFN0YXRlQW5kSWRMaXN0LnB1c2gocmV2RW50aXR5V2l0aFN0YXRlQW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBNZWRpdXNRdWVyeVJlc3VsdC5mcm9tQXJyYXkocmV2RW50aXR5V2l0aFN0YXRlQW5kSWRMaXN0LCBhbGxEYXRhQ291bnQpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGNyZWF0ZUFjdGlvbkRlc2NyaXB0b3JzKCk6IEFycmF5PEFjdGlvbkRlc2NyaXB0b3I8UmV2RW50aXR5V2l0aElkPj4ge1xuICAgICAgICBjb25zdCBkZXRhaWxzQWN0aW9uID0gbmV3IEFjdGlvbkVkaXRvckRlc2NyaXB0b3IodGhpcy5kZXNjcmlwdG9yLmRldGFpbHNFZGl0b3IsICdlbnRpdHktcmV2aXNpb24tZGV0YWlscycpXG4gICAgICAgICAgICAud2l0aFBvc2l0aW9uKEFjdGlvblBvc2l0aW9uRW51bS5Sb3dDbGljaylcbiAgICAgICAgICAgIC53aXRoUm91dGVUcmlnZ2VyKCc6aXRlbUlkJylcbiAgICAgICAgICAgIC53aXRoRmV0Y2hGdW5jdGlvbihBY3Rpb25EYXRhUHJvdmlkZXJVdGlsLnJ1bkZldGNoT3JGYWlsKVxuICAgICAgICAgICAgLndpdGhUYWJsZXZpZXdDYXRlZ29yeShUYWJsZXZpZXdBY3Rpb25EZWZhdWx0Q2F0ZWdvcmllcy5ERVRBSUxTKVxuICAgICAgICAgICAgLndpdGhGZXRjaEZ1bmN0aW9uKGN0eCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV2SWQgPSBjdHgucGFyYW1ldGVycy5pdGVtSWQhLnRvU3RyaW5nKCkuc3BsaXQoJ18nKVswXTtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtSWQgPSBjdHgucGFyYW1ldGVycy5pdGVtSWQhLnRvU3RyaW5nKCkuc3BsaXQoJ18nKVsxXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXZpc2lzb25zQXBpU2VydmljZS5mZXRjaFJldmlzaW9uc1dpdGhTdGF0ZUZvckVudGl0eVR5cGUodGhpcy5zZWxlY3RlZFJldmlzaW9uRW50aXR5LmVudGl0eU5hbWUhLCByZXZJZCwgaXRlbUlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBkZXRhaWxzQWN0aW9uLndpdGhFZGl0b3JBY3Rpb25zKFtuZXcgQWN0aW9uRWRpdG9yU3VibWl0RGVzY3JpcHRvcihkZXRhaWxzQWN0aW9uLCBBY3Rpb25FZGl0b3JTdWJtaXRUeXBlRW51bS5DYW5jZWwpXSk7XG4gICAgICAgIHJldHVybiBbZGV0YWlsc0FjdGlvbl07XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNhcmRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmllbGQgbWItMFwiPlxuICAgICAgICA8bW5nLWRyb3Bkb3duXG4gICAgICAgICAgICBpZD1cInJldmlzaW9uRW50aXR5RHJvcGRvd25cIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidwYWdlcy5lbnRpdHlSZXZpc2lvbnMuZHJvcGRvd24ucGxhY2Vob2xkZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtpdGVtc0xhYmVsUHJvcGVydHldPVwiJ2VudGl0eU5hbWUnXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRSZXZpc2lvbkVudGl0eVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25SZXZpc2lvbkVudGl0eUNoYW5nZSgpXCJcbiAgICAgICAgICAgIFtkYXRhUHJvdmlkZXJdPVwicmV2aXNpb25FbnRpdGllc0xvb2t1cFByb3ZpZGVyXCI+PC9tbmctZHJvcGRvd24+XG4gICAgICAgIDxzbWFsbCAqbmdJZj1cIiFzZWxlY3RlZFJldmlzaW9uRW50aXR5XCIgY2xhc3M9XCJibG9ja1wiPlxuICAgICAgICAgICAge3sgJ3BhZ2VzLmVudGl0eVJldmlzaW9ucy5kcm9wZG93bi5oZWxwVGV4dCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9zbWFsbD5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiAqbmdJZj1cInNob3dUYWJsZSgpXCI+XG4gICAgPG1uZy10YWJsZXZpZXctcm91dGUgW2Rlc2NyaXB0b3JdPVwiZGVzY3JpcHRvclwiIFtkYXRhUHJvdmlkZXJdPVwiZGF0YVByb3ZpZGVyXCIgW2FjdGlvbnNdPVwiYWN0aW9uc1wiPjwvbW5nLXRhYmxldmlldy1yb3V0ZT5cbjwvZGl2PlxuIl19
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtZW50aXR5LXJldmlzaW9ucy1wYWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9wYWdlcy9lbnRpdHktcmV2aXNpb25zL2F1ZGl0LWVudGl0eS1yZXZpc2lvbnMtcGFnZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvcGFnZXMvZW50aXR5LXJldmlzaW9ucy9hdWRpdC1lbnRpdHktcmV2aXNpb25zLXBhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBMEIsTUFBTSxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXZDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDL0MsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRW5DLE9BQU8sRUFDSCwyQkFBMkIsRUFDM0Isc0JBQXNCLEVBRXRCLHNCQUFzQixFQUN0Qiw0QkFBNEIsRUFDNUIsMEJBQTBCLEVBQzFCLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixnQkFBZ0IsRUFD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LENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3RCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUQsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsb0NBQW9DLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyRyxDQUFDLENBQUMsQ0FBQztRQUNQLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksNEJBQTRCLENBQUMsYUFBYSxFQUFFLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0SCxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDM0IsQ0FBQzs4R0FqSVEsb0NBQW9DO2tHQUFwQyxvQ0FBb0Msa0hDekNqRCw4eEJBaUJBLDRDRHFCYyxvQkFBb0IsaVZBQUUsMEJBQTBCLGtIQUFFLFdBQVcsK1ZBQWEsSUFBSSw0RkFBRSxlQUFlLDJGQUFFLFlBQVk7OzJGQUc5RyxvQ0FBb0M7a0JBTmhELFNBQVM7aUNBQ00sSUFBSSxZQUNOLGlDQUFpQyxXQUNsQyxDQUFDLG9CQUFvQixFQUFFLDBCQUEwQixFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FzeW5jUGlwZSwgTmdJZn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7Q29tcG9uZW50LCBEZXN0cm95UmVmLCBPbkluaXQsIFdyaXRhYmxlU2lnbmFsLCBpbmplY3QsIHNpZ25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtGb3Jtc01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7Rm9ybWx5TW9kdWxlfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7Y29tYmluZUxhdGVzdCwgdGhyb3dFcnJvcn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge21hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICAgIEFNbmdUYWJsZXZpZXdSb3V0ZUNvbXBvbmVudCxcbiAgICBBY3Rpb25EYXRhUHJvdmlkZXJVdGlsLFxuICAgIEFjdGlvbkRlc2NyaXB0b3IsXG4gICAgQWN0aW9uRWRpdG9yRGVzY3JpcHRvcixcbiAgICBBY3Rpb25FZGl0b3JTdWJtaXREZXNjcmlwdG9yLFxuICAgIEFjdGlvbkVkaXRvclN1Ym1pdFR5cGVFbnVtLFxuICAgIEFjdGlvblBvc2l0aW9uRW51bSxcbiAgICBMb29rdXBEYXRhUHJvdmlkZXIsXG4gICAgTWVkaXVzUXVlcnlSZXN1bHQsXG4gICAgTW5nRHJvcGRvd25Db21wb25lbnQsXG4gICAgTW5nRXJyb3JJbnRlcm5hbCxcbiAgICBNbmdUYWJsZXZpZXdSb3V0ZUNvbXBvbmVudCxcbiAgICBUYWJsZXZpZXdBY3Rpb25EZWZhdWx0Q2F0ZWdvcmllcyxcbiAgICBUYWJsZXZpZXdEYXRhUHJvdmlkZXIsXG4gICAgVGFibGV2aWV3RGVzY3JpcHRvclxufSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zJztcblxuaW1wb3J0IHtNbmdHdWlFbnRpdHlNb2RlbER0b30gZnJvbSAnLi4vLi4vLi4vYXBpL21vZGVscy9ndWlFbnRpdHlNb2RlbCc7XG5pbXBvcnQge01uZ0F1ZGl0UmV2aXNpb25zQXBpU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vYXBpL3NlcnZpY2VzL2F1ZGl0LXJldmlzaW9ucy1hcGkuc2VydmljZSc7XG5pbXBvcnQge01uZ0F1ZGl0U2VydmljZX0gZnJvbSAnLi4vLi4vLi4vYXBpL3NlcnZpY2VzL2F1ZGl0LnNlcnZpY2UnO1xuaW1wb3J0IHtNbmdSZXZFbnRpdHlXaXRoSWR9IGZyb20gJy4uLy4uLy4uL21vZGVscy9yZXZFbnRpdHlXaXRoSWQubW9kZWwnO1xuaW1wb3J0IHtBdWRpdFV0aWx9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2F1ZGl0LnV0aWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnbW5nLWF1ZGl0LWVudGl0eS1yZXZpc2lvbnMtcGFnZScsXG4gICAgaW1wb3J0czogW01uZ0Ryb3Bkb3duQ29tcG9uZW50LCBNbmdUYWJsZXZpZXdSb3V0ZUNvbXBvbmVudCwgRm9ybXNNb2R1bGUsIEFzeW5jUGlwZSwgTmdJZiwgVHJhbnNsYXRlTW9kdWxlLCBGb3JtbHlNb2R1bGVdLFxuICAgIHRlbXBsYXRlVXJsOiAnYXVkaXQtZW50aXR5LXJldmlzaW9ucy1wYWdlLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBNbmdBdWRpdEVudGl0eVJldmlzaW9uc1BhZ2VDb21wb25lbnQgZXh0ZW5kcyBBTW5nVGFibGV2aWV3Um91dGVDb21wb25lbnQ8TW5nUmV2RW50aXR5V2l0aElkLCB1bmtub3duPiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgcHJpdmF0ZSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICAgIHByaXZhdGUgYXVkaXRTZXJ2aWNlID0gaW5qZWN0KE1uZ0F1ZGl0U2VydmljZSk7XG4gICAgcHJpdmF0ZSByZXZpc2lzb25zQXBpU2VydmljZSA9IGluamVjdChNbmdBdWRpdFJldmlzaW9uc0FwaVNlcnZpY2UpO1xuXG4gICAgcHVibGljIHJldk1vZGVsPzogTW5nR3VpRW50aXR5TW9kZWxEdG87XG4gICAgcHVibGljIHNlbGVjdGVkUmV2aXNpb25FbnRpdHk/OiBNbmdHdWlFbnRpdHlNb2RlbER0bztcbiAgICBwdWJsaWMgcmV2aXNpb25FbnRpdGllc0xvb2t1cFByb3ZpZGVyPzogTG9va3VwRGF0YVByb3ZpZGVyPE1uZ0d1aUVudGl0eU1vZGVsRHRvLCBuZXZlcj47XG5cbiAgICBwdWJsaWMgc2hvd1RhYmxldmlldzogV3JpdGFibGVTaWduYWw8Ym9vbGVhbj4gPSBzaWduYWwoZmFsc2UpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByb3V0ZXI6IFJvdXRlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnJldmlzaW9uRW50aXRpZXNMb29rdXBQcm92aWRlciA9IG5ldyBMb29rdXBEYXRhUHJvdmlkZXI8TW5nR3VpRW50aXR5TW9kZWxEdG8sIG5ldmVyPihNbmdHdWlFbnRpdHlNb2RlbER0bykud2l0aExvb2t1cCgoKSA9PlxuICAgICAgICAgICAgdGhpcy5hdWRpdFNlcnZpY2UuYXVkaXRNb2RlbCQucGlwZShcbiAgICAgICAgICAgICAgICBtYXAobW9kZWwgPT5cbiAgICAgICAgICAgICAgICAgICAgbW9kZWwuc29ydCgobTEsIG0yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobTEuZW50aXR5TmFtZSAmJiBtMi5lbnRpdHlOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0xLmVudGl0eU5hbWUubG9jYWxlQ29tcGFyZShtMi5lbnRpdHlOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobTEuZW50aXR5TmFtZSAmJiAhbTIuZW50aXR5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnJvdXRlLnBhcmFtTWFwLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZShwYXJhbXMgPT4ge1xuICAgICAgICAgICAgY29uc3QgZW50aXR5Q2xhc3MgPSBwYXJhbXMuZ2V0KCdlbnRpdHlDbGFzcycpO1xuICAgICAgICAgICAgaWYgKGVudGl0eUNsYXNzKSB7XG4gICAgICAgICAgICAgICAgY29tYmluZUxhdGVzdChbdGhpcy5hdWRpdFNlcnZpY2UuYXVkaXRNb2RlbCQsIHRoaXMuYXVkaXRTZXJ2aWNlLnJldk1vZGVsJF0pLnN1YnNjcmliZSgoW2VudGl0aWVzLCByZXZNb2RlbF0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXZNb2RlbCA9IHJldk1vZGVsO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBlbnRpdGllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZW50aXR5TmFtZSA9PT0gZW50aXR5Q2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmV2aXNpb25FbnRpdHkgPSBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNob3dUYWJsZXZpZXcuc2V0KHRydWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25SZXZpc2lvbkVudGl0eUNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5zaG93VGFibGV2aWV3LnNldChmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkUmV2aXNpb25FbnRpdHkpIHtcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2F1ZGl0L2VudGl0eS1yZXZpc2lvbnMvJyArIHRoaXMuc2VsZWN0ZWRSZXZpc2lvbkVudGl0eS5lbnRpdHlOYW1lXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9hdWRpdC9lbnRpdHktcmV2aXNpb25zLyddKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBjcmVhdGVUYWJsZXZpZXdEZXNjcmlwdG9yKCkge1xuICAgICAgICBpZiAoIXRoaXMucmV2TW9kZWwgfHwgIXRoaXMuc2VsZWN0ZWRSZXZpc2lvbkVudGl0eT8uZW50aXR5TmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1uZ0Vycm9ySW50ZXJuYWwoJ05vIHJldmlzaW9uIG1vZGVsIG9yIHJldmlzaW9uIGVudGl0eSBpcyBwcm92aWRlZCBmb3IgdGFibGV2aWV3LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVzYyA9IG5ldyBUYWJsZXZpZXdEZXNjcmlwdG9yKE1uZ1JldkVudGl0eVdpdGhJZCwgJ21lcmdlZElkJywgdW5kZWZpbmVkLCB0aGlzLnNlbGVjdGVkUmV2aXNpb25FbnRpdHkuZW50aXR5TmFtZSk7XG5cbiAgICAgICAgQXVkaXRVdGlsLmJ1aWxkRGVzY3JpcHRvckZvckVudGl0eVJldmlzaW9uKGRlc2MsIHRoaXMucmV2TW9kZWwsIHRoaXMuc2VsZWN0ZWRSZXZpc2lvbkVudGl0eSk7XG5cbiAgICAgICAgZGVzYy50YWJsZS53aXRoQ29sdW1uc1Jlc2l6YWJsZSgpO1xuICAgICAgICBkZXNjLnRhYmxlLndpdGhDdXJyZW50Q29sdW1uc1Jlb3JkZXJhYmxlKCk7XG4gICAgICAgIGRlc2MudGFibGUud2l0aEN1cnJlbnRDb2x1bW5zVG9nZ2xlYWJsZSgpO1xuICAgICAgICBkZXNjLnRhYmxlLndpdGhEYXRhS2V5KGBFbnRpdHlSZXZpc2lvbnNQYWdlXyR7dGhpcy5zZWxlY3RlZFJldmlzaW9uRW50aXR5LmVudGl0eU5hbWV9YCk7XG5cbiAgICAgICAgcmV0dXJuIGRlc2M7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNyZWF0ZVRhYmxldmlld0RhdGFQcm92aWRlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJldk1vZGVsIHx8ICF0aGlzLnNlbGVjdGVkUmV2aXNpb25FbnRpdHk/LmVudGl0eU5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBNbmdFcnJvckludGVybmFsKCdObyByZXZpc2lvbiBtb2RlbCBvciByZXZpc2lvbiBlbnRpdHkgaXMgcHJvdmlkZWQgZm9yIHRhYmxldmlldy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVudGl0eU5hbWUgPSB0aGlzLnNlbGVjdGVkUmV2aXNpb25FbnRpdHkuZW50aXR5TmFtZTtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZXZpZXdEYXRhUHJvdmlkZXIoTW5nUmV2RW50aXR5V2l0aElkKS53aXRoR2V0QWxsKHFwID0+XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmV2aXNpb25FbnRpdHk/LmVudGl0eU5hbWVcbiAgICAgICAgICAgICAgICA/IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmV2aXNpc29uc0FwaVNlcnZpY2UuY291bnRSZXZpc2lvbnNXaXRoU3RhdGVGb3JFbnRpdHlUeXBlKHFwLCBlbnRpdHlOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJldmlzaXNvbnNBcGlTZXJ2aWNlLmxpc3RSZXZpc2lvbnNXaXRoU3RhdGVGb3JFbnRpdHlUeXBlKHFwLCBlbnRpdHlOYW1lKVxuICAgICAgICAgICAgICAgICAgXSkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICBtYXAoKFtjb3VudCwgdmFsdWVzXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXZFbnRpdHlXaXRoU3RhdGVBbmRJZExpc3QgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCByZXZFbnRpdHlXaXRoU3RhdGUgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXZFbnRpdHlXaXRoU3RhdGVBbmRJZCA9IG5ldyBNbmdSZXZFbnRpdHlXaXRoSWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldkVudGl0eVdpdGhTdGF0ZUFuZElkLm1lcmdlZElkID0gcmV2RW50aXR5V2l0aFN0YXRlLnJldkVudGl0eT8uWydyZXYnXSArICdfJyArIHJldkVudGl0eVdpdGhTdGF0ZS5lbnRpdHlTdGF0ZT8uWydpZCddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2RW50aXR5V2l0aFN0YXRlQW5kSWQucmV2VHlwZSA9IHJldkVudGl0eVdpdGhTdGF0ZS5yZXZUeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2RW50aXR5V2l0aFN0YXRlQW5kSWQucmV2RW50aXR5ID0gcmV2RW50aXR5V2l0aFN0YXRlLnJldkVudGl0eTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldkVudGl0eVdpdGhTdGF0ZUFuZElkLmVudGl0eVN0YXRlID0gcmV2RW50aXR5V2l0aFN0YXRlLmVudGl0eVN0YXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2RW50aXR5V2l0aFN0YXRlQW5kSWQuZW50aXR5Q2xhc3NOYW1lID0gcmV2RW50aXR5V2l0aFN0YXRlLmVudGl0eUNsYXNzTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldkVudGl0eVdpdGhTdGF0ZUFuZElkTGlzdC5wdXNoKHJldkVudGl0eVdpdGhTdGF0ZUFuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWVkaXVzUXVlcnlSZXN1bHQuZnJvbUFycmF5KHJldkVudGl0eVdpdGhTdGF0ZUFuZElkTGlzdCwgY291bnQpO1xuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiB0aHJvd0Vycm9yKCgpID0+IG5ldyBNbmdFcnJvckludGVybmFsKCdObyByZXZpc2lvbiBlbnRpdHkgaXMgcHJvdmlkZWQgZm9yIGxpc3QuJykpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGNyZWF0ZUFjdGlvbkRlc2NyaXB0b3JzKCk6IEFycmF5PEFjdGlvbkRlc2NyaXB0b3I8TW5nUmV2RW50aXR5V2l0aElkPj4ge1xuICAgICAgICBpZiAoIXRoaXMucmV2TW9kZWwgfHwgIXRoaXMuc2VsZWN0ZWRSZXZpc2lvbkVudGl0eT8uZW50aXR5TmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1uZ0Vycm9ySW50ZXJuYWwoJ05vIHJldmlzaW9uIG1vZGVsIG9yIHJldmlzaW9uIGVudGl0eSBpcyBwcm92aWRlZCBmb3IgdGFibGV2aWV3LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW50aXR5TmFtZSA9IHRoaXMuc2VsZWN0ZWRSZXZpc2lvbkVudGl0eS5lbnRpdHlOYW1lO1xuICAgICAgICBjb25zdCBkZXRhaWxzQWN0aW9uID0gbmV3IEFjdGlvbkVkaXRvckRlc2NyaXB0b3IodGhpcy5kZXNjcmlwdG9yLmRldGFpbHNFZGl0b3IsICdlbnRpdHktcmV2aXNpb24tZGV0YWlscycpXG4gICAgICAgICAgICAud2l0aFBvc2l0aW9uKEFjdGlvblBvc2l0aW9uRW51bS5Sb3dDbGljaylcbiAgICAgICAgICAgIC53aXRoUm91dGVUcmlnZ2VyKCc6aXRlbUlkJylcbiAgICAgICAgICAgIC53aXRoRmV0Y2hGdW5jdGlvbihBY3Rpb25EYXRhUHJvdmlkZXJVdGlsLnJ1bkZldGNoT3JGYWlsKVxuICAgICAgICAgICAgLndpdGhUYWJsZXZpZXdDYXRlZ29yeShUYWJsZXZpZXdBY3Rpb25EZWZhdWx0Q2F0ZWdvcmllcy5ERVRBSUxTKVxuICAgICAgICAgICAgLndpdGhGZXRjaEZ1bmN0aW9uKGN0eCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnRpdHlOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBNbmdFcnJvckludGVybmFsKCdObyByZXZpc2lvbiBlbnRpdHkgaXMgcHJvdmlkZWQgZm9yIGRldGFpbHMuJykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWN0eC5wYXJhbWV0ZXJzLml0ZW1JZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgTW5nRXJyb3JJbnRlcm5hbCgnTm8gaXRlbSBpZCBmb3IgcmV2aXNpb24gZW50aXR5IGRldGFpbHMgaXMgcHJvdmlkZWQuJykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXZJZCA9IGN0eC5wYXJhbWV0ZXJzLml0ZW1JZC50b1N0cmluZygpLnNwbGl0KCdfJylbMF07XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUlkID0gY3R4LnBhcmFtZXRlcnMuaXRlbUlkLnRvU3RyaW5nKCkuc3BsaXQoJ18nKVsxXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXZpc2lzb25zQXBpU2VydmljZS5mZXRjaFJldmlzaW9uc1dpdGhTdGF0ZUZvckVudGl0eVR5cGUoZW50aXR5TmFtZSwgcmV2SWQsIGl0ZW1JZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgZGV0YWlsc0FjdGlvbi53aXRoRWRpdG9yQWN0aW9ucyhbbmV3IEFjdGlvbkVkaXRvclN1Ym1pdERlc2NyaXB0b3IoZGV0YWlsc0FjdGlvbiwgQWN0aW9uRWRpdG9yU3VibWl0VHlwZUVudW0uQ2FuY2VsKV0pO1xuICAgICAgICByZXR1cm4gW2RldGFpbHNBY3Rpb25dO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjYXJkXCI+XG4gICAgPGRpdiBjbGFzcz1cImZpZWxkIG1iLTBcIj5cbiAgICAgICAgPG1uZy1kcm9wZG93blxuICAgICAgICAgICAgaWQ9XCJyZXZpc2lvbkVudGl0eURyb3Bkb3duXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCIncGFnZXMuZW50aXR5UmV2aXNpb25zLmRyb3Bkb3duLnBsYWNlaG9sZGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbaXRlbXNMYWJlbFByb3BlcnR5XT1cIidlbnRpdHlOYW1lJ1wiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkUmV2aXNpb25FbnRpdHlcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uUmV2aXNpb25FbnRpdHlDaGFuZ2UoKVwiXG4gICAgICAgICAgICBbZGF0YVByb3ZpZGVyXT1cInJldmlzaW9uRW50aXRpZXNMb29rdXBQcm92aWRlclwiPjwvbW5nLWRyb3Bkb3duPlxuICAgICAgICA8c21hbGwgKm5nSWY9XCIhc2VsZWN0ZWRSZXZpc2lvbkVudGl0eVwiIGNsYXNzPVwiYmxvY2tcIj5cbiAgICAgICAgICAgIHt7ICdwYWdlcy5lbnRpdHlSZXZpc2lvbnMuZHJvcGRvd24uaGVscFRleHQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvc21hbGw+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgKm5nSWY9XCJzaG93VGFibGV2aWV3KClcIj5cbiAgICA8bW5nLXRhYmxldmlldy1yb3V0ZSBbZGVzY3JpcHRvcl09XCJkZXNjcmlwdG9yXCIgW2RhdGFQcm92aWRlcl09XCJkYXRhUHJvdmlkZXJcIiBbYWN0aW9uc109XCJhY3Rpb25zXCI+PC9tbmctdGFibGV2aWV3LXJvdXRlPlxuPC9kaXY+XG4iXX0=