@one-grid-core/angular 0.1.0-beta.5 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +49 -4
  2. package/esm2022/lib/components/one-grid/one-grid.component.mjs +67 -16
  3. package/esm2022/lib/components/one-grid-body/one-grid-body.component.mjs +282 -30
  4. package/esm2022/lib/components/one-grid-cell-group-renderer/one-grid-cell-group-renderer.component.mjs +10 -7
  5. package/esm2022/lib/components/one-grid-cell-option-menu/one-grid-cell-option-menu.component.mjs +60 -4
  6. package/esm2022/lib/components/one-grid-checkbox-header/one-grid-checkbox-header.component.mjs +14 -5
  7. package/esm2022/lib/components/one-grid-header/one-grid-header.component.mjs +50 -13
  8. package/esm2022/lib/components/one-grid-pagination/one-grid-pagination.component.mjs +39 -15
  9. package/esm2022/lib/components/one-grid-row-action/one-grid-row-action.component.mjs +54 -8
  10. package/esm2022/lib/components/one-grid-row-drag-handle/one-grid-row-drag-handle.component.mjs +110 -0
  11. package/esm2022/lib/core/directives/one-cell-renderer-component.directive.mjs +9 -2
  12. package/esm2022/lib/core/directives/one-cell-text-expand.directive.mjs +33 -51
  13. package/esm2022/lib/core/instants/one-grid-api.class.mjs +429 -166
  14. package/esm2022/lib/core/instants/one-row-node.class.mjs +103 -37
  15. package/esm2022/lib/core/models/one-column-def-types.model.mjs +1 -1
  16. package/esm2022/lib/core/models/one-event-types.model.mjs +1 -1
  17. package/esm2022/lib/core/models/one-grid-types.model.mjs +1 -1
  18. package/esm2022/lib/core/models/one-row-drag.model.mjs +2 -0
  19. package/esm2022/lib/core/models/one-row.model.mjs +1 -1
  20. package/esm2022/lib/core/models/one-tree-data.model.mjs +1 -1
  21. package/esm2022/lib/core/models/one-validation.model.mjs +1 -1
  22. package/esm2022/lib/core/pipes/cell-field-value-empty.pipe.mjs +8 -3
  23. package/esm2022/lib/core/pipes/column-sort-state.pipe.mjs +3 -1
  24. package/esm2022/lib/core/services/og-column.service.mjs +120 -13
  25. package/esm2022/lib/core/services/one-grid-cell.service.mjs +123 -20
  26. package/esm2022/lib/core/services/one-grid-row-drag.service.mjs +351 -0
  27. package/esm2022/lib/core/services/one-grid-selection.service.mjs +19 -6
  28. package/esm2022/lib/helpers/one-column-def.helper.mjs +27 -2
  29. package/esm2022/lib/helpers/one-filter.helper.mjs +71 -12
  30. package/esm2022/lib/helpers/one-validation.helper.mjs +7 -2
  31. package/esm2022/lib/index.mjs +8 -1
  32. package/esm2022/lib/one-grid.module.mjs +7 -16
  33. package/fesm2022/one-grid-core-angular.mjs +2046 -503
  34. package/fesm2022/one-grid-core-angular.mjs.map +1 -1
  35. package/lib/components/one-grid/one-grid.component.d.ts +16 -1
  36. package/lib/components/one-grid-body/one-grid-body.component.d.ts +132 -5
  37. package/lib/components/one-grid-cell-group-renderer/one-grid-cell-group-renderer.component.d.ts +6 -1
  38. package/lib/components/one-grid-cell-option-menu/one-grid-cell-option-menu.component.d.ts +19 -2
  39. package/lib/components/one-grid-checkbox-header/one-grid-checkbox-header.component.d.ts +5 -2
  40. package/lib/components/one-grid-header/one-grid-header.component.d.ts +15 -7
  41. package/lib/components/one-grid-pagination/one-grid-pagination.component.d.ts +24 -5
  42. package/lib/components/one-grid-row-action/one-grid-row-action.component.d.ts +44 -0
  43. package/lib/components/one-grid-row-drag-handle/one-grid-row-drag-handle.component.d.ts +39 -0
  44. package/lib/core/directives/one-cell-text-expand.directive.d.ts +21 -9
  45. package/lib/core/instants/one-grid-api.class.d.ts +212 -26
  46. package/lib/core/instants/one-row-node.class.d.ts +67 -14
  47. package/lib/core/models/one-column-def-types.model.d.ts +89 -15
  48. package/lib/core/models/one-event-types.model.d.ts +24 -1
  49. package/lib/core/models/one-grid-types.model.d.ts +36 -1
  50. package/lib/core/models/one-row-drag.model.d.ts +44 -0
  51. package/lib/core/models/one-row.model.d.ts +0 -5
  52. package/lib/core/models/one-tree-data.model.d.ts +13 -0
  53. package/lib/core/models/one-validation.model.d.ts +12 -2
  54. package/lib/core/pipes/column-sort-state.pipe.d.ts +1 -1
  55. package/lib/core/services/og-column.service.d.ts +44 -3
  56. package/lib/core/services/one-grid-cell.service.d.ts +52 -4
  57. package/lib/core/services/one-grid-row-drag.service.d.ts +113 -0
  58. package/lib/core/services/one-grid-selection.service.d.ts +9 -0
  59. package/lib/helpers/one-column-def.helper.d.ts +19 -1
  60. package/lib/helpers/one-filter.helper.d.ts +29 -4
  61. package/lib/index.d.ts +7 -0
  62. package/lib/one-grid.module.d.ts +17 -19
  63. package/package.json +1 -2
  64. package/scss/_one-grid.scss +389 -17
  65. package/esm2022/lib/core/pipes/cell-disable-resolver.pipe.mjs +0 -26
  66. package/lib/core/pipes/cell-disable-resolver.pipe.d.ts +0 -9
package/README.md CHANGED
@@ -11,7 +11,7 @@ npm install @one-grid-core/angular
11
11
  Peer dependencies (installed alongside your app):
12
12
 
13
13
  ```bash
14
- npm install @angular/cdk @ng-bootstrap/ng-bootstrap lucide-angular
14
+ npm install @angular/cdk lucide-angular
15
15
  ```
16
16
 
17
17
  Requires Angular 17 or newer.
@@ -139,6 +139,9 @@ Legacy `@import` with pre-defined variables also still works.
139
139
  | `cell-padding` | `0 10px` | Cell padding |
140
140
  | `cell-item-space` | `8px` | Spacing between in-cell items |
141
141
  | `cell-line-height` | `1.2` | Text line height |
142
+ | `row-drag-handle-color` | `var(--bs-secondary-color, #6c757d)` | Row drag handle at rest |
143
+ | `row-drag-indicator-size` | `2px` | Thickness of the drop indicator line |
144
+ | `detail-padding` | `0` | Inset around a master/detail row's nested grid. Flush by default — padding here is height the virtual scroller cannot account for. |
142
145
  | `action-btn-size` | `20px` | Row action buttons, checkboxes, icons |
143
146
  | `action-btn-radius` | `4px` | Small control corner radius |
144
147
  | `border-radius` | `0` | Outer grid corner radius |
@@ -153,15 +156,57 @@ Legacy `@import` with pre-defined variables also still works.
153
156
 
154
157
  UX guidance when customizing: keep `cell-height` ≥ 24px so click targets stay usable, keep text/background pairs at a WCAG contrast of at least 4.5:1, and derive hover/selected states from your primary color at low opacity so they remain distinguishable in both light and dark themes.
155
158
 
159
+ ## Column callbacks
160
+
161
+ Every callback on a column definition comes in one of two scopes, and the params
162
+ say which.
163
+
164
+ **Cell-scoped** — resolved per row, and all handed the same object:
165
+ `value`, `data`, `node`, `rowIndex`, `field`, `columnDef`, `api`, `context`,
166
+ plus whatever the column declared in `cellRendererParams` (the grid's own fields
167
+ win a name collision).
168
+
169
+ `editable` · `updatable` · `disable` · `hideActionButton` · `rowDrag` ·
170
+ `cellClass` · `cellStyle` · `cellRenderer` · `valueFormatter`
171
+
172
+ **Header-scoped** — resolved once per column, when the columns are registered.
173
+ A header is one cell for the whole column, so there is no row: `columnDef`,
174
+ `field`, `context`.
175
+
176
+ `sortable` · `resizable` · `dragable` · `suppressHeaderMenuButton` ·
177
+ `headerClass` · `headerStyle`
178
+
179
+ `valueGetter` is its own shape (`OneValueGetterParams`): `data`, `rowIndex`,
180
+ `node`, `context`.
181
+
156
182
  ## Features
157
183
 
158
- - Column definitions with value getters, cell renderers, and validation
184
+ - Column definitions with value getters, value formatters, cell renderers and validation
185
+ - Sorting, including multi-column through the sort model
186
+ - Quick filter and a programmatic column filter model
159
187
  - Tree data with expand/collapse and auto group columns
160
188
  - Master/detail nested grids
161
189
  - Inline cell editing with input validation
162
190
  - Row and cell selection, header checkbox select-all
163
- - Pagination and virtual scrolling (Angular CDK)
164
- - Row action buttons and cell option menus
191
+ - Pinned columns (left/right) and pinned rows (top/bottom)
192
+ - Row drag & drop, operable by pointer or keyboard
193
+ - Row action buttons and per-cell option menus
194
+ - Virtual scrolling (Angular CDK)
195
+
196
+ ## Not implemented
197
+
198
+ Declared in the public types but inert, and documented as such rather than
199
+ quietly omitted:
200
+
201
+ - `columnDef.flex` — no flex sizing; use explicit widths
202
+ - `columnDef.filterable` — no filter UI ships; filtering is API-driven
203
+ - `columnDef.valueSetter` — never invoked, and its signature could not work
204
+
205
+ No output reaches the host for a committed cell edit or a sort change; read
206
+ `api.sortModel` and handle edits through `node.setDataValue`.
207
+
208
+ Pagination renders a bar and emits navigation intents — it does not page your
209
+ rows for you.
165
210
 
166
211
  ## License
167
212
 
@@ -2,12 +2,13 @@ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core
2
2
  import { OneGridApi } from '../../core/instants/one-grid-api.class';
3
3
  import { OneGridEventService } from '../../core/services/one-grid-event.service';
4
4
  import { OneGridSelectionService } from '../../core/services/one-grid-selection.service';
5
- import { fromEvent, Subject, Subscription } from 'rxjs';
5
+ import { Subject, Subscription } from 'rxjs';
6
6
  import { OneGridExpansionService } from '../../core/services/one-grid-expansion.service';
7
7
  import { OneGridRowService } from '../../core/services/one-grid-row.service';
8
8
  import { OneGridCellService } from '../../core/services/one-grid-cell.service';
9
9
  import { OgColumnService } from '../../core/services/og-column.service';
10
10
  import _ from 'lodash';
11
+ import { OneGridRowDragService } from '../../core/services/one-grid-row-drag.service';
11
12
  import * as i0 from "@angular/core";
12
13
  import * as i1 from "../../core/instants/one-grid-api.class";
13
14
  import * as i2 from "../../core/services/one-grid-event.service";
@@ -29,6 +30,14 @@ export class OneGridComponent {
29
30
  this.groupColumnDefs = [];
30
31
  this.defaultColumnDef = {};
31
32
  this.columnDefs = [];
33
+ /**
34
+ * Rows anchored above the scrolling area — a header summary, or an entry line.
35
+ * They keep column alignment and scroll sideways with the body, but are not
36
+ * data: sorting, filtering, selection and the row count all pass them by.
37
+ */
38
+ this.pinnedTopRowData = [];
39
+ /** Rows anchored below the scrolling area, typically a totals row. */
40
+ this.pinnedBottomRowData = [];
32
41
  // RXJS Properties
33
42
  this.gridCopy$ = new Subject();
34
43
  /**
@@ -46,6 +55,11 @@ export class OneGridComponent {
46
55
  /**
47
56
  * Bind Row Action Events & Data to Parent
48
57
  */
58
+ /**
59
+ * A row finished moving. Fires once per completed reorder — not while the
60
+ * pointer is in flight — and only when the position actually changed.
61
+ */
62
+ this.rowDragEnd = new EventEmitter();
49
63
  this.onGridReady = new EventEmitter();
50
64
  this.onRowGotoDetail = new EventEmitter();
51
65
  this.onRowAddNew = new EventEmitter();
@@ -93,6 +107,15 @@ export class OneGridComponent {
93
107
  if (changes["rowData"] && !changes["rowData"]?.firstChange) {
94
108
  this.treeData || this.masterDetail ? this.api.updateRowData(this.rowData) : this.api.setRowData(this.rowData);
95
109
  }
110
+ // Only later changes. The first one arrives before ngOnInit has run
111
+ // api.init, so the column definitions are not registered yet and the body
112
+ // has not subscribed — the initial load happens in ngAfterViewInit instead.
113
+ if (changes["pinnedTopRowData"] && !changes["pinnedTopRowData"].firstChange) {
114
+ this.api.setPinnedRowData('top', this.pinnedTopRowData);
115
+ }
116
+ if (changes["pinnedBottomRowData"] && !changes["pinnedBottomRowData"].firstChange) {
117
+ this.api.setPinnedRowData('bottom', this.pinnedBottomRowData);
118
+ }
96
119
  }
97
120
  ngOnInit() {
98
121
  /**
@@ -120,7 +143,18 @@ export class OneGridComponent {
120
143
  /**
121
144
  * Initialize One Grid API
122
145
  */
123
- this.api.init(this.gridType, this.rowSelection, this.columnDefs, this.defaultColumnDef, this.context, this.masterDetail, this.detailCellRendererParams, this.detailRendererComponent, this.treeData, this.groupColumnDefs);
146
+ this.api.init({
147
+ gridType: this.gridType,
148
+ columnDefs: this.columnDefs,
149
+ defaultColumnDef: this.defaultColumnDef,
150
+ groupColumnDefs: this.groupColumnDefs,
151
+ context: this.context,
152
+ rowSelection: this.rowSelection,
153
+ masterDetail: this.masterDetail,
154
+ detailCellRendererParams: this.detailCellRendererParams,
155
+ detailRendererComponent: this.detailRendererComponent,
156
+ treeData: this.treeData,
157
+ });
124
158
  /**
125
159
  * Setup Master Detail Configuration
126
160
  */
@@ -148,14 +182,20 @@ export class OneGridComponent {
148
182
  }));
149
183
  }
150
184
  ngAfterViewInit() {
151
- const headerViewport = this.elementRef.nativeElement.querySelector('.one-grid-header-column');
152
- const bodyViewport = this.elementRef.nativeElement.querySelector('.one-grid-body-viewport');
153
- // Listen Scroll Event Changed
154
- this.subscriptions.add(fromEvent(bodyViewport, 'scroll').subscribe(() => {
155
- if (headerViewport) {
156
- headerViewport.scrollLeft = bodyViewport.scrollLeft;
157
- }
158
- }));
185
+ // The header follows the body through (bodyScroll) -> [scrollLeft]. A second
186
+ // subscription used to live here that queried '.one-grid-header-column' — a
187
+ // header *cell*, not the viewport — and assigned scrollLeft to it, which
188
+ // does nothing. It has been removed rather than repaired: the binding path
189
+ // is the one that works, and it now drives the pinned columns too.
190
+ // Pinned rows, now that the columns are registered and the body is
191
+ // listening. Unlike rowData these are not loaded through (onGridReady) —
192
+ // binding them is the whole contract — so the grid loads them itself.
193
+ if (this.pinnedTopRowData?.length) {
194
+ this.api.setPinnedRowData('top', this.pinnedTopRowData);
195
+ }
196
+ if (this.pinnedBottomRowData?.length) {
197
+ this.api.setPinnedRowData('bottom', this.pinnedBottomRowData);
198
+ }
159
199
  /**
160
200
  * Emit Grid Ready Event
161
201
  */
@@ -254,6 +294,9 @@ export class OneGridComponent {
254
294
  invokePageSizeChange(pageSize) {
255
295
  this.pageSizeChange.emit(pageSize);
256
296
  }
297
+ invokeRowDragEnd(event) {
298
+ this.rowDragEnd.emit(event);
299
+ }
257
300
  invokeExpansionChangedClick(event) {
258
301
  this.expansionChanged.emit(event);
259
302
  }
@@ -266,15 +309,16 @@ export class OneGridComponent {
266
309
  this.subscriptions.unsubscribe();
267
310
  }
268
311
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridComponent, deps: [{ token: i1.OneGridApi }, { token: i2.OneGridEventService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
269
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridComponent, selector: "one-grid", inputs: { rowNumber: "rowNumber", allowedEdit: "allowedEdit", submitted: "submitted", context: "context", rowData: "rowData", rowSelection: "rowSelection", enableGroupColumnDefs: "enableGroupColumnDefs", groupColumnDefs: "groupColumnDefs", defaultColumnDef: "defaultColumnDef", columnDefs: "columnDefs", gridType: "gridType", masterDetail: "masterDetail", masterNode: "masterNode", detailCellRendererParams: "detailCellRendererParams", detailRendererComponent: "detailRendererComponent", treeData: "treeData", treeDataChildrenField: "treeDataChildrenField", autoGroupColumnDef: "autoGroupColumnDef", groupDefaultExpanded: "groupDefaultExpanded", pagination: "pagination", paginate: "paginate" }, outputs: { onGridReady: "onGridReady", onRowGotoDetail: "onRowGotoDetail", onRowAddNew: "onRowAddNew", onRowView: "onRowView", onRowLocation: "onRowLocation", onRowDocument: "onRowDocument", onRowCopy: "onRowCopy", onRowDelete: "onRowDelete", onRowGotoList: "onRowGotoList", onRowEdit: "onRowEdit", onRowPrint: "onRowPrint", onRowHistory: "onRowHistory", onRowOption: "onRowOption", onRowLanguage: "onRowLanguage", onRowSelection: "onRowSelection", onShiftDoubleClick: "onShiftDoubleClick", rowCountChanged: "rowCountChanged", selectionChanged: "selectionChanged", expansionChanged: "expansionChanged", cellOptionSelect: "cellOptionSelect", onRowCellOption: "onRowCellOption", goToFirst: "goToFirst", goToPrevious: "goToPrevious", goToNext: "goToNext", goToLast: "goToLast", pageSizeChange: "pageSizeChange" }, providers: [
312
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridComponent, selector: "one-grid", inputs: { rowNumber: "rowNumber", allowedEdit: "allowedEdit", submitted: "submitted", context: "context", rowData: "rowData", rowSelection: "rowSelection", enableGroupColumnDefs: "enableGroupColumnDefs", groupColumnDefs: "groupColumnDefs", defaultColumnDef: "defaultColumnDef", columnDefs: "columnDefs", pinnedTopRowData: "pinnedTopRowData", pinnedBottomRowData: "pinnedBottomRowData", gridType: "gridType", masterDetail: "masterDetail", masterNode: "masterNode", detailCellRendererParams: "detailCellRendererParams", detailRendererComponent: "detailRendererComponent", treeData: "treeData", treeDataChildrenField: "treeDataChildrenField", autoGroupColumnDef: "autoGroupColumnDef", groupDefaultExpanded: "groupDefaultExpanded", pagination: "pagination", paginate: "paginate" }, outputs: { rowDragEnd: "rowDragEnd", onGridReady: "onGridReady", onRowGotoDetail: "onRowGotoDetail", onRowAddNew: "onRowAddNew", onRowView: "onRowView", onRowLocation: "onRowLocation", onRowDocument: "onRowDocument", onRowCopy: "onRowCopy", onRowDelete: "onRowDelete", onRowGotoList: "onRowGotoList", onRowEdit: "onRowEdit", onRowPrint: "onRowPrint", onRowHistory: "onRowHistory", onRowOption: "onRowOption", onRowLanguage: "onRowLanguage", onRowSelection: "onRowSelection", onShiftDoubleClick: "onShiftDoubleClick", rowCountChanged: "rowCountChanged", selectionChanged: "selectionChanged", expansionChanged: "expansionChanged", cellOptionSelect: "cellOptionSelect", onRowCellOption: "onRowCellOption", goToFirst: "goToFirst", goToPrevious: "goToPrevious", goToNext: "goToNext", goToLast: "goToLast", pageSizeChange: "pageSizeChange" }, providers: [
270
313
  OneGridEventService,
271
314
  OneGridApi,
272
315
  OgColumnService,
273
316
  OneGridSelectionService,
274
317
  OneGridExpansionService,
275
318
  OneGridRowService,
276
- OneGridCellService
277
- ], viewQueries: [{ propertyName: "ogRef", first: true, predicate: ["ogRef"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div #ogRef class=\"one-grid\" (copy)=\"onGridCopy($event)\" tabindex=\"0\">\n \n <!-- Headers -->\n <one-grid-header\n [api]=\"api\"\n [enableGroupColumnDefs]=\"enableGroupColumnDefs\"\n [allowedEdit]=\"allowedEdit\"\n [scrollLeft]=\"bodyScrollLeft\"\n />\n\n <!-- Body -->\n <one-grid-body\n [gridCopy$]=\"gridCopy$\"\n [rowData]=\"rowData\"\n [api]=\"api\"\n [rowNumber]=\"rowNumber\"\n [pagination]=\"pagination\"\n [allowedEdit]=\"allowedEdit\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n [treeData]=\"treeData\"\n [gridType]=\"gridType\"\n [masterDetail]=\"masterDetail\"\n [masterNode]=\"masterNode\"\n [detailCellRendererParams]=\"detailCellRendererParams\"\n [detailRendererComponent]=\"detailRendererComponent\"\n [detailGridTemplate]=\"detailGridTpl\"\n [treeDataChildrenField]=\"treeDataChildrenField\"\n [autoGroupColumnDef]=\"autoGroupColumnDef\"\n [groupDefaultExpanded]=\"groupDefaultExpanded\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onRowSelection)=\"invokeRowActionSelection($event)\"\n (onShiftDoubleClick)=\"invokeShiftDoubleClick($event)\"\n (rowCountChanged)=\"invokeRowCountChanged($event)\"\n (cellOptionSelect)=\"cellOptionMenuSelected($event)\"\n (bodyScroll)=\"onBodyScroll($event)\"\n />\n \n <!-- Pagination -->\n @if (pagination) {\n <one-grid-pagination\n [paginate]=\"paginate\"\n (goToFirst)=\"invokeGoToFirst()\"\n (goToLast)=\"invokeGoToLast()\"\n (goToPrevious)=\"invokeGoToPrevious()\"\n (goToNext)=\"invokeGoToNext()\"\n (pageSizeChange)=\"invokePageSizeChange($event)\"\n />\n }\n\n <!-- Master Detail Grid template, rendered inside one-grid-body via ngTemplateOutlet.\n Declared here (self-reference) so one-grid-body's template does not need to\n import one-grid, which would create an unsupported compile-time cycle. -->\n <ng-template #detailGridTpl let-node=\"node\">\n <one-grid\n [style.height.px]=\"node.detailRowHeight\"\n [gridType]=\"'detail'\"\n [masterNode]=\"node\"\n [masterDetail]=\"masterDetail\"\n [defaultColumnDef]=\"detailCellRendererParams.detailGridOptions.defaultColumnDef\"\n [columnDefs]=\"detailCellRendererParams.detailGridOptions.columnDefs\"\n [rowData]=\"node?.detailRowData\"\n [rowNumber]=\"detailCellRendererParams.detailGridOptions?.rowNumber\"\n [allowedEdit]=\"allowedEdit\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onGridReady)=\"onDetailGridReady($event)\"\n />\n </ng-template>\n</div>", styles: [""], dependencies: [{ kind: "component", type: OneGridComponent, selector: "one-grid", inputs: ["rowNumber", "allowedEdit", "submitted", "context", "rowData", "rowSelection", "enableGroupColumnDefs", "groupColumnDefs", "defaultColumnDef", "columnDefs", "gridType", "masterDetail", "masterNode", "detailCellRendererParams", "detailRendererComponent", "treeData", "treeDataChildrenField", "autoGroupColumnDef", "groupDefaultExpanded", "pagination", "paginate"], outputs: ["onGridReady", "onRowGotoDetail", "onRowAddNew", "onRowView", "onRowLocation", "onRowDocument", "onRowCopy", "onRowDelete", "onRowGotoList", "onRowEdit", "onRowPrint", "onRowHistory", "onRowOption", "onRowLanguage", "onRowSelection", "onShiftDoubleClick", "rowCountChanged", "selectionChanged", "expansionChanged", "cellOptionSelect", "onRowCellOption", "goToFirst", "goToPrevious", "goToNext", "goToLast", "pageSizeChange"] }, { kind: "component", type: i3.OneGridHeaderComponent, selector: "one-grid-header", inputs: ["scrollLeft", "allowedEdit", "enableGroupColumnDefs", "api"] }, { kind: "component", type: i4.OneGridBodyComponent, selector: "one-grid-body", inputs: ["rowData", "rowNumber", "api", "pagination", "allowedEdit", "enableGroupColumnDefs", "submitted", "context", "getRowId", "gridCopy$", "gridType", "masterDetail", "masterNode", "detailRowMaxHeight", "detailCellRendererParams", "detailGridTemplate", "detailRendererComponent", "treeData", "treeDataChildrenField", "autoGroupColumnDef", "groupDefaultExpanded"], outputs: ["onRowGotoDetail", "onRowAddNew", "onRowView", "onRowCopy", "onRowLocation", "onRowDocument", "onRowDelete", "onRowGotoList", "onRowEdit", "onRowPrint", "onRowHistory", "onRowOption", "onRowLanguage", "onRowCellOption", "onRowSelection", "onShiftDoubleClick", "rowCountChanged", "expansionChanged", "bodyScroll", "cellOptionSelect"] }, { kind: "component", type: i5.OneGridPaginationComponent, selector: "one-grid-pagination", inputs: ["paginate"], outputs: ["goToFirst", "goToPrevious", "goToNext", "goToLast", "pageSizeChange"] }] }); }
319
+ OneGridCellService,
320
+ OneGridRowDragService
321
+ ], viewQueries: [{ propertyName: "ogRef", first: true, predicate: ["ogRef"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<!-- No tabindex here. The tab stop belongs on the body viewport, which is the\n element that actually scrolls; a focusable wrapper around a scrollable\n child is reachable but cannot be scrolled with the keyboard. The copy\n handler is unaffected: a copy event fired at the focused viewport bubbles\n up to here. -->\n<div #ogRef class=\"one-grid\" (copy)=\"onGridCopy($event)\">\n \n <!-- Headers -->\n <one-grid-header\n [api]=\"api\"\n [enableGroupColumnDefs]=\"enableGroupColumnDefs\"\n [allowedEdit]=\"allowedEdit\"\n [scrollLeft]=\"bodyScrollLeft\"\n />\n\n <!-- Body -->\n <one-grid-body\n [gridCopy$]=\"gridCopy$\"\n [rowData]=\"rowData\"\n [pinnedTopRowData]=\"pinnedTopRowData\"\n [pinnedBottomRowData]=\"pinnedBottomRowData\"\n [api]=\"api\"\n [rowNumber]=\"rowNumber\"\n [pagination]=\"pagination\"\n [allowedEdit]=\"allowedEdit\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n [treeData]=\"treeData\"\n [gridType]=\"gridType\"\n [masterDetail]=\"masterDetail\"\n [masterNode]=\"masterNode\"\n [detailCellRendererParams]=\"detailCellRendererParams\"\n [detailRendererComponent]=\"detailRendererComponent\"\n [detailGridTemplate]=\"detailGridTpl\"\n [treeDataChildrenField]=\"treeDataChildrenField\"\n [autoGroupColumnDef]=\"autoGroupColumnDef\"\n [groupDefaultExpanded]=\"groupDefaultExpanded\"\n (rowDragEnd)=\"invokeRowDragEnd($event)\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onRowSelection)=\"invokeRowActionSelection($event)\"\n (onShiftDoubleClick)=\"invokeShiftDoubleClick($event)\"\n (rowCountChanged)=\"invokeRowCountChanged($event)\"\n (cellOptionSelect)=\"cellOptionMenuSelected($event)\"\n (bodyScroll)=\"onBodyScroll($event)\"\n />\n \n <!-- Pagination -->\n @if (pagination) {\n <one-grid-pagination\n [paginate]=\"paginate\"\n (goToFirst)=\"invokeGoToFirst()\"\n (goToLast)=\"invokeGoToLast()\"\n (goToPrevious)=\"invokeGoToPrevious()\"\n (goToNext)=\"invokeGoToNext()\"\n (pageSizeChange)=\"invokePageSizeChange($event)\"\n />\n }\n\n <!-- Master Detail Grid template, rendered inside one-grid-body via ngTemplateOutlet.\n Declared here (self-reference) so one-grid-body's template does not need to\n import one-grid, which would create an unsupported compile-time cycle. -->\n <ng-template #detailGridTpl let-node=\"node\">\n <one-grid\n [style.height.px]=\"node.detailRowHeight\"\n [gridType]=\"'detail'\"\n [masterNode]=\"node\"\n [masterDetail]=\"masterDetail\"\n [defaultColumnDef]=\"detailCellRendererParams.detailGridOptions.defaultColumnDef\"\n [columnDefs]=\"detailCellRendererParams.detailGridOptions.columnDefs\"\n [rowData]=\"node?.detailRowData\"\n [rowNumber]=\"detailCellRendererParams.detailGridOptions?.rowNumber\"\n [allowedEdit]=\"allowedEdit\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onGridReady)=\"onDetailGridReady($event)\"\n />\n </ng-template>\n</div>", styles: [""], dependencies: [{ kind: "component", type: OneGridComponent, selector: "one-grid", inputs: ["rowNumber", "allowedEdit", "submitted", "context", "rowData", "rowSelection", "enableGroupColumnDefs", "groupColumnDefs", "defaultColumnDef", "columnDefs", "pinnedTopRowData", "pinnedBottomRowData", "gridType", "masterDetail", "masterNode", "detailCellRendererParams", "detailRendererComponent", "treeData", "treeDataChildrenField", "autoGroupColumnDef", "groupDefaultExpanded", "pagination", "paginate"], outputs: ["rowDragEnd", "onGridReady", "onRowGotoDetail", "onRowAddNew", "onRowView", "onRowLocation", "onRowDocument", "onRowCopy", "onRowDelete", "onRowGotoList", "onRowEdit", "onRowPrint", "onRowHistory", "onRowOption", "onRowLanguage", "onRowSelection", "onShiftDoubleClick", "rowCountChanged", "selectionChanged", "expansionChanged", "cellOptionSelect", "onRowCellOption", "goToFirst", "goToPrevious", "goToNext", "goToLast", "pageSizeChange"] }, { kind: "component", type: i3.OneGridHeaderComponent, selector: "one-grid-header", inputs: ["scrollLeft", "allowedEdit", "enableGroupColumnDefs", "api"] }, { kind: "component", type: i4.OneGridBodyComponent, selector: "one-grid-body", inputs: ["rowData", "rowNumber", "api", "pagination", "allowedEdit", "enableGroupColumnDefs", "submitted", "context", "getRowId", "gridCopy$", "pinnedTopRowData", "pinnedBottomRowData", "gridType", "masterDetail", "masterNode", "detailRowMaxHeight", "detailCellRendererParams", "detailGridTemplate", "detailRendererComponent", "treeData", "treeDataChildrenField", "autoGroupColumnDef", "groupDefaultExpanded"], outputs: ["onRowGotoDetail", "onRowAddNew", "onRowView", "onRowCopy", "onRowLocation", "onRowDocument", "onRowDelete", "onRowGotoList", "onRowEdit", "onRowPrint", "onRowHistory", "onRowOption", "onRowLanguage", "onRowCellOption", "onRowSelection", "onShiftDoubleClick", "rowCountChanged", "expansionChanged", "bodyScroll", "cellOptionSelect", "rowDragEnd"] }, { kind: "component", type: i5.OneGridPaginationComponent, selector: "one-grid-pagination", inputs: ["paginate"], outputs: ["goToFirst", "goToPrevious", "goToNext", "goToLast", "pageSizeChange"] }] }); }
278
322
  }
279
323
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridComponent, decorators: [{
280
324
  type: Component,
@@ -285,8 +329,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
285
329
  OneGridSelectionService,
286
330
  OneGridExpansionService,
287
331
  OneGridRowService,
288
- OneGridCellService
289
- ], template: "<div #ogRef class=\"one-grid\" (copy)=\"onGridCopy($event)\" tabindex=\"0\">\n \n <!-- Headers -->\n <one-grid-header\n [api]=\"api\"\n [enableGroupColumnDefs]=\"enableGroupColumnDefs\"\n [allowedEdit]=\"allowedEdit\"\n [scrollLeft]=\"bodyScrollLeft\"\n />\n\n <!-- Body -->\n <one-grid-body\n [gridCopy$]=\"gridCopy$\"\n [rowData]=\"rowData\"\n [api]=\"api\"\n [rowNumber]=\"rowNumber\"\n [pagination]=\"pagination\"\n [allowedEdit]=\"allowedEdit\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n [treeData]=\"treeData\"\n [gridType]=\"gridType\"\n [masterDetail]=\"masterDetail\"\n [masterNode]=\"masterNode\"\n [detailCellRendererParams]=\"detailCellRendererParams\"\n [detailRendererComponent]=\"detailRendererComponent\"\n [detailGridTemplate]=\"detailGridTpl\"\n [treeDataChildrenField]=\"treeDataChildrenField\"\n [autoGroupColumnDef]=\"autoGroupColumnDef\"\n [groupDefaultExpanded]=\"groupDefaultExpanded\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onRowSelection)=\"invokeRowActionSelection($event)\"\n (onShiftDoubleClick)=\"invokeShiftDoubleClick($event)\"\n (rowCountChanged)=\"invokeRowCountChanged($event)\"\n (cellOptionSelect)=\"cellOptionMenuSelected($event)\"\n (bodyScroll)=\"onBodyScroll($event)\"\n />\n \n <!-- Pagination -->\n @if (pagination) {\n <one-grid-pagination\n [paginate]=\"paginate\"\n (goToFirst)=\"invokeGoToFirst()\"\n (goToLast)=\"invokeGoToLast()\"\n (goToPrevious)=\"invokeGoToPrevious()\"\n (goToNext)=\"invokeGoToNext()\"\n (pageSizeChange)=\"invokePageSizeChange($event)\"\n />\n }\n\n <!-- Master Detail Grid template, rendered inside one-grid-body via ngTemplateOutlet.\n Declared here (self-reference) so one-grid-body's template does not need to\n import one-grid, which would create an unsupported compile-time cycle. -->\n <ng-template #detailGridTpl let-node=\"node\">\n <one-grid\n [style.height.px]=\"node.detailRowHeight\"\n [gridType]=\"'detail'\"\n [masterNode]=\"node\"\n [masterDetail]=\"masterDetail\"\n [defaultColumnDef]=\"detailCellRendererParams.detailGridOptions.defaultColumnDef\"\n [columnDefs]=\"detailCellRendererParams.detailGridOptions.columnDefs\"\n [rowData]=\"node?.detailRowData\"\n [rowNumber]=\"detailCellRendererParams.detailGridOptions?.rowNumber\"\n [allowedEdit]=\"allowedEdit\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onGridReady)=\"onDetailGridReady($event)\"\n />\n </ng-template>\n</div>" }]
332
+ OneGridCellService,
333
+ OneGridRowDragService
334
+ ], template: "<!-- No tabindex here. The tab stop belongs on the body viewport, which is the\n element that actually scrolls; a focusable wrapper around a scrollable\n child is reachable but cannot be scrolled with the keyboard. The copy\n handler is unaffected: a copy event fired at the focused viewport bubbles\n up to here. -->\n<div #ogRef class=\"one-grid\" (copy)=\"onGridCopy($event)\">\n \n <!-- Headers -->\n <one-grid-header\n [api]=\"api\"\n [enableGroupColumnDefs]=\"enableGroupColumnDefs\"\n [allowedEdit]=\"allowedEdit\"\n [scrollLeft]=\"bodyScrollLeft\"\n />\n\n <!-- Body -->\n <one-grid-body\n [gridCopy$]=\"gridCopy$\"\n [rowData]=\"rowData\"\n [pinnedTopRowData]=\"pinnedTopRowData\"\n [pinnedBottomRowData]=\"pinnedBottomRowData\"\n [api]=\"api\"\n [rowNumber]=\"rowNumber\"\n [pagination]=\"pagination\"\n [allowedEdit]=\"allowedEdit\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n [treeData]=\"treeData\"\n [gridType]=\"gridType\"\n [masterDetail]=\"masterDetail\"\n [masterNode]=\"masterNode\"\n [detailCellRendererParams]=\"detailCellRendererParams\"\n [detailRendererComponent]=\"detailRendererComponent\"\n [detailGridTemplate]=\"detailGridTpl\"\n [treeDataChildrenField]=\"treeDataChildrenField\"\n [autoGroupColumnDef]=\"autoGroupColumnDef\"\n [groupDefaultExpanded]=\"groupDefaultExpanded\"\n (rowDragEnd)=\"invokeRowDragEnd($event)\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onRowSelection)=\"invokeRowActionSelection($event)\"\n (onShiftDoubleClick)=\"invokeShiftDoubleClick($event)\"\n (rowCountChanged)=\"invokeRowCountChanged($event)\"\n (cellOptionSelect)=\"cellOptionMenuSelected($event)\"\n (bodyScroll)=\"onBodyScroll($event)\"\n />\n \n <!-- Pagination -->\n @if (pagination) {\n <one-grid-pagination\n [paginate]=\"paginate\"\n (goToFirst)=\"invokeGoToFirst()\"\n (goToLast)=\"invokeGoToLast()\"\n (goToPrevious)=\"invokeGoToPrevious()\"\n (goToNext)=\"invokeGoToNext()\"\n (pageSizeChange)=\"invokePageSizeChange($event)\"\n />\n }\n\n <!-- Master Detail Grid template, rendered inside one-grid-body via ngTemplateOutlet.\n Declared here (self-reference) so one-grid-body's template does not need to\n import one-grid, which would create an unsupported compile-time cycle. -->\n <ng-template #detailGridTpl let-node=\"node\">\n <one-grid\n [style.height.px]=\"node.detailRowHeight\"\n [gridType]=\"'detail'\"\n [masterNode]=\"node\"\n [masterDetail]=\"masterDetail\"\n [defaultColumnDef]=\"detailCellRendererParams.detailGridOptions.defaultColumnDef\"\n [columnDefs]=\"detailCellRendererParams.detailGridOptions.columnDefs\"\n [rowData]=\"node?.detailRowData\"\n [rowNumber]=\"detailCellRendererParams.detailGridOptions?.rowNumber\"\n [allowedEdit]=\"allowedEdit\"\n [submitted]=\"submitted\"\n [context]=\"context\"\n (expansionChanged)=\"invokeExpansionChangedClick($event)\"\n (onRowGotoDetail)=\"invokeRowActionGotoDetail($event)\"\n (onRowAddNew)=\"invokeRowActionAddNew($event)\"\n (onRowView)=\"invokeRowActionView($event)\"\n (onRowLocation)=\"invokeRowActionLocation($event)\"\n (onRowDocument)=\"invokeRowActionDocument($event)\"\n (onRowCopy)=\"invokeRowActionCopy($event)\"\n (onRowDelete)=\"invokeRowActionDelete($event)\"\n (onRowGotoList)=\"invokeRowActionGotoList($event)\"\n (onRowEdit)=\"invokeRowActionEdit($event)\"\n (onRowPrint)=\"invokeRowActionPrint($event)\"\n (onRowHistory)=\"invokeRowActionHistory($event)\"\n (onRowOption)=\"invokeRowActionOption($event)\"\n (onRowLanguage)=\"invokeRowActionLanguage($event)\"\n (onRowCellOption)=\"invokeRowActionCellOption($event)\"\n (onGridReady)=\"onDetailGridReady($event)\"\n />\n </ng-template>\n</div>" }]
290
335
  }], ctorParameters: () => [{ type: i1.OneGridApi }, { type: i2.OneGridEventService }, { type: i0.ElementRef }], propDecorators: { ogRef: [{
291
336
  type: ViewChild,
292
337
  args: ['ogRef', { static: true }]
@@ -310,6 +355,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
310
355
  type: Input
311
356
  }], columnDefs: [{
312
357
  type: Input
358
+ }], pinnedTopRowData: [{
359
+ type: Input
360
+ }], pinnedBottomRowData: [{
361
+ type: Input
313
362
  }], gridType: [{
314
363
  type: Input
315
364
  }], masterDetail: [{
@@ -328,6 +377,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
328
377
  type: Input
329
378
  }], groupDefaultExpanded: [{
330
379
  type: Input
380
+ }], rowDragEnd: [{
381
+ type: Output
331
382
  }], onGridReady: [{
332
383
  type: Output
333
384
  }], onRowGotoDetail: [{
@@ -385,4 +436,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
385
436
  }], pageSizeChange: [{
386
437
  type: Output
387
438
  }] } });
388
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lLWdyaWQvc3JjL2xpYi9jb21wb25lbnRzL29uZS1ncmlkL29uZS1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC9vbmUtZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQXVCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoSyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFHcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFakYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFekYsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBRXpGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RSxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7Ozs7Ozs7QUFrQnZCLE1BQU0sT0FBTyxnQkFBZ0I7SUFxRjNCLFlBQ1ksR0FBZSxFQUNmLFlBQWlDLEVBQ25DLFVBQXNCO1FBRnBCLFFBQUcsR0FBSCxHQUFHLENBQVk7UUFDZixpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFDbkMsZUFBVSxHQUFWLFVB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O3NCQUFuQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBRUcsZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFHRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFLRSxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0ksU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFR5cGUsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT25lQ29sdW1uRGVmLCBPbmVHcm91cENvbHVtbkRlZiB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1jb2x1bW4tZGVmLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IE9uZUdyaWRBcGkgfSBmcm9tICcuLi8uLi9jb3JlL2luc3RhbnRzL29uZS1ncmlkLWFwaS5jbGFzcyc7XG5pbXBvcnQgeyBPbmVSb3dOb2RlIH0gZnJvbSAnLi4vLi4vY29yZS9pbnN0YW50cy9vbmUtcm93LW5vZGUuY2xhc3MnO1xuaW1wb3J0IHsgT25lR3JpZFJlYWR5RXZlbnQsIE9uZUdyaWRSb3dBY3Rpb25FdmVudCwgT25lR3JpZFR5cGUgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtZ3JpZC10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBPbmVHcmlkRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9vbmUtZ3JpZC1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IE9uZVBhZ2luYXRpb25QYXJhbXMgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtcGFnaW5hdGlvbi10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBPbmVHcmlkU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb25lLWdyaWQtc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2VsbE9wdGlvbk1lbnVTZWxlY3RlZEV2ZW50LCBFeHBhbnNpb25DaGFuZ2VkRXZlbnQsIFJvd1NlbGVjdGlvbk1vZGUsIFNlbGVjdGlvbkNoYW5nZWRFdmVudCB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1ldmVudC10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT25lR3JpZEV4cGFuc2lvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLWV4cGFuc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcyB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1tYXN0ZXItZGV0YWlsLm1vZGVsJztcbmltcG9ydCB7IE9uZUdyaWRSb3dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9vbmUtZ3JpZC1yb3cuc2VydmljZSc7XG5pbXBvcnQgeyBPbmVHcmlkQ2VsbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLWNlbGwuc2VydmljZSc7XG5pbXBvcnQgeyBPZ0NvbHVtblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29nLWNvbHVtbi5zZXJ2aWNlJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBPbmVDZWxsUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtdHJlZS1kYXRhLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxuICBzZWxlY3RvcjogJ29uZS1ncmlkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL29uZS1ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL29uZS1ncmlkLmNvbXBvbmVudC5zY3NzJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAgT25lR3JpZEV2ZW50U2VydmljZSxcbiAgICBPbmVHcmlkQXBpLFxuICAgIE9nQ29sdW1uU2VydmljZSxcbiAgICBPbmVHcmlkU2VsZWN0aW9uU2VydmljZSxcbiAgICBPbmVHcmlkRXhwYW5zaW9uU2VydmljZSxcbiAgICBPbmVHcmlkUm93U2VydmljZSxcbiAgICBPbmVHcmlkQ2VsbFNlcnZpY2VcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgT25lR3JpZENvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8qKlxuICAgKiBHZXQgR2VuZXJhbCBEYXRhIGZyb20gUGFyZW50XG4gICAqL1xuICBAVmlld0NoaWxkKCdvZ1JlZicsIHsgc3RhdGljOiB0cnVlIH0pIG9nUmVmITogRWxlbWVudFJlZjtcbiAgQElucHV0KCkgcm93TnVtYmVyOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFsbG93ZWRFZGl0OiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgc3VibWl0dGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvbnRleHQ6IGFueSA9IG51bGw7XG4gIEBJbnB1dCgpIHJvd0RhdGE6IFRbXSA9IFtdO1xuICBASW5wdXQoKSByb3dTZWxlY3Rpb246IFJvd1NlbGVjdGlvbk1vZGUgPSBudWxsO1xuXG4gIEBJbnB1dCgpIGVuYWJsZUdyb3VwQ29sdW1uRGVmczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBncm91cENvbHVtbkRlZnM6IE9uZUdyb3VwQ29sdW1uRGVmW10gPSBbXTtcblxuICBASW5wdXQoKSBkZWZhdWx0Q29sdW1uRGVmOiBPbmVDb2x1bW5EZWY8VD4gPSB7fTtcbiAgQElucHV0KCkgY29sdW1uRGVmczogT25lQ29sdW1uRGVmPFQ+W10gPSBbXTtcblxuICAvLyBSWEpTIFByb3BlcnRpZXNcbiAgcHJvdGVjdGVkIGdyaWRDb3B5JCA9IG5ldyBTdWJqZWN0PENsaXBib2FyZEV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBNYXN0ZXIgRGV0YWlsIEZlYXR1cmVcbiAgICovXG4gIEBJbnB1dCgpIGdyaWRUeXBlOiBPbmVHcmlkVHlwZSA9ICdtYXN0ZXInO1xuICBASW5wdXQoKSBtYXN0ZXJEZXRhaWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbWFzdGVyTm9kZTogT25lUm93Tm9kZSA9IG51bGw7XG4gIEBJbnB1dCgpIGRldGFpbENlbGxSZW5kZXJlclBhcmFtczogT25lRGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zO1xuICBASW5wdXQoKSBkZXRhaWxSZW5kZXJlckNvbXBvbmVudDogVHlwZTxPbmVDZWxsUmVuZGVyZXJDb21wb25lbnQ+O1xuXG4gIC8qKlxuICAgKiBUcmVlIERhdGEgRmVhdHVyZVxuICAgKi9cbiAgQElucHV0KCkgdHJlZURhdGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgdHJlZURhdGFDaGlsZHJlbkZpZWxkOiBzdHJpbmcgPSBudWxsO1xuICBASW5wdXQoKSBhdXRvR3JvdXBDb2x1bW5EZWY6IE9uZUNvbHVtbkRlZjtcbiAgQElucHV0KCkgZ3JvdXBEZWZhdWx0RXhwYW5kZWQ6IG51bWJlciA9IDA7XG5cbiAgLyoqXG4gICAqIEJpbmQgUm93IEFjdGlvbiBFdmVudHMgJiBEYXRhIHRvIFBhcmVudFxuICAgKi9cbiAgQE91dHB1dCgpIG9uR3JpZFJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUmVhZHlFdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93R290b0RldGFpbCA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dBZGROZXcgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93VmlldyA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dMb2NhdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dEb2N1bWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dDb3B5ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0RlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dHb3RvTGlzdCA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dFZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd1ByaW50ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0hpc3RvcnkgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93T3B0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0xhbmd1YWdlID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd1NlbGVjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25TaGlmdERvdWJsZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSByb3dDb3VudENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0aW9uQ2hhbmdlZEV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgZXhwYW5zaW9uQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RXhwYW5zaW9uQ2hhbmdlZEV2ZW50PFQ+PigpO1xuXG4gIC8vIEZvciBjb250ZXh0IG1lbnUgb3B0aW9uXG4gIEBPdXRwdXQoKSBjZWxsT3B0aW9uU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxDZWxsT3B0aW9uTWVudVNlbGVjdGVkRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0NlbGxPcHRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcblxuICAvKipcbiAgICogQmluZCBPbmUgR3JpZCBQYWdpbmF0aW9uIEZlYXR1cmVcbiAgICovXG4gIEBJbnB1dCgpIHBhZ2luYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgcGFnaW5hdGU6IE9uZVBhZ2luYXRpb25QYXJhbXM7XG4gIEBPdXRwdXQoKSBnb1RvRmlyc3QgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBnb1RvUHJldmlvdXMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBnb1RvTmV4dCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGdvVG9MYXN0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcGFnZVNpemVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAvKipcbiAgICogT25lIEdyaWQgUHJvcGVydGllc1xuICAgKi9cbiAgcHJvdGVjdGVkIGJvZHlTY3JvbGxMZWZ0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9vbmVSb3dOdW1iZXJDb2x1bW5EZWY6IE9uZUNvbHVtbkRlZiA9IG51bGw7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgYXBpOiBPbmVHcmlkQXBpLFxuICAgIHByb3RlY3RlZCBldmVudFNlcnZpY2U6IE9uZUdyaWRFdmVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICApIHsgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcblxuICAgIGlmIChjaGFuZ2VzWydtYXN0ZXJOb2RlJ10gJiYgY2hhbmdlc1snbWFzdGVyTm9kZSddLmlzRmlyc3RDaGFuZ2UpIHtcblxuICAgICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsICYmIHRoaXMubWFzdGVyTm9kZS5leHBhbmRlZCAmJiB0aGlzLmdyaWRUeXBlID09PSAnZGV0YWlsJykge1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hcGkuc2V0Um93RGF0YShbLi4udGhpcy5tYXN0ZXJOb2RlLmRldGFpbFJvd0RhdGFdKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbXCJyb3dEYXRhXCJdICYmICFjaGFuZ2VzW1wicm93RGF0YVwiXT8uZmlyc3RDaGFuZ2UpIHtcblxuICAgICAgdGhpcy50cmVlRGF0YSB8fCB0aGlzLm1hc3RlckRldGFpbCA/IHRoaXMuYXBpLnVwZGF0ZVJvd0RhdGEodGhpcy5yb3dEYXRhKSA6IHRoaXMuYXBpLnNldFJvd0RhdGEodGhpcy5yb3dEYXRhKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICAgIC8qKlxuICAgICAqIEluaXQgUm93IE51bWJlciBDb2x1bW4gRGVmXG4gICAgICovXG4gICAgaWYgKHRoaXMucm93TnVtYmVyKSB7XG5cbiAgICAgICB0aGlzLl9vbmVSb3dOdW1iZXJDb2x1bW5EZWYgPSB7XG4gICAgICAgICAgZ3JvdXBJZDogdGhpcy5jb2x1bW5EZWZzWzBdPy5ncm91cElkID8/IG51bGwsXG4gICAgICAgICAgZmllbGQ6ICdfb25lUm93TnVtYmVyJyxcbiAgICAgICAgICBoZWFkZXJOYW1lOiAnTsK6JyxcbiAgICAgICAgICByZXNpemFibGU6IHRydWUsXG4gICAgICAgICAgaGVhZGVyU3R5bGU6IHtcbiAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgICAgICBhbGlnbkl0ZW06ICdjZW50ZXInXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhbGlnbkNvbnRlbnQ6ICdyaWdodCcsXG4gICAgICAgICAgY2VsbENsYXNzOiAnZnctYm9sZCcsXG4gICAgICAgICAgd2lkdGg6IDYwLFxuICAgICAgICAgIG1pbldpZHRoOiA0MCxcbiAgICAgICAgICBtYXhXaWR0aDogMjAwXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIE9uZSBHcmlkIEFQSVxuICAgICAqL1xuICAgIHRoaXMuYXBpLmluaXQodGhpcy5ncmlkVHlwZSwgdGhpcy5yb3dTZWxlY3Rpb24sIHRoaXMuY29sdW1uRGVmcywgdGhpcy5kZWZhdWx0Q29sdW1uRGVmLCB0aGlzLmNvbnRleHQsIHRoaXMubWFzdGVyRGV0YWlsLCB0aGlzLmRldGFpbENlbGxSZW5kZXJlclBhcmFtcywgdGhpcy5kZXRhaWxSZW5kZXJlckNvbXBvbmVudCwgdGhpcy50cmVlRGF0YSwgdGhpcy5ncm91cENvbHVtbkRlZnMpO1xuXG4gICAgLyoqXG4gICAgICogU2V0dXAgTWFzdGVyIERldGFpbCBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsKSB7XG5cbiAgICAgIHRoaXMuYXBpLnNldEdyb3VwRGVmYXVsdEV4cGFuZGVkKHRoaXMuZ3JvdXBEZWZhdWx0RXhwYW5kZWQpO1xuICAgICAgdGhpcy5hcGkuc2V0R2V0RGV0YWlsUm93RGF0YSh0aGlzLmRldGFpbENlbGxSZW5kZXJlclBhcmFtcz8uZ2V0RGV0YWlsUm93RGF0YSA/PyBudWxsKTtcblxuICAgICAgaWYgKHRoaXMucm93TnVtYmVyKSB7XG5cbiAgICAgICAgY29uc3QgY29sdW1uRGVmcyA9IF8uY29uY2F0KHRoaXMuX29uZVJvd051bWJlckNvbHVtbkRlZiwgdGhpcy5jb2x1bW5EZWZzKTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYXBpLnNldENvbHVtbkRlZnMoY29sdW1uRGVmcykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHVwIFRyZWUgRGF0YSBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgaWYgKHRoaXMudHJlZURhdGEpIHtcblxuICAgICAgdGhpcy5ncmlkVHlwZSA9ICd0cmVlJztcblxuICAgICAgY29uc3QgY29sdW1uRGVmcyA9IHRoaXMucm93TnVtYmVyID8gXy5jb25jYXQodGhpcy5fb25lUm93TnVtYmVyQ29sdW1uRGVmLCB0aGlzLmF1dG9Hcm91cENvbHVtbkRlZiwgdGhpcy5jb2x1bW5EZWZzKSA6IF8uY29uY2F0KHRoaXMuYXV0b0dyb3VwQ29sdW1uRGVmLCB0aGlzLmNvbHVtbkRlZnMpO1xuXG4gICAgICB0aGlzLmFwaS5zZXRUcmVlRGF0YUNoaWxkcmVuRmllbGQodGhpcy50cmVlRGF0YUNoaWxkcmVuRmllbGQpO1xuICAgICAgdGhpcy5hcGkuc2V0R3JvdXBEZWZhdWx0RXhwYW5kZWQodGhpcy5ncm91cERlZmF1bHRFeHBhbmRlZCk7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hcGkuc2V0Q29sdW1uRGVmcyhjb2x1bW5EZWZzKSk7XG4gICAgfVxuXG4gICAgLy8gTGlzdGVuIFNlbGVjdGlvbiBDaGFuZ2VkIEV2ZW50XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmV2ZW50U2VydmljZS5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3Rpb25DaGFuZ2VkJywgKHBheWxvYWQ6IFNlbGVjdGlvbkNoYW5nZWRFdmVudDxUPikgPT4ge1xuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHBheWxvYWQpO1xuICAgIH0pKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcblxuICAgIGNvbnN0IGhlYWRlclZpZXdwb3J0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLm9uZS1ncmlkLWhlYWRlci1jb2x1bW4nKTtcbiAgICBjb25zdCBib2R5Vmlld3BvcnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcub25lLWdyaWQtYm9keS12aWV3cG9ydCcpO1xuXG4gICAgLy8gTGlzdGVuIFNjcm9sbCBFdmVudCBDaGFuZ2VkXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcblxuICAgICAgZnJvbUV2ZW50KGJvZHlWaWV3cG9ydCwgJ3Njcm9sbCcpLnN1YnNjcmliZSgoKSA9PiB7XG5cbiAgICAgICAgaWYgKGhlYWRlclZpZXdwb3J0KSB7XG5cbiAgICAgICAgICBoZWFkZXJWaWV3cG9ydC5zY3JvbGxMZWZ0ID0gYm9keVZpZXdwb3J0LnNjcm9sbExlZnRcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICogRW1pdCBHcmlkIFJlYWR5IEV2ZW50XG4gICAgICovXG4gICAgdGhpcy5vbkdyaWRSZWFkeS5lbWl0KHsgYXBpOiB0aGlzLmFwaSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgQm9keSBTY3JvbGwgRXZlbnRcbiAgICovXG4gIG9uQm9keVNjcm9sbChzY3JvbGxMZWZ0OiBudW1iZXIpIHtcblxuICAgIHRoaXMuYm9keVNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBSZWFkeSBFdmVudCBvZiBhIG5lc3RlZCBNYXN0ZXIgRGV0YWlsIEdyaWRcbiAgICovXG4gIG9uRGV0YWlsR3JpZFJlYWR5KHBhcmFtczogT25lR3JpZFJlYWR5RXZlbnQpIHtcblxuICAgIHBhcmFtcy5hcGkuc2V0Um93RGF0YSh0aGlzLm1hc3Rlck5vZGU/LmRldGFpbFJvd0RhdGEgPz8gW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhc3NpbmcgY29weSBldmVudCB0byBncmlkIGJvZHlcbiAgICovXG4gIG9uR3JpZENvcHkoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSB7XG5cbiAgICB0aGlzLmdyaWRDb3B5JC5uZXh0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kIFJvdyBBY3Rpb24gRXZlbnRzIHRvIFBhcmVudCBDb21wb25lbnRcbiAgICovXG4gIGludm9rZVJvd0FjdGlvbkdvdG9EZXRhaWwoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0dvdG9EZXRhaWwuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25BZGROZXcoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0FkZE5ldy5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvblZpZXcoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd1ZpZXcuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25Mb2NhdGlvbihldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93TG9jYXRpb24uZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25Eb2N1bWVudChldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93RG9jdW1lbnQuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25Db3B5KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dDb3B5LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uRGVsZXRlKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dEZWxldGUuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25Hb3RvTGlzdChldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93R290b0xpc3QuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25FZGl0KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dFZGl0LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uUHJpbnQoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd1ByaW50LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uSGlzdG9yeShldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93SGlzdG9yeS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbk9wdGlvbihldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93T3B0aW9uLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uTGFuZ3VhZ2UoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0xhbmd1YWdlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uQ2VsbE9wdGlvbihldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93Q2VsbE9wdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvblNlbGVjdGlvbihldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93U2VsZWN0aW9uLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlU2hpZnREb3VibGVDbGljayhldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uU2hpZnREb3VibGVDbGljay5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0NvdW50Q2hhbmdlZChsZW5ndGg6IG51bWJlcikge1xuXG4gICAgdGhpcy5yb3dDb3VudENoYW5nZWQuZW1pdChsZW5ndGgpO1xuICB9XG5cbiAgY2VsbE9wdGlvbk1lbnVTZWxlY3RlZChldmVudDogQ2VsbE9wdGlvbk1lbnVTZWxlY3RlZEV2ZW50KSB7XG5cbiAgICB0aGlzLmNlbGxPcHRpb25TZWxlY3QuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQmluZyBQYWdpbmF0aW9uIEV2ZW50cyB0byBQYXJlbnQgQ29tcG9uZW50XG4gICAqL1xuICBpbnZva2VHb1RvRmlyc3QoKSB7XG5cbiAgICB0aGlzLmdvVG9GaXJzdC5lbWl0KCk7XG4gIH1cblxuICBpbnZva2VHb1RvUHJldmlvdXMoKSB7XG5cbiAgICB0aGlzLmdvVG9QcmV2aW91cy5lbWl0KCk7XG4gIH1cblxuICBpbnZva2VHb1RvTmV4dCgpIHtcblxuICAgIHRoaXMuZ29Ub05leHQuZW1pdCgpO1xuICB9XG5cbiAgaW52b2tlR29Ub0xhc3QoKSB7XG5cbiAgICB0aGlzLmdvVG9MYXN0LmVtaXQoKTtcbiAgfVxuXG4gIGludm9rZVBhZ2VTaXplQ2hhbmdlKHBhZ2VTaXplOiBudW1iZXIpIHtcblxuICAgIHRoaXMucGFnZVNpemVDaGFuZ2UuZW1pdChwYWdlU2l6ZSk7XG4gIH1cblxuICBpbnZva2VFeHBhbnNpb25DaGFuZ2VkQ2xpY2soZXZlbnQ6IEV4cGFuc2lvbkNoYW5nZWRFdmVudDxUPikge1xuXG4gICAgdGhpcy5leHBhbnNpb25DaGFuZ2VkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBVbnN1YnNjcmliZSBBbGwgRXZlbnQgTGlzdGVuZGVyc1xuICAgKi9cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG5cbiAgICB0aGlzLnJvd0RhdGEgPSBbXTtcblxuICAgIHRoaXMuYXBpLmRlc3Ryb3koKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iLCI8ZGl2ICNvZ1JlZiBjbGFzcz1cIm9uZS1ncmlkXCIgKGNvcHkpPVwib25HcmlkQ29weSgkZXZlbnQpXCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgXG4gICAgPCEtLSBIZWFkZXJzIC0tPlxuICAgIDxvbmUtZ3JpZC1oZWFkZXJcbiAgICAgICAgW2FwaV09XCJhcGlcIlxuICAgICAgICBbZW5hYmxlR3JvdXBDb2x1bW5EZWZzXT1cImVuYWJsZUdyb3VwQ29sdW1uRGVmc1wiXG4gICAgICAgIFthbGxvd2VkRWRpdF09XCJhbGxvd2VkRWRpdFwiXG4gICAgICAgIFtzY3JvbGxMZWZ0XT1cImJvZHlTY3JvbGxMZWZ0XCJcbiAgICAvPlxuXG4gICAgPCEtLSBCb2R5IC0tPlxuICAgIDxvbmUtZ3JpZC1ib2R5XG4gICAgICAgIFtncmlkQ29weSRdPVwiZ3JpZENvcHkkXCJcbiAgICAgICAgW3Jvd0RhdGFdPVwicm93RGF0YVwiXG4gICAgICAgIFthcGldPVwiYXBpXCJcbiAgICAgICAgW3Jvd051bWJlcl09XCJyb3dOdW1iZXJcIlxuICAgICAgICBbcGFnaW5hdGlvbl09XCJwYWdpbmF0aW9uXCJcbiAgICAgICAgW2FsbG93ZWRFZGl0XT1cImFsbG93ZWRFZGl0XCJcbiAgICAgICAgW3N1Ym1pdHRlZF09XCJzdWJtaXR0ZWRcIlxuICAgICAgICBbY29udGV4dF09XCJjb250ZXh0XCJcbiAgICAgICAgW3RyZWVEYXRhXT1cInRyZWVEYXRhXCJcbiAgICAgICAgW2dyaWRUeXBlXT1cImdyaWRUeXBlXCJcbiAgICAgICAgW21hc3RlckRldGFpbF09XCJtYXN0ZXJEZXRhaWxcIlxuICAgICAgICBbbWFzdGVyTm9kZV09XCJtYXN0ZXJOb2RlXCJcbiAgICAgICAgW2RldGFpbENlbGxSZW5kZXJlclBhcmFtc109XCJkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXNcIlxuICAgICAgICBbZGV0YWlsUmVuZGVyZXJDb21wb25lbnRdPVwiZGV0YWlsUmVuZGVyZXJDb21wb25lbnRcIlxuICAgICAgICBbZGV0YWlsR3JpZFRlbXBsYXRlXT1cImRldGFpbEdyaWRUcGxcIlxuICAgICAgICBbdHJlZURhdGFDaGlsZHJlbkZpZWxkXT1cInRyZWVEYXRhQ2hpbGRyZW5GaWVsZFwiXG4gICAgICAgIFthdXRvR3JvdXBDb2x1bW5EZWZdPVwiYXV0b0dyb3VwQ29sdW1uRGVmXCJcbiAgICAgICAgW2dyb3VwRGVmYXVsdEV4cGFuZGVkXT1cImdyb3VwRGVmYXVsdEV4cGFuZGVkXCJcbiAgICAgICAgKGV4cGFuc2lvbkNoYW5nZWQpPVwiaW52b2tlRXhwYW5zaW9uQ2hhbmdlZENsaWNrKCRldmVudClcIlxuICAgICAgICAob25Sb3dHb3RvRGV0YWlsKT1cImludm9rZVJvd0FjdGlvbkdvdG9EZXRhaWwoJGV2ZW50KVwiXG4gICAgICAgIChvblJvd0FkZE5ldyk9XCJpbnZva2VSb3dBY3Rpb25BZGROZXcoJGV2ZW50KVwiXG4gICAgICAgIChvblJvd1ZpZXcpPVwiaW52b2tlUm93QWN0aW9uVmlldygkZXZlbnQpXCJcbiAgICAgICAgKG9uUm93TG9jYXRpb24pPVwiaW52b2tlUm93QWN0aW9uTG9jYXRpb24oJGV2ZW50KVwiXG4gICAgICAgIChvblJvd0RvY3VtZW50KT1cImludm9rZVJvd0FjdGlvbkRvY3VtZW50KCRldmVudClcIlxuICAgICAgICAob25Sb3dDb3B5KT1cImludm9rZVJvd0FjdGlvbkNvcHkoJGV2ZW50KVwiXG4gICAgICAgIChvblJvd0RlbGV0ZSk9XCJpbnZva2VSb3dBY3Rpb25EZWxldGUoJGV2ZW50KVwiXG4gICAgICAgIChvblJvd0dvdG9MaXN0KT1cImludm9rZVJvd0FjdGlvbkdvdG9MaXN0KCRldmVudClcIlxuICAgICAgICAob25Sb3dFZGl0KT1cImludm9rZVJvd0FjdGlvbkVkaXQoJGV2ZW50KVwiXG4gICAgICAgIChvblJvd1ByaW50KT1cImludm9rZVJvd0FjdGlvblByaW50KCRldmVudClcIlxuICAgICAgICAob25Sb3dIaXN0b3J5KT1cImludm9rZVJvd0FjdGlvbkhpc3RvcnkoJGV2ZW50KVwiXG4gICAgICAgIChvblJvd09wdGlvbik9XCJpbnZva2VSb3dBY3Rpb25PcHRpb24oJGV2ZW50KVwiXG4gICAgICAgIChvblJvd0xhbmd1YWdlKT1cImludm9rZVJvd0FjdGlvbkxhbmd1YWdlKCRldmVudClcIlxuICAgICAgICAob25Sb3dDZWxsT3B0aW9uKT1cImludm9rZVJvd0FjdGlvbkNlbGxPcHRpb24oJGV2ZW50KVwiXG4gICAgICAgIChvblJvd1NlbGVjdGlvbik9XCJpbnZva2VSb3dBY3Rpb25TZWxlY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgIChvblNoaWZ0RG91YmxlQ2xpY2spPVwiaW52b2tlU2hpZnREb3VibGVDbGljaygkZXZlbnQpXCJcbiAgICAgICAgKHJvd0NvdW50Q2hhbmdlZCk9XCJpbnZva2VSb3dDb3VudENoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgIChjZWxsT3B0aW9uU2VsZWN0KT1cImNlbGxPcHRpb25NZW51U2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAgIChib2R5U2Nyb2xsKT1cIm9uQm9keVNjcm9sbCgkZXZlbnQpXCJcbiAgICAvPlxuICAgIFxuICAgIDwhLS0gUGFnaW5hdGlvbiAtLT5cbiAgICBAaWYgKHBhZ2luYXRpb24pIHtcbiAgICAgICAgPG9uZS1ncmlkLXBhZ2luYXRpb25cbiAgICAgICAgICAgIFtwYWdpbmF0ZV09XCJwYWdpbmF0ZVwiXG4gICAgICAgICAgICAoZ29Ub0ZpcnN0KT1cImludm9rZUdvVG9GaXJzdCgpXCJcbiAgICAgICAgICAgIChnb1RvTGFzdCk9XCJpbnZva2VHb1RvTGFzdCgpXCJcbiAgICAgICAgICAgIChnb1RvUHJldmlvdXMpPVwiaW52b2tlR29Ub1ByZXZpb3VzKClcIlxuICAgICAgICAgICAgKGdvVG9OZXh0KT1cImludm9rZUdvVG9OZXh0KClcIlxuICAgICAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cImludm9rZVBhZ2VTaXplQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAvPlxuICAgIH1cblxuICAgIDwhLS0gTWFzdGVyIERldGFpbCBHcmlkIHRlbXBsYXRlLCByZW5kZXJlZCBpbnNpZGUgb25lLWdyaWQtYm9keSB2aWEgbmdUZW1wbGF0ZU91dGxldC5cbiAgICAgICAgIERlY2xhcmVkIGhlcmUgKHNlbGYtcmVmZXJlbmNlKSBzbyBvbmUtZ3JpZC1ib2R5J3MgdGVtcGxhdGUgZG9lcyBub3QgbmVlZCB0b1xuICAgICAgICAgaW1wb3J0IG9uZS1ncmlkLCB3aGljaCB3b3VsZCBjcmVhdGUgYW4gdW5zdXBwb3J0ZWQgY29tcGlsZS10aW1lIGN5Y2xlLiAtLT5cbiAgICA8bmctdGVtcGxhdGUgI2RldGFpbEdyaWRUcGwgbGV0LW5vZGU9XCJub2RlXCI+XG4gICAgICAgIDxvbmUtZ3JpZFxuICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJub2RlLmRldGFpbFJvd0hlaWdodFwiXG4gICAgICAgICAgICBbZ3JpZFR5cGVdPVwiJ2RldGFpbCdcIlxuICAgICAgICAgICAgW21hc3Rlck5vZGVdPVwibm9kZVwiXG4gICAgICAgICAgICBbbWFzdGVyRGV0YWlsXT1cIm1hc3RlckRldGFpbFwiXG4gICAgICAgICAgICBbZGVmYXVsdENvbHVtbkRlZl09XCJkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMuZGV0YWlsR3JpZE9wdGlvbnMuZGVmYXVsdENvbHVtbkRlZlwiXG4gICAgICAgICAgICBbY29sdW1uRGVmc109XCJkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMuZGV0YWlsR3JpZE9wdGlvbnMuY29sdW1uRGVmc1wiXG4gICAgICAgICAgICBbcm93RGF0YV09XCJub2RlPy5kZXRhaWxSb3dEYXRhXCJcbiAgICAgICAgICAgIFtyb3dOdW1iZXJdPVwiZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zLmRldGFpbEdyaWRPcHRpb25zPy5yb3dOdW1iZXJcIlxuICAgICAgICAgICAgW2FsbG93ZWRFZGl0XT1cImFsbG93ZWRFZGl0XCJcbiAgICAgICAgICAgIFtzdWJtaXR0ZWRdPVwic3VibWl0dGVkXCJcbiAgICAgICAgICAgIFtjb250ZXh0XT1cImNvbnRleHRcIlxuICAgICAgICAgICAgKGV4cGFuc2lvbkNoYW5nZWQpPVwiaW52b2tlRXhwYW5zaW9uQ2hhbmdlZENsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93R290b0RldGFpbCk9XCJpbnZva2VSb3dBY3Rpb25Hb3RvRGV0YWlsKCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93QWRkTmV3KT1cImludm9rZVJvd0FjdGlvbkFkZE5ldygkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd1ZpZXcpPVwiaW52b2tlUm93QWN0aW9uVmlldygkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd0xvY2F0aW9uKT1cImludm9rZVJvd0FjdGlvbkxvY2F0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93RG9jdW1lbnQpPVwiaW52b2tlUm93QWN0aW9uRG9jdW1lbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dDb3B5KT1cImludm9rZVJvd0FjdGlvbkNvcHkoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dEZWxldGUpPVwiaW52b2tlUm93QWN0aW9uRGVsZXRlKCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93R290b0xpc3QpPVwiaW52b2tlUm93QWN0aW9uR290b0xpc3QoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dFZGl0KT1cImludm9rZVJvd0FjdGlvbkVkaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dQcmludCk9XCJpbnZva2VSb3dBY3Rpb25QcmludCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd0hpc3RvcnkpPVwiaW52b2tlUm93QWN0aW9uSGlzdG9yeSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd09wdGlvbik9XCJpbnZva2VSb3dBY3Rpb25PcHRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dMYW5ndWFnZSk9XCJpbnZva2VSb3dBY3Rpb25MYW5ndWFnZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd0NlbGxPcHRpb24pPVwiaW52b2tlUm93QWN0aW9uQ2VsbE9wdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgIChvbkdyaWRSZWFkeSk9XCJvbkRldGFpbEdyaWRSZWFkeSgkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9kaXY+Il19
439
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lLWdyaWQvc3JjL2xpYi9jb21wb25lbnRzL29uZS1ncmlkL29uZS1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC9vbmUtZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQXVCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoSyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFHcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFakYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFekYsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFekYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3hFLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUV2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQzs7Ozs7OztBQW1CdEYsTUFBTSxPQUFPLGdCQUFnQjtJQXFHM0IsWUFDWSxHQUFlLEVBQ2YsWUFBaUMsRUFDbkMsVUFBc0I7UUFGcEIsUUFBRyxHQUFILEdBQUcsQ0FBWTtRQUNmLGlCQUFZ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QUFXO3NCQUFwQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFFRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUdHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUtFLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDSSxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVHlwZSwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPbmVDb2x1bW5EZWYsIE9uZUdyb3VwQ29sdW1uRGVmIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLWNvbHVtbi1kZWYtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lR3JpZEFwaSB9IGZyb20gJy4uLy4uL2NvcmUvaW5zdGFudHMvb25lLWdyaWQtYXBpLmNsYXNzJztcbmltcG9ydCB7IE9uZVJvd05vZGUgfSBmcm9tICcuLi8uLi9jb3JlL2luc3RhbnRzL29uZS1yb3ctbm9kZS5jbGFzcyc7XG5pbXBvcnQgeyBPbmVHcmlkUmVhZHlFdmVudCwgT25lR3JpZFJvd0FjdGlvbkV2ZW50LCBPbmVHcmlkVHlwZSB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1ncmlkLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IE9uZUdyaWRFdmVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgT25lUGFnaW5hdGlvblBhcmFtcyB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1wYWdpbmF0aW9uLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IE9uZUdyaWRTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9vbmUtZ3JpZC1zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBDZWxsT3B0aW9uTWVudVNlbGVjdGVkRXZlbnQsIEV4cGFuc2lvbkNoYW5nZWRFdmVudCwgUm93U2VsZWN0aW9uTW9kZSwgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLWV2ZW50LXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT25lR3JpZEV4cGFuc2lvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLWV4cGFuc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcyB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1tYXN0ZXItZGV0YWlsLm1vZGVsJztcbmltcG9ydCB7IE9uZUdyaWRSb3dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9vbmUtZ3JpZC1yb3cuc2VydmljZSc7XG5pbXBvcnQgeyBPbmVHcmlkQ2VsbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLWNlbGwuc2VydmljZSc7XG5pbXBvcnQgeyBPZ0NvbHVtblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29nLWNvbHVtbi5zZXJ2aWNlJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBPbmVDZWxsUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtdHJlZS1kYXRhLm1vZGVsJztcbmltcG9ydCB7IE9uZUdyaWRSb3dEcmFnU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb25lLWdyaWQtcm93LWRyYWcuc2VydmljZSc7XG5pbXBvcnQgeyBPbmVSb3dEcmFnRXZlbnQgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtcm93LWRyYWcubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogZmFsc2UsXG4gIHNlbGVjdG9yOiAnb25lLWdyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vb25lLWdyaWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vb25lLWdyaWQuY29tcG9uZW50LnNjc3MnLFxuICBwcm92aWRlcnM6IFtcbiAgICBPbmVHcmlkRXZlbnRTZXJ2aWNlLFxuICAgIE9uZUdyaWRBcGksXG4gICAgT2dDb2x1bW5TZXJ2aWNlLFxuICAgIE9uZUdyaWRTZWxlY3Rpb25TZXJ2aWNlLFxuICAgIE9uZUdyaWRFeHBhbnNpb25TZXJ2aWNlLFxuICAgIE9uZUdyaWRSb3dTZXJ2aWNlLFxuICAgIE9uZUdyaWRDZWxsU2VydmljZSxcbiAgICBPbmVHcmlkUm93RHJhZ1NlcnZpY2VcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgT25lR3JpZENvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8qKlxuICAgKiBHZXQgR2VuZXJhbCBEYXRhIGZyb20gUGFyZW50XG4gICAqL1xuICBAVmlld0NoaWxkKCdvZ1JlZicsIHsgc3RhdGljOiB0cnVlIH0pIG9nUmVmITogRWxlbWVudFJlZjtcbiAgQElucHV0KCkgcm93TnVtYmVyOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFsbG93ZWRFZGl0OiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgc3VibWl0dGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvbnRleHQ6IGFueSA9IG51bGw7XG4gIEBJbnB1dCgpIHJvd0RhdGE6IFRbXSA9IFtdO1xuICBASW5wdXQoKSByb3dTZWxlY3Rpb246IFJvd1NlbGVjdGlvbk1vZGUgPSBudWxsO1xuXG4gIEBJbnB1dCgpIGVuYWJsZUdyb3VwQ29sdW1uRGVmczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBncm91cENvbHVtbkRlZnM6IE9uZUdyb3VwQ29sdW1uRGVmW10gPSBbXTtcblxuICBASW5wdXQoKSBkZWZhdWx0Q29sdW1uRGVmOiBPbmVDb2x1bW5EZWY8VD4gPSB7fTtcbiAgQElucHV0KCkgY29sdW1uRGVmczogT25lQ29sdW1uRGVmPFQ+W10gPSBbXTtcblxuICAvKipcbiAgICogUm93cyBhbmNob3JlZCBhYm92ZSB0aGUgc2Nyb2xsaW5nIGFyZWEg4oCUIGEgaGVhZGVyIHN1bW1hcnksIG9yIGFuIGVudHJ5IGxpbmUuXG4gICAqIFRoZXkga2VlcCBjb2x1bW4gYWxpZ25tZW50IGFuZCBzY3JvbGwgc2lkZXdheXMgd2l0aCB0aGUgYm9keSwgYnV0IGFyZSBub3RcbiAgICogZGF0YTogc29ydGluZywgZmlsdGVyaW5nLCBzZWxlY3Rpb24gYW5kIHRoZSByb3cgY291bnQgYWxsIHBhc3MgdGhlbSBieS5cbiAgICovXG4gIEBJbnB1dCgpIHBpbm5lZFRvcFJvd0RhdGE6IFRbXSA9IFtdO1xuXG4gIC8qKiBSb3dzIGFuY2hvcmVkIGJlbG93IHRoZSBzY3JvbGxpbmcgYXJlYSwgdHlwaWNhbGx5IGEgdG90YWxzIHJvdy4gKi9cbiAgQElucHV0KCkgcGlubmVkQm90dG9tUm93RGF0YTogVFtdID0gW107XG5cbiAgLy8gUlhKUyBQcm9wZXJ0aWVzXG4gIHByb3RlY3RlZCBncmlkQ29weSQgPSBuZXcgU3ViamVjdDxDbGlwYm9hcmRFdmVudD4oKTtcblxuICAvKipcbiAgICogTWFzdGVyIERldGFpbCBGZWF0dXJlXG4gICAqL1xuICBASW5wdXQoKSBncmlkVHlwZTogT25lR3JpZFR5cGUgPSAnbWFzdGVyJztcbiAgQElucHV0KCkgbWFzdGVyRGV0YWlsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1hc3Rlck5vZGU6IE9uZVJvd05vZGUgPSBudWxsO1xuICBASW5wdXQoKSBkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXM6IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcztcbiAgQElucHV0KCkgZGV0YWlsUmVuZGVyZXJDb21wb25lbnQ6IFR5cGU8T25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50PjtcblxuICAvKipcbiAgICogVHJlZSBEYXRhIEZlYXR1cmVcbiAgICovXG4gIEBJbnB1dCgpIHRyZWVEYXRhOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRyZWVEYXRhQ2hpbGRyZW5GaWVsZDogc3RyaW5nID0gbnVsbDtcbiAgQElucHV0KCkgYXV0b0dyb3VwQ29sdW1uRGVmOiBPbmVDb2x1bW5EZWY7XG4gIEBJbnB1dCgpIGdyb3VwRGVmYXVsdEV4cGFuZGVkOiBudW1iZXIgPSAwO1xuXG4gIC8qKlxuICAgKiBCaW5kIFJvdyBBY3Rpb24gRXZlbnRzICYgRGF0YSB0byBQYXJlbnRcbiAgICovXG4gIC8qKlxuICAgKiBBIHJvdyBmaW5pc2hlZCBtb3ZpbmcuIEZpcmVzIG9uY2UgcGVyIGNvbXBsZXRlZCByZW9yZGVyIOKAlCBub3Qgd2hpbGUgdGhlXG4gICAqIHBvaW50ZXIgaXMgaW4gZmxpZ2h0IOKAlCBhbmQgb25seSB3aGVuIHRoZSBwb3NpdGlvbiBhY3R1YWxseSBjaGFuZ2VkLlxuICAgKi9cbiAgQE91dHB1dCgpIHJvd0RyYWdFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZVJvd0RyYWdFdmVudDxUPj4oKTtcblxuICBAT3V0cHV0KCkgb25HcmlkUmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSZWFkeUV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dHb3RvRGV0YWlsID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0FkZE5ldyA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dWaWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0xvY2F0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0RvY3VtZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0NvcHkgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93RGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0dvdG9MaXN0ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0VkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93UHJpbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93SGlzdG9yeSA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dPcHRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93TGFuZ3VhZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93U2VsZWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblNoaWZ0RG91YmxlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIHJvd0NvdW50Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3Rpb25DaGFuZ2VkRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBleHBhbnNpb25DaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxFeHBhbnNpb25DaGFuZ2VkRXZlbnQ8VD4+KCk7XG5cbiAgLy8gRm9yIGNvbnRleHQgbWVudSBvcHRpb25cbiAgQE91dHB1dCgpIGNlbGxPcHRpb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPENlbGxPcHRpb25NZW51U2VsZWN0ZWRFdmVudD4oKTtcbiAgQE91dHB1dCgpIG9uUm93Q2VsbE9wdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuXG4gIC8qKlxuICAgKiBCaW5kIE9uZSBHcmlkIFBhZ2luYXRpb24gRmVhdHVyZVxuICAgKi9cbiAgQElucHV0KCkgcGFnaW5hdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBwYWdpbmF0ZTogT25lUGFnaW5hdGlvblBhcmFtcztcbiAgQE91dHB1dCgpIGdvVG9GaXJzdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGdvVG9QcmV2aW91cyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGdvVG9OZXh0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZ29Ub0xhc3QgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwYWdlU2l6ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gIC8qKlxuICAgKiBPbmUgR3JpZCBQcm9wZXJ0aWVzXG4gICAqL1xuICBwcm90ZWN0ZWQgYm9keVNjcm9sbExlZnQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX29uZVJvd051bWJlckNvbHVtbkRlZjogT25lQ29sdW1uRGVmID0gbnVsbDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBhcGk6IE9uZUdyaWRBcGksXG4gICAgcHJvdGVjdGVkIGV2ZW50U2VydmljZTogT25lR3JpZEV2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICkgeyB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuXG4gICAgaWYgKGNoYW5nZXNbJ21hc3Rlck5vZGUnXSAmJiBjaGFuZ2VzWydtYXN0ZXJOb2RlJ10uaXNGaXJzdENoYW5nZSkge1xuXG4gICAgICBpZiAodGhpcy5tYXN0ZXJEZXRhaWwgJiYgdGhpcy5tYXN0ZXJOb2RlLmV4cGFuZGVkICYmIHRoaXMuZ3JpZFR5cGUgPT09ICdkZXRhaWwnKSB7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFwaS5zZXRSb3dEYXRhKFsuLi50aGlzLm1hc3Rlck5vZGUuZGV0YWlsUm93RGF0YV0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1tcInJvd0RhdGFcIl0gJiYgIWNoYW5nZXNbXCJyb3dEYXRhXCJdPy5maXJzdENoYW5nZSkge1xuXG4gICAgICB0aGlzLnRyZWVEYXRhIHx8IHRoaXMubWFzdGVyRGV0YWlsID8gdGhpcy5hcGkudXBkYXRlUm93RGF0YSh0aGlzLnJvd0RhdGEpIDogdGhpcy5hcGkuc2V0Um93RGF0YSh0aGlzLnJvd0RhdGEpO1xuICAgIH1cblxuICAgIC8vIE9ubHkgbGF0ZXIgY2hhbmdlcy4gVGhlIGZpcnN0IG9uZSBhcnJpdmVzIGJlZm9yZSBuZ09uSW5pdCBoYXMgcnVuXG4gICAgLy8gYXBpLmluaXQsIHNvIHRoZSBjb2x1bW4gZGVmaW5pdGlvbnMgYXJlIG5vdCByZWdpc3RlcmVkIHlldCBhbmQgdGhlIGJvZHlcbiAgICAvLyBoYXMgbm90IHN1YnNjcmliZWQg4oCUIHRoZSBpbml0aWFsIGxvYWQgaGFwcGVucyBpbiBuZ0FmdGVyVmlld0luaXQgaW5zdGVhZC5cbiAgICBpZiAoY2hhbmdlc1tcInBpbm5lZFRvcFJvd0RhdGFcIl0gJiYgIWNoYW5nZXNbXCJwaW5uZWRUb3BSb3dEYXRhXCJdLmZpcnN0Q2hhbmdlKSB7XG5cbiAgICAgIHRoaXMuYXBpLnNldFBpbm5lZFJvd0RhdGEoJ3RvcCcsIHRoaXMucGlubmVkVG9wUm93RGF0YSk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbXCJwaW5uZWRCb3R0b21Sb3dEYXRhXCJdICYmICFjaGFuZ2VzW1wicGlubmVkQm90dG9tUm93RGF0YVwiXS5maXJzdENoYW5nZSkge1xuXG4gICAgICB0aGlzLmFwaS5zZXRQaW5uZWRSb3dEYXRhKCdib3R0b20nLCB0aGlzLnBpbm5lZEJvdHRvbVJvd0RhdGEpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgLyoqXG4gICAgICogSW5pdCBSb3cgTnVtYmVyIENvbHVtbiBEZWZcbiAgICAgKi9cbiAgICBpZiAodGhpcy5yb3dOdW1iZXIpIHtcblxuICAgICAgIHRoaXMuX29uZVJvd051bWJlckNvbHVtbkRlZiA9IHtcbiAgICAgICAgICBncm91cElkOiB0aGlzLmNvbHVtbkRlZnNbMF0/Lmdyb3VwSWQgPz8gbnVsbCxcbiAgICAgICAgICBmaWVsZDogJ19vbmVSb3dOdW1iZXInLFxuICAgICAgICAgIGhlYWRlck5hbWU6ICdOwronLFxuICAgICAgICAgIHJlc2l6YWJsZTogdHJ1ZSxcbiAgICAgICAgICBoZWFkZXJTdHlsZToge1xuICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgICAgICAgIGFsaWduSXRlbTogJ2NlbnRlcidcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFsaWduQ29udGVudDogJ3JpZ2h0JyxcbiAgICAgICAgICBjZWxsQ2xhc3M6ICdmdy1ib2xkJyxcbiAgICAgICAgICB3aWR0aDogNjAsXG4gICAgICAgICAgbWluV2lkdGg6IDQwLFxuICAgICAgICAgIG1heFdpZHRoOiAyMDBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgT25lIEdyaWQgQVBJXG4gICAgICovXG4gICAgdGhpcy5hcGkuaW5pdCh7XG4gICAgICBncmlkVHlwZTogdGhpcy5ncmlkVHlwZSxcbiAgICAgIGNvbHVtbkRlZnM6IHRoaXMuY29sdW1uRGVmcyxcbiAgICAgIGRlZmF1bHRDb2x1bW5EZWY6IHRoaXMuZGVmYXVsdENvbHVtbkRlZixcbiAgICAgIGdyb3VwQ29sdW1uRGVmczogdGhpcy5ncm91cENvbHVtbkRlZnMsXG4gICAgICBjb250ZXh0OiB0aGlzLmNvbnRleHQsXG4gICAgICByb3dTZWxlY3Rpb246IHRoaXMucm93U2VsZWN0aW9uLFxuICAgICAgbWFzdGVyRGV0YWlsOiB0aGlzLm1hc3RlckRldGFpbCxcbiAgICAgIGRldGFpbENlbGxSZW5kZXJlclBhcmFtczogdGhpcy5kZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMsXG4gICAgICBkZXRhaWxSZW5kZXJlckNvbXBvbmVudDogdGhpcy5kZXRhaWxSZW5kZXJlckNvbXBvbmVudCxcbiAgICAgIHRyZWVEYXRhOiB0aGlzLnRyZWVEYXRhLFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogU2V0dXAgTWFzdGVyIERldGFpbCBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsKSB7XG5cbiAgICAgIHRoaXMuYXBpLnNldEdyb3VwRGVmYXVsdEV4cGFuZGVkKHRoaXMuZ3JvdXBEZWZhdWx0RXhwYW5kZWQpO1xuICAgICAgdGhpcy5hcGkuc2V0R2V0RGV0YWlsUm93RGF0YSh0aGlzLmRldGFpbENlbGxSZW5kZXJlclBhcmFtcz8uZ2V0RGV0YWlsUm93RGF0YSA/PyBudWxsKTtcblxuICAgICAgaWYgKHRoaXMucm93TnVtYmVyKSB7XG5cbiAgICAgICAgY29uc3QgY29sdW1uRGVmcyA9IF8uY29uY2F0KHRoaXMuX29uZVJvd051bWJlckNvbHVtbkRlZiwgdGhpcy5jb2x1bW5EZWZzKTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYXBpLnNldENvbHVtbkRlZnMoY29sdW1uRGVmcykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHVwIFRyZWUgRGF0YSBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgaWYgKHRoaXMudHJlZURhdGEpIHtcblxuICAgICAgdGhpcy5ncmlkVHlwZSA9ICd0cmVlJztcblxuICAgICAgY29uc3QgY29sdW1uRGVmcyA9IHRoaXMucm93TnVtYmVyID8gXy5jb25jYXQodGhpcy5fb25lUm93TnVtYmVyQ29sdW1uRGVmLCB0aGlzLmF1dG9Hcm91cENvbHVtbkRlZiwgdGhpcy5jb2x1bW5EZWZzKSA6IF8uY29uY2F0KHRoaXMuYXV0b0dyb3VwQ29sdW1uRGVmLCB0aGlzLmNvbHVtbkRlZnMpO1xuXG4gICAgICB0aGlzLmFwaS5zZXRUcmVlRGF0YUNoaWxkcmVuRmllbGQodGhpcy50cmVlRGF0YUNoaWxkcmVuRmllbGQpO1xuICAgICAgdGhpcy5hcGkuc2V0R3JvdXBEZWZhdWx0RXhwYW5kZWQodGhpcy5ncm91cERlZmF1bHRFeHBhbmRlZCk7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hcGkuc2V0Q29sdW1uRGVmcyhjb2x1bW5EZWZzKSk7XG4gICAgfVxuXG4gICAgLy8gTGlzdGVuIFNlbGVjdGlvbiBDaGFuZ2VkIEV2ZW50XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmV2ZW50U2VydmljZS5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3Rpb25DaGFuZ2VkJywgKHBheWxvYWQ6IFNlbGVjdGlvbkNoYW5nZWRFdmVudDxUPikgPT4ge1xuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHBheWxvYWQpO1xuICAgIH0pKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcblxuICAgIC8vIFRoZSBoZWFkZXIgZm9sbG93cyB0aGUgYm9keSB0aHJvdWdoIChib2R5U2Nyb2xsKSAtPiBbc2Nyb2xsTGVmdF0uIEEgc2Vjb25kXG4gICAgLy8gc3Vic2NyaXB0aW9uIHVzZWQgdG8gbGl2ZSBoZXJlIHRoYXQgcXVlcmllZCAnLm9uZS1ncmlkLWhlYWRlci1jb2x1bW4nIOKAlCBhXG4gICAgLy8gaGVhZGVyICpjZWxsKiwgbm90IHRoZSB2aWV3cG9ydCDigJQgYW5kIGFzc2lnbmVkIHNjcm9sbExlZnQgdG8gaXQsIHdoaWNoXG4gICAgLy8gZG9lcyBub3RoaW5nLiBJdCBoYXMgYmVlbiByZW1vdmVkIHJhdGhlciB0aGFuIHJlcGFpcmVkOiB0aGUgYmluZGluZyBwYXRoXG4gICAgLy8gaXMgdGhlIG9uZSB0aGF0IHdvcmtzLCBhbmQgaXQgbm93IGRyaXZlcyB0aGUgcGlubmVkIGNvbHVtbnMgdG9vLlxuXG4gICAgLy8gUGlubmVkIHJvd3MsIG5vdyB0aGF0IHRoZSBjb2x1bW5zIGFyZSByZWdpc3RlcmVkIGFuZCB0aGUgYm9keSBpc1xuICAgIC8vIGxpc3RlbmluZy4gVW5saWtlIHJvd0RhdGEgdGhlc2UgYXJlIG5vdCBsb2FkZWQgdGhyb3VnaCAob25HcmlkUmVhZHkpIOKAlFxuICAgIC8vIGJpbmRpbmcgdGhlbSBpcyB0aGUgd2hvbGUgY29udHJhY3Qg4oCUIHNvIHRoZSBncmlkIGxvYWRzIHRoZW0gaXRzZWxmLlxuICAgIGlmICh0aGlzLnBpbm5lZFRvcFJvd0RhdGE/Lmxlbmd0aCkge1xuXG4gICAgICB0aGlzLmFwaS5zZXRQaW5uZWRSb3dEYXRhKCd0b3AnLCB0aGlzLnBpbm5lZFRvcFJvd0RhdGEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBpbm5lZEJvdHRvbVJvd0RhdGE/Lmxlbmd0aCkge1xuXG4gICAgICB0aGlzLmFwaS5zZXRQaW5uZWRSb3dEYXRhKCdib3R0b20nLCB0aGlzLnBpbm5lZEJvdHRvbVJvd0RhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXQgR3JpZCBSZWFkeSBFdmVudFxuICAgICAqL1xuICAgIHRoaXMub25HcmlkUmVhZHkuZW1pdCh7IGFwaTogdGhpcy5hcGkgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIEJvZHkgU2Nyb2xsIEV2ZW50XG4gICAqL1xuICBvbkJvZHlTY3JvbGwoc2Nyb2xsTGVmdDogbnVtYmVyKSB7XG5cbiAgICB0aGlzLmJvZHlTY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgUmVhZHkgRXZlbnQgb2YgYSBuZXN0ZWQgTWFzdGVyIERldGFpbCBHcmlkXG4gICAqL1xuICBvbkRldGFpbEdyaWRSZWFkeShwYXJhbXM6IE9uZUdyaWRSZWFkeUV2ZW50KSB7XG5cbiAgICBwYXJhbXMuYXBpLnNldFJvd0RhdGEodGhpcy5tYXN0ZXJOb2RlPy5kZXRhaWxSb3dEYXRhID8/IFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXNzaW5nIGNvcHkgZXZlbnQgdG8gZ3JpZCBib2R5XG4gICAqL1xuICBvbkdyaWRDb3B5KGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xuXG4gICAgdGhpcy5ncmlkQ29weSQubmV4dChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQmluZCBSb3cgQWN0aW9uIEV2ZW50cyB0byBQYXJlbnQgQ29tcG9uZW50XG4gICAqL1xuICBpbnZva2VSb3dBY3Rpb25Hb3RvRGV0YWlsKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dHb3RvRGV0YWlsLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uQWRkTmV3KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dBZGROZXcuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25WaWV3KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dWaWV3LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uTG9jYXRpb24oZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0xvY2F0aW9uLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uRG9jdW1lbnQoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0RvY3VtZW50LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uQ29weShldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93Q29weS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkRlbGV0ZShldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93RGVsZXRlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uR290b0xpc3QoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0dvdG9MaXN0LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uRWRpdChldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93RWRpdC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvblByaW50KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dQcmludC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkhpc3RvcnkoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0hpc3RvcnkuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25PcHRpb24oZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd09wdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkxhbmd1YWdlKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dMYW5ndWFnZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkNlbGxPcHRpb24oZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0NlbGxPcHRpb24uZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25TZWxlY3Rpb24oZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd1NlbGVjdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVNoaWZ0RG91YmxlQ2xpY2soZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblNoaWZ0RG91YmxlQ2xpY2suZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dDb3VudENoYW5nZWQobGVuZ3RoOiBudW1iZXIpIHtcblxuICAgIHRoaXMucm93Q291bnRDaGFuZ2VkLmVtaXQobGVuZ3RoKTtcbiAgfVxuXG4gIGNlbGxPcHRpb25NZW51U2VsZWN0ZWQoZXZlbnQ6IENlbGxPcHRpb25NZW51U2VsZWN0ZWRFdmVudCkge1xuXG4gICAgdGhpcy5jZWxsT3B0aW9uU2VsZWN0LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmcgUGFnaW5hdGlvbiBFdmVudHMgdG8gUGFyZW50IENvbXBvbmVudFxuICAgKi9cbiAgaW52b2tlR29Ub0ZpcnN0KCkge1xuXG4gICAgdGhpcy5nb1RvRmlyc3QuZW1pdCgpO1xuICB9XG5cbiAgaW52b2tlR29Ub1ByZXZpb3VzKCkge1xuXG4gICAgdGhpcy5nb1RvUHJldmlvdXMuZW1pdCgpO1xuICB9XG5cbiAgaW52b2tlR29Ub05leHQoKSB7XG5cbiAgICB0aGlzLmdvVG9OZXh0LmVtaXQoKTtcbiAgfVxuXG4gIGludm9rZUdvVG9MYXN0KCkge1xuXG4gICAgdGhpcy5nb1RvTGFzdC5lbWl0KCk7XG4gIH1cblxuICBpbnZva2VQYWdlU2l6ZUNoYW5nZShwYWdlU2l6ZTogbnVtYmVyKSB7XG5cbiAgICB0aGlzLnBhZ2VTaXplQ2hhbmdlLmVtaXQocGFnZVNpemUpO1xuICB9XG5cbiAgaW52b2tlUm93RHJhZ0VuZChldmVudDogT25lUm93RHJhZ0V2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLnJvd0RyYWdFbmQuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VFeHBhbnNpb25DaGFuZ2VkQ2xpY2soZXZlbnQ6IEV4cGFuc2lvbkNoYW5nZWRFdmVudDxUPikge1xuXG4gICAgdGhpcy5leHBhbnNpb25DaGFuZ2VkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBVbnN1YnNjcmliZSBBbGwgRXZlbnQgTGlzdGVuZGVyc1xuICAgKi9cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG5cbiAgICB0aGlzLnJvd0RhdGEgPSBbXTtcblxuICAgIHRoaXMuYXBpLmRlc3Ryb3koKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iLCI8IS0tIE5vIHRhYmluZGV4IGhlcmUuIFRoZSB0YWIgc3RvcCBiZWxvbmdzIG9uIHRoZSBib2R5IHZpZXdwb3J0LCB3aGljaCBpcyB0aGVcbiAgICAgZWxlbWVudCB0aGF0IGFjdHVhbGx5IHNjcm9sbHM7IGEgZm9jdXNhYmxlIHdyYXBwZXIgYXJvdW5kIGEgc2Nyb2xsYWJsZVxuICAgICBjaGlsZCBpcyByZWFjaGFibGUgYnV0IGNhbm5vdCBiZSBzY3JvbGxlZCB3aXRoIHRoZSBrZXlib2FyZC4gVGhlIGNvcHlcbiAgICAgaGFuZGxlciBpcyB1bmFmZmVjdGVkOiBhIGNvcHkgZXZlbnQgZmlyZWQgYXQgdGhlIGZvY3VzZWQgdmlld3BvcnQgYnViYmxlc1xuICAgICB1cCB0byBoZXJlLiAtLT5cbjxkaXYgI29nUmVmIGNsYXNzPVwib25lLWdyaWRcIiAoY29weSk9XCJvbkdyaWRDb3B5KCRldmVudClcIj5cbiAgICBcbiAgICA8IS0tIEhlYWRlcnMgLS0+XG4gICAgPG9uZS1ncmlkLWhlYWRlclxuICAgICAgICBbYXBpXT1cImFwaVwiXG4gICAgICAgIFtlbmFibGVHcm91cENvbHVtbkRlZnNdPVwiZW5hYmxlR3JvdXBDb2x1bW5EZWZzXCJcbiAgICAgICAgW2FsbG93ZWRFZGl0XT1cImFsbG93ZWRFZGl0XCJcbiAgICAgICAgW3Njcm9sbExlZnRdPVwiYm9keVNjcm9sbExlZnRcIlxuICAgIC8+XG5cbiAgICA8IS0tIEJvZHkgLS0+XG4gICAgPG9uZS1ncmlkLWJvZHlcbiAgICAgICAgW2dyaWRDb3B5JF09XCJncmlkQ29weSRcIlxuICAgICAgICBbcm93RGF0YV09XCJyb3dEYXRhXCJcbiAgICAgICAgW3Bpbm5lZFRvcFJvd0RhdGFdPVwicGlubmVkVG9wUm93RGF0YVwiXG4gICAgICAgIFtwaW5uZWRCb3R0b21Sb3dEYXRhXT1cInBpbm5lZEJvdHRvbVJvd0RhdGFcIlxuICAgICAgICBbYXBpXT1cImFwaVwiXG4gICAgICAgIFtyb3dOdW1iZXJdPVwicm93TnVtYmVyXCJcbiAgICAgICAgW3BhZ2luYXRpb25dPVwicGFnaW5hdGlvblwiXG4gICAgICAgIFthbGxvd2VkRWRpdF09XCJhbGxvd2VkRWRpdFwiXG4gICAgICAgIFtzdWJtaXR0ZWRdPVwic3VibWl0dGVkXCJcbiAgICAgICAgW2NvbnRleHRdPVwiY29udGV4dFwiXG4gICAgICAgIFt0cmVlRGF0YV09XCJ0cmVlRGF0YVwiXG4gICAgICAgIFtncmlkVHlwZV09XCJncmlkVHlwZVwiXG4gICAgICAgIFttYXN0ZXJEZXRhaWxdPVwibWFzdGVyRGV0YWlsXCJcbiAgICAgICAgW21hc3Rlck5vZGVdPVwibWFzdGVyTm9kZVwiXG4gICAgICAgIFtkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXNdPVwiZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zXCJcbiAgICAgICAgW2RldGFpbFJlbmRlcmVyQ29tcG9uZW50XT1cImRldGFpbFJlbmRlcmVyQ29tcG9uZW50XCJcbiAgICAgICAgW2RldGFpbEdyaWRUZW1wbGF0ZV09XCJkZXRhaWxHcmlkVHBsXCJcbiAgICAgICAgW3RyZWVEYXRhQ2hpbGRyZW5GaWVsZF09XCJ0cmVlRGF0YUNoaWxkcmVuRmllbGRcIlxuICAgICAgICBbYXV0b0dyb3VwQ29sdW1uRGVmXT1cImF1dG9Hcm91cENvbHVtbkRlZlwiXG4gICAgICAgIFtncm91cERlZmF1bHRFeHBhbmRlZF09XCJncm91cERlZmF1bHRFeHBhbmRlZFwiXG4gICAgICAgIChyb3dEcmFnRW5kKT1cImludm9rZVJvd0RyYWdFbmQoJGV2ZW50KVwiXG4gICAgICAgIChleHBhbnNpb25DaGFuZ2VkKT1cImludm9rZUV4cGFuc2lvbkNoYW5nZWRDbGljaygkZXZlbnQpXCJcbiAgICAgICAgKG9uUm93R290b0RldGFpbCk9XCJpbnZva2VSb3dBY3Rpb25Hb3RvRGV0YWlsKCRldmVudClcIlxuICAgICAgICAob25Sb3dBZGROZXcpPVwiaW52b2tlUm93QWN0aW9uQWRkTmV3KCRldmVudClcIlxuICAgICAgICAob25Sb3dWaWV3KT1cImludm9rZVJvd0FjdGlvblZpZXcoJGV2ZW50KVwiXG4gICAgICAgIChvblJvd0xvY2F0aW9uKT1cImludm9rZVJvd0FjdGlvbkxvY2F0aW9uKCRldmVudClcIlxuICAgICAgICAob25Sb3dEb2N1bWVudCk9XCJpbnZva2VSb3dBY3Rpb25Eb2N1bWVudCgkZXZlbnQpXCJcbiAgICAgICAgKG9uUm93Q29weSk9XCJpbnZva2VSb3dBY3Rpb25Db3B5KCRldmVudClcIlxuICAgICAgICAob25Sb3dEZWxldGUpPVwiaW52b2tlUm93QWN0aW9uRGVsZXRlKCRldmVudClcIlxuICAgICAgICAob25Sb3dHb3RvTGlzdCk9XCJpbnZva2VSb3dBY3Rpb25Hb3RvTGlzdCgkZXZlbnQpXCJcbiAgICAgICAgKG9uUm93RWRpdCk9XCJpbnZva2VSb3dBY3Rpb25FZGl0KCRldmVudClcIlxuICAgICAgICAob25Sb3dQcmludCk9XCJpbnZva2VSb3dBY3Rpb25QcmludCgkZXZlbnQpXCJcbiAgICAgICAgKG9uUm93SGlzdG9yeSk9XCJpbnZva2VSb3dBY3Rpb25IaXN0b3J5KCRldmVudClcIlxuICAgICAgICAob25Sb3dPcHRpb24pPVwiaW52b2tlUm93QWN0aW9uT3B0aW9uKCRldmVudClcIlxuICAgICAgICAob25Sb3dMYW5ndWFnZSk9XCJpbnZva2VSb3dBY3Rpb25MYW5ndWFnZSgkZXZlbnQpXCJcbiAgICAgICAgKG9uUm93Q2VsbE9wdGlvbik9XCJpbnZva2VSb3dBY3Rpb25DZWxsT3B0aW9uKCRldmVudClcIlxuICAgICAgICAob25Sb3dTZWxlY3Rpb24pPVwiaW52b2tlUm93QWN0aW9uU2VsZWN0aW9uKCRldmVudClcIlxuICAgICAgICAob25TaGlmdERvdWJsZUNsaWNrKT1cImludm9rZVNoaWZ0RG91YmxlQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgIChyb3dDb3VudENoYW5nZWQpPVwiaW52b2tlUm93Q291bnRDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAoY2VsbE9wdGlvblNlbGVjdCk9XCJjZWxsT3B0aW9uTWVudVNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAoYm9keVNjcm9sbCk9XCJvbkJvZHlTY3JvbGwoJGV2ZW50KVwiXG4gICAgLz5cbiAgICBcbiAgICA8IS0tIFBhZ2luYXRpb24gLS0+XG4gICAgQGlmIChwYWdpbmF0aW9uKSB7XG4gICAgICAgIDxvbmUtZ3JpZC1wYWdpbmF0aW9uXG4gICAgICAgICAgICBbcGFnaW5hdGVdPVwicGFnaW5hdGVcIlxuICAgICAgICAgICAgKGdvVG9GaXJzdCk9XCJpbnZva2VHb1RvRmlyc3QoKVwiXG4gICAgICAgICAgICAoZ29Ub0xhc3QpPVwiaW52b2tlR29Ub0xhc3QoKVwiXG4gICAgICAgICAgICAoZ29Ub1ByZXZpb3VzKT1cImludm9rZUdvVG9QcmV2aW91cygpXCJcbiAgICAgICAgICAgIChnb1RvTmV4dCk9XCJpbnZva2VHb1RvTmV4dCgpXCJcbiAgICAgICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJpbnZva2VQYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICB9XG5cbiAgICA8IS0tIE1hc3RlciBEZXRhaWwgR3JpZCB0ZW1wbGF0ZSwgcmVuZGVyZWQgaW5zaWRlIG9uZS1ncmlkLWJvZHkgdmlhIG5nVGVtcGxhdGVPdXRsZXQuXG4gICAgICAgICBEZWNsYXJlZCBoZXJlIChzZWxmLXJlZmVyZW5jZSkgc28gb25lLWdyaWQtYm9keSdzIHRlbXBsYXRlIGRvZXMgbm90IG5lZWQgdG9cbiAgICAgICAgIGltcG9ydCBvbmUtZ3JpZCwgd2hpY2ggd291bGQgY3JlYXRlIGFuIHVuc3VwcG9ydGVkIGNvbXBpbGUtdGltZSBjeWNsZS4gLS0+XG4gICAgPG5nLXRlbXBsYXRlICNkZXRhaWxHcmlkVHBsIGxldC1ub2RlPVwibm9kZVwiPlxuICAgICAgICA8b25lLWdyaWRcbiAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwibm9kZS5kZXRhaWxSb3dIZWlnaHRcIlxuICAgICAgICAgICAgW2dyaWRUeXBlXT1cIidkZXRhaWwnXCJcbiAgICAgICAgICAgIFttYXN0ZXJOb2RlXT1cIm5vZGVcIlxuICAgICAgICAgICAgW21hc3RlckRldGFpbF09XCJtYXN0ZXJEZXRhaWxcIlxuICAgICAgICAgICAgW2RlZmF1bHRDb2x1bW5EZWZdPVwiZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zLmRldGFpbEdyaWRPcHRpb25zLmRlZmF1bHRDb2x1bW5EZWZcIlxuICAgICAgICAgICAgW2NvbHVtbkRlZnNdPVwiZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zLmRldGFpbEdyaWRPcHRpb25zLmNvbHVtbkRlZnNcIlxuICAgICAgICAgICAgW3Jvd0RhdGFdPVwibm9kZT8uZGV0YWlsUm93RGF0YVwiXG4gICAgICAgICAgICBbcm93TnVtYmVyXT1cImRldGFpbENlbGxSZW5kZXJlclBhcmFtcy5kZXRhaWxHcmlkT3B0aW9ucz8ucm93TnVtYmVyXCJcbiAgICAgICAgICAgIFthbGxvd2VkRWRpdF09XCJhbGxvd2VkRWRpdFwiXG4gICAgICAgICAgICBbc3VibWl0dGVkXT1cInN1Ym1pdHRlZFwiXG4gICAgICAgICAgICBbY29udGV4dF09XCJjb250ZXh0XCJcbiAgICAgICAgICAgIChleHBhbnNpb25DaGFuZ2VkKT1cImludm9rZUV4cGFuc2lvbkNoYW5nZWRDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd0dvdG9EZXRhaWwpPVwiaW52b2tlUm93QWN0aW9uR290b0RldGFpbCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd0FkZE5ldyk9XCJpbnZva2VSb3dBY3Rpb25BZGROZXcoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dWaWV3KT1cImludm9rZVJvd0FjdGlvblZpZXcoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dMb2NhdGlvbik9XCJpbnZva2VSb3dBY3Rpb25Mb2NhdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd0RvY3VtZW50KT1cImludm9rZVJvd0FjdGlvbkRvY3VtZW50KCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93Q29weSk9XCJpbnZva2VSb3dBY3Rpb25Db3B5KCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93RGVsZXRlKT1cImludm9rZVJvd0FjdGlvbkRlbGV0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblJvd0dvdG9MaXN0KT1cImludm9rZVJvd0FjdGlvbkdvdG9MaXN0KCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93RWRpdCk9XCJpbnZva2VSb3dBY3Rpb25FZGl0KCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93UHJpbnQpPVwiaW52b2tlUm93QWN0aW9uUHJpbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dIaXN0b3J5KT1cImludm9rZVJvd0FjdGlvbkhpc3RvcnkoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dPcHRpb24pPVwiaW52b2tlUm93QWN0aW9uT3B0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93TGFuZ3VhZ2UpPVwiaW52b2tlUm93QWN0aW9uTGFuZ3VhZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Sb3dDZWxsT3B0aW9uKT1cImludm9rZVJvd0FjdGlvbkNlbGxPcHRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAob25HcmlkUmVhZHkpPVwib25EZXRhaWxHcmlkUmVhZHkoJGV2ZW50KVwiXG4gICAgICAgIC8+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PiJdfQ==