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