@dangl/angular-ava 0.1.1-beta0093
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.
- package/README.md +1 -0
- package/esm2022/dangl-angular-ava.mjs +5 -0
- package/esm2022/lib/angular-ava.module.mjs +91 -0
- package/esm2022/lib/ava-tree/tree/components/ava-tree/ava-tree.component.mjs +412 -0
- package/esm2022/lib/ava-tree/tree/components/list-structure/list-structure.component.mjs +41 -0
- package/esm2022/lib/ava-tree/tree/components/table-structure/table-structure.component.mjs +110 -0
- package/esm2022/lib/ava-tree/tree/components/tree-item/tree-item.component.mjs +102 -0
- package/esm2022/lib/ava-tree/tree/components/tree-node/tree-node.component.mjs +53 -0
- package/esm2022/lib/ava-tree/tree/components/tree-structure/tree-structure.component.mjs +33 -0
- package/esm2022/lib/ava-tree/tree/constants/defaultFilters.mjs +23 -0
- package/esm2022/lib/ava-tree/tree/constants/defaultTextWords.mjs +11 -0
- package/esm2022/lib/ava-tree/tree/constants/defaults.mjs +4 -0
- package/esm2022/lib/ava-tree/tree/constants/index.mjs +5 -0
- package/esm2022/lib/ava-tree/tree/directives/save-changing-view.directive.mjs +47 -0
- package/esm2022/lib/ava-tree/tree/model/ava-models.mjs +199 -0
- package/esm2022/lib/ava-tree/tree/model/context-menu-data.model.mjs +2 -0
- package/esm2022/lib/ava-tree/tree/model/function-view-line.model.mjs +2 -0
- package/esm2022/lib/ava-tree/tree/model/index.mjs +4 -0
- package/esm2022/lib/ava-tree/tree/model/selecting.model.mjs +2 -0
- package/esm2022/lib/ava-tree/tree/model/tableColumnType.mjs +2 -0
- package/esm2022/lib/ava-tree/tree/model/tree-mode.model.mjs +7 -0
- package/esm2022/lib/ava-tree/tree/pipes/element-icon-name.pipe.mjs +27 -0
- package/esm2022/lib/ava-tree/tree/pipes/element-item-number.pipe.mjs +23 -0
- package/esm2022/lib/ava-tree/tree/pipes/element-text.pipe.mjs +27 -0
- package/esm2022/lib/ava-tree/tree/pipes/group-child-elements.pipe.mjs +20 -0
- package/esm2022/lib/ava-tree/tree/services/expand-parent-group.service.mjs +32 -0
- package/esm2022/lib/ava-tree/tree/services/flat-elements.service.mjs +96 -0
- package/esm2022/lib/ava-tree/tree/services/keyboard-operation.service.mjs +116 -0
- package/esm2022/lib/ava-tree/tree/services/select-element.service.mjs +41 -0
- package/esm2022/lib/ava-tree/tree/services/tree-node-selection.service.mjs +133 -0
- package/esm2022/lib/version.mjs +10 -0
- package/esm2022/public-api.mjs +8 -0
- package/fesm2022/dangl-angular-ava.mjs +1574 -0
- package/fesm2022/dangl-angular-ava.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/angular-ava.module.d.ts +27 -0
- package/lib/ava-tree/tree/components/ava-tree/ava-tree.component.d.ts +165 -0
- package/lib/ava-tree/tree/components/list-structure/list-structure.component.d.ts +18 -0
- package/lib/ava-tree/tree/components/table-structure/table-structure.component.d.ts +34 -0
- package/lib/ava-tree/tree/components/tree-item/tree-item.component.d.ts +35 -0
- package/lib/ava-tree/tree/components/tree-node/tree-node.component.d.ts +23 -0
- package/lib/ava-tree/tree/components/tree-structure/tree-structure.component.d.ts +14 -0
- package/lib/ava-tree/tree/constants/defaultFilters.d.ts +2 -0
- package/lib/ava-tree/tree/constants/defaultTextWords.d.ts +11 -0
- package/lib/ava-tree/tree/constants/defaults.d.ts +3 -0
- package/lib/ava-tree/tree/constants/index.d.ts +4 -0
- package/lib/ava-tree/tree/directives/save-changing-view.directive.d.ts +13 -0
- package/lib/ava-tree/tree/model/ava-models.d.ts +1041 -0
- package/lib/ava-tree/tree/model/context-menu-data.model.d.ts +8 -0
- package/lib/ava-tree/tree/model/function-view-line.model.d.ts +12 -0
- package/lib/ava-tree/tree/model/index.d.ts +7 -0
- package/lib/ava-tree/tree/model/selecting.model.d.ts +14 -0
- package/lib/ava-tree/tree/model/tableColumnType.d.ts +6 -0
- package/lib/ava-tree/tree/model/tree-mode.model.d.ts +5 -0
- package/lib/ava-tree/tree/pipes/element-icon-name.pipe.d.ts +8 -0
- package/lib/ava-tree/tree/pipes/element-item-number.pipe.d.ts +8 -0
- package/lib/ava-tree/tree/pipes/element-text.pipe.d.ts +8 -0
- package/lib/ava-tree/tree/pipes/group-child-elements.pipe.d.ts +8 -0
- package/lib/ava-tree/tree/services/expand-parent-group.service.d.ts +7 -0
- package/lib/ava-tree/tree/services/flat-elements.service.d.ts +28 -0
- package/lib/ava-tree/tree/services/keyboard-operation.service.d.ts +35 -0
- package/lib/ava-tree/tree/services/select-element.service.d.ts +31 -0
- package/lib/ava-tree/tree/services/tree-node-selection.service.d.ts +23 -0
- package/lib/version.d.ts +8 -0
- package/package.json +31 -0
- package/public-api.d.ts +4 -0
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Dangl.AngularAva
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFuZ2wtYW5ndWxhci1hdmEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWF2YS9zcmMvZGFuZ2wtYW5ndWxhci1hdmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { NgModule } from '@angular/core';
|
|
3
|
+
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
4
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
5
|
+
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
6
|
+
import { MatRippleModule } from '@angular/material/core';
|
|
7
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
8
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
9
|
+
import { MatInputModule } from '@angular/material/input';
|
|
10
|
+
import { MatTableModule } from '@angular/material/table';
|
|
11
|
+
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
12
|
+
import { AvaTreeComponent } from './ava-tree/tree/components/ava-tree/ava-tree.component';
|
|
13
|
+
import { ListStructureComponent } from './ava-tree/tree/components/list-structure/list-structure.component';
|
|
14
|
+
import { TableStructureComponent } from './ava-tree/tree/components/table-structure/table-structure.component';
|
|
15
|
+
import { TreeItemComponent } from './ava-tree/tree/components/tree-item/tree-item.component';
|
|
16
|
+
import { TreeNodeComponent } from './ava-tree/tree/components/tree-node/tree-node.component';
|
|
17
|
+
import { TreeStructureComponent } from './ava-tree/tree/components/tree-structure/tree-structure.component';
|
|
18
|
+
import { SaveChangingViewDirective } from './ava-tree/tree/directives/save-changing-view.directive';
|
|
19
|
+
import { ElementIconNamePipe } from './ava-tree/tree/pipes/element-icon-name.pipe';
|
|
20
|
+
import { ElementItemNumberPipe } from './ava-tree/tree/pipes/element-item-number.pipe';
|
|
21
|
+
import { ElementTextPipe } from './ava-tree/tree/pipes/element-text.pipe';
|
|
22
|
+
import { GroupChildElementsPipe } from './ava-tree/tree/pipes/group-child-elements.pipe';
|
|
23
|
+
import * as i0 from "@angular/core";
|
|
24
|
+
export class AngularAvaModule {
|
|
25
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: AngularAvaModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
26
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.2.1", ngImport: i0, type: AngularAvaModule, declarations: [TreeStructureComponent,
|
|
27
|
+
TreeNodeComponent,
|
|
28
|
+
AvaTreeComponent,
|
|
29
|
+
TreeItemComponent,
|
|
30
|
+
ListStructureComponent,
|
|
31
|
+
TableStructureComponent,
|
|
32
|
+
ElementIconNamePipe,
|
|
33
|
+
ElementTextPipe,
|
|
34
|
+
GroupChildElementsPipe,
|
|
35
|
+
ElementItemNumberPipe,
|
|
36
|
+
SaveChangingViewDirective], imports: [CommonModule,
|
|
37
|
+
MatIconModule,
|
|
38
|
+
MatRippleModule,
|
|
39
|
+
MatInputModule,
|
|
40
|
+
MatFormFieldModule,
|
|
41
|
+
ReactiveFormsModule,
|
|
42
|
+
FormsModule,
|
|
43
|
+
MatButtonModule,
|
|
44
|
+
MatCheckboxModule,
|
|
45
|
+
MatTableModule,
|
|
46
|
+
MatTooltipModule], exports: [AvaTreeComponent] }); }
|
|
47
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: AngularAvaModule, imports: [CommonModule,
|
|
48
|
+
MatIconModule,
|
|
49
|
+
MatRippleModule,
|
|
50
|
+
MatInputModule,
|
|
51
|
+
MatFormFieldModule,
|
|
52
|
+
ReactiveFormsModule,
|
|
53
|
+
FormsModule,
|
|
54
|
+
MatButtonModule,
|
|
55
|
+
MatCheckboxModule,
|
|
56
|
+
MatTableModule,
|
|
57
|
+
MatTooltipModule] }); }
|
|
58
|
+
}
|
|
59
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: AngularAvaModule, decorators: [{
|
|
60
|
+
type: NgModule,
|
|
61
|
+
args: [{
|
|
62
|
+
declarations: [
|
|
63
|
+
TreeStructureComponent,
|
|
64
|
+
TreeNodeComponent,
|
|
65
|
+
AvaTreeComponent,
|
|
66
|
+
TreeItemComponent,
|
|
67
|
+
ListStructureComponent,
|
|
68
|
+
TableStructureComponent,
|
|
69
|
+
ElementIconNamePipe,
|
|
70
|
+
ElementTextPipe,
|
|
71
|
+
GroupChildElementsPipe,
|
|
72
|
+
ElementItemNumberPipe,
|
|
73
|
+
SaveChangingViewDirective
|
|
74
|
+
],
|
|
75
|
+
imports: [
|
|
76
|
+
CommonModule,
|
|
77
|
+
MatIconModule,
|
|
78
|
+
MatRippleModule,
|
|
79
|
+
MatInputModule,
|
|
80
|
+
MatFormFieldModule,
|
|
81
|
+
ReactiveFormsModule,
|
|
82
|
+
FormsModule,
|
|
83
|
+
MatButtonModule,
|
|
84
|
+
MatCheckboxModule,
|
|
85
|
+
MatTableModule,
|
|
86
|
+
MatTooltipModule
|
|
87
|
+
],
|
|
88
|
+
exports: [AvaTreeComponent]
|
|
89
|
+
}]
|
|
90
|
+
}] });
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1hdmEubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1hdmEvc3JjL2xpYi9hbmd1bGFyLWF2YS5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFDMUYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0VBQW9FLENBQUM7QUFDNUcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0VBQXNFLENBQUM7QUFDL0csT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMERBQTBELENBQUM7QUFDN0YsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMERBQTBELENBQUM7QUFDN0YsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0VBQW9FLENBQUM7QUFDNUcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0seURBQXlELENBQUM7QUFDcEcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDbkYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDdkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDOztBQStCekYsTUFBTSxPQUFPLGdCQUFnQjs4R0FBaEIsZ0JBQWdCOytHQUFoQixnQkFBZ0IsaUJBM0J6QixzQkFBc0I7WUFDdEIsaUJBQWlCO1lBQ2pCLGdCQUFnQjtZQUNoQixpQkFBaUI7WUFDakIsc0JBQXNCO1lBQ3RCLHVCQUF1QjtZQUN2QixtQkFBbUI7WUFDbkIsZUFBZTtZQUNmLHNCQUFzQjtZQUN0QixxQkFBcUI7WUFDckIseUJBQXlCLGFBR3pCLFlBQVk7WUFDWixhQUFhO1lBQ2IsZUFBZTtZQUNmLGNBQWM7WUFDZCxrQkFBa0I7WUFDbEIsbUJBQW1CO1lBQ25CLFdBQVc7WUFDWCxlQUFlO1lBQ2YsaUJBQWlCO1lBQ2pCLGNBQWM7WUFDZCxnQkFBZ0IsYUFFUixnQkFBZ0I7K0dBRWYsZ0JBQWdCLFlBZHpCLFlBQVk7WUFDWixhQUFhO1lBQ2IsZUFBZTtZQUNmLGNBQWM7WUFDZCxrQkFBa0I7WUFDbEIsbUJBQW1CO1lBQ25CLFdBQVc7WUFDWCxlQUFlO1lBQ2YsaUJBQWlCO1lBQ2pCLGNBQWM7WUFDZCxnQkFBZ0I7OzJGQUlQLGdCQUFnQjtrQkE3QjVCLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFO3dCQUNaLHNCQUFzQjt3QkFDdEIsaUJBQWlCO3dCQUNqQixnQkFBZ0I7d0JBQ2hCLGlCQUFpQjt3QkFDakIsc0JBQXNCO3dCQUN0Qix1QkFBdUI7d0JBQ3ZCLG1CQUFtQjt3QkFDbkIsZUFBZTt3QkFDZixzQkFBc0I7d0JBQ3RCLHFCQUFxQjt3QkFDckIseUJBQXlCO3FCQUMxQjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixhQUFhO3dCQUNiLGVBQWU7d0JBQ2YsY0FBYzt3QkFDZCxrQkFBa0I7d0JBQ2xCLG1CQUFtQjt3QkFDbkIsV0FBVzt3QkFDWCxlQUFlO3dCQUNmLGlCQUFpQjt3QkFDakIsY0FBYzt3QkFDZCxnQkFBZ0I7cUJBQ2pCO29CQUNELE9BQU8sRUFBRSxDQUFDLGdCQUFnQixDQUFDO2lCQUM1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBNYXRSaXBwbGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRUYWJsZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgQXZhVHJlZUNvbXBvbmVudCB9IGZyb20gJy4vYXZhLXRyZWUvdHJlZS9jb21wb25lbnRzL2F2YS10cmVlL2F2YS10cmVlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMaXN0U3RydWN0dXJlQ29tcG9uZW50IH0gZnJvbSAnLi9hdmEtdHJlZS90cmVlL2NvbXBvbmVudHMvbGlzdC1zdHJ1Y3R1cmUvbGlzdC1zdHJ1Y3R1cmUuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYmxlU3RydWN0dXJlQ29tcG9uZW50IH0gZnJvbSAnLi9hdmEtdHJlZS90cmVlL2NvbXBvbmVudHMvdGFibGUtc3RydWN0dXJlL3RhYmxlLXN0cnVjdHVyZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVHJlZUl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2F2YS10cmVlL3RyZWUvY29tcG9uZW50cy90cmVlLWl0ZW0vdHJlZS1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUcmVlTm9kZUNvbXBvbmVudCB9IGZyb20gJy4vYXZhLXRyZWUvdHJlZS9jb21wb25lbnRzL3RyZWUtbm9kZS90cmVlLW5vZGUuY29tcG9uZW50JztcbmltcG9ydCB7IFRyZWVTdHJ1Y3R1cmVDb21wb25lbnQgfSBmcm9tICcuL2F2YS10cmVlL3RyZWUvY29tcG9uZW50cy90cmVlLXN0cnVjdHVyZS90cmVlLXN0cnVjdHVyZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2F2ZUNoYW5naW5nVmlld0RpcmVjdGl2ZSB9IGZyb20gJy4vYXZhLXRyZWUvdHJlZS9kaXJlY3RpdmVzL3NhdmUtY2hhbmdpbmctdmlldy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRWxlbWVudEljb25OYW1lUGlwZSB9IGZyb20gJy4vYXZhLXRyZWUvdHJlZS9waXBlcy9lbGVtZW50LWljb24tbmFtZS5waXBlJztcbmltcG9ydCB7IEVsZW1lbnRJdGVtTnVtYmVyUGlwZSB9IGZyb20gJy4vYXZhLXRyZWUvdHJlZS9waXBlcy9lbGVtZW50LWl0ZW0tbnVtYmVyLnBpcGUnO1xuaW1wb3J0IHsgRWxlbWVudFRleHRQaXBlIH0gZnJvbSAnLi9hdmEtdHJlZS90cmVlL3BpcGVzL2VsZW1lbnQtdGV4dC5waXBlJztcbmltcG9ydCB7IEdyb3VwQ2hpbGRFbGVtZW50c1BpcGUgfSBmcm9tICcuL2F2YS10cmVlL3RyZWUvcGlwZXMvZ3JvdXAtY2hpbGQtZWxlbWVudHMucGlwZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1xuICAgIFRyZWVTdHJ1Y3R1cmVDb21wb25lbnQsXG4gICAgVHJlZU5vZGVDb21wb25lbnQsXG4gICAgQXZhVHJlZUNvbXBvbmVudCxcbiAgICBUcmVlSXRlbUNvbXBvbmVudCxcbiAgICBMaXN0U3RydWN0dXJlQ29tcG9uZW50LFxuICAgIFRhYmxlU3RydWN0dXJlQ29tcG9uZW50LFxuICAgIEVsZW1lbnRJY29uTmFtZVBpcGUsXG4gICAgRWxlbWVudFRleHRQaXBlLFxuICAgIEdyb3VwQ2hpbGRFbGVtZW50c1BpcGUsXG4gICAgRWxlbWVudEl0ZW1OdW1iZXJQaXBlLFxuICAgIFNhdmVDaGFuZ2luZ1ZpZXdEaXJlY3RpdmVcbiAgXSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdFJpcHBsZU1vZHVsZSxcbiAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0Q2hlY2tib3hNb2R1bGUsXG4gICAgTWF0VGFibGVNb2R1bGUsXG4gICAgTWF0VG9vbHRpcE1vZHVsZVxuICBdLFxuICBleHBvcnRzOiBbQXZhVHJlZUNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgQW5ndWxhckF2YU1vZHVsZSB7fVxuIl19
|
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, Self, ViewChild } from '@angular/core';
|
|
2
|
+
import { ReplaySubject, Subject, debounceTime, filter, fromEvent, takeUntil } from 'rxjs';
|
|
3
|
+
import { DEFAULT_FILTERS, DEFAULT_TEXT_WORDS } from '../../constants';
|
|
4
|
+
import { ModeViewType } from '../../model';
|
|
5
|
+
import { ExpandParentGroupService } from '../../services/expand-parent-group.service';
|
|
6
|
+
import { FlatElementsService } from '../../services/flat-elements.service';
|
|
7
|
+
import { KeyboardOperationService, KeyboardOperationType } from '../../services/keyboard-operation.service';
|
|
8
|
+
import { SelectElementService } from '../../services/select-element.service';
|
|
9
|
+
import { TreeNodeSelectionService } from '../../services/tree-node-selection.service';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "../../services/flat-elements.service";
|
|
12
|
+
import * as i2 from "../../services/select-element.service";
|
|
13
|
+
import * as i3 from "../../services/tree-node-selection.service";
|
|
14
|
+
import * as i4 from "../../services/expand-parent-group.service";
|
|
15
|
+
import * as i5 from "../../services/keyboard-operation.service";
|
|
16
|
+
import * as i6 from "@angular/common";
|
|
17
|
+
import * as i7 from "@angular/material/icon";
|
|
18
|
+
import * as i8 from "@angular/material/input";
|
|
19
|
+
import * as i9 from "@angular/material/form-field";
|
|
20
|
+
import * as i10 from "@angular/forms";
|
|
21
|
+
import * as i11 from "@angular/material/button";
|
|
22
|
+
import * as i12 from "@angular/material/tooltip";
|
|
23
|
+
import * as i13 from "../tree-structure/tree-structure.component";
|
|
24
|
+
import * as i14 from "../list-structure/list-structure.component";
|
|
25
|
+
import * as i15 from "../table-structure/table-structure.component";
|
|
26
|
+
export class AvaTreeComponent {
|
|
27
|
+
/**
|
|
28
|
+
* You can supply a map of strings to be used for the text in the tree. This allows you to translate
|
|
29
|
+
* the text in the tree to other languages.
|
|
30
|
+
* {
|
|
31
|
+
* textSearch: string,
|
|
32
|
+
* textNothing: string,
|
|
33
|
+
* textNothingFiltered: string,
|
|
34
|
+
* textAll: string,
|
|
35
|
+
* tooltipAllOpen: string,
|
|
36
|
+
* tooltipAllClose: string,
|
|
37
|
+
* tooltipAllAdd:string,
|
|
38
|
+
* tooltipAllRemove: string,
|
|
39
|
+
* }
|
|
40
|
+
*/
|
|
41
|
+
set textWords(words) {
|
|
42
|
+
this._textWords = { ...this.textWords, ...words };
|
|
43
|
+
} // allow to translate all texts to other language
|
|
44
|
+
get textWords() {
|
|
45
|
+
return this._textWords;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* With this parameter, you can configure which keys will be listenend to to switch the tree elements,
|
|
49
|
+
* and also to disable the functionality of the keys */
|
|
50
|
+
set customKeyboardOperationConfig(config) {
|
|
51
|
+
this.keyboardOperationService.mergeConfigOperation(config);
|
|
52
|
+
}
|
|
53
|
+
constructor(flatElementsService, selectElementService, treeNodeSelectionService, expandParentGroupService, keyboardOperationService, ngZone) {
|
|
54
|
+
this.flatElementsService = flatElementsService;
|
|
55
|
+
this.selectElementService = selectElementService;
|
|
56
|
+
this.treeNodeSelectionService = treeNodeSelectionService;
|
|
57
|
+
this.expandParentGroupService = expandParentGroupService;
|
|
58
|
+
this.keyboardOperationService = keyboardOperationService;
|
|
59
|
+
this.ngZone = ngZone;
|
|
60
|
+
/**
|
|
61
|
+
* This is the main data element for the tree structure. You should supply a ProjectDto with
|
|
62
|
+
* exactly one service specification in it.
|
|
63
|
+
*/
|
|
64
|
+
this.project = null;
|
|
65
|
+
/**
|
|
66
|
+
* Optionally, you can supply a map of expansion states for the tree. The keys should be the
|
|
67
|
+
* id properties of the elements in the tree, and the values should be true if the element is
|
|
68
|
+
* expanded, and false if it is collapsed.
|
|
69
|
+
*/
|
|
70
|
+
this.expansionState = {};
|
|
71
|
+
/**
|
|
72
|
+
* Optionally, you can supply the id of the node that should be selected in the tree initially.
|
|
73
|
+
*/
|
|
74
|
+
this.selectedNodeId = null;
|
|
75
|
+
/**
|
|
76
|
+
* Optional, defaults to 20px. If this is set, then the tree will be indented by the given value each level.
|
|
77
|
+
* This can be any valid CSS value for the padding-left property, such as 20px, 1em, or 5%.
|
|
78
|
+
*
|
|
79
|
+
*/
|
|
80
|
+
this.indent = '20px';
|
|
81
|
+
/**
|
|
82
|
+
* Optional, you can supply a color to be used as the background color for the selected line. Defaults to the primary
|
|
83
|
+
* color from the Material theme, which is #00acc1.
|
|
84
|
+
*/
|
|
85
|
+
this.selectedColor = null;
|
|
86
|
+
/**
|
|
87
|
+
* You can specify which view type to use for the tree. The default is ModeViewType.Tree, but you can also use
|
|
88
|
+
* ModeViewType.List or ModeViewType.Table.
|
|
89
|
+
*/
|
|
90
|
+
this.modeView = ModeViewType.Tree;
|
|
91
|
+
/** Optional, defaults to true. If this is disabled, then the double click event for elements is not raised,
|
|
92
|
+
* and clicking on an elemt sends an immediate result since the component has not to wait and check if a double click event
|
|
93
|
+
* is fired.
|
|
94
|
+
*/
|
|
95
|
+
this.allowDblClick = true;
|
|
96
|
+
/**
|
|
97
|
+
* If this is set to true, then the tree will be in selection mode, and the user can select elements
|
|
98
|
+
* by clicking on them. The selected elements will be emitted in the selectedElementsChanged event.
|
|
99
|
+
*/
|
|
100
|
+
this.isSelectionMode = false;
|
|
101
|
+
/**
|
|
102
|
+
* You can optionally supply a list of elements that should be selected initially. This is only used if
|
|
103
|
+
* isSelectionMode is true.
|
|
104
|
+
*/
|
|
105
|
+
this.initiallySelectedElements = null;
|
|
106
|
+
this._textWords = null;
|
|
107
|
+
/**
|
|
108
|
+
* Defaults to true. If this is enabled, then navigating in the tree with the keyboard only works
|
|
109
|
+
* if the mouse is over the tree area. This limitation is useful if you have multiple trees or other components
|
|
110
|
+
* that might be using keyboard input.
|
|
111
|
+
*/
|
|
112
|
+
this.mouseAwareKeyboardControl = true;
|
|
113
|
+
/**
|
|
114
|
+
* You can supply custom filters that are processed when the filter input is changed. Default filters are used
|
|
115
|
+
* that check for short text and item number matches, and you can either add custom filters or replace the default ones.
|
|
116
|
+
*/
|
|
117
|
+
this.listFilterFunc = DEFAULT_FILTERS;
|
|
118
|
+
/**
|
|
119
|
+
* Optional. For table views, this allows you to add custom columns to the table.
|
|
120
|
+
* addTableColumns: Array of objects
|
|
121
|
+
* {
|
|
122
|
+
* name: string, // name of column
|
|
123
|
+
* title: string, // showed title of column
|
|
124
|
+
* align?: string, // optional alight: left(default) / center / right
|
|
125
|
+
* numberFormat?: string // optional format of number value, example: '1.2-2'
|
|
126
|
+
* }
|
|
127
|
+
*/
|
|
128
|
+
this.addTableColumns = [];
|
|
129
|
+
/**
|
|
130
|
+
* This allows you to supply a list of functions that can be used to change the appearance of elements.
|
|
131
|
+
* They objects contain a predicate function that is evaluated, along with an option to configure the
|
|
132
|
+
* appearance of the element.
|
|
133
|
+
* functionView: Array of objects
|
|
134
|
+
* {
|
|
135
|
+
* name: string, // name of view part: you can add/remove it when it need
|
|
136
|
+
* func: (element: any, result?: any) => boolean, // this filter function calculate condition to change view
|
|
137
|
+
* view: {
|
|
138
|
+
* iconName?: string, // changed name of icon
|
|
139
|
+
* iconColor?: string, // changed color of icon
|
|
140
|
+
* textBold?: string, // changed weight of text
|
|
141
|
+
* textColor?: string // changed color of text
|
|
142
|
+
* }
|
|
143
|
+
* }
|
|
144
|
+
*/
|
|
145
|
+
this.functionView = null;
|
|
146
|
+
this.selectClick = new EventEmitter(); // event after element selected by click
|
|
147
|
+
this.selectDblClick = new EventEmitter(); // event after element selected by double click
|
|
148
|
+
this.contextMenuEvent = new EventEmitter(); // event after element call context menu by right button click
|
|
149
|
+
this.selectedElementsChanged = new EventEmitter(); // event after changed selecting in selecting mode
|
|
150
|
+
this.selectedElement = null;
|
|
151
|
+
this.isListenKeyboard = false;
|
|
152
|
+
this.isEmiteSelectedElements = false;
|
|
153
|
+
this.selectingElementsTreeData = [];
|
|
154
|
+
this.flatElements = null;
|
|
155
|
+
this.preselectedElement = null;
|
|
156
|
+
this.filterInput = '';
|
|
157
|
+
this.listModeViewType = ModeViewType;
|
|
158
|
+
this.filter = '';
|
|
159
|
+
this.$filter = new ReplaySubject(1);
|
|
160
|
+
this.filteredElementList = [];
|
|
161
|
+
this.$destroy = new Subject();
|
|
162
|
+
this._textWords = { ...DEFAULT_TEXT_WORDS };
|
|
163
|
+
}
|
|
164
|
+
ngOnInit() {
|
|
165
|
+
this.selectElementService.preselectedElement.pipe(takeUntil(this.$destroy)).subscribe((e) => (this.preselectedElement = e));
|
|
166
|
+
this.selectElementService.selectClickElement.pipe(takeUntil(this.$destroy)).subscribe((e) => {
|
|
167
|
+
this.selectedElement = e;
|
|
168
|
+
this.selectClick.emit(e);
|
|
169
|
+
});
|
|
170
|
+
this.selectElementService.selectDblClickElement.pipe(takeUntil(this.$destroy)).subscribe((e) => this.selectDblClick.emit(e));
|
|
171
|
+
this.selectElementService.selectContextMenuElement.pipe(takeUntil(this.$destroy)).subscribe((e) => this.contextMenuEvent.emit(e));
|
|
172
|
+
this.flatElementsService.flatElementsDto.pipe(takeUntil(this.$destroy)).subscribe((e) => {
|
|
173
|
+
this.flatElements = e;
|
|
174
|
+
this.getFilteredList();
|
|
175
|
+
});
|
|
176
|
+
this.$filter.pipe(takeUntil(this.$destroy), debounceTime(250)).subscribe((filter) => {
|
|
177
|
+
this.filter = filter;
|
|
178
|
+
this.getFilteredList();
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
ngAfterViewInit() {
|
|
182
|
+
this.initializeEventListeners();
|
|
183
|
+
}
|
|
184
|
+
ngOnChanges(changes) {
|
|
185
|
+
this.flatElementsService.listFilterFunc = this.listFilterFunc;
|
|
186
|
+
this.flatElementsService.functionView = this.functionView;
|
|
187
|
+
if (changes['project'] && this.project?.serviceSpecifications?.[0]) {
|
|
188
|
+
this.serviceSpecification = this.project.serviceSpecifications[0];
|
|
189
|
+
this.flatElementsService.setElementsDto(this.serviceSpecification);
|
|
190
|
+
if (this.isSelectionMode) {
|
|
191
|
+
this.selectingElementsTreeData = this.treeNodeSelectionService.loadSelectingElements(this.serviceSpecification.elements);
|
|
192
|
+
this.treeNodeSelectionService.treeNodeSelecting.pipe(takeUntil(this.$destroy)).subscribe(() => {
|
|
193
|
+
if (this.isEmiteSelectedElements) {
|
|
194
|
+
setTimeout(() => {
|
|
195
|
+
const selectingTree = this.treeNodeSelectionService.getTreeRoot(this.selectingElementsTreeData);
|
|
196
|
+
this.selectedElementsChanged.emit(selectingTree);
|
|
197
|
+
}, 0);
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if ((changes['selectedNodeId'] && this.project) || changes['project']) {
|
|
203
|
+
this.flatElementsService.getOneElementById(this.selectedNodeId).subscribe((e) => {
|
|
204
|
+
if (e) {
|
|
205
|
+
this.selectElementService.setClickElement(e);
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
if (this.isSelectionMode && (changes['initiallySelectedElements'] || changes['project'])) {
|
|
210
|
+
this.formSelectingList();
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
ngOnDestroy() {
|
|
214
|
+
this.$destroy.next(true);
|
|
215
|
+
this.$destroy.complete();
|
|
216
|
+
}
|
|
217
|
+
mouseOver() {
|
|
218
|
+
if (!this.isListenKeyboard) {
|
|
219
|
+
this.isListenKeyboard = true;
|
|
220
|
+
this.avaTreeFilterInput?.nativeElement.focus();
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
mouseOut() {
|
|
224
|
+
this.isListenKeyboard = false;
|
|
225
|
+
}
|
|
226
|
+
handleGlobalKeyboardEvent(event) {
|
|
227
|
+
this.ngZone.run(() => {
|
|
228
|
+
const keyEvent = event;
|
|
229
|
+
if (!this.mouseAwareKeyboardControl || this.isListenKeyboard) {
|
|
230
|
+
const element = this.preselectedElement || this.selectedElement;
|
|
231
|
+
const { operation, nextElement } = this.keyboardOperationService.handleKeyboardEvent(keyEvent, element) || { nextElement: null };
|
|
232
|
+
switch (operation) {
|
|
233
|
+
case KeyboardOperationType.MoveSelectedPositionUp:
|
|
234
|
+
this.showElement(nextElement, '.select');
|
|
235
|
+
break;
|
|
236
|
+
case KeyboardOperationType.MoveSelectedPositionDown:
|
|
237
|
+
this.showElement(nextElement, '.select');
|
|
238
|
+
break;
|
|
239
|
+
case KeyboardOperationType.MoveChosenPositionDown:
|
|
240
|
+
this.showElement(nextElement, nextElement?.id === this.selectedElement?.id ? '.select' : '.choose');
|
|
241
|
+
break;
|
|
242
|
+
case KeyboardOperationType.MoveChosenPositionUp:
|
|
243
|
+
this.showElement(nextElement, nextElement?.id === this.selectedElement?.id ? '.select' : '.choose');
|
|
244
|
+
break;
|
|
245
|
+
default:
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
showElement(element, nameQuery) {
|
|
252
|
+
if (element) {
|
|
253
|
+
if (this.modeView === ModeViewType.Tree) {
|
|
254
|
+
this.expandParentGroups(element);
|
|
255
|
+
}
|
|
256
|
+
setTimeout(() => this.scrollLine(nameQuery), 0);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
scrollLine(nameQuery) {
|
|
260
|
+
const parentRect = this.avaTreeWrapper?.nativeElement.getBoundingClientRect();
|
|
261
|
+
const showedElement = this.avaTreeWrapper?.nativeElement.querySelector(nameQuery);
|
|
262
|
+
if (!showedElement) {
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
const childRect = showedElement.getBoundingClientRect();
|
|
266
|
+
if (childRect.bottom > parentRect.bottom ||
|
|
267
|
+
childRect.top < parentRect.top ||
|
|
268
|
+
(this.modeView === ModeViewType.Table && childRect.top < parentRect.top + 24)) {
|
|
269
|
+
showedElement?.scrollIntoView();
|
|
270
|
+
this.avaTreeWrapper?.nativeElement.scrollTo({ left: 0 });
|
|
271
|
+
if (this.modeView === ModeViewType.Table) {
|
|
272
|
+
setTimeout(() => this.correctScrollTableLine(showedElement, parentRect), 0);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
correctScrollTableLine(showedElement, parentRect) {
|
|
277
|
+
const childRect = showedElement.getBoundingClientRect();
|
|
278
|
+
if (childRect.top < parentRect.top + 24) {
|
|
279
|
+
this.avaTreeWrapper.nativeElement.scrollTop -= 24;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
expandParentGroups(element) {
|
|
283
|
+
this.expandParentGroupService.expandParentGroups(element, this.flatElements, this.expansionState);
|
|
284
|
+
}
|
|
285
|
+
onFilter(value) {
|
|
286
|
+
this.$filter.next(value);
|
|
287
|
+
}
|
|
288
|
+
changeAllElementsExpansionStatus(isExpanded) {
|
|
289
|
+
if (!isExpanded) {
|
|
290
|
+
Object.keys(this.expansionState).forEach((id) => delete this.expansionState[id]);
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
this.flatElements?.forEach((item) => {
|
|
294
|
+
if (item.elementTypeDiscriminator === 'ServiceSpecificationGroupDto') {
|
|
295
|
+
this.expansionState[item.id] = true;
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
formSelectingList() {
|
|
301
|
+
this.isEmiteSelectedElements = false;
|
|
302
|
+
if (!this.initiallySelectedElements) {
|
|
303
|
+
this.isEmiteSelectedElements = true;
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
this.treeNodeSelectionService.getFlatSelectedListId(this.initiallySelectedElements);
|
|
307
|
+
this.treeNodeSelectionService.flatSelectedListId.forEach((id, index) => {
|
|
308
|
+
this.treeNodeSelectionService.changeSelecting(true, id);
|
|
309
|
+
if (index === this.treeNodeSelectionService.flatSelectedListId.length - 1) {
|
|
310
|
+
this.isEmiteSelectedElements = true;
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
selectOrDeselectAll(value) {
|
|
315
|
+
this.treeNodeSelectionService.changeAll(value);
|
|
316
|
+
}
|
|
317
|
+
getFilteredList() {
|
|
318
|
+
if (this.flatElements?.length) {
|
|
319
|
+
if (!this.filter) {
|
|
320
|
+
this.filteredElementList = this.flatElements;
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
this.filteredElementList = this.flatElements.filter((item) => this.flatElementsService.checkFilterValue(item, this.filter));
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
initializeEventListeners() {
|
|
328
|
+
this.ngZone.runOutsideAngular(() => {
|
|
329
|
+
fromEvent(this.avaMainWrapper.nativeElement, 'mouseleave')
|
|
330
|
+
.pipe(takeUntil(this.$destroy))
|
|
331
|
+
.subscribe(() => {
|
|
332
|
+
this.mouseOut();
|
|
333
|
+
});
|
|
334
|
+
fromEvent(this.avaMainWrapper.nativeElement, 'mouseenter')
|
|
335
|
+
.pipe(takeUntil(this.$destroy))
|
|
336
|
+
.subscribe(() => {
|
|
337
|
+
this.mouseOver();
|
|
338
|
+
});
|
|
339
|
+
if (!this.isSelectionMode) {
|
|
340
|
+
fromEvent(document, 'keydown')
|
|
341
|
+
.pipe(takeUntil(this.$destroy), filter(() => !this.mouseAwareKeyboardControl || this.isListenKeyboard))
|
|
342
|
+
.subscribe((event) => {
|
|
343
|
+
this.handleGlobalKeyboardEvent(event);
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: AvaTreeComponent, deps: [{ token: i1.FlatElementsService, self: true }, { token: i2.SelectElementService, self: true }, { token: i3.TreeNodeSelectionService, self: true }, { token: i4.ExpandParentGroupService, self: true }, { token: i5.KeyboardOperationService, self: true }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
349
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.1", type: AvaTreeComponent, selector: "ava-tree", inputs: { project: "project", expansionState: "expansionState", selectedNodeId: "selectedNodeId", indent: "indent", selectedColor: "selectedColor", modeView: "modeView", allowDblClick: "allowDblClick", isSelectionMode: "isSelectionMode", initiallySelectedElements: "initiallySelectedElements", textWords: "textWords", mouseAwareKeyboardControl: "mouseAwareKeyboardControl", customKeyboardOperationConfig: "customKeyboardOperationConfig", listFilterFunc: "listFilterFunc", addTableColumns: "addTableColumns", functionView: "functionView" }, outputs: { selectClick: "selectClick", selectDblClick: "selectDblClick", contextMenuEvent: "contextMenuEvent", selectedElementsChanged: "selectedElementsChanged" }, providers: [FlatElementsService, SelectElementService, TreeNodeSelectionService, ExpandParentGroupService, KeyboardOperationService], viewQueries: [{ propertyName: "avaTreeWrapper", first: true, predicate: ["avaTreeWrapper"], descendants: true }, { propertyName: "avaMainWrapper", first: true, predicate: ["avaMainWrapper"], descendants: true }, { propertyName: "avaTreeFilterInput", first: true, predicate: ["avaTreeFilterInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"main-wrapper\"\n #avaMainWrapper\n>\n <div\n class=\"control\"\n #control\n >\n <mat-form-field class=\"control-filter\">\n <mat-label>{{ textWords?.textSearch }}</mat-label>\n <input\n matInput\n [ngModel]=\"filterInput\"\n (ngModelChange)=\"onFilter($event)\"\n #avaTreeFilterInput\n />\n </mat-form-field>\n <ng-container *ngIf=\"modeView === listModeViewType.Tree\">\n <button\n class=\"control-icon\"\n mat-icon-button\n color=\"primary\"\n (click)=\"changeAllElementsExpansionStatus(true)\"\n [matTooltip]=\"textWords?.tooltipAllOpen || ''\"\n >\n <mat-icon class=\"layer-background\">layers</mat-icon>\n <mat-icon class=\"layer-icon\">add</mat-icon>\n </button>\n <button\n class=\"control-icon\"\n mat-icon-button\n color=\"primary\"\n (click)=\"changeAllElementsExpansionStatus(false)\"\n [matTooltip]=\"textWords?.tooltipAllClose || ''\"\n >\n <mat-icon class=\"layer-background\">layers</mat-icon>\n <mat-icon class=\"layer-icon\">remove</mat-icon>\n </button>\n </ng-container>\n <ng-container *ngIf=\"isSelectionMode\">\n <button\n mat-raised-button\n (click)=\"selectOrDeselectAll(true)\"\n [matTooltip]=\"textWords?.tooltipAllAdd || ''\"\n class=\"control-button\"\n >\n <mat-icon>add</mat-icon>\n <span>{{ textWords?.textAll }}</span>\n </button>\n <button\n mat-raised-button\n (click)=\"selectOrDeselectAll(false)\"\n [matTooltip]=\"textWords?.tooltipAllRemove || ''\"\n class=\"control-button\"\n >\n <mat-icon>remove</mat-icon>\n <span>{{ textWords?.textAll }}</span>\n </button>\n </ng-container>\n </div>\n <div\n [style.height]=\"'calc(100% - ' + control.offsetHeight + 'px)'\"\n class=\"ava-tree-wrapper\"\n #avaTreeWrapper\n >\n <ng-container *ngIf=\"flatElements?.length; else nothing\">\n <ng-container *ngIf=\"filteredElementList?.length; else nothingFiltered\">\n <ava-tree-structure\n *ngIf=\"modeView === listModeViewType.Tree && !avaTreeFilterInput.value\"\n [serviceSpecification]=\"serviceSpecification\"\n [indent]=\"indent\"\n [expansionState]=\"expansionState\"\n [isSelectionMode]=\"isSelectionMode\"\n [selectedColor]=\"selectedColor\"\n [allowDblClick]=\"allowDblClick\"\n >\n </ava-tree-structure>\n <ava-list-structure\n *ngIf=\"modeView === listModeViewType.List || (modeView === listModeViewType.Tree && avaTreeFilterInput.value)\"\n [filteredElementList]=\"filteredElementList\"\n [isSelectionMode]=\"isSelectionMode\"\n [selectedColor]=\"selectedColor\"\n [allowDblClick]=\"allowDblClick\"\n >\n </ava-list-structure>\n <ava-table-structure\n *ngIf=\"modeView === listModeViewType.Table\"\n [filteredElementList]=\"filteredElementList\"\n [isSelectionMode]=\"isSelectionMode\"\n [addTableColumns]=\"addTableColumns\"\n [selectedColor]=\"selectedColor\"\n [allowDblClick]=\"allowDblClick\"\n >\n </ava-table-structure>\n </ng-container>\n </ng-container>\n </div>\n</div>\n<ng-template #nothing>\n {{ textWords?.textNothing }}\n</ng-template>\n<ng-template #nothingFiltered>\n {{ textWords?.textNothingFiltered }}\n</ng-template>\n", styles: [".main-wrapper{max-height:100%;height:100%;overflow-y:auto;overflow-x:hidden}.control{display:flex;align-items:center;gap:5px;padding:4px}.control-filter{flex-grow:1}.control-icon{width:36px;height:36px;padding:0}.control-button{padding:0 5px}.ava-tree-wrapper{overflow-y:auto;overflow-x:hidden}::ng-deep .control .mat-mdc-form-field-subscript-wrapper{display:none}::ng-deep .control .control-filter .mat-mdc-form-field-infix{min-height:auto;padding-top:10px;padding-bottom:2px}::ng-deep .control .control-filter .mat-mdc-floating-label{top:18px}::ng-deep .control .control-filter .mdc-text-field{padding:0 6px}.layer-background{font-size:36px;width:36px;height:36px}.layer-icon{width:36px;height:36px;position:absolute;inset:1px 0 0;color:#fff}\n"], dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i11.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i11.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i12.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i13.TreeStructureComponent, selector: "ava-tree-structure", inputs: ["serviceSpecification", "indent", "expansionState", "isSelectionMode", "selectedColor", "allowDblClick"] }, { kind: "component", type: i14.ListStructureComponent, selector: "ava-list-structure", inputs: ["filteredElementList", "isSelectionMode", "selectedColor", "allowDblClick"] }, { kind: "component", type: i15.TableStructureComponent, selector: "ava-table-structure", inputs: ["filteredElementList", "isSelectionMode", "addTableColumns", "selectedColor", "allowDblClick"] }] }); }
|
|
350
|
+
}
|
|
351
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: AvaTreeComponent, decorators: [{
|
|
352
|
+
type: Component,
|
|
353
|
+
args: [{ selector: 'ava-tree', providers: [FlatElementsService, SelectElementService, TreeNodeSelectionService, ExpandParentGroupService, KeyboardOperationService], template: "<div\n class=\"main-wrapper\"\n #avaMainWrapper\n>\n <div\n class=\"control\"\n #control\n >\n <mat-form-field class=\"control-filter\">\n <mat-label>{{ textWords?.textSearch }}</mat-label>\n <input\n matInput\n [ngModel]=\"filterInput\"\n (ngModelChange)=\"onFilter($event)\"\n #avaTreeFilterInput\n />\n </mat-form-field>\n <ng-container *ngIf=\"modeView === listModeViewType.Tree\">\n <button\n class=\"control-icon\"\n mat-icon-button\n color=\"primary\"\n (click)=\"changeAllElementsExpansionStatus(true)\"\n [matTooltip]=\"textWords?.tooltipAllOpen || ''\"\n >\n <mat-icon class=\"layer-background\">layers</mat-icon>\n <mat-icon class=\"layer-icon\">add</mat-icon>\n </button>\n <button\n class=\"control-icon\"\n mat-icon-button\n color=\"primary\"\n (click)=\"changeAllElementsExpansionStatus(false)\"\n [matTooltip]=\"textWords?.tooltipAllClose || ''\"\n >\n <mat-icon class=\"layer-background\">layers</mat-icon>\n <mat-icon class=\"layer-icon\">remove</mat-icon>\n </button>\n </ng-container>\n <ng-container *ngIf=\"isSelectionMode\">\n <button\n mat-raised-button\n (click)=\"selectOrDeselectAll(true)\"\n [matTooltip]=\"textWords?.tooltipAllAdd || ''\"\n class=\"control-button\"\n >\n <mat-icon>add</mat-icon>\n <span>{{ textWords?.textAll }}</span>\n </button>\n <button\n mat-raised-button\n (click)=\"selectOrDeselectAll(false)\"\n [matTooltip]=\"textWords?.tooltipAllRemove || ''\"\n class=\"control-button\"\n >\n <mat-icon>remove</mat-icon>\n <span>{{ textWords?.textAll }}</span>\n </button>\n </ng-container>\n </div>\n <div\n [style.height]=\"'calc(100% - ' + control.offsetHeight + 'px)'\"\n class=\"ava-tree-wrapper\"\n #avaTreeWrapper\n >\n <ng-container *ngIf=\"flatElements?.length; else nothing\">\n <ng-container *ngIf=\"filteredElementList?.length; else nothingFiltered\">\n <ava-tree-structure\n *ngIf=\"modeView === listModeViewType.Tree && !avaTreeFilterInput.value\"\n [serviceSpecification]=\"serviceSpecification\"\n [indent]=\"indent\"\n [expansionState]=\"expansionState\"\n [isSelectionMode]=\"isSelectionMode\"\n [selectedColor]=\"selectedColor\"\n [allowDblClick]=\"allowDblClick\"\n >\n </ava-tree-structure>\n <ava-list-structure\n *ngIf=\"modeView === listModeViewType.List || (modeView === listModeViewType.Tree && avaTreeFilterInput.value)\"\n [filteredElementList]=\"filteredElementList\"\n [isSelectionMode]=\"isSelectionMode\"\n [selectedColor]=\"selectedColor\"\n [allowDblClick]=\"allowDblClick\"\n >\n </ava-list-structure>\n <ava-table-structure\n *ngIf=\"modeView === listModeViewType.Table\"\n [filteredElementList]=\"filteredElementList\"\n [isSelectionMode]=\"isSelectionMode\"\n [addTableColumns]=\"addTableColumns\"\n [selectedColor]=\"selectedColor\"\n [allowDblClick]=\"allowDblClick\"\n >\n </ava-table-structure>\n </ng-container>\n </ng-container>\n </div>\n</div>\n<ng-template #nothing>\n {{ textWords?.textNothing }}\n</ng-template>\n<ng-template #nothingFiltered>\n {{ textWords?.textNothingFiltered }}\n</ng-template>\n", styles: [".main-wrapper{max-height:100%;height:100%;overflow-y:auto;overflow-x:hidden}.control{display:flex;align-items:center;gap:5px;padding:4px}.control-filter{flex-grow:1}.control-icon{width:36px;height:36px;padding:0}.control-button{padding:0 5px}.ava-tree-wrapper{overflow-y:auto;overflow-x:hidden}::ng-deep .control .mat-mdc-form-field-subscript-wrapper{display:none}::ng-deep .control .control-filter .mat-mdc-form-field-infix{min-height:auto;padding-top:10px;padding-bottom:2px}::ng-deep .control .control-filter .mat-mdc-floating-label{top:18px}::ng-deep .control .control-filter .mdc-text-field{padding:0 6px}.layer-background{font-size:36px;width:36px;height:36px}.layer-icon{width:36px;height:36px;position:absolute;inset:1px 0 0;color:#fff}\n"] }]
|
|
354
|
+
}], ctorParameters: () => [{ type: i1.FlatElementsService, decorators: [{
|
|
355
|
+
type: Self
|
|
356
|
+
}] }, { type: i2.SelectElementService, decorators: [{
|
|
357
|
+
type: Self
|
|
358
|
+
}] }, { type: i3.TreeNodeSelectionService, decorators: [{
|
|
359
|
+
type: Self
|
|
360
|
+
}] }, { type: i4.ExpandParentGroupService, decorators: [{
|
|
361
|
+
type: Self
|
|
362
|
+
}] }, { type: i5.KeyboardOperationService, decorators: [{
|
|
363
|
+
type: Self
|
|
364
|
+
}] }, { type: i0.NgZone }], propDecorators: { project: [{
|
|
365
|
+
type: Input
|
|
366
|
+
}], expansionState: [{
|
|
367
|
+
type: Input
|
|
368
|
+
}], selectedNodeId: [{
|
|
369
|
+
type: Input
|
|
370
|
+
}], indent: [{
|
|
371
|
+
type: Input
|
|
372
|
+
}], selectedColor: [{
|
|
373
|
+
type: Input
|
|
374
|
+
}], modeView: [{
|
|
375
|
+
type: Input
|
|
376
|
+
}], allowDblClick: [{
|
|
377
|
+
type: Input
|
|
378
|
+
}], isSelectionMode: [{
|
|
379
|
+
type: Input
|
|
380
|
+
}], initiallySelectedElements: [{
|
|
381
|
+
type: Input
|
|
382
|
+
}], textWords: [{
|
|
383
|
+
type: Input
|
|
384
|
+
}], mouseAwareKeyboardControl: [{
|
|
385
|
+
type: Input
|
|
386
|
+
}], customKeyboardOperationConfig: [{
|
|
387
|
+
type: Input
|
|
388
|
+
}], listFilterFunc: [{
|
|
389
|
+
type: Input
|
|
390
|
+
}], addTableColumns: [{
|
|
391
|
+
type: Input
|
|
392
|
+
}], functionView: [{
|
|
393
|
+
type: Input
|
|
394
|
+
}], selectClick: [{
|
|
395
|
+
type: Output
|
|
396
|
+
}], selectDblClick: [{
|
|
397
|
+
type: Output
|
|
398
|
+
}], contextMenuEvent: [{
|
|
399
|
+
type: Output
|
|
400
|
+
}], selectedElementsChanged: [{
|
|
401
|
+
type: Output
|
|
402
|
+
}], avaTreeWrapper: [{
|
|
403
|
+
type: ViewChild,
|
|
404
|
+
args: ['avaTreeWrapper']
|
|
405
|
+
}], avaMainWrapper: [{
|
|
406
|
+
type: ViewChild,
|
|
407
|
+
args: ['avaMainWrapper']
|
|
408
|
+
}], avaTreeFilterInput: [{
|
|
409
|
+
type: ViewChild,
|
|
410
|
+
args: ['avaTreeFilterInput']
|
|
411
|
+
}] } });
|
|
412
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZhLXRyZWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1hdmEvc3JjL2xpYi9hdmEtdHJlZS90cmVlL2NvbXBvbmVudHMvYXZhLXRyZWUvYXZhLXRyZWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1hdmEvc3JjL2xpYi9hdmEtdHJlZS90cmVlL2NvbXBvbmVudHMvYXZhLXRyZWUvYXZhLXRyZWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUtMLE1BQU0sRUFDTixJQUFJLEVBRUosU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxRixPQUFPLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdEUsT0FBTyxFQUlMLFlBQVksRUFLYixNQUFNLGFBQWEsQ0FBQztBQUVyQixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQTRCLHdCQUF3QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDdEksT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDN0UsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNENBQTRDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUXRGLE1BQU0sT0FBTyxnQkFBZ0I7SUF3RDNCOzs7Ozs7Ozs7Ozs7O09BYUc7SUFD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RyxjQUFjO3NCQUF0QixLQUFLO2dCQVlHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBa0JHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyx1QkFBdUI7c0JBQWhDLE1BQU07Z0JBQ3NCLGNBQWM7c0JBQTFDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNFLGNBQWM7c0JBQTFDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNNLGtCQUFrQjtzQkFBbEQsU0FBUzt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTZWxmLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIFN1YmplY3QsIGRlYm91bmNlVGltZSwgZmlsdGVyLCBmcm9tRXZlbnQsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBERUZBVUxUX0ZJTFRFUlMsIERFRkFVTFRfVEVYVF9XT1JEUyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBJVGV4dFdvcmRzIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2RlZmF1bHRUZXh0V29yZHMnO1xuaW1wb3J0IHtcbiAgQ29udGV4dE1lbnVEYXRhVHlwZSxcbiAgSUVsZW1lbnREdG8sXG4gIElGdW5jdGlvblZpZXdMaW5lLFxuICBNb2RlVmlld1R5cGUsXG4gIFByb2plY3REdG8sXG4gIFNlbGVjdGVkRWxlbWVudCxcbiAgU2VydmljZVNwZWNpZmljYXRpb25EdG8sXG4gIFRhYmxlQ29sdW1uVHlwZVxufSBmcm9tICcuLi8uLi9tb2RlbCc7XG5pbXBvcnQgeyBTZWxlY3RpbmdFbGVtZW50c1R5cGUgfSBmcm9tICcuLi8uLi9tb2RlbC9zZWxlY3RpbmcubW9kZWwnO1xuaW1wb3J0IHsgRXhwYW5kUGFyZW50R3JvdXBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZXhwYW5kLXBhcmVudC1ncm91cC5zZXJ2aWNlJztcbmltcG9ydCB7IEZsYXRFbGVtZW50c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mbGF0LWVsZW1lbnRzLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUtleWJvYXJkT3BlcmF0aW9uQ29uZmlnLCBLZXlib2FyZE9wZXJhdGlvblNlcnZpY2UsIEtleWJvYXJkT3BlcmF0aW9uVHlwZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2tleWJvYXJkLW9wZXJhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFNlbGVjdEVsZW1lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2VsZWN0LWVsZW1lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBUcmVlTm9kZVNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90cmVlLW5vZGUtc2VsZWN0aW9uLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhdmEtdHJlZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9hdmEtdHJlZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2F2YS10cmVlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW0ZsYXRFbGVtZW50c1NlcnZpY2UsIFNlbGVjdEVsZW1lbnRTZXJ2aWNlLCBUcmVlTm9kZVNlbGVjdGlvblNlcnZpY2UsIEV4cGFuZFBhcmVudEdyb3VwU2VydmljZSwgS2V5Ym9hcmRPcGVyYXRpb25TZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBBdmFUcmVlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIC8qKlxuICAgKiBUaGlzIGlzIHRoZSBtYWluIGRhdGEgZWxlbWVudCBmb3IgdGhlIHRyZWUgc3RydWN0dXJlLiBZb3Ugc2hvdWxkIHN1cHBseSBhIFByb2plY3REdG8gd2l0aFxuICAgKiBleGFjdGx5IG9uZSBzZXJ2aWNlIHNwZWNpZmljYXRpb24gaW4gaXQuXG4gICAqL1xuICBASW5wdXQoKSBwcm9qZWN0OiBQcm9qZWN0RHRvIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gc3VwcGx5IGEgbWFwIG9mIGV4cGFuc2lvbiBzdGF0ZXMgZm9yIHRoZSB0cmVlLiBUaGUga2V5cyBzaG91bGQgYmUgdGhlXG4gICAqIGlkIHByb3BlcnRpZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSB0cmVlLCBhbmQgdGhlIHZhbHVlcyBzaG91bGQgYmUgdHJ1ZSBpZiB0aGUgZWxlbWVudCBpc1xuICAgKiBleHBhbmRlZCwgYW5kIGZhbHNlIGlmIGl0IGlzIGNvbGxhcHNlZC5cbiAgICovXG4gIEBJbnB1dCgpIGV4cGFuc2lvblN0YXRlOiB7IFtpZDogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gc3VwcGx5IHRoZSBpZCBvZiB0aGUgbm9kZSB0aGF0IHNob3VsZCBiZSBzZWxlY3RlZCBpbiB0aGUgdHJlZSBpbml0aWFsbHkuXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3RlZE5vZGVJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsLCBkZWZhdWx0cyB0byAyMHB4LiBJZiB0aGlzIGlzIHNldCwgdGhlbiB0aGUgdHJlZSB3aWxsIGJlIGluZGVudGVkIGJ5IHRoZSBnaXZlbiB2YWx1ZSBlYWNoIGxldmVsLlxuICAgKiBUaGlzIGNhbiBiZSBhbnkgdmFsaWQgQ1NTIHZhbHVlIGZvciB0aGUgcGFkZGluZy1sZWZ0IHByb3BlcnR5LCBzdWNoIGFzIDIwcHgsIDFlbSwgb3IgNSUuXG4gICAqXG4gICAqL1xuICBASW5wdXQoKSBpbmRlbnQgPSAnMjBweCc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsLCB5b3UgY2FuIHN1cHBseSBhIGNvbG9yIHRvIGJlIHVzZWQgYXMgdGhlIGJhY2tncm91bmQgY29sb3IgZm9yIHRoZSBzZWxlY3RlZCBsaW5lLiBEZWZhdWx0cyB0byB0aGUgcHJpbWFyeVxuICAgKiBjb2xvciBmcm9tIHRoZSBNYXRlcmlhbCB0aGVtZSwgd2hpY2ggaXMgIzAwYWNjMS5cbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdGVkQ29sb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBZb3UgY2FuIHNwZWNpZnkgd2hpY2ggdmlldyB0eXBlIHRvIHVzZSBmb3IgdGhlIHRyZWUuIFRoZSBkZWZhdWx0IGlzIE1vZGVWaWV3VHlwZS5UcmVlLCBidXQgeW91IGNhbiBhbHNvIHVzZVxuICAgKiBNb2RlVmlld1R5cGUuTGlzdCBvciBNb2RlVmlld1R5cGUuVGFibGUuXG4gICAqL1xuICBASW5wdXQoKSBtb2RlVmlldzogTW9kZVZpZXdUeXBlID0gTW9kZVZpZXdUeXBlLlRyZWU7XG5cbiAgLyoqIE9wdGlvbmFsLCBkZWZhdWx0cyB0byB0cnVlLiBJZiB0aGlzIGlzIGRpc2FibGVkLCB0aGVuIHRoZSBkb3VibGUgY2xpY2sgZXZlbnQgZm9yIGVsZW1lbnRzIGlzIG5vdCByYWlzZWQsXG4gICAqIGFuZCBjbGlja2luZyBvbiBhbiBlbGVtdCBzZW5kcyBhbiBpbW1lZGlhdGUgcmVzdWx0IHNpbmNlIHRoZSBjb21wb25lbnQgaGFzIG5vdCB0byB3YWl0IGFuZCBjaGVjayBpZiBhIGRvdWJsZSBjbGljayBldmVudFxuICAgKiBpcyBmaXJlZC5cbiAgICovXG4gIEBJbnB1dCgpIGFsbG93RGJsQ2xpY2sgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBJZiB0aGlzIGlzIHNldCB0byB0cnVlLCB0aGVuIHRoZSB0cmVlIHdpbGwgYmUgaW4gc2VsZWN0aW9uIG1vZGUsIGFuZCB0aGUgdXNlciBjYW4gc2VsZWN0IGVsZW1lbnRzXG4gICAqIGJ5IGNsaWNraW5nIG9uIHRoZW0uIFRoZSBzZWxlY3RlZCBlbGVtZW50cyB3aWxsIGJlIGVtaXR0ZWQgaW4gdGhlIHNlbGVjdGVkRWxlbWVudHNDaGFuZ2VkIGV2ZW50LlxuICAgKi9cbiAgQElucHV0KCkgaXNTZWxlY3Rpb25Nb2RlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFlvdSBjYW4gb3B0aW9uYWxseSBzdXBwbHkgYSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIHNlbGVjdGVkIGluaXRpYWxseS4gVGhpcyBpcyBvbmx5IHVzZWQgaWZcbiAgICogaXNTZWxlY3Rpb25Nb2RlIGlzIHRydWUuXG4gICAqL1xuICBASW5wdXQoKSBpbml0aWFsbHlTZWxlY3RlZEVsZW1lbnRzOiBTZWxlY3RlZEVsZW1lbnRbXSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBZb3UgY2FuIHN1cHBseSBhIG1hcCBvZiBzdHJpbmdzIHRvIGJlIHVzZWQgZm9yIHRoZSB0ZXh0IGluIHRoZSB0cmVlLiBUaGlzIGFsbG93cyB5b3UgdG8gdHJhbnNsYXRlXG4gICAqIHRoZSB0ZXh0IGluIHRoZSB0cmVlIHRvIG90aGVyIGxhbmd1YWdlcy5cbiAgICoge1xuICAgKiAgIHRleHRTZWFyY2g6IHN0cmluZyxcbiAgICogICB0ZXh0Tm90aGluZzogc3RyaW5nLFxuICAgKiAgIHRleHROb3RoaW5nRmlsdGVyZWQ6IHN0cmluZyxcbiAgICogICB0ZXh0QWxsOiBzdHJpbmcsXG4gICAqICAgdG9vbHRpcEFsbE9wZW46IHN0cmluZyxcbiAgICogICB0b29sdGlwQWxsQ2xvc2U6IHN0cmluZyxcbiAgICogICB0b29sdGlwQWxsQWRkOnN0cmluZyxcbiAgICogICB0b29sdGlwQWxsUmVtb3ZlOiBzdHJpbmcsXG4gICAqIH1cbiAgICovXG4gIEBJbnB1dCgpIHNldCB0ZXh0V29yZHMod29yZHM6IElUZXh0V29yZHMgfCBudWxsKSB7XG4gICAgdGhpcy5fdGV4dFdvcmRzID0geyAuLi50aGlzLnRleHRXb3JkcywgLi4ud29yZHMgfTtcbiAgfSAvLyBhbGxvdyB0byB0cmFuc2xhdGUgYWxsIHRleHRzIHRvIG90aGVyIGxhbmd1YWdlXG4gIGdldCB0ZXh0V29yZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RleHRXb3JkcztcbiAgfVxuICBwcml2YXRlIF90ZXh0V29yZHM6IElUZXh0V29yZHMgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogRGVmYXVsdHMgdG8gdHJ1ZS4gSWYgdGhpcyBpcyBlbmFibGVkLCB0aGVuIG5hdmlnYXRpbmcgaW4gdGhlIHRyZWUgd2l0aCB0aGUga2V5Ym9hcmQgb25seSB3b3Jrc1xuICAgKiBpZiB0aGUgbW91c2UgaXMgb3ZlciB0aGUgdHJlZSBhcmVhLiBUaGlzIGxpbWl0YXRpb24gaXMgdXNlZnVsIGlmIHlvdSBoYXZlIG11bHRpcGxlIHRyZWVzIG9yIG90aGVyIGNvbXBvbmVudHNcbiAgICogdGhhdCBtaWdodCBiZSB1c2luZyBrZXlib2FyZCBpbnB1dC5cbiAgICovXG4gIEBJbnB1dCgpIG1vdXNlQXdhcmVLZXlib2FyZENvbnRyb2wgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBXaXRoIHRoaXMgcGFyYW1ldGVyLCB5b3UgY2FuIGNvbmZpZ3VyZSB3aGljaCBrZXlzIHdpbGwgYmUgbGlzdGVuZW5kIHRvIHRvIHN3aXRjaCB0aGUgdHJlZSBlbGVtZW50cyxcbiAgICogYW5kIGFsc28gdG8gZGlzYWJsZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUga2V5cyAqL1xuICBASW5wdXQoKSBzZXQgY3VzdG9tS2V5Ym9hcmRPcGVyYXRpb25Db25maWcoY29uZmlnOiBJS2V5Ym9hcmRPcGVyYXRpb25Db25maWcpIHtcbiAgICB0aGlzLmtleWJvYXJkT3BlcmF0aW9uU2VydmljZS5tZXJnZUNvbmZpZ09wZXJhdGlvbihjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFlvdSBjYW4gc3VwcGx5IGN1c3RvbSBmaWx0ZXJzIHRoYXQgYXJlIHByb2Nlc3NlZCB3aGVuIHRoZSBmaWx0ZXIgaW5wdXQgaXMgY2hhbmdlZC4gRGVmYXVsdCBmaWx0ZXJzIGFyZSB1c2VkXG4gICAqIHRoYXQgY2hlY2sgZm9yIHNob3J0IHRleHQgYW5kIGl0ZW0gbnVtYmVyIG1hdGNoZXMsIGFuZCB5b3UgY2FuIGVpdGhlciBhZGQgY3VzdG9tIGZpbHRlcnMgb3IgcmVwbGFjZSB0aGUgZGVmYXVsdCBvbmVzLlxuICAgKi9cbiAgQElucHV0KCkgbGlzdEZpbHRlckZ1bmMgPSBERUZBVUxUX0ZJTFRFUlM7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsLiBGb3IgdGFibGUgdmlld3MsIHRoaXMgYWxsb3dzIHlvdSB0byBhZGQgY3VzdG9tIGNvbHVtbnMgdG8gdGhlIHRhYmxlLlxuICAgKiBhZGRUYWJsZUNvbHVtbnM6IEFycmF5IG9mIG9iamVjdHNcbiAgICoge1xuICAgKiAgIG5hbWU6IHN0cmluZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFtZSBvZiBjb2x1bW5cbiAgICogICB0aXRsZTogc3RyaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3dlZCB0aXRsZSBvZiBjb2x1bW5cbiAgICogICBhbGlnbj86IHN0cmluZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsIGFsaWdodDogbGVmdChkZWZhdWx0KSAvIGNlbnRlciAvIHJpZ2h0XG4gICAqICAgbnVtYmVyRm9ybWF0Pzogc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbCBmb3JtYXQgb2YgbnVtYmVyIHZhbHVlLCBleGFtcGxlOiAnMS4yLTInXG4gICAqIH1cbiAgICovXG4gIEBJbnB1dCgpIGFkZFRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5UeXBlW10gPSBbXTtcblxuICAvKipcbiAgICogVGhpcyBhbGxvd3MgeW91IHRvIHN1cHBseSBhIGxpc3Qgb2YgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBhcHBlYXJhbmNlIG9mIGVsZW1lbnRzLlxuICAgKiBUaGV5IG9iamVjdHMgY29udGFpbiBhIHByZWRpY2F0ZSBmdW5jdGlvbiB0aGF0IGlzIGV2YWx1YXRlZCwgYWxvbmcgd2l0aCBhbiBvcHRpb24gdG8gY29uZmlndXJlIHRoZVxuICAgKiBhcHBlYXJhbmNlIG9mIHRoZSBlbGVtZW50LlxuICAgKiAgIGZ1bmN0aW9uVmlldzogQXJyYXkgb2Ygb2JqZWN0c1xuICAgKiAgIHtcbiAgICogICAgIG5hbWU6IHN0cmluZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hbWUgb2YgdmlldyBwYXJ0OiB5b3UgY2FuIGFkZC9yZW1vdmUgaXQgd2hlbiBpdCBuZWVkXG4gICAqICAgICBmdW5jOiAoZWxlbWVudDogYW55LCByZXN1bHQ/OiBhbnkpID0+IGJvb2xlYW4sICAvLyB0aGlzIGZpbHRlciBmdW5jdGlvbiBjYWxjdWxhdGUgY29uZGl0aW9uIHRvIGNoYW5nZSB2aWV3XG4gICAqICAgICB2aWV3OiB7XG4gICAqICAgICAgIGljb25OYW1lPzogc3RyaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2VkIG5hbWUgb2YgaWNvblxuICAgKiAgICAgICBpY29uQ29sb3I/OiBzdHJpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlZCBjb2xvciBvZiBpY29uXG4gICAqICAgICAgIHRleHRCb2xkPzogc3RyaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2VkIHdlaWdodCBvZiB0ZXh0XG4gICAqICAgICAgIHRleHRDb2xvcj86IHN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2VkIGNvbG9yIG9mIHRleHRcbiAgICogICAgIH1cbiAgICogICB9XG4gICAqL1xuICBASW5wdXQoKSBmdW5jdGlvblZpZXc6IElGdW5jdGlvblZpZXdMaW5lW10gfCBudWxsID0gbnVsbDtcblxuICBAT3V0cHV0KCkgc2VsZWN0Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPElFbGVtZW50RHRvIHwgbnVsbD4oKTsgLy8gZXZlbnQgYWZ0ZXIgZWxlbWVudCBzZWxlY3RlZCBieSBjbGlja1xuICBAT3V0cHV0KCkgc2VsZWN0RGJsQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPElFbGVtZW50RHRvPigpOyAvLyBldmVudCBhZnRlciBlbGVtZW50IHNlbGVjdGVkIGJ5IGRvdWJsZSBjbGlja1xuICBAT3V0cHV0KCkgY29udGV4dE1lbnVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29udGV4dE1lbnVEYXRhVHlwZT4oKTsgLy8gZXZlbnQgYWZ0ZXIgZWxlbWVudCBjYWxsIGNvbnRleHQgbWVudSBieSByaWdodCBidXR0b24gY2xpY2tcbiAgQE91dHB1dCgpIHNlbGVjdGVkRWxlbWVudHNDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3RlZEVsZW1lbnRbXT4oKTsgLy8gZXZlbnQgYWZ0ZXIgY2hhbmdlZCBzZWxlY3RpbmcgaW4gc2VsZWN0aW5nIG1vZGVcbiAgQFZpZXdDaGlsZCgnYXZhVHJlZVdyYXBwZXInKSBhdmFUcmVlV3JhcHBlciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdhdmFNYWluV3JhcHBlcicpIGF2YU1haW5XcmFwcGVyITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2F2YVRyZWVGaWx0ZXJJbnB1dCcpIGF2YVRyZWVGaWx0ZXJJbnB1dCE6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG4gIHNlbGVjdGVkRWxlbWVudDogSUVsZW1lbnREdG8gfCBudWxsID0gbnVsbDtcbiAgc2VydmljZVNwZWNpZmljYXRpb24hOiBTZXJ2aWNlU3BlY2lmaWNhdGlvbkR0bztcbiAgaXNMaXN0ZW5LZXlib2FyZCA9IGZhbHNlO1xuICBwcml2YXRlIGlzRW1pdGVTZWxlY3RlZEVsZW1lbnRzID0gZmFsc2U7XG4gIHByaXZhdGUgc2VsZWN0aW5nRWxlbWVudHNUcmVlRGF0YTogU2VsZWN0aW5nRWxlbWVudHNUeXBlW10gPSBbXTtcbiAgZmxhdEVsZW1lbnRzOiBJRWxlbWVudER0b1tdIHwgbnVsbCA9IG51bGw7XG4gIHByZXNlbGVjdGVkRWxlbWVudDogSUVsZW1lbnREdG8gfCBudWxsID0gbnVsbDtcbiAgZmlsdGVySW5wdXQgPSAnJztcbiAgbGlzdE1vZGVWaWV3VHlwZSA9IE1vZGVWaWV3VHlwZTtcbiAgcHJpdmF0ZSBmaWx0ZXIgPSAnJztcbiAgcHJpdmF0ZSAkZmlsdGVyID0gbmV3IFJlcGxheVN1YmplY3Q8c3RyaW5nPigxKTtcbiAgZmlsdGVyZWRFbGVtZW50TGlzdDogSUVsZW1lbnREdG9bXSA9IFtdO1xuICBwcml2YXRlICRkZXN0cm95ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAU2VsZigpIHByaXZhdGUgZmxhdEVsZW1lbnRzU2VydmljZTogRmxhdEVsZW1lbnRzU2VydmljZSxcbiAgICBAU2VsZigpIHByaXZhdGUgc2VsZWN0RWxlbWVudFNlcnZpY2U6IFNlbGVjdEVsZW1lbnRTZXJ2aWNlLFxuICAgIEBTZWxmKCkgcHJpdmF0ZSB0cmVlTm9kZVNlbGVjdGlvblNlcnZpY2U6IFRyZWVOb2RlU2VsZWN0aW9uU2VydmljZSxcbiAgICBAU2VsZigpIHByaXZhdGUgZXhwYW5kUGFyZW50R3JvdXBTZXJ2aWNlOiBFeHBhbmRQYXJlbnRHcm91cFNlcnZpY2UsXG4gICAgQFNlbGYoKSBwcml2YXRlIGtleWJvYXJkT3BlcmF0aW9uU2VydmljZTogS2V5Ym9hcmRPcGVyYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmVcbiAgKSB7XG4gICAgdGhpcy5fdGV4dFdvcmRzID0geyAuLi5ERUZBVUxUX1RFWFRfV09SRFMgfTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0RWxlbWVudFNlcnZpY2UucHJlc2VsZWN0ZWRFbGVtZW50LnBpcGUodGFrZVVudGlsKHRoaXMuJGRlc3Ryb3kpKS5zdWJzY3JpYmUoKGUpID0+ICh0aGlzLnByZXNlbGVjdGVkRWxlbWVudCA9IGUpKTtcbiAgICB0aGlzLnNlbGVjdEVsZW1lbnRTZXJ2aWNlLnNlbGVjdENsaWNrRWxlbWVudC5waXBlKHRha2VVbnRpbCh0aGlzLiRkZXN0cm95KSkuc3Vic2NyaWJlKChlKSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCA9IGU7XG4gICAgICB0aGlzLnNlbGVjdENsaWNrLmVtaXQoZSk7XG4gICAgfSk7XG4gICAgdGhpcy5zZWxlY3RFbGVtZW50U2VydmljZS5zZWxlY3REYmxDbGlja0VsZW1lbnQucGlwZSh0YWtlVW50aWwodGhpcy4kZGVzdHJveSkpLnN1YnNjcmliZSgoZSkgPT4gdGhpcy5zZWxlY3REYmxDbGljay5lbWl0KGUpKTtcbiAgICB0aGlzLnNlbGVjdEVsZW1lbnRTZXJ2aWNlLnNlbGVjdENvbnRleHRNZW51RWxlbWVudC5waXBlKHRha2VVbnRpbCh0aGlzLiRkZXN0cm95KSkuc3Vic2NyaWJlKChlKSA9PiB0aGlzLmNvbnRleHRNZW51RXZlbnQuZW1pdChlKSk7XG4gICAgdGhpcy5mbGF0RWxlbWVudHNTZXJ2aWNlLmZsYXRFbGVtZW50c0R0by5waXBlKHRha2VVbnRpbCh0aGlzLiRkZXN0cm95KSkuc3Vic2NyaWJlKChlKSA9PiB7XG4gICAgICB0aGlzLmZsYXRFbGVtZW50cyA9IGU7XG4gICAgICB0aGlzLmdldEZpbHRlcmVkTGlzdCgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy4kZmlsdGVyLnBpcGUodGFrZVVudGlsKHRoaXMuJGRlc3Ryb3kpLCBkZWJvdW5jZVRpbWUoMjUwKSkuc3Vic2NyaWJlKChmaWx0ZXIpID0+IHtcbiAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyO1xuICAgICAgdGhpcy5nZXRGaWx0ZXJlZExpc3QoKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVFdmVudExpc3RlbmVycygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIHRoaXMuZmxhdEVsZW1lbnRzU2VydmljZS5saXN0RmlsdGVyRnVuYyA9IHRoaXMubGlzdEZpbHRlckZ1bmM7XG4gICAgdGhpcy5mbGF0RWxlbWVudHNTZXJ2aWNlLmZ1bmN0aW9uVmlldyA9IHRoaXMuZnVuY3Rpb25WaWV3O1xuXG4gICAgaWYgKGNoYW5nZXNbJ3Byb2plY3QnXSAmJiB0aGlzLnByb2plY3Q/LnNlcnZpY2VTcGVjaWZpY2F0aW9ucz8uWzBdKSB7XG4gICAgICB0aGlzLnNlcnZpY2VTcGVjaWZpY2F0aW9uID0gdGhpcy5wcm9qZWN0LnNlcnZpY2VTcGVjaWZpY2F0aW9uc1swXTtcbiAgICAgIHRoaXMuZmxhdEVsZW1lbnRzU2VydmljZS5zZXRFbGVtZW50c0R0byh0aGlzLnNlcnZpY2VTcGVjaWZpY2F0aW9uKTtcblxuICAgICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25Nb2RlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW5nRWxlbWVudHNUcmVlRGF0YSA9IHRoaXMudHJlZU5vZGVTZWxlY3Rpb25TZXJ2aWNlLmxvYWRTZWxlY3RpbmdFbGVtZW50cyh0aGlzLnNlcnZpY2VTcGVjaWZpY2F0aW9uLmVsZW1lbnRzKTtcbiAgICAgICAgdGhpcy50cmVlTm9kZVNlbGVjdGlvblNlcnZpY2UudHJlZU5vZGVTZWxlY3RpbmcucGlwZSh0YWtlVW50aWwodGhpcy4kZGVzdHJveSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNFbWl0ZVNlbGVjdGVkRWxlbWVudHMpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBzZWxlY3RpbmdUcmVlID0gdGhpcy50cmVlTm9kZVNlbGVjdGlvblNlcnZpY2UuZ2V0VHJlZVJvb3QodGhpcy5zZWxlY3RpbmdFbGVtZW50c1RyZWVEYXRhKTtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzQ2hhbmdlZC5lbWl0KHNlbGVjdGluZ1RyZWUpO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGNoYW5nZXNbJ3NlbGVjdGVkTm9kZUlkJ10gJiYgdGhpcy5wcm9qZWN0KSB8fCBjaGFuZ2VzWydwcm9qZWN0J10pIHtcbiAgICAgIHRoaXMuZmxhdEVsZW1lbnRzU2VydmljZS5nZXRPbmVFbGVtZW50QnlJZCh0aGlzLnNlbGVjdGVkTm9kZUlkKS5zdWJzY3JpYmUoKGUpID0+IHtcbiAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdEVsZW1lbnRTZXJ2aWNlLnNldENsaWNrRWxlbWVudChlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNTZWxlY3Rpb25Nb2RlICYmIChjaGFuZ2VzWydpbml0aWFsbHlTZWxlY3RlZEVsZW1lbnRzJ10gfHwgY2hhbmdlc1sncHJvamVjdCddKSkge1xuICAgICAgdGhpcy5mb3JtU2VsZWN0aW5nTGlzdCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuJGRlc3Ryb3kubmV4dCh0cnVlKTtcbiAgICB0aGlzLiRkZXN0cm95LmNvbXBsZXRlKCk7XG4gIH1cblxuICBwcml2YXRlIG1vdXNlT3ZlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNMaXN0ZW5LZXlib2FyZCkge1xuICAgICAgdGhpcy5pc0xpc3RlbktleWJvYXJkID0gdHJ1ZTtcbiAgICAgIHRoaXMuYXZhVHJlZUZpbHRlcklucHV0Py5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtb3VzZU91dCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzTGlzdGVuS2V5Ym9hcmQgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlR2xvYmFsS2V5Ym9hcmRFdmVudChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgY29uc3Qga2V5RXZlbnQgPSBldmVudCBhcyBLZXlib2FyZEV2ZW50O1xuICAgICAgaWYgKCF0aGlzLm1vdXNlQXdhcmVLZXlib2FyZENvbnRyb2wgfHwgdGhpcy5pc0xpc3RlbktleWJvYXJkKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnByZXNlbGVjdGVkRWxlbWVudCB8fCB0aGlzLnNlbGVjdGVkRWxlbWVudDtcblxuICAgICAgICBjb25zdCB7IG9wZXJhdGlvbiwgbmV4dEVsZW1lbnQgfSA9IHRoaXMua2V5Ym9hcmRPcGVyYXRpb25TZXJ2aWNlLmhhbmRsZUtleWJvYXJkRXZlbnQoa2V5RXZlbnQsIGVsZW1lbnQpIHx8IHsgbmV4dEVsZW1lbnQ6IG51bGwgfTtcbiAgICAgICAgc3dpdGNoIChvcGVyYXRpb24pIHtcbiAgICAgICAgICBjYXNlIEtleWJvYXJkT3BlcmF0aW9uVHlwZS5Nb3ZlU2VsZWN0ZWRQb3NpdGlvblVwOlxuICAgICAgICAgICAgdGhpcy5zaG93RWxlbWVudChuZXh0RWxlbWVudCwgJy5zZWxlY3QnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgS2V5Ym9hcmRPcGVyYXRpb25UeXBlLk1vdmVTZWxlY3RlZFBvc2l0aW9uRG93bjpcbiAgICAgICAgICAgIHRoaXMuc2hvd0VsZW1lbnQobmV4dEVsZW1lbnQsICcuc2VsZWN0Jyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIEtleWJvYXJkT3BlcmF0aW9uVHlwZS5Nb3ZlQ2hvc2VuUG9zaXRpb25Eb3duOlxuICAgICAgICAgICAgdGhpcy5zaG93RWxlbWVudChuZXh0RWxlbWVudCwgbmV4dEVsZW1lbnQ/LmlkID09PSB0aGlzLnNlbGVjdGVkRWxlbWVudD8uaWQgPyAnLnNlbGVjdCcgOiAnLmNob29zZScpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBLZXlib2FyZE9wZXJhdGlvblR5cGUuTW92ZUNob3NlblBvc2l0aW9uVXA6XG4gICAgICAgICAgICB0aGlzLnNob3dFbGVtZW50KG5leHRFbGVtZW50LCBuZXh0RWxlbWVudD8uaWQgPT09IHRoaXMuc2VsZWN0ZWRFbGVtZW50Py5pZCA/ICcuc2VsZWN0JyA6ICcuY2hvb3NlJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0VsZW1lbnQoZWxlbWVudDogSUVsZW1lbnREdG8gfCBudWxsLCBuYW1lUXVlcnk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICBpZiAodGhpcy5tb2RlVmlldyA9PT0gTW9kZVZpZXdUeXBlLlRyZWUpIHtcbiAgICAgICAgdGhpcy5leHBhbmRQYXJlbnRHcm91cHMoZWxlbWVudCk7XG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsTGluZShuYW1lUXVlcnkpLCAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbExpbmUobmFtZVF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJlbnRSZWN0ID0gdGhpcy5hdmFUcmVlV3JhcHBlcj8ubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBzaG93ZWRFbGVtZW50ID0gdGhpcy5hdmFUcmVlV3JhcHBlcj8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKG5hbWVRdWVyeSkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoIXNob3dlZEVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZFJlY3QgPSBzaG93ZWRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChcbiAgICAgIGNoaWxkUmVjdC5ib3R0b20gPiBwYXJlbnRSZWN0LmJvdHRvbSB8fFxuICAgICAgY2hpbGRSZWN0LnRvcCA8IHBhcmVudFJlY3QudG9wIHx8XG4gICAgICAodGhpcy5tb2RlVmlldyA9PT0gTW9kZVZpZXdUeXBlLlRhYmxlICYmIGNoaWxkUmVjdC50b3AgPCBwYXJlbnRSZWN0LnRvcCArIDI0KVxuICAgICkge1xuICAgICAgc2hvd2VkRWxlbWVudD8uc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICAgIHRoaXMuYXZhVHJlZVdyYXBwZXI/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG8oeyBsZWZ0OiAwIH0pO1xuICAgICAgaWYgKHRoaXMubW9kZVZpZXcgPT09IE1vZGVWaWV3VHlwZS5UYWJsZSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY29ycmVjdFNjcm9sbFRhYmxlTGluZShzaG93ZWRFbGVtZW50LCBwYXJlbnRSZWN0KSwgMCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb3JyZWN0U2Nyb2xsVGFibGVMaW5lKHNob3dlZEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBwYXJlbnRSZWN0OiBET01SZWN0KTogdm9pZCB7XG4gICAgY29uc3QgY2hpbGRSZWN0ID0gc2hvd2VkRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAoY2hpbGRSZWN0LnRvcCA8IHBhcmVudFJlY3QudG9wICsgMjQpIHtcbiAgICAgIHRoaXMuYXZhVHJlZVdyYXBwZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgLT0gMjQ7XG4gICAgfVxuICB9XG5cbiAgZXhwYW5kUGFyZW50R3JvdXBzKGVsZW1lbnQ6IElFbGVtZW50RHRvKTogdm9pZCB7XG4gICAgdGhpcy5leHBhbmRQYXJlbnRHcm91cFNlcnZpY2UuZXhwYW5kUGFyZW50R3JvdXBzKGVsZW1lbnQsIHRoaXMuZmxhdEVsZW1lbnRzLCB0aGlzLmV4cGFuc2lvblN0YXRlKTtcbiAgfVxuXG4gIG9uRmlsdGVyKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLiRmaWx0ZXIubmV4dCh2YWx1ZSk7XG4gIH1cblxuICBjaGFuZ2VBbGxFbGVtZW50c0V4cGFuc2lvblN0YXR1cyhpc0V4cGFuZGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFpc0V4cGFuZGVkKSB7XG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmV4cGFuc2lvblN0YXRlKS5mb3JFYWNoKChpZDogc3RyaW5nKSA9PiBkZWxldGUgdGhpcy5leHBhbnNpb25TdGF0ZVtpZF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZsYXRFbGVtZW50cz8uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5lbGVtZW50VHlwZURpc2NyaW1pbmF0b3IgPT09ICdTZXJ2aWNlU3BlY2lmaWNhdGlvbkdyb3VwRHRvJykge1xuICAgICAgICAgIHRoaXMuZXhwYW5zaW9uU3RhdGVbaXRlbS5pZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvcm1TZWxlY3RpbmdMaXN0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNFbWl0ZVNlbGVjdGVkRWxlbWVudHMgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuaW5pdGlhbGx5U2VsZWN0ZWRFbGVtZW50cykge1xuICAgICAgdGhpcy5pc0VtaXRlU2VsZWN0ZWRFbGVtZW50cyA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50cmVlTm9kZVNlbGVjdGlvblNlcnZpY2UuZ2V0RmxhdFNlbGVjdGVkTGlzdElkKHRoaXMuaW5pdGlhbGx5U2VsZWN0ZWRFbGVtZW50cyk7XG4gICAgdGhpcy50cmVlTm9kZVNlbGVjdGlvblNlcnZpY2UuZmxhdFNlbGVjdGVkTGlzdElkLmZvckVhY2goKGlkLCBpbmRleCkgPT4ge1xuICAgICAgdGhpcy50cmVlTm9kZVNlbGVjdGlvblNlcnZpY2UuY2hhbmdlU2VsZWN0aW5nKHRydWUsIGlkKTtcbiAgICAgIGlmIChpbmRleCA9PT0gdGhpcy50cmVlTm9kZVNlbGVjdGlvblNlcnZpY2UuZmxhdFNlbGVjdGVkTGlzdElkLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgdGhpcy5pc0VtaXRlU2VsZWN0ZWRFbGVtZW50cyA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZWxlY3RPckRlc2VsZWN0QWxsKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy50cmVlTm9kZVNlbGVjdGlvblNlcnZpY2UuY2hhbmdlQWxsKHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RmlsdGVyZWRMaXN0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZsYXRFbGVtZW50cz8ubGVuZ3RoKSB7XG4gICAgICBpZiAoIXRoaXMuZmlsdGVyKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRFbGVtZW50TGlzdCA9IHRoaXMuZmxhdEVsZW1lbnRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5maWx0ZXJlZEVsZW1lbnRMaXN0ID0gdGhpcy5mbGF0RWxlbWVudHMuZmlsdGVyKChpdGVtKSA9PiB0aGlzLmZsYXRFbGVtZW50c1NlcnZpY2UuY2hlY2tGaWx0ZXJWYWx1ZShpdGVtLCB0aGlzLmZpbHRlcikpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUV2ZW50TGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGZyb21FdmVudCh0aGlzLmF2YU1haW5XcmFwcGVyLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWxlYXZlJylcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuJGRlc3Ryb3kpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm1vdXNlT3V0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICBmcm9tRXZlbnQodGhpcy5hdmFNYWluV3JhcHBlci5uYXRpdmVFbGVtZW50LCAnbW91c2VlbnRlcicpXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLiRkZXN0cm95KSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5tb3VzZU92ZXIoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGlmICghdGhpcy5pc1NlbGVjdGlvbk1vZGUpIHtcbiAgICAgICAgZnJvbUV2ZW50KGRvY3VtZW50LCAna2V5ZG93bicpXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy4kZGVzdHJveSksXG4gICAgICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMubW91c2VBd2FyZUtleWJvYXJkQ29udHJvbCB8fCB0aGlzLmlzTGlzdGVuS2V5Ym9hcmQpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVHbG9iYWxLZXlib2FyZEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cIm1haW4td3JhcHBlclwiXG4gICNhdmFNYWluV3JhcHBlclxuPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJjb250cm9sXCJcbiAgICAjY29udHJvbFxuICA+XG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiY29udHJvbC1maWx0ZXJcIj5cbiAgICAgIDxtYXQtbGFiZWw+e3sgdGV4dFdvcmRzPy50ZXh0U2VhcmNoIH19PC9tYXQtbGFiZWw+XG4gICAgICA8aW5wdXRcbiAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgW25nTW9kZWxdPVwiZmlsdGVySW5wdXRcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZpbHRlcigkZXZlbnQpXCJcbiAgICAgICAgI2F2YVRyZWVGaWx0ZXJJbnB1dFxuICAgICAgLz5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlVmlldyA9PT0gbGlzdE1vZGVWaWV3VHlwZS5UcmVlXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiY29udHJvbC1pY29uXCJcbiAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgIChjbGljayk9XCJjaGFuZ2VBbGxFbGVtZW50c0V4cGFuc2lvblN0YXR1cyh0cnVlKVwiXG4gICAgICAgIFttYXRUb29sdGlwXT1cInRleHRXb3Jkcz8udG9vbHRpcEFsbE9wZW4gfHwgJydcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJsYXllci1iYWNrZ3JvdW5kXCI+bGF5ZXJzPC9tYXQtaWNvbj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibGF5ZXItaWNvblwiPmFkZDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJjb250cm9sLWljb25cIlxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgKGNsaWNrKT1cImNoYW5nZUFsbEVsZW1lbnRzRXhwYW5zaW9uU3RhdHVzKGZhbHNlKVwiXG4gICAgICAgIFttYXRUb29sdGlwXT1cInRleHRXb3Jkcz8udG9vbHRpcEFsbENsb3NlIHx8ICcnXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibGF5ZXItYmFja2dyb3VuZFwiPmxheWVyczwvbWF0LWljb24+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImxheWVyLWljb25cIj5yZW1vdmU8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzU2VsZWN0aW9uTW9kZVwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAoY2xpY2spPVwic2VsZWN0T3JEZXNlbGVjdEFsbCh0cnVlKVwiXG4gICAgICAgIFttYXRUb29sdGlwXT1cInRleHRXb3Jkcz8udG9vbHRpcEFsbEFkZCB8fCAnJ1wiXG4gICAgICAgIGNsYXNzPVwiY29udHJvbC1idXR0b25cIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgPHNwYW4+e3sgdGV4dFdvcmRzPy50ZXh0QWxsIH19PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgIChjbGljayk9XCJzZWxlY3RPckRlc2VsZWN0QWxsKGZhbHNlKVwiXG4gICAgICAgIFttYXRUb29sdGlwXT1cInRleHRXb3Jkcz8udG9vbHRpcEFsbFJlbW92ZSB8fCAnJ1wiXG4gICAgICAgIGNsYXNzPVwiY29udHJvbC1idXR0b25cIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24+cmVtb3ZlPC9tYXQtaWNvbj5cbiAgICAgICAgPHNwYW4+e3sgdGV4dFdvcmRzPy50ZXh0QWxsIH19PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgW3N0eWxlLmhlaWdodF09XCInY2FsYygxMDAlIC0gJyArIGNvbnRyb2wub2Zmc2V0SGVpZ2h0ICsgJ3B4KSdcIlxuICAgIGNsYXNzPVwiYXZhLXRyZWUtd3JhcHBlclwiXG4gICAgI2F2YVRyZWVXcmFwcGVyXG4gID5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmxhdEVsZW1lbnRzPy5sZW5ndGg7IGVsc2Ugbm90aGluZ1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlcmVkRWxlbWVudExpc3Q/Lmxlbmd0aDsgZWxzZSBub3RoaW5nRmlsdGVyZWRcIj5cbiAgICAgICAgPGF2YS10cmVlLXN0cnVjdHVyZVxuICAgICAgICAgICpuZ0lmPVwibW9kZVZpZXcgPT09IGxpc3RNb2RlVmlld1R5cGUuVHJlZSAmJiAhYXZhVHJlZUZpbHRlcklucHV0LnZhbHVlXCJcbiAgICAgICAgICBbc2VydmljZVNwZWNpZmljYXRpb25dPVwic2VydmljZVNwZWNpZmljYXRpb25cIlxuICAgICAgICAgIFtpbmRlbnRdPVwiaW5kZW50XCJcbiAgICAgICAgICBbZXhwYW5zaW9uU3RhdGVdPVwiZXhwYW5zaW9uU3RhdGVcIlxuICAgICAgICAgIFtpc1NlbGVjdGlvbk1vZGVdPVwiaXNTZWxlY3Rpb25Nb2RlXCJcbiAgICAgICAgICBbc2VsZWN0ZWRDb2xvcl09XCJzZWxlY3RlZENvbG9yXCJcbiAgICAgICAgICBbYWxsb3dEYmxDbGlja109XCJhbGxvd0RibENsaWNrXCJcbiAgICAgICAgPlxuICAgICAgICA8L2F2YS10cmVlLXN0cnVjdHVyZT5cbiAgICAgICAgPGF2YS1saXN0LXN0cnVjdHVyZVxuICAgICAgICAgICpuZ0lmPVwibW9kZVZpZXcgPT09IGxpc3RNb2RlVmlld1R5cGUuTGlzdCB8fCAobW9kZVZpZXcgPT09IGxpc3RNb2RlVmlld1R5cGUuVHJlZSAmJiBhdmFUcmVlRmlsdGVySW5wdXQudmFsdWUpXCJcbiAgICAgICAgICBbZmlsdGVyZWRFbGVtZW50TGlzdF09XCJmaWx0ZXJlZEVsZW1lbnRMaXN0XCJcbiAgICAgICAgICBbaXNTZWxlY3Rpb25Nb2RlXT1cImlzU2VsZWN0aW9uTW9kZVwiXG4gICAgICAgICAgW3NlbGVjdGVkQ29sb3JdPVwic2VsZWN0ZWRDb2xvclwiXG4gICAgICAgICAgW2FsbG93RGJsQ2xpY2tdPVwiYWxsb3dEYmxDbGlja1wiXG4gICAgICAgID5cbiAgICAgICAgPC9hdmEtbGlzdC1zdHJ1Y3R1cmU+XG4gICAgICAgIDxhdmEtdGFibGUtc3RydWN0dXJlXG4gICAgICAgICAgKm5nSWY9XCJtb2RlVmlldyA9PT0gbGlzdE1vZGVWaWV3VHlwZS5UYWJsZVwiXG4gICAgICAgICAgW2ZpbHRlcmVkRWxlbWVudExpc3RdPVwiZmlsdGVyZWRFbGVtZW50TGlzdFwiXG4gICAgICAgICAgW2lzU2VsZWN0aW9uTW9kZV09XCJpc1NlbGVjdGlvbk1vZGVcIlxuICAgICAgICAgIFthZGRUYWJsZUNvbHVtbnNdPVwiYWRkVGFibGVDb2x1bW5zXCJcbiAgICAgICAgICBbc2VsZWN0ZWRDb2xvcl09XCJzZWxlY3RlZENvbG9yXCJcbiAgICAgICAgICBbYWxsb3dEYmxDbGlja109XCJhbGxvd0RibENsaWNrXCJcbiAgICAgICAgPlxuICAgICAgICA8L2F2YS10YWJsZS1zdHJ1Y3R1cmU+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjbm90aGluZz5cbiAge3sgdGV4dFdvcmRzPy50ZXh0Tm90aGluZyB9fVxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjbm90aGluZ0ZpbHRlcmVkPlxuICB7eyB0ZXh0V29yZHM/LnRleHROb3RoaW5nRmlsdGVyZWQgfX1cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|