@firestitch/list 9.9.7 → 9.9.11
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.
- package/app/classes/actions-controller.d.ts +20 -20
- package/app/classes/columns-controller.d.ts +65 -65
- package/app/classes/data-controller.d.ts +89 -89
- package/app/classes/external-params-controller.d.ts +31 -31
- package/app/classes/index.d.ts +2 -2
- package/app/classes/list-controller.d.ts +166 -166
- package/app/classes/pagination-controller.d.ts +185 -185
- package/app/classes/persistance-controller.d.ts +7 -7
- package/app/classes/reorder-controller.d.ts +56 -56
- package/app/classes/selection-controller.d.ts +141 -141
- package/app/classes/sorting-controller.d.ts +64 -63
- package/app/components/body/body.component.d.ts +29 -29
- package/app/components/body/row/actions/actions.component.d.ts +32 -32
- package/app/components/body/row/cell/cell.component.d.ts +20 -20
- package/app/components/body/row/inline-action/inline-action.component.d.ts +10 -10
- package/app/components/body/row/row.component.d.ts +66 -66
- package/app/components/customize-cols/customize-cols.component.d.ts +14 -14
- package/app/components/footer/footer-row/footer-cell/footer-cell.component.d.ts +4 -4
- package/app/components/footer/footer-row/footer-row.component.d.ts +8 -8
- package/app/components/footer/footer.component.d.ts +8 -8
- package/app/components/head/head-cell/head-cell.component.d.ts +11 -11
- package/app/components/head/head.component.d.ts +40 -40
- package/app/components/list/list.component.d.ts +108 -108
- package/app/components/loader/loader.component.d.ts +11 -11
- package/app/components/manage-saved-filters/manage-saved-filters.component.d.ts +10 -10
- package/app/components/pagination/pagination.component.d.ts +11 -11
- package/app/components/saved-filters/saved-filters.component.d.ts +12 -12
- package/app/components/status/status.component.d.ts +18 -18
- package/app/directives/cell/cell.directive.d.ts +5 -5
- package/app/directives/column/column.directive.d.ts +24 -23
- package/app/directives/draggable-list/draggable-list.directive.d.ts +77 -77
- package/app/directives/draggable-row/draggable-row.directive.d.ts +18 -18
- package/app/directives/empty-state/empty-state.directive.d.ts +2 -2
- package/app/directives/footer/footer.directive.d.ts +5 -5
- package/app/directives/group-cell/group-cell.directive.d.ts +3 -3
- package/app/directives/group-expand-trigger/group-expand-trigger.directive.d.ts +7 -7
- package/app/directives/header/header.directive.d.ts +5 -5
- package/app/enums/button-type.enum.d.ts +7 -7
- package/app/enums/page-change-type.enum.d.ts +4 -4
- package/app/enums/pagination-strategy.enum.d.ts +5 -5
- package/app/enums/row-type.enum.d.ts +5 -5
- package/app/enums/state.enum.d.ts +9 -9
- package/app/fs-list.module.d.ts +6 -6
- package/app/fs-list.providers.d.ts +3 -3
- package/app/interfaces/cellconfig.interface.d.ts +5 -5
- package/app/interfaces/draggable-list.interface.d.ts +7 -7
- package/app/interfaces/external-params.interface.d.ts +13 -13
- package/app/interfaces/index.d.ts +3 -3
- package/app/interfaces/listconfig.interface.d.ts +220 -220
- package/app/interfaces/pagination.interface.d.ts +13 -13
- package/app/models/column.model.d.ts +48 -46
- package/app/models/row/base-row.d.ts +13 -13
- package/app/models/row/child-row.d.ts +12 -12
- package/app/models/row/group-row.d.ts +14 -14
- package/app/models/row/simple-row.d.ts +5 -5
- package/app/models/row-action.model.d.ts +29 -29
- package/app/models/row.d.ts +28 -28
- package/app/models/styleConfig.model.d.ts +31 -31
- package/app/services/group-expand-notifier.service.d.ts +8 -8
- package/bundles/firestitch-list.umd.js +5814 -5784
- package/bundles/firestitch-list.umd.js.map +1 -1
- package/bundles/firestitch-list.umd.min.js +1 -1
- package/bundles/firestitch-list.umd.min.js.map +1 -1
- package/esm2015/app/classes/actions-controller.js +55 -55
- package/esm2015/app/classes/columns-controller.js +185 -185
- package/esm2015/app/classes/data-controller.js +317 -311
- package/esm2015/app/classes/external-params-controller.js +155 -155
- package/esm2015/app/classes/index.js +3 -3
- package/esm2015/app/classes/list-controller.js +730 -730
- package/esm2015/app/classes/pagination-controller.js +461 -461
- package/esm2015/app/classes/persistance-controller.js +22 -22
- package/esm2015/app/classes/reorder-controller.js +161 -161
- package/esm2015/app/classes/selection-controller.js +444 -444
- package/esm2015/app/classes/sorting-controller.js +181 -172
- package/esm2015/app/components/body/body.component.js +103 -103
- package/esm2015/app/components/body/row/actions/actions.component.js +110 -110
- package/esm2015/app/components/body/row/cell/cell.component.js +93 -93
- package/esm2015/app/components/body/row/inline-action/inline-action.component.js +34 -34
- package/esm2015/app/components/body/row/row.component.js +267 -267
- package/esm2015/app/components/customize-cols/customize-cols.component.js +67 -67
- package/esm2015/app/components/footer/footer-row/footer-cell/footer-cell.component.js +18 -18
- package/esm2015/app/components/footer/footer-row/footer-row.component.js +35 -35
- package/esm2015/app/components/footer/footer.component.js +30 -30
- package/esm2015/app/components/head/head-cell/head-cell.component.js +35 -35
- package/esm2015/app/components/head/head.component.js +99 -99
- package/esm2015/app/components/list/list.component.js +357 -357
- package/esm2015/app/components/loader/loader.component.js +46 -46
- package/esm2015/app/components/manage-saved-filters/manage-saved-filters.component.js +75 -75
- package/esm2015/app/components/pagination/pagination.component.js +44 -44
- package/esm2015/app/components/saved-filters/saved-filters.component.js +36 -36
- package/esm2015/app/components/status/status.component.js +77 -77
- package/esm2015/app/directives/cell/cell.directive.js +21 -21
- package/esm2015/app/directives/column/column.directive.js +97 -93
- package/esm2015/app/directives/draggable-list/draggable-list.directive.js +264 -264
- package/esm2015/app/directives/draggable-row/draggable-row.directive.js +81 -81
- package/esm2015/app/directives/empty-state/empty-state.directive.js +11 -11
- package/esm2015/app/directives/footer/footer.directive.js +21 -21
- package/esm2015/app/directives/group-cell/group-cell.directive.js +12 -12
- package/esm2015/app/directives/group-expand-trigger/group-expand-trigger.directive.js +32 -32
- package/esm2015/app/directives/header/header.directive.js +21 -21
- package/esm2015/app/enums/button-type.enum.js +9 -9
- package/esm2015/app/enums/page-change-type.enum.js +6 -6
- package/esm2015/app/enums/pagination-strategy.enum.js +7 -7
- package/esm2015/app/enums/row-type.enum.js +7 -7
- package/esm2015/app/enums/state.enum.js +11 -11
- package/esm2015/app/fs-list.module.js +140 -140
- package/esm2015/app/fs-list.providers.js +4 -4
- package/esm2015/app/interfaces/cellconfig.interface.js +1 -1
- package/esm2015/app/interfaces/draggable-list.interface.js +1 -1
- package/esm2015/app/interfaces/external-params.interface.js +1 -1
- package/esm2015/app/interfaces/index.js +1 -1
- package/esm2015/app/interfaces/listconfig.interface.js +1 -1
- package/esm2015/app/interfaces/pagination.interface.js +1 -1
- package/esm2015/app/models/column.model.js +185 -175
- package/esm2015/app/models/row/base-row.js +23 -23
- package/esm2015/app/models/row/child-row.js +28 -28
- package/esm2015/app/models/row/group-row.js +41 -41
- package/esm2015/app/models/row/simple-row.js +10 -10
- package/esm2015/app/models/row-action.model.js +115 -115
- package/esm2015/app/models/row.js +77 -77
- package/esm2015/app/models/styleConfig.model.js +86 -86
- package/esm2015/app/services/group-expand-notifier.service.js +25 -25
- package/esm2015/firestitch-list.js +17 -17
- package/esm2015/public_api.js +40 -40
- package/esm5/app/classes/actions-controller.js +71 -71
- package/esm5/app/classes/columns-controller.js +236 -236
- package/esm5/app/classes/data-controller.js +373 -365
- package/esm5/app/classes/external-params-controller.js +185 -185
- package/esm5/app/classes/index.js +3 -3
- package/esm5/app/classes/list-controller.js +749 -749
- package/esm5/app/classes/pagination-controller.js +568 -568
- package/esm5/app/classes/persistance-controller.js +25 -25
- package/esm5/app/classes/reorder-controller.js +195 -195
- package/esm5/app/classes/selection-controller.js +465 -465
- package/esm5/app/classes/sorting-controller.js +204 -195
- package/esm5/app/components/body/body.component.js +104 -104
- package/esm5/app/components/body/row/actions/actions.component.js +113 -113
- package/esm5/app/components/body/row/cell/cell.component.js +95 -95
- package/esm5/app/components/body/row/inline-action/inline-action.component.js +35 -35
- package/esm5/app/components/body/row/row.component.js +295 -295
- package/esm5/app/components/customize-cols/customize-cols.component.js +69 -69
- package/esm5/app/components/footer/footer-row/footer-cell/footer-cell.component.js +20 -20
- package/esm5/app/components/footer/footer-row/footer-row.component.js +38 -38
- package/esm5/app/components/footer/footer.component.js +31 -31
- package/esm5/app/components/head/head-cell/head-cell.component.js +38 -38
- package/esm5/app/components/head/head.component.js +106 -106
- package/esm5/app/components/list/list.component.js +391 -391
- package/esm5/app/components/loader/loader.component.js +47 -47
- package/esm5/app/components/manage-saved-filters/manage-saved-filters.component.js +81 -81
- package/esm5/app/components/pagination/pagination.component.js +46 -46
- package/esm5/app/components/saved-filters/saved-filters.component.js +41 -41
- package/esm5/app/components/status/status.component.js +79 -79
- package/esm5/app/directives/cell/cell.directive.js +24 -24
- package/esm5/app/directives/column/column.directive.js +98 -94
- package/esm5/app/directives/draggable-list/draggable-list.directive.js +281 -281
- package/esm5/app/directives/draggable-row/draggable-row.directive.js +83 -83
- package/esm5/app/directives/empty-state/empty-state.directive.js +14 -14
- package/esm5/app/directives/footer/footer.directive.js +24 -24
- package/esm5/app/directives/group-cell/group-cell.directive.js +17 -17
- package/esm5/app/directives/group-expand-trigger/group-expand-trigger.directive.js +33 -33
- package/esm5/app/directives/header/header.directive.js +24 -24
- package/esm5/app/enums/button-type.enum.js +9 -9
- package/esm5/app/enums/page-change-type.enum.js +6 -6
- package/esm5/app/enums/pagination-strategy.enum.js +7 -7
- package/esm5/app/enums/row-type.enum.js +7 -7
- package/esm5/app/enums/state.enum.js +11 -11
- package/esm5/app/fs-list.module.js +145 -145
- package/esm5/app/fs-list.providers.js +4 -4
- package/esm5/app/interfaces/cellconfig.interface.js +1 -1
- package/esm5/app/interfaces/draggable-list.interface.js +1 -1
- package/esm5/app/interfaces/external-params.interface.js +1 -1
- package/esm5/app/interfaces/index.js +1 -1
- package/esm5/app/interfaces/listconfig.interface.js +1 -1
- package/esm5/app/interfaces/pagination.interface.js +1 -1
- package/esm5/app/models/column.model.js +204 -194
- package/esm5/app/models/row/base-row.js +35 -35
- package/esm5/app/models/row/child-row.js +43 -43
- package/esm5/app/models/row/group-row.js +61 -61
- package/esm5/app/models/row/simple-row.js +15 -15
- package/esm5/app/models/row-action.model.js +126 -126
- package/esm5/app/models/row.js +126 -126
- package/esm5/app/models/styleConfig.model.js +91 -91
- package/esm5/app/services/group-expand-notifier.service.js +30 -30
- package/esm5/firestitch-list.js +17 -17
- package/esm5/public_api.js +40 -40
- package/fesm2015/firestitch-list.js +5174 -5146
- package/fesm2015/firestitch-list.js.map +1 -1
- package/fesm5/firestitch-list.js +5799 -5769
- package/fesm5/firestitch-list.js.map +1 -1
- package/firestitch-list.d.ts +18 -18
- package/firestitch-list.metadata.json +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +33 -33
|
@@ -1,730 +1,730 @@
|
|
|
1
|
-
import { __decorate, __metadata } from "tslib";
|
|
2
|
-
import { ItemType } from '@firestitch/filter';
|
|
3
|
-
import { Alias, Model } from 'tsmodels';
|
|
4
|
-
import { BehaviorSubject, combineLatest, from, Observable, of, Subject } from 'rxjs';
|
|
5
|
-
import { catchError, debounceTime, map, mapTo, switchMap, take, takeUntil, tap, } from 'rxjs/operators';
|
|
6
|
-
import { cloneDeep } from 'lodash-es';
|
|
7
|
-
import { SortingDirection } from '../models/column.model';
|
|
8
|
-
import { StyleConfig } from '../models/styleConfig.model';
|
|
9
|
-
import { RowAction } from '../models/row-action.model';
|
|
10
|
-
import { ColumnsController } from './columns-controller';
|
|
11
|
-
import { PageChangeType } from '../enums/page-change-type.enum';
|
|
12
|
-
import { ActionsController } from './index';
|
|
13
|
-
import { DataController } from './data-controller';
|
|
14
|
-
import { PaginationController } from './pagination-controller';
|
|
15
|
-
import { SelectionController } from './selection-controller';
|
|
16
|
-
import { SortingController } from './sorting-controller';
|
|
17
|
-
import { FsListState } from '../enums/state.enum';
|
|
18
|
-
import { ExternalParamsController } from './external-params-controller';
|
|
19
|
-
const SHOW_DELETED_FILTERS_KEY = '$$_show_deleted_$$';
|
|
20
|
-
export class List extends Model {
|
|
21
|
-
constructor(el, config = {}, fsScroll, selectionDialog, router, route, persistance, inDialog) {
|
|
22
|
-
super();
|
|
23
|
-
this.el = el;
|
|
24
|
-
this.config = config;
|
|
25
|
-
this.fsScroll = fsScroll;
|
|
26
|
-
this.selectionDialog = selectionDialog;
|
|
27
|
-
this.router = router;
|
|
28
|
-
this.route = route;
|
|
29
|
-
this.persistance = persistance;
|
|
30
|
-
this.inDialog = inDialog;
|
|
31
|
-
this.filters = [];
|
|
32
|
-
this.scrollable = false;
|
|
33
|
-
// @Alias('rows') private _rows: any;
|
|
34
|
-
this.initialized$ = new BehaviorSubject(false);
|
|
35
|
-
this.loading$ = new BehaviorSubject(false);
|
|
36
|
-
this.paging = new PaginationController();
|
|
37
|
-
this.columns = new ColumnsController();
|
|
38
|
-
this.actions = new ActionsController();
|
|
39
|
-
this.dataController = new DataController();
|
|
40
|
-
this.sorting = new SortingController();
|
|
41
|
-
this.filterConfig = null;
|
|
42
|
-
this.fetch$ = new Subject();
|
|
43
|
-
this.fetchComplete$ = new Subject();
|
|
44
|
-
this.filtersReady$ = new Subject();
|
|
45
|
-
this.status = true;
|
|
46
|
-
this.chips = false;
|
|
47
|
-
this.filterInput = true;
|
|
48
|
-
this.queryParam = false;
|
|
49
|
-
this.restoreMode = false;
|
|
50
|
-
this.initialFetch = true;
|
|
51
|
-
// Empty state
|
|
52
|
-
this.emptyStateEnabled = false;
|
|
53
|
-
this.onDestroy$ = new Subject();
|
|
54
|
-
this._fromJSON(config);
|
|
55
|
-
this.initialize(config);
|
|
56
|
-
this._headerConfig = new StyleConfig(config.header);
|
|
57
|
-
this._groupCellConfig = new StyleConfig(config.cell);
|
|
58
|
-
this._cellConfig = new StyleConfig(config.cell);
|
|
59
|
-
this._footerConfig = new StyleConfig(config.footer);
|
|
60
|
-
this.initialized$.next(true);
|
|
61
|
-
this.subscribe();
|
|
62
|
-
if (this.initialFetch) {
|
|
63
|
-
this.dataController.setOperation(FsListState.Load);
|
|
64
|
-
this.fetch$.next();
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
get hasSavedFilters() {
|
|
68
|
-
return !!this.filterConfig.savedFilters;
|
|
69
|
-
}
|
|
70
|
-
fetchRemote(query) {
|
|
71
|
-
const options = {
|
|
72
|
-
state: this.dataController.operation,
|
|
73
|
-
};
|
|
74
|
-
const result = this.fetchFn(query, options);
|
|
75
|
-
return result instanceof Promise ? from(result) : result;
|
|
76
|
-
}
|
|
77
|
-
// public loadLocal() {
|
|
78
|
-
// this.paging.updatePagingManual(this._rows);
|
|
79
|
-
// const from = (this.paging.page - 1) * this.paging.limit;
|
|
80
|
-
// const to = (this.paging.page === 1) ? this.paging.limit : this.paging.limit * this.paging.page;
|
|
81
|
-
// const sliceOfRows = this._rows.slice(from, to);
|
|
82
|
-
// this.data$.next(sliceOfRows);
|
|
83
|
-
// }
|
|
84
|
-
/**
|
|
85
|
-
* Transform templates for using
|
|
86
|
-
* @param templates
|
|
87
|
-
*/
|
|
88
|
-
tranformTemplatesToColumns(templates) {
|
|
89
|
-
const defaultConfigs = {
|
|
90
|
-
header: this._headerConfig,
|
|
91
|
-
groupCell: this._groupCellConfig,
|
|
92
|
-
cell: this._cellConfig,
|
|
93
|
-
footer: this._footerConfig,
|
|
94
|
-
};
|
|
95
|
-
this.columns.setDefaults(defaultConfigs);
|
|
96
|
-
this.columns.initializeColumns(templates);
|
|
97
|
-
// Set sortBy default column
|
|
98
|
-
this.sorting.clearSortableColumns();
|
|
99
|
-
this.columns.columns
|
|
100
|
-
.filter((column) => column.sortable && column.show)
|
|
101
|
-
.forEach((column) => {
|
|
102
|
-
this.sorting.addSortableColumn(column);
|
|
103
|
-
});
|
|
104
|
-
// Default sort by
|
|
105
|
-
const externalSorting = this.externalParams.externalSorting;
|
|
106
|
-
const initialSortConfig = externalSorting || this.config.sort;
|
|
107
|
-
this.sorting.initialSortBy(initialSortConfig);
|
|
108
|
-
if (externalSorting && !this.sorting.isDefined) {
|
|
109
|
-
this.externalParams.clearSortingParams();
|
|
110
|
-
console.warn('Not able to restore persisted sorting params.', externalSorting);
|
|
111
|
-
}
|
|
112
|
-
this.initFilters();
|
|
113
|
-
this.initInfinityScroll();
|
|
114
|
-
}
|
|
115
|
-
reload() {
|
|
116
|
-
this.loading$.next(true);
|
|
117
|
-
this.dataController.setOperation(FsListState.Reload);
|
|
118
|
-
if (this.fsScrollInstance) {
|
|
119
|
-
this.paging.resetPaging();
|
|
120
|
-
this.dataController.clearRows();
|
|
121
|
-
this.fsScrollInstance.reload();
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
124
|
-
this.fetch$.next();
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Watch page changes
|
|
129
|
-
*/
|
|
130
|
-
subscribe() {
|
|
131
|
-
this.paging.pageChanged$
|
|
132
|
-
.pipe(takeUntil(this.onDestroy$))
|
|
133
|
-
.subscribe((event) => {
|
|
134
|
-
this.dataController.setOperation(FsListState.PageChange);
|
|
135
|
-
// Remove all rows if limits was changed
|
|
136
|
-
if (event.type === PageChangeType.LimitChanged && this.paging.hasPageStrategy) {
|
|
137
|
-
this.dataController.clearRows();
|
|
138
|
-
}
|
|
139
|
-
if (this.paging.hasOffsetStrategy) {
|
|
140
|
-
this.paging.updatePagination();
|
|
141
|
-
if (this.selection) {
|
|
142
|
-
this.selection.updateVisibleRecordsCount(this.paging.getVisibleRecords());
|
|
143
|
-
this.selection.updateTotalRecordsCount(this.paging.records);
|
|
144
|
-
this.selection.pageChanged(this.scrollable);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
if (!this.scrollable && !this.paging.loadMoreEnabled) {
|
|
148
|
-
const contains = [].slice.call(document.querySelectorAll('.cdk-overlay-container')).some(overlay => {
|
|
149
|
-
return this.el.nativeElement.contains(overlay);
|
|
150
|
-
});
|
|
151
|
-
let el = this.el.nativeElement;
|
|
152
|
-
if (!contains) {
|
|
153
|
-
const rect = this.el.nativeElement.getBoundingClientRect();
|
|
154
|
-
if ((rect.top + window.pageYOffset) < window.innerHeight) {
|
|
155
|
-
el = document.body;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
this.fetchComplete$.asObservable()
|
|
159
|
-
.pipe(take(1), takeUntil(this.onDestroy$))
|
|
160
|
-
.subscribe(() => {
|
|
161
|
-
el.scrollIntoView({ behavior: 'smooth' });
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
this.fetch$.next();
|
|
165
|
-
});
|
|
166
|
-
this.sorting.sortingChanged$
|
|
167
|
-
.pipe(takeUntil(this.onDestroy$))
|
|
168
|
-
.subscribe(() => {
|
|
169
|
-
this.dataController.setOperation(FsListState.Sort);
|
|
170
|
-
this.paging.page = 1;
|
|
171
|
-
if (this.fsScrollInstance) {
|
|
172
|
-
this.dataController.clearRows();
|
|
173
|
-
this.fsScrollInstance.reload();
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
this.fetch$.next();
|
|
177
|
-
}
|
|
178
|
-
});
|
|
179
|
-
this.listenRowsRemove();
|
|
180
|
-
this.listenFetch();
|
|
181
|
-
}
|
|
182
|
-
getData(trackBy) {
|
|
183
|
-
let rowsData = this.dataController
|
|
184
|
-
.visibleRowsData;
|
|
185
|
-
if (trackBy) {
|
|
186
|
-
rowsData = rowsData
|
|
187
|
-
.filter(trackBy);
|
|
188
|
-
}
|
|
189
|
-
return rowsData
|
|
190
|
-
.map((data) => {
|
|
191
|
-
return cloneDeep(data);
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
hasData(trackBy) {
|
|
195
|
-
return this.dataController.visibleRowsData.some(trackBy);
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* Toggle group mode status
|
|
199
|
-
* @param value
|
|
200
|
-
*/
|
|
201
|
-
groupEnabled(value) {
|
|
202
|
-
if (this.dataController.groupEnabled !== value) {
|
|
203
|
-
this.dataController.groupEnabled = value;
|
|
204
|
-
// Commented out because Ray wants to change group status in fetch map pipe
|
|
205
|
-
// and it triggers extra requests
|
|
206
|
-
// this.reload();
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
destroy() {
|
|
210
|
-
if (this._fsScrollSubscription) {
|
|
211
|
-
this._fsScrollSubscription.unsubscribe();
|
|
212
|
-
}
|
|
213
|
-
if (this.paging) {
|
|
214
|
-
this.paging.destroy();
|
|
215
|
-
}
|
|
216
|
-
if (this.sorting) {
|
|
217
|
-
this.sorting.destroy();
|
|
218
|
-
}
|
|
219
|
-
if (this.selection) {
|
|
220
|
-
this.selection.destroy();
|
|
221
|
-
}
|
|
222
|
-
if (this.filterConfig) {
|
|
223
|
-
this.filterConfig = null;
|
|
224
|
-
}
|
|
225
|
-
if (this.externalParams) {
|
|
226
|
-
this.externalParams.destroy();
|
|
227
|
-
}
|
|
228
|
-
this.columns.destroy();
|
|
229
|
-
this.onDestroy$.next();
|
|
230
|
-
this.onDestroy$.complete();
|
|
231
|
-
this.dataController.destroy();
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* Do initialization of table
|
|
235
|
-
* @param config
|
|
236
|
-
*/
|
|
237
|
-
initialize(config) {
|
|
238
|
-
this.columns.initConfig(config.column);
|
|
239
|
-
this.initDefaultOptions(config);
|
|
240
|
-
this.initRestore();
|
|
241
|
-
this.initActions(config.actions);
|
|
242
|
-
this.initPaging(config.paging, config.loadMore);
|
|
243
|
-
this.initSelection(config.selection, this.selectionDialog);
|
|
244
|
-
this.initGroups(config.group);
|
|
245
|
-
this.initExternalParamsController();
|
|
246
|
-
this.initializeData();
|
|
247
|
-
}
|
|
248
|
-
/**
|
|
249
|
-
* Just init options by default it it wasn't specified
|
|
250
|
-
* @param config
|
|
251
|
-
*/
|
|
252
|
-
initDefaultOptions(config) {
|
|
253
|
-
// We should prevent initial fetch in cases when it will be fetched in any case
|
|
254
|
-
// As ex. scrollable or filter will do fetch in any cases
|
|
255
|
-
if (config.initialFetch === false || config.scrollable) { // TODO fixme after tsmodel version update
|
|
256
|
-
this.initialFetch = false;
|
|
257
|
-
}
|
|
258
|
-
if (config.status === false) {
|
|
259
|
-
this.status = false;
|
|
260
|
-
}
|
|
261
|
-
if (config.chips) {
|
|
262
|
-
this.chips = config.chips;
|
|
263
|
-
}
|
|
264
|
-
if (config.filterInput === false) {
|
|
265
|
-
this.filterInput = false;
|
|
266
|
-
}
|
|
267
|
-
if (this.inDialog) {
|
|
268
|
-
this.queryParam = false;
|
|
269
|
-
}
|
|
270
|
-
else {
|
|
271
|
-
this.queryParam = (config.queryParam === void 0)
|
|
272
|
-
? true
|
|
273
|
-
: config.queryParam;
|
|
274
|
-
}
|
|
275
|
-
if (config.sorts) {
|
|
276
|
-
this.sorting.initFakeColumns(config.sorts);
|
|
277
|
-
}
|
|
278
|
-
if (!config.trackBy) {
|
|
279
|
-
this.trackBy = 'id';
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
/**
|
|
283
|
-
* Init restore row action and append Show Deleted option into filters
|
|
284
|
-
*/
|
|
285
|
-
initRestore() {
|
|
286
|
-
if (this.restore) {
|
|
287
|
-
const restoreAction = new RowAction({
|
|
288
|
-
label: this.restore.menuLabel || 'Restore',
|
|
289
|
-
menu: true,
|
|
290
|
-
click: (row) => { this.restoreClick(this.restore.click, row); },
|
|
291
|
-
restore: true
|
|
292
|
-
});
|
|
293
|
-
if (!this.rowActionsRaw) {
|
|
294
|
-
this.rowActionsRaw = [];
|
|
295
|
-
}
|
|
296
|
-
this.rowActionsRaw.push(restoreAction);
|
|
297
|
-
if (!this.filters) {
|
|
298
|
-
this.filters = [];
|
|
299
|
-
}
|
|
300
|
-
if (this.restore.filter !== false) {
|
|
301
|
-
this.filters.push({
|
|
302
|
-
name: SHOW_DELETED_FILTERS_KEY,
|
|
303
|
-
type: ItemType.Checkbox,
|
|
304
|
-
label: this.restore.filterLabel || 'Show Deleted'
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
/**
|
|
310
|
-
* Init paging
|
|
311
|
-
* @param pagingConfig
|
|
312
|
-
* @param loadMore
|
|
313
|
-
*/
|
|
314
|
-
initPaging(pagingConfig, loadMore) {
|
|
315
|
-
this.paging.initWithConfig(pagingConfig, loadMore, !!this.scrollable);
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* Split actions by categories
|
|
319
|
-
*/
|
|
320
|
-
initActions(actions) {
|
|
321
|
-
if (actions) {
|
|
322
|
-
this.actions.setActions(actions);
|
|
323
|
-
}
|
|
324
|
-
this.hasRowActions =
|
|
325
|
-
(this.rowActionsRaw && this.rowActionsRaw.length > 0)
|
|
326
|
-
|| (this.groupActionsRaw && this.groupActionsRaw.length > 0);
|
|
327
|
-
}
|
|
328
|
-
initSelection(selectionConfig, selectionDialog) {
|
|
329
|
-
if (selectionConfig) {
|
|
330
|
-
this.selection = new SelectionController(selectionConfig, this.trackBy, selectionDialog);
|
|
331
|
-
this.selection.setRowsCallback(() => this.dataController.visibleRows);
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
initializeData() {
|
|
335
|
-
this.dataController.setAdditionalConfigs({
|
|
336
|
-
scrollable: !!this.scrollable,
|
|
337
|
-
loadMoreEnabled: this.paging.loadMoreEnabled
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
initGroups(groupConfig) {
|
|
341
|
-
if (groupConfig) {
|
|
342
|
-
this.dataController.setGroupConfig(groupConfig);
|
|
343
|
-
this.groupActionsRaw = groupConfig.actions;
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
initExternalParamsController() {
|
|
347
|
-
this.externalParams = new ExternalParamsController(this.router, this.route, this.persistance, this.paging, this.sorting, this.queryParam);
|
|
348
|
-
}
|
|
349
|
-
/**
|
|
350
|
-
* Subscribe to fetch$ event with debounce
|
|
351
|
-
*/
|
|
352
|
-
listenFetch() {
|
|
353
|
-
let fetch$ = this.fetch$.asObservable();
|
|
354
|
-
// Should wait until saved filters not loaded
|
|
355
|
-
if (!!this.filters && !!this.savedFilters) {
|
|
356
|
-
fetch$ = combineLatest([fetch$, this.filtersReady$])
|
|
357
|
-
.pipe(map(([params]) => params));
|
|
358
|
-
}
|
|
359
|
-
fetch$
|
|
360
|
-
.pipe(debounceTime(50), tap(() => {
|
|
361
|
-
this.loading$.next(true);
|
|
362
|
-
}), tap(() => {
|
|
363
|
-
var _a;
|
|
364
|
-
(_a = this.selection) === null || _a === void 0 ? void 0 : _a.closeSelectionDialog();
|
|
365
|
-
}), map((params) => {
|
|
366
|
-
const query = this.paging.hasOffsetStrategy && params && params.loadOffset
|
|
367
|
-
? Object.assign({}, this.filtersQuery, this.paging.loadDeletedOffsetQuery)
|
|
368
|
-
: Object.assign({}, this.filtersQuery, this.paging.query);
|
|
369
|
-
if (this.sorting.sortingColumn) {
|
|
370
|
-
Object.assign(query, {
|
|
371
|
-
order: `${this.sorting.sortingColumn.name},${this.sorting.sortingColumn.direction}`
|
|
372
|
-
});
|
|
373
|
-
}
|
|
374
|
-
return query;
|
|
375
|
-
}), switchMap((query) => {
|
|
376
|
-
if (this.columns.loadFnConfigured && !this.columns.columnsFetched) {
|
|
377
|
-
return this.columns.loadRemoteColumnConfigs()
|
|
378
|
-
.pipe(mapTo(query));
|
|
379
|
-
}
|
|
380
|
-
else {
|
|
381
|
-
return of(query);
|
|
382
|
-
}
|
|
383
|
-
}), switchMap((query) => {
|
|
384
|
-
if (this.columns.configured) {
|
|
385
|
-
Object.assign(query, {
|
|
386
|
-
columns: this.columns.visibleColumnsNames,
|
|
387
|
-
});
|
|
388
|
-
}
|
|
389
|
-
return combineLatest([of(query), this.fetchRemote(query)]);
|
|
390
|
-
}), catchError((error, source$) => {
|
|
391
|
-
console.error(error);
|
|
392
|
-
return source$;
|
|
393
|
-
}), takeUntil(this.onDestroy$))
|
|
394
|
-
.subscribe((response) => {
|
|
395
|
-
this.completeFetch(response);
|
|
396
|
-
});
|
|
397
|
-
}
|
|
398
|
-
listenRowsRemove() {
|
|
399
|
-
this.dataController.rowsRemoved$
|
|
400
|
-
.pipe(takeUntil(this.onDestroy$))
|
|
401
|
-
.subscribe((rows) => {
|
|
402
|
-
if (this.paging.enabled) {
|
|
403
|
-
const removedCount = rows.length;
|
|
404
|
-
if (this.paging.hasPageStrategy) {
|
|
405
|
-
this.noDataPaginationUpdate(removedCount);
|
|
406
|
-
}
|
|
407
|
-
else {
|
|
408
|
-
// Fetch more if has something for fetch
|
|
409
|
-
if (this.dataController.hasData || this.paging.hasNextPage) {
|
|
410
|
-
this.dataController.setOperation(FsListState.LoadMore);
|
|
411
|
-
this.paging.removeRows(removedCount);
|
|
412
|
-
this.fetch$.next({ loadOffset: true });
|
|
413
|
-
}
|
|
414
|
-
else {
|
|
415
|
-
this.noDataPaginationUpdate(removedCount);
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
// Remove from selection
|
|
420
|
-
if (this.selection) {
|
|
421
|
-
rows.forEach((row) => {
|
|
422
|
-
this.selection.removeRow(row.data);
|
|
423
|
-
});
|
|
424
|
-
}
|
|
425
|
-
});
|
|
426
|
-
}
|
|
427
|
-
initInfinityScroll() {
|
|
428
|
-
if (this.fsScrollInstance) {
|
|
429
|
-
return;
|
|
430
|
-
}
|
|
431
|
-
if (this.scrollable) {
|
|
432
|
-
// Scrollable status by default
|
|
433
|
-
if (this.scrollable.status === void 0) {
|
|
434
|
-
this.scrollable.status = true;
|
|
435
|
-
}
|
|
436
|
-
this.fsScroll
|
|
437
|
-
.component(this.scrollable.name)
|
|
438
|
-
.pipe(takeUntil(this.onDestroy$))
|
|
439
|
-
.subscribe((fsScrollInstance) => {
|
|
440
|
-
this.fsScrollInstance = fsScrollInstance;
|
|
441
|
-
this._fsScrollSubscription = fsScrollInstance
|
|
442
|
-
.subscribe(() => {
|
|
443
|
-
let startLoading = false;
|
|
444
|
-
const operation = this.dataController.operation;
|
|
445
|
-
// Initial loading if initialFetch equals false
|
|
446
|
-
if (!this.initialFetch
|
|
447
|
-
&& !this.paging.initialized
|
|
448
|
-
&& operation !== FsListState.Reload) {
|
|
449
|
-
this.dataController.setOperation(FsListState.Load);
|
|
450
|
-
startLoading = true;
|
|
451
|
-
}
|
|
452
|
-
else if (operation === FsListState.Reload ||
|
|
453
|
-
operation === FsListState.Filter ||
|
|
454
|
-
operation === FsListState.Sort) {
|
|
455
|
-
startLoading = true;
|
|
456
|
-
}
|
|
457
|
-
else if (this.paging.initialized && this.paging.hasNextPage) {
|
|
458
|
-
// Loading if content has been scrolled
|
|
459
|
-
startLoading = true;
|
|
460
|
-
this.dataController.setOperation(FsListState.Load);
|
|
461
|
-
this.paging.goNext();
|
|
462
|
-
}
|
|
463
|
-
if (startLoading) {
|
|
464
|
-
this.fetch$.next();
|
|
465
|
-
fsScrollInstance.loading();
|
|
466
|
-
}
|
|
467
|
-
});
|
|
468
|
-
this.dataController.remoteRowsChange$
|
|
469
|
-
.pipe(takeUntil(this.onDestroy$))
|
|
470
|
-
.subscribe(() => {
|
|
471
|
-
fsScrollInstance.loaded();
|
|
472
|
-
});
|
|
473
|
-
});
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
/**
|
|
477
|
-
* Update and watch filter changes
|
|
478
|
-
*/
|
|
479
|
-
initFilters() {
|
|
480
|
-
if (this.filterConfig) {
|
|
481
|
-
return;
|
|
482
|
-
}
|
|
483
|
-
// Merge sorting and fake sorting cols
|
|
484
|
-
// Fake sorting cols it's cols which don't represented in table cols, like abstract cols
|
|
485
|
-
const sortValues = [
|
|
486
|
-
...this.sorting.sortingColumns,
|
|
487
|
-
...this.sorting.fakeSortingColumns
|
|
488
|
-
].reduce((acc, column) => {
|
|
489
|
-
const sortingItem = {
|
|
490
|
-
name: column.title,
|
|
491
|
-
value: column.name,
|
|
492
|
-
default: this.sorting.sortingColumn && this.sorting.sortingColumn.name === column.name
|
|
493
|
-
};
|
|
494
|
-
acc.push(sortingItem);
|
|
495
|
-
return acc;
|
|
496
|
-
}, []);
|
|
497
|
-
const sortConfig = this.sorting.sortingColumn
|
|
498
|
-
? { value: this.sorting.sortingColumn.name, direction: this.sorting.sortingColumn.direction }
|
|
499
|
-
: null;
|
|
500
|
-
// Config
|
|
501
|
-
this.filterConfig = {
|
|
502
|
-
persist: this.persist,
|
|
503
|
-
items: this.filters || [],
|
|
504
|
-
savedFilters: this.savedFilters,
|
|
505
|
-
inline: this.inlineFilters,
|
|
506
|
-
actions: this.actions.actions,
|
|
507
|
-
queryParam: this.queryParam,
|
|
508
|
-
sorts: sortValues,
|
|
509
|
-
sort: sortConfig,
|
|
510
|
-
chips: this.chips,
|
|
511
|
-
init: this.filterInit.bind(this),
|
|
512
|
-
change: this.filterChange.bind(this),
|
|
513
|
-
reload: this.reload.bind(this),
|
|
514
|
-
sortChange: this.filterSort.bind(this),
|
|
515
|
-
};
|
|
516
|
-
}
|
|
517
|
-
/**
|
|
518
|
-
* Callback when Filter has been initialized
|
|
519
|
-
* @param filters
|
|
520
|
-
*/
|
|
521
|
-
filterInit(filters) {
|
|
522
|
-
if (this.filterInitCb) {
|
|
523
|
-
this.filterInitCb(filters);
|
|
524
|
-
}
|
|
525
|
-
this.filtersQuery = filters;
|
|
526
|
-
this.checkRestoreFilter();
|
|
527
|
-
}
|
|
528
|
-
/**
|
|
529
|
-
* Callback when Filter has been changed
|
|
530
|
-
* @param filterQuery
|
|
531
|
-
* @param filterSort
|
|
532
|
-
*/
|
|
533
|
-
filterChange(filterQuery, filterSort) {
|
|
534
|
-
if (this.filterChangeCb) {
|
|
535
|
-
this.filterChangeCb(filterQuery, filterSort);
|
|
536
|
-
}
|
|
537
|
-
this.filtersQuery = filterQuery;
|
|
538
|
-
this.restoreMode = false;
|
|
539
|
-
// Restore option
|
|
540
|
-
this.checkRestoreFilter();
|
|
541
|
-
if (this.restore && this.restore.reload) {
|
|
542
|
-
this.reload();
|
|
543
|
-
}
|
|
544
|
-
this.dataController.setOperation(FsListState.Filter);
|
|
545
|
-
// Reset paging for request with correct offset
|
|
546
|
-
this.paging.resetPaging();
|
|
547
|
-
if (this.fsScrollInstance) {
|
|
548
|
-
this.dataController.clearRows();
|
|
549
|
-
this.fsScrollInstance.reload();
|
|
550
|
-
}
|
|
551
|
-
else {
|
|
552
|
-
this.fetch$.next();
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
checkRestoreFilter() {
|
|
556
|
-
// Restore option
|
|
557
|
-
if (this.restore && this.filtersQuery[SHOW_DELETED_FILTERS_KEY]) {
|
|
558
|
-
delete this.filtersQuery[SHOW_DELETED_FILTERS_KEY];
|
|
559
|
-
Object.assign(this.filtersQuery, this.restore.query);
|
|
560
|
-
this.restoreMode = true;
|
|
561
|
-
}
|
|
562
|
-
}
|
|
563
|
-
// Callback when Filter sort has been changed
|
|
564
|
-
filterSort(filterQuery, filterSort) {
|
|
565
|
-
if (filterSort) {
|
|
566
|
-
this.sorting.sortByColumnWithName(filterSort.value);
|
|
567
|
-
const sortDirection = filterSort.direction === 'asc' ? SortingDirection.asc : SortingDirection.desc;
|
|
568
|
-
this.sorting.sortDirection(sortDirection);
|
|
569
|
-
}
|
|
570
|
-
else {
|
|
571
|
-
// FIXME need to be refactored...
|
|
572
|
-
this.sorting.sortingColumn = void 0;
|
|
573
|
-
this.reload();
|
|
574
|
-
}
|
|
575
|
-
}
|
|
576
|
-
completeFetch([query, response]) {
|
|
577
|
-
var _a;
|
|
578
|
-
if (!this.paging.page) {
|
|
579
|
-
this.paging.page = 1;
|
|
580
|
-
}
|
|
581
|
-
if (response.paging) {
|
|
582
|
-
const displayed = (Array.isArray(response.data) && response.data.length) || 0;
|
|
583
|
-
this.paging.updatePaging(response.paging, displayed, this.dataController.operation === FsListState.LoadMore);
|
|
584
|
-
}
|
|
585
|
-
else if (this.paging.enabled) {
|
|
586
|
-
console.log('%c FsList Warning ', 'color: white; background-color: #ffcc0b', 'Pagination does not configured properly. ' +
|
|
587
|
-
'Pagination is enabled, but http response does not contain "paging" field. ' +
|
|
588
|
-
'You have to set "paging: false" in config or add "paging" field to response.');
|
|
589
|
-
}
|
|
590
|
-
/// must be before selection, because seletion use records
|
|
591
|
-
this.dataController.setRowsFromResponse(response.data);
|
|
592
|
-
///
|
|
593
|
-
// Update selection params
|
|
594
|
-
if (this.selection) {
|
|
595
|
-
if (this.paging.enabled) {
|
|
596
|
-
this.selection.pageChanged(this.scrollable);
|
|
597
|
-
this.selection.updateVisibleRecordsCount(this.paging.getVisibleRecords());
|
|
598
|
-
this.selection.updateTotalRecordsCount(this.paging.records);
|
|
599
|
-
}
|
|
600
|
-
else {
|
|
601
|
-
const count = response.paging && response.paging.records
|
|
602
|
-
|| Array.isArray(response.data) && response.data.length;
|
|
603
|
-
this.selection.updateVisibleRecordsCount(count);
|
|
604
|
-
this.selection.updateTotalRecordsCount(count);
|
|
605
|
-
}
|
|
606
|
-
this.selection.selectedRowsIntersection(this.dataController.visibleRowsData);
|
|
607
|
-
}
|
|
608
|
-
if (((_a = this.emptyState) === null || _a === void 0 ? void 0 : _a.validate) && this.emptyStateTemplate) {
|
|
609
|
-
this.emptyStateEnabled = this.emptyState.validate(query, cloneDeep(response.data));
|
|
610
|
-
}
|
|
611
|
-
this.fetchComplete$.next();
|
|
612
|
-
this.loading$.next(false);
|
|
613
|
-
}
|
|
614
|
-
/**
|
|
615
|
-
* Will do some actions if you removed item and item was last on his own page
|
|
616
|
-
*
|
|
617
|
-
* Ex: if list has 3 pages and on third page you have only one item. And you just deleted this item.
|
|
618
|
-
* You must go to second page, but if it was last page and you can't go back -> just reload
|
|
619
|
-
*
|
|
620
|
-
* @param deletedCount
|
|
621
|
-
*/
|
|
622
|
-
noDataPaginationUpdate(deletedCount) {
|
|
623
|
-
if (!this.dataController.hasData) {
|
|
624
|
-
if (this.paging.page > 1) {
|
|
625
|
-
this.paging.goToPage(this.paging.page - 1 || 1);
|
|
626
|
-
}
|
|
627
|
-
else {
|
|
628
|
-
this.reload();
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
this.paging.records -= deletedCount;
|
|
632
|
-
this.paging.updatePagination();
|
|
633
|
-
if (this.dataController.hasData && this.selection) {
|
|
634
|
-
this.selection.updateVisibleRecordsCount(this.dataController.visibleRowsCount);
|
|
635
|
-
this.selection.updateTotalRecordsCount(this.paging.records);
|
|
636
|
-
}
|
|
637
|
-
}
|
|
638
|
-
/**
|
|
639
|
-
* Temporary solution, will do auto subscribe if was returned Observable.
|
|
640
|
-
*
|
|
641
|
-
* TODO: MOVE THIS PEACE OF CODE TO SPECIAL PLACE
|
|
642
|
-
*
|
|
643
|
-
* @param restoreClickCallback
|
|
644
|
-
* @param row
|
|
645
|
-
*/
|
|
646
|
-
restoreClick(restoreClickCallback, row) {
|
|
647
|
-
const restoreClickResult = restoreClickCallback(row);
|
|
648
|
-
if (restoreClickResult instanceof Observable) {
|
|
649
|
-
restoreClickResult
|
|
650
|
-
.pipe(take(1), takeUntil(this.onDestroy$))
|
|
651
|
-
.subscribe({
|
|
652
|
-
next: () => this.reload(),
|
|
653
|
-
error: () => { },
|
|
654
|
-
});
|
|
655
|
-
}
|
|
656
|
-
}
|
|
657
|
-
}
|
|
658
|
-
__decorate([
|
|
659
|
-
Alias(),
|
|
660
|
-
__metadata("design:type", String)
|
|
661
|
-
], List.prototype, "heading", void 0);
|
|
662
|
-
__decorate([
|
|
663
|
-
Alias(),
|
|
664
|
-
__metadata("design:type", String)
|
|
665
|
-
], List.prototype, "trackBy", void 0);
|
|
666
|
-
__decorate([
|
|
667
|
-
Alias(),
|
|
668
|
-
__metadata("design:type", String)
|
|
669
|
-
], List.prototype, "subheading", void 0);
|
|
670
|
-
__decorate([
|
|
671
|
-
Alias(),
|
|
672
|
-
__metadata("design:type", Object)
|
|
673
|
-
], List.prototype, "inlineFilters", void 0);
|
|
674
|
-
__decorate([
|
|
675
|
-
Alias('rowActions'),
|
|
676
|
-
__metadata("design:type", Array)
|
|
677
|
-
], List.prototype, "rowActionsRaw", void 0);
|
|
678
|
-
__decorate([
|
|
679
|
-
Alias('rowClass'),
|
|
680
|
-
__metadata("design:type", Object)
|
|
681
|
-
], List.prototype, "rowClass", void 0);
|
|
682
|
-
__decorate([
|
|
683
|
-
Alias(),
|
|
684
|
-
__metadata("design:type", Object)
|
|
685
|
-
], List.prototype, "rowEvents", void 0);
|
|
686
|
-
__decorate([
|
|
687
|
-
Alias(),
|
|
688
|
-
__metadata("design:type", Object)
|
|
689
|
-
], List.prototype, "restore", void 0);
|
|
690
|
-
__decorate([
|
|
691
|
-
Alias(),
|
|
692
|
-
__metadata("design:type", Object)
|
|
693
|
-
], List.prototype, "columnTemplates", void 0);
|
|
694
|
-
__decorate([
|
|
695
|
-
Alias(),
|
|
696
|
-
__metadata("design:type", Boolean)
|
|
697
|
-
], List.prototype, "persist", void 0);
|
|
698
|
-
__decorate([
|
|
699
|
-
Alias(),
|
|
700
|
-
__metadata("design:type", Object)
|
|
701
|
-
], List.prototype, "filters", void 0);
|
|
702
|
-
__decorate([
|
|
703
|
-
Alias('filterInit'),
|
|
704
|
-
__metadata("design:type", Function)
|
|
705
|
-
], List.prototype, "filterInitCb", void 0);
|
|
706
|
-
__decorate([
|
|
707
|
-
Alias('filterChange'),
|
|
708
|
-
__metadata("design:type", Function)
|
|
709
|
-
], List.prototype, "filterChangeCb", void 0);
|
|
710
|
-
__decorate([
|
|
711
|
-
Alias(),
|
|
712
|
-
__metadata("design:type", Object)
|
|
713
|
-
], List.prototype, "savedFilters", void 0);
|
|
714
|
-
__decorate([
|
|
715
|
-
Alias(),
|
|
716
|
-
__metadata("design:type", Object)
|
|
717
|
-
], List.prototype, "scrollable", void 0);
|
|
718
|
-
__decorate([
|
|
719
|
-
Alias(),
|
|
720
|
-
__metadata("design:type", Object)
|
|
721
|
-
], List.prototype, "noResults", void 0);
|
|
722
|
-
__decorate([
|
|
723
|
-
Alias(),
|
|
724
|
-
__metadata("design:type", Object)
|
|
725
|
-
], List.prototype, "emptyState", void 0);
|
|
726
|
-
__decorate([
|
|
727
|
-
Alias('fetch'),
|
|
728
|
-
__metadata("design:type", Function)
|
|
729
|
-
], List.prototype, "fetchFn", void 0);
|
|
730
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZpcmVzdGl0Y2gvbGlzdC8iLCJzb3VyY2VzIjpbImFwcC9jbGFzc2VzL2xpc3QtY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsT0FBTyxFQUFxRCxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUlqRyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV4QyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixJQUFJLEVBQ0osVUFBVSxFQUNWLEVBQUUsRUFDRixPQUFPLEVBRVIsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0wsVUFBVSxFQUNWLFlBQVksRUFDWixHQUFHLEVBQ0gsS0FBSyxFQUNMLFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNULEdBQUcsR0FDSixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFdEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFpQjFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlC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QUssRUFBRTs7dUNBQXVCO0FBQ3RCO0lBQVIsS0FBSyxFQUFFOztxQ0FBcUM7QUFDcEM7SUFBUixLQUFLLEVBQUU7OzZDQUE2QjtBQUM1QjtJQUFSLEtBQUssRUFBRTs7cUNBQXlCO0FBQ3hCO0lBQVIsS0FBSyxFQUFFOztxQ0FBcUI7QUFDUjtJQUFwQixLQUFLLENBQUMsWUFBWSxDQUFDOzswQ0FBK0I7QUFDNUI7SUFBdEIsS0FBSyxDQUFDLGNBQWMsQ0FBQzs7NENBQWlDO0FBQzlDO0lBQVIsS0FBSyxFQUFFOzswQ0FBZ0Q7QUFDL0M7SUFBUixLQUFLLEVBQUU7O3dDQUEyRDtBQUMxRDtJQUFSLEtBQUssRUFBRTs7dUNBQXlDO0FBQ3hDO0lBQVIsS0FBSyxFQUFFOzt3Q0FBMkM7QUFFbkM7SUFBZixLQUFLLENBQUMsT0FBTyxDQUFDOztxQ0FBK0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50UmVmLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgQ2hhbmdlRm4sIEZpbHRlckNvbmZpZywgSUZpbHRlclNhdmVkRmlsdGVyc0NvbmZpZywgSXRlbVR5cGUgfSBmcm9tICdAZmlyZXN0aXRjaC9maWx0ZXInO1xyXG5pbXBvcnQgeyBGc1Njcm9sbEluc3RhbmNlLCBGc1Njcm9sbFNlcnZpY2UgfSBmcm9tICdAZmlyZXN0aXRjaC9zY3JvbGwnO1xyXG5pbXBvcnQgeyBTZWxlY3Rpb25EaWFsb2cgfSBmcm9tICdAZmlyZXN0aXRjaC9zZWxlY3Rpb24nO1xyXG5cclxuaW1wb3J0IHsgQWxpYXMsIE1vZGVsIH0gZnJvbSAndHNtb2RlbHMnO1xyXG5cclxuaW1wb3J0IHtcclxuICBCZWhhdmlvclN1YmplY3QsXHJcbiAgY29tYmluZUxhdGVzdCxcclxuICBmcm9tLFxyXG4gIE9ic2VydmFibGUsXHJcbiAgb2YsXHJcbiAgU3ViamVjdCxcclxuICBTdWJzY3JpcHRpb25cclxufSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtcclxuICBjYXRjaEVycm9yLFxyXG4gIGRlYm91bmNlVGltZSxcclxuICBtYXAsXHJcbiAgbWFwVG8sXHJcbiAgc3dpdGNoTWFwLFxyXG4gIHRha2UsXHJcbiAgdGFrZVVudGlsLFxyXG4gIHRhcCxcclxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IGNsb25lRGVlcCB9IGZyb20gJ2xvZGFzaC1lcyc7XHJcblxyXG5pbXBvcnQgeyBTb3J0aW5nRGlyZWN0aW9uIH0gZnJvbSAnLi4vbW9kZWxzL2NvbHVtbi5tb2RlbCc7XHJcblxyXG4vLyBJbnRlcmZhY2VzXHJcbmltcG9ydCB7XHJcbiAgRnNMaXN0Q29uZmlnLFxyXG4gIEZzTGlzdEVtcHR5U3RhdGVDb25maWcsIEZzTGlzdEZldGNoRm4sIEZzTGlzdEZldGNoT3B0aW9ucyxcclxuICBGc0xpc3RGZXRjaFN1YnNjcmlwdGlvbixcclxuICBGc0xpc3RHcm91cENvbmZpZyxcclxuICBGc0xpc3RMb2FkTW9yZUNvbmZpZyxcclxuICBGc0xpc3ROb1Jlc3VsdHNDb25maWcsXHJcbiAgRnNMaXN0UmVzdG9yZUNvbmZpZyxcclxuICBGc0xpc3RTY3JvbGxhYmxlQ29uZmlnLFxyXG4gIEZzTGlzdFNlbGVjdGlvbkNvbmZpZyxcclxuICBGc0xpc3RUcmFja0J5Rm4sXHJcbiAgRnNQYWdpbmcsXHJcbiAgUGFnZUNoYW5nZVxyXG59IGZyb20gJy4uL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBTdHlsZUNvbmZpZyB9IGZyb20gJy4uL21vZGVscy9zdHlsZUNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IFJvd0FjdGlvbiB9IGZyb20gJy4uL21vZGVscy9yb3ctYWN0aW9uLm1vZGVsJztcclxuaW1wb3J0IHsgQ29sdW1uc0NvbnRyb2xsZXIgfSBmcm9tICcuL2NvbHVtbnMtY29udHJvbGxlcic7XHJcbmltcG9ydCB7IFBhZ2VDaGFuZ2VUeXBlIH0gZnJvbSAnLi4vZW51bXMvcGFnZS1jaGFuZ2UtdHlwZS5lbnVtJztcclxuaW1wb3J0IHsgQWN0aW9uc0NvbnRyb2xsZXIgfSBmcm9tICcuL2luZGV4JztcclxuaW1wb3J0IHsgRGF0YUNvbnRyb2xsZXIgfSBmcm9tICcuL2RhdGEtY29udHJvbGxlcic7XHJcbmltcG9ydCB7IFBhZ2luYXRpb25Db250cm9sbGVyIH0gZnJvbSAnLi9wYWdpbmF0aW9uLWNvbnRyb2xsZXInO1xyXG5pbXBvcnQgeyBTZWxlY3Rpb25Db250cm9sbGVyIH0gZnJvbSAnLi9zZWxlY3Rpb24tY29udHJvbGxlcic7XHJcbmltcG9ydCB7IFNvcnRpbmdDb250cm9sbGVyIH0gZnJvbSAnLi9zb3J0aW5nLWNvbnRyb2xsZXInO1xyXG5cclxuaW1wb3J0IHsgRnNMaXN0U3RhdGUgfSBmcm9tICcuLi9lbnVtcy9zdGF0ZS5lbnVtJztcclxuaW1wb3J0IHsgUGVyc2lzdGFuY2VDb250cm9sbGVyIH0gZnJvbSAnLi9wZXJzaXN0YW5jZS1jb250cm9sbGVyJztcclxuaW1wb3J0IHsgRXh0ZXJuYWxQYXJhbXNDb250cm9sbGVyIH0gZnJvbSAnLi9leHRlcm5hbC1wYXJhbXMtY29udHJvbGxlcic7XHJcblxyXG5jb25zdCBTSE9XX0RFTEVURURfRklMVEVSU19LRVkgPSAnJCRfc2hvd19kZWxldGVkXyQkJztcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgTGlzdCBleHRlbmRzIE1vZGVsIHtcclxuICBAQWxpYXMoKSBwdWJsaWMgaGVhZGluZzogc3RyaW5nO1xyXG4gIEBBbGlhcygpIHB1YmxpYyB0cmFja0J5OiBzdHJpbmc7XHJcbiAgQEFsaWFzKCkgcHVibGljIHN1YmhlYWRpbmc6IHN0cmluZztcclxuICBAQWxpYXMoKSBwdWJsaWMgaW5saW5lRmlsdGVyczogYW55O1xyXG4gIC8vIEBBbGlhcygnYWN0aW9ucycsIEFjdGlvbikgcHVibGljIGFjdGlvbnM6IEFjdGlvbltdO1xyXG4gIEBBbGlhcygncm93QWN0aW9ucycpIHB1YmxpYyByb3dBY3Rpb25zUmF3OiBhbnlbXTtcclxuICBwdWJsaWMgZ3JvdXBBY3Rpb25zUmF3OiBhbnlbXTtcclxuICBAQWxpYXMoJ3Jvd0NsYXNzJykgcHVibGljIHJvd0NsYXNzO1xyXG4gIEBBbGlhcygpIHB1YmxpYyByb3dFdmVudHM6IGFueTtcclxuICBAQWxpYXMoKSBwdWJsaWMgcmVzdG9yZTogRnNMaXN0UmVzdG9yZUNvbmZpZztcclxuICBAQWxpYXMoKSBwdWJsaWMgY29sdW1uVGVtcGxhdGVzOiBhbnk7XHJcbiAgQEFsaWFzKCkgcHVibGljIHBlcnNpc3Q6IGJvb2xlYW47XHJcbiAgQEFsaWFzKCkgcHVibGljIGZpbHRlcnMgPSBbXTtcclxuICBAQWxpYXMoJ2ZpbHRlckluaXQnKSBwdWJsaWMgZmlsdGVySW5pdENiOiBDaGFuZ2VGbjtcclxuICBAQWxpYXMoJ2ZpbHRlckNoYW5nZScpIHB1YmxpYyBmaWx0ZXJDaGFuZ2VDYjogQ2hhbmdlRm47XHJcbiAgQEFsaWFzKCkgcHVibGljIHNhdmVkRmlsdGVyczogSUZpbHRlclNhdmVkRmlsdGVyc0NvbmZpZztcclxuICBAQWxpYXMoKSBwdWJsaWMgc2Nyb2xsYWJsZTogRnNMaXN0U2Nyb2xsYWJsZUNvbmZpZyB8IGZhbHNlID0gZmFsc2U7XHJcbiAgQEFsaWFzKCkgcHVibGljIG5vUmVzdWx0czogRnNMaXN0Tm9SZXN1bHRzQ29uZmlnO1xyXG4gIEBBbGlhcygpIHB1YmxpYyBlbXB0eVN0YXRlOiBGc0xpc3RFbXB0eVN0YXRlQ29uZmlnO1xyXG4gIC8vIEBBbGlhcygpIHB1YmxpYyBpbml0aWFsRmV0Y2ggPSB0cnVlOyAvL1RPRE8gZml4bWVcclxuICBAQWxpYXMoJ2ZldGNoJykgcHVibGljIGZldGNoRm46IEZzTGlzdEZldGNoRm47XHJcbiAgLy8gQEFsaWFzKCdyb3dzJykgcHJpdmF0ZSBfcm93czogYW55O1xyXG5cclxuICBwdWJsaWMgaW5pdGlhbGl6ZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XHJcbiAgcHVibGljIGxvYWRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XHJcblxyXG4gIC8vIHB1YmxpYyBvcGVyYXRpb246IE9wZXJhdGlvbjtcclxuICBwdWJsaWMgZmlsdGVyc1F1ZXJ5OiBhbnk7XHJcblxyXG4gIHB1YmxpYyBoYXNSb3dBY3Rpb25zO1xyXG4gIHB1YmxpYyBwYWdpbmcgPSBuZXcgUGFnaW5hdGlvbkNvbnRyb2xsZXIoKTtcclxuXHJcbiAgcHVibGljIGNvbHVtbnMgPSBuZXcgQ29sdW1uc0NvbnRyb2xsZXIoKTtcclxuICBwdWJsaWMgYWN0aW9ucyA9IG5ldyBBY3Rpb25zQ29udHJvbGxlcigpO1xyXG4gIHB1YmxpYyBkYXRhQ29udHJvbGxlciA9IG5ldyBEYXRhQ29udHJvbGxlcigpO1xyXG4gIHB1YmxpYyBzb3J0aW5nID0gbmV3IFNvcnRpbmdDb250cm9sbGVyKCk7XHJcbiAgcHVibGljIGV4dGVybmFsUGFyYW1zOiBFeHRlcm5hbFBhcmFtc0NvbnRyb2xsZXI7XHJcbiAgcHVibGljIHNlbGVjdGlvbjogU2VsZWN0aW9uQ29udHJvbGxlcjtcclxuXHJcbiAgcHVibGljIGZpbHRlckNvbmZpZzogRmlsdGVyQ29uZmlnID0gbnVsbDtcclxuXHJcbiAgcHVibGljIGZldGNoJCA9IG5ldyBTdWJqZWN0PEZzTGlzdEZldGNoU3Vic2NyaXB0aW9uIHwgdm9pZD4oKTtcclxuICBwdWJsaWMgZmV0Y2hDb21wbGV0ZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIHB1YmxpYyBmaWx0ZXJzUmVhZHkkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgcHVibGljIHN0YXR1cyA9IHRydWU7XHJcbiAgcHVibGljIGNoaXBzID0gZmFsc2U7XHJcbiAgcHVibGljIGZpbHRlcklucHV0ID0gdHJ1ZTtcclxuICBwdWJsaWMgcXVlcnlQYXJhbSA9IGZhbHNlO1xyXG4gIHB1YmxpYyByZXN0b3JlTW9kZSA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgaW5pdGlhbEZldGNoID0gdHJ1ZTtcclxuXHJcbiAgLy8gRW1wdHkgc3RhdGVcclxuICBwdWJsaWMgZW1wdHlTdGF0ZUVuYWJsZWQgPSBmYWxzZTtcclxuICBwdWJsaWMgZW1wdHlTdGF0ZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBwdWJsaWMgZnNTY3JvbGxJbnN0YW5jZTogRnNTY3JvbGxJbnN0YW5jZTtcclxuXHJcbiAgcHVibGljIG9uRGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IF9oZWFkZXJDb25maWc6IFN0eWxlQ29uZmlnO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2dyb3VwQ2VsbENvbmZpZzogU3R5bGVDb25maWc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfY2VsbENvbmZpZzogU3R5bGVDb25maWc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfZm9vdGVyQ29uZmlnOiBTdHlsZUNvbmZpZztcclxuXHJcbiAgcHJpdmF0ZSBfZnNTY3JvbGxTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSBjb25maWc6IEZzTGlzdENvbmZpZyA9IHt9LFxyXG4gICAgcHJpdmF0ZSBmc1Njcm9sbDogRnNTY3JvbGxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzZWxlY3Rpb25EaWFsb2c6IFNlbGVjdGlvbkRpYWxvZyxcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgcGVyc2lzdGFuY2U6IFBlcnNpc3RhbmNlQ29udHJvbGxlcixcclxuICAgIHByaXZhdGUgaW5EaWFsb2c6IGJvb2xlYW4sXHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5fZnJvbUpTT04oY29uZmlnKTtcclxuXHJcbiAgICB0aGlzLmluaXRpYWxpemUoY29uZmlnKTtcclxuXHJcbiAgICB0aGlzLl9oZWFkZXJDb25maWcgPSBuZXcgU3R5bGVDb25maWcoY29uZmlnLmhlYWRlcik7XHJcbiAgICB0aGlzLl9ncm91cENlbGxDb25maWcgPSBuZXcgU3R5bGVDb25maWcoY29uZmlnLmNlbGwpO1xyXG4gICAgdGhpcy5fY2VsbENvbmZpZyA9IG5ldyBTdHlsZUNvbmZpZyhjb25maWcuY2VsbCk7XHJcbiAgICB0aGlzLl9mb290ZXJDb25maWcgPSBuZXcgU3R5bGVDb25maWcoY29uZmlnLmZvb3Rlcik7XHJcblxyXG4gICAgdGhpcy5pbml0aWFsaXplZCQubmV4dCh0cnVlKTtcclxuXHJcbiAgICB0aGlzLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLmluaXRpYWxGZXRjaCkge1xyXG4gICAgICB0aGlzLmRhdGFDb250cm9sbGVyLnNldE9wZXJhdGlvbihGc0xpc3RTdGF0ZS5Mb2FkKTtcclxuICAgICAgdGhpcy5mZXRjaCQubmV4dCgpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaGFzU2F2ZWRGaWx0ZXJzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhdGhpcy5maWx0ZXJDb25maWcuc2F2ZWRGaWx0ZXJzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGZldGNoUmVtb3RlKHF1ZXJ5KSB7XHJcbiAgICBjb25zdCBvcHRpb25zOiBGc0xpc3RGZXRjaE9wdGlvbnMgPSB7XHJcbiAgICAgIHN0YXRlOiB0aGlzLmRhdGFDb250cm9sbGVyLm9wZXJhdGlvbixcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgcmVzdWx0OiBhbnkgPSB0aGlzLmZldGNoRm4ocXVlcnksIG9wdGlvbnMpO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlID8gZnJvbShyZXN1bHQpIDogcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8gcHVibGljIGxvYWRMb2NhbCgpIHtcclxuICAvLyAgIHRoaXMucGFnaW5nLnVwZGF0ZVBhZ2luZ01hbnVhbCh0aGlzLl9yb3dzKTtcclxuICAvLyAgIGNvbnN0IGZyb20gPSAodGhpcy5wYWdpbmcucGFnZSAtIDEpICogdGhpcy5wYWdpbmcubGltaXQ7XHJcbiAgLy8gICBjb25zdCB0byA9ICh0aGlzLnBhZ2luZy5wYWdlID09PSAxKSA/IHRoaXMucGFnaW5nLmxpbWl0IDogdGhpcy5wYWdpbmcubGltaXQgKiB0aGlzLnBhZ2luZy5wYWdlO1xyXG4gIC8vICAgY29uc3Qgc2xpY2VPZlJvd3MgPSB0aGlzLl9yb3dzLnNsaWNlKGZyb20sIHRvKTtcclxuICAvLyAgIHRoaXMuZGF0YSQubmV4dChzbGljZU9mUm93cyk7XHJcbiAgLy8gfVxyXG5cclxuICAvKipcclxuICAgKiBUcmFuc2Zvcm0gdGVtcGxhdGVzIGZvciB1c2luZ1xyXG4gICAqIEBwYXJhbSB0ZW1wbGF0ZXNcclxuICAgKi9cclxuICBwdWJsaWMgdHJhbmZvcm1UZW1wbGF0ZXNUb0NvbHVtbnModGVtcGxhdGVzKSB7XHJcbiAgICBjb25zdCBkZWZhdWx0Q29uZmlncyA9IHtcclxuICAgICAgaGVhZGVyOiB0aGlzLl9oZWFkZXJDb25maWcsXHJcbiAgICAgIGdyb3VwQ2VsbDogdGhpcy5fZ3JvdXBDZWxsQ29uZmlnLFxyXG4gICAgICBjZWxsOiB0aGlzLl9jZWxsQ29uZmlnLFxyXG4gICAgICBmb290ZXI6IHRoaXMuX2Zvb3RlckNvbmZpZyxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5jb2x1bW5zLnNldERlZmF1bHRzKGRlZmF1bHRDb25maWdzKTtcclxuICAgIHRoaXMuY29sdW1ucy5pbml0aWFsaXplQ29sdW1ucyh0ZW1wbGF0ZXMpO1xyXG5cclxuICAgIC8vIFNldCBzb3J0QnkgZGVmYXVsdCBjb2x1bW5cclxuICAgIHRoaXMuc29ydGluZy5jbGVhclNvcnRhYmxlQ29sdW1ucygpO1xyXG4gICAgdGhpcy5jb2x1bW5zLmNvbHVtbnNcclxuICAgICAgLmZpbHRlcigoY29sdW1uKSA9PiBjb2x1bW4uc29ydGFibGUgJiYgY29sdW1uLnNob3cpXHJcbiAgICAgIC5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgICB0aGlzLnNvcnRpbmcuYWRkU29ydGFibGVDb2x1bW4oY29sdW1uKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgLy8gRGVmYXVsdCBzb3J0IGJ5XHJcbiAgICBjb25zdCBleHRlcm5hbFNvcnRpbmcgPSB0aGlzLmV4dGVybmFsUGFyYW1zLmV4dGVybmFsU29ydGluZztcclxuICAgIGNvbnN0IGluaXRpYWxTb3J0Q29uZmlnID0gZXh0ZXJuYWxTb3J0aW5nIHx8IHRoaXMuY29uZmlnLnNvcnQ7XHJcbiAgICB0aGlzLnNvcnRpbmcuaW5pdGlhbFNvcnRCeShpbml0aWFsU29ydENvbmZpZyk7XHJcblxyXG4gICAgaWYgKGV4dGVybmFsU29ydGluZyAmJiAhdGhpcy5zb3J0aW5nLmlzRGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmV4dGVybmFsUGFyYW1zLmNsZWFyU29ydGluZ1BhcmFtcygpO1xyXG5cclxuICAgICAgY29uc29sZS53YXJuKCdOb3QgYWJsZSB0byByZXN0b3JlIHBlcnNpc3RlZCBzb3J0aW5nIHBhcmFtcy4nLCBleHRlcm5hbFNvcnRpbmcpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5pdEZpbHRlcnMoKTtcclxuICAgIHRoaXMuaW5pdEluZmluaXR5U2Nyb2xsKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVsb2FkKCkge1xyXG4gICAgdGhpcy5sb2FkaW5nJC5uZXh0KHRydWUpO1xyXG5cclxuICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuc2V0T3BlcmF0aW9uKEZzTGlzdFN0YXRlLlJlbG9hZCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZnNTY3JvbGxJbnN0YW5jZSkge1xyXG4gICAgICB0aGlzLnBhZ2luZy5yZXNldFBhZ2luZygpO1xyXG4gICAgICB0aGlzLmRhdGFDb250cm9sbGVyLmNsZWFyUm93cygpO1xyXG4gICAgICB0aGlzLmZzU2Nyb2xsSW5zdGFuY2UucmVsb2FkKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZldGNoJC5uZXh0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXYXRjaCBwYWdlIGNoYW5nZXNcclxuICAgKi9cclxuICBwdWJsaWMgc3Vic2NyaWJlKCkge1xyXG4gICAgdGhpcy5wYWdpbmcucGFnZUNoYW5nZWQkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBQYWdlQ2hhbmdlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhQ29udHJvbGxlci5zZXRPcGVyYXRpb24oRnNMaXN0U3RhdGUuUGFnZUNoYW5nZSk7XHJcblxyXG4gICAgICAgIC8vIFJlbW92ZSBhbGwgcm93cyBpZiBsaW1pdHMgd2FzIGNoYW5nZWRcclxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gUGFnZUNoYW5nZVR5cGUuTGltaXRDaGFuZ2VkICYmIHRoaXMucGFnaW5nLmhhc1BhZ2VTdHJhdGVneSkge1xyXG4gICAgICAgICAgdGhpcy5kYXRhQ29udHJvbGxlci5jbGVhclJvd3MoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhZ2luZy5oYXNPZmZzZXRTdHJhdGVneSkge1xyXG4gICAgICAgICAgdGhpcy5wYWdpbmcudXBkYXRlUGFnaW5hdGlvbigpO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi51cGRhdGVWaXNpYmxlUmVjb3Jkc0NvdW50KHRoaXMucGFnaW5nLmdldFZpc2libGVSZWNvcmRzKCkpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi51cGRhdGVUb3RhbFJlY29yZHNDb3VudCh0aGlzLnBhZ2luZy5yZWNvcmRzKTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGFnZUNoYW5nZWQodGhpcy5zY3JvbGxhYmxlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5zY3JvbGxhYmxlICYmICF0aGlzLnBhZ2luZy5sb2FkTW9yZUVuYWJsZWQpIHtcclxuXHJcbiAgICAgICAgICBjb25zdCBjb250YWlucyA9IFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNkay1vdmVybGF5LWNvbnRhaW5lcicpKS5zb21lKG92ZXJsYXkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKG92ZXJsYXkpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgbGV0IGVsID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgICAgICAgIGlmICghY29udGFpbnMpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgaWYgKChyZWN0LnRvcCArIHdpbmRvdy5wYWdlWU9mZnNldCkgPCB3aW5kb3cuaW5uZXJIZWlnaHQpIHtcclxuICAgICAgICAgICAgICBlbCA9IGRvY3VtZW50LmJvZHk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmZldGNoQ29tcGxldGUkLmFzT2JzZXJ2YWJsZSgpXHJcbiAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMub25EZXN0cm95JClcclxuICAgICAgICAgIClcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICBlbC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5mZXRjaCQubmV4dCgpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNvcnRpbmcuc29ydGluZ0NoYW5nZWQkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuc2V0T3BlcmF0aW9uKEZzTGlzdFN0YXRlLlNvcnQpO1xyXG4gICAgICAgIHRoaXMucGFnaW5nLnBhZ2UgPSAxO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5mc1Njcm9sbEluc3RhbmNlKSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFDb250cm9sbGVyLmNsZWFyUm93cygpO1xyXG4gICAgICAgICAgdGhpcy5mc1Njcm9sbEluc3RhbmNlLnJlbG9hZCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmZldGNoJC5uZXh0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLmxpc3RlblJvd3NSZW1vdmUoKTtcclxuICAgIHRoaXMubGlzdGVuRmV0Y2goKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREYXRhKHRyYWNrQnk/OiBGc0xpc3RUcmFja0J5Rm4pIHtcclxuICAgIGxldCByb3dzRGF0YSA9IHRoaXMuZGF0YUNvbnRyb2xsZXJcclxuICAgICAgLnZpc2libGVSb3dzRGF0YTtcclxuXHJcbiAgICBpZiAodHJhY2tCeSkge1xyXG4gICAgICByb3dzRGF0YSA9IHJvd3NEYXRhXHJcbiAgICAgICAgLmZpbHRlcih0cmFja0J5KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcm93c0RhdGFcclxuICAgICAgLm1hcCgoZGF0YSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBjbG9uZURlZXAoZGF0YSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhc0RhdGEodHJhY2tCeTogRnNMaXN0VHJhY2tCeUZuKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhQ29udHJvbGxlci52aXNpYmxlUm93c0RhdGEuc29tZSh0cmFja0J5KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRvZ2dsZSBncm91cCBtb2RlIHN0YXR1c1xyXG4gICAqIEBwYXJhbSB2YWx1ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBncm91cEVuYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLmRhdGFDb250cm9sbGVyLmdyb3VwRW5hYmxlZCAhPT0gdmFsdWUpIHtcclxuICAgICAgdGhpcy5kYXRhQ29udHJvbGxlci5ncm91cEVuYWJsZWQgPSB2YWx1ZTtcclxuXHJcbiAgICAgIC8vIENvbW1lbnRlZCBvdXQgYmVjYXVzZSBSYXkgd2FudHMgdG8gY2hhbmdlIGdyb3VwIHN0YXR1cyBpbiBmZXRjaCBtYXAgcGlwZVxyXG4gICAgICAvLyBhbmQgaXQgdHJpZ2dlcnMgZXh0cmEgcmVxdWVzdHNcclxuICAgICAgLy8gdGhpcy5yZWxvYWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBkZXN0cm95KCkge1xyXG4gICAgaWYgKHRoaXMuX2ZzU2Nyb2xsU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuX2ZzU2Nyb2xsU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucGFnaW5nKSB7XHJcbiAgICAgIHRoaXMucGFnaW5nLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zb3J0aW5nKSB7XHJcbiAgICAgIHRoaXMuc29ydGluZy5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maWx0ZXJDb25maWcpIHtcclxuICAgICAgdGhpcy5maWx0ZXJDb25maWcgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmV4dGVybmFsUGFyYW1zKSB7XHJcbiAgICAgIHRoaXMuZXh0ZXJuYWxQYXJhbXMuZGVzdHJveSgpXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb2x1bW5zLmRlc3Ryb3koKTtcclxuXHJcbiAgICB0aGlzLm9uRGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5vbkRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcblxyXG4gICAgdGhpcy5kYXRhQ29udHJvbGxlci5kZXN0cm95KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEbyBpbml0aWFsaXphdGlvbiBvZiB0YWJsZVxyXG4gICAqIEBwYXJhbSBjb25maWdcclxuICAgKi9cclxuICBwcml2YXRlIGluaXRpYWxpemUoY29uZmlnOiBGc0xpc3RDb25maWcpIHtcclxuICAgIHRoaXMuY29sdW1ucy5pbml0Q29uZmlnKGNvbmZpZy5jb2x1bW4pO1xyXG4gICAgdGhpcy5pbml0RGVmYXVsdE9wdGlvbnMoY29uZmlnKTtcclxuICAgIHRoaXMuaW5pdFJlc3RvcmUoKTtcclxuICAgIHRoaXMuaW5pdEFjdGlvbnMoY29uZmlnLmFjdGlvbnMpO1xyXG4gICAgdGhpcy5pbml0UGFnaW5nKGNvbmZpZy5wYWdpbmcsIGNvbmZpZy5sb2FkTW9yZSk7XHJcbiAgICB0aGlzLmluaXRTZWxlY3Rpb24oY29uZmlnLnNlbGVjdGlvbiwgdGhpcy5zZWxlY3Rpb25EaWFsb2cpO1xyXG4gICAgdGhpcy5pbml0R3JvdXBzKGNvbmZpZy5ncm91cCk7XHJcbiAgICB0aGlzLmluaXRFeHRlcm5hbFBhcmFtc0NvbnRyb2xsZXIoKTtcclxuXHJcbiAgICB0aGlzLmluaXRpYWxpemVEYXRhKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBKdXN0IGluaXQgb3B0aW9ucyBieSBkZWZhdWx0IGl0IGl0IHdhc24ndCBzcGVjaWZpZWRcclxuICAgKiBAcGFyYW0gY29uZmlnXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpbml0RGVmYXVsdE9wdGlvbnMoY29uZmlnKSB7XHJcbiAgICAvLyBXZSBzaG91bGQgcHJldmVudCBpbml0aWFsIGZldGNoIGluIGNhc2VzIHdoZW4gaXQgd2lsbCBiZSBmZXRjaGVkIGluIGFueSBjYXNlXHJcbiAgICAvLyBBcyBleC4gc2Nyb2xsYWJsZSBvciBmaWx0ZXIgd2lsbCBkbyBmZXRjaCBpbiBhbnkgY2FzZXNcclxuICAgIGlmIChjb25maWcuaW5pdGlhbEZldGNoID09PSBmYWxzZSB8fCBjb25maWcuc2Nyb2xsYWJsZSkgeyAvLyBUT0RPIGZpeG1lIGFmdGVyIHRzbW9kZWwgdmVyc2lvbiB1cGRhdGVcclxuICAgICAgdGhpcy5pbml0aWFsRmV0Y2ggPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmIChjb25maWcuc3RhdHVzID09PSBmYWxzZSkge1xyXG4gICAgICB0aGlzLnN0YXR1cyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbmZpZy5jaGlwcykge1xyXG4gICAgICB0aGlzLmNoaXBzID0gY29uZmlnLmNoaXBzO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbmZpZy5maWx0ZXJJbnB1dCA9PT0gZmFsc2UpIHtcclxuICAgICAgdGhpcy5maWx0ZXJJbnB1dCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmluRGlhbG9nKSB7XHJcbiAgICAgIHRoaXMucXVlcnlQYXJhbSA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5xdWVyeVBhcmFtID0gKGNvbmZpZy5xdWVyeVBhcmFtID09PSB2b2lkIDApXHJcbiAgICAgICAgPyB0cnVlXHJcbiAgICAgICAgOiBjb25maWcucXVlcnlQYXJhbTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29uZmlnLnNvcnRzKSB7XHJcbiAgICAgIHRoaXMuc29ydGluZy5pbml0RmFrZUNvbHVtbnMoY29uZmlnLnNvcnRzKTtcclxuICAgIH1cclxuICAgIGlmICghY29uZmlnLnRyYWNrQnkpIHtcclxuICAgICAgdGhpcy50cmFja0J5ID0gJ2lkJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXQgcmVzdG9yZSByb3cgYWN0aW9uIGFuZCBhcHBlbmQgU2hvdyBEZWxldGVkIG9wdGlvbiBpbnRvIGZpbHRlcnNcclxuICAgKi9cclxuICBwcml2YXRlIGluaXRSZXN0b3JlKCkge1xyXG4gICAgaWYgKHRoaXMucmVzdG9yZSkge1xyXG4gICAgICBjb25zdCByZXN0b3JlQWN0aW9uID0gbmV3IFJvd0FjdGlvbih7XHJcbiAgICAgICAgbGFiZWw6IHRoaXMucmVzdG9yZS5tZW51TGFiZWwgfHwgJ1Jlc3RvcmUnLFxyXG4gICAgICAgIG1lbnU6IHRydWUsXHJcbiAgICAgICAgY2xpY2s6IChyb3cpID0+IHsgdGhpcy5yZXN0b3JlQ2xpY2sodGhpcy5yZXN0b3JlLmNsaWNrLCByb3cpIH0sIC8vIFRPRE8gZml4IG1lLCBtb3ZlIHRvIHNwZWNpYWwgZmlsZVxyXG4gICAgICAgIHJlc3RvcmU6IHRydWVcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAoIXRoaXMucm93QWN0aW9uc1Jhdykge1xyXG4gICAgICAgIHRoaXMucm93QWN0aW9uc1JhdyA9IFtdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnJvd0FjdGlvbnNSYXcucHVzaChyZXN0b3JlQWN0aW9uKTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5maWx0ZXJzKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJzID0gW107XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnJlc3RvcmUuZmlsdGVyICE9PSBmYWxzZSkge1xyXG4gICAgICAgIHRoaXMuZmlsdGVycy5wdXNoKHtcclxuICAgICAgICAgIG5hbWU6IFNIT1dfREVMRVRFRF9GSUxURVJTX0tFWSxcclxuICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLkNoZWNrYm94LFxyXG4gICAgICAgICAgbGFiZWw6IHRoaXMucmVzdG9yZS5maWx0ZXJMYWJlbCB8fCAnU2hvdyBEZWxldGVkJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5pdCBwYWdpbmdcclxuICAgKiBAcGFyYW0gcGFnaW5nQ29uZmlnXHJcbiAgICogQHBhcmFtIGxvYWRNb3JlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpbml0UGFnaW5nKHBhZ2luZ0NvbmZpZzogRnNQYWdpbmcgfCBmYWxzZSwgbG9hZE1vcmU6IEZzTGlzdExvYWRNb3JlQ29uZmlnIHwgYm9vbGVhbikge1xyXG4gICAgdGhpcy5wYWdpbmcuaW5pdFdpdGhDb25maWcocGFnaW5nQ29uZmlnLCBsb2FkTW9yZSwgISF0aGlzLnNjcm9sbGFibGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3BsaXQgYWN0aW9ucyBieSBjYXRlZ29yaWVzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpbml0QWN0aW9ucyhhY3Rpb25zKSB7XHJcbiAgICBpZiAoYWN0aW9ucykge1xyXG4gICAgICB0aGlzLmFjdGlvbnMuc2V0QWN0aW9ucyhhY3Rpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmhhc1Jvd0FjdGlvbnMgPVxyXG4gICAgICAodGhpcy5yb3dBY3Rpb25zUmF3ICYmIHRoaXMucm93QWN0aW9uc1Jhdy5sZW5ndGggPiAwKVxyXG4gICAgICB8fCAodGhpcy5ncm91cEFjdGlvbnNSYXcgJiYgdGhpcy5ncm91cEFjdGlvbnNSYXcubGVuZ3RoID4gMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRTZWxlY3Rpb24oXHJcbiAgICBzZWxlY3Rpb25Db25maWc6IEZzTGlzdFNlbGVjdGlvbkNvbmZpZyxcclxuICAgIHNlbGVjdGlvbkRpYWxvZzogU2VsZWN0aW9uRGlhbG9nLFxyXG4gICkge1xyXG4gICAgaWYgKHNlbGVjdGlvbkNvbmZpZykge1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Db250cm9sbGVyKHNlbGVjdGlvbkNvbmZpZywgdGhpcy50cmFja0J5LCBzZWxlY3Rpb25EaWFsb2cpO1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZXRSb3dzQ2FsbGJhY2soKCkgPT4gdGhpcy5kYXRhQ29udHJvbGxlci52aXNpYmxlUm93cyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVEYXRhKCkge1xyXG4gICAgdGhpcy5kYXRhQ29udHJvbGxlci5zZXRBZGRpdGlvbmFsQ29uZmlncyh7XHJcbiAgICAgIHNjcm9sbGFibGU6ICEhdGhpcy5zY3JvbGxhYmxlLFxyXG4gICAgICBsb2FkTW9yZUVuYWJsZWQ6IHRoaXMucGFnaW5nLmxvYWRNb3JlRW5hYmxlZFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRHcm91cHMoZ3JvdXBDb25maWc6IEZzTGlzdEdyb3VwQ29uZmlnKSB7XHJcbiAgICBpZiAoZ3JvdXBDb25maWcpIHtcclxuICAgICAgdGhpcy5kYXRhQ29udHJvbGxlci5zZXRHcm91cENvbmZpZyhncm91cENvbmZpZyk7XHJcbiAgICAgIHRoaXMuZ3JvdXBBY3Rpb25zUmF3ID0gZ3JvdXBDb25maWcuYWN0aW9ucztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdEV4dGVybmFsUGFyYW1zQ29udHJvbGxlcigpIHtcclxuICAgIHRoaXMuZXh0ZXJuYWxQYXJhbXMgPSBuZXcgRXh0ZXJuYWxQYXJhbXNDb250cm9sbGVyKFxyXG4gICAgICB0aGlzLnJvdXRlcixcclxuICAgICAgdGhpcy5yb3V0ZSxcclxuICAgICAgdGhpcy5wZXJzaXN0YW5jZSxcclxuICAgICAgdGhpcy5wYWdpbmcsXHJcbiAgICAgIHRoaXMuc29ydGluZyxcclxuICAgICAgdGhpcy5xdWVyeVBhcmFtXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3Vic2NyaWJlIHRvIGZldGNoJCBldmVudCB3aXRoIGRlYm91bmNlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsaXN0ZW5GZXRjaCgpIHtcclxuICAgIGxldCBmZXRjaCQgPSB0aGlzLmZldGNoJC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgICAvLyBTaG91bGQgd2FpdCB1bnRpbCBzYXZlZCBmaWx0ZXJzIG5vdCBsb2FkZWRcclxuICAgIGlmICghIXRoaXMuZmlsdGVycyAmJiAhIXRoaXMuc2F2ZWRGaWx0ZXJzKSB7XHJcbiAgICAgIGZldGNoJCA9IGNvbWJpbmVMYXRlc3QoW2ZldGNoJCwgdGhpcy5maWx0ZXJzUmVhZHkkXSlcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIG1hcCgoW3BhcmFtc10pID0+IHBhcmFtcyksXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBmZXRjaCRcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKDUwKSxcclxuICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nJC5uZXh0KHRydWUpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvbj8uY2xvc2VTZWxlY3Rpb25EaWFsb2coKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBtYXAoKHBhcmFtczogRnNMaXN0RmV0Y2hTdWJzY3JpcHRpb24pID0+IHtcclxuICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5wYWdpbmcuaGFzT2Zmc2V0U3RyYXRlZ3kgJiYgcGFyYW1zICYmIHBhcmFtcy5sb2FkT2Zmc2V0XHJcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5maWx0ZXJzUXVlcnksIHRoaXMucGFnaW5nLmxvYWREZWxldGVkT2Zmc2V0UXVlcnkpXHJcbiAgICAgICAgICAgIDogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5maWx0ZXJzUXVlcnksIHRoaXMucGFnaW5nLnF1ZXJ5KTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5zb3J0aW5nLnNvcnRpbmdDb2x1bW4pIHtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihcclxuICAgICAgICAgICAgICBxdWVyeSxcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBvcmRlcjogYCR7dGhpcy5zb3J0aW5nLnNvcnRpbmdDb2x1bW4ubmFtZX0sJHt0aGlzLnNvcnRpbmcuc29ydGluZ0NvbHVtbi5kaXJlY3Rpb259YFxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJldHVybiBxdWVyeTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKHF1ZXJ5KSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5jb2x1bW5zLmxvYWRGbkNvbmZpZ3VyZWQgJiYgIXRoaXMuY29sdW1ucy5jb2x1bW5zRmV0Y2hlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5zLmxvYWRSZW1vdGVDb2x1bW5Db25maWdzKClcclxuICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIG1hcFRvKHF1ZXJ5KVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YocXVlcnkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgocXVlcnkpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmNvbHVtbnMuY29uZmlndXJlZCkge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKFxyXG4gICAgICAgICAgICAgIHF1ZXJ5LFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMuY29sdW1ucy52aXNpYmxlQ29sdW1uc05hbWVzLFxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtvZihxdWVyeSksIHRoaXMuZmV0Y2hSZW1vdGUocXVlcnkpXSk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IsIHNvdXJjZSQpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG5cclxuICAgICAgICAgIHJldHVybiBzb3VyY2UkO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jb21wbGV0ZUZldGNoKHJlc3BvbnNlKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxpc3RlblJvd3NSZW1vdmUoKSB7XHJcbiAgICB0aGlzLmRhdGFDb250cm9sbGVyLnJvd3NSZW1vdmVkJFxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKChyb3dzOiBhbnlbXSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnBhZ2luZy5lbmFibGVkKSB7XHJcblxyXG4gICAgICAgICAgY29uc3QgcmVtb3ZlZENvdW50ID0gcm93cy5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMucGFnaW5nLmhhc1BhZ2VTdHJhdGVneSkge1xyXG4gICAgICAgICAgICB0aGlzLm5vRGF0YVBhZ2luYXRpb25VcGRhdGUocmVtb3ZlZENvdW50KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEZldGNoIG1vcmUgaWYgaGFzIHNvbWV0aGluZyBmb3IgZmV0Y2hcclxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YUNvbnRyb2xsZXIuaGFzRGF0YSB8fCB0aGlzLnBhZ2luZy5oYXNOZXh0UGFnZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuc2V0T3BlcmF0aW9uKEZzTGlzdFN0YXRlLkxvYWRNb3JlKTtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5wYWdpbmcucmVtb3ZlUm93cyhyZW1vdmVkQ291bnQpO1xyXG4gICAgICAgICAgICAgIHRoaXMuZmV0Y2gkLm5leHQoeyBsb2FkT2Zmc2V0OiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMubm9EYXRhUGFnaW5hdGlvblVwZGF0ZShyZW1vdmVkQ291bnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBSZW1vdmUgZnJvbSBzZWxlY3Rpb25cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcclxuICAgICAgICAgIHJvd3MuZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJlbW92ZVJvdyhyb3cuZGF0YSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0SW5maW5pdHlTY3JvbGwoKSB7XHJcbiAgICBpZiAodGhpcy5mc1Njcm9sbEluc3RhbmNlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zY3JvbGxhYmxlKSB7XHJcbiAgICAgIC8vIFNjcm9sbGFibGUgc3RhdHVzIGJ5IGRlZmF1bHRcclxuICAgICAgaWYgKHRoaXMuc2Nyb2xsYWJsZS5zdGF0dXMgPT09IHZvaWQgMCkge1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsYWJsZS5zdGF0dXMgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgdGhpcy5mc1Njcm9sbFxyXG4gICAgICAgIC5jb21wb25lbnQodGhpcy5zY3JvbGxhYmxlLm5hbWUpXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKVxyXG4gICAgICAgIClcclxuICAgICAgICAuc3Vic2NyaWJlKChmc1Njcm9sbEluc3RhbmNlOiBGc1Njcm9sbEluc3RhbmNlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmZzU2Nyb2xsSW5zdGFuY2UgPSBmc1Njcm9sbEluc3RhbmNlO1xyXG4gICAgICAgICAgdGhpcy5fZnNTY3JvbGxTdWJzY3JpcHRpb24gPSBmc1Njcm9sbEluc3RhbmNlXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGxldCBzdGFydExvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICBjb25zdCBvcGVyYXRpb24gPSB0aGlzLmRhdGFDb250cm9sbGVyLm9wZXJhdGlvbjtcclxuXHJcbiAgICAgICAgICAgICAgLy8gSW5pdGlhbCBsb2FkaW5nIGlmIGluaXRpYWxGZXRjaCBlcXVhbHMgZmFsc2VcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbEZldGNoXHJcbiAgICAgICAgICAgICAgICAmJiAhdGhpcy5wYWdpbmcuaW5pdGlhbGl6ZWRcclxuICAgICAgICAgICAgICAgICYmIG9wZXJhdGlvbiAhPT0gRnNMaXN0U3RhdGUuUmVsb2FkXHJcbiAgICAgICAgICAgICAgKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhQ29udHJvbGxlci5zZXRPcGVyYXRpb24oRnNMaXN0U3RhdGUuTG9hZCk7XHJcbiAgICAgICAgICAgICAgICBzdGFydExvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uID09PSBGc0xpc3RTdGF0ZS5SZWxvYWQgfHxcclxuICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9PT0gRnNMaXN0U3RhdGUuRmlsdGVyIHx8XHJcbiAgICAgICAgICAgICAgICBvcGVyYXRpb24gPT09IEZzTGlzdFN0YXRlLlNvcnRcclxuICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0TG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBhZ2luZy5pbml0aWFsaXplZCAmJiB0aGlzLnBhZ2luZy5oYXNOZXh0UGFnZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gTG9hZGluZyBpZiBjb250ZW50IGhhcyBiZWVuIHNjcm9sbGVkXHJcbiAgICAgICAgICAgICAgICBzdGFydExvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhQ29udHJvbGxlci5zZXRPcGVyYXRpb24oRnNMaXN0U3RhdGUuTG9hZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2luZy5nb05leHQoKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGlmIChzdGFydExvYWRpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2gkLm5leHQoKTtcclxuICAgICAgICAgICAgICAgIGZzU2Nyb2xsSW5zdGFuY2UubG9hZGluZygpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIucmVtb3RlUm93c0NoYW5nZSRcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMub25EZXN0cm95JCksXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgZnNTY3JvbGxJbnN0YW5jZS5sb2FkZWQoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIGFuZCB3YXRjaCBmaWx0ZXIgY2hhbmdlc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgaW5pdEZpbHRlcnMoKSB7XHJcbiAgICBpZiAodGhpcy5maWx0ZXJDb25maWcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE1lcmdlIHNvcnRpbmcgYW5kIGZha2Ugc29ydGluZyBjb2xzXHJcbiAgICAvLyBGYWtlIHNvcnRpbmcgY29scyBpdCdzIGNvbHMgd2hpY2ggZG9uJ3QgcmVwcmVzZW50ZWQgaW4gdGFibGUgY29scywgbGlrZSBhYnN0cmFjdCBjb2xzXHJcbiAgICBjb25zdCBzb3J0VmFsdWVzID1cclxuICAgICAgW1xyXG4gICAgICAgIC4uLnRoaXMuc29ydGluZy5zb3J0aW5nQ29sdW1ucyxcclxuICAgICAgICAuLi50aGlzLnNvcnRpbmcuZmFrZVNvcnRpbmdDb2x1bW5zXHJcbiAgICAgIF0ucmVkdWNlKChhY2MsIGNvbHVtbikgPT4ge1xyXG5cclxuICAgICAgICBjb25zdCBzb3J0aW5nSXRlbSA9IHtcclxuICAgICAgICAgIG5hbWU6IGNvbHVtbi50aXRsZSxcclxuICAgICAgICAgIHZhbHVlOiBjb2x1bW4ubmFtZSxcclxuICAgICAgICAgIGRlZmF1bHQ6IHRoaXMuc29ydGluZy5zb3J0aW5nQ29sdW1uICYmIHRoaXMuc29ydGluZy5zb3J0aW5nQ29sdW1uLm5hbWUgPT09IGNvbHVtbi5uYW1lXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgYWNjLnB1c2goc29ydGluZ0l0ZW0pO1xyXG4gICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgIH0sIFtdKTtcclxuXHJcbiAgICBjb25zdCBzb3J0Q29uZmlnID0gdGhpcy5zb3J0aW5nLnNvcnRpbmdDb2x1bW5cclxuICAgICAgPyB7IHZhbHVlOiB0aGlzLnNvcnRpbmcuc29ydGluZ0NvbHVtbi5uYW1lLCBkaXJlY3Rpb246IHRoaXMuc29ydGluZy5zb3J0aW5nQ29sdW1uLmRpcmVjdGlvbn1cclxuICAgICAgOiBudWxsO1xyXG5cclxuICAgIC8vIENvbmZpZ1xyXG4gICAgdGhpcy5maWx0ZXJDb25maWcgPSB7XHJcbiAgICAgIHBlcnNpc3Q6IHRoaXMucGVyc2lzdCxcclxuICAgICAgaXRlbXM6IHRoaXMuZmlsdGVycyB8fCBbXSxcclxuICAgICAgc2F2ZWRGaWx0ZXJzOiB0aGlzLnNhdmVkRmlsdGVycyxcclxuICAgICAgaW5saW5lOiB0aGlzLmlubGluZUZpbHRlcnMsXHJcbiAgICAgIGFjdGlvbnM6IHRoaXMuYWN0aW9ucy5hY3Rpb25zLFxyXG4gICAgICBxdWVyeVBhcmFtOiB0aGlzLnF1ZXJ5UGFyYW0sXHJcbiAgICAgIHNvcnRzOiBzb3J0VmFsdWVzLFxyXG4gICAgICBzb3J0OiBzb3J0Q29uZmlnLFxyXG4gICAgICBjaGlwczogdGhpcy5jaGlwcyxcclxuICAgICAgaW5pdDogdGhpcy5maWx0ZXJJbml0LmJpbmQodGhpcyksXHJcbiAgICAgIGNoYW5nZTogdGhpcy5maWx0ZXJDaGFuZ2UuYmluZCh0aGlzKSxcclxuICAgICAgcmVsb2FkOiB0aGlzLnJlbG9hZC5iaW5kKHRoaXMpLFxyXG4gICAgICBzb3J0Q2hhbmdlOiB0aGlzLmZpbHRlclNvcnQuYmluZCh0aGlzKSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxsYmFjayB3aGVuIEZpbHRlciBoYXMgYmVlbiBpbml0aWFsaXplZFxyXG4gICAqIEBwYXJhbSBmaWx0ZXJzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBmaWx0ZXJJbml0KGZpbHRlcnMpIHtcclxuICAgIGlmICh0aGlzLmZpbHRlckluaXRDYikge1xyXG4gICAgICB0aGlzLmZpbHRlckluaXRDYihmaWx0ZXJzKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZpbHRlcnNRdWVyeSA9IGZpbHRlcnM7XHJcblxyXG4gICAgdGhpcy5jaGVja1Jlc3RvcmVGaWx0ZXIoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxiYWNrIHdoZW4gRmlsdGVyIGhhcyBiZWVuIGNoYW5nZWRcclxuICAgKiBAcGFyYW0gZmlsdGVyUXVlcnlcclxuICAgKiBAcGFyYW0gZmlsdGVyU29ydFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZmlsdGVyQ2hhbmdlKGZpbHRlclF1ZXJ5LCBmaWx0ZXJTb3J0KSB7XHJcbiAgICBpZiAodGhpcy5maWx0ZXJDaGFuZ2VDYikge1xyXG4gICAgICB0aGlzLmZpbHRlckNoYW5nZUNiKGZpbHRlclF1ZXJ5LCBmaWx0ZXJTb3J0KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZpbHRlcnNRdWVyeSA9IGZpbHRlclF1ZXJ5O1xyXG5cclxuICAgIHRoaXMucmVzdG9yZU1vZGUgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBSZXN0b3JlIG9wdGlvblxyXG4gICAgdGhpcy5jaGVja1Jlc3RvcmVGaWx0ZXIoKTtcclxuXHJcbiAgICBpZiAodGhpcy5yZXN0b3JlICYmIHRoaXMucmVzdG9yZS5yZWxvYWQpIHtcclxuICAgICAgdGhpcy5yZWxvYWQoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRhdGFDb250cm9sbGVyLnNldE9wZXJhdGlvbihGc0xpc3RTdGF0ZS5GaWx0ZXIpO1xyXG5cclxuICAgIC8vIFJlc2V0IHBhZ2luZyBmb3IgcmVxdWVzdCB3aXRoIGNvcnJlY3Qgb2Zmc2V0XHJcbiAgICB0aGlzLnBhZ2luZy5yZXNldFBhZ2luZygpO1xyXG5cclxuICAgIGlmICh0aGlzLmZzU2Nyb2xsSW5zdGFuY2UpIHtcclxuICAgICAgdGhpcy5kYXRhQ29udHJvbGxlci5jbGVhclJvd3MoKTtcclxuICAgICAgdGhpcy5mc1Njcm9sbEluc3RhbmNlLnJlbG9hZCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mZXRjaCQubmV4dCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja1Jlc3RvcmVGaWx0ZXIoKSB7XHJcbiAgICAvLyBSZXN0b3JlIG9wdGlvblxyXG4gICAgaWYgKHRoaXMucmVzdG9yZSAmJiB0aGlzLmZpbHRlcnNRdWVyeVtTSE9XX0RFTEVURURfRklMVEVSU19LRVldKSB7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLmZpbHRlcnNRdWVyeVtTSE9XX0RFTEVURURfRklMVEVSU19LRVldO1xyXG5cclxuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLmZpbHRlcnNRdWVyeSwgdGhpcy5yZXN0b3JlLnF1ZXJ5KTtcclxuXHJcbiAgICAgIHRoaXMucmVzdG9yZU1vZGUgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gQ2FsbGJhY2sgd2hlbiBGaWx0ZXIgc29ydCBoYXMgYmVlbiBjaGFuZ2VkXHJcbiAgcHJpdmF0ZSBmaWx0ZXJTb3J0KGZpbHRlclF1ZXJ5LCBmaWx0ZXJTb3J0KSB7XHJcbiAgICBpZiAoZmlsdGVyU29ydCkge1xyXG4gICAgICB0aGlzLnNvcnRpbmcuc29ydEJ5Q29sdW1uV2l0aE5hbWUoZmlsdGVyU29ydC52YWx1ZSk7XHJcblxyXG4gICAgICBjb25zdCBzb3J0RGlyZWN0aW9uID0gZmlsdGVyU29ydC5kaXJlY3Rpb24gPT09ICdhc2MnID8gU29ydGluZ0RpcmVjdGlvbi5hc2MgOiBTb3J0aW5nRGlyZWN0aW9uLmRlc2M7XHJcbiAgICAgIHRoaXMuc29ydGluZy5zb3J0RGlyZWN0aW9uKHNvcnREaXJlY3Rpb24pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gRklYTUUgbmVlZCB0byBiZSByZWZhY3RvcmVkLi4uXHJcbiAgICAgIHRoaXMuc29ydGluZy5zb3J0aW5nQ29sdW1uID0gdm9pZCAwO1xyXG4gICAgICB0aGlzLnJlbG9hZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21wbGV0ZUZldGNoKFtxdWVyeSwgcmVzcG9uc2VdKSB7XHJcblxyXG4gICAgaWYgKCF0aGlzLnBhZ2luZy5wYWdlKSB7XHJcbiAgICAgIHRoaXMucGFnaW5nLnBhZ2UgPSAxO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXNwb25zZS5wYWdpbmcpIHtcclxuICAgICAgY29uc3QgZGlzcGxheWVkID0gKEFycmF5LmlzQXJyYXkocmVzcG9uc2UuZGF0YSkgJiYgcmVzcG9uc2UuZGF0YS5sZW5ndGgpIHx8IDA7XHJcbiAgICAgIHRoaXMucGFnaW5nLnVwZGF0ZVBhZ2luZyhcclxuICAgICAgICByZXNwb25zZS5wYWdpbmcsXHJcbiAgICAgICAgZGlzcGxheWVkLFxyXG4gICAgICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIub3BlcmF0aW9uID09PSBGc0xpc3RTdGF0ZS5Mb2FkTW9yZVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnBhZ2luZy5lbmFibGVkKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICclYyBGc0xpc3QgV2FybmluZyAnLFxyXG4gICAgICAgICdjb2xvcjogd2hpdGU7IGJhY2tncm91bmQtY29sb3I6ICNmZmNjMGInLFxyXG4gICAgICAgICdQYWdpbmF0aW9uIGRvZXMgbm90IGNvbmZpZ3VyZWQgcHJvcGVybHkuICcgK1xyXG4gICAgICAgICdQYWdpbmF0aW9uIGlzIGVuYWJsZWQsIGJ1dCBodHRwIHJlc3BvbnNlIGRvZXMgbm90IGNvbnRhaW4gXCJwYWdpbmdcIiBmaWVsZC4gJyArXHJcbiAgICAgICAgJ1lvdSBoYXZlIHRvIHNldCBcInBhZ2luZzogZmFsc2VcIiBpbiBjb25maWcgb3IgYWRkIFwicGFnaW5nXCIgZmllbGQgdG8gcmVzcG9uc2UuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vLyBtdXN0IGJlIGJlZm9yZSBzZWxlY3Rpb24sIGJlY2F1c2Ugc2VsZXRpb24gdXNlIHJlY29yZHNcclxuICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuc2V0Um93c0Zyb21SZXNwb25zZShyZXNwb25zZS5kYXRhKTtcclxuICAgIC8vL1xyXG5cclxuICAgIC8vIFVwZGF0ZSBzZWxlY3Rpb24gcGFyYW1zXHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcclxuXHJcbiAgICAgIGlmICh0aGlzLnBhZ2luZy5lbmFibGVkKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGFnZUNoYW5nZWQodGhpcy5zY3JvbGxhYmxlKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbi51cGRhdGVWaXNpYmxlUmVjb3Jkc0NvdW50KHRoaXMucGFnaW5nLmdldFZpc2libGVSZWNvcmRzKCkpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnVwZGF0ZVRvdGFsUmVjb3Jkc0NvdW50KHRoaXMucGFnaW5nLnJlY29yZHMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVzcG9uc2UucGFnaW5nICYmIHJlc3BvbnNlLnBhZ2luZy5yZWNvcmRzXHJcbiAgICAgICAgICB8fCBBcnJheS5pc0FycmF5KHJlc3BvbnNlLmRhdGEpICYmIHJlc3BvbnNlLmRhdGEubGVuZ3RoO1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdGlvbi51cGRhdGVWaXNpYmxlUmVjb3Jkc0NvdW50KGNvdW50KTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbi51cGRhdGVUb3RhbFJlY29yZHNDb3VudChjb3VudCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkUm93c0ludGVyc2VjdGlvbih0aGlzLmRhdGFDb250cm9sbGVyLnZpc2libGVSb3dzRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZW1wdHlTdGF0ZT8udmFsaWRhdGUgJiYgdGhpcy5lbXB0eVN0YXRlVGVtcGxhdGUpIHtcclxuICAgICAgdGhpcy5lbXB0eVN0YXRlRW5hYmxlZCA9IHRoaXMuZW1wdHlTdGF0ZS52YWxpZGF0ZShxdWVyeSwgY2xvbmVEZWVwKHJlc3BvbnNlLmRhdGEpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZldGNoQ29tcGxldGUkLm5leHQoKTtcclxuICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaWxsIGRvIHNvbWUgYWN0aW9ucyBpZiB5b3UgcmVtb3ZlZCBpdGVtIGFuZCBpdGVtIHdhcyBsYXN0IG9uIGhpcyBvd24gcGFnZVxyXG4gICAqXHJcbiAgICogRXg6IGlmIGxpc3QgaGFzIDMgcGFnZXMgYW5kIG9uIHRoaXJkIHBhZ2UgeW91IGhhdmUgb25seSBvbmUgaXRlbS4gQW5kIHlvdSBqdXN0IGRlbGV0ZWQgdGhpcyBpdGVtLlxyXG4gICAqIFlvdSBtdXN0IGdvIHRvIHNlY29uZCBwYWdlLCBidXQgaWYgaXQgd2FzIGxhc3QgcGFnZSBhbmQgeW91IGNhbid0IGdvIGJhY2sgLT4ganVzdCByZWxvYWRcclxuICAgKlxyXG4gICAqIEBwYXJhbSBkZWxldGVkQ291bnRcclxuICAgKi9cclxuICBwcml2YXRlIG5vRGF0YVBhZ2luYXRpb25VcGRhdGUoZGVsZXRlZENvdW50KSB7XHJcbiAgICBpZiAoIXRoaXMuZGF0YUNvbnRyb2xsZXIuaGFzRGF0YSkge1xyXG4gICAgICBpZiAodGhpcy5wYWdpbmcucGFnZSA+IDEpIHtcclxuICAgICAgICB0aGlzLnBhZ2luZy5nb1RvUGFnZSh0aGlzLnBhZ2luZy5wYWdlIC0gMSB8fCAxKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnJlbG9hZCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wYWdpbmcucmVjb3JkcyAtPSBkZWxldGVkQ291bnQ7XHJcbiAgICB0aGlzLnBhZ2luZy51cGRhdGVQYWdpbmF0aW9uKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0YUNvbnRyb2xsZXIuaGFzRGF0YSAmJiB0aGlzLnNlbGVjdGlvbikge1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbi51cGRhdGVWaXNpYmxlUmVjb3Jkc0NvdW50KHRoaXMuZGF0YUNvbnRyb2xsZXIudmlzaWJsZVJvd3NDb3VudCk7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnVwZGF0ZVRvdGFsUmVjb3Jkc0NvdW50KHRoaXMucGFnaW5nLnJlY29yZHMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGVtcG9yYXJ5IHNvbHV0aW9uLCB3aWxsIGRvIGF1dG8gc3Vic2NyaWJlIGlmIHdhcyByZXR1cm5lZCBPYnNlcnZhYmxlLlxyXG4gICAqXHJcbiAgICogVE9ETzogTU9WRSBUSElTIFBFQUNFIE9GIENPREUgVE8gU1BFQ0lBTCBQTEFDRVxyXG4gICAqXHJcbiAgICogQHBhcmFtIHJlc3RvcmVDbGlja0NhbGxiYWNrXHJcbiAgICogQHBhcmFtIHJvd1xyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVzdG9yZUNsaWNrKHJlc3RvcmVDbGlja0NhbGxiYWNrLCByb3cpIHtcclxuICAgIGNvbnN0IHJlc3RvcmVDbGlja1Jlc3VsdCA9IHJlc3RvcmVDbGlja0NhbGxiYWNrKHJvdyk7XHJcblxyXG4gICAgaWYgKHJlc3RvcmVDbGlja1Jlc3VsdCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcclxuICAgICAgcmVzdG9yZUNsaWNrUmVzdWx0XHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMub25EZXN0cm95JCksXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKCkgPT4gdGhpcy5yZWxvYWQoKSxcclxuICAgICAgICAgIGVycm9yOiAoKSA9PiB7fSxcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
|
|
1
|
+
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import { ItemType } from '@firestitch/filter';
|
|
3
|
+
import { Alias, Model } from 'tsmodels';
|
|
4
|
+
import { BehaviorSubject, combineLatest, from, Observable, of, Subject } from 'rxjs';
|
|
5
|
+
import { catchError, debounceTime, map, mapTo, switchMap, take, takeUntil, tap, } from 'rxjs/operators';
|
|
6
|
+
import { cloneDeep } from 'lodash-es';
|
|
7
|
+
import { SortingDirection } from '../models/column.model';
|
|
8
|
+
import { StyleConfig } from '../models/styleConfig.model';
|
|
9
|
+
import { RowAction } from '../models/row-action.model';
|
|
10
|
+
import { ColumnsController } from './columns-controller';
|
|
11
|
+
import { PageChangeType } from '../enums/page-change-type.enum';
|
|
12
|
+
import { ActionsController } from './index';
|
|
13
|
+
import { DataController } from './data-controller';
|
|
14
|
+
import { PaginationController } from './pagination-controller';
|
|
15
|
+
import { SelectionController } from './selection-controller';
|
|
16
|
+
import { SortingController } from './sorting-controller';
|
|
17
|
+
import { FsListState } from '../enums/state.enum';
|
|
18
|
+
import { ExternalParamsController } from './external-params-controller';
|
|
19
|
+
const SHOW_DELETED_FILTERS_KEY = '$$_show_deleted_$$';
|
|
20
|
+
export class List extends Model {
|
|
21
|
+
constructor(el, config = {}, fsScroll, selectionDialog, router, route, persistance, inDialog) {
|
|
22
|
+
super();
|
|
23
|
+
this.el = el;
|
|
24
|
+
this.config = config;
|
|
25
|
+
this.fsScroll = fsScroll;
|
|
26
|
+
this.selectionDialog = selectionDialog;
|
|
27
|
+
this.router = router;
|
|
28
|
+
this.route = route;
|
|
29
|
+
this.persistance = persistance;
|
|
30
|
+
this.inDialog = inDialog;
|
|
31
|
+
this.filters = [];
|
|
32
|
+
this.scrollable = false;
|
|
33
|
+
// @Alias('rows') private _rows: any;
|
|
34
|
+
this.initialized$ = new BehaviorSubject(false);
|
|
35
|
+
this.loading$ = new BehaviorSubject(false);
|
|
36
|
+
this.paging = new PaginationController();
|
|
37
|
+
this.columns = new ColumnsController();
|
|
38
|
+
this.actions = new ActionsController();
|
|
39
|
+
this.dataController = new DataController();
|
|
40
|
+
this.sorting = new SortingController();
|
|
41
|
+
this.filterConfig = null;
|
|
42
|
+
this.fetch$ = new Subject();
|
|
43
|
+
this.fetchComplete$ = new Subject();
|
|
44
|
+
this.filtersReady$ = new Subject();
|
|
45
|
+
this.status = true;
|
|
46
|
+
this.chips = false;
|
|
47
|
+
this.filterInput = true;
|
|
48
|
+
this.queryParam = false;
|
|
49
|
+
this.restoreMode = false;
|
|
50
|
+
this.initialFetch = true;
|
|
51
|
+
// Empty state
|
|
52
|
+
this.emptyStateEnabled = false;
|
|
53
|
+
this.onDestroy$ = new Subject();
|
|
54
|
+
this._fromJSON(config);
|
|
55
|
+
this.initialize(config);
|
|
56
|
+
this._headerConfig = new StyleConfig(config.header);
|
|
57
|
+
this._groupCellConfig = new StyleConfig(config.cell);
|
|
58
|
+
this._cellConfig = new StyleConfig(config.cell);
|
|
59
|
+
this._footerConfig = new StyleConfig(config.footer);
|
|
60
|
+
this.initialized$.next(true);
|
|
61
|
+
this.subscribe();
|
|
62
|
+
if (this.initialFetch) {
|
|
63
|
+
this.dataController.setOperation(FsListState.Load);
|
|
64
|
+
this.fetch$.next();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
get hasSavedFilters() {
|
|
68
|
+
return !!this.filterConfig.savedFilters;
|
|
69
|
+
}
|
|
70
|
+
fetchRemote(query) {
|
|
71
|
+
const options = {
|
|
72
|
+
state: this.dataController.operation,
|
|
73
|
+
};
|
|
74
|
+
const result = this.fetchFn(query, options);
|
|
75
|
+
return result instanceof Promise ? from(result) : result;
|
|
76
|
+
}
|
|
77
|
+
// public loadLocal() {
|
|
78
|
+
// this.paging.updatePagingManual(this._rows);
|
|
79
|
+
// const from = (this.paging.page - 1) * this.paging.limit;
|
|
80
|
+
// const to = (this.paging.page === 1) ? this.paging.limit : this.paging.limit * this.paging.page;
|
|
81
|
+
// const sliceOfRows = this._rows.slice(from, to);
|
|
82
|
+
// this.data$.next(sliceOfRows);
|
|
83
|
+
// }
|
|
84
|
+
/**
|
|
85
|
+
* Transform templates for using
|
|
86
|
+
* @param templates
|
|
87
|
+
*/
|
|
88
|
+
tranformTemplatesToColumns(templates) {
|
|
89
|
+
const defaultConfigs = {
|
|
90
|
+
header: this._headerConfig,
|
|
91
|
+
groupCell: this._groupCellConfig,
|
|
92
|
+
cell: this._cellConfig,
|
|
93
|
+
footer: this._footerConfig,
|
|
94
|
+
};
|
|
95
|
+
this.columns.setDefaults(defaultConfigs);
|
|
96
|
+
this.columns.initializeColumns(templates);
|
|
97
|
+
// Set sortBy default column
|
|
98
|
+
this.sorting.clearSortableColumns();
|
|
99
|
+
this.columns.columns
|
|
100
|
+
.filter((column) => column.sortable && column.show)
|
|
101
|
+
.forEach((column) => {
|
|
102
|
+
this.sorting.addSortableColumn(column);
|
|
103
|
+
});
|
|
104
|
+
// Default sort by
|
|
105
|
+
const externalSorting = this.externalParams.externalSorting;
|
|
106
|
+
const initialSortConfig = externalSorting || this.config.sort;
|
|
107
|
+
this.sorting.initialSortBy(initialSortConfig);
|
|
108
|
+
if (externalSorting && !this.sorting.isDefined) {
|
|
109
|
+
this.externalParams.clearSortingParams();
|
|
110
|
+
console.warn('Not able to restore persisted sorting params.', externalSorting);
|
|
111
|
+
}
|
|
112
|
+
this.initFilters();
|
|
113
|
+
this.initInfinityScroll();
|
|
114
|
+
}
|
|
115
|
+
reload() {
|
|
116
|
+
this.loading$.next(true);
|
|
117
|
+
this.dataController.setOperation(FsListState.Reload);
|
|
118
|
+
if (this.fsScrollInstance) {
|
|
119
|
+
this.paging.resetPaging();
|
|
120
|
+
this.dataController.clearRows();
|
|
121
|
+
this.fsScrollInstance.reload();
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
this.fetch$.next();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Watch page changes
|
|
129
|
+
*/
|
|
130
|
+
subscribe() {
|
|
131
|
+
this.paging.pageChanged$
|
|
132
|
+
.pipe(takeUntil(this.onDestroy$))
|
|
133
|
+
.subscribe((event) => {
|
|
134
|
+
this.dataController.setOperation(FsListState.PageChange);
|
|
135
|
+
// Remove all rows if limits was changed
|
|
136
|
+
if (event.type === PageChangeType.LimitChanged && this.paging.hasPageStrategy) {
|
|
137
|
+
this.dataController.clearRows();
|
|
138
|
+
}
|
|
139
|
+
if (this.paging.hasOffsetStrategy) {
|
|
140
|
+
this.paging.updatePagination();
|
|
141
|
+
if (this.selection) {
|
|
142
|
+
this.selection.updateVisibleRecordsCount(this.paging.getVisibleRecords());
|
|
143
|
+
this.selection.updateTotalRecordsCount(this.paging.records);
|
|
144
|
+
this.selection.pageChanged(this.scrollable);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (!this.scrollable && !this.paging.loadMoreEnabled) {
|
|
148
|
+
const contains = [].slice.call(document.querySelectorAll('.cdk-overlay-container')).some(overlay => {
|
|
149
|
+
return this.el.nativeElement.contains(overlay);
|
|
150
|
+
});
|
|
151
|
+
let el = this.el.nativeElement;
|
|
152
|
+
if (!contains) {
|
|
153
|
+
const rect = this.el.nativeElement.getBoundingClientRect();
|
|
154
|
+
if ((rect.top + window.pageYOffset) < window.innerHeight) {
|
|
155
|
+
el = document.body;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
this.fetchComplete$.asObservable()
|
|
159
|
+
.pipe(take(1), takeUntil(this.onDestroy$))
|
|
160
|
+
.subscribe(() => {
|
|
161
|
+
el.scrollIntoView({ behavior: 'smooth' });
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
this.fetch$.next();
|
|
165
|
+
});
|
|
166
|
+
this.sorting.sortingChanged$
|
|
167
|
+
.pipe(takeUntil(this.onDestroy$))
|
|
168
|
+
.subscribe(() => {
|
|
169
|
+
this.dataController.setOperation(FsListState.Sort);
|
|
170
|
+
this.paging.page = 1;
|
|
171
|
+
if (this.fsScrollInstance) {
|
|
172
|
+
this.dataController.clearRows();
|
|
173
|
+
this.fsScrollInstance.reload();
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
this.fetch$.next();
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
this.listenRowsRemove();
|
|
180
|
+
this.listenFetch();
|
|
181
|
+
}
|
|
182
|
+
getData(trackBy) {
|
|
183
|
+
let rowsData = this.dataController
|
|
184
|
+
.visibleRowsData;
|
|
185
|
+
if (trackBy) {
|
|
186
|
+
rowsData = rowsData
|
|
187
|
+
.filter(trackBy);
|
|
188
|
+
}
|
|
189
|
+
return rowsData
|
|
190
|
+
.map((data) => {
|
|
191
|
+
return cloneDeep(data);
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
hasData(trackBy) {
|
|
195
|
+
return this.dataController.visibleRowsData.some(trackBy);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Toggle group mode status
|
|
199
|
+
* @param value
|
|
200
|
+
*/
|
|
201
|
+
groupEnabled(value) {
|
|
202
|
+
if (this.dataController.groupEnabled !== value) {
|
|
203
|
+
this.dataController.groupEnabled = value;
|
|
204
|
+
// Commented out because Ray wants to change group status in fetch map pipe
|
|
205
|
+
// and it triggers extra requests
|
|
206
|
+
// this.reload();
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
destroy() {
|
|
210
|
+
if (this._fsScrollSubscription) {
|
|
211
|
+
this._fsScrollSubscription.unsubscribe();
|
|
212
|
+
}
|
|
213
|
+
if (this.paging) {
|
|
214
|
+
this.paging.destroy();
|
|
215
|
+
}
|
|
216
|
+
if (this.sorting) {
|
|
217
|
+
this.sorting.destroy();
|
|
218
|
+
}
|
|
219
|
+
if (this.selection) {
|
|
220
|
+
this.selection.destroy();
|
|
221
|
+
}
|
|
222
|
+
if (this.filterConfig) {
|
|
223
|
+
this.filterConfig = null;
|
|
224
|
+
}
|
|
225
|
+
if (this.externalParams) {
|
|
226
|
+
this.externalParams.destroy();
|
|
227
|
+
}
|
|
228
|
+
this.columns.destroy();
|
|
229
|
+
this.onDestroy$.next();
|
|
230
|
+
this.onDestroy$.complete();
|
|
231
|
+
this.dataController.destroy();
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Do initialization of table
|
|
235
|
+
* @param config
|
|
236
|
+
*/
|
|
237
|
+
initialize(config) {
|
|
238
|
+
this.columns.initConfig(config.column);
|
|
239
|
+
this.initDefaultOptions(config);
|
|
240
|
+
this.initRestore();
|
|
241
|
+
this.initActions(config.actions);
|
|
242
|
+
this.initPaging(config.paging, config.loadMore);
|
|
243
|
+
this.initSelection(config.selection, this.selectionDialog);
|
|
244
|
+
this.initGroups(config.group);
|
|
245
|
+
this.initExternalParamsController();
|
|
246
|
+
this.initializeData();
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Just init options by default it it wasn't specified
|
|
250
|
+
* @param config
|
|
251
|
+
*/
|
|
252
|
+
initDefaultOptions(config) {
|
|
253
|
+
// We should prevent initial fetch in cases when it will be fetched in any case
|
|
254
|
+
// As ex. scrollable or filter will do fetch in any cases
|
|
255
|
+
if (config.initialFetch === false || config.scrollable) { // TODO fixme after tsmodel version update
|
|
256
|
+
this.initialFetch = false;
|
|
257
|
+
}
|
|
258
|
+
if (config.status === false) {
|
|
259
|
+
this.status = false;
|
|
260
|
+
}
|
|
261
|
+
if (config.chips) {
|
|
262
|
+
this.chips = config.chips;
|
|
263
|
+
}
|
|
264
|
+
if (config.filterInput === false) {
|
|
265
|
+
this.filterInput = false;
|
|
266
|
+
}
|
|
267
|
+
if (this.inDialog) {
|
|
268
|
+
this.queryParam = false;
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
this.queryParam = (config.queryParam === void 0)
|
|
272
|
+
? true
|
|
273
|
+
: config.queryParam;
|
|
274
|
+
}
|
|
275
|
+
if (config.sorts) {
|
|
276
|
+
this.sorting.initFakeColumns(config.sorts);
|
|
277
|
+
}
|
|
278
|
+
if (!config.trackBy) {
|
|
279
|
+
this.trackBy = 'id';
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Init restore row action and append Show Deleted option into filters
|
|
284
|
+
*/
|
|
285
|
+
initRestore() {
|
|
286
|
+
if (this.restore) {
|
|
287
|
+
const restoreAction = new RowAction({
|
|
288
|
+
label: this.restore.menuLabel || 'Restore',
|
|
289
|
+
menu: true,
|
|
290
|
+
click: (row) => { this.restoreClick(this.restore.click, row); },
|
|
291
|
+
restore: true
|
|
292
|
+
});
|
|
293
|
+
if (!this.rowActionsRaw) {
|
|
294
|
+
this.rowActionsRaw = [];
|
|
295
|
+
}
|
|
296
|
+
this.rowActionsRaw.push(restoreAction);
|
|
297
|
+
if (!this.filters) {
|
|
298
|
+
this.filters = [];
|
|
299
|
+
}
|
|
300
|
+
if (this.restore.filter !== false) {
|
|
301
|
+
this.filters.push({
|
|
302
|
+
name: SHOW_DELETED_FILTERS_KEY,
|
|
303
|
+
type: ItemType.Checkbox,
|
|
304
|
+
label: this.restore.filterLabel || 'Show Deleted'
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Init paging
|
|
311
|
+
* @param pagingConfig
|
|
312
|
+
* @param loadMore
|
|
313
|
+
*/
|
|
314
|
+
initPaging(pagingConfig, loadMore) {
|
|
315
|
+
this.paging.initWithConfig(pagingConfig, loadMore, !!this.scrollable);
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Split actions by categories
|
|
319
|
+
*/
|
|
320
|
+
initActions(actions) {
|
|
321
|
+
if (actions) {
|
|
322
|
+
this.actions.setActions(actions);
|
|
323
|
+
}
|
|
324
|
+
this.hasRowActions =
|
|
325
|
+
(this.rowActionsRaw && this.rowActionsRaw.length > 0)
|
|
326
|
+
|| (this.groupActionsRaw && this.groupActionsRaw.length > 0);
|
|
327
|
+
}
|
|
328
|
+
initSelection(selectionConfig, selectionDialog) {
|
|
329
|
+
if (selectionConfig) {
|
|
330
|
+
this.selection = new SelectionController(selectionConfig, this.trackBy, selectionDialog);
|
|
331
|
+
this.selection.setRowsCallback(() => this.dataController.visibleRows);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
initializeData() {
|
|
335
|
+
this.dataController.setAdditionalConfigs({
|
|
336
|
+
scrollable: !!this.scrollable,
|
|
337
|
+
loadMoreEnabled: this.paging.loadMoreEnabled
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
initGroups(groupConfig) {
|
|
341
|
+
if (groupConfig) {
|
|
342
|
+
this.dataController.setGroupConfig(groupConfig);
|
|
343
|
+
this.groupActionsRaw = groupConfig.actions;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
initExternalParamsController() {
|
|
347
|
+
this.externalParams = new ExternalParamsController(this.router, this.route, this.persistance, this.paging, this.sorting, this.queryParam);
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Subscribe to fetch$ event with debounce
|
|
351
|
+
*/
|
|
352
|
+
listenFetch() {
|
|
353
|
+
let fetch$ = this.fetch$.asObservable();
|
|
354
|
+
// Should wait until saved filters not loaded
|
|
355
|
+
if (!!this.filters && !!this.savedFilters) {
|
|
356
|
+
fetch$ = combineLatest([fetch$, this.filtersReady$])
|
|
357
|
+
.pipe(map(([params]) => params));
|
|
358
|
+
}
|
|
359
|
+
fetch$
|
|
360
|
+
.pipe(debounceTime(50), tap(() => {
|
|
361
|
+
this.loading$.next(true);
|
|
362
|
+
}), tap(() => {
|
|
363
|
+
var _a;
|
|
364
|
+
(_a = this.selection) === null || _a === void 0 ? void 0 : _a.closeSelectionDialog();
|
|
365
|
+
}), map((params) => {
|
|
366
|
+
const query = this.paging.hasOffsetStrategy && params && params.loadOffset
|
|
367
|
+
? Object.assign({}, this.filtersQuery, this.paging.loadDeletedOffsetQuery)
|
|
368
|
+
: Object.assign({}, this.filtersQuery, this.paging.query);
|
|
369
|
+
if (this.sorting.sortingColumn) {
|
|
370
|
+
Object.assign(query, {
|
|
371
|
+
order: `${this.sorting.sortingColumn.name},${this.sorting.sortingColumn.direction}`
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
return query;
|
|
375
|
+
}), switchMap((query) => {
|
|
376
|
+
if (this.columns.loadFnConfigured && !this.columns.columnsFetched) {
|
|
377
|
+
return this.columns.loadRemoteColumnConfigs()
|
|
378
|
+
.pipe(mapTo(query));
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
return of(query);
|
|
382
|
+
}
|
|
383
|
+
}), switchMap((query) => {
|
|
384
|
+
if (this.columns.configured) {
|
|
385
|
+
Object.assign(query, {
|
|
386
|
+
columns: this.columns.visibleColumnsNames,
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
return combineLatest([of(query), this.fetchRemote(query)]);
|
|
390
|
+
}), catchError((error, source$) => {
|
|
391
|
+
console.error(error);
|
|
392
|
+
return source$;
|
|
393
|
+
}), takeUntil(this.onDestroy$))
|
|
394
|
+
.subscribe((response) => {
|
|
395
|
+
this.completeFetch(response);
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
listenRowsRemove() {
|
|
399
|
+
this.dataController.rowsRemoved$
|
|
400
|
+
.pipe(takeUntil(this.onDestroy$))
|
|
401
|
+
.subscribe((rows) => {
|
|
402
|
+
if (this.paging.enabled) {
|
|
403
|
+
const removedCount = rows.length;
|
|
404
|
+
if (this.paging.hasPageStrategy) {
|
|
405
|
+
this.noDataPaginationUpdate(removedCount);
|
|
406
|
+
}
|
|
407
|
+
else {
|
|
408
|
+
// Fetch more if has something for fetch
|
|
409
|
+
if (this.dataController.hasData || this.paging.hasNextPage) {
|
|
410
|
+
this.dataController.setOperation(FsListState.LoadMore);
|
|
411
|
+
this.paging.removeRows(removedCount);
|
|
412
|
+
this.fetch$.next({ loadOffset: true });
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
this.noDataPaginationUpdate(removedCount);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
// Remove from selection
|
|
420
|
+
if (this.selection) {
|
|
421
|
+
rows.forEach((row) => {
|
|
422
|
+
this.selection.removeRow(row.data);
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
initInfinityScroll() {
|
|
428
|
+
if (this.fsScrollInstance) {
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
if (this.scrollable) {
|
|
432
|
+
// Scrollable status by default
|
|
433
|
+
if (this.scrollable.status === void 0) {
|
|
434
|
+
this.scrollable.status = true;
|
|
435
|
+
}
|
|
436
|
+
this.fsScroll
|
|
437
|
+
.component(this.scrollable.name)
|
|
438
|
+
.pipe(takeUntil(this.onDestroy$))
|
|
439
|
+
.subscribe((fsScrollInstance) => {
|
|
440
|
+
this.fsScrollInstance = fsScrollInstance;
|
|
441
|
+
this._fsScrollSubscription = fsScrollInstance
|
|
442
|
+
.subscribe(() => {
|
|
443
|
+
let startLoading = false;
|
|
444
|
+
const operation = this.dataController.operation;
|
|
445
|
+
// Initial loading if initialFetch equals false
|
|
446
|
+
if (!this.initialFetch
|
|
447
|
+
&& !this.paging.initialized
|
|
448
|
+
&& operation !== FsListState.Reload) {
|
|
449
|
+
this.dataController.setOperation(FsListState.Load);
|
|
450
|
+
startLoading = true;
|
|
451
|
+
}
|
|
452
|
+
else if (operation === FsListState.Reload ||
|
|
453
|
+
operation === FsListState.Filter ||
|
|
454
|
+
operation === FsListState.Sort) {
|
|
455
|
+
startLoading = true;
|
|
456
|
+
}
|
|
457
|
+
else if (this.paging.initialized && this.paging.hasNextPage) {
|
|
458
|
+
// Loading if content has been scrolled
|
|
459
|
+
startLoading = true;
|
|
460
|
+
this.dataController.setOperation(FsListState.Load);
|
|
461
|
+
this.paging.goNext();
|
|
462
|
+
}
|
|
463
|
+
if (startLoading) {
|
|
464
|
+
this.fetch$.next();
|
|
465
|
+
fsScrollInstance.loading();
|
|
466
|
+
}
|
|
467
|
+
});
|
|
468
|
+
this.dataController.remoteRowsChange$
|
|
469
|
+
.pipe(takeUntil(this.onDestroy$))
|
|
470
|
+
.subscribe(() => {
|
|
471
|
+
fsScrollInstance.loaded();
|
|
472
|
+
});
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* Update and watch filter changes
|
|
478
|
+
*/
|
|
479
|
+
initFilters() {
|
|
480
|
+
if (this.filterConfig) {
|
|
481
|
+
return;
|
|
482
|
+
}
|
|
483
|
+
// Merge sorting and fake sorting cols
|
|
484
|
+
// Fake sorting cols it's cols which don't represented in table cols, like abstract cols
|
|
485
|
+
const sortValues = [
|
|
486
|
+
...this.sorting.sortingColumns,
|
|
487
|
+
...this.sorting.fakeSortingColumns
|
|
488
|
+
].reduce((acc, column) => {
|
|
489
|
+
const sortingItem = {
|
|
490
|
+
name: column.title,
|
|
491
|
+
value: column.name,
|
|
492
|
+
default: this.sorting.sortingColumn && this.sorting.sortingColumn.name === column.name
|
|
493
|
+
};
|
|
494
|
+
acc.push(sortingItem);
|
|
495
|
+
return acc;
|
|
496
|
+
}, []);
|
|
497
|
+
const sortConfig = this.sorting.sortingColumn
|
|
498
|
+
? { value: this.sorting.sortingColumn.name, direction: this.sorting.sortingColumn.direction }
|
|
499
|
+
: null;
|
|
500
|
+
// Config
|
|
501
|
+
this.filterConfig = {
|
|
502
|
+
persist: this.persist,
|
|
503
|
+
items: this.filters || [],
|
|
504
|
+
savedFilters: this.savedFilters,
|
|
505
|
+
inline: this.inlineFilters,
|
|
506
|
+
actions: this.actions.actions,
|
|
507
|
+
queryParam: this.queryParam,
|
|
508
|
+
sorts: sortValues,
|
|
509
|
+
sort: sortConfig,
|
|
510
|
+
chips: this.chips,
|
|
511
|
+
init: this.filterInit.bind(this),
|
|
512
|
+
change: this.filterChange.bind(this),
|
|
513
|
+
reload: this.reload.bind(this),
|
|
514
|
+
sortChange: this.filterSort.bind(this),
|
|
515
|
+
};
|
|
516
|
+
}
|
|
517
|
+
/**
|
|
518
|
+
* Callback when Filter has been initialized
|
|
519
|
+
* @param filters
|
|
520
|
+
*/
|
|
521
|
+
filterInit(filters) {
|
|
522
|
+
if (this.filterInitCb) {
|
|
523
|
+
this.filterInitCb(filters);
|
|
524
|
+
}
|
|
525
|
+
this.filtersQuery = filters;
|
|
526
|
+
this.checkRestoreFilter();
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* Callback when Filter has been changed
|
|
530
|
+
* @param filterQuery
|
|
531
|
+
* @param filterSort
|
|
532
|
+
*/
|
|
533
|
+
filterChange(filterQuery, filterSort) {
|
|
534
|
+
if (this.filterChangeCb) {
|
|
535
|
+
this.filterChangeCb(filterQuery, filterSort);
|
|
536
|
+
}
|
|
537
|
+
this.filtersQuery = filterQuery;
|
|
538
|
+
this.restoreMode = false;
|
|
539
|
+
// Restore option
|
|
540
|
+
this.checkRestoreFilter();
|
|
541
|
+
if (this.restore && this.restore.reload) {
|
|
542
|
+
this.reload();
|
|
543
|
+
}
|
|
544
|
+
this.dataController.setOperation(FsListState.Filter);
|
|
545
|
+
// Reset paging for request with correct offset
|
|
546
|
+
this.paging.resetPaging();
|
|
547
|
+
if (this.fsScrollInstance) {
|
|
548
|
+
this.dataController.clearRows();
|
|
549
|
+
this.fsScrollInstance.reload();
|
|
550
|
+
}
|
|
551
|
+
else {
|
|
552
|
+
this.fetch$.next();
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
checkRestoreFilter() {
|
|
556
|
+
// Restore option
|
|
557
|
+
if (this.restore && this.filtersQuery[SHOW_DELETED_FILTERS_KEY]) {
|
|
558
|
+
delete this.filtersQuery[SHOW_DELETED_FILTERS_KEY];
|
|
559
|
+
Object.assign(this.filtersQuery, this.restore.query);
|
|
560
|
+
this.restoreMode = true;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
// Callback when Filter sort has been changed
|
|
564
|
+
filterSort(filterQuery, filterSort) {
|
|
565
|
+
if (filterSort) {
|
|
566
|
+
this.sorting.sortByColumnWithName(filterSort.value);
|
|
567
|
+
const sortDirection = filterSort.direction === 'asc' ? SortingDirection.asc : SortingDirection.desc;
|
|
568
|
+
this.sorting.sortDirection(sortDirection);
|
|
569
|
+
}
|
|
570
|
+
else {
|
|
571
|
+
// FIXME need to be refactored...
|
|
572
|
+
this.sorting.sortingColumn = void 0;
|
|
573
|
+
this.reload();
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
completeFetch([query, response]) {
|
|
577
|
+
var _a;
|
|
578
|
+
if (!this.paging.page) {
|
|
579
|
+
this.paging.page = 1;
|
|
580
|
+
}
|
|
581
|
+
if (response.paging) {
|
|
582
|
+
const displayed = (Array.isArray(response.data) && response.data.length) || 0;
|
|
583
|
+
this.paging.updatePaging(response.paging, displayed, this.dataController.operation === FsListState.LoadMore);
|
|
584
|
+
}
|
|
585
|
+
else if (this.paging.enabled) {
|
|
586
|
+
console.log('%c FsList Warning ', 'color: white; background-color: #ffcc0b', 'Pagination does not configured properly. ' +
|
|
587
|
+
'Pagination is enabled, but http response does not contain "paging" field. ' +
|
|
588
|
+
'You have to set "paging: false" in config or add "paging" field to response.');
|
|
589
|
+
}
|
|
590
|
+
/// must be before selection, because seletion use records
|
|
591
|
+
this.dataController.setRowsFromResponse(response.data);
|
|
592
|
+
///
|
|
593
|
+
// Update selection params
|
|
594
|
+
if (this.selection) {
|
|
595
|
+
if (this.paging.enabled) {
|
|
596
|
+
this.selection.pageChanged(this.scrollable);
|
|
597
|
+
this.selection.updateVisibleRecordsCount(this.paging.getVisibleRecords());
|
|
598
|
+
this.selection.updateTotalRecordsCount(this.paging.records);
|
|
599
|
+
}
|
|
600
|
+
else {
|
|
601
|
+
const count = response.paging && response.paging.records
|
|
602
|
+
|| Array.isArray(response.data) && response.data.length;
|
|
603
|
+
this.selection.updateVisibleRecordsCount(count);
|
|
604
|
+
this.selection.updateTotalRecordsCount(count);
|
|
605
|
+
}
|
|
606
|
+
this.selection.selectedRowsIntersection(this.dataController.visibleRowsData);
|
|
607
|
+
}
|
|
608
|
+
if (((_a = this.emptyState) === null || _a === void 0 ? void 0 : _a.validate) && this.emptyStateTemplate) {
|
|
609
|
+
this.emptyStateEnabled = this.emptyState.validate(query, cloneDeep(response.data));
|
|
610
|
+
}
|
|
611
|
+
this.fetchComplete$.next();
|
|
612
|
+
this.loading$.next(false);
|
|
613
|
+
}
|
|
614
|
+
/**
|
|
615
|
+
* Will do some actions if you removed item and item was last on his own page
|
|
616
|
+
*
|
|
617
|
+
* Ex: if list has 3 pages and on third page you have only one item. And you just deleted this item.
|
|
618
|
+
* You must go to second page, but if it was last page and you can't go back -> just reload
|
|
619
|
+
*
|
|
620
|
+
* @param deletedCount
|
|
621
|
+
*/
|
|
622
|
+
noDataPaginationUpdate(deletedCount) {
|
|
623
|
+
if (!this.dataController.hasData) {
|
|
624
|
+
if (this.paging.page > 1) {
|
|
625
|
+
this.paging.goToPage(this.paging.page - 1 || 1);
|
|
626
|
+
}
|
|
627
|
+
else {
|
|
628
|
+
this.reload();
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
this.paging.records -= deletedCount;
|
|
632
|
+
this.paging.updatePagination();
|
|
633
|
+
if (this.dataController.hasData && this.selection) {
|
|
634
|
+
this.selection.updateVisibleRecordsCount(this.dataController.visibleRowsCount);
|
|
635
|
+
this.selection.updateTotalRecordsCount(this.paging.records);
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
/**
|
|
639
|
+
* Temporary solution, will do auto subscribe if was returned Observable.
|
|
640
|
+
*
|
|
641
|
+
* TODO: MOVE THIS PEACE OF CODE TO SPECIAL PLACE
|
|
642
|
+
*
|
|
643
|
+
* @param restoreClickCallback
|
|
644
|
+
* @param row
|
|
645
|
+
*/
|
|
646
|
+
restoreClick(restoreClickCallback, row) {
|
|
647
|
+
const restoreClickResult = restoreClickCallback(row);
|
|
648
|
+
if (restoreClickResult instanceof Observable) {
|
|
649
|
+
restoreClickResult
|
|
650
|
+
.pipe(take(1), takeUntil(this.onDestroy$))
|
|
651
|
+
.subscribe({
|
|
652
|
+
next: () => this.reload(),
|
|
653
|
+
error: () => { },
|
|
654
|
+
});
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
__decorate([
|
|
659
|
+
Alias(),
|
|
660
|
+
__metadata("design:type", String)
|
|
661
|
+
], List.prototype, "heading", void 0);
|
|
662
|
+
__decorate([
|
|
663
|
+
Alias(),
|
|
664
|
+
__metadata("design:type", String)
|
|
665
|
+
], List.prototype, "trackBy", void 0);
|
|
666
|
+
__decorate([
|
|
667
|
+
Alias(),
|
|
668
|
+
__metadata("design:type", String)
|
|
669
|
+
], List.prototype, "subheading", void 0);
|
|
670
|
+
__decorate([
|
|
671
|
+
Alias(),
|
|
672
|
+
__metadata("design:type", Object)
|
|
673
|
+
], List.prototype, "inlineFilters", void 0);
|
|
674
|
+
__decorate([
|
|
675
|
+
Alias('rowActions'),
|
|
676
|
+
__metadata("design:type", Array)
|
|
677
|
+
], List.prototype, "rowActionsRaw", void 0);
|
|
678
|
+
__decorate([
|
|
679
|
+
Alias('rowClass'),
|
|
680
|
+
__metadata("design:type", Object)
|
|
681
|
+
], List.prototype, "rowClass", void 0);
|
|
682
|
+
__decorate([
|
|
683
|
+
Alias(),
|
|
684
|
+
__metadata("design:type", Object)
|
|
685
|
+
], List.prototype, "rowEvents", void 0);
|
|
686
|
+
__decorate([
|
|
687
|
+
Alias(),
|
|
688
|
+
__metadata("design:type", Object)
|
|
689
|
+
], List.prototype, "restore", void 0);
|
|
690
|
+
__decorate([
|
|
691
|
+
Alias(),
|
|
692
|
+
__metadata("design:type", Object)
|
|
693
|
+
], List.prototype, "columnTemplates", void 0);
|
|
694
|
+
__decorate([
|
|
695
|
+
Alias(),
|
|
696
|
+
__metadata("design:type", Boolean)
|
|
697
|
+
], List.prototype, "persist", void 0);
|
|
698
|
+
__decorate([
|
|
699
|
+
Alias(),
|
|
700
|
+
__metadata("design:type", Object)
|
|
701
|
+
], List.prototype, "filters", void 0);
|
|
702
|
+
__decorate([
|
|
703
|
+
Alias('filterInit'),
|
|
704
|
+
__metadata("design:type", Function)
|
|
705
|
+
], List.prototype, "filterInitCb", void 0);
|
|
706
|
+
__decorate([
|
|
707
|
+
Alias('filterChange'),
|
|
708
|
+
__metadata("design:type", Function)
|
|
709
|
+
], List.prototype, "filterChangeCb", void 0);
|
|
710
|
+
__decorate([
|
|
711
|
+
Alias(),
|
|
712
|
+
__metadata("design:type", Object)
|
|
713
|
+
], List.prototype, "savedFilters", void 0);
|
|
714
|
+
__decorate([
|
|
715
|
+
Alias(),
|
|
716
|
+
__metadata("design:type", Object)
|
|
717
|
+
], List.prototype, "scrollable", void 0);
|
|
718
|
+
__decorate([
|
|
719
|
+
Alias(),
|
|
720
|
+
__metadata("design:type", Object)
|
|
721
|
+
], List.prototype, "noResults", void 0);
|
|
722
|
+
__decorate([
|
|
723
|
+
Alias(),
|
|
724
|
+
__metadata("design:type", Object)
|
|
725
|
+
], List.prototype, "emptyState", void 0);
|
|
726
|
+
__decorate([
|
|
727
|
+
Alias('fetch'),
|
|
728
|
+
__metadata("design:type", Function)
|
|
729
|
+
], List.prototype, "fetchFn", void 0);
|
|
730
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZpcmVzdGl0Y2gvbGlzdC8iLCJzb3VyY2VzIjpbImFwcC9jbGFzc2VzL2xpc3QtY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsT0FBTyxFQUFxRCxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUlqRyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV4QyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixJQUFJLEVBQ0osVUFBVSxFQUNWLEVBQUUsRUFDRixPQUFPLEVBRVIsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0wsVUFBVSxFQUNWLFlBQVksRUFDWixHQUFHLEVBQ0gsS0FBSyxFQUNMLFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNULEdBQUcsR0FDSixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFdEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFpQjFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlC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QUssRUFBRTs7dUNBQXVCO0FBQ3RCO0lBQVIsS0FBSyxFQUFFOztxQ0FBcUM7QUFDcEM7SUFBUixLQUFLLEVBQUU7OzZDQUE2QjtBQUM1QjtJQUFSLEtBQUssRUFBRTs7cUNBQXlCO0FBQ3hCO0lBQVIsS0FBSyxFQUFFOztxQ0FBcUI7QUFDUjtJQUFwQixLQUFLLENBQUMsWUFBWSxDQUFDOzswQ0FBK0I7QUFDNUI7SUFBdEIsS0FBSyxDQUFDLGNBQWMsQ0FBQzs7NENBQWlDO0FBQzlDO0lBQVIsS0FBSyxFQUFFOzswQ0FBZ0Q7QUFDL0M7SUFBUixLQUFLLEVBQUU7O3dDQUEyRDtBQUMxRDtJQUFSLEtBQUssRUFBRTs7dUNBQXlDO0FBQ3hDO0lBQVIsS0FBSyxFQUFFOzt3Q0FBMkM7QUFFbkM7SUFBZixLQUFLLENBQUMsT0FBTyxDQUFDOztxQ0FBK0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50UmVmLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBDaGFuZ2VGbiwgRmlsdGVyQ29uZmlnLCBJRmlsdGVyU2F2ZWRGaWx0ZXJzQ29uZmlnLCBJdGVtVHlwZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2ZpbHRlcic7XG5pbXBvcnQgeyBGc1Njcm9sbEluc3RhbmNlLCBGc1Njcm9sbFNlcnZpY2UgfSBmcm9tICdAZmlyZXN0aXRjaC9zY3JvbGwnO1xuaW1wb3J0IHsgU2VsZWN0aW9uRGlhbG9nIH0gZnJvbSAnQGZpcmVzdGl0Y2gvc2VsZWN0aW9uJztcblxuaW1wb3J0IHsgQWxpYXMsIE1vZGVsIH0gZnJvbSAndHNtb2RlbHMnO1xuXG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGZyb20sXG4gIE9ic2VydmFibGUsXG4gIG9mLFxuICBTdWJqZWN0LFxuICBTdWJzY3JpcHRpb25cbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBjYXRjaEVycm9yLFxuICBkZWJvdW5jZVRpbWUsXG4gIG1hcCxcbiAgbWFwVG8sXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsLFxuICB0YXAsXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGNsb25lRGVlcCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbmltcG9ydCB7IFNvcnRpbmdEaXJlY3Rpb24gfSBmcm9tICcuLi9tb2RlbHMvY29sdW1uLm1vZGVsJztcblxuLy8gSW50ZXJmYWNlc1xuaW1wb3J0IHtcbiAgRnNMaXN0Q29uZmlnLFxuICBGc0xpc3RFbXB0eVN0YXRlQ29uZmlnLCBGc0xpc3RGZXRjaEZuLCBGc0xpc3RGZXRjaE9wdGlvbnMsXG4gIEZzTGlzdEZldGNoU3Vic2NyaXB0aW9uLFxuICBGc0xpc3RHcm91cENvbmZpZyxcbiAgRnNMaXN0TG9hZE1vcmVDb25maWcsXG4gIEZzTGlzdE5vUmVzdWx0c0NvbmZpZyxcbiAgRnNMaXN0UmVzdG9yZUNvbmZpZyxcbiAgRnNMaXN0U2Nyb2xsYWJsZUNvbmZpZyxcbiAgRnNMaXN0U2VsZWN0aW9uQ29uZmlnLFxuICBGc0xpc3RUcmFja0J5Rm4sXG4gIEZzUGFnaW5nLFxuICBQYWdlQ2hhbmdlXG59IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgU3R5bGVDb25maWcgfSBmcm9tICcuLi9tb2RlbHMvc3R5bGVDb25maWcubW9kZWwnO1xuaW1wb3J0IHsgUm93QWN0aW9uIH0gZnJvbSAnLi4vbW9kZWxzL3Jvdy1hY3Rpb24ubW9kZWwnO1xuaW1wb3J0IHsgQ29sdW1uc0NvbnRyb2xsZXIgfSBmcm9tICcuL2NvbHVtbnMtY29udHJvbGxlcic7XG5pbXBvcnQgeyBQYWdlQ2hhbmdlVHlwZSB9IGZyb20gJy4uL2VudW1zL3BhZ2UtY2hhbmdlLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBBY3Rpb25zQ29udHJvbGxlciB9IGZyb20gJy4vaW5kZXgnO1xuaW1wb3J0IHsgRGF0YUNvbnRyb2xsZXIgfSBmcm9tICcuL2RhdGEtY29udHJvbGxlcic7XG5pbXBvcnQgeyBQYWdpbmF0aW9uQ29udHJvbGxlciB9IGZyb20gJy4vcGFnaW5hdGlvbi1jb250cm9sbGVyJztcbmltcG9ydCB7IFNlbGVjdGlvbkNvbnRyb2xsZXIgfSBmcm9tICcuL3NlbGVjdGlvbi1jb250cm9sbGVyJztcbmltcG9ydCB7IFNvcnRpbmdDb250cm9sbGVyIH0gZnJvbSAnLi9zb3J0aW5nLWNvbnRyb2xsZXInO1xuXG5pbXBvcnQgeyBGc0xpc3RTdGF0ZSB9IGZyb20gJy4uL2VudW1zL3N0YXRlLmVudW0nO1xuaW1wb3J0IHsgUGVyc2lzdGFuY2VDb250cm9sbGVyIH0gZnJvbSAnLi9wZXJzaXN0YW5jZS1jb250cm9sbGVyJztcbmltcG9ydCB7IEV4dGVybmFsUGFyYW1zQ29udHJvbGxlciB9IGZyb20gJy4vZXh0ZXJuYWwtcGFyYW1zLWNvbnRyb2xsZXInO1xuXG5jb25zdCBTSE9XX0RFTEVURURfRklMVEVSU19LRVkgPSAnJCRfc2hvd19kZWxldGVkXyQkJztcblxuXG5leHBvcnQgY2xhc3MgTGlzdCBleHRlbmRzIE1vZGVsIHtcbiAgQEFsaWFzKCkgcHVibGljIGhlYWRpbmc6IHN0cmluZztcbiAgQEFsaWFzKCkgcHVibGljIHRyYWNrQnk6IHN0cmluZztcbiAgQEFsaWFzKCkgcHVibGljIHN1YmhlYWRpbmc6IHN0cmluZztcbiAgQEFsaWFzKCkgcHVibGljIGlubGluZUZpbHRlcnM6IGFueTtcbiAgLy8gQEFsaWFzKCdhY3Rpb25zJywgQWN0aW9uKSBwdWJsaWMgYWN0aW9uczogQWN0aW9uW107XG4gIEBBbGlhcygncm93QWN0aW9ucycpIHB1YmxpYyByb3dBY3Rpb25zUmF3OiBhbnlbXTtcbiAgcHVibGljIGdyb3VwQWN0aW9uc1JhdzogYW55W107XG4gIEBBbGlhcygncm93Q2xhc3MnKSBwdWJsaWMgcm93Q2xhc3M7XG4gIEBBbGlhcygpIHB1YmxpYyByb3dFdmVudHM6IGFueTtcbiAgQEFsaWFzKCkgcHVibGljIHJlc3RvcmU6IEZzTGlzdFJlc3RvcmVDb25maWc7XG4gIEBBbGlhcygpIHB1YmxpYyBjb2x1bW5UZW1wbGF0ZXM6IGFueTtcbiAgQEFsaWFzKCkgcHVibGljIHBlcnNpc3Q6IGJvb2xlYW47XG4gIEBBbGlhcygpIHB1YmxpYyBmaWx0ZXJzID0gW107XG4gIEBBbGlhcygnZmlsdGVySW5pdCcpIHB1YmxpYyBmaWx0ZXJJbml0Q2I6IENoYW5nZUZuO1xuICBAQWxpYXMoJ2ZpbHRlckNoYW5nZScpIHB1YmxpYyBmaWx0ZXJDaGFuZ2VDYjogQ2hhbmdlRm47XG4gIEBBbGlhcygpIHB1YmxpYyBzYXZlZEZpbHRlcnM6IElGaWx0ZXJTYXZlZEZpbHRlcnNDb25maWc7XG4gIEBBbGlhcygpIHB1YmxpYyBzY3JvbGxhYmxlOiBGc0xpc3RTY3JvbGxhYmxlQ29uZmlnIHwgZmFsc2UgPSBmYWxzZTtcbiAgQEFsaWFzKCkgcHVibGljIG5vUmVzdWx0czogRnNMaXN0Tm9SZXN1bHRzQ29uZmlnO1xuICBAQWxpYXMoKSBwdWJsaWMgZW1wdHlTdGF0ZTogRnNMaXN0RW1wdHlTdGF0ZUNvbmZpZztcbiAgLy8gQEFsaWFzKCkgcHVibGljIGluaXRpYWxGZXRjaCA9IHRydWU7IC8vVE9ETyBmaXhtZVxuICBAQWxpYXMoJ2ZldGNoJykgcHVibGljIGZldGNoRm46IEZzTGlzdEZldGNoRm47XG4gIC8vIEBBbGlhcygncm93cycpIHByaXZhdGUgX3Jvd3M6IGFueTtcblxuICBwdWJsaWMgaW5pdGlhbGl6ZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIHB1YmxpYyBsb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gIC8vIHB1YmxpYyBvcGVyYXRpb246IE9wZXJhdGlvbjtcbiAgcHVibGljIGZpbHRlcnNRdWVyeTogYW55O1xuXG4gIHB1YmxpYyBoYXNSb3dBY3Rpb25zO1xuICBwdWJsaWMgcGFnaW5nID0gbmV3IFBhZ2luYXRpb25Db250cm9sbGVyKCk7XG5cbiAgcHVibGljIGNvbHVtbnMgPSBuZXcgQ29sdW1uc0NvbnRyb2xsZXIoKTtcbiAgcHVibGljIGFjdGlvbnMgPSBuZXcgQWN0aW9uc0NvbnRyb2xsZXIoKTtcbiAgcHVibGljIGRhdGFDb250cm9sbGVyID0gbmV3IERhdGFDb250cm9sbGVyKCk7XG4gIHB1YmxpYyBzb3J0aW5nID0gbmV3IFNvcnRpbmdDb250cm9sbGVyKCk7XG4gIHB1YmxpYyBleHRlcm5hbFBhcmFtczogRXh0ZXJuYWxQYXJhbXNDb250cm9sbGVyO1xuICBwdWJsaWMgc2VsZWN0aW9uOiBTZWxlY3Rpb25Db250cm9sbGVyO1xuXG4gIHB1YmxpYyBmaWx0ZXJDb25maWc6IEZpbHRlckNvbmZpZyA9IG51bGw7XG5cbiAgcHVibGljIGZldGNoJCA9IG5ldyBTdWJqZWN0PEZzTGlzdEZldGNoU3Vic2NyaXB0aW9uIHwgdm9pZD4oKTtcbiAgcHVibGljIGZldGNoQ29tcGxldGUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHVibGljIGZpbHRlcnNSZWFkeSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHB1YmxpYyBzdGF0dXMgPSB0cnVlO1xuICBwdWJsaWMgY2hpcHMgPSBmYWxzZTtcbiAgcHVibGljIGZpbHRlcklucHV0ID0gdHJ1ZTtcbiAgcHVibGljIHF1ZXJ5UGFyYW0gPSBmYWxzZTtcbiAgcHVibGljIHJlc3RvcmVNb2RlID0gZmFsc2U7XG5cbiAgcHVibGljIGluaXRpYWxGZXRjaCA9IHRydWU7XG5cbiAgLy8gRW1wdHkgc3RhdGVcbiAgcHVibGljIGVtcHR5U3RhdGVFbmFibGVkID0gZmFsc2U7XG4gIHB1YmxpYyBlbXB0eVN0YXRlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgcHVibGljIGZzU2Nyb2xsSW5zdGFuY2U6IEZzU2Nyb2xsSW5zdGFuY2U7XG5cbiAgcHVibGljIG9uRGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2hlYWRlckNvbmZpZzogU3R5bGVDb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2dyb3VwQ2VsbENvbmZpZzogU3R5bGVDb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NlbGxDb25maWc6IFN0eWxlQ29uZmlnO1xuICBwcml2YXRlIHJlYWRvbmx5IF9mb290ZXJDb25maWc6IFN0eWxlQ29uZmlnO1xuXG4gIHByaXZhdGUgX2ZzU2Nyb2xsU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGNvbmZpZzogRnNMaXN0Q29uZmlnID0ge30sXG4gICAgcHJpdmF0ZSBmc1Njcm9sbDogRnNTY3JvbGxTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2VsZWN0aW9uRGlhbG9nOiBTZWxlY3Rpb25EaWFsb2csXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHBlcnNpc3RhbmNlOiBQZXJzaXN0YW5jZUNvbnRyb2xsZXIsXG4gICAgcHJpdmF0ZSBpbkRpYWxvZzogYm9vbGVhbixcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9mcm9tSlNPTihjb25maWcpO1xuXG4gICAgdGhpcy5pbml0aWFsaXplKGNvbmZpZyk7XG5cbiAgICB0aGlzLl9oZWFkZXJDb25maWcgPSBuZXcgU3R5bGVDb25maWcoY29uZmlnLmhlYWRlcik7XG4gICAgdGhpcy5fZ3JvdXBDZWxsQ29uZmlnID0gbmV3IFN0eWxlQ29uZmlnKGNvbmZpZy5jZWxsKTtcbiAgICB0aGlzLl9jZWxsQ29uZmlnID0gbmV3IFN0eWxlQ29uZmlnKGNvbmZpZy5jZWxsKTtcbiAgICB0aGlzLl9mb290ZXJDb25maWcgPSBuZXcgU3R5bGVDb25maWcoY29uZmlnLmZvb3Rlcik7XG5cbiAgICB0aGlzLmluaXRpYWxpemVkJC5uZXh0KHRydWUpO1xuXG4gICAgdGhpcy5zdWJzY3JpYmUoKTtcblxuICAgIGlmICh0aGlzLmluaXRpYWxGZXRjaCkge1xuICAgICAgdGhpcy5kYXRhQ29udHJvbGxlci5zZXRPcGVyYXRpb24oRnNMaXN0U3RhdGUuTG9hZCk7XG4gICAgICB0aGlzLmZldGNoJC5uZXh0KCk7XG4gICAgfVxuXG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc1NhdmVkRmlsdGVycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmZpbHRlckNvbmZpZy5zYXZlZEZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgZmV0Y2hSZW1vdGUocXVlcnkpIHtcbiAgICBjb25zdCBvcHRpb25zOiBGc0xpc3RGZXRjaE9wdGlvbnMgPSB7XG4gICAgICBzdGF0ZTogdGhpcy5kYXRhQ29udHJvbGxlci5vcGVyYXRpb24sXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdDogYW55ID0gdGhpcy5mZXRjaEZuKHF1ZXJ5LCBvcHRpb25zKTtcblxuICAgIHJldHVybiByZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlID8gZnJvbShyZXN1bHQpIDogcmVzdWx0O1xuICB9XG5cbiAgLy8gcHVibGljIGxvYWRMb2NhbCgpIHtcbiAgLy8gICB0aGlzLnBhZ2luZy51cGRhdGVQYWdpbmdNYW51YWwodGhpcy5fcm93cyk7XG4gIC8vICAgY29uc3QgZnJvbSA9ICh0aGlzLnBhZ2luZy5wYWdlIC0gMSkgKiB0aGlzLnBhZ2luZy5saW1pdDtcbiAgLy8gICBjb25zdCB0byA9ICh0aGlzLnBhZ2luZy5wYWdlID09PSAxKSA/IHRoaXMucGFnaW5nLmxpbWl0IDogdGhpcy5wYWdpbmcubGltaXQgKiB0aGlzLnBhZ2luZy5wYWdlO1xuICAvLyAgIGNvbnN0IHNsaWNlT2ZSb3dzID0gdGhpcy5fcm93cy5zbGljZShmcm9tLCB0byk7XG4gIC8vICAgdGhpcy5kYXRhJC5uZXh0KHNsaWNlT2ZSb3dzKTtcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gdGVtcGxhdGVzIGZvciB1c2luZ1xuICAgKiBAcGFyYW0gdGVtcGxhdGVzXG4gICAqL1xuICBwdWJsaWMgdHJhbmZvcm1UZW1wbGF0ZXNUb0NvbHVtbnModGVtcGxhdGVzKSB7XG4gICAgY29uc3QgZGVmYXVsdENvbmZpZ3MgPSB7XG4gICAgICBoZWFkZXI6IHRoaXMuX2hlYWRlckNvbmZpZyxcbiAgICAgIGdyb3VwQ2VsbDogdGhpcy5fZ3JvdXBDZWxsQ29uZmlnLFxuICAgICAgY2VsbDogdGhpcy5fY2VsbENvbmZpZyxcbiAgICAgIGZvb3RlcjogdGhpcy5fZm9vdGVyQ29uZmlnLFxuICAgIH07XG5cbiAgICB0aGlzLmNvbHVtbnMuc2V0RGVmYXVsdHMoZGVmYXVsdENvbmZpZ3MpO1xuICAgIHRoaXMuY29sdW1ucy5pbml0aWFsaXplQ29sdW1ucyh0ZW1wbGF0ZXMpO1xuXG4gICAgLy8gU2V0IHNvcnRCeSBkZWZhdWx0IGNvbHVtblxuICAgIHRoaXMuc29ydGluZy5jbGVhclNvcnRhYmxlQ29sdW1ucygpO1xuICAgIHRoaXMuY29sdW1ucy5jb2x1bW5zXG4gICAgICAuZmlsdGVyKChjb2x1bW4pID0+IGNvbHVtbi5zb3J0YWJsZSAmJiBjb2x1bW4uc2hvdylcbiAgICAgIC5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgICAgdGhpcy5zb3J0aW5nLmFkZFNvcnRhYmxlQ29sdW1uKGNvbHVtbik7XG4gICAgICB9KTtcblxuICAgIC8vIERlZmF1bHQgc29ydCBieVxuICAgIGNvbnN0IGV4dGVybmFsU29ydGluZyA9IHRoaXMuZXh0ZXJuYWxQYXJhbXMuZXh0ZXJuYWxTb3J0aW5nO1xuICAgIGNvbnN0IGluaXRpYWxTb3J0Q29uZmlnID0gZXh0ZXJuYWxTb3J0aW5nIHx8IHRoaXMuY29uZmlnLnNvcnQ7XG4gICAgdGhpcy5zb3J0aW5nLmluaXRpYWxTb3J0QnkoaW5pdGlhbFNvcnRDb25maWcpO1xuXG4gICAgaWYgKGV4dGVybmFsU29ydGluZyAmJiAhdGhpcy5zb3J0aW5nLmlzRGVmaW5lZCkge1xuICAgICAgdGhpcy5leHRlcm5hbFBhcmFtcy5jbGVhclNvcnRpbmdQYXJhbXMoKTtcblxuICAgICAgY29uc29sZS53YXJuKCdOb3QgYWJsZSB0byByZXN0b3JlIHBlcnNpc3RlZCBzb3J0aW5nIHBhcmFtcy4nLCBleHRlcm5hbFNvcnRpbmcpO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdEZpbHRlcnMoKTtcbiAgICB0aGlzLmluaXRJbmZpbml0eVNjcm9sbCgpO1xuICB9XG5cbiAgcHVibGljIHJlbG9hZCgpIHtcbiAgICB0aGlzLmxvYWRpbmckLm5leHQodHJ1ZSk7XG5cbiAgICB0aGlzLmRhdGFDb250cm9sbGVyLnNldE9wZXJhdGlvbihGc0xpc3RTdGF0ZS5SZWxvYWQpO1xuXG4gICAgaWYgKHRoaXMuZnNTY3JvbGxJbnN0YW5jZSkge1xuICAgICAgdGhpcy5wYWdpbmcucmVzZXRQYWdpbmcoKTtcbiAgICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuY2xlYXJSb3dzKCk7XG4gICAgICB0aGlzLmZzU2Nyb2xsSW5zdGFuY2UucmVsb2FkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmV0Y2gkLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2ggcGFnZSBjaGFuZ2VzXG4gICAqL1xuICBwdWJsaWMgc3Vic2NyaWJlKCkge1xuICAgIHRoaXMucGFnaW5nLnBhZ2VDaGFuZ2VkJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IFBhZ2VDaGFuZ2UpID0+IHtcbiAgICAgICAgdGhpcy5kYXRhQ29udHJvbGxlci5zZXRPcGVyYXRpb24oRnNMaXN0U3RhdGUuUGFnZUNoYW5nZSk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIGFsbCByb3dzIGlmIGxpbWl0cyB3YXMgY2hhbmdlZFxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gUGFnZUNoYW5nZVR5cGUuTGltaXRDaGFuZ2VkICYmIHRoaXMucGFnaW5nLmhhc1BhZ2VTdHJhdGVneSkge1xuICAgICAgICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuY2xlYXJSb3dzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYWdpbmcuaGFzT2Zmc2V0U3RyYXRlZ3kpIHtcbiAgICAgICAgICB0aGlzLnBhZ2luZy51cGRhdGVQYWdpbmF0aW9uKCk7XG5cbiAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnVwZGF0ZVZpc2libGVSZWNvcmRzQ291bnQodGhpcy5wYWdpbmcuZ2V0VmlzaWJsZVJlY29yZHMoKSk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi51cGRhdGVUb3RhbFJlY29yZHNDb3VudCh0aGlzLnBhZ2luZy5yZWNvcmRzKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnBhZ2VDaGFuZ2VkKHRoaXMuc2Nyb2xsYWJsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnNjcm9sbGFibGUgJiYgIXRoaXMucGFnaW5nLmxvYWRNb3JlRW5hYmxlZCkge1xuXG4gICAgICAgICAgY29uc3QgY29udGFpbnMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jZGstb3ZlcmxheS1jb250YWluZXInKSkuc29tZShvdmVybGF5ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMob3ZlcmxheSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBsZXQgZWwgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgICBpZiAoIWNvbnRhaW5zKSB7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgaWYgKChyZWN0LnRvcCArIHdpbmRvdy5wYWdlWU9mZnNldCkgPCB3aW5kb3cuaW5uZXJIZWlnaHQpIHtcbiAgICAgICAgICAgICAgZWwgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuZmV0Y2hDb21wbGV0ZSQuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKVxuICAgICAgICAgIClcbiAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGVsLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mZXRjaCQubmV4dCgpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnNvcnRpbmcuc29ydGluZ0NoYW5nZWQkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMub25EZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5kYXRhQ29udHJvbGxlci5zZXRPcGVyYXRpb24oRnNMaXN0U3RhdGUuU29ydCk7XG4gICAgICAgIHRoaXMucGFnaW5nLnBhZ2UgPSAxO1xuXG4gICAgICAgIGlmICh0aGlzLmZzU2Nyb2xsSW5zdGFuY2UpIHtcbiAgICAgICAgICB0aGlzLmRhdGFDb250cm9sbGVyLmNsZWFyUm93cygpO1xuICAgICAgICAgIHRoaXMuZnNTY3JvbGxJbnN0YW5jZS5yZWxvYWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZldGNoJC5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgdGhpcy5saXN0ZW5Sb3dzUmVtb3ZlKCk7XG4gICAgdGhpcy5saXN0ZW5GZXRjaCgpO1xuICB9XG5cbiAgcHVibGljIGdldERhdGEodHJhY2tCeT86IEZzTGlzdFRyYWNrQnlGbikge1xuICAgIGxldCByb3dzRGF0YSA9IHRoaXMuZGF0YUNvbnRyb2xsZXJcbiAgICAgIC52aXNpYmxlUm93c0RhdGE7XG5cbiAgICBpZiAodHJhY2tCeSkge1xuICAgICAgcm93c0RhdGEgPSByb3dzRGF0YVxuICAgICAgICAuZmlsdGVyKHRyYWNrQnkpO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzRGF0YVxuICAgICAgLm1hcCgoZGF0YSkgPT4ge1xuICAgICAgICByZXR1cm4gY2xvbmVEZWVwKGRhdGEpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgaGFzRGF0YSh0cmFja0J5OiBGc0xpc3RUcmFja0J5Rm4pIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhQ29udHJvbGxlci52aXNpYmxlUm93c0RhdGEuc29tZSh0cmFja0J5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgZ3JvdXAgbW9kZSBzdGF0dXNcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgZ3JvdXBFbmFibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuZGF0YUNvbnRyb2xsZXIuZ3JvdXBFbmFibGVkICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5kYXRhQ29udHJvbGxlci5ncm91cEVuYWJsZWQgPSB2YWx1ZTtcblxuICAgICAgLy8gQ29tbWVudGVkIG91dCBiZWNhdXNlIFJheSB3YW50cyB0byBjaGFuZ2UgZ3JvdXAgc3RhdHVzIGluIGZldGNoIG1hcCBwaXBlXG4gICAgICAvLyBhbmQgaXQgdHJpZ2dlcnMgZXh0cmEgcmVxdWVzdHNcbiAgICAgIC8vIHRoaXMucmVsb2FkKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuX2ZzU2Nyb2xsU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl9mc1Njcm9sbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBhZ2luZykge1xuICAgICAgdGhpcy5wYWdpbmcuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNvcnRpbmcpIHtcbiAgICAgIHRoaXMuc29ydGluZy5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbi5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmlsdGVyQ29uZmlnKSB7XG4gICAgICB0aGlzLmZpbHRlckNvbmZpZyA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZXh0ZXJuYWxQYXJhbXMpIHtcbiAgICAgIHRoaXMuZXh0ZXJuYWxQYXJhbXMuZGVzdHJveSgpXG4gICAgfVxuXG4gICAgdGhpcy5jb2x1bW5zLmRlc3Ryb3koKTtcblxuICAgIHRoaXMub25EZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5vbkRlc3Ryb3kkLmNvbXBsZXRlKCk7XG5cbiAgICB0aGlzLmRhdGFDb250cm9sbGVyLmRlc3Ryb3koKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEbyBpbml0aWFsaXphdGlvbiBvZiB0YWJsZVxuICAgKiBAcGFyYW0gY29uZmlnXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpemUoY29uZmlnOiBGc0xpc3RDb25maWcpIHtcbiAgICB0aGlzLmNvbHVtbnMuaW5pdENvbmZpZyhjb25maWcuY29sdW1uKTtcbiAgICB0aGlzLmluaXREZWZhdWx0T3B0aW9ucyhjb25maWcpO1xuICAgIHRoaXMuaW5pdFJlc3RvcmUoKTtcbiAgICB0aGlzLmluaXRBY3Rpb25zKGNvbmZpZy5hY3Rpb25zKTtcbiAgICB0aGlzLmluaXRQYWdpbmcoY29uZmlnLnBhZ2luZywgY29uZmlnLmxvYWRNb3JlKTtcbiAgICB0aGlzLmluaXRTZWxlY3Rpb24oY29uZmlnLnNlbGVjdGlvbiwgdGhpcy5zZWxlY3Rpb25EaWFsb2cpO1xuICAgIHRoaXMuaW5pdEdyb3Vwcyhjb25maWcuZ3JvdXApO1xuICAgIHRoaXMuaW5pdEV4dGVybmFsUGFyYW1zQ29udHJvbGxlcigpO1xuXG4gICAgdGhpcy5pbml0aWFsaXplRGF0YSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEp1c3QgaW5pdCBvcHRpb25zIGJ5IGRlZmF1bHQgaXQgaXQgd2Fzbid0IHNwZWNpZmllZFxuICAgKiBAcGFyYW0gY29uZmlnXG4gICAqL1xuICBwcml2YXRlIGluaXREZWZhdWx0T3B0aW9ucyhjb25maWcpIHtcbiAgICAvLyBXZSBzaG91bGQgcHJldmVudCBpbml0aWFsIGZldGNoIGluIGNhc2VzIHdoZW4gaXQgd2lsbCBiZSBmZXRjaGVkIGluIGFueSBjYXNlXG4gICAgLy8gQXMgZXguIHNjcm9sbGFibGUgb3IgZmlsdGVyIHdpbGwgZG8gZmV0Y2ggaW4gYW55IGNhc2VzXG4gICAgaWYgKGNvbmZpZy5pbml0aWFsRmV0Y2ggPT09IGZhbHNlIHx8IGNvbmZpZy5zY3JvbGxhYmxlKSB7IC8vIFRPRE8gZml4bWUgYWZ0ZXIgdHNtb2RlbCB2ZXJzaW9uIHVwZGF0ZVxuICAgICAgdGhpcy5pbml0aWFsRmV0Y2ggPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5zdGF0dXMgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnN0YXR1cyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmNoaXBzKSB7XG4gICAgICB0aGlzLmNoaXBzID0gY29uZmlnLmNoaXBzO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmZpbHRlcklucHV0ID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5maWx0ZXJJbnB1dCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmluRGlhbG9nKSB7XG4gICAgICB0aGlzLnF1ZXJ5UGFyYW0gPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5xdWVyeVBhcmFtID0gKGNvbmZpZy5xdWVyeVBhcmFtID09PSB2b2lkIDApXG4gICAgICAgID8gdHJ1ZVxuICAgICAgICA6IGNvbmZpZy5xdWVyeVBhcmFtO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuc29ydHMpIHtcbiAgICAgIHRoaXMuc29ydGluZy5pbml0RmFrZUNvbHVtbnMoY29uZmlnLnNvcnRzKTtcbiAgICB9XG4gICAgaWYgKCFjb25maWcudHJhY2tCeSkge1xuICAgICAgdGhpcy50cmFja0J5ID0gJ2lkJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdCByZXN0b3JlIHJvdyBhY3Rpb24gYW5kIGFwcGVuZCBTaG93IERlbGV0ZWQgb3B0aW9uIGludG8gZmlsdGVyc1xuICAgKi9cbiAgcHJpdmF0ZSBpbml0UmVzdG9yZSgpIHtcbiAgICBpZiAodGhpcy5yZXN0b3JlKSB7XG4gICAgICBjb25zdCByZXN0b3JlQWN0aW9uID0gbmV3IFJvd0FjdGlvbih7XG4gICAgICAgIGxhYmVsOiB0aGlzLnJlc3RvcmUubWVudUxhYmVsIHx8ICdSZXN0b3JlJyxcbiAgICAgICAgbWVudTogdHJ1ZSxcbiAgICAgICAgY2xpY2s6IChyb3cpID0+IHsgdGhpcy5yZXN0b3JlQ2xpY2sodGhpcy5yZXN0b3JlLmNsaWNrLCByb3cpIH0sIC8vIFRPRE8gZml4IG1lLCBtb3ZlIHRvIHNwZWNpYWwgZmlsZVxuICAgICAgICByZXN0b3JlOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgaWYgKCF0aGlzLnJvd0FjdGlvbnNSYXcpIHtcbiAgICAgICAgdGhpcy5yb3dBY3Rpb25zUmF3ID0gW107XG4gICAgICB9XG5cbiAgICAgIHRoaXMucm93QWN0aW9uc1Jhdy5wdXNoKHJlc3RvcmVBY3Rpb24pO1xuXG4gICAgICBpZiAoIXRoaXMuZmlsdGVycykge1xuICAgICAgICB0aGlzLmZpbHRlcnMgPSBbXTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucmVzdG9yZS5maWx0ZXIgIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuZmlsdGVycy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBTSE9XX0RFTEVURURfRklMVEVSU19LRVksXG4gICAgICAgICAgdHlwZTogSXRlbVR5cGUuQ2hlY2tib3gsXG4gICAgICAgICAgbGFiZWw6IHRoaXMucmVzdG9yZS5maWx0ZXJMYWJlbCB8fCAnU2hvdyBEZWxldGVkJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0IHBhZ2luZ1xuICAgKiBAcGFyYW0gcGFnaW5nQ29uZmlnXG4gICAqIEBwYXJhbSBsb2FkTW9yZVxuICAgKi9cbiAgcHJpdmF0ZSBpbml0UGFnaW5nKHBhZ2luZ0NvbmZpZzogRnNQYWdpbmcgfCBmYWxzZSwgbG9hZE1vcmU6IEZzTGlzdExvYWRNb3JlQ29uZmlnIHwgYm9vbGVhbikge1xuICAgIHRoaXMucGFnaW5nLmluaXRXaXRoQ29uZmlnKHBhZ2luZ0NvbmZpZywgbG9hZE1vcmUsICEhdGhpcy5zY3JvbGxhYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCBhY3Rpb25zIGJ5IGNhdGVnb3JpZXNcbiAgICovXG4gIHByaXZhdGUgaW5pdEFjdGlvbnMoYWN0aW9ucykge1xuICAgIGlmIChhY3Rpb25zKSB7XG4gICAgICB0aGlzLmFjdGlvbnMuc2V0QWN0aW9ucyhhY3Rpb25zKTtcbiAgICB9XG5cbiAgICB0aGlzLmhhc1Jvd0FjdGlvbnMgPVxuICAgICAgKHRoaXMucm93QWN0aW9uc1JhdyAmJiB0aGlzLnJvd0FjdGlvbnNSYXcubGVuZ3RoID4gMClcbiAgICAgIHx8ICh0aGlzLmdyb3VwQWN0aW9uc1JhdyAmJiB0aGlzLmdyb3VwQWN0aW9uc1Jhdy5sZW5ndGggPiAwKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFNlbGVjdGlvbihcbiAgICBzZWxlY3Rpb25Db25maWc6IEZzTGlzdFNlbGVjdGlvbkNvbmZpZyxcbiAgICBzZWxlY3Rpb25EaWFsb2c6IFNlbGVjdGlvbkRpYWxvZyxcbiAgKSB7XG4gICAgaWYgKHNlbGVjdGlvbkNvbmZpZykge1xuICAgICAgdGhpcy5zZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uQ29udHJvbGxlcihzZWxlY3Rpb25Db25maWcsIHRoaXMudHJhY2tCeSwgc2VsZWN0aW9uRGlhbG9nKTtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnNldFJvd3NDYWxsYmFjaygoKSA9PiB0aGlzLmRhdGFDb250cm9sbGVyLnZpc2libGVSb3dzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVEYXRhKCkge1xuICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuc2V0QWRkaXRpb25hbENvbmZpZ3Moe1xuICAgICAgc2Nyb2xsYWJsZTogISF0aGlzLnNjcm9sbGFibGUsXG4gICAgICBsb2FkTW9yZUVuYWJsZWQ6IHRoaXMucGFnaW5nLmxvYWRNb3JlRW5hYmxlZFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0R3JvdXBzKGdyb3VwQ29uZmlnOiBGc0xpc3RHcm91cENvbmZpZykge1xuICAgIGlmIChncm91cENvbmZpZykge1xuICAgICAgdGhpcy5kYXRhQ29udHJvbGxlci5zZXRHcm91cENvbmZpZyhncm91cENvbmZpZyk7XG4gICAgICB0aGlzLmdyb3VwQWN0aW9uc1JhdyA9IGdyb3VwQ29uZmlnLmFjdGlvbnM7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0RXh0ZXJuYWxQYXJhbXNDb250cm9sbGVyKCkge1xuICAgIHRoaXMuZXh0ZXJuYWxQYXJhbXMgPSBuZXcgRXh0ZXJuYWxQYXJhbXNDb250cm9sbGVyKFxuICAgICAgdGhpcy5yb3V0ZXIsXG4gICAgICB0aGlzLnJvdXRlLFxuICAgICAgdGhpcy5wZXJzaXN0YW5jZSxcbiAgICAgIHRoaXMucGFnaW5nLFxuICAgICAgdGhpcy5zb3J0aW5nLFxuICAgICAgdGhpcy5xdWVyeVBhcmFtXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gZmV0Y2gkIGV2ZW50IHdpdGggZGVib3VuY2VcbiAgICovXG4gIHByaXZhdGUgbGlzdGVuRmV0Y2goKSB7XG4gICAgbGV0IGZldGNoJCA9IHRoaXMuZmV0Y2gkLmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgLy8gU2hvdWxkIHdhaXQgdW50aWwgc2F2ZWQgZmlsdGVycyBub3QgbG9hZGVkXG4gICAgaWYgKCEhdGhpcy5maWx0ZXJzICYmICEhdGhpcy5zYXZlZEZpbHRlcnMpIHtcbiAgICAgIGZldGNoJCA9IGNvbWJpbmVMYXRlc3QoW2ZldGNoJCwgdGhpcy5maWx0ZXJzUmVhZHkkXSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWFwKChbcGFyYW1zXSkgPT4gcGFyYW1zKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmZXRjaCRcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoNTApLFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb24/LmNsb3NlU2VsZWN0aW9uRGlhbG9nKCk7XG4gICAgICAgIH0pLFxuICAgICAgICBtYXAoKHBhcmFtczogRnNMaXN0RmV0Y2hTdWJzY3JpcHRpb24pID0+IHtcbiAgICAgICAgICBjb25zdCBxdWVyeSA9IHRoaXMucGFnaW5nLmhhc09mZnNldFN0cmF0ZWd5ICYmIHBhcmFtcyAmJiBwYXJhbXMubG9hZE9mZnNldFxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmZpbHRlcnNRdWVyeSwgdGhpcy5wYWdpbmcubG9hZERlbGV0ZWRPZmZzZXRRdWVyeSlcbiAgICAgICAgICAgIDogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5maWx0ZXJzUXVlcnksIHRoaXMucGFnaW5nLnF1ZXJ5KTtcblxuICAgICAgICAgIGlmICh0aGlzLnNvcnRpbmcuc29ydGluZ0NvbHVtbikge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvcmRlcjogYCR7dGhpcy5zb3J0aW5nLnNvcnRpbmdDb2x1bW4ubmFtZX0sJHt0aGlzLnNvcnRpbmcuc29ydGluZ0NvbHVtbi5kaXJlY3Rpb259YFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHF1ZXJ5O1xuICAgICAgICB9KSxcbiAgICAgICAgc3dpdGNoTWFwKChxdWVyeSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmNvbHVtbnMubG9hZEZuQ29uZmlndXJlZCAmJiAhdGhpcy5jb2x1bW5zLmNvbHVtbnNGZXRjaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5zLmxvYWRSZW1vdGVDb2x1bW5Db25maWdzKClcbiAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwVG8ocXVlcnkpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvZihxdWVyeSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgc3dpdGNoTWFwKChxdWVyeSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmNvbHVtbnMuY29uZmlndXJlZCkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zOiB0aGlzLmNvbHVtbnMudmlzaWJsZUNvbHVtbnNOYW1lcyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtvZihxdWVyeSksIHRoaXMuZmV0Y2hSZW1vdGUocXVlcnkpXSk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvciwgc291cmNlJCkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXG4gICAgICAgICAgcmV0dXJuIHNvdXJjZSQ7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMuY29tcGxldGVGZXRjaChyZXNwb25zZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbGlzdGVuUm93c1JlbW92ZSgpIHtcbiAgICB0aGlzLmRhdGFDb250cm9sbGVyLnJvd3NSZW1vdmVkJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgocm93czogYW55W10pID0+IHtcbiAgICAgICAgaWYgKHRoaXMucGFnaW5nLmVuYWJsZWQpIHtcblxuICAgICAgICAgIGNvbnN0IHJlbW92ZWRDb3VudCA9IHJvd3MubGVuZ3RoO1xuXG4gICAgICAgICAgaWYgKHRoaXMucGFnaW5nLmhhc1BhZ2VTdHJhdGVneSkge1xuICAgICAgICAgICAgdGhpcy5ub0RhdGFQYWdpbmF0aW9uVXBkYXRlKHJlbW92ZWRDb3VudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZldGNoIG1vcmUgaWYgaGFzIHNvbWV0aGluZyBmb3IgZmV0Y2hcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFDb250cm9sbGVyLmhhc0RhdGEgfHwgdGhpcy5wYWdpbmcuaGFzTmV4dFBhZ2UpIHtcbiAgICAgICAgICAgICAgdGhpcy5kYXRhQ29udHJvbGxlci5zZXRPcGVyYXRpb24oRnNMaXN0U3RhdGUuTG9hZE1vcmUpO1xuXG4gICAgICAgICAgICAgIHRoaXMucGFnaW5nLnJlbW92ZVJvd3MocmVtb3ZlZENvdW50KTtcbiAgICAgICAgICAgICAgdGhpcy5mZXRjaCQubmV4dCh7IGxvYWRPZmZzZXQ6IHRydWUgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLm5vRGF0YVBhZ2luYXRpb25VcGRhdGUocmVtb3ZlZENvdW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgZnJvbSBzZWxlY3Rpb25cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgcm93cy5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJlbW92ZVJvdyhyb3cuZGF0YSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0SW5maW5pdHlTY3JvbGwoKSB7XG4gICAgaWYgKHRoaXMuZnNTY3JvbGxJbnN0YW5jZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNjcm9sbGFibGUpIHtcbiAgICAgIC8vIFNjcm9sbGFibGUgc3RhdHVzIGJ5IGRlZmF1bHRcbiAgICAgIGlmICh0aGlzLnNjcm9sbGFibGUuc3RhdHVzID09PSB2b2lkIDApIHtcbiAgICAgICAgdGhpcy5zY3JvbGxhYmxlLnN0YXR1cyA9IHRydWU7XG4gICAgICB9XG5cblxuICAgICAgdGhpcy5mc1Njcm9sbFxuICAgICAgICAuY29tcG9uZW50KHRoaXMuc2Nyb2xsYWJsZS5uYW1lKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKGZzU2Nyb2xsSW5zdGFuY2U6IEZzU2Nyb2xsSW5zdGFuY2UpID0+IHtcbiAgICAgICAgICB0aGlzLmZzU2Nyb2xsSW5zdGFuY2UgPSBmc1Njcm9sbEluc3RhbmNlO1xuICAgICAgICAgIHRoaXMuX2ZzU2Nyb2xsU3Vic2NyaXB0aW9uID0gZnNTY3JvbGxJbnN0YW5jZVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIGxldCBzdGFydExvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgY29uc3Qgb3BlcmF0aW9uID0gdGhpcy5kYXRhQ29udHJvbGxlci5vcGVyYXRpb247XG5cbiAgICAgICAgICAgICAgLy8gSW5pdGlhbCBsb2FkaW5nIGlmIGluaXRpYWxGZXRjaCBlcXVhbHMgZmFsc2VcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxGZXRjaFxuICAgICAgICAgICAgICAgICYmICF0aGlzLnBhZ2luZy5pbml0aWFsaXplZFxuICAgICAgICAgICAgICAgICYmIG9wZXJhdGlvbiAhPT0gRnNMaXN0U3RhdGUuUmVsb2FkXG4gICAgICAgICAgICAgICkge1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhQ29udHJvbGxlci5zZXRPcGVyYXRpb24oRnNMaXN0U3RhdGUuTG9hZCk7XG4gICAgICAgICAgICAgICAgc3RhcnRMb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9PT0gRnNMaXN0U3RhdGUuUmVsb2FkIHx8XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uID09PSBGc0xpc3RTdGF0ZS5GaWx0ZXIgfHxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb24gPT09IEZzTGlzdFN0YXRlLlNvcnRcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgc3RhcnRMb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBhZ2luZy5pbml0aWFsaXplZCAmJiB0aGlzLnBhZ2luZy5oYXNOZXh0UGFnZSkge1xuICAgICAgICAgICAgICAgIC8vIExvYWRpbmcgaWYgY29udGVudCBoYXMgYmVlbiBzY3JvbGxlZFxuICAgICAgICAgICAgICAgIHN0YXJ0TG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhQ29udHJvbGxlci5zZXRPcGVyYXRpb24oRnNMaXN0U3RhdGUuTG9hZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdpbmcuZ29OZXh0KCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoc3RhcnRMb2FkaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaCQubmV4dCgpO1xuICAgICAgICAgICAgICAgIGZzU2Nyb2xsSW5zdGFuY2UubG9hZGluZygpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLmRhdGFDb250cm9sbGVyLnJlbW90ZVJvd3NDaGFuZ2UkXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMub25EZXN0cm95JCksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgZnNTY3JvbGxJbnN0YW5jZS5sb2FkZWQoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhbmQgd2F0Y2ggZmlsdGVyIGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgaW5pdEZpbHRlcnMoKSB7XG4gICAgaWYgKHRoaXMuZmlsdGVyQ29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gTWVyZ2Ugc29ydGluZyBhbmQgZmFrZSBzb3J0aW5nIGNvbHNcbiAgICAvLyBGYWtlIHNvcnRpbmcgY29scyBpdCdzIGNvbHMgd2hpY2ggZG9uJ3QgcmVwcmVzZW50ZWQgaW4gdGFibGUgY29scywgbGlrZSBhYnN0cmFjdCBjb2xzXG4gICAgY29uc3Qgc29ydFZhbHVlcyA9XG4gICAgICBbXG4gICAgICAgIC4uLnRoaXMuc29ydGluZy5zb3J0aW5nQ29sdW1ucyxcbiAgICAgICAgLi4udGhpcy5zb3J0aW5nLmZha2VTb3J0aW5nQ29sdW1uc1xuICAgICAgXS5yZWR1Y2UoKGFjYywgY29sdW1uKSA9PiB7XG5cbiAgICAgICAgY29uc3Qgc29ydGluZ0l0ZW0gPSB7XG4gICAgICAgICAgbmFtZTogY29sdW1uLnRpdGxlLFxuICAgICAgICAgIHZhbHVlOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICBkZWZhdWx0OiB0aGlzLnNvcnRpbmcuc29ydGluZ0NvbHVtbiAmJiB0aGlzLnNvcnRpbmcuc29ydGluZ0NvbHVtbi5uYW1lID09PSBjb2x1bW4ubmFtZVxuICAgICAgICB9O1xuXG4gICAgICAgIGFjYy5wdXNoKHNvcnRpbmdJdGVtKTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIFtdKTtcblxuICAgIGNvbnN0IHNvcnRDb25maWcgPSB0aGlzLnNvcnRpbmcuc29ydGluZ0NvbHVtblxuICAgICAgPyB7IHZhbHVlOiB0aGlzLnNvcnRpbmcuc29ydGluZ0NvbHVtbi5uYW1lLCBkaXJlY3Rpb246IHRoaXMuc29ydGluZy5zb3J0aW5nQ29sdW1uLmRpcmVjdGlvbn1cbiAgICAgIDogbnVsbDtcblxuICAgIC8vIENvbmZpZ1xuICAgIHRoaXMuZmlsdGVyQ29uZmlnID0ge1xuICAgICAgcGVyc2lzdDogdGhpcy5wZXJzaXN0LFxuICAgICAgaXRlbXM6IHRoaXMuZmlsdGVycyB8fCBbXSxcbiAgICAgIHNhdmVkRmlsdGVyczogdGhpcy5zYXZlZEZpbHRlcnMsXG4gICAgICBpbmxpbmU6IHRoaXMuaW5saW5lRmlsdGVycyxcbiAgICAgIGFjdGlvbnM6IHRoaXMuYWN0aW9ucy5hY3Rpb25zLFxuICAgICAgcXVlcnlQYXJhbTogdGhpcy5xdWVyeVBhcmFtLFxuICAgICAgc29ydHM6IHNvcnRWYWx1ZXMsXG4gICAgICBzb3J0OiBzb3J0Q29uZmlnLFxuICAgICAgY2hpcHM6IHRoaXMuY2hpcHMsXG4gICAgICBpbml0OiB0aGlzLmZpbHRlckluaXQuYmluZCh0aGlzKSxcbiAgICAgIGNoYW5nZTogdGhpcy5maWx0ZXJDaGFuZ2UuYmluZCh0aGlzKSxcbiAgICAgIHJlbG9hZDogdGhpcy5yZWxvYWQuYmluZCh0aGlzKSxcbiAgICAgIHNvcnRDaGFuZ2U6IHRoaXMuZmlsdGVyU29ydC5iaW5kKHRoaXMpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGJhY2sgd2hlbiBGaWx0ZXIgaGFzIGJlZW4gaW5pdGlhbGl6ZWRcbiAgICogQHBhcmFtIGZpbHRlcnNcbiAgICovXG4gIHByaXZhdGUgZmlsdGVySW5pdChmaWx0ZXJzKSB7XG4gICAgaWYgKHRoaXMuZmlsdGVySW5pdENiKSB7XG4gICAgICB0aGlzLmZpbHRlckluaXRDYihmaWx0ZXJzKTtcbiAgICB9XG5cbiAgICB0aGlzLmZpbHRlcnNRdWVyeSA9IGZpbHRlcnM7XG5cbiAgICB0aGlzLmNoZWNrUmVzdG9yZUZpbHRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHdoZW4gRmlsdGVyIGhhcyBiZWVuIGNoYW5nZWRcbiAgICogQHBhcmFtIGZpbHRlclF1ZXJ5XG4gICAqIEBwYXJhbSBmaWx0ZXJTb3J0XG4gICAqL1xuICBwcml2YXRlIGZpbHRlckNoYW5nZShmaWx0ZXJRdWVyeSwgZmlsdGVyU29ydCkge1xuICAgIGlmICh0aGlzLmZpbHRlckNoYW5nZUNiKSB7XG4gICAgICB0aGlzLmZpbHRlckNoYW5nZUNiKGZpbHRlclF1ZXJ5LCBmaWx0ZXJTb3J0KTtcbiAgICB9XG5cbiAgICB0aGlzLmZpbHRlcnNRdWVyeSA9IGZpbHRlclF1ZXJ5O1xuXG4gICAgdGhpcy5yZXN0b3JlTW9kZSA9IGZhbHNlO1xuXG4gICAgLy8gUmVzdG9yZSBvcHRpb25cbiAgICB0aGlzLmNoZWNrUmVzdG9yZUZpbHRlcigpO1xuXG4gICAgaWYgKHRoaXMucmVzdG9yZSAmJiB0aGlzLnJlc3RvcmUucmVsb2FkKSB7XG4gICAgICB0aGlzLnJlbG9hZCgpO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIuc2V0T3BlcmF0aW9uKEZzTGlzdFN0YXRlLkZpbHRlcik7XG5cbiAgICAvLyBSZXNldCBwYWdpbmcgZm9yIHJlcXVlc3Qgd2l0aCBjb3JyZWN0IG9mZnNldFxuICAgIHRoaXMucGFnaW5nLnJlc2V0UGFnaW5nKCk7XG5cbiAgICBpZiAodGhpcy5mc1Njcm9sbEluc3RhbmNlKSB7XG4gICAgICB0aGlzLmRhdGFDb250cm9sbGVyLmNsZWFyUm93cygpO1xuICAgICAgdGhpcy5mc1Njcm9sbEluc3RhbmNlLnJlbG9hZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZldGNoJC5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1Jlc3RvcmVGaWx0ZXIoKSB7XG4gICAgLy8gUmVzdG9yZSBvcHRpb25cbiAgICBpZiAodGhpcy5yZXN0b3JlICYmIHRoaXMuZmlsdGVyc1F1ZXJ5W1NIT1dfREVMRVRFRF9GSUxURVJTX0tFWV0pIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmZpbHRlcnNRdWVyeVtTSE9XX0RFTEVURURfRklMVEVSU19LRVldO1xuXG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMuZmlsdGVyc1F1ZXJ5LCB0aGlzLnJlc3RvcmUucXVlcnkpO1xuXG4gICAgICB0aGlzLnJlc3RvcmVNb2RlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBDYWxsYmFjayB3aGVuIEZpbHRlciBzb3J0IGhhcyBiZWVuIGNoYW5nZWRcbiAgcHJpdmF0ZSBmaWx0ZXJTb3J0KGZpbHRlclF1ZXJ5LCBmaWx0ZXJTb3J0KSB7XG4gICAgaWYgKGZpbHRlclNvcnQpIHtcbiAgICAgIHRoaXMuc29ydGluZy5zb3J0QnlDb2x1bW5XaXRoTmFtZShmaWx0ZXJTb3J0LnZhbHVlKTtcblxuICAgICAgY29uc3Qgc29ydERpcmVjdGlvbiA9IGZpbHRlclNvcnQuZGlyZWN0aW9uID09PSAnYXNjJyA/IFNvcnRpbmdEaXJlY3Rpb24uYXNjIDogU29ydGluZ0RpcmVjdGlvbi5kZXNjO1xuICAgICAgdGhpcy5zb3J0aW5nLnNvcnREaXJlY3Rpb24oc29ydERpcmVjdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZJWE1FIG5lZWQgdG8gYmUgcmVmYWN0b3JlZC4uLlxuICAgICAgdGhpcy5zb3J0aW5nLnNvcnRpbmdDb2x1bW4gPSB2b2lkIDA7XG4gICAgICB0aGlzLnJlbG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29tcGxldGVGZXRjaChbcXVlcnksIHJlc3BvbnNlXSkge1xuXG4gICAgaWYgKCF0aGlzLnBhZ2luZy5wYWdlKSB7XG4gICAgICB0aGlzLnBhZ2luZy5wYWdlID0gMTtcbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2UucGFnaW5nKSB7XG4gICAgICBjb25zdCBkaXNwbGF5ZWQgPSAoQXJyYXkuaXNBcnJheShyZXNwb25zZS5kYXRhKSAmJiByZXNwb25zZS5kYXRhLmxlbmd0aCkgfHwgMDtcbiAgICAgIHRoaXMucGFnaW5nLnVwZGF0ZVBhZ2luZyhcbiAgICAgICAgcmVzcG9uc2UucGFnaW5nLFxuICAgICAgICBkaXNwbGF5ZWQsXG4gICAgICAgIHRoaXMuZGF0YUNvbnRyb2xsZXIub3BlcmF0aW9uID09PSBGc0xpc3RTdGF0ZS5Mb2FkTW9yZVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucGFnaW5nLmVuYWJsZWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnJWMgRnNMaXN0IFdhcm5pbmcgJyxcbiAgICAgICAgJ2NvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogI2ZmY2MwYicsXG4gICAgICAgICdQYWdpbmF0aW9uIGRvZXMgbm90IGNvbmZpZ3VyZWQgcHJvcGVybHkuICcgK1xuICAgICAgICAnUGFnaW5hdGlvbiBpcyBlbmFibGVkLCBidXQgaHR0cCByZXNwb25zZSBkb2VzIG5vdCBjb250YWluIFwicGFnaW5nXCIgZmllbGQuICcgK1xuICAgICAgICAnWW91IGhhdmUgdG8gc2V0IFwicGFnaW5nOiBmYWxzZVwiIGluIGNvbmZpZyBvciBhZGQgXCJwYWdpbmdcIiBmaWVsZCB0byByZXNwb25zZS4nXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vLyBtdXN0IGJlIGJlZm9yZSBzZWxlY3Rpb24sIGJlY2F1c2Ugc2VsZXRpb24gdXNlIHJlY29yZHNcbiAgICB0aGlzLmRhdGFDb250cm9sbGVyLnNldFJvd3NGcm9tUmVzcG9uc2UocmVzcG9uc2UuZGF0YSk7XG4gICAgLy8vXG5cbiAgICAvLyBVcGRhdGUgc2VsZWN0aW9uIHBhcmFtc1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuXG4gICAgICBpZiAodGhpcy5wYWdpbmcuZW5hYmxlZCkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wYWdlQ2hhbmdlZCh0aGlzLnNjcm9sbGFibGUpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi51cGRhdGVWaXNpYmxlUmVjb3Jkc0NvdW50KHRoaXMucGFnaW5nLmdldFZpc2libGVSZWNvcmRzKCkpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi51cGRhdGVUb3RhbFJlY29yZHNDb3VudCh0aGlzLnBhZ2luZy5yZWNvcmRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVzcG9uc2UucGFnaW5nICYmIHJlc3BvbnNlLnBhZ2luZy5yZWNvcmRzXG4gICAgICAgICAgfHwgQXJyYXkuaXNBcnJheShyZXNwb25zZS5kYXRhKSAmJiByZXNwb25zZS5kYXRhLmxlbmd0aDtcblxuICAgICAgICB0aGlzLnNlbGVjdGlvbi51cGRhdGVWaXNpYmxlUmVjb3Jkc0NvdW50KGNvdW50KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24udXBkYXRlVG90YWxSZWNvcmRzQ291bnQoY291bnQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZFJvd3NJbnRlcnNlY3Rpb24odGhpcy5kYXRhQ29udHJvbGxlci52aXNpYmxlUm93c0RhdGEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmVtcHR5U3RhdGU/LnZhbGlkYXRlICYmIHRoaXMuZW1wdHlTdGF0ZVRlbXBsYXRlKSB7XG4gICAgICB0aGlzLmVtcHR5U3RhdGVFbmFibGVkID0gdGhpcy5lbXB0eVN0YXRlLnZhbGlkYXRlKHF1ZXJ5LCBjbG9uZURlZXAocmVzcG9uc2UuZGF0YSkpO1xuICAgIH1cblxuICAgIHRoaXMuZmV0Y2hDb21wbGV0ZSQubmV4dCgpO1xuICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogV2lsbCBkbyBzb21lIGFjdGlvbnMgaWYgeW91IHJlbW92ZWQgaXRlbSBhbmQgaXRlbSB3YXMgbGFzdCBvbiBoaXMgb3duIHBhZ2VcbiAgICpcbiAgICogRXg6IGlmIGxpc3QgaGFzIDMgcGFnZXMgYW5kIG9uIHRoaXJkIHBhZ2UgeW91IGhhdmUgb25seSBvbmUgaXRlbS4gQW5kIHlvdSBqdXN0IGRlbGV0ZWQgdGhpcyBpdGVtLlxuICAgKiBZb3UgbXVzdCBnbyB0byBzZWNvbmQgcGFnZSwgYnV0IGlmIGl0IHdhcyBsYXN0IHBhZ2UgYW5kIHlvdSBjYW4ndCBnbyBiYWNrIC0+IGp1c3QgcmVsb2FkXG4gICAqXG4gICAqIEBwYXJhbSBkZWxldGVkQ291bnRcbiAgICovXG4gIHByaXZhdGUgbm9EYXRhUGFnaW5hdGlvblVwZGF0ZShkZWxldGVkQ291bnQpIHtcbiAgICBpZiAoIXRoaXMuZGF0YUNvbnRyb2xsZXIuaGFzRGF0YSkge1xuICAgICAgaWYgKHRoaXMucGFnaW5nLnBhZ2UgPiAxKSB7XG4gICAgICAgIHRoaXMucGFnaW5nLmdvVG9QYWdlKHRoaXMucGFnaW5nLnBhZ2UgLSAxIHx8IDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnBhZ2luZy5yZWNvcmRzIC09IGRlbGV0ZWRDb3VudDtcbiAgICB0aGlzLnBhZ2luZy51cGRhdGVQYWdpbmF0aW9uKCk7XG5cbiAgICBpZiAodGhpcy5kYXRhQ29udHJvbGxlci5oYXNEYXRhICYmIHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbi51cGRhdGVWaXNpYmxlUmVjb3Jkc0NvdW50KHRoaXMuZGF0YUNvbnRyb2xsZXIudmlzaWJsZVJvd3NDb3VudCk7XG4gICAgICB0aGlzLnNlbGVjdGlvbi51cGRhdGVUb3RhbFJlY29yZHNDb3VudCh0aGlzLnBhZ2luZy5yZWNvcmRzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGVtcG9yYXJ5IHNvbHV0aW9uLCB3aWxsIGRvIGF1dG8gc3Vic2NyaWJlIGlmIHdhcyByZXR1cm5lZCBPYnNlcnZhYmxlLlxuICAgKlxuICAgKiBUT0RPOiBNT1ZFIFRISVMgUEVBQ0UgT0YgQ09ERSBUTyBTUEVDSUFMIFBMQUNFXG4gICAqXG4gICAqIEBwYXJhbSByZXN0b3JlQ2xpY2tDYWxsYmFja1xuICAgKiBAcGFyYW0gcm93XG4gICAqL1xuICBwcml2YXRlIHJlc3RvcmVDbGljayhyZXN0b3JlQ2xpY2tDYWxsYmFjaywgcm93KSB7XG4gICAgY29uc3QgcmVzdG9yZUNsaWNrUmVzdWx0ID0gcmVzdG9yZUNsaWNrQ2FsbGJhY2socm93KTtcblxuICAgIGlmIChyZXN0b3JlQ2xpY2tSZXN1bHQgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICByZXN0b3JlQ2xpY2tSZXN1bHRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAoKSA9PiB0aGlzLnJlbG9hZCgpLFxuICAgICAgICAgIGVycm9yOiAoKSA9PiB7fSxcbiAgICAgICAgfSlcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|