@firestitch/list 18.0.40 → 18.0.42

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 (34) hide show
  1. package/app/classes/data-controller.d.ts +1 -1
  2. package/app/components/body/row/cell/cell.component.d.ts +6 -5
  3. package/app/components/body/row/row.component.d.ts +9 -10
  4. package/app/components/head/head.component.d.ts +2 -1
  5. package/app/models/row/_base-row.d.ts +30 -0
  6. package/app/models/row/child-row.d.ts +18 -7
  7. package/app/models/row/group-footer-row.d.ts +14 -7
  8. package/app/models/row/group-row.d.ts +21 -11
  9. package/app/models/row/simple-row.d.ts +8 -3
  10. package/app/models/row.d.ts +13 -33
  11. package/esm2022/app/classes/data-controller.mjs +25 -31
  12. package/esm2022/app/classes/list-controller.mjs +2 -1
  13. package/esm2022/app/classes/selection-controller.mjs +8 -7
  14. package/esm2022/app/components/body/row/actions/actions.component.mjs +1 -2
  15. package/esm2022/app/components/body/row/cell/cell.component.mjs +44 -38
  16. package/esm2022/app/components/body/row/inline-action/inline-action.component.mjs +1 -2
  17. package/esm2022/app/components/body/row/menu-action/menu-action.component.mjs +1 -2
  18. package/esm2022/app/components/body/row/row.component.mjs +54 -59
  19. package/esm2022/app/components/footer/footer-row/footer-row.component.mjs +3 -3
  20. package/esm2022/app/components/head/head.component.mjs +4 -3
  21. package/esm2022/app/components/list/list.component.mjs +3 -3
  22. package/esm2022/app/directives/draggable-list/draggable-list.directive.mjs +5 -4
  23. package/esm2022/app/directives/draggable-row/draggable-row.directive.mjs +4 -4
  24. package/esm2022/app/models/row/_base-row.mjs +43 -0
  25. package/esm2022/app/models/row/child-row.mjs +14 -10
  26. package/esm2022/app/models/row/group-footer-row.mjs +11 -7
  27. package/esm2022/app/models/row/group-row.mjs +16 -20
  28. package/esm2022/app/models/row/simple-row.mjs +5 -5
  29. package/esm2022/app/models/row.mjs +26 -82
  30. package/fesm2022/firestitch-list.mjs +523 -549
  31. package/fesm2022/firestitch-list.mjs.map +1 -1
  32. package/package.json +1 -1
  33. package/app/models/row/base-row.d.ts +0 -13
  34. package/esm2022/app/models/row/base-row.mjs +0 -25
@@ -54,7 +54,7 @@ export declare class DataController {
54
54
  * @param targetRow
55
55
  * @param trackBy
56
56
  */
57
- replaceData(targetRow: FsListAbstractRow, trackBy?: FsListTrackByTargetRowFn): boolean;
57
+ replaceData(targetRow: FsListAbstractRow, trackBy: FsListTrackByTargetRowFn): boolean;
58
58
  /**
59
59
  * Update data for specified row
60
60
  * @param rows
@@ -1,22 +1,23 @@
1
- import { DoCheck, OnChanges, OnDestroy, OnInit, SimpleChanges, TemplateRef } from '@angular/core';
1
+ import { OnChanges, OnDestroy, OnInit, SimpleChanges, TemplateRef } from '@angular/core';
2
2
  import { Column } from '../../../../models/column.model';
3
+ import { Row } from '../../../../models';
3
4
  import * as i0 from "@angular/core";
4
- export declare class FsCellComponent implements OnInit, OnChanges, DoCheck, OnDestroy {
5
+ export declare class FsCellComponent implements OnInit, OnChanges, OnDestroy {
5
6
  isColl: boolean;
6
7
  role: string;
7
8
  column: Column;
8
- row: any;
9
9
  rowIndex: number;
10
+ row: import("@angular/core").InputSignal<Row>;
10
11
  cellContext: any;
11
12
  cellTemplate: TemplateRef<any>;
12
13
  private _destroy$;
14
+ constructor();
13
15
  ngOnInit(): void;
14
- ngDoCheck(): void;
15
16
  ngOnChanges(changes: SimpleChanges): void;
16
17
  ngOnDestroy(): void;
17
18
  private _initCellContext;
18
19
  private _initCellTemplate;
19
20
  private _listenGroupOpen;
20
21
  static ɵfac: i0.ɵɵFactoryDeclaration<FsCellComponent, never>;
21
- static ɵcmp: i0.ɵɵComponentDeclaration<FsCellComponent, "[fs-cell]", never, { "column": { "alias": "column"; "required": false; }; "row": { "alias": "row"; "required": false; }; "rowIndex": { "alias": "rowIndex"; "required": false; }; }, {}, never, never, true, never>;
22
+ static ɵcmp: i0.ɵɵComponentDeclaration<FsCellComponent, "[fs-cell]", never, { "column": { "alias": "column"; "required": false; }; "rowIndex": { "alias": "rowIndex"; "required": false; }; "row": { "alias": "row"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
22
23
  }
@@ -1,4 +1,4 @@
1
- import { ChangeDetectorRef, DoCheck, ElementRef, EventEmitter, KeyValueDiffers, OnDestroy, OnInit, Renderer2 } from '@angular/core';
1
+ import { AfterViewInit, ChangeDetectorRef, DoCheck, ElementRef, EventEmitter, KeyValueDiffers, OnDestroy, OnInit, Renderer2 } from '@angular/core';
2
2
  import { MatCheckboxChange } from '@angular/material/checkbox';
3
3
  import { ReorderPosition, ReorderStrategy } from '../../../classes/reorder-controller';
4
4
  import { SelectionController } from '../../../classes/selection-controller';
@@ -7,14 +7,14 @@ import { Column } from '../../../models/column.model';
7
7
  import { Row } from '../../../models/row';
8
8
  import { RowAction } from '../../../models/row-action.model';
9
9
  import * as i0 from "@angular/core";
10
- export declare class FsRowComponent implements OnInit, DoCheck, OnDestroy {
10
+ export declare class FsRowComponent implements OnInit, DoCheck, AfterViewInit, OnDestroy {
11
11
  el: ElementRef;
12
12
  private _cdRef;
13
13
  private _differs;
14
14
  private _renderer;
15
15
  private _draggableList;
16
16
  role: string;
17
- row: Row;
17
+ row: import("@angular/core").InputSignal<Row>;
18
18
  rowActionsRaw: any[];
19
19
  groupActionsRaw: any[];
20
20
  hasRowActions: boolean;
@@ -30,7 +30,6 @@ export declare class FsRowComponent implements OnInit, DoCheck, OnDestroy {
30
30
  reorderPosition: ReorderPosition | null;
31
31
  reorderStrategy: ReorderStrategy | null;
32
32
  reorderMultiple: boolean;
33
- cellRefs: any;
34
33
  readonly ReorderPosition: typeof ReorderPosition;
35
34
  readonly ReorderStrategy: typeof ReorderStrategy;
36
35
  rowActions: RowAction[];
@@ -43,17 +42,17 @@ export declare class FsRowComponent implements OnInit, DoCheck, OnDestroy {
43
42
  private _eventListeners;
44
43
  private _destroy$;
45
44
  constructor(el: ElementRef, _cdRef: ChangeDetectorRef, _differs: KeyValueDiffers, _renderer: Renderer2, _draggableList: FsListDraggableListDirective);
46
- get isGroupRow(): boolean;
47
- get isGroupChildRow(): boolean;
48
- get isGroupFooterRow(): boolean;
49
45
  get isDragDisabled(): boolean;
50
46
  get isMultipleSelection(): boolean;
51
- get rowCssClass(): string;
52
- get dragCellVisible(): boolean;
47
+ rowCustomClass: import("@angular/core").Signal<string>;
53
48
  get leftDragDropEnabled(): boolean;
54
49
  get rightDragDropEnabled(): boolean;
55
50
  ngOnInit(): void;
56
51
  ngDoCheck(): void;
52
+ ngAfterViewInit(): void;
53
+ isGroupRow: import("@angular/core").Signal<boolean>;
54
+ isGroupFooterRow: import("@angular/core").Signal<boolean>;
55
+ dragCellVisible: import("@angular/core").Signal<boolean>;
57
56
  updateRowActions(): void;
58
57
  ngOnDestroy(): void;
59
58
  /**
@@ -81,5 +80,5 @@ export declare class FsRowComponent implements OnInit, DoCheck, OnDestroy {
81
80
  private _initSelection;
82
81
  private _filterActionsByCategories;
83
82
  static ɵfac: i0.ɵɵFactoryDeclaration<FsRowComponent, never>;
84
- static ɵcmp: i0.ɵɵComponentDeclaration<FsRowComponent, "[fs-list-row]", never, { "row": { "alias": "row"; "required": false; }; "rowActionsRaw": { "alias": "rowActionsRaw"; "required": false; }; "groupActionsRaw": { "alias": "groupActionsRaw"; "required": false; }; "hasRowActions": { "alias": "hasRowActions"; "required": false; }; "rowEvents": { "alias": "rowEvents"; "required": false; }; "rowClass": { "alias": "rowClass"; "required": false; }; "restoreMode": { "alias": "restoreMode"; "required": false; }; "rowIndex": { "alias": "rowIndex"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; "selection": { "alias": "selection"; "required": false; }; "rowRemoved": { "alias": "rowRemoved"; "required": false; }; "activeFiltersCount": { "alias": "activeFiltersCount"; "required": false; }; "reorderEnabled": { "alias": "reorderEnabled"; "required": false; }; "reorderPosition": { "alias": "reorderPosition"; "required": false; }; "reorderStrategy": { "alias": "reorderStrategy"; "required": false; }; "reorderMultiple": { "alias": "reorderMultiple"; "required": false; }; }, {}, never, never, true, never>;
83
+ static ɵcmp: i0.ɵɵComponentDeclaration<FsRowComponent, "[fs-list-row]", never, { "row": { "alias": "row"; "required": false; "isSignal": true; }; "rowActionsRaw": { "alias": "rowActionsRaw"; "required": false; }; "groupActionsRaw": { "alias": "groupActionsRaw"; "required": false; }; "hasRowActions": { "alias": "hasRowActions"; "required": false; }; "rowEvents": { "alias": "rowEvents"; "required": false; }; "rowClass": { "alias": "rowClass"; "required": false; }; "restoreMode": { "alias": "restoreMode"; "required": false; }; "rowIndex": { "alias": "rowIndex"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; "selection": { "alias": "selection"; "required": false; }; "rowRemoved": { "alias": "rowRemoved"; "required": false; }; "activeFiltersCount": { "alias": "activeFiltersCount"; "required": false; }; "reorderEnabled": { "alias": "reorderEnabled"; "required": false; }; "reorderPosition": { "alias": "reorderPosition"; "required": false; }; "reorderStrategy": { "alias": "reorderStrategy"; "required": false; }; "reorderMultiple": { "alias": "reorderMultiple"; "required": false; }; }, {}, never, never, true, never>;
85
84
  }
@@ -34,8 +34,9 @@ export declare class FsHeadComponent implements OnInit, OnDestroy {
34
34
  * Track By for improve change detection
35
35
  *
36
36
  * @param index
37
+ * @param column
37
38
  */
38
- trackByFn(index: any): any;
39
+ trackByFn(index: number, column: Column): string | number;
39
40
  /**
40
41
  * Subscribe to sorting change
41
42
  */
@@ -0,0 +1,30 @@
1
+ import { Observable } from 'rxjs';
2
+ import { RowType } from '../../enums/row-type.enum';
3
+ import { FsListReorderData } from '../../interfaces';
4
+ export interface IBaseRow {
5
+ data: object;
6
+ index: number;
7
+ readyToSwap: boolean;
8
+ actionsUpdated$: Observable<void>;
9
+ updateActions(): void;
10
+ reorderData(): FsListReorderData;
11
+ destroy(): void;
12
+ }
13
+ export declare abstract class BaseRow<T = RowType> implements IBaseRow {
14
+ protected readonly _rowType: T;
15
+ private _index;
16
+ private _readyToSwap;
17
+ private _actionsUpdated$;
18
+ private _data;
19
+ constructor(data?: object);
20
+ get data(): object;
21
+ get type(): T;
22
+ get index(): number;
23
+ set index(value: number);
24
+ get readyToSwap(): boolean;
25
+ set readyToSwap(value: boolean);
26
+ get actionsUpdated$(): Observable<void>;
27
+ updateActions(): void;
28
+ reorderData(): FsListReorderData;
29
+ abstract destroy(): any;
30
+ }
@@ -1,12 +1,23 @@
1
- import { BaseRow } from './base-row';
2
- import { GroupRow } from './group-row';
1
+ import { BaseRow, IBaseRow } from './_base-row';
2
+ import { RowType } from '../../enums/row-type.enum';
3
+ import { IGroupRow } from './group-row';
3
4
  import { FsListReorderData } from '../../interfaces';
4
- export declare class ChildRow extends BaseRow {
5
+ export interface IBaseChildRow extends IBaseRow {
6
+ type: RowType.GroupChild | RowType.GroupFooter;
7
+ parent: IGroupRow;
5
8
  visible: boolean;
9
+ }
10
+ export interface IChildRow extends IBaseChildRow {
11
+ type: RowType.GroupChild;
12
+ }
13
+ export declare class ChildRow extends BaseRow<RowType.GroupChild> implements IChildRow {
14
+ protected readonly _rowType: RowType.GroupChild;
15
+ private _visible;
6
16
  private readonly _parent;
7
- constructor(data?: any, parent?: GroupRow);
8
- get parent(): GroupRow;
9
- get isChild(): boolean;
10
- getReorderData(): FsListReorderData;
17
+ constructor(data?: object, parent?: IGroupRow);
18
+ get visible(): boolean;
19
+ set visible(value: boolean);
20
+ get parent(): IGroupRow;
21
+ reorderData(): FsListReorderData;
11
22
  destroy(): void;
12
23
  }
@@ -1,10 +1,17 @@
1
- import { BaseRow } from './base-row';
2
- import { GroupRow } from './group-row';
3
- export declare class GroupFooterRow extends BaseRow {
4
- visible: boolean;
1
+ import { BaseRow } from './_base-row';
2
+ import { RowType } from '../../enums/row-type.enum';
3
+ import { IGroupRow } from './group-row';
4
+ import { IBaseChildRow } from './child-row';
5
+ export interface IGroupFooterRow extends IBaseChildRow {
6
+ type: RowType.GroupFooter;
7
+ }
8
+ export declare class GroupFooterRow extends BaseRow<RowType.GroupFooter> implements IGroupFooterRow {
9
+ protected readonly _rowType: RowType.GroupFooter;
10
+ private _visible;
5
11
  private readonly _parent;
6
- constructor(data?: any, parent?: GroupRow);
7
- get parent(): GroupRow;
8
- get isGroupFooter(): boolean;
12
+ constructor(data?: object, parent?: IGroupRow);
13
+ get visible(): boolean;
14
+ set visible(value: boolean);
15
+ get parent(): IGroupRow;
9
16
  destroy(): void;
10
17
  }
@@ -1,16 +1,26 @@
1
- import { BaseRow } from './base-row';
2
- import { ChildRow } from './child-row';
3
- import { GroupFooterRow } from './group-footer-row';
4
- export declare class GroupRow extends BaseRow {
5
- children: (ChildRow | GroupFooterRow)[];
1
+ import { Observable } from 'rxjs';
2
+ import { BaseRow, IBaseRow } from './_base-row';
3
+ import { RowType } from '../../enums/row-type.enum';
4
+ import { IGroupFooterRow } from './group-footer-row';
5
+ import { IChildRow } from './child-row';
6
+ export interface IGroupRow extends IBaseRow {
7
+ type: RowType.Group;
8
+ childrenData: unknown[];
9
+ expanded: boolean;
10
+ expanded$: Observable<boolean>;
11
+ toggleRowExpandStatus(): void;
12
+ children: (IChildRow | IGroupFooterRow)[];
13
+ }
14
+ export declare class GroupRow extends BaseRow<RowType.Group> implements IGroupRow {
15
+ protected readonly _rowType: RowType.Group;
16
+ private _children;
6
17
  private readonly _expanded;
7
- constructor(data?: any, initialExpand?: boolean);
8
- get childrenData(): any[];
9
- get isGroup(): boolean;
18
+ constructor(data?: object, initialExpand?: boolean);
19
+ get children(): (IChildRow | IGroupFooterRow)[];
20
+ get childrenData(): object[];
10
21
  get expanded(): boolean;
11
- get expanded$(): import("rxjs").Observable<boolean>;
12
- updateChildrenIndexes(): void;
13
- updateChildrenVisibility(): void;
22
+ get expanded$(): Observable<boolean>;
14
23
  toggleRowExpandStatus(): void;
15
24
  destroy(): void;
25
+ private _updateChildrenVisibility;
16
26
  }
@@ -1,5 +1,10 @@
1
- import { BaseRow } from './base-row';
2
- export declare class SimpleRow extends BaseRow {
3
- constructor(data?: any);
1
+ import { RowType } from '../../enums/row-type.enum';
2
+ import { BaseRow, IBaseRow } from './_base-row';
3
+ export interface ISimpleRow extends IBaseRow {
4
+ type: RowType.Simple;
5
+ }
6
+ export declare class SimpleRow extends BaseRow<RowType.Simple> implements ISimpleRow {
7
+ protected _rowType: RowType.Simple;
8
+ constructor(data?: object);
4
9
  destroy(): void;
5
10
  }
@@ -1,34 +1,14 @@
1
- import { Observable } from 'rxjs';
2
1
  import { RowType } from '../enums/row-type.enum';
3
- import { FsListReorderData } from '../interfaces';
4
- import { ChildRow } from './row/child-row';
5
- import { GroupFooterRow } from './row/group-footer-row';
6
- import { GroupRow } from './row/group-row';
7
- export declare class Row {
8
- private _row;
9
- private _actionsUpdate$;
10
- constructor(data?: any, rowType?: RowType, { parent, initialExpand }?: {
11
- parent?: GroupRow;
12
- initialExpand?: boolean;
13
- });
14
- get index(): number;
15
- get actionsUpdate$(): Observable<any>;
16
- actionsUpdate(): void;
17
- set index(value: number);
18
- get readyToSwap(): boolean;
19
- get visible(): boolean;
20
- set readyToSwap(value: boolean);
21
- get data(): any;
22
- get type(): RowType;
23
- get isGroup(): boolean;
24
- get isGroupChild(): boolean;
25
- get isGroupFooter(): boolean;
26
- get parent(): GroupRow;
27
- get children(): (ChildRow | GroupFooterRow)[];
28
- get expanded(): boolean;
29
- get expanded$(): Observable<boolean>;
30
- updateChildrenIndexes(): void;
31
- toggleRowExpandStatus(): void;
32
- getReorderData(): FsListReorderData;
33
- destroy(): void;
34
- }
2
+ import { IChildRow } from './row/child-row';
3
+ import { IGroupFooterRow } from './row/group-footer-row';
4
+ import { IGroupRow } from './row/group-row';
5
+ import { ISimpleRow } from './row/simple-row';
6
+ export type Row = ISimpleRow | IGroupRow | IGroupFooterRow | IChildRow;
7
+ export declare function isGroupRow(row: Row): row is IGroupRow;
8
+ export declare function isChildRow(row: Row): row is IChildRow;
9
+ export declare function isGroupFooterRow(row: Row): row is IGroupFooterRow;
10
+ export declare function isChildTypeRow(row: Row): row is IChildRow | IGroupFooterRow;
11
+ export declare function makeRowFactory(data: object, rowType: RowType, opts?: {
12
+ parent?: Row;
13
+ initialExpand?: boolean;
14
+ }): Row;
@@ -3,10 +3,7 @@ import { takeUntil } from 'rxjs/operators';
3
3
  import { isFunction, isObject } from 'lodash-es';
4
4
  import { RowType } from '../enums/row-type.enum';
5
5
  import { FsListState } from '../enums/state.enum';
6
- import { Row } from '../models/row';
7
- import { ChildRow } from '../models/row/child-row';
8
- import { GroupFooterRow } from '../models/row/group-footer-row';
9
- import { GroupRow } from '../models/row/group-row';
6
+ import { makeRowFactory, isChildTypeRow, isGroupRow } from '../models/row';
10
7
  export class DataController {
11
8
  _visibleRows$ = new BehaviorSubject([]);
12
9
  _rowsRemoved$ = new Subject();
@@ -64,7 +61,7 @@ export class DataController {
64
61
  }
65
62
  get reorderData() {
66
63
  return this._rowsStack
67
- .map((row) => row.getReorderData());
64
+ .map((row) => row.reorderData());
68
65
  }
69
66
  setGroupConfig(group) {
70
67
  if (group) {
@@ -118,12 +115,12 @@ export class DataController {
118
115
  const rowIndex = this._rowsStack.findIndex((listRow) => {
119
116
  return trackBy(listRow.data, targetRow);
120
117
  });
121
- if (rowIndex > -1) {
122
- this._rowsStack[rowIndex] = new Row(targetRow, RowType.Simple, { initialExpand: this._initialExpand });
123
- this._updateVisibleRows();
124
- return true;
118
+ if (rowIndex === -1) {
119
+ return false;
125
120
  }
126
- return false;
121
+ this._rowsStack[rowIndex] = makeRowFactory(targetRow, RowType.Simple);
122
+ this._updateVisibleRows();
123
+ return true;
127
124
  }
128
125
  /**
129
126
  * Update data for specified row
@@ -207,7 +204,7 @@ export class DataController {
207
204
  }
208
205
  toggleRowGroup(rowData) {
209
206
  const row = this.visibleRows.find((visibleRow) => visibleRow.data === rowData);
210
- row.toggleRowExpandStatus();
207
+ row?.toggleRowExpandStatus();
211
208
  this._updateVisibleRows();
212
209
  }
213
210
  finishReorder() {
@@ -216,7 +213,7 @@ export class DataController {
216
213
  let group;
217
214
  this._rowsStack
218
215
  .forEach((row, index) => {
219
- if (row.isGroup && row !== group) {
216
+ if (isGroupRow(row) && row !== group) {
220
217
  group = row;
221
218
  }
222
219
  else {
@@ -234,7 +231,7 @@ export class DataController {
234
231
  }
235
232
  else {
236
233
  rows = rows.map((row) => {
237
- return new Row(row, RowType.Simple, { initialExpand: this._initialExpand });
234
+ return makeRowFactory(row, RowType.Simple);
238
235
  });
239
236
  this._rowsStack = [...rows];
240
237
  }
@@ -245,7 +242,7 @@ export class DataController {
245
242
  }
246
243
  else {
247
244
  rows = rows.map((row) => {
248
- return new Row(row, RowType.Simple, { initialExpand: this._initialExpand });
245
+ return makeRowFactory(row, RowType.Simple);
249
246
  });
250
247
  this._rowsStack = [...this._rowsStack, ...rows];
251
248
  }
@@ -256,7 +253,7 @@ export class DataController {
256
253
  _updateVisibleRows() {
257
254
  this.visibleRows = this._rowsStack
258
255
  .filter((row) => {
259
- return (!row.isChild && !row.isGroupFooter) || row.visible;
256
+ return !isChildTypeRow(row) || row.visible;
260
257
  });
261
258
  }
262
259
  _updateRow(targetRow, trackBy) {
@@ -269,7 +266,7 @@ export class DataController {
269
266
  if (targetIndex !== -1) {
270
267
  const updateTarget = this._rowsStack[targetIndex];
271
268
  const updatedData = { ...updateTarget.data, ...targetRow };
272
- this._rowsStack[targetIndex] = new Row(updatedData, updateTarget.type, {
269
+ this._rowsStack[targetIndex] = makeRowFactory(updatedData, updateTarget.type, {
273
270
  parent: updateTarget.parent,
274
271
  initialExpand: updateTarget.expanded,
275
272
  });
@@ -302,21 +299,17 @@ export class DataController {
302
299
  }
303
300
  const groupRows = [];
304
301
  rows.forEach((row) => {
305
- const mainGroup = this._groupByFn(row);
306
- const mainGroupKey = this._compareByFn(mainGroup);
307
- if (!this._store.has(mainGroupKey)) {
308
- const group = new GroupRow(mainGroup, this._initialExpand);
302
+ const groupData = this._groupByFn(row);
303
+ const groupKey = this._compareByFn(groupData);
304
+ let group = this._store.get(groupKey);
305
+ if (!group) {
306
+ group = makeRowFactory(groupData, RowType.Group, { initialExpand: this._initialExpand });
309
307
  group.index = groupRows.length;
310
308
  groupRows.push(group);
311
- const childRow = new ChildRow(row, group);
312
- this._store.set(mainGroupKey, group);
313
- group.children.push(childRow);
314
- }
315
- else {
316
- const group = this._store.get(mainGroupKey);
317
- const childRow = new ChildRow(row, group);
318
- group.children.push(childRow);
309
+ this._store.set(groupKey, group);
319
310
  }
311
+ const childRow = makeRowFactory(row, RowType.GroupChild, { parent: group });
312
+ group.children.push(childRow);
320
313
  });
321
314
  groupRows.forEach((groupRow) => {
322
315
  const footerIndex = groupRow.children
@@ -328,12 +321,13 @@ export class DataController {
328
321
  });
329
322
  if (footerIndex !== -1) {
330
323
  const footerRow = groupRow.children.splice(footerIndex, footerIndex + 1)[0];
331
- groupRow.children.push(new GroupFooterRow(footerRow.data, groupRow));
324
+ const newRow = makeRowFactory(footerRow.data, RowType.GroupFooter, { parent: groupRow });
325
+ groupRow.children.push(newRow);
332
326
  }
333
327
  });
334
328
  return Array.from(this._store.values())
335
329
  .reduce((acc, item) => {
336
- if (item.isGroup) {
330
+ if (isGroupRow(item)) {
337
331
  acc.push(item, ...item.children);
338
332
  }
339
333
  else {
@@ -343,4 +337,4 @@ export class DataController {
343
337
  }, []);
344
338
  }
345
339
  }
346
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9jbGFzc2VzL2RhdGEtY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQU1sRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBR25ELE1BQU0sT0FBTyxjQUFjO0lBRVIsYUFBYSxHQUFHLElBQUksZUFBZSxDQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLGFBQWEsR0FBRyxJQUFJLE9BQU8sRUFBUyxDQUFDO0lBQ3JDLGtCQUFrQixHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFbEQsTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUFDbkIsVUFBVSxHQUFVLEVBQUUsQ0FBQztJQUN2QixVQUFVLENBQWM7SUFFeEIsVUFBVSxDQUFpQjtJQUMzQixZQUFZLENBUVA7SUFDTCxZQUFZLENBQWlCO0lBQzdCLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFDdEIsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUV0QixnQkFBZ0IsQ0FBVTtJQUUxQixRQUFRLEdBQUcsS0FBSyxD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QzthQUNwQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDcEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2pCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25DLENBQUM7aUJBQU0sQ0FBQztnQkFDTixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pCLENBQUM7WUFFRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNYLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBpc0Z1bmN0aW9uLCBpc09iamVjdCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbmltcG9ydCB7IFJvd1R5cGUgfSBmcm9tICcuLi9lbnVtcy9yb3ctdHlwZS5lbnVtJztcbmltcG9ydCB7IEZzTGlzdFN0YXRlIH0gZnJvbSAnLi4vZW51bXMvc3RhdGUuZW51bSc7XG5pbXBvcnQge1xuICBGc0xpc3RBYnN0cmFjdFJvdyxcbiAgRnNMaXN0R3JvdXBDb25maWcsXG4gIEZzTGlzdFRyYWNrQnlUYXJnZXRSb3dGbixcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9saXN0Y29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSb3cgfSBmcm9tICcuLi9tb2RlbHMvcm93JztcbmltcG9ydCB7IENoaWxkUm93IH0gZnJvbSAnLi4vbW9kZWxzL3Jvdy9jaGlsZC1yb3cnO1xuaW1wb3J0IHsgR3JvdXBGb290ZXJSb3cgfSBmcm9tICcuLi9tb2RlbHMvcm93L2dyb3VwLWZvb3Rlci1yb3cnO1xuaW1wb3J0IHsgR3JvdXBSb3cgfSBmcm9tICcuLi9tb2RlbHMvcm93L2dyb3VwLXJvdyc7XG5cblxuZXhwb3J0IGNsYXNzIERhdGFDb250cm9sbGVyIHtcblxuICBwcml2YXRlIHJlYWRvbmx5IF92aXNpYmxlUm93cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJvd1tdPihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Jvd3NSZW1vdmVkJCA9IG5ldyBTdWJqZWN0PFJvd1tdPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZW1vdGVSb3dzQ2hhbmdlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBfc3RvcmUgPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX3Jvd3NTdGFjazogUm93W10gPSBbXTtcbiAgcHJpdmF0ZSBfb3BlcmF0aW9uOiBGc0xpc3RTdGF0ZTtcblxuICBwcml2YXRlIF9ncm91cEJ5Rm46IChyb3cpID0+IGFueVtdO1xuICBwcml2YXRlIF9mb290ZXJSb3dGbjogKFxuICAgIHJvdzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSxcbiAgICBncm91cDoge1xuICAgICAgW2tleTogc3RyaW5nXTogYW55LFxuICAgICAgY2hpbGRyZW46IHtcbiAgICAgICAgW2tleTogc3RyaW5nXTogYW55XG4gICAgICB9W10sXG4gICAgfVxuICApID0+IGJvb2xlYW47XG4gIHByaXZhdGUgX2NvbXBhcmVCeUZuOiAoZ3JvdXApID0+IGFueTtcbiAgcHJpdmF0ZSBfaW5pdGlhbEV4cGFuZCA9IHRydWU7XG4gIHByaXZhdGUgX2dyb3VwRW5hYmxlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2xvYWRNb3JlRW5hYmxlZDogYm9vbGVhbjtcblxuICBwcml2YXRlIF9oYXNEYXRhID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHB1YmxpYyBnZXQgdmlzaWJsZVJvd3NEYXRhKCkge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVSb3dzLm1hcCgocm93KSA9PiByb3cuZGF0YSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJvd3NTdGFjaygpIHtcbiAgICByZXR1cm4gdGhpcy5fcm93c1N0YWNrLnNsaWNlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGdyb3VwRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JvdXBFbmFibGVkO1xuICB9XG5cbiAgcHVibGljIHNldCBncm91cEVuYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9ncm91cEVuYWJsZWQgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVtb3RlUm93c0NoYW5nZSQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbW90ZVJvd3NDaGFuZ2UkLnBpcGUoXG4gICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJvd3NSZW1vdmVkJCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcm93c1JlbW92ZWQkLnBpcGUoXG4gICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0RhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hhc0RhdGE7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9wZXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlcmF0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCB2aXNpYmxlUm93cyQoKTogT2JzZXJ2YWJsZTxSb3dbXT4ge1xuICAgIHJldHVybiB0aGlzLl92aXNpYmxlUm93cyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0IHZpc2libGVSb3dzKHZhbHVlOiBhbnlbXSkge1xuICAgIHRoaXMuX3Zpc2libGVSb3dzJC5uZXh0KHZhbHVlKTtcbiAgICB0aGlzLl9oYXNEYXRhID0gdGhpcy52aXNpYmxlUm93cy5sZW5ndGggPiAwO1xuICB9XG5cbiAgcHVibGljIGdldCB2aXNpYmxlUm93cygpIHtcbiAgICByZXR1cm4gdGhpcy5fdmlzaWJsZVJvd3MkLmdldFZhbHVlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZpc2libGVSb3dzQ291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZVJvd3MubGVuZ3RoO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNHcm91cHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbXBhcmVCeUZuICYmIHRoaXMuX2dyb3VwQnlGbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVvcmRlckRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvd3NTdGFja1xuICAgICAgLm1hcCgocm93KSA9PiByb3cuZ2V0UmVvcmRlckRhdGEoKSk7XG4gIH1cblxuICBwdWJsaWMgc2V0R3JvdXBDb25maWcoZ3JvdXA6IEZzTGlzdEdyb3VwQ29uZmlnKSB7XG4gICAgaWYgKGdyb3VwKSB7XG4gICAgICB0aGlzLl9ncm91cEJ5Rm4gPSBncm91cC5ncm91cEJ5O1xuICAgICAgdGhpcy5fY29tcGFyZUJ5Rm4gPSBncm91cC5jb21wYXJlQnk7XG4gICAgICB0aGlzLl9mb290ZXJSb3dGbiA9IGdyb3VwLmZvb3RlciB8fCAoKCkgPT4gZmFsc2UpO1xuICAgICAgdGhpcy5faW5pdGlhbEV4cGFuZCA9IGdyb3VwLmluaXRpYWxFeHBhbmQgPz8gdHJ1ZTtcblxuICAgICAgLy8gZ3JvdXAgbW9kZSBlbmFibGVkIGJ5IGRlZmF1bHRcbiAgICAgIHRoaXMuX2dyb3VwRW5hYmxlZCA9IChncm91cC5lbmFibGVkICE9PSB1bmRlZmluZWQpXG4gICAgICAgID8gZ3JvdXAuZW5hYmxlZFxuICAgICAgICA6IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldEFkZGl0aW9uYWxDb25maWdzKGNvbmZpZ3M6IHsgbG9hZE1vcmVFbmFibGVkOiBib29sZWFuIH0pIHtcbiAgICB0aGlzLl9sb2FkTW9yZUVuYWJsZWQgPSBjb25maWdzLmxvYWRNb3JlRW5hYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3dzIHdoYXQgd2FzIHJlY2VpdmVkIGZyb20gZmV0Y2ggZnVuY3Rpb25cbiAgICogQHBhcmFtIHJvd3NcbiAgICovXG4gIHB1YmxpYyBzZXRSb3dzRnJvbVJlc3BvbnNlKHJvd3M6IGFueVtdKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5fb3BlcmF0aW9uID09PSBGc0xpc3RTdGF0ZS5Mb2FkTW9yZSB8fFxuICAgICAgICAodGhpcy5fb3BlcmF0aW9uID09PSBGc0xpc3RTdGF0ZS5QYWdlQ2hhbmdlICYmIHRoaXMuX2xvYWRNb3JlRW5hYmxlZClcbiAgICApIHtcbiAgICAgIHRoaXMuX2V4dGVuZFJvd3NTdGFjayhyb3dzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdXBkYXRlUm93c1N0YWNrKHJvd3MpO1xuICAgIH1cblxuICAgIHRoaXMuX29wZXJhdGlvbiA9IEZzTGlzdFN0YXRlLklkbGU7XG5cbiAgICB0aGlzLl91cGRhdGVWaXNpYmxlUm93cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBjdXJyZW50IG9wZXJhdGlvbiBmb3IgbGlzdCBkYXRhIGZsb3dcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgc2V0T3BlcmF0aW9uKHZhbHVlOiBGc0xpc3RTdGF0ZSkge1xuICAgIHRoaXMuX29wZXJhdGlvbiA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSByb3dzIGZyb20gdmlzaWJsZVxuICAgKi9cbiAgcHVibGljIGNsZWFyUm93cygpIHtcbiAgICB0aGlzLnZpc2libGVSb3dzID0gW107XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSBkYXRhIGZvciBzcGVjaWZpZWQgcm93XG4gICAqIEBwYXJhbSB0YXJnZXRSb3dcbiAgICogQHBhcmFtIHRyYWNrQnlcbiAgICovXG4gIHB1YmxpYyByZXBsYWNlRGF0YShcbiAgICB0YXJnZXRSb3c6IEZzTGlzdEFic3RyYWN0Um93LFxuICAgIHRyYWNrQnk/OiBGc0xpc3RUcmFja0J5VGFyZ2V0Um93Rm4sXG4gICkge1xuICAgIGNvbnN0IHJvd0luZGV4ID0gdGhpcy5fcm93c1N0YWNrLmZpbmRJbmRleCgobGlzdFJvdykgPT4ge1xuICAgICAgcmV0dXJuIHRyYWNrQnkobGlzdFJvdy5kYXRhLCB0YXJnZXRSb3cpO1xuICAgIH0pO1xuXG4gICAgaWYgKHJvd0luZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuX3Jvd3NTdGFja1tyb3dJbmRleF0gPSBuZXcgUm93KFxuICAgICAgICB0YXJnZXRSb3csXG4gICAgICAgIFJvd1R5cGUuU2ltcGxlLFxuICAgICAgICB7IGluaXRpYWxFeHBhbmQ6IHRoaXMuX2luaXRpYWxFeHBhbmQgfSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuX3VwZGF0ZVZpc2libGVSb3dzKCk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiBcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGRhdGEgZm9yIHNwZWNpZmllZCByb3dcbiAgICogQHBhcmFtIHJvd3NcbiAgICogQHBhcmFtIHRyYWNrQnlcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVEYXRhKFxuICAgIHJvd3M6IEZzTGlzdEFic3RyYWN0Um93IHwgRnNMaXN0QWJzdHJhY3RSb3dbXSxcbiAgICB0cmFja0J5PzogRnNMaXN0VHJhY2tCeVRhcmdldFJvd0ZuLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyb3dzKSkge1xuICAgICAgbGV0IHVwZGF0ZVN1Y2Nlc3MgPSBmYWxzZTtcblxuICAgICAgcm93cy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl91cGRhdGVSb3coaXRlbSwgdHJhY2tCeSkpIHtcbiAgICAgICAgICB1cGRhdGVTdWNjZXNzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX3VwZGF0ZVZpc2libGVSb3dzKCk7XG5cbiAgICAgIHJldHVybiB1cGRhdGVTdWNjZXNzO1xuICAgIH0gXG4gICAgY29uc3QgdXBkYXRlZCA9IHRoaXMuX3VwZGF0ZVJvdyhyb3dzLCB0cmFja0J5KTtcblxuICAgIHRoaXMuX3VwZGF0ZVZpc2libGVSb3dzKCk7XG5cbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgZGF0YSBmb3Igc3BlY2lmaWVkIHJvd1xuICAgKiBAcGFyYW0gZGF0YVxuICAgKi9cbiAgcHVibGljIHJlbW92ZURhdGEoXG4gICAgZGF0YTogRnNMaXN0QWJzdHJhY3RSb3cgfCBGc0xpc3RBYnN0cmFjdFJvd1tdIHwgRnNMaXN0VHJhY2tCeVRhcmdldFJvd0ZuLFxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCByZW1vdmVkUm93cyA9IFtdO1xuXG4gICAgY29uc3QgZGVmYXVsdFRyYWNrQnkgPSAocm93LCB0YXJnZXQpID0+IHtcbiAgICAgIHJldHVybiByb3cgPT09IHRhcmdldDtcbiAgICB9O1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIC8vXG4gICAgICBkYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgcmVtb3ZlZFJvd3MucHVzaCguLi50aGlzLl9yZW1vdmVSb3coaXRlbSwgZGVmYXVsdFRyYWNrQnkpKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihkYXRhKSkge1xuICAgICAgcmVtb3ZlZFJvd3MucHVzaCguLi50aGlzLl9yZW1vdmVSb3cobnVsbCwgKGRhdGEgYXMgRnNMaXN0VHJhY2tCeVRhcmdldFJvd0ZuKSkpO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJlbW92ZWRSb3dzLnB1c2goLi4udGhpcy5fcmVtb3ZlUm93KGRhdGEsIGRlZmF1bHRUcmFja0J5KSk7XG4gICAgfVxuXG4gICAgaWYgKHJlbW92ZWRSb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVZpc2libGVSb3dzKCk7XG5cbiAgICAgIHRoaXMuX3Jvd3NSZW1vdmVkJC5uZXh0KHJlbW92ZWRSb3dzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gISFyZW1vdmVkUm93cy5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgc3dhcFJvd3Mocm93MSwgcm93Miwgc2VsZWN0ZWRSb3dzPzogUm93W10sIGlzTXVsdGlwbGVEcmFnID0gZmFsc2UpIHtcbiAgICBjb25zdCByb3dzU3RhY2sgPSB0aGlzLl9yb3dzU3RhY2s7XG4gICAgY29uc3Qgcm93MUdsb2JhbEluZGV4ID0gcm93c1N0YWNrLmluZGV4T2Yocm93MSk7XG4gICAgY29uc3Qgcm93Mkdsb2JhbEluZGV4ID0gcm93c1N0YWNrLmluZGV4T2Yocm93Mik7XG5cbiAgICBjb25zdCB0bXBFbCA9IHJvd3NTdGFja1tyb3cxR2xvYmFsSW5kZXhdO1xuICAgIHJvd3NTdGFja1tyb3cxR2xvYmFsSW5kZXhdID0gcm93c1N0YWNrW3JvdzJHbG9iYWxJbmRleF07XG4gICAgcm93c1N0YWNrW3JvdzJHbG9iYWxJbmRleF0gPSB0bXBFbDtcblxuICAgIGlmIChpc011bHRpcGxlRHJhZyAmJiBBcnJheS5pc0FycmF5KHNlbGVjdGVkUm93cykpIHtcbiAgICAgIGlmICghc2VsZWN0ZWRSb3dzLmluY2x1ZGVzKHJvdzEpKSB7XG4gICAgICAgIHNlbGVjdGVkUm93cyA9IFtyb3cxLCAuLi5zZWxlY3RlZFJvd3NdO1xuICAgICAgfVxuXG4gICAgICBzZWxlY3RlZFJvd3NcbiAgICAgICAgLmZpbHRlcigoc2VsZWN0ZWRSb3cpID0+IHtcbiAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRSb3cgIT09IHJvdzE7XG4gICAgICAgIH0pXG4gICAgICAgIC5mb3JFYWNoKChzZWxlY3RlZFJvdykgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkeCA9IHJvd3NTdGFjay5pbmRleE9mKHNlbGVjdGVkUm93KTtcbiAgICAgICAgICByb3dzU3RhY2suc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBpbmRleFRvSW5zZXJ0QWZ0ZXIgPSByb3dzU3RhY2suaW5kZXhPZih0bXBFbCk7XG5cbiAgICAgIHJvd3NTdGFjay5zcGxpY2UoaW5kZXhUb0luc2VydEFmdGVyLCAxKTtcblxuICAgICAgc2VsZWN0ZWRSb3dzLmZvckVhY2goKHNlbGVjdGVkUm93LCBvZmZzZXQpID0+IHtcbiAgICAgICAgcm93c1N0YWNrLnNwbGljZShpbmRleFRvSW5zZXJ0QWZ0ZXIgKyBvZmZzZXQsIDAsIHNlbGVjdGVkUm93KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX3Jvd3NTdGFjayA9IFsuLi5yb3dzU3RhY2tdO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fZGVzdHJveVJvd3NTdGFjaygpO1xuICAgIHRoaXMuX3N0b3JlLmNsZWFyKCk7XG5cbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlUm93R3JvdXAocm93RGF0YSkge1xuICAgIGNvbnN0IHJvdyA9IHRoaXMudmlzaWJsZVJvd3MuZmluZCgodmlzaWJsZVJvdykgPT4gdmlzaWJsZVJvdy5kYXRhID09PSByb3dEYXRhICk7XG4gICAgcm93LnRvZ2dsZVJvd0V4cGFuZFN0YXR1cygpO1xuXG4gICAgdGhpcy5fdXBkYXRlVmlzaWJsZVJvd3MoKTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5pc2hSZW9yZGVyKCk6IHZvaWQge1xuICAgIC8vIFRPRE8gZml4bWUgcmVtb3ZlIG9yIGltcHJvdmVcbiAgICBpZiAodGhpcy5ncm91cEVuYWJsZWQpIHtcbiAgICAgIGxldCBncm91cDtcbiAgICAgIHRoaXMuX3Jvd3NTdGFja1xuICAgICAgICAuZm9yRWFjaCgocm93LCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChyb3cuaXNHcm91cCAmJiByb3cgIT09IGdyb3VwKSB7XG4gICAgICAgICAgICBncm91cCA9IHJvdztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcm93LmluZGV4ID0gaW5kZXggLSB0aGlzLl9yb3dzU3RhY2suaW5kZXhPZihncm91cCkgLSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlVmlzaWJsZVJvd3MoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVJvd3NTdGFjayhyb3dzKSB7XG4gICAgdGhpcy5fZGVzdHJveVJvd3NTdGFjaygpO1xuXG4gICAgaWYgKHRoaXMuZ3JvdXBFbmFibGVkKSB7XG4gICAgICB0aGlzLl9zdG9yZS5jbGVhcigpO1xuICAgICAgdGhpcy5fcm93c1N0YWNrID0gWy4uLnRoaXMuX2dyb3VwUm93c0J5KHJvd3MpXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm93cyA9IHJvd3MubWFwKChyb3cpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSb3coXG4gICAgICAgICAgcm93LFxuICAgICAgICAgIFJvd1R5cGUuU2ltcGxlLFxuICAgICAgICAgIHsgaW5pdGlhbEV4cGFuZDogdGhpcy5faW5pdGlhbEV4cGFuZCB9LFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9yb3dzU3RhY2sgPSBbLi4ucm93c107XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZXh0ZW5kUm93c1N0YWNrKHJvd3MpIHtcbiAgICBpZiAodGhpcy5ncm91cEVuYWJsZWQpIHtcbiAgICAgIHRoaXMuX3Jvd3NTdGFjayA9IFsuLi50aGlzLl9ncm91cFJvd3NCeShyb3dzKV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvd3MgPSByb3dzLm1hcCgocm93KSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUm93KFxuICAgICAgICAgIHJvdyxcbiAgICAgICAgICBSb3dUeXBlLlNpbXBsZSxcbiAgICAgICAgICB7IGluaXRpYWxFeHBhbmQ6IHRoaXMuX2luaXRpYWxFeHBhbmQgfSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fcm93c1N0YWNrID0gWy4uLnRoaXMuX3Jvd3NTdGFjaywgLi4ucm93c107XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGVzdHJveVJvd3NTdGFjaygpIHtcbiAgICB0aGlzLl9yb3dzU3RhY2suZm9yRWFjaCgocm93KSA9PiByb3cuZGVzdHJveSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVZpc2libGVSb3dzKCkge1xuICAgIHRoaXMudmlzaWJsZVJvd3MgPSB0aGlzLl9yb3dzU3RhY2tcbiAgICAgIC5maWx0ZXIoKHJvdykgPT4ge1xuICAgICAgICByZXR1cm4gKCEocm93IGFzIGFueSkuaXNDaGlsZCAmJiAhcm93LmlzR3JvdXBGb290ZXIpIHx8IHJvdy52aXNpYmxlO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVSb3coXG4gICAgdGFyZ2V0Um93OiBGc0xpc3RBYnN0cmFjdFJvdyxcbiAgICB0cmFja0J5PzogKGxpc3RSb3c6IEZzTGlzdEFic3RyYWN0Um93LCB0YXJnZXRSb3c/OiBGc0xpc3RBYnN0cmFjdFJvdykgPT4gYm9vbGVhbikge1xuXG4gICAgaWYgKHRyYWNrQnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJhY2tCeSA9IChyb3csIHRhcmdldCkgPT4ge1xuICAgICAgICByZXR1cm4gcm93ID09PSB0YXJnZXQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldEluZGV4ID0gdGhpcy5fcm93c1N0YWNrLmZpbmRJbmRleCgobGlzdFJvdykgPT4gdHJhY2tCeShsaXN0Um93LmRhdGEsIHRhcmdldFJvdykpO1xuXG4gICAgaWYgKHRhcmdldEluZGV4ICE9PSAtMSkge1xuICAgICAgY29uc3QgdXBkYXRlVGFyZ2V0ID0gdGhpcy5fcm93c1N0YWNrW3RhcmdldEluZGV4XTtcbiAgICAgIGNvbnN0IHVwZGF0ZWREYXRhID0geyAuLi51cGRhdGVUYXJnZXQuZGF0YSwgLi4udGFyZ2V0Um93IH07XG5cbiAgICAgIHRoaXMuX3Jvd3NTdGFja1t0YXJnZXRJbmRleF0gPSBuZXcgUm93KFxuICAgICAgICB1cGRhdGVkRGF0YSxcbiAgICAgICAgdXBkYXRlVGFyZ2V0LnR5cGUsXG4gICAgICAgIHtcbiAgICAgICAgICBwYXJlbnQ6IHVwZGF0ZVRhcmdldC5wYXJlbnQsXG4gICAgICAgICAgaW5pdGlhbEV4cGFuZDogdXBkYXRlVGFyZ2V0LmV4cGFuZGVkLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSByb3cgZnJvbVxuICAgKiBAcGFyYW0gdGFyZ2V0Um93XG4gICAqIEBwYXJhbSB0cmFja0J5XG4gICAqL1xuICBwcml2YXRlIF9yZW1vdmVSb3coXG4gICAgdGFyZ2V0Um93OiBGc0xpc3RBYnN0cmFjdFJvdyB8IG51bGwsXG4gICAgdHJhY2tCeT86IEZzTGlzdFRyYWNrQnlUYXJnZXRSb3dGbixcbiAgKSB7XG5cbiAgICBjb25zdCByb3dzID0gdGhpcy5fcm93c1N0YWNrO1xuICAgIGNvbnN0IHJlbW92ZWRSb3dzID0gW107XG5cbiAgICByb3dzLmZvckVhY2goKGxpc3RSb3csIGluZGV4KSA9PiB7XG4gICAgICBpZiAodHJhY2tCeShsaXN0Um93LmRhdGEsIHRhcmdldFJvdykpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZFJvdyA9IHJvd3Muc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICByZW1vdmVkUm93cy5wdXNoKHJlbW92ZWRSb3cpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlbW92ZWRSb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0IGV4aXN0aW5nIHJvd3MgYnkgZ3JvdXBzIGFuZCBzdG9yZSB0aGVtIGZvciBmdXR1cmUgdXNlXG4gICAqL1xuICBwcml2YXRlIF9ncm91cFJvd3NCeShyb3dzKSB7XG4gICAgaWYgKCF0aGlzLl9ncm91cEJ5Rm4gfHwgIXRoaXMuX2NvbXBhcmVCeUZuKSB7XG4gICAgICByZXR1cm4gcm93czsgXG4gICAgfVxuXG4gICAgY29uc3QgZ3JvdXBSb3dzOiBHcm91cFJvd1tdID0gW107XG5cbiAgICByb3dzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgY29uc3QgbWFpbkdyb3VwID0gdGhpcy5fZ3JvdXBCeUZuKHJvdyk7XG4gICAgICBjb25zdCBtYWluR3JvdXBLZXkgPSB0aGlzLl9jb21wYXJlQnlGbihtYWluR3JvdXApO1xuXG4gICAgICBpZiAoIXRoaXMuX3N0b3JlLmhhcyhtYWluR3JvdXBLZXkpKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gbmV3IEdyb3VwUm93KFxuICAgICAgICAgIG1haW5Hcm91cCxcbiAgICAgICAgICB0aGlzLl9pbml0aWFsRXhwYW5kLFxuICAgICAgICApO1xuXG4gICAgICAgIGdyb3VwLmluZGV4ID0gZ3JvdXBSb3dzLmxlbmd0aDtcbiAgICAgICAgZ3JvdXBSb3dzLnB1c2goZ3JvdXApO1xuXG4gICAgICAgIGNvbnN0IGNoaWxkUm93ID0gbmV3IENoaWxkUm93KHJvdywgZ3JvdXApO1xuXG4gICAgICAgIHRoaXMuX3N0b3JlLnNldChtYWluR3JvdXBLZXksIGdyb3VwKTtcbiAgICAgICAgZ3JvdXAuY2hpbGRyZW4ucHVzaChjaGlsZFJvdyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuX3N0b3JlLmdldChtYWluR3JvdXBLZXkpO1xuICAgICAgICBjb25zdCBjaGlsZFJvdyA9IG5ldyBDaGlsZFJvdyhyb3csIGdyb3VwKTtcblxuICAgICAgICBncm91cC5jaGlsZHJlbi5wdXNoKGNoaWxkUm93KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGdyb3VwUm93cy5mb3JFYWNoKChncm91cFJvdykgPT4ge1xuICAgICAgY29uc3QgZm9vdGVySW5kZXggPSBncm91cFJvdy5jaGlsZHJlblxuICAgICAgICAuZmluZEluZGV4KChyb3cpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZm9vdGVyUm93Rm4ocm93LmRhdGEsIHtcbiAgICAgICAgICAgIC4uLmdyb3VwUm93LmRhdGEsXG4gICAgICAgICAgICBjaGlsZHJlbjogZ3JvdXBSb3cuY2hpbGRyZW5EYXRhLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgaWYgKGZvb3RlckluZGV4ICE9PSAtMSkge1xuICAgICAgICBjb25zdCBmb290ZXJSb3cgPSBncm91cFJvdy5jaGlsZHJlbi5zcGxpY2UoZm9vdGVySW5kZXgsIGZvb3RlckluZGV4ICsgMSlbMF07XG4gICAgICAgIGdyb3VwUm93LmNoaWxkcmVuLnB1c2gobmV3IEdyb3VwRm9vdGVyUm93KGZvb3RlclJvdy5kYXRhLCBncm91cFJvdykpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5fc3RvcmUudmFsdWVzKCkpXG4gICAgICAucmVkdWNlKChhY2MsIGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uaXNHcm91cCkge1xuICAgICAgICAgIGFjYy5wdXNoKGl0ZW0sIC4uLml0ZW0uY2hpbGRyZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFjYy5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIFtdKTtcbiAgfVxufVxuIl19
340
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9jbGFzc2VzL2RhdGEtY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsY0FBYyxFQUFPLGNBQWMsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFNaEYsTUFBTSxPQUFPLGNBQWM7SUFFUixhQUFhLEdBQUcsSUFBSSxlQUFlLENBQVEsRUFBRSxDQUFDLENBQUM7SUFDL0MsYUFBYSxHQUFHLElBQUksT0FBTyxFQUFTLENBQUM7SUFDckMsa0JBQWtCLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUVsRCxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNuQixVQUFVLEdBQVUsRUFBRSxDQUFDO0lBQ3ZCLFVBQVUsQ0FBYztJQUV4QixVQUFVLENBQWlCO0lBQzNCLFlBQVksQ0FRUDtJQUNMLFlBQVksQ0FBaUI7SUFDN0IsY0FBYyxHQUFHLElBQUksQ0FBQztJQUN0QixhQUFhLEdBQUcsS0FBSyxDQUFDO0lBRXRCLGdCQUFnQixDQUFVO0lBRTFCLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFFUixTQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUVqRCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFB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dCI6WyJpbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgaXNGdW5jdGlvbiwgaXNPYmplY3QgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5pbXBvcnQgeyBSb3dUeXBlIH0gZnJvbSAnLi4vZW51bXMvcm93LXR5cGUuZW51bSc7XG5pbXBvcnQgeyBGc0xpc3RTdGF0ZSB9IGZyb20gJy4uL2VudW1zL3N0YXRlLmVudW0nO1xuaW1wb3J0IHsgRnNMaXN0QWJzdHJhY3RSb3csIEZzTGlzdEdyb3VwQ29uZmlnLCBGc0xpc3RUcmFja0J5VGFyZ2V0Um93Rm4sIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9saXN0Y29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBtYWtlUm93RmFjdG9yeSwgUm93LCBpc0NoaWxkVHlwZVJvdywgaXNHcm91cFJvdyB9IGZyb20gJy4uL21vZGVscy9yb3cnO1xuaW1wb3J0IHsgSUNoaWxkUm93IH0gZnJvbSAnLi4vbW9kZWxzL3Jvdy9jaGlsZC1yb3cnO1xuaW1wb3J0IHsgSUdyb3VwRm9vdGVyUm93IH0gZnJvbSAnLi4vbW9kZWxzL3Jvdy9ncm91cC1mb290ZXItcm93JztcbmltcG9ydCB7IElHcm91cFJvdyB9IGZyb20gJy4uL21vZGVscy9yb3cvZ3JvdXAtcm93JztcblxuXG5leHBvcnQgY2xhc3MgRGF0YUNvbnRyb2xsZXIge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Zpc2libGVSb3dzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Um93W10+KFtdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcm93c1JlbW92ZWQkID0gbmV3IFN1YmplY3Q8Um93W10+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3JlbW90ZVJvd3NDaGFuZ2UkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIF9zdG9yZSA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBfcm93c1N0YWNrOiBSb3dbXSA9IFtdO1xuICBwcml2YXRlIF9vcGVyYXRpb246IEZzTGlzdFN0YXRlO1xuXG4gIHByaXZhdGUgX2dyb3VwQnlGbjogKHJvdykgPT4gYW55W107XG4gIHByaXZhdGUgX2Zvb3RlclJvd0ZuOiAoXG4gICAgcm93OiB7IFtrZXk6IHN0cmluZ106IGFueSB9LFxuICAgIGdyb3VwOiB7XG4gICAgICBba2V5OiBzdHJpbmddOiBhbnksXG4gICAgICBjaGlsZHJlbjoge1xuICAgICAgICBba2V5OiBzdHJpbmddOiBhbnlcbiAgICAgIH1bXSxcbiAgICB9XG4gICkgPT4gYm9vbGVhbjtcbiAgcHJpdmF0ZSBfY29tcGFyZUJ5Rm46IChncm91cCkgPT4gYW55O1xuICBwcml2YXRlIF9pbml0aWFsRXhwYW5kID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfZ3JvdXBFbmFibGVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfbG9hZE1vcmVFbmFibGVkOiBib29sZWFuO1xuXG4gIHByaXZhdGUgX2hhc0RhdGEgPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHVibGljIGdldCB2aXNpYmxlUm93c0RhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZVJvd3MubWFwKChyb3cpID0+IHJvdy5kYXRhKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcm93c1N0YWNrKCkge1xuICAgIHJldHVybiB0aGlzLl9yb3dzU3RhY2suc2xpY2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZ3JvdXBFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9ncm91cEVuYWJsZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGdyb3VwRW5hYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2dyb3VwRW5hYmxlZCA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCByZW1vdGVSb3dzQ2hhbmdlJCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVtb3RlUm93c0NoYW5nZSQucGlwZShcbiAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcm93c1JlbW92ZWQkKCkge1xuICAgIHJldHVybiB0aGlzLl9yb3dzUmVtb3ZlZCQucGlwZShcbiAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5faGFzRGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb3BlcmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9vcGVyYXRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZpc2libGVSb3dzJCgpOiBPYnNlcnZhYmxlPFJvd1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuX3Zpc2libGVSb3dzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmlzaWJsZVJvd3ModmFsdWU6IGFueVtdKSB7XG4gICAgdGhpcy5fdmlzaWJsZVJvd3MkLm5leHQodmFsdWUpO1xuICAgIHRoaXMuX2hhc0RhdGEgPSB0aGlzLnZpc2libGVSb3dzLmxlbmd0aCA+IDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZpc2libGVSb3dzKCkge1xuICAgIHJldHVybiB0aGlzLl92aXNpYmxlUm93cyQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmlzaWJsZVJvd3NDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlUm93cy5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0dyb3VwcygpIHtcbiAgICByZXR1cm4gdGhpcy5fY29tcGFyZUJ5Rm4gJiYgdGhpcy5fZ3JvdXBCeUZuO1xuICB9XG5cbiAgcHVibGljIGdldCByZW9yZGVyRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcm93c1N0YWNrXG4gICAgICAubWFwKChyb3cpID0+IHJvdy5yZW9yZGVyRGF0YSgpKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRHcm91cENvbmZpZyhncm91cDogRnNMaXN0R3JvdXBDb25maWcpIHtcbiAgICBpZiAoZ3JvdXApIHtcbiAgICAgIHRoaXMuX2dyb3VwQnlGbiA9IGdyb3VwLmdyb3VwQnk7XG4gICAgICB0aGlzLl9jb21wYXJlQnlGbiA9IGdyb3VwLmNvbXBhcmVCeTtcbiAgICAgIHRoaXMuX2Zvb3RlclJvd0ZuID0gZ3JvdXAuZm9vdGVyIHx8ICgoKSA9PiBmYWxzZSk7XG4gICAgICB0aGlzLl9pbml0aWFsRXhwYW5kID0gZ3JvdXAuaW5pdGlhbEV4cGFuZCA/PyB0cnVlO1xuXG4gICAgICAvLyBncm91cCBtb2RlIGVuYWJsZWQgYnkgZGVmYXVsdFxuICAgICAgdGhpcy5fZ3JvdXBFbmFibGVkID0gKGdyb3VwLmVuYWJsZWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgPyBncm91cC5lbmFibGVkXG4gICAgICAgIDogdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0QWRkaXRpb25hbENvbmZpZ3MoY29uZmlnczogeyBsb2FkTW9yZUVuYWJsZWQ6IGJvb2xlYW4gfSkge1xuICAgIHRoaXMuX2xvYWRNb3JlRW5hYmxlZCA9IGNvbmZpZ3MubG9hZE1vcmVFbmFibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvd3Mgd2hhdCB3YXMgcmVjZWl2ZWQgZnJvbSBmZXRjaCBmdW5jdGlvblxuICAgKiBAcGFyYW0gcm93c1xuICAgKi9cbiAgcHVibGljIHNldFJvd3NGcm9tUmVzcG9uc2Uocm93czogYW55W10pIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLl9vcGVyYXRpb24gPT09IEZzTGlzdFN0YXRlLkxvYWRNb3JlIHx8XG4gICAgICAgICh0aGlzLl9vcGVyYXRpb24gPT09IEZzTGlzdFN0YXRlLlBhZ2VDaGFuZ2UgJiYgdGhpcy5fbG9hZE1vcmVFbmFibGVkKVxuICAgICkge1xuICAgICAgdGhpcy5fZXh0ZW5kUm93c1N0YWNrKHJvd3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl91cGRhdGVSb3dzU3RhY2socm93cyk7XG4gICAgfVxuXG4gICAgdGhpcy5fb3BlcmF0aW9uID0gRnNMaXN0U3RhdGUuSWRsZTtcblxuICAgIHRoaXMuX3VwZGF0ZVZpc2libGVSb3dzKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGN1cnJlbnQgb3BlcmF0aW9uIGZvciBsaXN0IGRhdGEgZmxvd1xuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHB1YmxpYyBzZXRPcGVyYXRpb24odmFsdWU6IEZzTGlzdFN0YXRlKSB7XG4gICAgdGhpcy5fb3BlcmF0aW9uID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHJvd3MgZnJvbSB2aXNpYmxlXG4gICAqL1xuICBwdWJsaWMgY2xlYXJSb3dzKCkge1xuICAgIHRoaXMudmlzaWJsZVJvd3MgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIGRhdGEgZm9yIHNwZWNpZmllZCByb3dcbiAgICogQHBhcmFtIHRhcmdldFJvd1xuICAgKiBAcGFyYW0gdHJhY2tCeVxuICAgKi9cbiAgcHVibGljIHJlcGxhY2VEYXRhKFxuICAgIHRhcmdldFJvdzogRnNMaXN0QWJzdHJhY3RSb3csXG4gICAgdHJhY2tCeTogRnNMaXN0VHJhY2tCeVRhcmdldFJvd0ZuLFxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCByb3dJbmRleCA9IHRoaXMuX3Jvd3NTdGFjay5maW5kSW5kZXgoKGxpc3RSb3cpID0+IHtcbiAgICAgIHJldHVybiB0cmFja0J5KGxpc3RSb3cuZGF0YSwgdGFyZ2V0Um93KTtcbiAgICB9KTtcblxuICAgIGlmIChyb3dJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9yb3dzU3RhY2tbcm93SW5kZXhdID0gbWFrZVJvd0ZhY3RvcnkodGFyZ2V0Um93LCBSb3dUeXBlLlNpbXBsZSk7XG4gICAgdGhpcy5fdXBkYXRlVmlzaWJsZVJvd3MoKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBkYXRhIGZvciBzcGVjaWZpZWQgcm93XG4gICAqIEBwYXJhbSByb3dzXG4gICAqIEBwYXJhbSB0cmFja0J5XG4gICAqL1xuICBwdWJsaWMgdXBkYXRlRGF0YShcbiAgICByb3dzOiBGc0xpc3RBYnN0cmFjdFJvdyB8IEZzTGlzdEFic3RyYWN0Um93W10sXG4gICAgdHJhY2tCeT86IEZzTGlzdFRyYWNrQnlUYXJnZXRSb3dGbixcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocm93cykpIHtcbiAgICAgIGxldCB1cGRhdGVTdWNjZXNzID0gZmFsc2U7XG5cbiAgICAgIHJvd3MuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fdXBkYXRlUm93KGl0ZW0sIHRyYWNrQnkpKSB7XG4gICAgICAgICAgdXBkYXRlU3VjY2VzcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl91cGRhdGVWaXNpYmxlUm93cygpO1xuXG4gICAgICByZXR1cm4gdXBkYXRlU3VjY2VzcztcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlZCA9IHRoaXMuX3VwZGF0ZVJvdyhyb3dzLCB0cmFja0J5KTtcblxuICAgIHRoaXMuX3VwZGF0ZVZpc2libGVSb3dzKCk7XG5cbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgZGF0YSBmb3Igc3BlY2lmaWVkIHJvd1xuICAgKiBAcGFyYW0gZGF0YVxuICAgKi9cbiAgcHVibGljIHJlbW92ZURhdGEoXG4gICAgZGF0YTogRnNMaXN0QWJzdHJhY3RSb3cgfCBGc0xpc3RBYnN0cmFjdFJvd1tdIHwgRnNMaXN0VHJhY2tCeVRhcmdldFJvd0ZuLFxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCByZW1vdmVkUm93cyA9IFtdO1xuXG4gICAgY29uc3QgZGVmYXVsdFRyYWNrQnkgPSAocm93LCB0YXJnZXQpID0+IHtcbiAgICAgIHJldHVybiByb3cgPT09IHRhcmdldDtcbiAgICB9O1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIC8vXG4gICAgICBkYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgcmVtb3ZlZFJvd3MucHVzaCguLi50aGlzLl9yZW1vdmVSb3coaXRlbSwgZGVmYXVsdFRyYWNrQnkpKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihkYXRhKSkge1xuICAgICAgcmVtb3ZlZFJvd3MucHVzaCguLi50aGlzLl9yZW1vdmVSb3cobnVsbCwgKGRhdGEgYXMgRnNMaXN0VHJhY2tCeVRhcmdldFJvd0ZuKSkpO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJlbW92ZWRSb3dzLnB1c2goLi4udGhpcy5fcmVtb3ZlUm93KGRhdGEsIGRlZmF1bHRUcmFja0J5KSk7XG4gICAgfVxuXG4gICAgaWYgKHJlbW92ZWRSb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVZpc2libGVSb3dzKCk7XG5cbiAgICAgIHRoaXMuX3Jvd3NSZW1vdmVkJC5uZXh0KHJlbW92ZWRSb3dzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gISFyZW1vdmVkUm93cy5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgc3dhcFJvd3Mocm93MSwgcm93Miwgc2VsZWN0ZWRSb3dzPzogUm93W10sIGlzTXVsdGlwbGVEcmFnID0gZmFsc2UpIHtcbiAgICBjb25zdCByb3dzU3RhY2sgPSB0aGlzLl9yb3dzU3RhY2s7XG4gICAgY29uc3Qgcm93MUdsb2JhbEluZGV4ID0gcm93c1N0YWNrLmluZGV4T2Yocm93MSk7XG4gICAgY29uc3Qgcm93Mkdsb2JhbEluZGV4ID0gcm93c1N0YWNrLmluZGV4T2Yocm93Mik7XG5cbiAgICBjb25zdCB0bXBFbCA9IHJvd3NTdGFja1tyb3cxR2xvYmFsSW5kZXhdO1xuICAgIHJvd3NTdGFja1tyb3cxR2xvYmFsSW5kZXhdID0gcm93c1N0YWNrW3JvdzJHbG9iYWxJbmRleF07XG4gICAgcm93c1N0YWNrW3JvdzJHbG9iYWxJbmRleF0gPSB0bXBFbDtcblxuICAgIGlmIChpc011bHRpcGxlRHJhZyAmJiBBcnJheS5pc0FycmF5KHNlbGVjdGVkUm93cykpIHtcbiAgICAgIGlmICghc2VsZWN0ZWRSb3dzLmluY2x1ZGVzKHJvdzEpKSB7XG4gICAgICAgIHNlbGVjdGVkUm93cyA9IFtyb3cxLCAuLi5zZWxlY3RlZFJvd3NdO1xuICAgICAgfVxuXG4gICAgICBzZWxlY3RlZFJvd3NcbiAgICAgICAgLmZpbHRlcigoc2VsZWN0ZWRSb3cpID0+IHtcbiAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRSb3cgIT09IHJvdzE7XG4gICAgICAgIH0pXG4gICAgICAgIC5mb3JFYWNoKChzZWxlY3RlZFJvdykgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkeCA9IHJvd3NTdGFjay5pbmRleE9mKHNlbGVjdGVkUm93KTtcbiAgICAgICAgICByb3dzU3RhY2suc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBpbmRleFRvSW5zZXJ0QWZ0ZXIgPSByb3dzU3RhY2suaW5kZXhPZih0bXBFbCk7XG5cbiAgICAgIHJvd3NTdGFjay5zcGxpY2UoaW5kZXhUb0luc2VydEFmdGVyLCAxKTtcblxuICAgICAgc2VsZWN0ZWRSb3dzLmZvckVhY2goKHNlbGVjdGVkUm93LCBvZmZzZXQpID0+IHtcbiAgICAgICAgcm93c1N0YWNrLnNwbGljZShpbmRleFRvSW5zZXJ0QWZ0ZXIgKyBvZmZzZXQsIDAsIHNlbGVjdGVkUm93KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX3Jvd3NTdGFjayA9IFsuLi5yb3dzU3RhY2tdO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fZGVzdHJveVJvd3NTdGFjaygpO1xuICAgIHRoaXMuX3N0b3JlLmNsZWFyKCk7XG5cbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlUm93R3JvdXAocm93RGF0YSkge1xuICAgIGNvbnN0IHJvdzogSUdyb3VwUm93ID0gdGhpcy52aXNpYmxlUm93cy5maW5kKCh2aXNpYmxlUm93KSA9PiB2aXNpYmxlUm93LmRhdGEgPT09IHJvd0RhdGEgKTtcbiAgICByb3c/LnRvZ2dsZVJvd0V4cGFuZFN0YXR1cygpO1xuXG4gICAgdGhpcy5fdXBkYXRlVmlzaWJsZVJvd3MoKTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5pc2hSZW9yZGVyKCk6IHZvaWQge1xuICAgIC8vIFRPRE8gZml4bWUgcmVtb3ZlIG9yIGltcHJvdmVcbiAgICBpZiAodGhpcy5ncm91cEVuYWJsZWQpIHtcbiAgICAgIGxldCBncm91cDogSUdyb3VwUm93O1xuXG4gICAgICB0aGlzLl9yb3dzU3RhY2tcbiAgICAgICAgLmZvckVhY2goKHJvdywgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoaXNHcm91cFJvdyhyb3cpICYmIHJvdyAhPT0gZ3JvdXApIHtcbiAgICAgICAgICAgIGdyb3VwID0gcm93O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb3cuaW5kZXggPSBpbmRleCAtIHRoaXMuX3Jvd3NTdGFjay5pbmRleE9mKGdyb3VwKSAtIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVWaXNpYmxlUm93cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlUm93c1N0YWNrKHJvd3MpIHtcbiAgICB0aGlzLl9kZXN0cm95Um93c1N0YWNrKCk7XG5cbiAgICBpZiAodGhpcy5ncm91cEVuYWJsZWQpIHtcbiAgICAgIHRoaXMuX3N0b3JlLmNsZWFyKCk7XG4gICAgICB0aGlzLl9yb3dzU3RhY2sgPSBbLi4udGhpcy5fZ3JvdXBSb3dzQnkocm93cyldO1xuICAgIH0gZWxzZSB7XG4gICAgICByb3dzID0gcm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICByZXR1cm4gbWFrZVJvd0ZhY3Rvcnkocm93LCBSb3dUeXBlLlNpbXBsZSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3Jvd3NTdGFjayA9IFsuLi5yb3dzXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9leHRlbmRSb3dzU3RhY2socm93cykge1xuICAgIGlmICh0aGlzLmdyb3VwRW5hYmxlZCkge1xuICAgICAgdGhpcy5fcm93c1N0YWNrID0gWy4uLnRoaXMuX2dyb3VwUm93c0J5KHJvd3MpXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm93cyA9IHJvd3MubWFwKChyb3cpID0+IHtcbiAgICAgICAgcmV0dXJuIG1ha2VSb3dGYWN0b3J5KHJvdywgUm93VHlwZS5TaW1wbGUpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9yb3dzU3RhY2sgPSBbLi4udGhpcy5fcm93c1N0YWNrLCAuLi5yb3dzXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kZXN0cm95Um93c1N0YWNrKCkge1xuICAgIHRoaXMuX3Jvd3NTdGFjay5mb3JFYWNoKChyb3cpID0+IHJvdy5kZXN0cm95KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlVmlzaWJsZVJvd3MoKSB7XG4gICAgdGhpcy52aXNpYmxlUm93cyA9IHRoaXMuX3Jvd3NTdGFja1xuICAgICAgLmZpbHRlcigocm93OiBSb3cpID0+IHtcbiAgICAgICAgcmV0dXJuICFpc0NoaWxkVHlwZVJvdyhyb3cpIHx8IHJvdy52aXNpYmxlO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVSb3coXG4gICAgdGFyZ2V0Um93OiBGc0xpc3RBYnN0cmFjdFJvdyxcbiAgICB0cmFja0J5PzogKGxpc3RSb3c6IEZzTGlzdEFic3RyYWN0Um93LCB0YXJnZXRSb3c/OiBGc0xpc3RBYnN0cmFjdFJvdykgPT4gYm9vbGVhbikge1xuXG4gICAgaWYgKHRyYWNrQnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJhY2tCeSA9IChyb3csIHRhcmdldCkgPT4ge1xuICAgICAgICByZXR1cm4gcm93ID09PSB0YXJnZXQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldEluZGV4ID0gdGhpcy5fcm93c1N0YWNrLmZpbmRJbmRleCgobGlzdFJvdykgPT4gdHJhY2tCeShsaXN0Um93LmRhdGEsIHRhcmdldFJvdykpO1xuXG4gICAgaWYgKHRhcmdldEluZGV4ICE9PSAtMSkge1xuICAgICAgY29uc3QgdXBkYXRlVGFyZ2V0ID0gdGhpcy5fcm93c1N0YWNrW3RhcmdldEluZGV4XTtcbiAgICAgIGNvbnN0IHVwZGF0ZWREYXRhID0geyAuLi51cGRhdGVUYXJnZXQuZGF0YSwgLi4udGFyZ2V0Um93IH07XG5cbiAgICAgIHRoaXMuX3Jvd3NTdGFja1t0YXJnZXRJbmRleF0gPSBtYWtlUm93RmFjdG9yeShcbiAgICAgICAgdXBkYXRlZERhdGEsXG4gICAgICAgIHVwZGF0ZVRhcmdldC50eXBlLFxuICAgICAgICB7XG4gICAgICAgICAgcGFyZW50OiAodXBkYXRlVGFyZ2V0IGFzIElDaGlsZFJvdykucGFyZW50LFxuICAgICAgICAgIGluaXRpYWxFeHBhbmQ6ICh1cGRhdGVUYXJnZXQgYXMgSUdyb3VwUm93KS5leHBhbmRlZCxcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgcm93IGZyb21cbiAgICogQHBhcmFtIHRhcmdldFJvd1xuICAgKiBAcGFyYW0gdHJhY2tCeVxuICAgKi9cbiAgcHJpdmF0ZSBfcmVtb3ZlUm93KFxuICAgIHRhcmdldFJvdzogRnNMaXN0QWJzdHJhY3RSb3cgfCBudWxsLFxuICAgIHRyYWNrQnk/OiBGc0xpc3RUcmFja0J5VGFyZ2V0Um93Rm4sXG4gICkge1xuXG4gICAgY29uc3Qgcm93cyA9IHRoaXMuX3Jvd3NTdGFjaztcbiAgICBjb25zdCByZW1vdmVkUm93cyA9IFtdO1xuXG4gICAgcm93cy5mb3JFYWNoKChsaXN0Um93LCBpbmRleCkgPT4ge1xuICAgICAgaWYgKHRyYWNrQnkobGlzdFJvdy5kYXRhLCB0YXJnZXRSb3cpKSB7XG4gICAgICAgIGNvbnN0IHJlbW92ZWRSb3cgPSByb3dzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgcmVtb3ZlZFJvd3MucHVzaChyZW1vdmVkUm93KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZW1vdmVkUm93cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCBleGlzdGluZyByb3dzIGJ5IGdyb3VwcyBhbmQgc3RvcmUgdGhlbSBmb3IgZnV0dXJlIHVzZVxuICAgKi9cbiAgcHJpdmF0ZSBfZ3JvdXBSb3dzQnkocm93cykge1xuICAgIGlmICghdGhpcy5fZ3JvdXBCeUZuIHx8ICF0aGlzLl9jb21wYXJlQnlGbikge1xuICAgICAgcmV0dXJuIHJvd3M7XG4gICAgfVxuXG4gICAgY29uc3QgZ3JvdXBSb3dzOiBJR3JvdXBSb3dbXSA9IFtdO1xuXG4gICAgcm93cy5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwRGF0YSA9IHRoaXMuX2dyb3VwQnlGbihyb3cpO1xuICAgICAgY29uc3QgZ3JvdXBLZXkgPSB0aGlzLl9jb21wYXJlQnlGbihncm91cERhdGEpO1xuXG4gICAgICBsZXQgZ3JvdXA6IElHcm91cFJvdyA9IHRoaXMuX3N0b3JlLmdldChncm91cEtleSk7XG5cbiAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgZ3JvdXAgPSBtYWtlUm93RmFjdG9yeShcbiAgICAgICAgICBncm91cERhdGEsXG4gICAgICAgICAgUm93VHlwZS5Hcm91cCxcbiAgICAgICAgICB7IGluaXRpYWxFeHBhbmQ6IHRoaXMuX2luaXRpYWxFeHBhbmQgfSxcbiAgICAgICAgKSBhcyBJR3JvdXBSb3c7XG5cbiAgICAgICAgZ3JvdXAuaW5kZXggPSBncm91cFJvd3MubGVuZ3RoO1xuICAgICAgICBncm91cFJvd3MucHVzaChncm91cCk7XG5cbiAgICAgICAgdGhpcy5fc3RvcmUuc2V0KGdyb3VwS2V5LCBncm91cCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoaWxkUm93ID0gbWFrZVJvd0ZhY3Rvcnkocm93LCBSb3dUeXBlLkdyb3VwQ2hpbGQsIHsgcGFyZW50OiBncm91cCB9KSBhcyBJQ2hpbGRSb3c7XG4gICAgICBncm91cC5jaGlsZHJlbi5wdXNoKGNoaWxkUm93KTtcbiAgICB9KTtcblxuICAgIGdyb3VwUm93cy5mb3JFYWNoKChncm91cFJvdykgPT4ge1xuICAgICAgY29uc3QgZm9vdGVySW5kZXggPSBncm91cFJvdy5jaGlsZHJlblxuICAgICAgICAuZmluZEluZGV4KChyb3cpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZm9vdGVyUm93Rm4ocm93LmRhdGEsIHtcbiAgICAgICAgICAgIC4uLmdyb3VwUm93LmRhdGEsXG4gICAgICAgICAgICBjaGlsZHJlbjogZ3JvdXBSb3cuY2hpbGRyZW5EYXRhLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgaWYgKGZvb3RlckluZGV4ICE9PSAtMSkge1xuICAgICAgICBjb25zdCBmb290ZXJSb3cgPSBncm91cFJvdy5jaGlsZHJlbi5zcGxpY2UoZm9vdGVySW5kZXgsIGZvb3RlckluZGV4ICsgMSlbMF07XG4gICAgICAgIGNvbnN0IG5ld1JvdyA9IG1ha2VSb3dGYWN0b3J5KGZvb3RlclJvdy5kYXRhLCBSb3dUeXBlLkdyb3VwRm9vdGVyLCB7IHBhcmVudDogZ3JvdXBSb3d9KTtcbiAgICAgICAgZ3JvdXBSb3cuY2hpbGRyZW4ucHVzaChuZXdSb3cgYXMgSUdyb3VwRm9vdGVyUm93KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX3N0b3JlLnZhbHVlcygpKVxuICAgICAgLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XG4gICAgICAgIGlmIChpc0dyb3VwUm93KGl0ZW0pKSB7XG4gICAgICAgICAgYWNjLnB1c2goaXRlbSwgLi4uaXRlbS5jaGlsZHJlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWNjLnB1c2goaXRlbSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwgW10pO1xuICB9XG59XG4iXX0=