@fundamental-ngx/platform 0.43.36 → 0.43.38

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 (42) hide show
  1. package/approval-flow/approval-flow-user-list/approval-flow-user-list.component.d.ts +10 -0
  2. package/esm2020/approval-flow/approval-flow-add-node/approval-flow-add-node.component.mjs +2 -4
  3. package/esm2020/approval-flow/approval-flow-user-list/approval-flow-user-list.component.mjs +50 -14
  4. package/esm2020/form/multi-combobox/multi-combobox/multi-combobox.component.mjs +3 -1
  5. package/esm2020/list/base-list-item.mjs +4 -2
  6. package/esm2020/list/list.component.mjs +12 -2
  7. package/esm2020/table/components/table-row/table-row.component.mjs +4 -3
  8. package/esm2020/table/table.component.mjs +43 -10
  9. package/esm2020/table-helpers/directives/table-virtual-scroll.directive.mjs +241 -37
  10. package/esm2020/table-helpers/models/directives.mjs +1 -1
  11. package/esm2020/table-helpers/services/table-column-resize.service.mjs +26 -5
  12. package/esm2020/table-helpers/table.mjs +1 -1
  13. package/fesm2015/fundamental-ngx-platform-approval-flow.mjs +52 -20
  14. package/fesm2015/fundamental-ngx-platform-approval-flow.mjs.map +1 -1
  15. package/fesm2015/fundamental-ngx-platform-form.mjs +2 -0
  16. package/fesm2015/fundamental-ngx-platform-form.mjs.map +1 -1
  17. package/fesm2015/fundamental-ngx-platform-list.mjs +15 -2
  18. package/fesm2015/fundamental-ngx-platform-list.mjs.map +1 -1
  19. package/fesm2015/fundamental-ngx-platform-table-helpers.mjs +369 -147
  20. package/fesm2015/fundamental-ngx-platform-table-helpers.mjs.map +1 -1
  21. package/fesm2015/fundamental-ngx-platform-table.mjs +165 -131
  22. package/fesm2015/fundamental-ngx-platform-table.mjs.map +1 -1
  23. package/fesm2020/fundamental-ngx-platform-approval-flow.mjs +50 -18
  24. package/fesm2020/fundamental-ngx-platform-approval-flow.mjs.map +1 -1
  25. package/fesm2020/fundamental-ngx-platform-form.mjs +2 -0
  26. package/fesm2020/fundamental-ngx-platform-form.mjs.map +1 -1
  27. package/fesm2020/fundamental-ngx-platform-list.mjs +14 -2
  28. package/fesm2020/fundamental-ngx-platform-list.mjs.map +1 -1
  29. package/fesm2020/fundamental-ngx-platform-table-helpers.mjs +370 -148
  30. package/fesm2020/fundamental-ngx-platform-table-helpers.mjs.map +1 -1
  31. package/fesm2020/fundamental-ngx-platform-table.mjs +164 -131
  32. package/fesm2020/fundamental-ngx-platform-table.mjs.map +1 -1
  33. package/fundamental-ngx-platform-v0.43.38.tgz +0 -0
  34. package/list/list.component.d.ts +6 -0
  35. package/package.json +4 -4
  36. package/schematics/ng-add/index.js +1 -1
  37. package/table/table.component.d.ts +9 -0
  38. package/table-helpers/directives/table-virtual-scroll.directive.d.ts +64 -5
  39. package/table-helpers/models/directives.d.ts +1 -0
  40. package/table-helpers/services/table-column-resize.service.d.ts +4 -0
  41. package/table-helpers/table.d.ts +10 -2
  42. package/fundamental-ngx-platform-v0.43.36.tgz +0 -0
@@ -1,11 +1,14 @@
1
- import { Directive, inject, Input } from '@angular/core';
2
- import { DestroyedService } from '@fundamental-ngx/cdk/utils';
1
+ import { Directive, HostListener, inject, Input } from '@angular/core';
2
+ import { DestroyedService, KeyUtil } from '@fundamental-ngx/cdk/utils';
3
3
  import { ContentDensityMode } from '@fundamental-ngx/core/content-density';
4
4
  import { BehaviorSubject, filter } from 'rxjs';
5
5
  import { takeUntil } from 'rxjs/operators';
6
6
  import { FDP_TABLE_VIRTUAL_SCROLL_DIRECTIVE, ROW_HEIGHT } from '../constants';
7
7
  import { TableVirtualScroll } from '../models';
8
8
  import { TableScrollDispatcherService } from '../services/table-scroll-dispatcher.service';
9
+ import { DOWN_ARROW, UP_ARROW } from '@angular/cdk/keycodes';
10
+ import { TableRowService } from '../services/table-row.service';
11
+ import { coerceBooleanProperty } from '@angular/cdk/coercion';
9
12
  import * as i0 from "@angular/core";
10
13
  export class TableVirtualScrollDirective extends TableVirtualScroll {
11
14
  constructor() {
@@ -30,7 +33,103 @@ export class TableVirtualScrollDirective extends TableVirtualScroll {
30
33
  /** @hidden */
31
34
  this._tableScrollDispatcher = inject(TableScrollDispatcherService);
32
35
  /** @hidden */
36
+ this._tableRowService = inject(TableRowService);
37
+ /** @hidden */
33
38
  this._destroy$ = inject(DestroyedService);
39
+ /** @hidden */
40
+ this._lastMockScrollPosition = 0;
41
+ /** @hidden */
42
+ this._previousStartNodeIndex = null;
43
+ /** @hidden */
44
+ this._scrollWholeRows = false;
45
+ /**
46
+ * @hidden
47
+ * This function is called when the user performs a wheel event. It determines whether or not the user has scrolled
48
+ * up or down using the event's deltaX property, and scrolls the table by one row.
49
+ */
50
+ this._wheelScrollListenerFunction = (event) => {
51
+ if (Math.abs(event.deltaX) < Math.abs(event.deltaY)) {
52
+ event.preventDefault();
53
+ event.stopImmediatePropagation();
54
+ if (this._wheelTimeout) {
55
+ window.cancelAnimationFrame(this._wheelTimeout);
56
+ }
57
+ const deltaY = event.deltaY;
58
+ if (deltaY) {
59
+ this._wheelTimeout = window.requestAnimationFrame(() => {
60
+ this._scrollRow(deltaY > 0 ? 1 : -1);
61
+ });
62
+ }
63
+ }
64
+ };
65
+ /**
66
+ * @hidden
67
+ * This function is called when the mock scrollbar (when using 'scrollWholeRows') is moved. It determines if the
68
+ * scroll was up or down by comparing the current scroll top to the previous scroll top and scrolls rows accordingly.
69
+ */
70
+ this._mockScrollbarListenerFunction = (event) => {
71
+ event.preventDefault();
72
+ event.stopImmediatePropagation();
73
+ if (this._scrollMockTimeout) {
74
+ window.cancelAnimationFrame(this._scrollMockTimeout);
75
+ }
76
+ const tableScrollMockContainer = this._table.tableScrollMockContainer.nativeElement;
77
+ let deltaY = tableScrollMockContainer.scrollTop - this._lastMockScrollPosition;
78
+ deltaY = Math.ceil(deltaY / this.rowHeight);
79
+ this._scrollMockTimeout = window.requestAnimationFrame(() => {
80
+ this._scrollRow(deltaY, true);
81
+ this._lastMockScrollPosition = tableScrollMockContainer.scrollTop;
82
+ if (tableScrollMockContainer.scrollTop === 0) {
83
+ // Always display the first row of the table when the user scrolls all the way to the top
84
+ this._setRows(0);
85
+ }
86
+ if (tableScrollMockContainer.scrollTop + tableScrollMockContainer.getBoundingClientRect().height ===
87
+ tableScrollMockContainer.scrollHeight) {
88
+ // Always display the last rows of the table when the user scrolls all the way to the bottom
89
+ const startingNodeIndex = this._table._tableRowsVisible.length - this._getNumberOfRowsToDisplay();
90
+ this._setRows(startingNodeIndex);
91
+ }
92
+ });
93
+ };
94
+ }
95
+ /**
96
+ * Whether to scroll whole rows rather than pixel by pixel when the user performs a scroll.
97
+ * This gives greater performance improvements but also lends to some potentially undesirable UX changes.
98
+ * A "rowHeight" must be provided when using this feature.
99
+ */
100
+ set scrollWholeRows(value) {
101
+ this._scrollWholeRows = coerceBooleanProperty(value);
102
+ if (this._scrollWholeRows) {
103
+ this.virtualScroll = true;
104
+ }
105
+ }
106
+ get scrollWholeRows() {
107
+ return this._scrollWholeRows;
108
+ }
109
+ /** @hidden */
110
+ _keydownHandler(event) {
111
+ if (this.scrollWholeRows) {
112
+ if (this._focusedCell?.rowIndex === 0 && KeyUtil.isKeyCode(event, UP_ARROW)) {
113
+ if (this._table.tableContainer.nativeElement.querySelectorAll('tr')[1].ariaRowIndex !== '0') {
114
+ const cellToFocus = {
115
+ colIndex: this._focusedCell.colIndex,
116
+ rowIndex: 1
117
+ };
118
+ this._table._focusableGrid.focusCell(cellToFocus);
119
+ }
120
+ this._scrollRow(-1);
121
+ }
122
+ else if (this._focusedCell?.rowIndex === this._getNumberOfRowsToDisplay() &&
123
+ KeyUtil.isKeyCode(event, DOWN_ARROW)) {
124
+ this._scrollRow(1);
125
+ }
126
+ }
127
+ }
128
+ /** @hidden */
129
+ ngOnInit() {
130
+ if (this.scrollWholeRows && !this.virtualScroll) {
131
+ this.virtualScroll = true;
132
+ }
34
133
  }
35
134
  /** @hidden */
36
135
  ngOnChanges(changes) {
@@ -41,58 +140,158 @@ export class TableVirtualScrollDirective extends TableVirtualScroll {
41
140
  this.calculateVirtualScrollRows();
42
141
  }
43
142
  }
143
+ /** @hidden */
144
+ ngOnDestroy() {
145
+ this._focusableGridSubscription?.unsubscribe();
146
+ }
44
147
  /** Sets table reference. */
45
148
  setTable(table) {
46
149
  this._table = table;
47
150
  }
48
151
  /**
49
- * Calculates rows in viewport.
152
+ * This function determines how many rows can be displayed in the table, and sets the rows in the table based on the
153
+ * start node index, which may come from the table state
50
154
  */
51
155
  calculateVirtualScrollRows() {
52
- if (!this.virtualScroll || !this.bodyHeight) {
53
- return;
156
+ if (this.scrollWholeRows) {
157
+ if (!this._focusableGridSubscription) {
158
+ this._focusableGridSubscription = this._table._focusableGrid.itemFocused.subscribe((event) => {
159
+ this._focusedCell = event;
160
+ });
161
+ }
162
+ if (!this.virtualScroll || !this.bodyHeight) {
163
+ return;
164
+ }
165
+ let startNodeIndex = 0;
166
+ const scrollTop = this._table.getTableState().scrollTopPosition;
167
+ if (scrollTop !== 0) {
168
+ startNodeIndex = Math.floor(scrollTop / this.rowHeight);
169
+ if (startNodeIndex > this._table._tableRowsVisible.length) {
170
+ startNodeIndex = 0;
171
+ }
172
+ }
173
+ const totalNodeCount = this._table._tableRowsVisible.length;
174
+ let visibleNodeCount = Math.floor(this._table.tableContainer.nativeElement.clientHeight / this.rowHeight);
175
+ visibleNodeCount = Math.min(totalNodeCount - startNodeIndex, visibleNodeCount);
176
+ this.virtualScrollTotalHeight = totalNodeCount * this.rowHeight - visibleNodeCount * this.rowHeight;
177
+ this._setRows(startNodeIndex);
178
+ const scrollMockContainer = this._table.tableScrollMockContainer.nativeElement;
179
+ scrollMockContainer.style.maxHeight = this.bodyHeight;
54
180
  }
55
- const rowHeight = this.rowHeight + 1;
56
- const rowsVisible = this._table._tableRowsVisible;
57
- const rowsInViewPort = this._table.getRowsInViewport();
58
- const totalNodeCount = rowsVisible.length;
59
- const scrollTop = this._table.tableScrollable.getScrollTop();
60
- let startNodeIndex = Math.floor(scrollTop / rowHeight) - this.renderAhead;
61
- startNodeIndex = Math.max(0, startNodeIndex);
62
- let visibleNodeCount = Math.ceil(this._table.tableContainer.nativeElement.clientHeight / rowHeight) + 2 * this.renderAhead;
63
- visibleNodeCount = Math.min(totalNodeCount - startNodeIndex, visibleNodeCount);
64
- this.virtualScrollTransform$.next(startNodeIndex * rowHeight);
65
- // Simple caching to avoid unnecessary re-renderings
66
- const isCached = startNodeIndex === this._virtualScrollCache.startNodeIndex &&
67
- visibleNodeCount === this._virtualScrollCache.visibleNodeCount &&
68
- totalNodeCount === this._virtualScrollCache.totalNodeCount &&
69
- // On rows change, even if the total number of rows is the same, the row object will be different
70
- startNodeIndex === rowsInViewPort[0];
71
- if (isCached) {
72
- return;
181
+ else {
182
+ if (!this.virtualScroll || !this.bodyHeight) {
183
+ return;
184
+ }
185
+ const rowHeight = this.rowHeight + 1;
186
+ const rowsVisible = this._table._tableRowsVisible;
187
+ const rowsInViewPort = this._table.getRowsInViewport();
188
+ const totalNodeCount = rowsVisible.length;
189
+ const scrollTop = this._table.tableScrollable.getScrollTop();
190
+ let startNodeIndex = Math.floor(scrollTop / rowHeight) - this.renderAhead;
191
+ startNodeIndex = Math.max(0, startNodeIndex);
192
+ let visibleNodeCount = Math.ceil(this._table.tableContainer.nativeElement.clientHeight / rowHeight) + 2 * this.renderAhead;
193
+ visibleNodeCount = Math.min(totalNodeCount - startNodeIndex, visibleNodeCount);
194
+ this.virtualScrollTransform$.next(startNodeIndex * rowHeight);
195
+ // Simple caching to avoid unnecessary re-renderings
196
+ const isCached = startNodeIndex === this._virtualScrollCache.startNodeIndex &&
197
+ visibleNodeCount === this._virtualScrollCache.visibleNodeCount &&
198
+ totalNodeCount === this._virtualScrollCache.totalNodeCount &&
199
+ // On rows change, even if the total number of rows is the same, the row object will be different
200
+ startNodeIndex === rowsInViewPort[0];
201
+ if (isCached) {
202
+ return;
203
+ }
204
+ this._virtualScrollCache = { startNodeIndex, visibleNodeCount, totalNodeCount };
205
+ this.virtualScrollTotalHeight = totalNodeCount * rowHeight - visibleNodeCount * rowHeight;
206
+ this._table.setRowsInViewport(startNodeIndex, rowsVisible.slice(startNodeIndex, startNodeIndex + visibleNodeCount).length);
73
207
  }
74
- this._virtualScrollCache = { startNodeIndex, visibleNodeCount, totalNodeCount };
75
- this.virtualScrollTotalHeight = totalNodeCount * rowHeight - visibleNodeCount * rowHeight;
76
- this._table.setRowsInViewport(startNodeIndex, rowsVisible.slice(startNodeIndex, startNodeIndex + visibleNodeCount).length);
77
208
  }
78
209
  /**
79
- * Initialises scroll listener.
210
+ * @hidden
211
+ * Initialises scroll listeners.
80
212
  */
81
213
  listenOnVirtualScroll() {
82
- this._tableScrollDispatcher
83
- .verticallyScrolled()
84
- .pipe(filter(() => this.virtualScroll && !!this.bodyHeight), takeUntil(this._destroy$))
85
- .subscribe((scrollable) => {
86
- this.calculateVirtualScrollRows();
87
- this._table.setTableState({
88
- ...this._table.getTableState(),
89
- scrollTopPosition: scrollable.getScrollTop()
214
+ if (this.scrollWholeRows) {
215
+ this._table.tableContainer.nativeElement.addEventListener('wheel', this._wheelScrollListenerFunction, {
216
+ passive: false
90
217
  });
218
+ this._table.tableScrollMockContainer.nativeElement.addEventListener('scroll', this._mockScrollbarListenerFunction, { passive: false });
219
+ }
220
+ else {
221
+ this._tableScrollDispatcher
222
+ .verticallyScrolled()
223
+ .pipe(filter(() => this.virtualScroll && !!this.bodyHeight), takeUntil(this._destroy$))
224
+ .subscribe((scrollable) => {
225
+ this.calculateVirtualScrollRows();
226
+ this._table.setTableState({
227
+ ...this._table.getTableState(),
228
+ scrollTopPosition: scrollable.getScrollTop()
229
+ });
230
+ });
231
+ }
232
+ }
233
+ /** @hidden */
234
+ _getNumberOfRowsToDisplay() {
235
+ const tableContainer = this._table.tableContainer.nativeElement;
236
+ let tableHeight = tableContainer.clientHeight;
237
+ tableHeight = tableHeight - tableContainer.querySelector('thead').clientHeight;
238
+ const numberOfRows = Math.floor(tableHeight / (this.rowHeight + 2));
239
+ if (this._table._tableRowsVisible.length < numberOfRows) {
240
+ return this._table._tableRowsVisible.length;
241
+ }
242
+ else {
243
+ return numberOfRows;
244
+ }
245
+ }
246
+ /**
247
+ * @hidden
248
+ * This function, used only when 'scrollWholeRows' is truthy, calculates what should be the new starting node, based
249
+ * off the previous starting node and the provided 'count' parameter. For example if the previous start node was 10
250
+ * and the count parameter is -2, the new starting node will be 8. This function also programmatically moves the
251
+ * mock scrollbar.
252
+ */
253
+ _scrollRow(count, fromMockScrollbarListener = false) {
254
+ let startingNode = 0;
255
+ if (this._previousStartNodeIndex !== null && this._previousStartNodeIndex >= 0) {
256
+ startingNode = this._previousStartNodeIndex;
257
+ }
258
+ if (startingNode + count + this._getNumberOfRowsToDisplay() <= this._table._tableRowsVisible.length ||
259
+ count < 0) {
260
+ startingNode = Math.ceil(startingNode + count);
261
+ }
262
+ if (startingNode < 0) {
263
+ startingNode = 0;
264
+ }
265
+ // This next 'if' statement is for triggering new page loads when 'pageScrolling' is true
266
+ if (count > 0 &&
267
+ startingNode === this._previousStartNodeIndex &&
268
+ this._table.pageScrolling &&
269
+ this._table._tableRowsVisible.length === this._table._tableRows.length) {
270
+ this._table._onSpyIntersect(true);
271
+ }
272
+ this._setRows(startingNode);
273
+ const tableScrollMockContainer = this._table.tableScrollMockContainer.nativeElement;
274
+ if (!fromMockScrollbarListener) {
275
+ tableScrollMockContainer.scrollBy({ top: count * this.rowHeight });
276
+ }
277
+ this._lastMockScrollPosition = tableScrollMockContainer.scrollTop;
278
+ }
279
+ /**
280
+ * @hidden
281
+ * This function sets rows in the table's viewport depending on the provided starting node. It also sets the table
282
+ * state.
283
+ */
284
+ _setRows(startingNode) {
285
+ this._table.setRowsInViewport(startingNode, this._getNumberOfRowsToDisplay());
286
+ this._previousStartNodeIndex = startingNode;
287
+ this._table.setTableState({
288
+ ...this._table.getTableState(),
289
+ scrollTopPosition: this.rowHeight * startingNode
91
290
  });
92
291
  }
93
292
  }
94
293
  TableVirtualScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TableVirtualScrollDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
95
- TableVirtualScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: TableVirtualScrollDirective, isStandalone: true, selector: "fdp-table[virtualScroll]", inputs: { virtualScroll: "virtualScroll", renderAhead: "renderAhead", bodyHeight: "bodyHeight", rowHeight: "rowHeight" }, providers: [
294
+ TableVirtualScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: TableVirtualScrollDirective, isStandalone: true, selector: "fdp-table[virtualScroll]", inputs: { virtualScroll: "virtualScroll", scrollWholeRows: "scrollWholeRows", renderAhead: "renderAhead", bodyHeight: "bodyHeight", rowHeight: "rowHeight" }, host: { listeners: { "keydown": "_keydownHandler($event)" } }, providers: [
96
295
  DestroyedService,
97
296
  {
98
297
  provide: FDP_TABLE_VIRTUAL_SCROLL_DIRECTIVE,
@@ -115,11 +314,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
115
314
  }]
116
315
  }], propDecorators: { virtualScroll: [{
117
316
  type: Input
317
+ }], scrollWholeRows: [{
318
+ type: Input
118
319
  }], renderAhead: [{
119
320
  type: Input
120
321
  }], bodyHeight: [{
121
322
  type: Input
122
323
  }], rowHeight: [{
123
324
  type: Input
325
+ }], _keydownHandler: [{
326
+ type: HostListener,
327
+ args: ['keydown', ['$event']]
124
328
  }] } });
125
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtdmlydHVhbC1zY3JvbGwuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9zcmMvbGliL3RhYmxlLWhlbHBlcnMvZGlyZWN0aXZlcy90YWJsZS12aXJ0dWFsLXNjcm9sbC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUNuRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDL0MsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sNkNBQTZDLENBQUM7O0FBZTNGLE1BQU0sT0FBTywyQkFBNEIsU0FBUSxrQkFBa0I7SUFabkU7O1FBYUk7O1dBRUc7UUFFSCxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUV0Qix3RUFBd0U7UUFFeEUsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFNakI7OztXQUdHO1FBRUgsY0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFFLENBQUM7UUFFckQsY0FBYztRQUNkLDZCQUF3QixHQUFHLENBQUMsQ0FBQztRQUU3QixjQUFjO1FBQ2QsNEJBQXVCLEdBQUcsSUFBSSxlQUFlLENBQVMsQ0FBQyxDQUFDLENBQUM7UUFLekQsY0FBYztRQUNO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ImltcG9ydCB7IERpcmVjdGl2ZSwgaW5qZWN0LCBJbnB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEZXN0cm95ZWRTZXJ2aWNlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvdXRpbHMnO1xuaW1wb3J0IHsgQ29udGVudERlbnNpdHlNb2RlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2NvbnRlbnQtZGVuc2l0eSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZpbHRlciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRkRQX1RBQkxFX1ZJUlRVQUxfU0NST0xMX0RJUkVDVElWRSwgUk9XX0hFSUdIVCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBUYWJsZVZpcnR1YWxTY3JvbGwgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgVGFibGVTY3JvbGxEaXNwYXRjaGVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3RhYmxlLXNjcm9sbC1kaXNwYXRjaGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tICcuLi90YWJsZSc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLXNlbGVjdG9yXG4gICAgc2VsZWN0b3I6ICdmZHAtdGFibGVbdmlydHVhbFNjcm9sbF0nLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIERlc3Ryb3llZFNlcnZpY2UsXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IEZEUF9UQUJMRV9WSVJUVUFMX1NDUk9MTF9ESVJFQ1RJVkUsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogVGFibGVWaXJ0dWFsU2Nyb2xsRGlyZWN0aXZlXG4gICAgICAgIH1cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlVmlydHVhbFNjcm9sbERpcmVjdGl2ZSBleHRlbmRzIFRhYmxlVmlydHVhbFNjcm9sbCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gICAgLyoqIFdoZXRoZXIgdG8gc2hvdyBvbmx5IHZpc2libGUgcm93cyBpbiBtYXR0ZXIgb2YgcGVyZm9ybWFuY2VcbiAgICAgKiBmYWxzZSBieSBkZWZhdWx0LCB3aGVuIHRydWUgc2V0dGluZyBib2R5SGVpZ2h0IGFuZCByb3dIZWlnaHQgaXMgcmVxdWlyZWQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICB2aXJ0dWFsU2Nyb2xsID0gZmFsc2U7XG5cbiAgICAvKiogQ2FjaGUgc2l6ZSBmb3IgdGhlIHZpcnR1YWxTY3JvbGwsIGRlZmF1bHQgaXMgNDAgaW4gZWFjaCBkaXJlY3Rpb24gKi9cbiAgICBASW5wdXQoKVxuICAgIHJlbmRlckFoZWFkID0gNDA7XG5cbiAgICAvKiogQm9keSBoZWlnaHQuICovXG4gICAgQElucHV0KClcbiAgICBib2R5SGVpZ2h0OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBIZWlnaHQgb2YgdGhlIHJvdywgcmVxdWlyZWQgZm9yIHRoZSB2aXJ0dWFsU2Nyb2xsLFxuICAgICAqIGRlZmF1bHQgaXMgNDRweCBpbiBjb3p5LCAzMnB4IGluIGNvbXBhY3QgYW5kIDI0cHggaW4gY29uZGVuc2VkIChzZXQgYXV0b21hdGljYWxseSlcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHJvd0hlaWdodCA9IFJPV19IRUlHSFQuZ2V0KENvbnRlbnREZW5zaXR5TW9kZS5DT1pZKSE7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHZpcnR1YWxTY3JvbGxUb3RhbEhlaWdodCA9IDA7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHZpcnR1YWxTY3JvbGxUcmFuc2Zvcm0kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF90YWJsZTogVGFibGU7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3ZpcnR1YWxTY3JvbGxDYWNoZSA9IHsgc3RhcnROb2RlSW5kZXg6IC0xLCB2aXNpYmxlTm9kZUNvdW50OiAtMSwgdG90YWxOb2RlQ291bnQ6IC0xIH07XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYmxlU2Nyb2xsRGlzcGF0Y2hlciA9IGluamVjdChUYWJsZVNjcm9sbERpc3BhdGNoZXJTZXJ2aWNlKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveSQgPSBpbmplY3QoRGVzdHJveWVkU2VydmljZSk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl90YWJsZS50YWJsZVNjcm9sbGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsICYmIChjaGFuZ2VzWydyb3dIZWlnaHQnXSB8fCBjaGFuZ2VzWyd2aXJ0dWFsU2Nyb2xsJ10gfHwgY2hhbmdlc1sncmVuZGVyQWhlYWQnXSkpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlVmlydHVhbFNjcm9sbFJvd3MoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBTZXRzIHRhYmxlIHJlZmVyZW5jZS4gKi9cbiAgICBzZXRUYWJsZSh0YWJsZTogVGFibGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdGFibGUgPSB0YWJsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHJvd3MgaW4gdmlld3BvcnQuXG4gICAgICovXG4gICAgY2FsY3VsYXRlVmlydHVhbFNjcm9sbFJvd3MoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy52aXJ0dWFsU2Nyb2xsIHx8ICF0aGlzLmJvZHlIZWlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJvd0hlaWdodCA9IHRoaXMucm93SGVpZ2h0ICsgMTtcblxuICAgICAgICBjb25zdCByb3dzVmlzaWJsZSA9IHRoaXMuX3RhYmxlLl90YWJsZVJvd3NWaXNpYmxlO1xuICAgICAgICBjb25zdCByb3dzSW5WaWV3UG9ydCA9IHRoaXMuX3RhYmxlLmdldFJvd3NJblZpZXdwb3J0KCk7XG4gICAgICAgIGNvbnN0IHRvdGFsTm9kZUNvdW50ID0gcm93c1Zpc2libGUubGVuZ3RoO1xuICAgICAgICBjb25zdCBzY3JvbGxUb3AgPSB0aGlzLl90YWJsZS50YWJsZVNjcm9sbGFibGUuZ2V0U2Nyb2xsVG9wKCk7XG5cbiAgICAgICAgbGV0IHN0YXJ0Tm9kZUluZGV4ID0gTWF0aC5mbG9vcihzY3JvbGxUb3AgLyByb3dIZWlnaHQpIC0gdGhpcy5yZW5kZXJBaGVhZDtcbiAgICAgICAgc3RhcnROb2RlSW5kZXggPSBNYXRoLm1heCgwLCBzdGFydE5vZGVJbmRleCk7XG5cbiAgICAgICAgbGV0IHZpc2libGVOb2RlQ291bnQgPVxuICAgICAgICAgICAgTWF0aC5jZWlsKHRoaXMuX3RhYmxlLnRhYmxlQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0IC8gcm93SGVpZ2h0KSArIDIgKiB0aGlzLnJlbmRlckFoZWFkO1xuICAgICAgICB2aXNpYmxlTm9kZUNvdW50ID0gTWF0aC5taW4odG90YWxOb2RlQ291bnQgLSBzdGFydE5vZGVJbmRleCwgdmlzaWJsZU5vZGVDb3VudCk7XG5cbiAgICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsVHJhbnNmb3JtJC5uZXh0KHN0YXJ0Tm9kZUluZGV4ICogcm93SGVpZ2h0KTtcblxuICAgICAgICAvLyBTaW1wbGUgY2FjaGluZyB0byBhdm9pZCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJpbmdzXG4gICAgICAgIGNvbnN0IGlzQ2FjaGVkID1cbiAgICAgICAgICAgIHN0YXJ0Tm9kZUluZGV4ID09PSB0aGlzLl92aXJ0dWFsU2Nyb2xsQ2FjaGUuc3RhcnROb2RlSW5kZXggJiZcbiAgICAgICAgICAgIHZpc2libGVOb2RlQ291bnQgPT09IHRoaXMuX3ZpcnR1YWxTY3JvbGxDYWNoZS52aXNpYmxlTm9kZUNvdW50ICYmXG4gICAgICAgICAgICB0b3RhbE5vZGVDb3VudCA9PT0gdGhpcy5fdmlydHVhbFNjcm9sbENhY2hlLnRvdGFsTm9kZUNvdW50ICYmXG4gICAgICAgICAgICAvLyBPbiByb3dzIGNoYW5nZSwgZXZlbiBpZiB0aGUgdG90YWwgbnVtYmVyIG9mIHJvd3MgaXMgdGhlIHNhbWUsIHRoZSByb3cgb2JqZWN0IHdpbGwgYmUgZGlmZmVyZW50XG4gICAgICAgICAgICBzdGFydE5vZGVJbmRleCA9PT0gcm93c0luVmlld1BvcnRbMF07XG5cbiAgICAgICAgaWYgKGlzQ2FjaGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl92aXJ0dWFsU2Nyb2xsQ2FjaGUgPSB7IHN0YXJ0Tm9kZUluZGV4LCB2aXNpYmxlTm9kZUNvdW50LCB0b3RhbE5vZGVDb3VudCB9O1xuICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGxUb3RhbEhlaWdodCA9IHRvdGFsTm9kZUNvdW50ICogcm93SGVpZ2h0IC0gdmlzaWJsZU5vZGVDb3VudCAqIHJvd0hlaWdodDtcbiAgICAgICAgdGhpcy5fdGFibGUuc2V0Um93c0luVmlld3BvcnQoXG4gICAgICAgICAgICBzdGFydE5vZGVJbmRleCxcbiAgICAgICAgICAgIHJvd3NWaXNpYmxlLnNsaWNlKHN0YXJ0Tm9kZUluZGV4LCBzdGFydE5vZGVJbmRleCArIHZpc2libGVOb2RlQ291bnQpLmxlbmd0aFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpc2VzIHNjcm9sbCBsaXN0ZW5lci5cbiAgICAgKi9cbiAgICBsaXN0ZW5PblZpcnR1YWxTY3JvbGwoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3RhYmxlU2Nyb2xsRGlzcGF0Y2hlclxuICAgICAgICAgICAgLnZlcnRpY2FsbHlTY3JvbGxlZCgpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy52aXJ0dWFsU2Nyb2xsICYmICEhdGhpcy5ib2R5SGVpZ2h0KSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChzY3JvbGxhYmxlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVWaXJ0dWFsU2Nyb2xsUm93cygpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhYmxlLnNldFRhYmxlU3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLl90YWJsZS5nZXRUYWJsZVN0YXRlKCksXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcFBvc2l0aW9uOiBzY3JvbGxhYmxlLmdldFNjcm9sbFRvcCgpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
329
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtdmlydHVhbC1zY3JvbGwuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9zcmMvbGliL3RhYmxlLWhlbHBlcnMvZGlyZWN0aXZlcy90YWJsZS12aXJ0dWFsLXNjcm9sbC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBK0MsTUFBTSxlQUFlLENBQUM7QUFDcEgsT0FBTyxFQUFFLGdCQUFnQixFQUF5QixPQUFPLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDOUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9DLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBRTNGLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQWM5RCxNQUFNLE9BQU8sMkJBQTRCLFNBQVEsa0JBQWtCO0lBWm5FOztRQWFJOztXQUVHO1FBRUgsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFtQnRCLHdFQUF3RTtRQUV4RSxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQU1qQjs7O1dBR0c7UUFFSCxjQUFT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SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERlc3Ryb3llZFNlcnZpY2UsIEZvY3VzYWJsZUl0ZW1Qb3NpdGlvbiwgS2V5VXRpbCB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY2RrL3V0aWxzJztcbmltcG9ydCB7IENvbnRlbnREZW5zaXR5TW9kZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9jb250ZW50LWRlbnNpdHknO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmaWx0ZXIsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRkRQX1RBQkxFX1ZJUlRVQUxfU0NST0xMX0RJUkVDVElWRSwgUk9XX0hFSUdIVCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBUYWJsZVZpcnR1YWxTY3JvbGwgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgVGFibGVTY3JvbGxEaXNwYXRjaGVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3RhYmxlLXNjcm9sbC1kaXNwYXRjaGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tICcuLi90YWJsZSc7XG5pbXBvcnQgeyBET1dOX0FSUk9XLCBVUF9BUlJPVyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQgeyBUYWJsZVJvd1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy90YWJsZS1yb3cuc2VydmljZSc7XG5pbXBvcnQgeyBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuXG5ARGlyZWN0aXZlKHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuICAgIHNlbGVjdG9yOiAnZmRwLXRhYmxlW3ZpcnR1YWxTY3JvbGxdJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBEZXN0cm95ZWRTZXJ2aWNlLFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBGRFBfVEFCTEVfVklSVFVBTF9TQ1JPTExfRElSRUNUSVZFLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IFRhYmxlVmlydHVhbFNjcm9sbERpcmVjdGl2ZVxuICAgICAgICB9XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZVZpcnR1YWxTY3JvbGxEaXJlY3RpdmUgZXh0ZW5kcyBUYWJsZVZpcnR1YWxTY3JvbGwgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgICAvKiogV2hldGhlciB0byBzaG93IG9ubHkgdmlzaWJsZSByb3dzIGluIG1hdHRlciBvZiBwZXJmb3JtYW5jZVxuICAgICAqIGZhbHNlIGJ5IGRlZmF1bHQsIHdoZW4gdHJ1ZSBzZXR0aW5nIGJvZHlIZWlnaHQgYW5kIHJvd0hlaWdodCBpcyByZXF1aXJlZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHZpcnR1YWxTY3JvbGwgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gc2Nyb2xsIHdob2xlIHJvd3MgcmF0aGVyIHRoYW4gcGl4ZWwgYnkgcGl4ZWwgd2hlbiB0aGUgdXNlciBwZXJmb3JtcyBhIHNjcm9sbC5cbiAgICAgKiBUaGlzIGdpdmVzIGdyZWF0ZXIgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIGJ1dCBhbHNvIGxlbmRzIHRvIHNvbWUgcG90ZW50aWFsbHkgdW5kZXNpcmFibGUgVVggY2hhbmdlcy5cbiAgICAgKiBBIFwicm93SGVpZ2h0XCIgbXVzdCBiZSBwcm92aWRlZCB3aGVuIHVzaW5nIHRoaXMgZmVhdHVyZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBzY3JvbGxXaG9sZVJvd3ModmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fc2Nyb2xsV2hvbGVSb3dzID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICAgICAgaWYgKHRoaXMuX3Njcm9sbFdob2xlUm93cykge1xuICAgICAgICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBzY3JvbGxXaG9sZVJvd3MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxXaG9sZVJvd3M7XG4gICAgfVxuXG4gICAgLyoqIENhY2hlIHNpemUgZm9yIHRoZSB2aXJ0dWFsU2Nyb2xsLCBkZWZhdWx0IGlzIDQwIGluIGVhY2ggZGlyZWN0aW9uICovXG4gICAgQElucHV0KClcbiAgICByZW5kZXJBaGVhZCA9IDQwO1xuXG4gICAgLyoqIEJvZHkgaGVpZ2h0LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYm9keUhlaWdodDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSGVpZ2h0IG9mIHRoZSByb3csIHJlcXVpcmVkIGZvciB0aGUgdmlydHVhbFNjcm9sbCxcbiAgICAgKiBkZWZhdWx0IGlzIDQ0cHggaW4gY296eSwgMzJweCBpbiBjb21wYWN0IGFuZCAyNHB4IGluIGNvbmRlbnNlZCAoc2V0IGF1dG9tYXRpY2FsbHkpXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICByb3dIZWlnaHQgPSBST1dfSEVJR0hULmdldChDb250ZW50RGVuc2l0eU1vZGUuQ09aWSkhO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICB2aXJ0dWFsU2Nyb2xsVG90YWxIZWlnaHQgPSAwO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICB2aXJ0dWFsU2Nyb2xsVHJhbnNmb3JtJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfdGFibGU6IFRhYmxlO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF92aXJ0dWFsU2Nyb2xsQ2FjaGUgPSB7IHN0YXJ0Tm9kZUluZGV4OiAtMSwgdmlzaWJsZU5vZGVDb3VudDogLTEsIHRvdGFsTm9kZUNvdW50OiAtMSB9O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF90YWJsZVNjcm9sbERpc3BhdGNoZXIgPSBpbmplY3QoVGFibGVTY3JvbGxEaXNwYXRjaGVyU2VydmljZSk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYmxlUm93U2VydmljZSA9IGluamVjdChUYWJsZVJvd1NlcnZpY2UpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95JCA9IGluamVjdChEZXN0cm95ZWRTZXJ2aWNlKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfd2hlZWxUaW1lb3V0OiBhbnk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3Njcm9sbE1vY2tUaW1lb3V0OiBhbnk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2xhc3RNb2NrU2Nyb2xsUG9zaXRpb24gPSAwO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9mb2N1c2FibGVHcmlkU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2ZvY3VzZWRDZWxsOiBGb2N1c2FibGVJdGVtUG9zaXRpb247XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3ByZXZpb3VzU3RhcnROb2RlSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9zY3JvbGxXaG9sZVJvd3MgPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAgX2tleWRvd25IYW5kbGVyKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFdob2xlUm93cykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2ZvY3VzZWRDZWxsPy5yb3dJbmRleCA9PT0gMCAmJiBLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgVVBfQVJST1cpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RhYmxlLnRhYmxlQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgndHInKVsxXS5hcmlhUm93SW5kZXggIT09ICcwJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjZWxsVG9Gb2N1cyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbEluZGV4OiB0aGlzLl9mb2N1c2VkQ2VsbC5jb2xJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiAxXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RhYmxlLl9mb2N1c2FibGVHcmlkLmZvY3VzQ2VsbChjZWxsVG9Gb2N1cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbFJvdygtMSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzZWRDZWxsPy5yb3dJbmRleCA9PT0gdGhpcy5fZ2V0TnVtYmVyT2ZSb3dzVG9EaXNwbGF5KCkgJiZcbiAgICAgICAgICAgICAgICBLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgRE9XTl9BUlJPVylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbFJvdygxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFdob2xlUm93cyAmJiAhdGhpcy52aXJ0dWFsU2Nyb2xsKSB7XG4gICAgICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fdGFibGUudGFibGVTY3JvbGxhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbCAmJiAoY2hhbmdlc1sncm93SGVpZ2h0J10gfHwgY2hhbmdlc1sndmlydHVhbFNjcm9sbCddIHx8IGNoYW5nZXNbJ3JlbmRlckFoZWFkJ10pKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVZpcnR1YWxTY3JvbGxSb3dzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9mb2N1c2FibGVHcmlkU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8qKiBTZXRzIHRhYmxlIHJlZmVyZW5jZS4gKi9cbiAgICBzZXRUYWJsZSh0YWJsZTogVGFibGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdGFibGUgPSB0YWJsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaG93IG1hbnkgcm93cyBjYW4gYmUgZGlzcGxheWVkIGluIHRoZSB0YWJsZSwgYW5kIHNldHMgdGhlIHJvd3MgaW4gdGhlIHRhYmxlIGJhc2VkIG9uIHRoZVxuICAgICAqIHN0YXJ0IG5vZGUgaW5kZXgsIHdoaWNoIG1heSBjb21lIGZyb20gdGhlIHRhYmxlIHN0YXRlXG4gICAgICovXG4gICAgY2FsY3VsYXRlVmlydHVhbFNjcm9sbFJvd3MoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFdob2xlUm93cykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9mb2N1c2FibGVHcmlkU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNhYmxlR3JpZFN1YnNjcmlwdGlvbiA9IHRoaXMuX3RhYmxlLl9mb2N1c2FibGVHcmlkLml0ZW1Gb2N1c2VkLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNlZENlbGwgPSBldmVudDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy52aXJ0dWFsU2Nyb2xsIHx8ICF0aGlzLmJvZHlIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBzdGFydE5vZGVJbmRleCA9IDA7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxUb3AgPSB0aGlzLl90YWJsZS5nZXRUYWJsZVN0YXRlKCkuc2Nyb2xsVG9wUG9zaXRpb247XG4gICAgICAgICAgICBpZiAoc2Nyb2xsVG9wICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgc3RhcnROb2RlSW5kZXggPSBNYXRoLmZsb29yKHNjcm9sbFRvcCAvIHRoaXMucm93SGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnROb2RlSW5kZXggPiB0aGlzLl90YWJsZS5fdGFibGVSb3dzVmlzaWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnROb2RlSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdG90YWxOb2RlQ291bnQgPSB0aGlzLl90YWJsZS5fdGFibGVSb3dzVmlzaWJsZS5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgdmlzaWJsZU5vZGVDb3VudCA9IE1hdGguZmxvb3IodGhpcy5fdGFibGUudGFibGVDb250YWluZXIubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQgLyB0aGlzLnJvd0hlaWdodCk7XG4gICAgICAgICAgICB2aXNpYmxlTm9kZUNvdW50ID0gTWF0aC5taW4odG90YWxOb2RlQ291bnQgLSBzdGFydE5vZGVJbmRleCwgdmlzaWJsZU5vZGVDb3VudCk7XG4gICAgICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGxUb3RhbEhlaWdodCA9IHRvdGFsTm9kZUNvdW50ICogdGhpcy5yb3dIZWlnaHQgLSB2aXNpYmxlTm9kZUNvdW50ICogdGhpcy5yb3dIZWlnaHQ7XG5cbiAgICAgICAgICAgIHRoaXMuX3NldFJvd3Moc3RhcnROb2RlSW5kZXgpO1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsTW9ja0NvbnRhaW5lciA9IHRoaXMuX3RhYmxlLnRhYmxlU2Nyb2xsTW9ja0NvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgc2Nyb2xsTW9ja0NvbnRhaW5lci5zdHlsZS5tYXhIZWlnaHQgPSB0aGlzLmJvZHlIZWlnaHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMudmlydHVhbFNjcm9sbCB8fCAhdGhpcy5ib2R5SGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByb3dIZWlnaHQgPSB0aGlzLnJvd0hlaWdodCArIDE7XG5cbiAgICAgICAgICAgIGNvbnN0IHJvd3NWaXNpYmxlID0gdGhpcy5fdGFibGUuX3RhYmxlUm93c1Zpc2libGU7XG4gICAgICAgICAgICBjb25zdCByb3dzSW5WaWV3UG9ydCA9IHRoaXMuX3RhYmxlLmdldFJvd3NJblZpZXdwb3J0KCk7XG4gICAgICAgICAgICBjb25zdCB0b3RhbE5vZGVDb3VudCA9IHJvd3NWaXNpYmxlLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFRvcCA9IHRoaXMuX3RhYmxlLnRhYmxlU2Nyb2xsYWJsZS5nZXRTY3JvbGxUb3AoKTtcblxuICAgICAgICAgICAgbGV0IHN0YXJ0Tm9kZUluZGV4ID0gTWF0aC5mbG9vcihzY3JvbGxUb3AgLyByb3dIZWlnaHQpIC0gdGhpcy5yZW5kZXJBaGVhZDtcbiAgICAgICAgICAgIHN0YXJ0Tm9kZUluZGV4ID0gTWF0aC5tYXgoMCwgc3RhcnROb2RlSW5kZXgpO1xuXG4gICAgICAgICAgICBsZXQgdmlzaWJsZU5vZGVDb3VudCA9XG4gICAgICAgICAgICAgICAgTWF0aC5jZWlsKHRoaXMuX3RhYmxlLnRhYmxlQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0IC8gcm93SGVpZ2h0KSArIDIgKiB0aGlzLnJlbmRlckFoZWFkO1xuICAgICAgICAgICAgdmlzaWJsZU5vZGVDb3VudCA9IE1hdGgubWluKHRvdGFsTm9kZUNvdW50IC0gc3RhcnROb2RlSW5kZXgsIHZpc2libGVOb2RlQ291bnQpO1xuXG4gICAgICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGxUcmFuc2Zvcm0kLm5leHQoc3RhcnROb2RlSW5kZXggKiByb3dIZWlnaHQpO1xuXG4gICAgICAgICAgICAvLyBTaW1wbGUgY2FjaGluZyB0byBhdm9pZCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJpbmdzXG4gICAgICAgICAgICBjb25zdCBpc0NhY2hlZCA9XG4gICAgICAgICAgICAgICAgc3RhcnROb2RlSW5kZXggPT09IHRoaXMuX3ZpcnR1YWxTY3JvbGxDYWNoZS5zdGFydE5vZGVJbmRleCAmJlxuICAgICAgICAgICAgICAgIHZpc2libGVOb2RlQ291bnQgPT09IHRoaXMuX3ZpcnR1YWxTY3JvbGxDYWNoZS52aXNpYmxlTm9kZUNvdW50ICYmXG4gICAgICAgICAgICAgICAgdG90YWxOb2RlQ291bnQgPT09IHRoaXMuX3ZpcnR1YWxTY3JvbGxDYWNoZS50b3RhbE5vZGVDb3VudCAmJlxuICAgICAgICAgICAgICAgIC8vIE9uIHJvd3MgY2hhbmdlLCBldmVuIGlmIHRoZSB0b3RhbCBudW1iZXIgb2Ygcm93cyBpcyB0aGUgc2FtZSwgdGhlIHJvdyBvYmplY3Qgd2lsbCBiZSBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgICBzdGFydE5vZGVJbmRleCA9PT0gcm93c0luVmlld1BvcnRbMF07XG5cbiAgICAgICAgICAgIGlmIChpc0NhY2hlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fdmlydHVhbFNjcm9sbENhY2hlID0geyBzdGFydE5vZGVJbmRleCwgdmlzaWJsZU5vZGVDb3VudCwgdG90YWxOb2RlQ291bnQgfTtcbiAgICAgICAgICAgIHRoaXMudmlydHVhbFNjcm9sbFRvdGFsSGVpZ2h0ID0gdG90YWxOb2RlQ291bnQgKiByb3dIZWlnaHQgLSB2aXNpYmxlTm9kZUNvdW50ICogcm93SGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5fdGFibGUuc2V0Um93c0luVmlld3BvcnQoXG4gICAgICAgICAgICAgICAgc3RhcnROb2RlSW5kZXgsXG4gICAgICAgICAgICAgICAgcm93c1Zpc2libGUuc2xpY2Uoc3RhcnROb2RlSW5kZXgsIHN0YXJ0Tm9kZUluZGV4ICsgdmlzaWJsZU5vZGVDb3VudCkubGVuZ3RoXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEluaXRpYWxpc2VzIHNjcm9sbCBsaXN0ZW5lcnMuXG4gICAgICovXG4gICAgbGlzdGVuT25WaXJ0dWFsU2Nyb2xsKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxXaG9sZVJvd3MpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhYmxlLnRhYmxlQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLl93aGVlbFNjcm9sbExpc3RlbmVyRnVuY3Rpb24sIHtcbiAgICAgICAgICAgICAgICBwYXNzaXZlOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl90YWJsZS50YWJsZVNjcm9sbE1vY2tDb250YWluZXIubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgICdzY3JvbGwnLFxuICAgICAgICAgICAgICAgIHRoaXMuX21vY2tTY3JvbGxiYXJMaXN0ZW5lckZ1bmN0aW9uLFxuICAgICAgICAgICAgICAgIHsgcGFzc2l2ZTogZmFsc2UgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3RhYmxlU2Nyb2xsRGlzcGF0Y2hlclxuICAgICAgICAgICAgICAgIC52ZXJ0aWNhbGx5U2Nyb2xsZWQoKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy52aXJ0dWFsU2Nyb2xsICYmICEhdGhpcy5ib2R5SGVpZ2h0KSxcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChzY3JvbGxhYmxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlVmlydHVhbFNjcm9sbFJvd3MoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFibGUuc2V0VGFibGVTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLl90YWJsZS5nZXRUYWJsZVN0YXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3BQb3NpdGlvbjogc2Nyb2xsYWJsZS5nZXRTY3JvbGxUb3AoKVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZ2V0TnVtYmVyT2ZSb3dzVG9EaXNwbGF5KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHRhYmxlQ29udGFpbmVyID0gdGhpcy5fdGFibGUudGFibGVDb250YWluZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgbGV0IHRhYmxlSGVpZ2h0ID0gdGFibGVDb250YWluZXIuY2xpZW50SGVpZ2h0O1xuICAgICAgICB0YWJsZUhlaWdodCA9IHRhYmxlSGVpZ2h0IC0gdGFibGVDb250YWluZXIucXVlcnlTZWxlY3RvcigndGhlYWQnKS5jbGllbnRIZWlnaHQ7XG4gICAgICAgIGNvbnN0IG51bWJlck9mUm93cyA9IE1hdGguZmxvb3IodGFibGVIZWlnaHQgLyAodGhpcy5yb3dIZWlnaHQgKyAyKSk7XG4gICAgICAgIGlmICh0aGlzLl90YWJsZS5fdGFibGVSb3dzVmlzaWJsZS5sZW5ndGggPCBudW1iZXJPZlJvd3MpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90YWJsZS5fdGFibGVSb3dzVmlzaWJsZS5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyT2ZSb3dzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgcGVyZm9ybXMgYSB3aGVlbCBldmVudC4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgdXNlciBoYXMgc2Nyb2xsZWRcbiAgICAgKiB1cCBvciBkb3duIHVzaW5nIHRoZSBldmVudCdzIGRlbHRhWCBwcm9wZXJ0eSwgYW5kIHNjcm9sbHMgdGhlIHRhYmxlIGJ5IG9uZSByb3cuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfd2hlZWxTY3JvbGxMaXN0ZW5lckZ1bmN0aW9uID0gKGV2ZW50OiBXaGVlbEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChNYXRoLmFicyhldmVudC5kZWx0YVgpIDwgTWF0aC5hYnMoZXZlbnQuZGVsdGFZKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3doZWVsVGltZW91dCkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl93aGVlbFRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGVsdGFZID0gZXZlbnQuZGVsdGFZO1xuICAgICAgICAgICAgaWYgKGRlbHRhWSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3doZWVsVGltZW91dCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxSb3coZGVsdGFZID4gMCA/IDEgOiAtMSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIG1vY2sgc2Nyb2xsYmFyICh3aGVuIHVzaW5nICdzY3JvbGxXaG9sZVJvd3MnKSBpcyBtb3ZlZC4gSXQgZGV0ZXJtaW5lcyBpZiB0aGVcbiAgICAgKiBzY3JvbGwgd2FzIHVwIG9yIGRvd24gYnkgY29tcGFyaW5nIHRoZSBjdXJyZW50IHNjcm9sbCB0b3AgdG8gdGhlIHByZXZpb3VzIHNjcm9sbCB0b3AgYW5kIHNjcm9sbHMgcm93cyBhY2NvcmRpbmdseS5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9tb2NrU2Nyb2xsYmFyTGlzdGVuZXJGdW5jdGlvbiA9IChldmVudDogRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmICh0aGlzLl9zY3JvbGxNb2NrVGltZW91dCkge1xuICAgICAgICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3Njcm9sbE1vY2tUaW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWJsZVNjcm9sbE1vY2tDb250YWluZXIgPSB0aGlzLl90YWJsZS50YWJsZVNjcm9sbE1vY2tDb250YWluZXIubmF0aXZlRWxlbWVudDtcbiAgICAgICAgbGV0IGRlbHRhWSA9IHRhYmxlU2Nyb2xsTW9ja0NvbnRhaW5lci5zY3JvbGxUb3AgLSB0aGlzLl9sYXN0TW9ja1Njcm9sbFBvc2l0aW9uO1xuICAgICAgICBkZWx0YVkgPSBNYXRoLmNlaWwoZGVsdGFZIC8gdGhpcy5yb3dIZWlnaHQpO1xuICAgICAgICB0aGlzLl9zY3JvbGxNb2NrVGltZW91dCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc2Nyb2xsUm93KGRlbHRhWSwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLl9sYXN0TW9ja1Njcm9sbFBvc2l0aW9uID0gdGFibGVTY3JvbGxNb2NrQ29udGFpbmVyLnNjcm9sbFRvcDtcbiAgICAgICAgICAgIGlmICh0YWJsZVNjcm9sbE1vY2tDb250YWluZXIuc2Nyb2xsVG9wID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gQWx3YXlzIGRpc3BsYXkgdGhlIGZpcnN0IHJvdyBvZiB0aGUgdGFibGUgd2hlbiB0aGUgdXNlciBzY3JvbGxzIGFsbCB0aGUgd2F5IHRvIHRoZSB0b3BcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRSb3dzKDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRhYmxlU2Nyb2xsTW9ja0NvbnRhaW5lci5zY3JvbGxUb3AgKyB0YWJsZVNjcm9sbE1vY2tDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ID09PVxuICAgICAgICAgICAgICAgIHRhYmxlU2Nyb2xsTW9ja0NvbnRhaW5lci5zY3JvbGxIZWlnaHRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBkaXNwbGF5IHRoZSBsYXN0IHJvd3Mgb2YgdGhlIHRhYmxlIHdoZW4gdGhlIHVzZXIgc2Nyb2xscyBhbGwgdGhlIHdheSB0byB0aGUgYm90dG9tXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRpbmdOb2RlSW5kZXggPSB0aGlzLl90YWJsZS5fdGFibGVSb3dzVmlzaWJsZS5sZW5ndGggLSB0aGlzLl9nZXROdW1iZXJPZlJvd3NUb0Rpc3BsYXkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRSb3dzKHN0YXJ0aW5nTm9kZUluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uLCB1c2VkIG9ubHkgd2hlbiAnc2Nyb2xsV2hvbGVSb3dzJyBpcyB0cnV0aHksIGNhbGN1bGF0ZXMgd2hhdCBzaG91bGQgYmUgdGhlIG5ldyBzdGFydGluZyBub2RlLCBiYXNlZFxuICAgICAqIG9mZiB0aGUgcHJldmlvdXMgc3RhcnRpbmcgbm9kZSBhbmQgdGhlIHByb3ZpZGVkICdjb3VudCcgcGFyYW1ldGVyLiBGb3IgZXhhbXBsZSBpZiB0aGUgcHJldmlvdXMgc3RhcnQgbm9kZSB3YXMgMTBcbiAgICAgKiBhbmQgdGhlIGNvdW50IHBhcmFtZXRlciBpcyAtMiwgdGhlIG5ldyBzdGFydGluZyBub2RlIHdpbGwgYmUgOC4gVGhpcyBmdW5jdGlvbiBhbHNvIHByb2dyYW1tYXRpY2FsbHkgbW92ZXMgdGhlXG4gICAgICogbW9jayBzY3JvbGxiYXIuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2Nyb2xsUm93KGNvdW50OiBudW1iZXIsIGZyb21Nb2NrU2Nyb2xsYmFyTGlzdGVuZXIgPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBsZXQgc3RhcnRpbmdOb2RlID0gMDtcbiAgICAgICAgaWYgKHRoaXMuX3ByZXZpb3VzU3RhcnROb2RlSW5kZXggIT09IG51bGwgJiYgdGhpcy5fcHJldmlvdXNTdGFydE5vZGVJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBzdGFydGluZ05vZGUgPSB0aGlzLl9wcmV2aW91c1N0YXJ0Tm9kZUluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHN0YXJ0aW5nTm9kZSArIGNvdW50ICsgdGhpcy5fZ2V0TnVtYmVyT2ZSb3dzVG9EaXNwbGF5KCkgPD0gdGhpcy5fdGFibGUuX3RhYmxlUm93c1Zpc2libGUubGVuZ3RoIHx8XG4gICAgICAgICAgICBjb3VudCA8IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBzdGFydGluZ05vZGUgPSBNYXRoLmNlaWwoc3RhcnRpbmdOb2RlICsgY291bnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydGluZ05vZGUgPCAwKSB7XG4gICAgICAgICAgICBzdGFydGluZ05vZGUgPSAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoaXMgbmV4dCAnaWYnIHN0YXRlbWVudCBpcyBmb3IgdHJpZ2dlcmluZyBuZXcgcGFnZSBsb2FkcyB3aGVuICdwYWdlU2Nyb2xsaW5nJyBpcyB0cnVlXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGNvdW50ID4gMCAmJlxuICAgICAgICAgICAgc3RhcnRpbmdOb2RlID09PSB0aGlzLl9wcmV2aW91c1N0YXJ0Tm9kZUluZGV4ICYmXG4gICAgICAgICAgICB0aGlzLl90YWJsZS5wYWdlU2Nyb2xsaW5nICYmXG4gICAgICAgICAgICB0aGlzLl90YWJsZS5fdGFibGVSb3dzVmlzaWJsZS5sZW5ndGggPT09IHRoaXMuX3RhYmxlLl90YWJsZVJvd3MubGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5fdGFibGUuX29uU3B5SW50ZXJzZWN0KHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NldFJvd3Moc3RhcnRpbmdOb2RlKTtcbiAgICAgICAgY29uc3QgdGFibGVTY3JvbGxNb2NrQ29udGFpbmVyID0gdGhpcy5fdGFibGUudGFibGVTY3JvbGxNb2NrQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmICghZnJvbU1vY2tTY3JvbGxiYXJMaXN0ZW5lcikge1xuICAgICAgICAgICAgdGFibGVTY3JvbGxNb2NrQ29udGFpbmVyLnNjcm9sbEJ5KHsgdG9wOiBjb3VudCAqIHRoaXMucm93SGVpZ2h0IH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2xhc3RNb2NrU2Nyb2xsUG9zaXRpb24gPSB0YWJsZVNjcm9sbE1vY2tDb250YWluZXIuc2Nyb2xsVG9wO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNldHMgcm93cyBpbiB0aGUgdGFibGUncyB2aWV3cG9ydCBkZXBlbmRpbmcgb24gdGhlIHByb3ZpZGVkIHN0YXJ0aW5nIG5vZGUuIEl0IGFsc28gc2V0cyB0aGUgdGFibGVcbiAgICAgKiBzdGF0ZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZXRSb3dzKHN0YXJ0aW5nTm9kZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3RhYmxlLnNldFJvd3NJblZpZXdwb3J0KHN0YXJ0aW5nTm9kZSwgdGhpcy5fZ2V0TnVtYmVyT2ZSb3dzVG9EaXNwbGF5KCkpO1xuICAgICAgICB0aGlzLl9wcmV2aW91c1N0YXJ0Tm9kZUluZGV4ID0gc3RhcnRpbmdOb2RlO1xuICAgICAgICB0aGlzLl90YWJsZS5zZXRUYWJsZVN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX3RhYmxlLmdldFRhYmxlU3RhdGUoKSxcbiAgICAgICAgICAgIHNjcm9sbFRvcFBvc2l0aW9uOiB0aGlzLnJvd0hlaWdodCAqIHN0YXJ0aW5nTm9kZVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
@@ -4,4 +4,4 @@ export class TableInitialState {
4
4
  }
5
5
  export class TableVirtualScroll {
6
6
  }
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aXZlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vc3JjL2xpYi90YWJsZS1oZWxwZXJzL21vZGVscy9kaXJlY3RpdmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE1BQU0sT0FBZ0IsY0FBYztDQWFuQztBQUVELE1BQU0sT0FBZ0IsaUJBQWlCO0NBU3RDO0FBRUQsTUFBTSxPQUFnQixrQkFBa0I7Q0FRdkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERyYWdvdmVyUHJlZGljYXRlLCBEcm9wUHJlZGljYXRlLCBGZERuZERyb3BUeXBlLCBGZERyb3BFdmVudCB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY2RrL3V0aWxzJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbGxlY3Rpb25GaWx0ZXIsIENvbGxlY3Rpb25Hcm91cCwgQ29sbGVjdGlvblNvcnQsIFRhYmxlU3RhdGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSAnLi4vdGFibGUnO1xuaW1wb3J0IHsgVGFibGVSb3cgfSBmcm9tICcuL3RhYmxlLXJvdy5tb2RlbCc7XG5pbXBvcnQgeyBUYWJsZVJvd3NSZWFycmFuZ2VFdmVudCB9IGZyb20gJy4vdGFibGUtcm93cy1yZWFycmFuZ2UtZXZlbnQubW9kZWwnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVGFibGVEcmFnZ2FibGU8VCA9IGFueT4ge1xuICAgIGFic3RyYWN0IGRyYWdEcm9wSW5Qcm9ncmVzczogYm9vbGVhbjtcbiAgICBhYnN0cmFjdCBlbmFibGVSb3dSZW9yZGVyaW5nOiBib29sZWFuO1xuICAgIGFic3RyYWN0IGlzVHJlZVRhYmxlOiBib29sZWFuO1xuICAgIGFic3RyYWN0IGRyb3BNb2RlOiBGZERuZERyb3BUeXBlO1xuICAgIGFic3RyYWN0IGRyb3BQcmVkaWNhdGU6IERyb3BQcmVkaWNhdGU8VGFibGVSb3c8VD4+O1xuICAgIGFic3RyYWN0IGRyYWdvdmVyUHJlZGljYXRlOiBEcmFnb3ZlclByZWRpY2F0ZTxUYWJsZVJvdzxUPj47XG4gICAgYWJzdHJhY3Qgcm93c1JlYXJyYW5nZTogRXZlbnRFbWl0dGVyPFRhYmxlUm93c1JlYXJyYW5nZUV2ZW50PFQ+PjtcbiAgICBhYnN0cmFjdCBkcmFnUm93RnJvbUtleWJvYXJkKGRpcjogc3RyaW5nLCBldmVudDogRXZlbnQsIGN1cnJlbnRSb3dJbmRleDogbnVtYmVyLCBtb2RlOiAnc2hpZnQnIHwgJ2dyb3VwJyk6IHZvaWQ7XG4gICAgYWJzdHJhY3QgZHJhZ0Ryb3BJdGVtRHJvcChldmVudDogRmREcm9wRXZlbnQ8VGFibGVSb3c+KTogdm9pZDtcbiAgICBhYnN0cmFjdCBkcmFnRHJvcFN0YXJ0KCk6IHZvaWQ7XG4gICAgYWJzdHJhY3Qgc2V0VGFibGUodGFibGU6IFRhYmxlKTogdm9pZDtcbiAgICBhYnN0cmFjdCBkcm9wQ2FuY2VsbGVkKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUYWJsZUluaXRpYWxTdGF0ZSB7XG4gICAgYWJzdHJhY3QgaW5pdGlhbFNvcnRCeTogQ29sbGVjdGlvblNvcnRbXTtcbiAgICBhYnN0cmFjdCBpbml0aWFsVmlzaWJsZUNvbHVtbnM6IHN0cmluZ1tdO1xuICAgIGFic3RyYWN0IGluaXRpYWxGaWx0ZXJCeTogQ29sbGVjdGlvbkZpbHRlcltdO1xuICAgIGFic3RyYWN0IGluaXRpYWxHcm91cEJ5OiBDb2xsZWN0aW9uR3JvdXBbXTtcbiAgICBhYnN0cmFjdCBpbml0aWFsUGFnZTogbnVtYmVyO1xuICAgIGFic3RyYWN0IHN0YXRlOiBUYWJsZVN0YXRlO1xuICAgIGFic3RyYWN0IHNldFRhYmxlKHRhYmxlOiBUYWJsZSk6IHZvaWQ7XG4gICAgYWJzdHJhY3Qgc2V0SW5pdGlhbFN0YXRlKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUYWJsZVZpcnR1YWxTY3JvbGwge1xuICAgIGFic3RyYWN0IHJvd0hlaWdodDogbnVtYmVyO1xuICAgIGFic3RyYWN0IHZpcnR1YWxTY3JvbGxUcmFuc2Zvcm0kOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gICAgYWJzdHJhY3QgdmlydHVhbFNjcm9sbDogYm9vbGVhbjtcbiAgICBhYnN0cmFjdCB2aXJ0dWFsU2Nyb2xsVG90YWxIZWlnaHQ6IG51bWJlcjtcbiAgICBhYnN0cmFjdCBzZXRUYWJsZSh0YWJsZTogVGFibGUpOiB2b2lkO1xuICAgIGFic3RyYWN0IGxpc3Rlbk9uVmlydHVhbFNjcm9sbCgpOiB2b2lkO1xuICAgIGFic3RyYWN0IGNhbGN1bGF0ZVZpcnR1YWxTY3JvbGxSb3dzKCk6IHZvaWQ7XG59XG4iXX0=
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aXZlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vc3JjL2xpYi90YWJsZS1oZWxwZXJzL21vZGVscy9kaXJlY3RpdmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE1BQU0sT0FBZ0IsY0FBYztDQWFuQztBQUVELE1BQU0sT0FBZ0IsaUJBQWlCO0NBU3RDO0FBRUQsTUFBTSxPQUFnQixrQkFBa0I7Q0FTdkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERyYWdvdmVyUHJlZGljYXRlLCBEcm9wUHJlZGljYXRlLCBGZERuZERyb3BUeXBlLCBGZERyb3BFdmVudCB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY2RrL3V0aWxzJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbGxlY3Rpb25GaWx0ZXIsIENvbGxlY3Rpb25Hcm91cCwgQ29sbGVjdGlvblNvcnQsIFRhYmxlU3RhdGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSAnLi4vdGFibGUnO1xuaW1wb3J0IHsgVGFibGVSb3cgfSBmcm9tICcuL3RhYmxlLXJvdy5tb2RlbCc7XG5pbXBvcnQgeyBUYWJsZVJvd3NSZWFycmFuZ2VFdmVudCB9IGZyb20gJy4vdGFibGUtcm93cy1yZWFycmFuZ2UtZXZlbnQubW9kZWwnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVGFibGVEcmFnZ2FibGU8VCA9IGFueT4ge1xuICAgIGFic3RyYWN0IGRyYWdEcm9wSW5Qcm9ncmVzczogYm9vbGVhbjtcbiAgICBhYnN0cmFjdCBlbmFibGVSb3dSZW9yZGVyaW5nOiBib29sZWFuO1xuICAgIGFic3RyYWN0IGlzVHJlZVRhYmxlOiBib29sZWFuO1xuICAgIGFic3RyYWN0IGRyb3BNb2RlOiBGZERuZERyb3BUeXBlO1xuICAgIGFic3RyYWN0IGRyb3BQcmVkaWNhdGU6IERyb3BQcmVkaWNhdGU8VGFibGVSb3c8VD4+O1xuICAgIGFic3RyYWN0IGRyYWdvdmVyUHJlZGljYXRlOiBEcmFnb3ZlclByZWRpY2F0ZTxUYWJsZVJvdzxUPj47XG4gICAgYWJzdHJhY3Qgcm93c1JlYXJyYW5nZTogRXZlbnRFbWl0dGVyPFRhYmxlUm93c1JlYXJyYW5nZUV2ZW50PFQ+PjtcbiAgICBhYnN0cmFjdCBkcmFnUm93RnJvbUtleWJvYXJkKGRpcjogc3RyaW5nLCBldmVudDogRXZlbnQsIGN1cnJlbnRSb3dJbmRleDogbnVtYmVyLCBtb2RlOiAnc2hpZnQnIHwgJ2dyb3VwJyk6IHZvaWQ7XG4gICAgYWJzdHJhY3QgZHJhZ0Ryb3BJdGVtRHJvcChldmVudDogRmREcm9wRXZlbnQ8VGFibGVSb3c+KTogdm9pZDtcbiAgICBhYnN0cmFjdCBkcmFnRHJvcFN0YXJ0KCk6IHZvaWQ7XG4gICAgYWJzdHJhY3Qgc2V0VGFibGUodGFibGU6IFRhYmxlKTogdm9pZDtcbiAgICBhYnN0cmFjdCBkcm9wQ2FuY2VsbGVkKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUYWJsZUluaXRpYWxTdGF0ZSB7XG4gICAgYWJzdHJhY3QgaW5pdGlhbFNvcnRCeTogQ29sbGVjdGlvblNvcnRbXTtcbiAgICBhYnN0cmFjdCBpbml0aWFsVmlzaWJsZUNvbHVtbnM6IHN0cmluZ1tdO1xuICAgIGFic3RyYWN0IGluaXRpYWxGaWx0ZXJCeTogQ29sbGVjdGlvbkZpbHRlcltdO1xuICAgIGFic3RyYWN0IGluaXRpYWxHcm91cEJ5OiBDb2xsZWN0aW9uR3JvdXBbXTtcbiAgICBhYnN0cmFjdCBpbml0aWFsUGFnZTogbnVtYmVyO1xuICAgIGFic3RyYWN0IHN0YXRlOiBUYWJsZVN0YXRlO1xuICAgIGFic3RyYWN0IHNldFRhYmxlKHRhYmxlOiBUYWJsZSk6IHZvaWQ7XG4gICAgYWJzdHJhY3Qgc2V0SW5pdGlhbFN0YXRlKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUYWJsZVZpcnR1YWxTY3JvbGwge1xuICAgIGFic3RyYWN0IHJvd0hlaWdodDogbnVtYmVyO1xuICAgIGFic3RyYWN0IHZpcnR1YWxTY3JvbGxUcmFuc2Zvcm0kOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gICAgYWJzdHJhY3QgdmlydHVhbFNjcm9sbDogYm9vbGVhbjtcbiAgICBhYnN0cmFjdCB2aXJ0dWFsU2Nyb2xsVG90YWxIZWlnaHQ6IG51bWJlcjtcbiAgICBhYnN0cmFjdCBzY3JvbGxXaG9sZVJvd3M6IGJvb2xlYW47XG4gICAgYWJzdHJhY3Qgc2V0VGFibGUodGFibGU6IFRhYmxlKTogdm9pZDtcbiAgICBhYnN0cmFjdCBsaXN0ZW5PblZpcnR1YWxTY3JvbGwoKTogdm9pZDtcbiAgICBhYnN0cmFjdCBjYWxjdWxhdGVWaXJ0dWFsU2Nyb2xsUm93cygpOiB2b2lkO1xufVxuIl19