@firestitch/list 12.20.1 → 13.0.1

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 (117) hide show
  1. package/app/classes/list-controller.d.ts +33 -28
  2. package/app/components/body/row/row.component.d.ts +2 -0
  3. package/app/components/list/list.component.d.ts +2 -0
  4. package/app/interfaces/listconfig.interface.d.ts +2 -1
  5. package/app/models/row.d.ts +7 -3
  6. package/esm2020/app/classes/data-controller.mjs +367 -0
  7. package/esm2020/app/classes/external-params-controller.mjs +147 -0
  8. package/esm2020/app/classes/list-controller.mjs +752 -0
  9. package/{esm2015/app/classes/pagination-controller.js → esm2020/app/classes/pagination-controller.mjs} +2 -3
  10. package/{esm2015/app/classes/persistance-controller.js → esm2020/app/classes/persistance-controller.mjs} +4 -4
  11. package/esm2020/app/classes/reorder-controller.mjs +182 -0
  12. package/esm2020/app/classes/selection-controller.mjs +468 -0
  13. package/esm2020/app/components/body/body.component.mjs +64 -0
  14. package/esm2020/app/components/body/row/actions/actions.component.mjs +97 -0
  15. package/esm2020/app/components/body/row/cell/cell.component.mjs +107 -0
  16. package/esm2020/app/components/body/row/inline-action/inline-action.component.mjs +33 -0
  17. package/esm2020/app/components/body/row/menu-action/menu-action.component.mjs +46 -0
  18. package/esm2020/app/components/body/row/row.component.mjs +321 -0
  19. package/esm2020/app/components/customize-cols/customize-cols.component.mjs +68 -0
  20. package/esm2020/app/components/footer/footer-row/footer-cell/footer-cell.component.mjs +16 -0
  21. package/esm2020/app/components/footer/footer-row/footer-row.component.mjs +28 -0
  22. package/esm2020/app/components/footer/footer.component.mjs +31 -0
  23. package/esm2020/app/components/head/head-cell/head-cell.component.mjs +29 -0
  24. package/esm2020/app/components/head/head.component.mjs +103 -0
  25. package/esm2020/app/components/list/list.component.mjs +388 -0
  26. package/esm2020/app/components/loader/loader.component.mjs +40 -0
  27. package/esm2020/app/components/manage-saved-filters/manage-saved-filters.component.mjs +76 -0
  28. package/esm2020/app/components/pagination/pagination.component.mjs +37 -0
  29. package/esm2020/app/components/saved-filters/saved-filters.component.mjs +29 -0
  30. package/esm2020/app/components/status/status.component.mjs +66 -0
  31. package/{esm2015/app/directives/cell/cell.directive.js → esm2020/app/directives/cell/cell.directive.mjs} +4 -4
  32. package/{esm2015/app/directives/column/column.directive.js → esm2020/app/directives/column/column.directive.mjs} +4 -4
  33. package/{esm2015/app/directives/content/content.directive.js → esm2020/app/directives/content/content.directive.mjs} +4 -4
  34. package/{esm2015/app/directives/content-init/content-init.directive.js → esm2020/app/directives/content-init/content-init.directive.mjs} +4 -4
  35. package/esm2020/app/directives/draggable-list/draggable-list.directive.mjs +328 -0
  36. package/esm2020/app/directives/draggable-row/draggable-row.directive.mjs +78 -0
  37. package/{esm2015/app/directives/empty-state/empty-state.directive.js → esm2020/app/directives/empty-state/empty-state.directive.mjs} +4 -4
  38. package/{esm2015/app/directives/footer/footer.directive.js → esm2020/app/directives/footer/footer.directive.mjs} +4 -4
  39. package/{esm2015/app/directives/group-expand-trigger/group-expand-trigger.directive.js → esm2020/app/directives/group-expand-trigger/group-expand-trigger.directive.mjs} +4 -4
  40. package/{esm2015/app/directives/group-footer/group-footer.directive.js → esm2020/app/directives/group-footer/group-footer.directive.mjs} +4 -4
  41. package/{esm2015/app/directives/group-header/group-header.directive.js → esm2020/app/directives/group-header/group-header.directive.mjs} +4 -4
  42. package/{esm2015/app/directives/header/header.directive.js → esm2020/app/directives/header/header.directive.mjs} +4 -4
  43. package/{esm2015/app/directives/heading/heading.directive.js → esm2020/app/directives/heading/heading.directive.mjs} +4 -4
  44. package/{esm2015/app/directives/heading-container/heading-container.directive.js → esm2020/app/directives/heading-container/heading-container.directive.mjs} +4 -4
  45. package/{esm2015/app/directives/subheading/subheading.directive.js → esm2020/app/directives/subheading/subheading.directive.mjs} +4 -4
  46. package/{esm2015/app/fs-list.module.js → esm2020/app/fs-list.module.mjs} +5 -5
  47. package/esm2020/app/interfaces/listconfig.interface.mjs +2 -0
  48. package/{esm2015/app/interfaces/pagination.interface.js → esm2020/app/interfaces/pagination.interface.mjs} +1 -1
  49. package/esm2020/app/models/row-action.model.mjs +90 -0
  50. package/esm2020/app/models/row.mjs +89 -0
  51. package/{esm2015/app/pipes/action-label.js → esm2020/app/pipes/action-label.mjs} +4 -4
  52. package/{esm2015/app/services/group-expand-notifier.service.js → esm2020/app/services/group-expand-notifier.service.mjs} +4 -4
  53. package/fesm2015/{firestitch-list.js → firestitch-list.mjs} +2716 -2755
  54. package/fesm2015/firestitch-list.mjs.map +1 -0
  55. package/fesm2020/firestitch-list.mjs +5844 -0
  56. package/fesm2020/firestitch-list.mjs.map +1 -0
  57. package/package.json +20 -7
  58. package/bundles/firestitch-list.umd.js +0 -7147
  59. package/bundles/firestitch-list.umd.js.map +0 -1
  60. package/esm2015/app/classes/data-controller.js +0 -365
  61. package/esm2015/app/classes/external-params-controller.js +0 -147
  62. package/esm2015/app/classes/list-controller.js +0 -743
  63. package/esm2015/app/classes/reorder-controller.js +0 -183
  64. package/esm2015/app/classes/selection-controller.js +0 -468
  65. package/esm2015/app/components/body/body.component.js +0 -69
  66. package/esm2015/app/components/body/row/actions/actions.component.js +0 -99
  67. package/esm2015/app/components/body/row/cell/cell.component.js +0 -113
  68. package/esm2015/app/components/body/row/inline-action/inline-action.component.js +0 -37
  69. package/esm2015/app/components/body/row/menu-action/menu-action.component.js +0 -50
  70. package/esm2015/app/components/body/row/row.component.js +0 -315
  71. package/esm2015/app/components/customize-cols/customize-cols.component.js +0 -72
  72. package/esm2015/app/components/footer/footer-row/footer-cell/footer-cell.component.js +0 -20
  73. package/esm2015/app/components/footer/footer-row/footer-row.component.js +0 -33
  74. package/esm2015/app/components/footer/footer.component.js +0 -36
  75. package/esm2015/app/components/head/head-cell/head-cell.component.js +0 -34
  76. package/esm2015/app/components/head/head.component.js +0 -108
  77. package/esm2015/app/components/list/list.component.js +0 -388
  78. package/esm2015/app/components/loader/loader.component.js +0 -45
  79. package/esm2015/app/components/manage-saved-filters/manage-saved-filters.component.js +0 -79
  80. package/esm2015/app/components/pagination/pagination.component.js +0 -42
  81. package/esm2015/app/components/saved-filters/saved-filters.component.js +0 -32
  82. package/esm2015/app/components/status/status.component.js +0 -72
  83. package/esm2015/app/directives/draggable-list/draggable-list.directive.js +0 -330
  84. package/esm2015/app/directives/draggable-row/draggable-row.directive.js +0 -79
  85. package/esm2015/app/interfaces/listconfig.interface.js +0 -2
  86. package/esm2015/app/models/row-action.model.js +0 -90
  87. package/esm2015/app/models/row.js +0 -81
  88. package/fesm2015/firestitch-list.js.map +0 -1
  89. /package/{esm2015/app/classes/actions-controller.js → esm2020/app/classes/actions-controller.mjs} +0 -0
  90. /package/{esm2015/app/classes/columns-controller.js → esm2020/app/classes/columns-controller.mjs} +0 -0
  91. /package/{esm2015/app/classes/index.js → esm2020/app/classes/index.mjs} +0 -0
  92. /package/{esm2015/app/classes/sorting-controller.js → esm2020/app/classes/sorting-controller.mjs} +0 -0
  93. /package/{esm2015/app/directives/index.js → esm2020/app/directives/index.mjs} +0 -0
  94. /package/{esm2015/app/enums/button-type.enum.js → esm2020/app/enums/button-type.enum.mjs} +0 -0
  95. /package/{esm2015/app/enums/page-change-type.enum.js → esm2020/app/enums/page-change-type.enum.mjs} +0 -0
  96. /package/{esm2015/app/enums/pagination-strategy.enum.js → esm2020/app/enums/pagination-strategy.enum.mjs} +0 -0
  97. /package/{esm2015/app/enums/row-type.enum.js → esm2020/app/enums/row-type.enum.mjs} +0 -0
  98. /package/{esm2015/app/enums/state.enum.js → esm2020/app/enums/state.enum.mjs} +0 -0
  99. /package/{esm2015/app/fs-list.providers.js → esm2020/app/fs-list.providers.mjs} +0 -0
  100. /package/{esm2015/app/interfaces/cellconfig.interface.js → esm2020/app/interfaces/cellconfig.interface.mjs} +0 -0
  101. /package/{esm2015/app/interfaces/column-config.interface.js → esm2020/app/interfaces/column-config.interface.mjs} +0 -0
  102. /package/{esm2015/app/interfaces/draggable-list.interface.js → esm2020/app/interfaces/draggable-list.interface.mjs} +0 -0
  103. /package/{esm2015/app/interfaces/external-params.interface.js → esm2020/app/interfaces/external-params.interface.mjs} +0 -0
  104. /package/{esm2015/app/interfaces/index.js → esm2020/app/interfaces/index.mjs} +0 -0
  105. /package/{esm2015/app/interfaces/sorting-change-event.interface.js → esm2020/app/interfaces/sorting-change-event.interface.mjs} +0 -0
  106. /package/{esm2015/app/models/column-async-attribute.js → esm2020/app/models/column-async-attribute.mjs} +0 -0
  107. /package/{esm2015/app/models/column-attributes.js → esm2020/app/models/column-attributes.mjs} +0 -0
  108. /package/{esm2015/app/models/column.model.js → esm2020/app/models/column.model.mjs} +0 -0
  109. /package/{esm2015/app/models/row/base-row.js → esm2020/app/models/row/base-row.mjs} +0 -0
  110. /package/{esm2015/app/models/row/child-row.js → esm2020/app/models/row/child-row.mjs} +0 -0
  111. /package/{esm2015/app/models/row/group-footer-row.js → esm2020/app/models/row/group-footer-row.mjs} +0 -0
  112. /package/{esm2015/app/models/row/group-row.js → esm2020/app/models/row/group-row.mjs} +0 -0
  113. /package/{esm2015/app/models/row/simple-row.js → esm2020/app/models/row/simple-row.mjs} +0 -0
  114. /package/{esm2015/app/models/styleConfig.model.js → esm2020/app/models/styleConfig.model.mjs} +0 -0
  115. /package/{esm2015/app/pipes/index.js → esm2020/app/pipes/index.mjs} +0 -0
  116. /package/{esm2015/firestitch-list.js → esm2020/firestitch-list.mjs} +0 -0
  117. /package/{esm2015/public_api.js → esm2020/public_api.mjs} +0 -0
@@ -16,12 +16,12 @@ import { SortingController } from './sorting-controller';
16
16
  export declare class List {
17
17
  private _el;
18
18
  private config;
19
- private fsScroll;
20
- private selectionDialog;
21
- private router;
22
- private route;
23
- private persistance;
24
- private inDialog;
19
+ private _fsScroll;
20
+ private _selectionDialog;
21
+ private _router;
22
+ private _route;
23
+ private _persistance;
24
+ private _inDialog;
25
25
  heading: string;
26
26
  trackBy: string;
27
27
  subheading: string;
@@ -57,8 +57,9 @@ export declare class List {
57
57
  externalParams: ExternalParamsController;
58
58
  selection: SelectionController;
59
59
  filterConfig: FilterConfig;
60
- fetch$: Subject<void | FsListFetchSubscription>;
61
- fetchComplete$: Subject<void>;
60
+ fetchComplete$: Subject<{
61
+ scrollIntoView?: boolean;
62
+ }>;
62
63
  filtersReady$: Subject<void>;
63
64
  status: boolean;
64
65
  chips: boolean;
@@ -70,6 +71,7 @@ export declare class List {
70
71
  emptyStateTemplate: TemplateRef<any>;
71
72
  fsScrollInstance: FsScrollInstance;
72
73
  onDestroy$: Subject<unknown>;
74
+ private _fetch$;
73
75
  private readonly _filtersQuery;
74
76
  private readonly _activeFiltersCount$;
75
77
  private readonly _headerConfig;
@@ -77,7 +79,8 @@ export declare class List {
77
79
  private readonly _cellConfig;
78
80
  private readonly _footerConfig;
79
81
  private _fsScrollSubscription;
80
- constructor(_el: ElementRef, config: FsListConfig, fsScroll: FsScrollService, selectionDialog: SelectionDialog, router: Router, route: ActivatedRoute, persistance: PersistanceController, inDialog: boolean);
82
+ constructor(_el: ElementRef, config: FsListConfig, _fsScroll: FsScrollService, _selectionDialog: SelectionDialog, _router: Router, _route: ActivatedRoute, _persistance: PersistanceController, _inDialog: boolean);
83
+ get fetch$(): Observable<FsListFetchSubscription | void>;
81
84
  get hasSavedFilters(): boolean;
82
85
  get filtersQuery(): Record<string, any>;
83
86
  get activeFiltersCount$(): Observable<number>;
@@ -107,43 +110,44 @@ export declare class List {
107
110
  *
108
111
  * @param config
109
112
  */
110
- private initialize;
113
+ private _initialize;
114
+ private _initVariables;
111
115
  /**
112
116
  * Just init options by default it it wasn't specified
113
117
  *
114
118
  * @param config
115
119
  */
116
- private initDefaultOptions;
120
+ private _initDefaultOptions;
117
121
  /**
118
122
  * Init restore row action and append Show Deleted option into filters
119
123
  */
120
- private initRestore;
124
+ private _initRestore;
121
125
  /**
122
126
  * Init paging
123
127
  *
124
128
  * @param pagingConfig
125
129
  * @param loadMore
126
130
  */
127
- private initPaging;
131
+ private _initPaging;
128
132
  /**
129
133
  * Split actions by categories
130
134
  */
131
- private initActions;
132
- private initSelection;
133
- private initializeData;
134
- private initGroups;
135
- private initExternalParamsController;
135
+ private _initActions;
136
+ private _initSelection;
137
+ private _initializeData;
138
+ private _initGroups;
139
+ private _initExternalParamsController;
136
140
  /**
137
141
  * Subscribe to fetch$ event with debounce
138
142
  */
139
- private listenFetch;
140
- private listenRowsRemove;
143
+ private _listenFetch;
144
+ private _listenRowsRemove;
141
145
  /**
142
146
  * Lister may have originally hidden columns, but visibility of those columns
143
147
  * can be changed programmaticaly in any time
144
148
  */
145
149
  private _listenVisibleColumnChanges;
146
- private initInfinityScroll;
150
+ private _initInfinityScroll;
147
151
  /**
148
152
  * Update and watch filter changes
149
153
  */
@@ -153,17 +157,18 @@ export declare class List {
153
157
  *
154
158
  * @param filters
155
159
  */
156
- private filterInit;
160
+ private _filterInit;
157
161
  /**
158
162
  * Callback when Filter has been changed
159
163
  *
160
164
  * @param filterQuery
161
165
  * @param filterSort
162
166
  */
163
- private filterChange;
164
- private checkRestoreFilter;
165
- private filterSort;
166
- private completeFetch;
167
+ private _filterChange;
168
+ private _checkRestoreFilter;
169
+ private _filterSort;
170
+ private _completeFetch;
171
+ private _completeFetchUpdateSelecton;
167
172
  /**
168
173
  * Will do some actions if you removed item and item was last on his own page
169
174
  *
@@ -172,7 +177,7 @@ export declare class List {
172
177
  *
173
178
  * @param deletedCount
174
179
  */
175
- private noDataPaginationUpdate;
180
+ private _noDataPaginationUpdate;
176
181
  /**
177
182
  * Temporary solution, will do auto subscribe if was returned Observable.
178
183
  *
@@ -181,6 +186,6 @@ export declare class List {
181
186
  * @param restoreClickCallback
182
187
  * @param row
183
188
  */
184
- private restoreClick;
189
+ private _restoreClick;
185
190
  private _updateSortingColumns;
186
191
  }
@@ -54,6 +54,7 @@ export declare class FsRowComponent implements OnInit, DoCheck, OnDestroy {
54
54
  get rightDragDropEnabled(): boolean;
55
55
  ngOnInit(): void;
56
56
  ngDoCheck(): void;
57
+ updateRowActions(): void;
57
58
  ngOnDestroy(): void;
58
59
  /**
59
60
  * Select row by checkbox
@@ -72,6 +73,7 @@ export declare class FsRowComponent implements OnInit, DoCheck, OnDestroy {
72
73
  * Set event listeners for row
73
74
  */
74
75
  private _initRowEvents;
76
+ private _initRowActionsUpdate;
75
77
  private _getRowClasses;
76
78
  /**
77
79
  * Subscribe to selection change events
@@ -12,6 +12,7 @@ import { ReorderController } from '../../classes/reorder-controller';
12
12
  import { FsListColumnDirective } from '../../directives/column/column.directive';
13
13
  import { FsListAbstractRow, FsListAction, FsListConfig, FsListSelectionConfig, FsListTrackByFn, FsListTrackByTargetRowFn } from '../../interfaces';
14
14
  import { GroupExpandNotifierService } from '../../services/group-expand-notifier.service';
15
+ import { FsBodyComponent } from '../body/body.component';
15
16
  import * as i0 from "@angular/core";
16
17
  export declare class FsListComponent implements OnInit, OnDestroy, AfterContentInit {
17
18
  reorderController: ReorderController;
@@ -45,6 +46,7 @@ export declare class FsListComponent implements OnInit, OnDestroy, AfterContentI
45
46
  private _filterParamsReady;
46
47
  private _inDialog;
47
48
  private _destroy;
49
+ body: FsBodyComponent;
48
50
  set filterReference(component: any);
49
51
  /**
50
52
  * Set columns to config
@@ -59,7 +59,7 @@ export interface FsListConfig {
59
59
  filterInit?: ChangeFn;
60
60
  filterChange?: ChangeFn;
61
61
  reload?: boolean;
62
- style?: 'line' | 'card';
62
+ style?: 'line' | 'card' | 'basic';
63
63
  }
64
64
  export interface FsListGroupConfig {
65
65
  enabled?: boolean;
@@ -154,6 +154,7 @@ export interface FsListSelectionConfig {
154
154
  }
155
155
  export interface FsListFetchSubscription {
156
156
  loadOffset?: boolean;
157
+ scrollIntoView?: boolean;
157
158
  }
158
159
  export declare type FsListAction = {
159
160
  customize?: boolean;
@@ -1,15 +1,19 @@
1
+ import { Observable } from 'rxjs';
1
2
  import { RowType } from '../enums/row-type.enum';
2
- import { ChildRow } from './row/child-row';
3
- import { GroupRow } from './row/group-row';
4
3
  import { FsListReorderData } from '../interfaces';
4
+ import { ChildRow } from './row/child-row';
5
5
  import { GroupFooterRow } from './row/group-footer-row';
6
+ import { GroupRow } from './row/group-row';
6
7
  export declare class Row {
7
8
  private _row;
9
+ private _actionsUpdate$;
8
10
  constructor(data?: any, rowType?: RowType, { parent, initialExpand }?: {
9
11
  parent?: GroupRow;
10
12
  initialExpand?: boolean;
11
13
  });
12
14
  get index(): number;
15
+ get actionsUpdate$(): Observable<any>;
16
+ actionsUpdate(): void;
13
17
  set index(value: number);
14
18
  get readyToSwap(): boolean;
15
19
  get visible(): boolean;
@@ -22,7 +26,7 @@ export declare class Row {
22
26
  get parent(): GroupRow;
23
27
  get children(): (ChildRow | GroupFooterRow)[];
24
28
  get expanded(): boolean;
25
- get expanded$(): import("rxjs").Observable<boolean>;
29
+ get expanded$(): Observable<boolean>;
26
30
  updateChildrenIndexes(): void;
27
31
  toggleRowExpandStatus(): void;
28
32
  getReorderData(): FsListReorderData;
@@ -0,0 +1,367 @@
1
+ import { BehaviorSubject, Subject } from 'rxjs';
2
+ import { takeUntil } from 'rxjs/operators';
3
+ import { isFunction, isObject } from 'lodash-es';
4
+ import { FsListState } from '../enums/state.enum';
5
+ import { RowType } from '../enums/row-type.enum';
6
+ import { GroupRow } from '../models/row/group-row';
7
+ import { ChildRow } from '../models/row/child-row';
8
+ import { Row } from '../models/row';
9
+ import { GroupFooterRow } from '../models/row/group-footer-row';
10
+ export class DataController {
11
+ constructor() {
12
+ this._visibleRows$ = new BehaviorSubject([]);
13
+ this._rowsRemoved$ = new Subject();
14
+ this._remoteRowsChange$ = new Subject();
15
+ this._store = new Map();
16
+ this._rowsStack = [];
17
+ this._initialExpand = true;
18
+ this._groupEnabled = false;
19
+ this._hasData = false;
20
+ this._destroy$ = new Subject();
21
+ }
22
+ get visibleRows$() {
23
+ return this._visibleRows$;
24
+ }
25
+ get visibleRows() {
26
+ return this._visibleRows$.getValue();
27
+ }
28
+ get visibleRowsData() {
29
+ return this.visibleRows.map((row) => row.data);
30
+ }
31
+ get rowsStack() {
32
+ return this._rowsStack.slice();
33
+ }
34
+ get groupEnabled() {
35
+ return this._groupEnabled;
36
+ }
37
+ set groupEnabled(value) {
38
+ this._groupEnabled = value;
39
+ }
40
+ get remoteRowsChange$() {
41
+ return this._remoteRowsChange$.pipe(takeUntil(this._destroy$));
42
+ }
43
+ get rowsRemoved$() {
44
+ return this._rowsRemoved$.pipe(takeUntil(this._destroy$));
45
+ }
46
+ get hasData() {
47
+ return this._hasData;
48
+ }
49
+ get operation() {
50
+ return this._operation;
51
+ }
52
+ set visibleRows(value) {
53
+ this._visibleRows$.next(value);
54
+ this._hasData = this.visibleRows.length > 0;
55
+ }
56
+ get visibleRowsCount() {
57
+ return this.visibleRows.length;
58
+ }
59
+ get hasGroups() {
60
+ return this._compareByFn && this._groupByFn;
61
+ }
62
+ get reorderData() {
63
+ return this._rowsStack
64
+ .map((row) => row.getReorderData());
65
+ }
66
+ setGroupConfig(group) {
67
+ if (group) {
68
+ this._groupByFn = group.groupBy;
69
+ this._compareByFn = group.compareBy;
70
+ this._footerRowFn = group.footer || (() => false);
71
+ this._initialExpand = group.initialExpand ?? true;
72
+ // group mode enabled by default
73
+ this._groupEnabled = (group.enabled !== void 0)
74
+ ? group.enabled
75
+ : true;
76
+ }
77
+ }
78
+ setAdditionalConfigs(configs) {
79
+ this._infinityScrollEnabled = configs.scrollable;
80
+ this._loadMoreEnabled = configs.loadMoreEnabled;
81
+ }
82
+ /**
83
+ * Rows what was received from fetch function
84
+ * @param rows
85
+ */
86
+ setRowsFromResponse(rows) {
87
+ if (this._infinityScrollEnabled) {
88
+ switch (this._operation) {
89
+ case FsListState.Filter:
90
+ case FsListState.Reload:
91
+ case FsListState.Sort:
92
+ {
93
+ this._updateRowsStack(rows);
94
+ }
95
+ break;
96
+ default: {
97
+ this._extendRowsStack(rows);
98
+ }
99
+ }
100
+ this._remoteRowsChange$.next();
101
+ }
102
+ else {
103
+ if (this._operation === FsListState.LoadMore ||
104
+ (this._operation === FsListState.PageChange && this._loadMoreEnabled)) {
105
+ this._extendRowsStack(rows);
106
+ }
107
+ else {
108
+ this._updateRowsStack(rows);
109
+ }
110
+ }
111
+ this._operation = FsListState.Idle;
112
+ this._updateVisibleRows();
113
+ }
114
+ /**
115
+ * Set current operation for list data flow
116
+ * @param value
117
+ */
118
+ setOperation(value) {
119
+ this._operation = value;
120
+ }
121
+ /**
122
+ * Remove rows from visible
123
+ */
124
+ clearRows() {
125
+ this.visibleRows = [];
126
+ }
127
+ /**
128
+ * Replace data for specified row
129
+ * @param targetRow
130
+ * @param trackBy
131
+ */
132
+ replaceData(targetRow, trackBy) {
133
+ const rowIndex = this._rowsStack.findIndex((listRow) => {
134
+ return trackBy(listRow.data, targetRow);
135
+ });
136
+ if (rowIndex > -1) {
137
+ this._rowsStack[rowIndex] = new Row(targetRow, RowType.Simple, { initialExpand: this._initialExpand });
138
+ this._updateVisibleRows();
139
+ return true;
140
+ }
141
+ else {
142
+ return false;
143
+ }
144
+ }
145
+ /**
146
+ * Update data for specified row
147
+ * @param rows
148
+ * @param trackBy
149
+ */
150
+ updateData(rows, trackBy) {
151
+ if (Array.isArray(rows)) {
152
+ let updateSuccess = false;
153
+ rows.forEach((item) => {
154
+ if (this.updateRow(item, trackBy)) {
155
+ updateSuccess = true;
156
+ }
157
+ });
158
+ this._updateVisibleRows();
159
+ return updateSuccess;
160
+ }
161
+ else {
162
+ const updated = this.updateRow(rows, trackBy);
163
+ this._updateVisibleRows();
164
+ return updated;
165
+ }
166
+ }
167
+ /**
168
+ * Remove data for specified row
169
+ * @param data
170
+ */
171
+ removeData(data) {
172
+ const removedRows = [];
173
+ const defaultTrackBy = (row, target) => {
174
+ return row === target;
175
+ };
176
+ if (Array.isArray(data)) {
177
+ //
178
+ data.forEach((item) => {
179
+ removedRows.push(...this.removeRow(item, defaultTrackBy));
180
+ });
181
+ }
182
+ else if (isFunction(data)) {
183
+ removedRows.push(...this.removeRow(null, data));
184
+ }
185
+ else if (isObject(data)) {
186
+ removedRows.push(...this.removeRow(data, defaultTrackBy));
187
+ }
188
+ if (removedRows.length > 0) {
189
+ this._updateVisibleRows();
190
+ this._rowsRemoved$.next(removedRows);
191
+ }
192
+ return !!removedRows.length;
193
+ }
194
+ swapRows(row1, row2, selectedRows, isMultipleDrag = false) {
195
+ let tmpEl;
196
+ const rowsStack = this._rowsStack;
197
+ const row1GlobalIndex = rowsStack.indexOf(row1);
198
+ const row2GlobalIndex = rowsStack.indexOf(row2);
199
+ tmpEl = rowsStack[row1GlobalIndex];
200
+ rowsStack[row1GlobalIndex] = rowsStack[row2GlobalIndex];
201
+ rowsStack[row2GlobalIndex] = tmpEl;
202
+ if (isMultipleDrag && Array.isArray(selectedRows)) {
203
+ if (!selectedRows.includes(row1)) {
204
+ selectedRows = [row1, ...selectedRows];
205
+ }
206
+ selectedRows
207
+ .filter((selectedRow) => {
208
+ return selectedRow !== row1;
209
+ })
210
+ .forEach((selectedRow) => {
211
+ const idx = rowsStack.indexOf(selectedRow);
212
+ rowsStack.splice(idx, 1);
213
+ });
214
+ const indexToInsertAfter = rowsStack.indexOf(tmpEl);
215
+ rowsStack.splice(indexToInsertAfter, 1);
216
+ selectedRows.forEach((selectedRow, offset) => {
217
+ rowsStack.splice(indexToInsertAfter + offset, 0, selectedRow);
218
+ });
219
+ }
220
+ this._rowsStack = [...rowsStack];
221
+ }
222
+ destroy() {
223
+ this._destroyRowsStack();
224
+ this._store.clear();
225
+ this._destroy$.next();
226
+ this._destroy$.complete();
227
+ }
228
+ toggleRowGroup(rowData) {
229
+ const row = this.visibleRows.find((visibleRow) => visibleRow.data === rowData);
230
+ row.toggleRowExpandStatus();
231
+ this._updateVisibleRows();
232
+ }
233
+ finishReorder() {
234
+ // TODO fixme remove or improve
235
+ if (this.groupEnabled) {
236
+ let group;
237
+ this._rowsStack
238
+ .forEach((row, index) => {
239
+ if (row.isGroup && row !== group) {
240
+ group = row;
241
+ }
242
+ else {
243
+ row.index = index - this._rowsStack.indexOf(group) - 1;
244
+ }
245
+ });
246
+ }
247
+ this._updateVisibleRows();
248
+ }
249
+ _updateRowsStack(rows) {
250
+ this._destroyRowsStack();
251
+ if (this.groupEnabled) {
252
+ this._store.clear();
253
+ this._rowsStack = [...this.groupRowsBy(rows)];
254
+ }
255
+ else {
256
+ rows = rows.map((row) => {
257
+ return new Row(row, RowType.Simple, { initialExpand: this._initialExpand });
258
+ });
259
+ this._rowsStack = [...rows];
260
+ }
261
+ }
262
+ _extendRowsStack(rows) {
263
+ if (this.groupEnabled) {
264
+ this._rowsStack = [...this.groupRowsBy(rows)];
265
+ }
266
+ else {
267
+ rows = rows.map((row) => {
268
+ return new Row(row, RowType.Simple, { initialExpand: this._initialExpand });
269
+ });
270
+ this._rowsStack = [...this._rowsStack, ...rows];
271
+ }
272
+ }
273
+ _destroyRowsStack() {
274
+ this._rowsStack.forEach((row) => row.destroy());
275
+ }
276
+ _updateVisibleRows() {
277
+ this.visibleRows = this._rowsStack
278
+ .filter((row, index) => {
279
+ return (!row.isChild && !row.isGroupFooter) || row.visible;
280
+ });
281
+ }
282
+ updateRow(targetRow, trackBy) {
283
+ if (trackBy === void 0) {
284
+ trackBy = (row, target) => {
285
+ return row === target;
286
+ };
287
+ }
288
+ const targetIndex = this._rowsStack.findIndex((listRow) => trackBy(listRow.data, targetRow));
289
+ if (targetIndex !== -1) {
290
+ const updateTarget = this._rowsStack[targetIndex];
291
+ const updatedData = Object.assign({}, updateTarget.data, targetRow);
292
+ this._rowsStack[targetIndex] = new Row(updatedData, updateTarget.type, {
293
+ parent: updateTarget.parent,
294
+ initialExpand: updateTarget.expanded,
295
+ });
296
+ return true;
297
+ }
298
+ return false;
299
+ }
300
+ /**
301
+ * Remove row from
302
+ * @param targetRow
303
+ * @param trackBy
304
+ */
305
+ removeRow(targetRow, trackBy) {
306
+ const rows = this._rowsStack;
307
+ const removedRows = [];
308
+ rows.forEach((listRow, index) => {
309
+ if (trackBy(listRow.data, targetRow)) {
310
+ const removedRow = rows.splice(index, 1);
311
+ removedRows.push(removedRow);
312
+ }
313
+ });
314
+ return removedRows;
315
+ }
316
+ /**
317
+ * Split existing rows by groups and store them for future use
318
+ */
319
+ groupRowsBy(rows) {
320
+ if (!this._groupByFn || !this._compareByFn) {
321
+ return rows;
322
+ }
323
+ let groupRows = [];
324
+ const footerRows = new Map();
325
+ rows.forEach((row) => {
326
+ const mainGroup = this._groupByFn(row);
327
+ const mainGroupKey = this._compareByFn(mainGroup);
328
+ if (!this._store.has(mainGroupKey)) {
329
+ const group = new GroupRow(mainGroup, this._initialExpand);
330
+ group.index = groupRows.length;
331
+ groupRows.push(group);
332
+ const childRow = new ChildRow(row, group);
333
+ this._store.set(mainGroupKey, group);
334
+ group.children.push(childRow);
335
+ }
336
+ else {
337
+ const group = this._store.get(mainGroupKey);
338
+ const childRow = new ChildRow(row, group);
339
+ group.children.push(childRow);
340
+ }
341
+ });
342
+ groupRows.forEach((groupRow) => {
343
+ const footerIndex = groupRow.children
344
+ .findIndex((row) => {
345
+ return this._footerRowFn(row.data, {
346
+ ...groupRow.data,
347
+ children: groupRow.childrenData,
348
+ });
349
+ });
350
+ if (footerIndex !== -1) {
351
+ const footerRow = groupRow.children.splice(footerIndex, footerIndex + 1)[0];
352
+ groupRow.children.push(new GroupFooterRow(footerRow.data, groupRow));
353
+ }
354
+ });
355
+ return Array.from(this._store.values())
356
+ .reduce((acc, item) => {
357
+ if (item.isGroup) {
358
+ acc.push(item, ...item.children);
359
+ }
360
+ else {
361
+ acc.push(item);
362
+ }
363
+ return acc;
364
+ }, []);
365
+ }
366
+ }
367
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9jbGFzc2VzL2RhdGEtY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQU1qRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBR2hFLE1BQU0sT0FBTyxjQUFjO0lBK0J6QjtRQTdCaUIsa0JBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBUSxFQUFFLENBQUMsQ0FBQztRQUMvQyxrQkFBYSxHQUFHLElBQUksT0FBTyxFQUFTLENBQUM7UUFDckMsdUJBQWtCLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUVsRCxXQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNuQixlQUFVLEdBQVUsRUFBRSxDQUFDO1FBY3ZCLG1CQUFjLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBS3RCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFUixjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUVsQyxDQUFDO0lBRWhCLElBQUksWUFBWTtRQUNk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LFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO2FBQ3RFO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUNwQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDcEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNoQixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNsQztpQkFBTTtnQkFDTCxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2hCO1lBRUQsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDWCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGlzRnVuY3Rpb24sIGlzT2JqZWN0IH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHsgRnNMaXN0U3RhdGUgfSBmcm9tICcuLi9lbnVtcy9zdGF0ZS5lbnVtJztcbmltcG9ydCB7IFJvd1R5cGUgfSBmcm9tICcuLi9lbnVtcy9yb3ctdHlwZS5lbnVtJztcbmltcG9ydCB7XG4gIEZzTGlzdEFic3RyYWN0Um93LFxuICBGc0xpc3RHcm91cENvbmZpZyxcbiAgRnNMaXN0VHJhY2tCeVRhcmdldFJvd0ZuXG59IGZyb20gJy4uL2ludGVyZmFjZXMvbGlzdGNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgR3JvdXBSb3cgfSBmcm9tICcuLi9tb2RlbHMvcm93L2dyb3VwLXJvdyc7XG5pbXBvcnQgeyBDaGlsZFJvdyB9IGZyb20gJy4uL21vZGVscy9yb3cvY2hpbGQtcm93JztcbmltcG9ydCB7IFJvdyB9IGZyb20gJy4uL21vZGVscy9yb3cnO1xuaW1wb3J0IHsgR3JvdXBGb290ZXJSb3cgfSBmcm9tICcuLi9tb2RlbHMvcm93L2dyb3VwLWZvb3Rlci1yb3cnO1xuXG5cbmV4cG9ydCBjbGFzcyBEYXRhQ29udHJvbGxlciB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfdmlzaWJsZVJvd3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSb3dbXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IF9yb3dzUmVtb3ZlZCQgPSBuZXcgU3ViamVjdDxSb3dbXT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcmVtb3RlUm93c0NoYW5nZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgX3N0b3JlID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIF9yb3dzU3RhY2s6IFJvd1tdID0gW107XG4gIHByaXZhdGUgX29wZXJhdGlvbjogRnNMaXN0U3RhdGU7XG5cbiAgcHJpdmF0ZSBfZ3JvdXBCeUZuOiAocm93KSA9PiBhbnlbXTtcbiAgcHJpdmF0ZSBfZm9vdGVyUm93Rm46IChcbiAgICByb3c6IHsgW2tleTogc3RyaW5nXTogYW55IH0sXG4gICAgZ3JvdXA6IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IGFueSxcbiAgICAgIGNoaWxkcmVuOiB7XG4gICAgICAgIFtrZXk6IHN0cmluZ106IGFueVxuICAgICAgfVtdLFxuICAgIH1cbiAgKSA9PiBib29sZWFuO1xuICBwcml2YXRlIF9jb21wYXJlQnlGbjogKGdyb3VwKSA9PiBhbnk7XG4gIHByaXZhdGUgX2luaXRpYWxFeHBhbmQgPSB0cnVlO1xuICBwcml2YXRlIF9ncm91cEVuYWJsZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIF9pbmZpbml0eVNjcm9sbEVuYWJsZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX2xvYWRNb3JlRW5hYmxlZDogYm9vbGVhbjtcblxuICBwcml2YXRlIF9oYXNEYXRhID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBnZXQgdmlzaWJsZVJvd3MkKCkge1xuICAgIHJldHVybiB0aGlzLl92aXNpYmxlUm93cyQ7XG4gIH1cblxuICBnZXQgdmlzaWJsZVJvd3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Zpc2libGVSb3dzJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgZ2V0IHZpc2libGVSb3dzRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlUm93cy5tYXAoKHJvdykgPT4gcm93LmRhdGEpO1xuICB9XG5cbiAgZ2V0IHJvd3NTdGFjaygpIHtcbiAgICByZXR1cm4gdGhpcy5fcm93c1N0YWNrLnNsaWNlKCk7XG4gIH1cblxuICBnZXQgZ3JvdXBFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9ncm91cEVuYWJsZWQ7XG4gIH1cblxuICBzZXQgZ3JvdXBFbmFibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZ3JvdXBFbmFibGVkID0gdmFsdWU7XG4gIH1cblxuICBnZXQgcmVtb3RlUm93c0NoYW5nZSQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbW90ZVJvd3NDaGFuZ2UkLnBpcGUoXG4gICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICk7XG4gIH1cblxuICBnZXQgcm93c1JlbW92ZWQkKCkge1xuICAgIHJldHVybiB0aGlzLl9yb3dzUmVtb3ZlZCQucGlwZShcbiAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgKTtcbiAgfVxuXG4gIGdldCBoYXNEYXRhKCkge1xuICAgIHJldHVybiB0aGlzLl9oYXNEYXRhO1xuICB9XG5cbiAgZ2V0IG9wZXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlcmF0aW9uO1xuICB9XG5cbiAgc2V0IHZpc2libGVSb3dzKHZhbHVlOiBhbnlbXSkge1xuICAgIHRoaXMuX3Zpc2libGVSb3dzJC5uZXh0KHZhbHVlKTtcbiAgICB0aGlzLl9oYXNEYXRhID0gdGhpcy52aXNpYmxlUm93cy5sZW5ndGggPiAwO1xuICB9XG5cbiAgZ2V0IHZpc2libGVSb3dzQ291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZVJvd3MubGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGhhc0dyb3VwcygpIHtcbiAgICByZXR1cm4gdGhpcy5fY29tcGFyZUJ5Rm4gJiYgdGhpcy5fZ3JvdXBCeUZuO1xuICB9XG5cbiAgZ2V0IHJlb3JkZXJEYXRhKCkge1xuICAgIHJldHVybiB0aGlzLl9yb3dzU3RhY2tcbiAgICAgIC5tYXAoKHJvdykgPT4gcm93LmdldFJlb3JkZXJEYXRhKCkpO1xuICB9XG5cbiAgcHVibGljIHNldEdyb3VwQ29uZmlnKGdyb3VwOiBGc0xpc3RHcm91cENvbmZpZykge1xuICAgIGlmIChncm91cCkge1xuICAgICAgdGhpcy5fZ3JvdXBCeUZuID0gZ3JvdXAuZ3JvdXBCeTtcbiAgICAgIHRoaXMuX2NvbXBhcmVCeUZuID0gZ3JvdXAuY29tcGFyZUJ5O1xuICAgICAgdGhpcy5fZm9vdGVyUm93Rm4gPSBncm91cC5mb290ZXIgfHwgKCgpID0+IGZhbHNlKTtcbiAgICAgIHRoaXMuX2luaXRpYWxFeHBhbmQgPSBncm91cC5pbml0aWFsRXhwYW5kID8/IHRydWU7XG5cbiAgICAgIC8vIGdyb3VwIG1vZGUgZW5hYmxlZCBieSBkZWZhdWx0XG4gICAgICB0aGlzLl9ncm91cEVuYWJsZWQgPSAoZ3JvdXAuZW5hYmxlZCAhPT0gdm9pZCAwKVxuICAgICAgICA/IGdyb3VwLmVuYWJsZWRcbiAgICAgICAgOiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRBZGRpdGlvbmFsQ29uZmlncyhjb25maWdzOiB7IHNjcm9sbGFibGU6IGJvb2xlYW4sIGxvYWRNb3JlRW5hYmxlZDogYm9vbGVhbiB9KSB7XG4gICAgdGhpcy5faW5maW5pdHlTY3JvbGxFbmFibGVkID0gY29uZmlncy5zY3JvbGxhYmxlO1xuICAgIHRoaXMuX2xvYWRNb3JlRW5hYmxlZCA9IGNvbmZpZ3MubG9hZE1vcmVFbmFibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvd3Mgd2hhdCB3YXMgcmVjZWl2ZWQgZnJvbSBmZXRjaCBmdW5jdGlvblxuICAgKiBAcGFyYW0gcm93c1xuICAgKi9cbiAgcHVibGljIHNldFJvd3NGcm9tUmVzcG9uc2Uocm93czogYW55W10pIHtcbiAgICBpZiAodGhpcy5faW5maW5pdHlTY3JvbGxFbmFibGVkKSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuX29wZXJhdGlvbikge1xuICAgICAgICBjYXNlIEZzTGlzdFN0YXRlLkZpbHRlcjpcbiAgICAgICAgY2FzZSBGc0xpc3RTdGF0ZS5SZWxvYWQ6XG4gICAgICAgIGNhc2UgRnNMaXN0U3RhdGUuU29ydDoge1xuICAgICAgICAgIHRoaXMuX3VwZGF0ZVJvd3NTdGFjayhyb3dzKTtcbiAgICAgICAgfSBicmVhaztcblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhpcy5fZXh0ZW5kUm93c1N0YWNrKHJvd3MpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3JlbW90ZVJvd3NDaGFuZ2UkLm5leHQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl9vcGVyYXRpb24gPT09IEZzTGlzdFN0YXRlLkxvYWRNb3JlIHx8XG4gICAgICAgICh0aGlzLl9vcGVyYXRpb24gPT09IEZzTGlzdFN0YXRlLlBhZ2VDaGFuZ2UgJiYgdGhpcy5fbG9hZE1vcmVFbmFibGVkKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuX2V4dGVuZFJvd3NTdGFjayhyb3dzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVJvd3NTdGFjayhyb3dzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9vcGVyYXRpb24gPSBGc0xpc3RTdGF0ZS5JZGxlO1xuXG4gICAgdGhpcy5fdXBkYXRlVmlzaWJsZVJvd3MoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgY3VycmVudCBvcGVyYXRpb24gZm9yIGxpc3QgZGF0YSBmbG93XG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgcHVibGljIHNldE9wZXJhdGlvbih2YWx1ZTogRnNMaXN0U3RhdGUpIHtcbiAgICB0aGlzLl9vcGVyYXRpb24gPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgcm93cyBmcm9tIHZpc2libGVcbiAgICovXG4gIHB1YmxpYyBjbGVhclJvd3MoKSB7XG4gICAgdGhpcy52aXNpYmxlUm93cyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgZGF0YSBmb3Igc3BlY2lmaWVkIHJvd1xuICAgKiBAcGFyYW0gdGFyZ2V0Um93XG4gICAqIEBwYXJhbSB0cmFja0J5XG4gICAqL1xuICBwdWJsaWMgcmVwbGFjZURhdGEoXG4gICAgdGFyZ2V0Um93OiBGc0xpc3RBYnN0cmFjdFJvdyxcbiAgICB0cmFja0J5PzogRnNMaXN0VHJhY2tCeVRhcmdldFJvd0ZuXG4gICkge1xuICAgIGNvbnN0IHJvd0luZGV4ID0gdGhpcy5fcm93c1N0YWNrLmZpbmRJbmRleCgobGlzdFJvdykgPT4ge1xuICAgICAgcmV0dXJuIHRyYWNrQnkobGlzdFJvdy5kYXRhLCB0YXJnZXRSb3cpO1xuICAgIH0pO1xuXG4gICAgaWYgKHJvd0luZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuX3Jvd3NTdGFja1tyb3dJbmRleF0gPSBuZXcgUm93KFxuICAgICAgICB0YXJnZXRSb3csXG4gICAgICAgIFJvd1R5cGUuU2ltcGxlLFxuICAgICAgICB7IGluaXRpYWxFeHBhbmQ6IHRoaXMuX2luaXRpYWxFeHBhbmQgfVxuICAgICAgKTtcblxuICAgICAgdGhpcy5fdXBkYXRlVmlzaWJsZVJvd3MoKTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgZGF0YSBmb3Igc3BlY2lmaWVkIHJvd1xuICAgKiBAcGFyYW0gcm93c1xuICAgKiBAcGFyYW0gdHJhY2tCeVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZURhdGEoXG4gICAgcm93czogRnNMaXN0QWJzdHJhY3RSb3cgfCBGc0xpc3RBYnN0cmFjdFJvd1tdLFxuICAgIHRyYWNrQnk/OiBGc0xpc3RUcmFja0J5VGFyZ2V0Um93Rm4sXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJvd3MpKSB7XG4gICAgICBsZXQgdXBkYXRlU3VjY2VzcyA9IGZhbHNlO1xuXG4gICAgICByb3dzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlUm93KGl0ZW0sIHRyYWNrQnkpKSB7XG4gICAgICAgICAgdXBkYXRlU3VjY2VzcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl91cGRhdGVWaXNpYmxlUm93cygpO1xuXG4gICAgICByZXR1cm4gdXBkYXRlU3VjY2VzcztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdXBkYXRlZCA9IHRoaXMudXBkYXRlUm93KHJvd3MsIHRyYWNrQnkpO1xuXG4gICAgICB0aGlzLl91cGRhdGVWaXNpYmxlUm93cygpO1xuXG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGRhdGEgZm9yIHNwZWNpZmllZCByb3dcbiAgICogQHBhcmFtIGRhdGFcbiAgICovXG4gIHB1YmxpYyByZW1vdmVEYXRhKGRhdGE6IEZzTGlzdEFic3RyYWN0Um93IHwgRnNMaXN0QWJzdHJhY3RSb3dbXSB8IEZzTGlzdFRyYWNrQnlUYXJnZXRSb3dGbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlbW92ZWRSb3dzID0gW107XG5cbiAgICBjb25zdCBkZWZhdWx0VHJhY2tCeSA9IChyb3csIHRhcmdldCkgPT4ge1xuICAgICAgcmV0dXJuIHJvdyA9PT0gdGFyZ2V0O1xuICAgIH07XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgLy9cbiAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICByZW1vdmVkUm93cy5wdXNoKC4uLnRoaXMucmVtb3ZlUm93KGl0ZW0sIGRlZmF1bHRUcmFja0J5KSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oZGF0YSkpIHtcbiAgICAgIHJlbW92ZWRSb3dzLnB1c2goLi4udGhpcy5yZW1vdmVSb3cobnVsbCwgKGRhdGEgYXMgRnNMaXN0VHJhY2tCeVRhcmdldFJvd0ZuKSkpO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJlbW92ZWRSb3dzLnB1c2goLi4udGhpcy5yZW1vdmVSb3coZGF0YSwgZGVmYXVsdFRyYWNrQnkpKTtcbiAgICB9XG5cbiAgICBpZiAocmVtb3ZlZFJvd3MubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fdXBkYXRlVmlzaWJsZVJvd3MoKTtcblxuICAgICAgdGhpcy5fcm93c1JlbW92ZWQkLm5leHQocmVtb3ZlZFJvd3MpXG4gICAgfVxuXG4gICAgcmV0dXJuICEhcmVtb3ZlZFJvd3MubGVuZ3RoO1xuICB9XG5cbiAgcHVibGljIHN3YXBSb3dzKHJvdzEsIHJvdzIsIHNlbGVjdGVkUm93cz86IFJvd1tdLCBpc011bHRpcGxlRHJhZyA9IGZhbHNlKSB7XG4gICAgbGV0IHRtcEVsO1xuICAgIGNvbnN0IHJvd3NTdGFjayA9IHRoaXMuX3Jvd3NTdGFjaztcbiAgICBjb25zdCByb3cxR2xvYmFsSW5kZXggPSByb3dzU3RhY2suaW5kZXhPZihyb3cxKTtcbiAgICBjb25zdCByb3cyR2xvYmFsSW5kZXggPSByb3dzU3RhY2suaW5kZXhPZihyb3cyKTtcblxuICAgIHRtcEVsID0gcm93c1N0YWNrW3JvdzFHbG9iYWxJbmRleF07XG4gICAgcm93c1N0YWNrW3JvdzFHbG9iYWxJbmRleF0gPSByb3dzU3RhY2tbcm93Mkdsb2JhbEluZGV4XTtcbiAgICByb3dzU3RhY2tbcm93Mkdsb2JhbEluZGV4XSA9IHRtcEVsO1xuXG4gICAgaWYgKGlzTXVsdGlwbGVEcmFnICYmIEFycmF5LmlzQXJyYXkoc2VsZWN0ZWRSb3dzKSkge1xuICAgICAgaWYgKCFzZWxlY3RlZFJvd3MuaW5jbHVkZXMocm93MSkpIHtcbiAgICAgICAgc2VsZWN0ZWRSb3dzID0gW3JvdzEsIC4uLnNlbGVjdGVkUm93c107XG4gICAgICB9XG5cbiAgICAgIHNlbGVjdGVkUm93c1xuICAgICAgICAuZmlsdGVyKChzZWxlY3RlZFJvdykgPT4ge1xuICAgICAgICAgIHJldHVybiBzZWxlY3RlZFJvdyAhPT0gcm93MTtcbiAgICAgICAgfSlcbiAgICAgICAgLmZvckVhY2goKHNlbGVjdGVkUm93KSA9PiB7XG4gICAgICAgICAgY29uc3QgaWR4ID0gcm93c1N0YWNrLmluZGV4T2Yoc2VsZWN0ZWRSb3cpO1xuICAgICAgICAgIHJvd3NTdGFjay5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGluZGV4VG9JbnNlcnRBZnRlciA9IHJvd3NTdGFjay5pbmRleE9mKHRtcEVsKTtcblxuICAgICAgcm93c1N0YWNrLnNwbGljZShpbmRleFRvSW5zZXJ0QWZ0ZXIsIDEpO1xuXG4gICAgICBzZWxlY3RlZFJvd3MuZm9yRWFjaCgoc2VsZWN0ZWRSb3csIG9mZnNldCkgPT4ge1xuICAgICAgICByb3dzU3RhY2suc3BsaWNlKGluZGV4VG9JbnNlcnRBZnRlciArIG9mZnNldCwgMCwgc2VsZWN0ZWRSb3cpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fcm93c1N0YWNrID0gWyAuLi5yb3dzU3RhY2sgXTtcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95KCkge1xuICAgIHRoaXMuX2Rlc3Ryb3lSb3dzU3RhY2soKTtcbiAgICB0aGlzLl9zdG9yZS5jbGVhcigpO1xuXG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlUm93R3JvdXAocm93RGF0YSkge1xuICAgIGNvbnN0IHJvdyA9IHRoaXMudmlzaWJsZVJvd3MuZmluZCgodmlzaWJsZVJvdykgPT4gdmlzaWJsZVJvdy5kYXRhID09PSByb3dEYXRhICk7XG4gICAgcm93LnRvZ2dsZVJvd0V4cGFuZFN0YXR1cygpO1xuXG4gICAgdGhpcy5fdXBkYXRlVmlzaWJsZVJvd3MoKTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5pc2hSZW9yZGVyKCk6IHZvaWQge1xuICAgIC8vIFRPRE8gZml4bWUgcmVtb3ZlIG9yIGltcHJvdmVcbiAgICBpZiAodGhpcy5ncm91cEVuYWJsZWQpIHtcbiAgICAgIGxldCBncm91cDtcbiAgICAgIHRoaXMuX3Jvd3NTdGFja1xuICAgICAgICAuZm9yRWFjaCgocm93LCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChyb3cuaXNHcm91cCAmJiByb3cgIT09IGdyb3VwKSB7XG4gICAgICAgICAgICBncm91cCA9IHJvdztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcm93LmluZGV4ID0gaW5kZXggLSB0aGlzLl9yb3dzU3RhY2suaW5kZXhPZihncm91cCkgLSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlVmlzaWJsZVJvd3MoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVJvd3NTdGFjayhyb3dzKSB7XG4gICAgdGhpcy5fZGVzdHJveVJvd3NTdGFjaygpO1xuXG4gICAgaWYgKHRoaXMuZ3JvdXBFbmFibGVkKSB7XG4gICAgICB0aGlzLl9zdG9yZS5jbGVhcigpO1xuICAgICAgdGhpcy5fcm93c1N0YWNrID0gWy4uLnRoaXMuZ3JvdXBSb3dzQnkocm93cyldO1xuICAgIH0gZWxzZSB7XG4gICAgICByb3dzID0gcm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFJvdyhcbiAgICAgICAgICByb3csXG4gICAgICAgICAgUm93VHlwZS5TaW1wbGUsXG4gICAgICAgICAgeyBpbml0aWFsRXhwYW5kOiB0aGlzLl9pbml0aWFsRXhwYW5kIH0sXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3Jvd3NTdGFjayA9IFsuLi5yb3dzXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9leHRlbmRSb3dzU3RhY2socm93cykge1xuICAgIGlmICh0aGlzLmdyb3VwRW5hYmxlZCkge1xuICAgICAgdGhpcy5fcm93c1N0YWNrID0gWy4uLnRoaXMuZ3JvdXBSb3dzQnkocm93cyldO1xuICAgIH0gZWxzZSB7XG4gICAgICByb3dzID0gcm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFJvdyhcbiAgICAgICAgICByb3csXG4gICAgICAgICAgUm93VHlwZS5TaW1wbGUsXG4gICAgICAgICAgeyBpbml0aWFsRXhwYW5kOiB0aGlzLl9pbml0aWFsRXhwYW5kIH0sXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3Jvd3NTdGFjayA9IFsuLi50aGlzLl9yb3dzU3RhY2ssIC4uLnJvd3NdO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2Rlc3Ryb3lSb3dzU3RhY2soKSB7XG4gICAgdGhpcy5fcm93c1N0YWNrLmZvckVhY2goKHJvdykgPT4gcm93LmRlc3Ryb3koKSk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVWaXNpYmxlUm93cygpIHtcbiAgICB0aGlzLnZpc2libGVSb3dzID0gdGhpcy5fcm93c1N0YWNrXG4gICAgICAuZmlsdGVyKChyb3csIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiAoIShyb3cgYXMgYW55KS5pc0NoaWxkICYmICFyb3cuaXNHcm91cEZvb3RlcikgfHwgcm93LnZpc2libGU7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUm93KFxuICAgIHRhcmdldFJvdzogRnNMaXN0QWJzdHJhY3RSb3csXG4gICAgdHJhY2tCeT86IChsaXN0Um93OiBGc0xpc3RBYnN0cmFjdFJvdywgdGFyZ2V0Um93PzogRnNMaXN0QWJzdHJhY3RSb3cpID0+IGJvb2xlYW4pIHtcblxuICAgIGlmICh0cmFja0J5ID09PSB2b2lkIDApIHtcbiAgICAgIHRyYWNrQnkgPSAocm93LCB0YXJnZXQpID0+IHtcbiAgICAgICAgcmV0dXJuIHJvdyA9PT0gdGFyZ2V0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldEluZGV4ID0gdGhpcy5fcm93c1N0YWNrLmZpbmRJbmRleCgobGlzdFJvdykgPT4gdHJhY2tCeShsaXN0Um93LmRhdGEsIHRhcmdldFJvdykpO1xuXG4gICAgaWYgKHRhcmdldEluZGV4ICE9PSAtMSkge1xuICAgICAgY29uc3QgdXBkYXRlVGFyZ2V0ID0gdGhpcy5fcm93c1N0YWNrW3RhcmdldEluZGV4XTtcbiAgICAgIGNvbnN0IHVwZGF0ZWREYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgdXBkYXRlVGFyZ2V0LmRhdGEsIHRhcmdldFJvdyk7XG5cbiAgICAgIHRoaXMuX3Jvd3NTdGFja1t0YXJnZXRJbmRleF0gPSBuZXcgUm93KFxuICAgICAgICB1cGRhdGVkRGF0YSxcbiAgICAgICAgdXBkYXRlVGFyZ2V0LnR5cGUsXG4gICAgICAgIHtcbiAgICAgICAgICBwYXJlbnQ6IHVwZGF0ZVRhcmdldC5wYXJlbnQsXG4gICAgICAgICAgaW5pdGlhbEV4cGFuZDogdXBkYXRlVGFyZ2V0LmV4cGFuZGVkLFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHJvdyBmcm9tXG4gICAqIEBwYXJhbSB0YXJnZXRSb3dcbiAgICogQHBhcmFtIHRyYWNrQnlcbiAgICovXG4gIHByaXZhdGUgcmVtb3ZlUm93KFxuICAgIHRhcmdldFJvdzogRnNMaXN0QWJzdHJhY3RSb3cgfCBudWxsLFxuICAgIHRyYWNrQnk/OiBGc0xpc3RUcmFja0J5VGFyZ2V0Um93Rm5cbiAgKSB7XG5cbiAgICBjb25zdCByb3dzID0gdGhpcy5fcm93c1N0YWNrO1xuICAgIGNvbnN0IHJlbW92ZWRSb3dzID0gW107XG5cbiAgICByb3dzLmZvckVhY2goKGxpc3RSb3csIGluZGV4KSA9PiB7XG4gICAgICBpZiAodHJhY2tCeShsaXN0Um93LmRhdGEsIHRhcmdldFJvdykpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZFJvdyA9IHJvd3Muc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICByZW1vdmVkUm93cy5wdXNoKHJlbW92ZWRSb3cpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlbW92ZWRSb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0IGV4aXN0aW5nIHJvd3MgYnkgZ3JvdXBzIGFuZCBzdG9yZSB0aGVtIGZvciBmdXR1cmUgdXNlXG4gICAqL1xuICBwcml2YXRlIGdyb3VwUm93c0J5KHJvd3MpIHtcbiAgICBpZiAoIXRoaXMuX2dyb3VwQnlGbiB8fCAhdGhpcy5fY29tcGFyZUJ5Rm4pIHsgcmV0dXJuIHJvd3MgfVxuXG4gICAgbGV0IGdyb3VwUm93czogR3JvdXBSb3dbXSA9IFtdO1xuICAgIGNvbnN0IGZvb3RlclJvd3MgPSBuZXcgTWFwKCk7XG5cbiAgICByb3dzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgY29uc3QgbWFpbkdyb3VwID0gdGhpcy5fZ3JvdXBCeUZuKHJvdyk7XG4gICAgICBjb25zdCBtYWluR3JvdXBLZXkgPSB0aGlzLl9jb21wYXJlQnlGbihtYWluR3JvdXApO1xuXG4gICAgICBpZiAoIXRoaXMuX3N0b3JlLmhhcyhtYWluR3JvdXBLZXkpKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gbmV3IEdyb3VwUm93KFxuICAgICAgICAgIG1haW5Hcm91cCxcbiAgICAgICAgICB0aGlzLl9pbml0aWFsRXhwYW5kLFxuICAgICAgICApO1xuXG4gICAgICAgIGdyb3VwLmluZGV4ID0gZ3JvdXBSb3dzLmxlbmd0aDtcbiAgICAgICAgZ3JvdXBSb3dzLnB1c2goZ3JvdXApO1xuXG4gICAgICAgIGNvbnN0IGNoaWxkUm93ID0gbmV3IENoaWxkUm93KHJvdywgZ3JvdXApO1xuXG4gICAgICAgIHRoaXMuX3N0b3JlLnNldChtYWluR3JvdXBLZXksIGdyb3VwKTtcbiAgICAgICAgZ3JvdXAuY2hpbGRyZW4ucHVzaChjaGlsZFJvdyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuX3N0b3JlLmdldChtYWluR3JvdXBLZXkpO1xuICAgICAgICBjb25zdCBjaGlsZFJvdyA9IG5ldyBDaGlsZFJvdyhyb3csIGdyb3VwKTtcblxuICAgICAgICBncm91cC5jaGlsZHJlbi5wdXNoKGNoaWxkUm93KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGdyb3VwUm93cy5mb3JFYWNoKChncm91cFJvdykgPT4ge1xuICAgICAgY29uc3QgZm9vdGVySW5kZXggPSBncm91cFJvdy5jaGlsZHJlblxuICAgICAgICAuZmluZEluZGV4KChyb3cpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZm9vdGVyUm93Rm4ocm93LmRhdGEsIHtcbiAgICAgICAgICAgIC4uLmdyb3VwUm93LmRhdGEsXG4gICAgICAgICAgICBjaGlsZHJlbjogZ3JvdXBSb3cuY2hpbGRyZW5EYXRhLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgaWYgKGZvb3RlckluZGV4ICE9PSAtMSkge1xuICAgICAgICBjb25zdCBmb290ZXJSb3cgPSBncm91cFJvdy5jaGlsZHJlbi5zcGxpY2UoZm9vdGVySW5kZXgsIGZvb3RlckluZGV4ICsgMSlbMF07XG4gICAgICAgIGdyb3VwUm93LmNoaWxkcmVuLnB1c2gobmV3IEdyb3VwRm9vdGVyUm93KGZvb3RlclJvdy5kYXRhLCBncm91cFJvdykpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5fc3RvcmUudmFsdWVzKCkpXG4gICAgICAucmVkdWNlKChhY2MsIGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uaXNHcm91cCkge1xuICAgICAgICAgIGFjYy5wdXNoKGl0ZW0sIC4uLml0ZW0uY2hpbGRyZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFjYy5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIFtdKTtcbiAgfVxufVxuIl19