@smartbit4all/ng-client 3.3.129 → 3.3.130

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.
@@ -4,6 +4,7 @@ import { SmartFormWidgetDirection, } from '../smart-form/projects';
4
4
  import { GridUiActionType, SmartLayoutDef, } from '../smart-grid/projects';
5
5
  import { ExpandableSectionComponent, } from '../smart-expandable-section/projects';
6
6
  import { Subject, takeUntil } from 'rxjs';
7
+ import { deepEqual } from 'fast-equals';
7
8
  import * as i0 from "@angular/core";
8
9
  import * as i1 from "../smart-form/projects";
9
10
  import * as i2 from "../smart-expandable-section/expandable-section.component";
@@ -59,15 +60,20 @@ export class SmartComponentLayoutComponent {
59
60
  this._destroy$.complete();
60
61
  }
61
62
  ngOnChanges(changes) {
62
- this.smartComponentLayout = changes['smartComponentLayout'].currentValue;
63
- if (this.smartComponentLayout) {
64
- this.setUp();
63
+ if (deepEqual(this.smartComponentLayout, this.currentLayout)) {
64
+ // no layout change, keep current state
65
+ }
66
+ else {
67
+ // layout changed, render
68
+ this.currentLayout = JSON.parse(JSON.stringify(this.smartComponentLayout));
69
+ if (this.smartComponentLayout) {
70
+ this.setUp();
71
+ }
65
72
  }
66
73
  }
67
74
  setUp() {
68
- this.parent = this.smartComponentLayout?.parentComponent;
69
- this.uuid = this.parent.uuid;
70
- this.treeService = this.parent.smartTreeService;
75
+ this.uuid = this.parentSmartComponent.uuid;
76
+ this.treeService = this.parentSmartComponent.smartTreeService;
71
77
  this.smartComponentLayout?.direction;
72
78
  if (this.smartComponentLayout?.expandable) {
73
79
  this.constructExpandableSection();
@@ -90,7 +96,8 @@ export class SmartComponentLayoutComponent {
90
96
  this.constructToolbar();
91
97
  }
92
98
  if (!this.parentLayoutComponent) {
93
- this.parent.initActions();
99
+ // only top level component should call init actions
100
+ this.parentSmartComponent.initActions();
94
101
  }
95
102
  }
96
103
  }
@@ -113,7 +120,7 @@ export class SmartComponentLayoutComponent {
113
120
  });
114
121
  this.smartForm = {
115
122
  direction: this.getFormLayout(),
116
- componentModel: this.parent?.model,
123
+ componentModel: this.parentSmartComponent?.model,
117
124
  widgets,
118
125
  };
119
126
  this.bindForm();
@@ -133,11 +140,11 @@ export class SmartComponentLayoutComponent {
133
140
  }
134
141
  }
135
142
  bindForm() {
136
- if (this.parent?.useQueryLists) {
143
+ if (this.parentSmartComponent?.useQueryLists) {
137
144
  return;
138
145
  }
139
146
  if (this.smartForm && this.smartFormComponent) {
140
- this.parent?.addForm(
147
+ this.parentSmartComponent?.addForm(
141
148
  // unique identifier for the form
142
149
  `form_${this.makeid(5)}`, this.smartForm, this.smartFormComponent);
143
150
  }
@@ -174,11 +181,11 @@ export class SmartComponentLayoutComponent {
174
181
  }
175
182
  }
176
183
  bindGrid() {
177
- if (this.parent?.useQueryLists) {
184
+ if (this.parentSmartComponent?.useQueryLists) {
178
185
  return;
179
186
  }
180
187
  if (this.smartGrid && this.smartGridComponent) {
181
- this.smartGrid = this.parent?.addGrid(this.smartGrid, {
188
+ this.smartGrid = this.parentSmartComponent?.addGrid(this.smartGrid, {
182
189
  rowUiActionType: GridUiActionType.POPUP_MENU,
183
190
  }, false, this.smartGridComponent);
184
191
  }
@@ -199,10 +206,10 @@ export class SmartComponentLayoutComponent {
199
206
  // TODO
200
207
  }
201
208
  constructTree() {
202
- if (this.parent?.useQueryLists) {
209
+ if (this.parentSmartComponent?.useQueryLists) {
203
210
  return;
204
211
  }
205
- this.parent.setUpDefaultTree(this.smartComponentLayout?.widget?.identifier);
212
+ this.parentSmartComponent.setUpDefaultTree(this.smartComponentLayout?.widget?.identifier);
206
213
  this.treeService?.initialize();
207
214
  }
208
215
  constructToolbar() {
@@ -213,14 +220,16 @@ export class SmartComponentLayoutComponent {
213
220
  }
214
221
  }
215
222
  SmartComponentLayoutComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SmartComponentLayoutComponent, deps: [{ token: i1.SmartformLayoutDefinitionService }], target: i0.ɵɵFactoryTarget.Component });
216
- SmartComponentLayoutComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: SmartComponentLayoutComponent, selector: "smart-component-layout", inputs: { smartComponentLayout: "smartComponentLayout", parentLayoutComponent: "parentLayoutComponent" }, viewQueries: [{ propertyName: "smartFormList", predicate: ["form"], descendants: true }, { propertyName: "smartGridList", predicate: ["grid"], descendants: true }, { propertyName: "smartFilterList", predicate: ["filter"], descendants: true }, { propertyName: "toolbarList", predicate: ["toolbar"], descendants: true }, { propertyName: "expandableComponents", predicate: ExpandableSectionComponent, descendants: true }, { propertyName: "components", predicate: SmartComponentLayoutComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"smartComponentLayout?.expandable; then expandable; else normal\"> </div>\r\n\r\n<ng-template #expandable>\r\n <smart-expandable-section\r\n *ngIf=\"expandableSection\"\r\n [data]=\"expandableSection\"\r\n ></smart-expandable-section>\r\n</ng-template>\r\n\r\n<ng-template #normal>\r\n <div\r\n *ngIf=\"smartComponentLayout?.type === type().CONTAINER\"\r\n [ngClass]=\"smartComponentLayout?.direction ?? 'vertical'\"\r\n >\r\n <smart-component-layout\r\n *ngFor=\"let layout of smartComponentLayout?.components\"\r\n [parentLayoutComponent]=\"this\"\r\n [smartComponentLayout]=\"layout\"\r\n ></smart-component-layout>\r\n </div>\r\n <smartform *ngIf=\"smartForm\" #form [smartForm]=\"smartForm\"></smartform>\r\n <smart-grid *ngIf=\"smartGrid\" #grid [smartGrid]=\"smartGrid\" [uuid]=\"uuid!\"></smart-grid>\r\n <!-- <smart-filter #filter [filter]=\"smartFilter\"></smart-filter> -->\r\n <smart-tree *ngIf=\"treeService\" [treeService]=\"treeService!\"></smart-tree>\r\n <smart-ui-action-toolbar *ngIf=\"!!toolbarId\" #toolbar [id]=\"toolbarId\"></smart-ui-action-toolbar>\r\n</ng-template>\r\n", styles: [".horizontal{display:flex;flex-direction:row}.vertical{display:flex;flex-direction:column}\n"], components: [{ type: i2.ExpandableSectionComponent, selector: "smart-expandable-section", inputs: ["data", "index"] }, { type: SmartComponentLayoutComponent, selector: "smart-component-layout", inputs: ["smartComponentLayout", "parentLayoutComponent"] }, { type: i3.SmartformComponent, selector: "smartform", inputs: ["smartForm"] }, { type: i4.SmartGridComponent, selector: "smart-grid", inputs: ["smartGrid", "uuid", "dev"] }, { type: i5.SmartTreeComponent, selector: "smart-tree", inputs: ["treeStyle", "treeService"] }, { type: i6.UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: ["uiActionModels", "uiActionDescriptorService", "id"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
223
+ SmartComponentLayoutComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: SmartComponentLayoutComponent, selector: "smart-component-layout", inputs: { smartComponentLayout: "smartComponentLayout", parentLayoutComponent: "parentLayoutComponent", parentSmartComponent: "parentSmartComponent" }, viewQueries: [{ propertyName: "smartFormList", predicate: ["form"], descendants: true }, { propertyName: "smartGridList", predicate: ["grid"], descendants: true }, { propertyName: "smartFilterList", predicate: ["filter"], descendants: true }, { propertyName: "toolbarList", predicate: ["toolbar"], descendants: true }, { propertyName: "expandableComponents", predicate: ExpandableSectionComponent, descendants: true }, { propertyName: "components", predicate: SmartComponentLayoutComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"smartComponentLayout?.expandable; then expandable; else normal\"> </div>\r\n\r\n<ng-template #expandable>\r\n <smart-expandable-section\r\n *ngIf=\"expandableSection\"\r\n [data]=\"expandableSection\"\r\n ></smart-expandable-section>\r\n</ng-template>\r\n\r\n<ng-template #normal>\r\n <div\r\n *ngIf=\"smartComponentLayout?.type === type().CONTAINER\"\r\n [ngClass]=\"smartComponentLayout?.direction ?? 'vertical'\"\r\n >\r\n <smart-component-layout\r\n *ngFor=\"let layout of smartComponentLayout?.components\"\r\n [parentSmartComponent]=\"parentSmartComponent\"\r\n [parentLayoutComponent]=\"this\"\r\n [smartComponentLayout]=\"layout\"\r\n ></smart-component-layout>\r\n </div>\r\n <smartform *ngIf=\"smartForm\" #form [smartForm]=\"smartForm\"></smartform>\r\n <smart-grid *ngIf=\"smartGrid\" #grid [smartGrid]=\"smartGrid\" [uuid]=\"uuid!\"></smart-grid>\r\n <!-- <smart-filter #filter [filter]=\"smartFilter\"></smart-filter> -->\r\n <smart-tree *ngIf=\"treeService\" [treeService]=\"treeService!\"></smart-tree>\r\n <smart-ui-action-toolbar *ngIf=\"!!toolbarId\" #toolbar [id]=\"toolbarId\"></smart-ui-action-toolbar>\r\n</ng-template>\r\n", styles: [".horizontal{display:flex;flex-direction:row}.vertical{display:flex;flex-direction:column}\n"], components: [{ type: i2.ExpandableSectionComponent, selector: "smart-expandable-section", inputs: ["data", "index"] }, { type: SmartComponentLayoutComponent, selector: "smart-component-layout", inputs: ["smartComponentLayout", "parentLayoutComponent", "parentSmartComponent"] }, { type: i3.SmartformComponent, selector: "smartform", inputs: ["smartForm"] }, { type: i4.SmartGridComponent, selector: "smart-grid", inputs: ["smartGrid", "uuid", "dev"] }, { type: i5.SmartTreeComponent, selector: "smart-tree", inputs: ["treeStyle", "treeService"] }, { type: i6.UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: ["uiActionModels", "uiActionDescriptorService", "id"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
217
224
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SmartComponentLayoutComponent, decorators: [{
218
225
  type: Component,
219
- args: [{ selector: 'smart-component-layout', template: "<div *ngIf=\"smartComponentLayout?.expandable; then expandable; else normal\"> </div>\r\n\r\n<ng-template #expandable>\r\n <smart-expandable-section\r\n *ngIf=\"expandableSection\"\r\n [data]=\"expandableSection\"\r\n ></smart-expandable-section>\r\n</ng-template>\r\n\r\n<ng-template #normal>\r\n <div\r\n *ngIf=\"smartComponentLayout?.type === type().CONTAINER\"\r\n [ngClass]=\"smartComponentLayout?.direction ?? 'vertical'\"\r\n >\r\n <smart-component-layout\r\n *ngFor=\"let layout of smartComponentLayout?.components\"\r\n [parentLayoutComponent]=\"this\"\r\n [smartComponentLayout]=\"layout\"\r\n ></smart-component-layout>\r\n </div>\r\n <smartform *ngIf=\"smartForm\" #form [smartForm]=\"smartForm\"></smartform>\r\n <smart-grid *ngIf=\"smartGrid\" #grid [smartGrid]=\"smartGrid\" [uuid]=\"uuid!\"></smart-grid>\r\n <!-- <smart-filter #filter [filter]=\"smartFilter\"></smart-filter> -->\r\n <smart-tree *ngIf=\"treeService\" [treeService]=\"treeService!\"></smart-tree>\r\n <smart-ui-action-toolbar *ngIf=\"!!toolbarId\" #toolbar [id]=\"toolbarId\"></smart-ui-action-toolbar>\r\n</ng-template>\r\n", styles: [".horizontal{display:flex;flex-direction:row}.vertical{display:flex;flex-direction:column}\n"] }]
226
+ args: [{ selector: 'smart-component-layout', template: "<div *ngIf=\"smartComponentLayout?.expandable; then expandable; else normal\"> </div>\r\n\r\n<ng-template #expandable>\r\n <smart-expandable-section\r\n *ngIf=\"expandableSection\"\r\n [data]=\"expandableSection\"\r\n ></smart-expandable-section>\r\n</ng-template>\r\n\r\n<ng-template #normal>\r\n <div\r\n *ngIf=\"smartComponentLayout?.type === type().CONTAINER\"\r\n [ngClass]=\"smartComponentLayout?.direction ?? 'vertical'\"\r\n >\r\n <smart-component-layout\r\n *ngFor=\"let layout of smartComponentLayout?.components\"\r\n [parentSmartComponent]=\"parentSmartComponent\"\r\n [parentLayoutComponent]=\"this\"\r\n [smartComponentLayout]=\"layout\"\r\n ></smart-component-layout>\r\n </div>\r\n <smartform *ngIf=\"smartForm\" #form [smartForm]=\"smartForm\"></smartform>\r\n <smart-grid *ngIf=\"smartGrid\" #grid [smartGrid]=\"smartGrid\" [uuid]=\"uuid!\"></smart-grid>\r\n <!-- <smart-filter #filter [filter]=\"smartFilter\"></smart-filter> -->\r\n <smart-tree *ngIf=\"treeService\" [treeService]=\"treeService!\"></smart-tree>\r\n <smart-ui-action-toolbar *ngIf=\"!!toolbarId\" #toolbar [id]=\"toolbarId\"></smart-ui-action-toolbar>\r\n</ng-template>\r\n", styles: [".horizontal{display:flex;flex-direction:row}.vertical{display:flex;flex-direction:column}\n"] }]
220
227
  }], ctorParameters: function () { return [{ type: i1.SmartformLayoutDefinitionService }]; }, propDecorators: { smartComponentLayout: [{
221
228
  type: Input
222
229
  }], parentLayoutComponent: [{
223
230
  type: Input
231
+ }], parentSmartComponent: [{
232
+ type: Input
224
233
  }], smartFormList: [{
225
234
  type: ViewChildren,
226
235
  args: ['form']
@@ -240,4 +249,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
240
249
  type: ViewChildren,
241
250
  args: [SmartComponentLayoutComponent]
242
251
  }] } });
243
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY29tcG9uZW50LWxheW91dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi9zbWFydC1jb21wb25lbnQtbGF5b3V0L3NtYXJ0LWNvbXBvbmVudC1sYXlvdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtbmctY2xpZW50L3NyYy9saWIvc21hcnQtY29tcG9uZW50LWxheW91dC9zbWFydC1jb21wb25lbnQtbGF5b3V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsS0FBSyxFQU9MLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsYUFBYSxFQUNiLG1CQUFtQixFQUNuQixlQUFlLEdBRWhCLE1BQU0sT0FBTyxDQUFDO0FBQ2YsT0FBTyxFQUVMLHdCQUF3QixHQUd6QixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFDTCxnQkFBZ0IsRUFHaEIsY0FBYyxHQUNmLE1BQU0sd0JBQXdCLENBQUM7QUFHaEMsT0FBTyxFQUVMLDBCQUEwQixHQUMzQixNQUFNLHNDQUFzQyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7QUFRMUMsTUFBTSxPQUFPLDZCQUE2QjtJQXVDeEMsWUFBb0IsYUFBK0M7UUFBL0Msa0JBQWEsR0FBYixhQUFhLENBQWtDO1FBdEN6RCxjQUFTLEdBQWtCLElBQUksT0FBTyxFQUFFLENBQUM7SUFzQ21CLENBQUM7SUFFdkUsZUFBZTtRQUNiLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUU7WUFDN0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDbEQ7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Qiw2QkFBNkIscUVDaEY3Qyxnb0NBMEJBLDBPRGtCYSw2QkFBNkI7MkZBQTdCLDZCQUE2QjtrQkFMekMsU0FBUzsrQkFDRSx3QkFBd0I7dUhBT3pCLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBS04sYUFBYTtzQkFEWixZQUFZO3VCQUFDLE1BQU07Z0JBTXBCLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxNQUFNO2dCQU1wQixlQUFlO3NCQURkLFlBQVk7dUJBQUMsUUFBUTtnQkFNdEIsV0FBVztzQkFEVixZQUFZO3VCQUFDLFNBQVM7Z0JBV3ZCLG9CQUFvQjtzQkFEbkIsWUFBWTt1QkFBQywwQkFBMEI7Z0JBSXhDLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyw2QkFBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFZpZXdDaGlsZCxcclxuICBWaWV3Q2hpbGRyZW4sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgQ29tcG9uZW50VHlwZSxcclxuICBDb21wb25lbnRXaWRnZXRUeXBlLFxyXG4gIExheW91dERpcmVjdGlvbixcclxuICBTbWFydENvbXBvbmVudExheW91dERlZmluaXRpb24sXHJcbn0gZnJvbSAnLi9hcGknO1xyXG5pbXBvcnQge1xyXG4gIFNtYXJ0Rm9ybSxcclxuICBTbWFydEZvcm1XaWRnZXREaXJlY3Rpb24sXHJcbiAgU21hcnRmb3JtQ29tcG9uZW50LFxyXG4gIFNtYXJ0Zm9ybUxheW91dERlZmluaXRpb25TZXJ2aWNlLFxyXG59IGZyb20gJy4uL3NtYXJ0LWZvcm0vcHJvamVjdHMnO1xyXG5pbXBvcnQge1xyXG4gIEdyaWRVaUFjdGlvblR5cGUsXHJcbiAgU21hcnRHcmlkLFxyXG4gIFNtYXJ0R3JpZENvbXBvbmVudCxcclxuICBTbWFydExheW91dERlZixcclxufSBmcm9tICcuLi9zbWFydC1ncmlkL3Byb2plY3RzJztcclxuaW1wb3J0IHsgU21hcnRGaWx0ZXIsIFNtYXJ0RmlsdGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vc21hcnQtZmlsdGVyL3Byb2plY3RzJztcclxuaW1wb3J0IHsgU21hcnR0cmVlR2VuZXJpY1NlcnZpY2UgfSBmcm9tICcuLi9zbWFydC10cmVlL3Byb2plY3RzJztcclxuaW1wb3J0IHtcclxuICBFeHBhbmRhYmxlU2VjdGlvbixcclxuICBFeHBhbmRhYmxlU2VjdGlvbkNvbXBvbmVudCxcclxufSBmcm9tICcuLi9zbWFydC1leHBhbmRhYmxlLXNlY3Rpb24vcHJvamVjdHMnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vdmlldy1jb250ZXh0L3Byb2plY3RzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc21hcnQtY29tcG9uZW50LWxheW91dCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3NtYXJ0LWNvbXBvbmVudC1sYXlvdXQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3NtYXJ0LWNvbXBvbmVudC1sYXlvdXQuY29tcG9uZW50LmNzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU21hcnRDb21wb25lbnRMYXlvdXRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XHJcbiAgcHJvdGVjdGVkIF9kZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIEBJbnB1dCgpIHNtYXJ0Q29tcG9uZW50TGF5b3V0PzogU21hcnRDb21wb25lbnRMYXlvdXREZWZpbml0aW9uO1xyXG4gIEBJbnB1dCgpIHBhcmVudExheW91dENvbXBvbmVudD86IFNtYXJ0Q29tcG9uZW50TGF5b3V0Q29tcG9uZW50O1xyXG5cclxuICB1dWlkPzogc3RyaW5nO1xyXG5cclxuICBAVmlld0NoaWxkcmVuKCdmb3JtJylcclxuICBzbWFydEZvcm1MaXN0ITogUXVlcnlMaXN0PFNtYXJ0Zm9ybUNvbXBvbmVudD47XHJcbiAgc21hcnRGb3JtQ29tcG9uZW50PzogU21hcnRmb3JtQ29tcG9uZW50O1xyXG4gIHNtYXJ0Rm9ybT86IFNtYXJ0Rm9ybTtcclxuXHJcbiAgQFZpZXdDaGlsZHJlbignZ3JpZCcpXHJcbiAgc21hcnRHcmlkTGlzdCE6IFF1ZXJ5TGlzdDxTbWFydEdyaWRDb21wb25lbnQ+O1xyXG4gIHNtYXJ0R3JpZENvbXBvbmVudD86IFNtYXJ0R3JpZENvbXBvbmVudDtcclxuICBzbWFydEdyaWQ/OiBTbWFydEdyaWQ7XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oJ2ZpbHRlcicpXHJcbiAgc21hcnRGaWx0ZXJMaXN0ITogUXVlcnlMaXN0PFNtYXJ0RmlsdGVyQ29tcG9uZW50PjtcclxuICBzbWFydEZpbHRlckNvbXBvbmVudD86IFNtYXJ0RmlsdGVyQ29tcG9uZW50O1xyXG4gIHNtYXJ0RmlsdGVyPzogU21hcnRGaWx0ZXI7XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oJ3Rvb2xiYXInKVxyXG4gIHRvb2xiYXJMaXN0ITogUXVlcnlMaXN0PFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudD47XHJcbiAgdG9vbGJhcj86IFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudDtcclxuICB0b29sYmFySWQ/OiBzdHJpbmc7XHJcblxyXG4gIHBhcmVudD86IGFueTsgLy9TbWFydENvbXBvbmVudDxhbnk+XHJcbiAgdHJlZVNlcnZpY2U/OiBTbWFydHRyZWVHZW5lcmljU2VydmljZTtcclxuXHJcbiAgZXhwYW5kYWJsZVNlY3Rpb24/OiBFeHBhbmRhYmxlU2VjdGlvbjxTbWFydENvbXBvbmVudExheW91dERlZmluaXRpb24+O1xyXG5cclxuICBAVmlld0NoaWxkcmVuKEV4cGFuZGFibGVTZWN0aW9uQ29tcG9uZW50KVxyXG4gIGV4cGFuZGFibGVDb21wb25lbnRzITogUXVlcnlMaXN0PEV4cGFuZGFibGVTZWN0aW9uQ29tcG9uZW50PjtcclxuXHJcbiAgQFZpZXdDaGlsZHJlbihTbWFydENvbXBvbmVudExheW91dENvbXBvbmVudClcclxuICBjb21wb25lbnRzITogUXVlcnlMaXN0PFNtYXJ0Q29tcG9uZW50TGF5b3V0Q29tcG9uZW50PjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBsYXlvdXRTZXJ2aWNlOiBTbWFydGZvcm1MYXlvdXREZWZpbml0aW9uU2VydmljZSkge31cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc21hcnRGb3JtTGlzdD8uZmlyc3QpIHtcclxuICAgICAgdGhpcy5zZXRGb3JtQ29tcG9uZW50KHRoaXMuc21hcnRGb3JtTGlzdD8uZmlyc3QpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zbWFydEZvcm1MaXN0LmNoYW5nZXNcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgobGlzdDogUXVlcnlMaXN0PFNtYXJ0Zm9ybUNvbXBvbmVudD4pID0+IHtcclxuICAgICAgICB0aGlzLnNldEZvcm1Db21wb25lbnQobGlzdC5maXJzdCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIGlmICh0aGlzLnNtYXJ0R3JpZExpc3Q/LmZpcnN0KSB7XHJcbiAgICAgIHRoaXMuc2V0R3JpZENvbXBvbmVudCh0aGlzLnNtYXJ0R3JpZExpc3Q/LmZpcnN0KTtcclxuICAgIH1cclxuICAgIHRoaXMuc21hcnRHcmlkTGlzdC5jaGFuZ2VzXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGxpc3Q6IFF1ZXJ5TGlzdDxTbWFydEdyaWRDb21wb25lbnQ+KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXRHcmlkQ29tcG9uZW50KGxpc3QuZmlyc3QpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNtYXJ0RmlsdGVyTGlzdC5jaGFuZ2VzXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGxpc3Q6IFF1ZXJ5TGlzdDxTbWFydEZpbHRlckNvbXBvbmVudD4pID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuc21hcnRGaWx0ZXJDb21wb25lbnQpIHtcclxuICAgICAgICAgIHRoaXMuc21hcnRGaWx0ZXJDb21wb25lbnQgPSBsaXN0LmZpcnN0O1xyXG4gICAgICAgICAgdGhpcy5iaW5kRmlsdGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy50b29sYmFyTGlzdD8uZmlyc3QpIHtcclxuICAgICAgdGhpcy5zZXRUb29sYmFyQ29tcG9uZW50KHRoaXMudG9vbGJhckxpc3Q/LmZpcnN0KTtcclxuICAgIH1cclxuICAgIHRoaXMudG9vbGJhckxpc3QuY2hhbmdlc1xyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChsaXN0OiBRdWVyeUxpc3Q8VWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50PikgPT4ge1xyXG4gICAgICAgIHRoaXMuc2V0VG9vbGJhckNvbXBvbmVudChsaXN0LmZpcnN0KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuc21hcnRDb21wb25lbnRMYXlvdXQpIHtcclxuICAgICAgdGhpcy5zZXRVcCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgdGhpcy5zbWFydENvbXBvbmVudExheW91dCA9IGNoYW5nZXNbJ3NtYXJ0Q29tcG9uZW50TGF5b3V0J10uY3VycmVudFZhbHVlO1xyXG5cclxuICAgIGlmICh0aGlzLnNtYXJ0Q29tcG9uZW50TGF5b3V0KSB7XHJcbiAgICAgIHRoaXMuc2V0VXAoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VXAoKTogdm9pZCB7XHJcbiAgICB0aGlzLnBhcmVudCA9IHRoaXMuc21hcnRDb21wb25lbnRMYXlvdXQ/LnBhcmVudENvbXBvbmVudCBhcyBhbnk7XHJcbiAgICB0aGlzLnV1aWQgPSB0aGlzLnBhcmVudC51dWlkO1xyXG4gICAgdGhpcy50cmVlU2VydmljZSA9IHRoaXMucGFyZW50LnNtYXJ0VHJlZVNlcnZpY2U7XHJcblxyXG4gICAgdGhpcy5zbWFydENvbXBvbmVudExheW91dD8uZGlyZWN0aW9uO1xyXG5cclxuICAgIGlmICh0aGlzLnNtYXJ0Q29tcG9uZW50TGF5b3V0Py5leHBhbmRhYmxlKSB7XHJcbiAgICAgIHRoaXMuY29uc3RydWN0RXhwYW5kYWJsZVNlY3Rpb24oKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zbWFydENvbXBvbmVudExheW91dD8udHlwZSA9PT0gQ29tcG9uZW50VHlwZS5GT1JNKSB7XHJcbiAgICAgIHRoaXMuY29uc3RydWN0Rm9ybSgpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnNtYXJ0Q29tcG9uZW50TGF5b3V0Py50eXBlID09PSBDb21wb25lbnRUeXBlLldJREdFVCkge1xyXG4gICAgICBpZiAodGhpcy5zbWFydENvbXBvbmVudExheW91dC53aWRnZXQ/LnR5cGUgPT09IENvbXBvbmVudFdpZGdldFR5cGUuR1JJRCkge1xyXG4gICAgICAgIHRoaXMuY29uc3RydWN0R3JpZCgpO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc21hcnRDb21wb25lbnRMYXlvdXQud2lkZ2V0Py50eXBlID09PSBDb21wb25lbnRXaWRnZXRUeXBlLkZJTFRFUikge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignQ29tcG9uZW50V2lkZ2V0VHlwZS5GSUxURVIgaXMgbm90IHN1cHBvcnRlZCcpO1xyXG4gICAgICAgIC8vIHRoaXMuY29uc3RydWN0RmlsdGVyKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zbWFydENvbXBvbmVudExheW91dC53aWRnZXQ/LnR5cGUgPT09IENvbXBvbmVudFdpZGdldFR5cGUuVFJFRSkge1xyXG4gICAgICAgIHRoaXMuY29uc3RydWN0VHJlZSgpO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc21hcnRDb21wb25lbnRMYXlvdXQud2lkZ2V0Py50eXBlID09PSBDb21wb25lbnRXaWRnZXRUeXBlLlRPT0xCQVIpIHtcclxuICAgICAgICB0aGlzLmNvbnN0cnVjdFRvb2xiYXIoKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXRoaXMucGFyZW50TGF5b3V0Q29tcG9uZW50KSB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnQuaW5pdEFjdGlvbnMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdHlwZSgpOiB0eXBlb2YgQ29tcG9uZW50VHlwZSB7XHJcbiAgICByZXR1cm4gQ29tcG9uZW50VHlwZTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdEV4cGFuZGFibGVTZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgbGV0IGRhdGE6IFNtYXJ0Q29tcG9uZW50TGF5b3V0RGVmaW5pdGlvbiA9IHsgLi4udGhpcy5zbWFydENvbXBvbmVudExheW91dCEgfTtcclxuICAgIGRhdGEuZXhwYW5kYWJsZSA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMuZXhwYW5kYWJsZVNlY3Rpb24gPSB7XHJcbiAgICAgIHRpdGxlOiB0aGlzLnNtYXJ0Q29tcG9uZW50TGF5b3V0Py5leHBhbmRhYmxlU2VjdGlvbkxhYmVsID8/ICcnLFxyXG4gICAgICBkYXRhLFxyXG4gICAgICBpbnB1dE5hbWU6ICdzbWFydENvbXBvbmVudExheW91dCcsXHJcbiAgICAgIGN1c3RvbUNvbXBvbmVudDogU21hcnRDb21wb25lbnRMYXlvdXRDb21wb25lbnQsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0Rm9ybSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHdpZGdldHMgPSB0aGlzLmxheW91dFNlcnZpY2UucmVuZGVyKHtcclxuICAgICAgbGF5b3V0RGVmaW5pdGlvbnM6IHRoaXMuc21hcnRDb21wb25lbnRMYXlvdXQ/LmZvcm0sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNtYXJ0Rm9ybSA9IHtcclxuICAgICAgZGlyZWN0aW9uOiB0aGlzLmdldEZvcm1MYXlvdXQoKSxcclxuICAgICAgY29tcG9uZW50TW9kZWw6IHRoaXMucGFyZW50Py5tb2RlbCxcclxuICAgICAgd2lkZ2V0cyxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5iaW5kRm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rm9ybUxheW91dCgpOiBTbWFydEZvcm1XaWRnZXREaXJlY3Rpb24ge1xyXG4gICAgaWYgKHRoaXMuc21hcnRDb21wb25lbnRMYXlvdXQ/LmRpcmVjdGlvbikge1xyXG4gICAgICByZXR1cm4gdGhpcy5zbWFydENvbXBvbmVudExheW91dD8uZGlyZWN0aW9uID09PSBMYXlvdXREaXJlY3Rpb24uSE9SSVpPTlRBTFxyXG4gICAgICAgID8gU21hcnRGb3JtV2lkZ2V0RGlyZWN0aW9uLlJPV1xyXG4gICAgICAgIDogU21hcnRGb3JtV2lkZ2V0RGlyZWN0aW9uLkNPTDtcclxuICAgIH1cclxuICAgIHJldHVybiBTbWFydEZvcm1XaWRnZXREaXJlY3Rpb24uQ09MO1xyXG4gIH1cclxuXHJcbiAgc2V0Rm9ybUNvbXBvbmVudChjb21wOiBTbWFydGZvcm1Db21wb25lbnQpIHtcclxuICAgIGlmICghdGhpcy5zbWFydEZvcm1Db21wb25lbnQpIHtcclxuICAgICAgdGhpcy5zbWFydEZvcm1Db21wb25lbnQgPSBjb21wO1xyXG4gICAgICB0aGlzLmJpbmRGb3JtKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBiaW5kRm9ybSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnBhcmVudD8udXNlUXVlcnlMaXN0cykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zbWFydEZvcm0gJiYgdGhpcy5zbWFydEZvcm1Db21wb25lbnQpIHtcclxuICAgICAgdGhpcy5wYXJlbnQ/LmFkZEZvcm0oXHJcbiAgICAgICAgLy8gdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBmb3JtXHJcbiAgICAgICAgYGZvcm1fJHt0aGlzLm1ha2VpZCg1KX1gLFxyXG4gICAgICAgIHRoaXMuc21hcnRGb3JtLFxyXG4gICAgICAgIHRoaXMuc21hcnRGb3JtQ29tcG9uZW50XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtYWtlaWQobGVuZ3RoOiBudW1iZXIpIHtcclxuICAgIGxldCByZXN1bHQgPSAnJztcclxuICAgIGNvbnN0IGNoYXJhY3RlcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknO1xyXG4gICAgY29uc3QgY2hhcmFjdGVyc0xlbmd0aCA9IGNoYXJhY3RlcnMubGVuZ3RoO1xyXG4gICAgbGV0IGNvdW50ZXIgPSAwO1xyXG4gICAgd2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHtcclxuICAgICAgcmVzdWx0ICs9IGNoYXJhY3RlcnMuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJhY3RlcnNMZW5ndGgpKTtcclxuICAgICAgY291bnRlciArPSAxO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdEdyaWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNtYXJ0R3JpZCA9IHtcclxuICAgICAgZ3JpZElkZW50aWZpZXI6IHRoaXMuc21hcnRDb21wb25lbnRMYXlvdXQ/LndpZGdldD8uaWRlbnRpZmllciEsXHJcbiAgICAgIGdyaWRNb2RlbDoge1xyXG4gICAgICAgIHBhZ2U6IHt9LFxyXG4gICAgICB9LFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgcm93VWlBY3Rpb25UeXBlOiBHcmlkVWlBY3Rpb25UeXBlLlBPUFVQX01FTlUsXHJcbiAgICAgIH0sXHJcbiAgICAgIGxheW91dERlZjogU21hcnRMYXlvdXREZWYuVEFCTEUsXHJcbiAgICAgIHBhZ2luYXRvcjogdHJ1ZSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5iaW5kR3JpZCgpO1xyXG4gIH1cclxuXHJcbiAgc2V0R3JpZENvbXBvbmVudChjb21wOiBTbWFydEdyaWRDb21wb25lbnQpIHtcclxuICAgIGlmICghdGhpcy5zbWFydEdyaWRDb21wb25lbnQpIHtcclxuICAgICAgdGhpcy5zbWFydEdyaWRDb21wb25lbnQgPSBjb21wO1xyXG4gICAgICB0aGlzLmJpbmRHcmlkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBiaW5kR3JpZCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnBhcmVudD8udXNlUXVlcnlMaXN0cykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zbWFydEdyaWQgJiYgdGhpcy5zbWFydEdyaWRDb21wb25lbnQpIHtcclxuICAgICAgdGhpcy5zbWFydEdyaWQgPSB0aGlzLnBhcmVudD8uYWRkR3JpZChcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICByb3dVaUFjdGlvblR5cGU6IEdyaWRVaUFjdGlvblR5cGUuUE9QVVBfTUVOVSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGZhbHNlLFxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkQ29tcG9uZW50XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRUb29sYmFyQ29tcG9uZW50KGNvbXA6IFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudCkge1xyXG4gICAgdGhpcy50b29sYmFyID0gY29tcDtcclxuICB9XHJcblxyXG4gIC8vIE5PVCBVU0VELCBET0VTTidUIFdPUktcclxuICAvLyBjb25zdHJ1Y3RGaWx0ZXIoKTogdm9pZCB7XHJcbiAgLy8gICB0aGlzLnNtYXJ0RmlsdGVyID0gKHRoaXMuc21hcnRDb21wb25lbnRMYXlvdXQhLnBhcmVudENvbXBvbmVudCBhcyBhbnkpLmFkZEZpbHRlcihcclxuICAvLyAgICAgYGZpbHRlcl8ke3RoaXMubWFrZWlkKDUpfWAsXHJcbiAgLy8gICAgIHRoaXMuc21hcnRDb21wb25lbnRMYXlvdXQ/LndpZGdldD8uZmlsdGVyRXhwcmVzc2lvbkZpZWxkTGlzdCxcclxuICAvLyAgICAgdGhpcy5zbWFydENvbXBvbmVudExheW91dD8ud2lkZ2V0Py5maWx0ZXJUeXBlLFxyXG4gIC8vICAgICB0aGlzLnNtYXJ0RmlsdGVyQ29tcG9uZW50XHJcbiAgLy8gICApO1xyXG4gIC8vIH1cclxuXHJcbiAgYmluZEZpbHRlcigpOiB2b2lkIHtcclxuICAgIC8vIFRPRE9cclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdFRyZWUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5wYXJlbnQ/LnVzZVF1ZXJ5TGlzdHMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wYXJlbnQuc2V0VXBEZWZhdWx0VHJlZSh0aGlzLnNtYXJ0Q29tcG9uZW50TGF5b3V0Py53aWRnZXQ/LmlkZW50aWZpZXIpO1xyXG4gICAgdGhpcy50cmVlU2VydmljZT8uaW5pdGlhbGl6ZSgpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0VG9vbGJhcigpOiB2b2lkIHtcclxuICAgIGxldCB0b29sYmFySWQgPSB0aGlzLnNtYXJ0Q29tcG9uZW50TGF5b3V0Py53aWRnZXQ/LmlkZW50aWZpZXI7XHJcbiAgICBpZiAodGhpcy50b29sYmFySWQgIT09IHRvb2xiYXJJZCkge1xyXG4gICAgICB0aGlzLnRvb2xiYXJJZCA9IHRvb2xiYXJJZDtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiAqbmdJZj1cInNtYXJ0Q29tcG9uZW50TGF5b3V0Py5leHBhbmRhYmxlOyB0aGVuIGV4cGFuZGFibGU7IGVsc2Ugbm9ybWFsXCI+IDwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNleHBhbmRhYmxlPlxyXG4gIDxzbWFydC1leHBhbmRhYmxlLXNlY3Rpb25cclxuICAgICpuZ0lmPVwiZXhwYW5kYWJsZVNlY3Rpb25cIlxyXG4gICAgW2RhdGFdPVwiZXhwYW5kYWJsZVNlY3Rpb25cIlxyXG4gID48L3NtYXJ0LWV4cGFuZGFibGUtc2VjdGlvbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjbm9ybWFsPlxyXG4gIDxkaXZcclxuICAgICpuZ0lmPVwic21hcnRDb21wb25lbnRMYXlvdXQ/LnR5cGUgPT09IHR5cGUoKS5DT05UQUlORVJcIlxyXG4gICAgW25nQ2xhc3NdPVwic21hcnRDb21wb25lbnRMYXlvdXQ/LmRpcmVjdGlvbiA/PyAndmVydGljYWwnXCJcclxuICA+XHJcbiAgICA8c21hcnQtY29tcG9uZW50LWxheW91dFxyXG4gICAgICAqbmdGb3I9XCJsZXQgbGF5b3V0IG9mIHNtYXJ0Q29tcG9uZW50TGF5b3V0Py5jb21wb25lbnRzXCJcclxuICAgICAgW3BhcmVudExheW91dENvbXBvbmVudF09XCJ0aGlzXCJcclxuICAgICAgW3NtYXJ0Q29tcG9uZW50TGF5b3V0XT1cImxheW91dFwiXHJcbiAgICA+PC9zbWFydC1jb21wb25lbnQtbGF5b3V0PlxyXG4gIDwvZGl2PlxyXG4gIDxzbWFydGZvcm0gKm5nSWY9XCJzbWFydEZvcm1cIiAjZm9ybSBbc21hcnRGb3JtXT1cInNtYXJ0Rm9ybVwiPjwvc21hcnRmb3JtPlxyXG4gIDxzbWFydC1ncmlkICpuZ0lmPVwic21hcnRHcmlkXCIgI2dyaWQgW3NtYXJ0R3JpZF09XCJzbWFydEdyaWRcIiBbdXVpZF09XCJ1dWlkIVwiPjwvc21hcnQtZ3JpZD5cclxuICA8IS0tIDxzbWFydC1maWx0ZXIgI2ZpbHRlciBbZmlsdGVyXT1cInNtYXJ0RmlsdGVyXCI+PC9zbWFydC1maWx0ZXI+IC0tPlxyXG4gIDxzbWFydC10cmVlICpuZ0lmPVwidHJlZVNlcnZpY2VcIiBbdHJlZVNlcnZpY2VdPVwidHJlZVNlcnZpY2UhXCI+PC9zbWFydC10cmVlPlxyXG4gIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhciAqbmdJZj1cIiEhdG9vbGJhcklkXCIgI3Rvb2xiYXIgW2lkXT1cInRvb2xiYXJJZFwiPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==
252
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY29tcG9uZW50LWxheW91dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi9zbWFydC1jb21wb25lbnQtbGF5b3V0L3NtYXJ0LWNvbXBvbmVudC1sYXlvdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtbmctY2xpZW50L3NyYy9saWIvc21hcnQtY29tcG9uZW50LWxheW91dC9zbWFydC1jb21wb25lbnQtbGF5b3V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsS0FBSyxFQU9MLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsYUFBYSxFQUNiLG1CQUFtQixFQUNuQixlQUFlLEdBRWhCLE1BQU0sT0FBTyxDQUFDO0FBQ2YsT0FBTyxFQUVMLHdCQUF3QixHQUd6QixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFDTCxnQkFBZ0IsRUFHaEIsY0FBYyxHQUNmLE1BQU0sd0JBQXdCLENBQUM7QUFHaEMsT0FBTyxFQUVMLDBCQUEwQixHQUMzQixNQUFNLHNDQUFzQyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7Ozs7Ozs7OztBQU94QyxNQUFNLE9BQU8sNkJBQTZCO0lBeUN4QyxZQUFvQixhQUErQztRQUEvQyxrQkFBYSxHQUFiLGFBQWEsQ0FBa0M7UUF4Q3pELGNBQVMsR0FBa0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQXdDbUIsQ0FBQztJQUV2RSxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLEtBQUssRUFBRTtZQUM3QixJQUFJLENBQUMsZ0JBQWdCLENBQUMs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LEVBQUUsVUFBVSxDQUFDO1FBQzlELElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7U0FDNUI7SUFDSCxDQUFDOzswSEFqUlUsNkJBQTZCOzhHQUE3Qiw2QkFBNkIsZ2pCQW1DMUIsMEJBQTBCLGdFQUcxQiw2QkFBNkIscUVDbkY3Qyx5ckNBMkJBLDBPRGtCYSw2QkFBNkI7MkZBQTdCLDZCQUE2QjtrQkFMekMsU0FBUzsrQkFDRSx3QkFBd0I7dUhBT3pCLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQU9OLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxNQUFNO2dCQU1wQixhQUFhO3NCQURaLFlBQVk7dUJBQUMsTUFBTTtnQkFNcEIsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLFFBQVE7Z0JBTXRCLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxTQUFTO2dCQVV2QixvQkFBb0I7c0JBRG5CLFlBQVk7dUJBQUMsMEJBQTBCO2dCQUl4QyxVQUFVO3NCQURULFlBQVk7dUJBQUMsNkJBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENvbXBvbmVudCxcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBRdWVyeUxpc3QsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0NoaWxkcmVuLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudFR5cGUsXHJcbiAgQ29tcG9uZW50V2lkZ2V0VHlwZSxcclxuICBMYXlvdXREaXJlY3Rpb24sXHJcbiAgU21hcnRDb21wb25lbnRMYXlvdXREZWZpbml0aW9uLFxyXG59IGZyb20gJy4vYXBpJztcclxuaW1wb3J0IHtcclxuICBTbWFydEZvcm0sXHJcbiAgU21hcnRGb3JtV2lkZ2V0RGlyZWN0aW9uLFxyXG4gIFNtYXJ0Zm9ybUNvbXBvbmVudCxcclxuICBTbWFydGZvcm1MYXlvdXREZWZpbml0aW9uU2VydmljZSxcclxufSBmcm9tICcuLi9zbWFydC1mb3JtL3Byb2plY3RzJztcclxuaW1wb3J0IHtcclxuICBHcmlkVWlBY3Rpb25UeXBlLFxyXG4gIFNtYXJ0R3JpZCxcclxuICBTbWFydEdyaWRDb21wb25lbnQsXHJcbiAgU21hcnRMYXlvdXREZWYsXHJcbn0gZnJvbSAnLi4vc21hcnQtZ3JpZC9wcm9qZWN0cyc7XHJcbmltcG9ydCB7IFNtYXJ0RmlsdGVyLCBTbWFydEZpbHRlckNvbXBvbmVudCB9IGZyb20gJy4uL3NtYXJ0LWZpbHRlci9wcm9qZWN0cyc7XHJcbmltcG9ydCB7IFNtYXJ0dHJlZUdlbmVyaWNTZXJ2aWNlIH0gZnJvbSAnLi4vc21hcnQtdHJlZS9wcm9qZWN0cyc7XHJcbmltcG9ydCB7XHJcbiAgRXhwYW5kYWJsZVNlY3Rpb24sXHJcbiAgRXhwYW5kYWJsZVNlY3Rpb25Db21wb25lbnQsXHJcbn0gZnJvbSAnLi4vc21hcnQtZXhwYW5kYWJsZS1zZWN0aW9uL3Byb2plY3RzJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudCB9IGZyb20gJy4uL3ZpZXctY29udGV4dC9wcm9qZWN0cyc7XHJcbmltcG9ydCB7IGRlZXBFcXVhbCB9IGZyb20gJ2Zhc3QtZXF1YWxzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc21hcnQtY29tcG9uZW50LWxheW91dCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3NtYXJ0LWNvbXBvbmVudC1sYXlvdXQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3NtYXJ0LWNvbXBvbmVudC1sYXlvdXQuY29tcG9uZW50LmNzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU21hcnRDb21wb25lbnRMYXlvdXRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XHJcbiAgcHJvdGVjdGVkIF9kZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIEBJbnB1dCgpIHNtYXJ0Q29tcG9uZW50TGF5b3V0PzogU21hcnRDb21wb25lbnRMYXlvdXREZWZpbml0aW9uO1xyXG4gIEBJbnB1dCgpIHBhcmVudExheW91dENvbXBvbmVudD86IFNtYXJ0Q29tcG9uZW50TGF5b3V0Q29tcG9uZW50O1xyXG4gIEBJbnB1dCgpIHBhcmVudFNtYXJ0Q29tcG9uZW50OiBhbnk7XHJcblxyXG4gIGN1cnJlbnRMYXlvdXQ/OiBTbWFydENvbXBvbmVudExheW91dERlZmluaXRpb247XHJcblxyXG4gIHV1aWQ/OiBzdHJpbmc7XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oJ2Zvcm0nKVxyXG4gIHNtYXJ0Rm9ybUxpc3QhOiBRdWVyeUxpc3Q8U21hcnRmb3JtQ29tcG9uZW50PjtcclxuICBzbWFydEZvcm1Db21wb25lbnQ/OiBTbWFydGZvcm1Db21wb25lbnQ7XHJcbiAgc21hcnRGb3JtPzogU21hcnRGb3JtO1xyXG5cclxuICBAVmlld0NoaWxkcmVuKCdncmlkJylcclxuICBzbWFydEdyaWRMaXN0ITogUXVlcnlMaXN0PFNtYXJ0R3JpZENvbXBvbmVudD47XHJcbiAgc21hcnRHcmlkQ29tcG9uZW50PzogU21hcnRHcmlkQ29tcG9uZW50O1xyXG4gIHNtYXJ0R3JpZD86IFNtYXJ0R3JpZDtcclxuXHJcbiAgQFZpZXdDaGlsZHJlbignZmlsdGVyJylcclxuICBzbWFydEZpbHRlckxpc3QhOiBRdWVyeUxpc3Q8U21hcnRGaWx0ZXJDb21wb25lbnQ+O1xyXG4gIHNtYXJ0RmlsdGVyQ29tcG9uZW50PzogU21hcnRGaWx0ZXJDb21wb25lbnQ7XHJcbiAgc21hcnRGaWx0ZXI/OiBTbWFydEZpbHRlcjtcclxuXHJcbiAgQFZpZXdDaGlsZHJlbigndG9vbGJhcicpXHJcbiAgdG9vbGJhckxpc3QhOiBRdWVyeUxpc3Q8VWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50PjtcclxuICB0b29sYmFyPzogVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50O1xyXG4gIHRvb2xiYXJJZD86IHN0cmluZztcclxuXHJcbiAgdHJlZVNlcnZpY2U/OiBTbWFydHRyZWVHZW5lcmljU2VydmljZTtcclxuXHJcbiAgZXhwYW5kYWJsZVNlY3Rpb24/OiBFeHBhbmRhYmxlU2VjdGlvbjxTbWFydENvbXBvbmVudExheW91dERlZmluaXRpb24+O1xyXG5cclxuICBAVmlld0NoaWxkcmVuKEV4cGFuZGFibGVTZWN0aW9uQ29tcG9uZW50KVxyXG4gIGV4cGFuZGFibGVDb21wb25lbnRzITogUXVlcnlMaXN0PEV4cGFuZGFibGVTZWN0aW9uQ29tcG9uZW50PjtcclxuXHJcbiAgQFZpZXdDaGlsZHJlbihTbWFydENvbXBvbmVudExheW91dENvbXBvbmVudClcclxuICBjb21wb25lbnRzITogUXVlcnlMaXN0PFNtYXJ0Q29tcG9uZW50TGF5b3V0Q29tcG9uZW50PjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBsYXlvdXRTZXJ2aWNlOiBTbWFydGZvcm1MYXlvdXREZWZpbml0aW9uU2VydmljZSkge31cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc21hcnRGb3JtTGlzdD8uZmlyc3QpIHtcclxuICAgICAgdGhpcy5zZXRGb3JtQ29tcG9uZW50KHRoaXMuc21hcnRGb3JtTGlzdD8uZmlyc3QpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zbWFydEZvcm1MaXN0LmNoYW5nZXNcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgobGlzdDogUXVlcnlMaXN0PFNtYXJ0Zm9ybUNvbXBvbmVudD4pID0+IHtcclxuICAgICAgICB0aGlzLnNldEZvcm1Db21wb25lbnQobGlzdC5maXJzdCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIGlmICh0aGlzLnNtYXJ0R3JpZExpc3Q/LmZpcnN0KSB7XHJcbiAgICAgIHRoaXMuc2V0R3JpZENvbXBvbmVudCh0aGlzLnNtYXJ0R3JpZExpc3Q/LmZpcnN0KTtcclxuICAgIH1cclxuICAgIHRoaXMuc21hcnRHcmlkTGlzdC5jaGFuZ2VzXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGxpc3Q6IFF1ZXJ5TGlzdDxTbWFydEdyaWRDb21wb25lbnQ+KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXRHcmlkQ29tcG9uZW50KGxpc3QuZmlyc3QpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNtYXJ0RmlsdGVyTGlzdC5jaGFuZ2VzXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGxpc3Q6IFF1ZXJ5TGlzdDxTbWFydEZpbHRlckNvbXBvbmVudD4pID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuc21hcnRGaWx0ZXJDb21wb25lbnQpIHtcclxuICAgICAgICAgIHRoaXMuc21hcnRGaWx0ZXJDb21wb25lbnQgPSBsaXN0LmZpcnN0O1xyXG4gICAgICAgICAgdGhpcy5iaW5kRmlsdGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy50b29sYmFyTGlzdD8uZmlyc3QpIHtcclxuICAgICAgdGhpcy5zZXRUb29sYmFyQ29tcG9uZW50KHRoaXMudG9vbGJhckxpc3Q/LmZpcnN0KTtcclxuICAgIH1cclxuICAgIHRoaXMudG9vbGJhckxpc3QuY2hhbmdlc1xyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChsaXN0OiBRdWVyeUxpc3Q8VWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50PikgPT4ge1xyXG4gICAgICAgIHRoaXMuc2V0VG9vbGJhckNvbXBvbmVudChsaXN0LmZpcnN0KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuc21hcnRDb21wb25lbnRMYXlvdXQpIHtcclxuICAgICAgdGhpcy5zZXRVcCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGRlZXBFcXVhbCh0aGlzLnNtYXJ0Q29tcG9uZW50TGF5b3V0LCB0aGlzLmN1cnJlbnRMYXlvdXQpKSB7XHJcbiAgICAgIC8vIG5vIGxheW91dCBjaGFuZ2UsIGtlZXAgY3VycmVudCBzdGF0ZVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gbGF5b3V0IGNoYW5nZWQsIHJlbmRlclxyXG4gICAgICB0aGlzLmN1cnJlbnRMYXlvdXQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuc21hcnRDb21wb25lbnRMYXlvdXQpKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnNtYXJ0Q29tcG9uZW50TGF5b3V0KSB7XHJcbiAgICAgICAgdGhpcy5zZXRVcCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFVwKCk6IHZvaWQge1xyXG4gICAgdGhpcy51dWlkID0gdGhpcy5wYXJlbnRTbWFydENvbXBvbmVudC51dWlkO1xyXG4gICAgdGhpcy50cmVlU2VydmljZSA9IHRoaXMucGFyZW50U21hcnRDb21wb25lbnQuc21hcnRUcmVlU2VydmljZTtcclxuXHJcbiAgICB0aGlzLnNtYXJ0Q29tcG9uZW50TGF5b3V0Py5kaXJlY3Rpb247XHJcblxyXG4gICAgaWYgKHRoaXMuc21hcnRDb21wb25lbnRMYXlvdXQ/LmV4cGFuZGFibGUpIHtcclxuICAgICAgdGhpcy5jb25zdHJ1Y3RFeHBhbmRhYmxlU2VjdGlvbigpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnNtYXJ0Q29tcG9uZW50TGF5b3V0Py50eXBlID09PSBDb21wb25lbnRUeXBlLkZPUk0pIHtcclxuICAgICAgdGhpcy5jb25zdHJ1Y3RGb3JtKCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuc21hcnRDb21wb25lbnRMYXlvdXQ/LnR5cGUgPT09IENvbXBvbmVudFR5cGUuV0lER0VUKSB7XHJcbiAgICAgIGlmICh0aGlzLnNtYXJ0Q29tcG9uZW50TGF5b3V0LndpZGdldD8udHlwZSA9PT0gQ29tcG9uZW50V2lkZ2V0VHlwZS5HUklEKSB7XHJcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3RHcmlkKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zbWFydENvbXBvbmVudExheW91dC53aWRnZXQ/LnR5cGUgPT09IENvbXBvbmVudFdpZGdldFR5cGUuRklMVEVSKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdDb21wb25lbnRXaWRnZXRUeXBlLkZJTFRFUiBpcyBub3Qgc3VwcG9ydGVkJyk7XHJcbiAgICAgICAgLy8gdGhpcy5jb25zdHJ1Y3RGaWx0ZXIoKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNtYXJ0Q29tcG9uZW50TGF5b3V0LndpZGdldD8udHlwZSA9PT0gQ29tcG9uZW50V2lkZ2V0VHlwZS5UUkVFKSB7XHJcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3RUcmVlKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zbWFydENvbXBvbmVudExheW91dC53aWRnZXQ/LnR5cGUgPT09IENvbXBvbmVudFdpZGdldFR5cGUuVE9PTEJBUikge1xyXG4gICAgICAgIHRoaXMuY29uc3RydWN0VG9vbGJhcigpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghdGhpcy5wYXJlbnRMYXlvdXRDb21wb25lbnQpIHtcclxuICAgICAgICAvLyBvbmx5IHRvcCBsZXZlbCBjb21wb25lbnQgc2hvdWxkIGNhbGwgaW5pdCBhY3Rpb25zXHJcbiAgICAgICAgdGhpcy5wYXJlbnRTbWFydENvbXBvbmVudC5pbml0QWN0aW9ucygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0eXBlKCk6IHR5cGVvZiBDb21wb25lbnRUeXBlIHtcclxuICAgIHJldHVybiBDb21wb25lbnRUeXBlO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0RXhwYW5kYWJsZVNlY3Rpb24oKTogdm9pZCB7XHJcbiAgICBsZXQgZGF0YTogU21hcnRDb21wb25lbnRMYXlvdXREZWZpbml0aW9uID0geyAuLi50aGlzLnNtYXJ0Q29tcG9uZW50TGF5b3V0ISB9O1xyXG4gICAgZGF0YS5leHBhbmRhYmxlID0gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5leHBhbmRhYmxlU2VjdGlvbiA9IHtcclxuICAgICAgdGl0bGU6IHRoaXMuc21hcnRDb21wb25lbnRMYXlvdXQ/LmV4cGFuZGFibGVTZWN0aW9uTGFiZWwgPz8gJycsXHJcbiAgICAgIGRhdGEsXHJcbiAgICAgIGlucHV0TmFtZTogJ3NtYXJ0Q29tcG9uZW50TGF5b3V0JyxcclxuICAgICAgY3VzdG9tQ29tcG9uZW50OiBTbWFydENvbXBvbmVudExheW91dENvbXBvbmVudCxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RGb3JtKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgd2lkZ2V0cyA9IHRoaXMubGF5b3V0U2VydmljZS5yZW5kZXIoe1xyXG4gICAgICBsYXlvdXREZWZpbml0aW9uczogdGhpcy5zbWFydENvbXBvbmVudExheW91dD8uZm9ybSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc21hcnRGb3JtID0ge1xyXG4gICAgICBkaXJlY3Rpb246IHRoaXMuZ2V0Rm9ybUxheW91dCgpLFxyXG4gICAgICBjb21wb25lbnRNb2RlbDogdGhpcy5wYXJlbnRTbWFydENvbXBvbmVudD8ubW9kZWwsXHJcbiAgICAgIHdpZGdldHMsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuYmluZEZvcm0oKTtcclxuICB9XHJcblxyXG4gIGdldEZvcm1MYXlvdXQoKTogU21hcnRGb3JtV2lkZ2V0RGlyZWN0aW9uIHtcclxuICAgIGlmICh0aGlzLnNtYXJ0Q29tcG9uZW50TGF5b3V0Py5kaXJlY3Rpb24pIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc21hcnRDb21wb25lbnRMYXlvdXQ/LmRpcmVjdGlvbiA9PT0gTGF5b3V0RGlyZWN0aW9uLkhPUklaT05UQUxcclxuICAgICAgICA/IFNtYXJ0Rm9ybVdpZGdldERpcmVjdGlvbi5ST1dcclxuICAgICAgICA6IFNtYXJ0Rm9ybVdpZGdldERpcmVjdGlvbi5DT0w7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gU21hcnRGb3JtV2lkZ2V0RGlyZWN0aW9uLkNPTDtcclxuICB9XHJcblxyXG4gIHNldEZvcm1Db21wb25lbnQoY29tcDogU21hcnRmb3JtQ29tcG9uZW50KSB7XHJcbiAgICBpZiAoIXRoaXMuc21hcnRGb3JtQ29tcG9uZW50KSB7XHJcbiAgICAgIHRoaXMuc21hcnRGb3JtQ29tcG9uZW50ID0gY29tcDtcclxuICAgICAgdGhpcy5iaW5kRm9ybSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYmluZEZvcm0oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5wYXJlbnRTbWFydENvbXBvbmVudD8udXNlUXVlcnlMaXN0cykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zbWFydEZvcm0gJiYgdGhpcy5zbWFydEZvcm1Db21wb25lbnQpIHtcclxuICAgICAgdGhpcy5wYXJlbnRTbWFydENvbXBvbmVudD8uYWRkRm9ybShcclxuICAgICAgICAvLyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGZvcm1cclxuICAgICAgICBgZm9ybV8ke3RoaXMubWFrZWlkKDUpfWAsXHJcbiAgICAgICAgdGhpcy5zbWFydEZvcm0sXHJcbiAgICAgICAgdGhpcy5zbWFydEZvcm1Db21wb25lbnRcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1ha2VpZChsZW5ndGg6IG51bWJlcikge1xyXG4gICAgbGV0IHJlc3VsdCA9ICcnO1xyXG4gICAgY29uc3QgY2hhcmFjdGVycyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7XHJcbiAgICBjb25zdCBjaGFyYWN0ZXJzTGVuZ3RoID0gY2hhcmFjdGVycy5sZW5ndGg7XHJcbiAgICBsZXQgY291bnRlciA9IDA7XHJcbiAgICB3aGlsZSAoY291bnRlciA8IGxlbmd0aCkge1xyXG4gICAgICByZXN1bHQgKz0gY2hhcmFjdGVycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcmFjdGVyc0xlbmd0aCkpO1xyXG4gICAgICBjb3VudGVyICs9IDE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0R3JpZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc21hcnRHcmlkID0ge1xyXG4gICAgICBncmlkSWRlbnRpZmllcjogdGhpcy5zbWFydENvbXBvbmVudExheW91dD8ud2lkZ2V0Py5pZGVudGlmaWVyISxcclxuICAgICAgZ3JpZE1vZGVsOiB7XHJcbiAgICAgICAgcGFnZToge30sXHJcbiAgICAgIH0sXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICByb3dVaUFjdGlvblR5cGU6IEdyaWRVaUFjdGlvblR5cGUuUE9QVVBfTUVOVSxcclxuICAgICAgfSxcclxuICAgICAgbGF5b3V0RGVmOiBTbWFydExheW91dERlZi5UQUJMRSxcclxuICAgICAgcGFnaW5hdG9yOiB0cnVlLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmJpbmRHcmlkKCk7XHJcbiAgfVxyXG5cclxuICBzZXRHcmlkQ29tcG9uZW50KGNvbXA6IFNtYXJ0R3JpZENvbXBvbmVudCkge1xyXG4gICAgaWYgKCF0aGlzLnNtYXJ0R3JpZENvbXBvbmVudCkge1xyXG4gICAgICB0aGlzLnNtYXJ0R3JpZENvbXBvbmVudCA9IGNvbXA7XHJcbiAgICAgIHRoaXMuYmluZEdyaWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGJpbmRHcmlkKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucGFyZW50U21hcnRDb21wb25lbnQ/LnVzZVF1ZXJ5TGlzdHMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc21hcnRHcmlkICYmIHRoaXMuc21hcnRHcmlkQ29tcG9uZW50KSB7XHJcbiAgICAgIHRoaXMuc21hcnRHcmlkID0gdGhpcy5wYXJlbnRTbWFydENvbXBvbmVudD8uYWRkR3JpZChcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICByb3dVaUFjdGlvblR5cGU6IEdyaWRVaUFjdGlvblR5cGUuUE9QVVBfTUVOVSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGZhbHNlLFxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkQ29tcG9uZW50XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRUb29sYmFyQ29tcG9uZW50KGNvbXA6IFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudCkge1xyXG4gICAgdGhpcy50b29sYmFyID0gY29tcDtcclxuICB9XHJcblxyXG4gIC8vIE5PVCBVU0VELCBET0VTTidUIFdPUktcclxuICAvLyBjb25zdHJ1Y3RGaWx0ZXIoKTogdm9pZCB7XHJcbiAgLy8gICB0aGlzLnNtYXJ0RmlsdGVyID0gKHRoaXMuc21hcnRDb21wb25lbnRMYXlvdXQhLnBhcmVudENvbXBvbmVudCBhcyBhbnkpLmFkZEZpbHRlcihcclxuICAvLyAgICAgYGZpbHRlcl8ke3RoaXMubWFrZWlkKDUpfWAsXHJcbiAgLy8gICAgIHRoaXMuc21hcnRDb21wb25lbnRMYXlvdXQ/LndpZGdldD8uZmlsdGVyRXhwcmVzc2lvbkZpZWxkTGlzdCxcclxuICAvLyAgICAgdGhpcy5zbWFydENvbXBvbmVudExheW91dD8ud2lkZ2V0Py5maWx0ZXJUeXBlLFxyXG4gIC8vICAgICB0aGlzLnNtYXJ0RmlsdGVyQ29tcG9uZW50XHJcbiAgLy8gICApO1xyXG4gIC8vIH1cclxuXHJcbiAgYmluZEZpbHRlcigpOiB2b2lkIHtcclxuICAgIC8vIFRPRE9cclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdFRyZWUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5wYXJlbnRTbWFydENvbXBvbmVudD8udXNlUXVlcnlMaXN0cykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnBhcmVudFNtYXJ0Q29tcG9uZW50LnNldFVwRGVmYXVsdFRyZWUodGhpcy5zbWFydENvbXBvbmVudExheW91dD8ud2lkZ2V0Py5pZGVudGlmaWVyKTtcclxuICAgIHRoaXMudHJlZVNlcnZpY2U/LmluaXRpYWxpemUoKTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdFRvb2xiYXIoKTogdm9pZCB7XHJcbiAgICBsZXQgdG9vbGJhcklkID0gdGhpcy5zbWFydENvbXBvbmVudExheW91dD8ud2lkZ2V0Py5pZGVudGlmaWVyO1xyXG4gICAgaWYgKHRoaXMudG9vbGJhcklkICE9PSB0b29sYmFySWQpIHtcclxuICAgICAgdGhpcy50b29sYmFySWQgPSB0b29sYmFySWQ7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgKm5nSWY9XCJzbWFydENvbXBvbmVudExheW91dD8uZXhwYW5kYWJsZTsgdGhlbiBleHBhbmRhYmxlOyBlbHNlIG5vcm1hbFwiPiA8L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZXhwYW5kYWJsZT5cclxuICA8c21hcnQtZXhwYW5kYWJsZS1zZWN0aW9uXHJcbiAgICAqbmdJZj1cImV4cGFuZGFibGVTZWN0aW9uXCJcclxuICAgIFtkYXRhXT1cImV4cGFuZGFibGVTZWN0aW9uXCJcclxuICA+PC9zbWFydC1leHBhbmRhYmxlLXNlY3Rpb24+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI25vcm1hbD5cclxuICA8ZGl2XHJcbiAgICAqbmdJZj1cInNtYXJ0Q29tcG9uZW50TGF5b3V0Py50eXBlID09PSB0eXBlKCkuQ09OVEFJTkVSXCJcclxuICAgIFtuZ0NsYXNzXT1cInNtYXJ0Q29tcG9uZW50TGF5b3V0Py5kaXJlY3Rpb24gPz8gJ3ZlcnRpY2FsJ1wiXHJcbiAgPlxyXG4gICAgPHNtYXJ0LWNvbXBvbmVudC1sYXlvdXRcclxuICAgICAgKm5nRm9yPVwibGV0IGxheW91dCBvZiBzbWFydENvbXBvbmVudExheW91dD8uY29tcG9uZW50c1wiXHJcbiAgICAgIFtwYXJlbnRTbWFydENvbXBvbmVudF09XCJwYXJlbnRTbWFydENvbXBvbmVudFwiXHJcbiAgICAgIFtwYXJlbnRMYXlvdXRDb21wb25lbnRdPVwidGhpc1wiXHJcbiAgICAgIFtzbWFydENvbXBvbmVudExheW91dF09XCJsYXlvdXRcIlxyXG4gICAgPjwvc21hcnQtY29tcG9uZW50LWxheW91dD5cclxuICA8L2Rpdj5cclxuICA8c21hcnRmb3JtICpuZ0lmPVwic21hcnRGb3JtXCIgI2Zvcm0gW3NtYXJ0Rm9ybV09XCJzbWFydEZvcm1cIj48L3NtYXJ0Zm9ybT5cclxuICA8c21hcnQtZ3JpZCAqbmdJZj1cInNtYXJ0R3JpZFwiICNncmlkIFtzbWFydEdyaWRdPVwic21hcnRHcmlkXCIgW3V1aWRdPVwidXVpZCFcIj48L3NtYXJ0LWdyaWQ+XHJcbiAgPCEtLSA8c21hcnQtZmlsdGVyICNmaWx0ZXIgW2ZpbHRlcl09XCJzbWFydEZpbHRlclwiPjwvc21hcnQtZmlsdGVyPiAtLT5cclxuICA8c21hcnQtdHJlZSAqbmdJZj1cInRyZWVTZXJ2aWNlXCIgW3RyZWVTZXJ2aWNlXT1cInRyZWVTZXJ2aWNlIVwiPjwvc21hcnQtdHJlZT5cclxuICA8c21hcnQtdWktYWN0aW9uLXRvb2xiYXIgKm5nSWY9XCIhIXRvb2xiYXJJZFwiICN0b29sYmFyIFtpZF09XCJ0b29sYmFySWRcIj48L3NtYXJ0LXVpLWFjdGlvbi10b29sYmFyPlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=
@@ -13050,39 +13050,45 @@ class SmartComponentLayoutComponent {
13050
13050
  this._destroy$.complete();
13051
13051
  }
13052
13052
  ngOnChanges(changes) {
13053
- this.smartComponentLayout = changes['smartComponentLayout'].currentValue;
13054
- if (this.smartComponentLayout) {
13055
- this.setUp();
13053
+ if (deepEqual(this.smartComponentLayout, this.currentLayout)) {
13054
+ // no layout change, keep current state
13055
+ }
13056
+ else {
13057
+ // layout changed, render
13058
+ this.currentLayout = JSON.parse(JSON.stringify(this.smartComponentLayout));
13059
+ if (this.smartComponentLayout) {
13060
+ this.setUp();
13061
+ }
13056
13062
  }
13057
13063
  }
13058
13064
  setUp() {
13059
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
13060
- this.parent = (_a = this.smartComponentLayout) === null || _a === void 0 ? void 0 : _a.parentComponent;
13061
- this.uuid = this.parent.uuid;
13062
- this.treeService = this.parent.smartTreeService;
13063
- (_b = this.smartComponentLayout) === null || _b === void 0 ? void 0 : _b.direction;
13064
- if ((_c = this.smartComponentLayout) === null || _c === void 0 ? void 0 : _c.expandable) {
13065
+ var _a, _b, _c, _d, _e, _f, _g, _h;
13066
+ this.uuid = this.parentSmartComponent.uuid;
13067
+ this.treeService = this.parentSmartComponent.smartTreeService;
13068
+ (_a = this.smartComponentLayout) === null || _a === void 0 ? void 0 : _a.direction;
13069
+ if ((_b = this.smartComponentLayout) === null || _b === void 0 ? void 0 : _b.expandable) {
13065
13070
  this.constructExpandableSection();
13066
13071
  }
13067
- else if (((_d = this.smartComponentLayout) === null || _d === void 0 ? void 0 : _d.type) === ComponentType.FORM) {
13072
+ else if (((_c = this.smartComponentLayout) === null || _c === void 0 ? void 0 : _c.type) === ComponentType.FORM) {
13068
13073
  this.constructForm();
13069
13074
  }
13070
- else if (((_e = this.smartComponentLayout) === null || _e === void 0 ? void 0 : _e.type) === ComponentType.WIDGET) {
13071
- if (((_f = this.smartComponentLayout.widget) === null || _f === void 0 ? void 0 : _f.type) === ComponentWidgetType.GRID) {
13075
+ else if (((_d = this.smartComponentLayout) === null || _d === void 0 ? void 0 : _d.type) === ComponentType.WIDGET) {
13076
+ if (((_e = this.smartComponentLayout.widget) === null || _e === void 0 ? void 0 : _e.type) === ComponentWidgetType.GRID) {
13072
13077
  this.constructGrid();
13073
13078
  }
13074
- else if (((_g = this.smartComponentLayout.widget) === null || _g === void 0 ? void 0 : _g.type) === ComponentWidgetType.FILTER) {
13079
+ else if (((_f = this.smartComponentLayout.widget) === null || _f === void 0 ? void 0 : _f.type) === ComponentWidgetType.FILTER) {
13075
13080
  console.warn('ComponentWidgetType.FILTER is not supported');
13076
13081
  // this.constructFilter();
13077
13082
  }
13078
- else if (((_h = this.smartComponentLayout.widget) === null || _h === void 0 ? void 0 : _h.type) === ComponentWidgetType.TREE) {
13083
+ else if (((_g = this.smartComponentLayout.widget) === null || _g === void 0 ? void 0 : _g.type) === ComponentWidgetType.TREE) {
13079
13084
  this.constructTree();
13080
13085
  }
13081
- else if (((_j = this.smartComponentLayout.widget) === null || _j === void 0 ? void 0 : _j.type) === ComponentWidgetType.TOOLBAR) {
13086
+ else if (((_h = this.smartComponentLayout.widget) === null || _h === void 0 ? void 0 : _h.type) === ComponentWidgetType.TOOLBAR) {
13082
13087
  this.constructToolbar();
13083
13088
  }
13084
13089
  if (!this.parentLayoutComponent) {
13085
- this.parent.initActions();
13090
+ // only top level component should call init actions
13091
+ this.parentSmartComponent.initActions();
13086
13092
  }
13087
13093
  }
13088
13094
  }
@@ -13107,7 +13113,7 @@ class SmartComponentLayoutComponent {
13107
13113
  });
13108
13114
  this.smartForm = {
13109
13115
  direction: this.getFormLayout(),
13110
- componentModel: (_b = this.parent) === null || _b === void 0 ? void 0 : _b.model,
13116
+ componentModel: (_b = this.parentSmartComponent) === null || _b === void 0 ? void 0 : _b.model,
13111
13117
  widgets,
13112
13118
  };
13113
13119
  this.bindForm();
@@ -13129,11 +13135,11 @@ class SmartComponentLayoutComponent {
13129
13135
  }
13130
13136
  bindForm() {
13131
13137
  var _a, _b;
13132
- if ((_a = this.parent) === null || _a === void 0 ? void 0 : _a.useQueryLists) {
13138
+ if ((_a = this.parentSmartComponent) === null || _a === void 0 ? void 0 : _a.useQueryLists) {
13133
13139
  return;
13134
13140
  }
13135
13141
  if (this.smartForm && this.smartFormComponent) {
13136
- (_b = this.parent) === null || _b === void 0 ? void 0 : _b.addForm(
13142
+ (_b = this.parentSmartComponent) === null || _b === void 0 ? void 0 : _b.addForm(
13137
13143
  // unique identifier for the form
13138
13144
  `form_${this.makeid(5)}`, this.smartForm, this.smartFormComponent);
13139
13145
  }
@@ -13172,11 +13178,11 @@ class SmartComponentLayoutComponent {
13172
13178
  }
13173
13179
  bindGrid() {
13174
13180
  var _a, _b;
13175
- if ((_a = this.parent) === null || _a === void 0 ? void 0 : _a.useQueryLists) {
13181
+ if ((_a = this.parentSmartComponent) === null || _a === void 0 ? void 0 : _a.useQueryLists) {
13176
13182
  return;
13177
13183
  }
13178
13184
  if (this.smartGrid && this.smartGridComponent) {
13179
- this.smartGrid = (_b = this.parent) === null || _b === void 0 ? void 0 : _b.addGrid(this.smartGrid, {
13185
+ this.smartGrid = (_b = this.parentSmartComponent) === null || _b === void 0 ? void 0 : _b.addGrid(this.smartGrid, {
13180
13186
  rowUiActionType: GridUiActionType.POPUP_MENU,
13181
13187
  }, false, this.smartGridComponent);
13182
13188
  }
@@ -13198,10 +13204,10 @@ class SmartComponentLayoutComponent {
13198
13204
  }
13199
13205
  constructTree() {
13200
13206
  var _a, _b, _c, _d;
13201
- if ((_a = this.parent) === null || _a === void 0 ? void 0 : _a.useQueryLists) {
13207
+ if ((_a = this.parentSmartComponent) === null || _a === void 0 ? void 0 : _a.useQueryLists) {
13202
13208
  return;
13203
13209
  }
13204
- this.parent.setUpDefaultTree((_c = (_b = this.smartComponentLayout) === null || _b === void 0 ? void 0 : _b.widget) === null || _c === void 0 ? void 0 : _c.identifier);
13210
+ this.parentSmartComponent.setUpDefaultTree((_c = (_b = this.smartComponentLayout) === null || _b === void 0 ? void 0 : _b.widget) === null || _c === void 0 ? void 0 : _c.identifier);
13205
13211
  (_d = this.treeService) === null || _d === void 0 ? void 0 : _d.initialize();
13206
13212
  }
13207
13213
  constructToolbar() {
@@ -13213,14 +13219,16 @@ class SmartComponentLayoutComponent {
13213
13219
  }
13214
13220
  }
13215
13221
  SmartComponentLayoutComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SmartComponentLayoutComponent, deps: [{ token: SmartformLayoutDefinitionService }], target: i0.ɵɵFactoryTarget.Component });
13216
- SmartComponentLayoutComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: SmartComponentLayoutComponent, selector: "smart-component-layout", inputs: { smartComponentLayout: "smartComponentLayout", parentLayoutComponent: "parentLayoutComponent" }, viewQueries: [{ propertyName: "smartFormList", predicate: ["form"], descendants: true }, { propertyName: "smartGridList", predicate: ["grid"], descendants: true }, { propertyName: "smartFilterList", predicate: ["filter"], descendants: true }, { propertyName: "toolbarList", predicate: ["toolbar"], descendants: true }, { propertyName: "expandableComponents", predicate: ExpandableSectionComponent, descendants: true }, { propertyName: "components", predicate: SmartComponentLayoutComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"smartComponentLayout?.expandable; then expandable; else normal\"> </div>\r\n\r\n<ng-template #expandable>\r\n <smart-expandable-section\r\n *ngIf=\"expandableSection\"\r\n [data]=\"expandableSection\"\r\n ></smart-expandable-section>\r\n</ng-template>\r\n\r\n<ng-template #normal>\r\n <div\r\n *ngIf=\"smartComponentLayout?.type === type().CONTAINER\"\r\n [ngClass]=\"smartComponentLayout?.direction ?? 'vertical'\"\r\n >\r\n <smart-component-layout\r\n *ngFor=\"let layout of smartComponentLayout?.components\"\r\n [parentLayoutComponent]=\"this\"\r\n [smartComponentLayout]=\"layout\"\r\n ></smart-component-layout>\r\n </div>\r\n <smartform *ngIf=\"smartForm\" #form [smartForm]=\"smartForm\"></smartform>\r\n <smart-grid *ngIf=\"smartGrid\" #grid [smartGrid]=\"smartGrid\" [uuid]=\"uuid!\"></smart-grid>\r\n <!-- <smart-filter #filter [filter]=\"smartFilter\"></smart-filter> -->\r\n <smart-tree *ngIf=\"treeService\" [treeService]=\"treeService!\"></smart-tree>\r\n <smart-ui-action-toolbar *ngIf=\"!!toolbarId\" #toolbar [id]=\"toolbarId\"></smart-ui-action-toolbar>\r\n</ng-template>\r\n", styles: [".horizontal{display:flex;flex-direction:row}.vertical{display:flex;flex-direction:column}\n"], components: [{ type: ExpandableSectionComponent, selector: "smart-expandable-section", inputs: ["data", "index"] }, { type: SmartComponentLayoutComponent, selector: "smart-component-layout", inputs: ["smartComponentLayout", "parentLayoutComponent"] }, { type: SmartformComponent, selector: "smartform", inputs: ["smartForm"] }, { type: SmartGridComponent, selector: "smart-grid", inputs: ["smartGrid", "uuid", "dev"] }, { type: SmartTreeComponent, selector: "smart-tree", inputs: ["treeStyle", "treeService"] }, { type: UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: ["uiActionModels", "uiActionDescriptorService", "id"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
13222
+ SmartComponentLayoutComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: SmartComponentLayoutComponent, selector: "smart-component-layout", inputs: { smartComponentLayout: "smartComponentLayout", parentLayoutComponent: "parentLayoutComponent", parentSmartComponent: "parentSmartComponent" }, viewQueries: [{ propertyName: "smartFormList", predicate: ["form"], descendants: true }, { propertyName: "smartGridList", predicate: ["grid"], descendants: true }, { propertyName: "smartFilterList", predicate: ["filter"], descendants: true }, { propertyName: "toolbarList", predicate: ["toolbar"], descendants: true }, { propertyName: "expandableComponents", predicate: ExpandableSectionComponent, descendants: true }, { propertyName: "components", predicate: SmartComponentLayoutComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"smartComponentLayout?.expandable; then expandable; else normal\"> </div>\r\n\r\n<ng-template #expandable>\r\n <smart-expandable-section\r\n *ngIf=\"expandableSection\"\r\n [data]=\"expandableSection\"\r\n ></smart-expandable-section>\r\n</ng-template>\r\n\r\n<ng-template #normal>\r\n <div\r\n *ngIf=\"smartComponentLayout?.type === type().CONTAINER\"\r\n [ngClass]=\"smartComponentLayout?.direction ?? 'vertical'\"\r\n >\r\n <smart-component-layout\r\n *ngFor=\"let layout of smartComponentLayout?.components\"\r\n [parentSmartComponent]=\"parentSmartComponent\"\r\n [parentLayoutComponent]=\"this\"\r\n [smartComponentLayout]=\"layout\"\r\n ></smart-component-layout>\r\n </div>\r\n <smartform *ngIf=\"smartForm\" #form [smartForm]=\"smartForm\"></smartform>\r\n <smart-grid *ngIf=\"smartGrid\" #grid [smartGrid]=\"smartGrid\" [uuid]=\"uuid!\"></smart-grid>\r\n <!-- <smart-filter #filter [filter]=\"smartFilter\"></smart-filter> -->\r\n <smart-tree *ngIf=\"treeService\" [treeService]=\"treeService!\"></smart-tree>\r\n <smart-ui-action-toolbar *ngIf=\"!!toolbarId\" #toolbar [id]=\"toolbarId\"></smart-ui-action-toolbar>\r\n</ng-template>\r\n", styles: [".horizontal{display:flex;flex-direction:row}.vertical{display:flex;flex-direction:column}\n"], components: [{ type: ExpandableSectionComponent, selector: "smart-expandable-section", inputs: ["data", "index"] }, { type: SmartComponentLayoutComponent, selector: "smart-component-layout", inputs: ["smartComponentLayout", "parentLayoutComponent", "parentSmartComponent"] }, { type: SmartformComponent, selector: "smartform", inputs: ["smartForm"] }, { type: SmartGridComponent, selector: "smart-grid", inputs: ["smartGrid", "uuid", "dev"] }, { type: SmartTreeComponent, selector: "smart-tree", inputs: ["treeStyle", "treeService"] }, { type: UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: ["uiActionModels", "uiActionDescriptorService", "id"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
13217
13223
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SmartComponentLayoutComponent, decorators: [{
13218
13224
  type: Component,
13219
- args: [{ selector: 'smart-component-layout', template: "<div *ngIf=\"smartComponentLayout?.expandable; then expandable; else normal\"> </div>\r\n\r\n<ng-template #expandable>\r\n <smart-expandable-section\r\n *ngIf=\"expandableSection\"\r\n [data]=\"expandableSection\"\r\n ></smart-expandable-section>\r\n</ng-template>\r\n\r\n<ng-template #normal>\r\n <div\r\n *ngIf=\"smartComponentLayout?.type === type().CONTAINER\"\r\n [ngClass]=\"smartComponentLayout?.direction ?? 'vertical'\"\r\n >\r\n <smart-component-layout\r\n *ngFor=\"let layout of smartComponentLayout?.components\"\r\n [parentLayoutComponent]=\"this\"\r\n [smartComponentLayout]=\"layout\"\r\n ></smart-component-layout>\r\n </div>\r\n <smartform *ngIf=\"smartForm\" #form [smartForm]=\"smartForm\"></smartform>\r\n <smart-grid *ngIf=\"smartGrid\" #grid [smartGrid]=\"smartGrid\" [uuid]=\"uuid!\"></smart-grid>\r\n <!-- <smart-filter #filter [filter]=\"smartFilter\"></smart-filter> -->\r\n <smart-tree *ngIf=\"treeService\" [treeService]=\"treeService!\"></smart-tree>\r\n <smart-ui-action-toolbar *ngIf=\"!!toolbarId\" #toolbar [id]=\"toolbarId\"></smart-ui-action-toolbar>\r\n</ng-template>\r\n", styles: [".horizontal{display:flex;flex-direction:row}.vertical{display:flex;flex-direction:column}\n"] }]
13225
+ args: [{ selector: 'smart-component-layout', template: "<div *ngIf=\"smartComponentLayout?.expandable; then expandable; else normal\"> </div>\r\n\r\n<ng-template #expandable>\r\n <smart-expandable-section\r\n *ngIf=\"expandableSection\"\r\n [data]=\"expandableSection\"\r\n ></smart-expandable-section>\r\n</ng-template>\r\n\r\n<ng-template #normal>\r\n <div\r\n *ngIf=\"smartComponentLayout?.type === type().CONTAINER\"\r\n [ngClass]=\"smartComponentLayout?.direction ?? 'vertical'\"\r\n >\r\n <smart-component-layout\r\n *ngFor=\"let layout of smartComponentLayout?.components\"\r\n [parentSmartComponent]=\"parentSmartComponent\"\r\n [parentLayoutComponent]=\"this\"\r\n [smartComponentLayout]=\"layout\"\r\n ></smart-component-layout>\r\n </div>\r\n <smartform *ngIf=\"smartForm\" #form [smartForm]=\"smartForm\"></smartform>\r\n <smart-grid *ngIf=\"smartGrid\" #grid [smartGrid]=\"smartGrid\" [uuid]=\"uuid!\"></smart-grid>\r\n <!-- <smart-filter #filter [filter]=\"smartFilter\"></smart-filter> -->\r\n <smart-tree *ngIf=\"treeService\" [treeService]=\"treeService!\"></smart-tree>\r\n <smart-ui-action-toolbar *ngIf=\"!!toolbarId\" #toolbar [id]=\"toolbarId\"></smart-ui-action-toolbar>\r\n</ng-template>\r\n", styles: [".horizontal{display:flex;flex-direction:row}.vertical{display:flex;flex-direction:column}\n"] }]
13220
13226
  }], ctorParameters: function () { return [{ type: SmartformLayoutDefinitionService }]; }, propDecorators: { smartComponentLayout: [{
13221
13227
  type: Input
13222
13228
  }], parentLayoutComponent: [{
13223
13229
  type: Input
13230
+ }], parentSmartComponent: [{
13231
+ type: Input
13224
13232
  }], smartFormList: [{
13225
13233
  type: ViewChildren,
13226
13234
  args: ['form']
@@ -14593,18 +14601,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
14593
14601
  */
14594
14602
 
14595
14603
  class SmartComponentLayoutUtility {
14596
- static setParent(layout, parent) {
14597
- var _a;
14598
- layout.parentComponent = parent;
14599
- (_a = layout.components) === null || _a === void 0 ? void 0 : _a.forEach((l) => this.setParent(l, parent));
14600
- }
14601
- static compare(layout1, layout2) {
14602
- let l1 = Object.assign({}, layout1);
14603
- this.setParent(l1, null);
14604
- let l2 = Object.assign({}, layout2);
14605
- this.setParent(l2, null);
14606
- return deepEqual(l1, l2);
14607
- }
14608
14604
  static getForms(comp) {
14609
14605
  let result = [];
14610
14606
  if (comp.components) {
@@ -15154,8 +15150,6 @@ class SmartComponentApiClient {
15154
15150
  else {
15155
15151
  this.handleQueryList(this.getSmartComponentLayoutsQL(), (comp) => {
15156
15152
  if (comp.smartComponentLayout) {
15157
- // TODO maybe we should set comp.parent, not comp.smartComponentLayout.parentComponent..
15158
- SmartComponentLayoutUtility.setParent(comp.smartComponentLayout, this);
15159
15153
  this.initActions();
15160
15154
  }
15161
15155
  if (this.uuid && this.uuid !== comp.uuid)