barsa-novin-ray-core 0.0.2
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/README.md +25 -0
- package/esm2020/barsa-novin-ray-core.mjs +5 -0
- package/esm2020/lib/abstract-classes/application-base.mjs +24 -0
- package/esm2020/lib/abstract-classes/barsa-api.mjs +40 -0
- package/esm2020/lib/abstract-classes/field-base.mjs +167 -0
- package/esm2020/lib/abstract-classes/files-validation-helper.mjs +71 -0
- package/esm2020/lib/abstract-classes/form-base.mjs +101 -0
- package/esm2020/lib/abstract-classes/form-props.base.mjs +79 -0
- package/esm2020/lib/abstract-classes/form-toolbar-base.mjs +45 -0
- package/esm2020/lib/abstract-classes/index.mjs +21 -0
- package/esm2020/lib/abstract-classes/layout-item-base.mjs +33 -0
- package/esm2020/lib/abstract-classes/layout-panel-base.mjs +80 -0
- package/esm2020/lib/abstract-classes/models.mjs +172 -0
- package/esm2020/lib/abstract-classes/module-with-dynamic-components.mjs +2 -0
- package/esm2020/lib/abstract-classes/number-base.mjs +117 -0
- package/esm2020/lib/abstract-classes/page-base.mjs +97 -0
- package/esm2020/lib/abstract-classes/report-base.mjs +231 -0
- package/esm2020/lib/abstract-classes/report-item-base.mjs +53 -0
- package/esm2020/lib/abstract-classes/report-view-base.component.mjs +262 -0
- package/esm2020/lib/abstract-classes/system-base.mjs +24 -0
- package/esm2020/lib/auth-guard.mjs +37 -0
- package/esm2020/lib/barsa-novin-ray-core-routing.module.mjs +18 -0
- package/esm2020/lib/barsa-novin-ray-core.module.mjs +271 -0
- package/esm2020/lib/base-ulv-setting.component.mjs +37 -0
- package/esm2020/lib/base.component.mjs +59 -0
- package/esm2020/lib/base.module.mjs +28 -0
- package/esm2020/lib/constants.mjs +441 -0
- package/esm2020/lib/container.component.mjs +76 -0
- package/esm2020/lib/custom-route-reuse-strategy.mjs +32 -0
- package/esm2020/lib/date-services/date-hijri.service.mjs +127 -0
- package/esm2020/lib/date-services/date-info.mjs +2 -0
- package/esm2020/lib/date-services/date-miladi.service.mjs +124 -0
- package/esm2020/lib/date-services/date-shamsi.service.mjs +129 -0
- package/esm2020/lib/date-services/date.service.mjs +139 -0
- package/esm2020/lib/date-services/index.mjs +6 -0
- package/esm2020/lib/device.mjs +663 -0
- package/esm2020/lib/directives/anchor-scroll.directive.mjs +24 -0
- package/esm2020/lib/directives/attr-rtl.directive.mjs +35 -0
- package/esm2020/lib/directives/base.directive.mjs +51 -0
- package/esm2020/lib/directives/column-resizer.directive.mjs +39 -0
- package/esm2020/lib/directives/dynamic-command.directive.mjs +43 -0
- package/esm2020/lib/directives/ellipsify.directive.mjs +72 -0
- package/esm2020/lib/directives/field-binding.directive.mjs +17 -0
- package/esm2020/lib/directives/img-lazy.directive.mjs +75 -0
- package/esm2020/lib/directives/index.mjs +19 -0
- package/esm2020/lib/directives/intersection-observer.directive.mjs +49 -0
- package/esm2020/lib/directives/items-renderer.directive.mjs +59 -0
- package/esm2020/lib/directives/numbers-only-input.directive.mjs +26 -0
- package/esm2020/lib/directives/placeHolder.directive.mjs +15 -0
- package/esm2020/lib/directives/render-ulv-paging.directive.mjs +58 -0
- package/esm2020/lib/directives/render-ulv-viewer.directive.mjs +60 -0
- package/esm2020/lib/directives/table-resizer.directive.mjs +235 -0
- package/esm2020/lib/directives/ulv-command.directive.mjs +41 -0
- package/esm2020/lib/directives/until-inview.directive.mjs +51 -0
- package/esm2020/lib/dynamic-component/base-dynamic.component.mjs +89 -0
- package/esm2020/lib/dynamic-component/base-form-toolbaritem-props.mjs +50 -0
- package/esm2020/lib/dynamic-component/base-item-content-props.mjs +70 -0
- package/esm2020/lib/dynamic-component/base-view-content-props.mjs +26 -0
- package/esm2020/lib/dynamic-component/base-view-item-props.mjs +374 -0
- package/esm2020/lib/dynamic-component/base-view-props.mjs +127 -0
- package/esm2020/lib/dynamic-component/dynamic-form-toolbar-item.component.mjs +36 -0
- package/esm2020/lib/dynamic-component/dynamic-form.component.mjs +62 -0
- package/esm2020/lib/dynamic-component/dynamic-item.component.mjs +60 -0
- package/esm2020/lib/dynamic-component/index.mjs +10 -0
- package/esm2020/lib/empty-page-with-router-and-router-outlet/empty-page-with-router-and-router-outlet.component.mjs +16 -0
- package/esm2020/lib/field-ui/field-ui.component.mjs +116 -0
- package/esm2020/lib/form/form.component.mjs +151 -0
- package/esm2020/lib/form-new/form-new.component.mjs +30 -0
- package/esm2020/lib/from-intersection-observer.mjs +53 -0
- package/esm2020/lib/global-error-handler.mjs +26 -0
- package/esm2020/lib/modal-root.component.mjs +31 -0
- package/esm2020/lib/not-found/not-found.component.mjs +16 -0
- package/esm2020/lib/pipes/barsa-icon-dict.pipe.mjs +18 -0
- package/esm2020/lib/pipes/bbb-translate.pipe.mjs +29 -0
- package/esm2020/lib/pipes/can-upload.pipe.mjs +30 -0
- package/esm2020/lib/pipes/context-menu.pipe.mjs +40 -0
- package/esm2020/lib/pipes/control-ui.pipe.mjs +31 -0
- package/esm2020/lib/pipes/convert-to-style.pipe.mjs +32 -0
- package/esm2020/lib/pipes/date-time-to-caption.pipe.mjs +34 -0
- package/esm2020/lib/pipes/fileinfo-count.pipe.mjs +20 -0
- package/esm2020/lib/pipes/filter-columns-by-details.pipe.mjs +20 -0
- package/esm2020/lib/pipes/filter-string.pipe.mjs +44 -0
- package/esm2020/lib/pipes/filter-tab.pipe.mjs +19 -0
- package/esm2020/lib/pipes/filter-toolbar-control.pipe.mjs +16 -0
- package/esm2020/lib/pipes/filter.pipe.mjs +33 -0
- package/esm2020/lib/pipes/find-column-by-db-name.pipe.mjs +17 -0
- package/esm2020/lib/pipes/fiori-icon.pipe.mjs +42 -0
- package/esm2020/lib/pipes/groupby.pipe.mjs +48 -0
- package/esm2020/lib/pipes/header-facet-value.pipe.mjs +22 -0
- package/esm2020/lib/pipes/index.mjs +33 -0
- package/esm2020/lib/pipes/list-count.pipe.mjs +17 -0
- package/esm2020/lib/pipes/merge-fields-to-columns.pipe.mjs +42 -0
- package/esm2020/lib/pipes/mo-info-ulv-data.pipe.mjs +24 -0
- package/esm2020/lib/pipes/mo-report-value-concat.pipe.mjs +35 -0
- package/esm2020/lib/pipes/mo-report-value.pipe.mjs +28 -0
- package/esm2020/lib/pipes/mo-value.pipe.mjs +31 -0
- package/esm2020/lib/pipes/multiple-groupby.pipe.mjs +97 -0
- package/esm2020/lib/pipes/numeral.pipe.mjs +40 -0
- package/esm2020/lib/pipes/picture-field-source.pipe.mjs +22 -0
- package/esm2020/lib/pipes/remove-newline.pipe.mjs +20 -0
- package/esm2020/lib/pipes/seperator-fix.pipe.mjs +23 -0
- package/esm2020/lib/pipes/sort.pipe.mjs +48 -0
- package/esm2020/lib/pipes/tlbButtons.pipe.mjs +58 -0
- package/esm2020/lib/pipes/total-summary.pipe.mjs +16 -0
- package/esm2020/lib/pipes/visible-value.pipe.mjs +24 -0
- package/esm2020/lib/portal-page/portal-page.component.mjs +13 -0
- package/esm2020/lib/redirect-home-guard.mjs +28 -0
- package/esm2020/lib/redirect-report-navigator-command/redirect-report-navigator-command.component.mjs +33 -0
- package/esm2020/lib/report-container/report-container.component.mjs +52 -0
- package/esm2020/lib/resolvers/index.mjs +5 -0
- package/esm2020/lib/resolvers/portal-dynamic-page.resolver.mjs +49 -0
- package/esm2020/lib/resolvers/portal-form-page.resolver.mjs +18 -0
- package/esm2020/lib/resolvers/portal-page.resolver.mjs +30 -0
- package/esm2020/lib/resolvers/portal-report-page.resolver.mjs +37 -0
- package/esm2020/lib/root-page/root-page.component.mjs +21 -0
- package/esm2020/lib/root-portal/root-portal.component.mjs +51 -0
- package/esm2020/lib/services/api.service.mjs +60 -0
- package/esm2020/lib/services/barsa-dialog.service.mjs +80 -0
- package/esm2020/lib/services/breadcrumb.service.mjs +60 -0
- package/esm2020/lib/services/container.service.mjs +36 -0
- package/esm2020/lib/services/dynamic-component.service.mjs +55 -0
- package/esm2020/lib/services/form-panel.service.mjs +235 -0
- package/esm2020/lib/services/form.service.mjs +14 -0
- package/esm2020/lib/services/horizontal-layout.service.mjs +16 -0
- package/esm2020/lib/services/index.mjs +16 -0
- package/esm2020/lib/services/layout.service.mjs +42 -0
- package/esm2020/lib/services/log.service.mjs +50 -0
- package/esm2020/lib/services/network-status.service.mjs +15 -0
- package/esm2020/lib/services/portal.service.mjs +638 -0
- package/esm2020/lib/services/ui.service.mjs +23 -0
- package/esm2020/lib/services/ulvmain.service.mjs +594 -0
- package/esm2020/lib/services/upload.service.mjs +75 -0
- package/esm2020/public-api.mjs +33 -0
- package/fesm2015/barsa-novin-ray-core.mjs +9047 -0
- package/fesm2015/barsa-novin-ray-core.mjs.map +1 -0
- package/fesm2020/barsa-novin-ray-core.mjs +8945 -0
- package/fesm2020/barsa-novin-ray-core.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/abstract-classes/application-base.d.ts +53 -0
- package/lib/abstract-classes/barsa-api.d.ts +28 -0
- package/lib/abstract-classes/field-base.d.ts +81 -0
- package/lib/abstract-classes/files-validation-helper.d.ts +15 -0
- package/lib/abstract-classes/form-base.d.ts +59 -0
- package/lib/abstract-classes/form-props.base.d.ts +45 -0
- package/lib/abstract-classes/form-toolbar-base.d.ts +17 -0
- package/lib/abstract-classes/index.d.ts +20 -0
- package/lib/abstract-classes/layout-item-base.d.ts +15 -0
- package/lib/abstract-classes/layout-panel-base.d.ts +24 -0
- package/lib/abstract-classes/models.d.ts +660 -0
- package/lib/abstract-classes/module-with-dynamic-components.d.ts +4 -0
- package/lib/abstract-classes/number-base.d.ts +20 -0
- package/lib/abstract-classes/page-base.d.ts +31 -0
- package/lib/abstract-classes/report-base.d.ts +97 -0
- package/lib/abstract-classes/report-item-base.d.ts +33 -0
- package/lib/abstract-classes/report-view-base.component.d.ts +130 -0
- package/lib/abstract-classes/system-base.d.ts +45 -0
- package/lib/auth-guard.d.ts +12 -0
- package/lib/barsa-novin-ray-core-routing.module.d.ts +7 -0
- package/lib/barsa-novin-ray-core.module.d.ts +88 -0
- package/lib/base-ulv-setting.component.d.ts +18 -0
- package/lib/base.component.d.ts +15 -0
- package/lib/base.module.d.ts +13 -0
- package/lib/constants.d.ts +89 -0
- package/lib/container.component.d.ts +33 -0
- package/lib/custom-route-reuse-strategy.d.ts +11 -0
- package/lib/date-services/date-hijri.service.d.ts +40 -0
- package/lib/date-services/date-info.d.ts +15 -0
- package/lib/date-services/date-miladi.service.d.ts +39 -0
- package/lib/date-services/date-shamsi.service.d.ts +40 -0
- package/lib/date-services/date.service.d.ts +54 -0
- package/lib/date-services/index.d.ts +5 -0
- package/lib/device.d.ts +15 -0
- package/lib/directives/anchor-scroll.directive.d.ts +7 -0
- package/lib/directives/attr-rtl.directive.d.ts +13 -0
- package/lib/directives/base.directive.d.ts +13 -0
- package/lib/directives/column-resizer.directive.d.ts +13 -0
- package/lib/directives/dynamic-command.directive.d.ts +12 -0
- package/lib/directives/ellipsify.directive.d.ts +17 -0
- package/lib/directives/field-binding.directive.d.ts +7 -0
- package/lib/directives/img-lazy.directive.d.ts +20 -0
- package/lib/directives/index.d.ts +18 -0
- package/lib/directives/intersection-observer.directive.d.ts +17 -0
- package/lib/directives/items-renderer.directive.d.ts +17 -0
- package/lib/directives/numbers-only-input.directive.d.ts +9 -0
- package/lib/directives/placeHolder.directive.d.ts +6 -0
- package/lib/directives/render-ulv-paging.directive.d.ts +19 -0
- package/lib/directives/render-ulv-viewer.directive.d.ts +19 -0
- package/lib/directives/table-resizer.directive.d.ts +47 -0
- package/lib/directives/ulv-command.directive.d.ts +11 -0
- package/lib/directives/until-inview.directive.d.ts +17 -0
- package/lib/dynamic-component/base-dynamic.component.d.ts +26 -0
- package/lib/dynamic-component/base-form-toolbaritem-props.d.ts +28 -0
- package/lib/dynamic-component/base-item-content-props.d.ts +40 -0
- package/lib/dynamic-component/base-view-content-props.d.ts +11 -0
- package/lib/dynamic-component/base-view-item-props.d.ts +95 -0
- package/lib/dynamic-component/base-view-props.d.ts +65 -0
- package/lib/dynamic-component/dynamic-form-toolbar-item.component.d.ts +18 -0
- package/lib/dynamic-component/dynamic-form.component.d.ts +33 -0
- package/lib/dynamic-component/dynamic-item.component.d.ts +30 -0
- package/lib/dynamic-component/index.d.ts +9 -0
- package/lib/empty-page-with-router-and-router-outlet/empty-page-with-router-and-router-outlet.component.d.ts +7 -0
- package/lib/field-ui/field-ui.component.d.ts +27 -0
- package/lib/form/form.component.d.ts +36 -0
- package/lib/form-new/form-new.component.d.ts +23 -0
- package/lib/from-intersection-observer.d.ts +7 -0
- package/lib/global-error-handler.d.ts +8 -0
- package/lib/modal-root.component.d.ts +15 -0
- package/lib/not-found/not-found.component.d.ts +8 -0
- package/lib/pipes/barsa-icon-dict.pipe.d.ts +9 -0
- package/lib/pipes/bbb-translate.pipe.d.ts +7 -0
- package/lib/pipes/can-upload.pipe.d.ts +8 -0
- package/lib/pipes/context-menu.pipe.d.ts +11 -0
- package/lib/pipes/control-ui.pipe.d.ts +9 -0
- package/lib/pipes/convert-to-style.pipe.d.ts +8 -0
- package/lib/pipes/date-time-to-caption.pipe.d.ts +9 -0
- package/lib/pipes/fileinfo-count.pipe.d.ts +10 -0
- package/lib/pipes/filter-columns-by-details.pipe.d.ts +8 -0
- package/lib/pipes/filter-string.pipe.d.ts +11 -0
- package/lib/pipes/filter-tab.pipe.d.ts +7 -0
- package/lib/pipes/filter-toolbar-control.pipe.d.ts +8 -0
- package/lib/pipes/filter.pipe.d.ts +10 -0
- package/lib/pipes/find-column-by-db-name.pipe.d.ts +8 -0
- package/lib/pipes/fiori-icon.pipe.d.ts +7 -0
- package/lib/pipes/groupby.pipe.d.ts +7 -0
- package/lib/pipes/header-facet-value.pipe.d.ts +8 -0
- package/lib/pipes/index.d.ts +32 -0
- package/lib/pipes/list-count.pipe.d.ts +8 -0
- package/lib/pipes/merge-fields-to-columns.pipe.d.ts +10 -0
- package/lib/pipes/mo-info-ulv-data.pipe.d.ts +7 -0
- package/lib/pipes/mo-report-value-concat.pipe.d.ts +9 -0
- package/lib/pipes/mo-report-value.pipe.d.ts +12 -0
- package/lib/pipes/mo-value.pipe.d.ts +9 -0
- package/lib/pipes/multiple-groupby.pipe.d.ts +23 -0
- package/lib/pipes/numeral.pipe.d.ts +9 -0
- package/lib/pipes/picture-field-source.pipe.d.ts +8 -0
- package/lib/pipes/remove-newline.pipe.d.ts +8 -0
- package/lib/pipes/seperator-fix.pipe.d.ts +7 -0
- package/lib/pipes/sort.pipe.d.ts +9 -0
- package/lib/pipes/tlbButtons.pipe.d.ts +9 -0
- package/lib/pipes/total-summary.pipe.d.ts +8 -0
- package/lib/pipes/visible-value.pipe.d.ts +8 -0
- package/lib/portal-page/portal-page.component.d.ts +6 -0
- package/lib/redirect-home-guard.d.ts +13 -0
- package/lib/redirect-report-navigator-command/redirect-report-navigator-command.component.d.ts +14 -0
- package/lib/report-container/report-container.component.d.ts +24 -0
- package/lib/resolvers/index.d.ts +4 -0
- package/lib/resolvers/portal-dynamic-page.resolver.d.ts +12 -0
- package/lib/resolvers/portal-form-page.resolver.d.ts +8 -0
- package/lib/resolvers/portal-page.resolver.d.ts +12 -0
- package/lib/resolvers/portal-report-page.resolver.d.ts +12 -0
- package/lib/root-page/root-page.component.d.ts +10 -0
- package/lib/root-portal/root-portal.component.d.ts +14 -0
- package/lib/services/api.service.d.ts +18 -0
- package/lib/services/barsa-dialog.service.d.ts +31 -0
- package/lib/services/breadcrumb.service.d.ts +14 -0
- package/lib/services/container.service.d.ts +14 -0
- package/lib/services/dynamic-component.service.d.ts +13 -0
- package/lib/services/form-panel.service.d.ts +83 -0
- package/lib/services/form.service.d.ts +8 -0
- package/lib/services/horizontal-layout.service.d.ts +7 -0
- package/lib/services/index.d.ts +15 -0
- package/lib/services/layout.service.d.ts +23 -0
- package/lib/services/log.service.d.ts +17 -0
- package/lib/services/network-status.service.d.ts +7 -0
- package/lib/services/portal.service.d.ts +130 -0
- package/lib/services/ui.service.d.ts +14 -0
- package/lib/services/ulvmain.service.d.ts +178 -0
- package/lib/services/upload.service.d.ts +18 -0
- package/package.json +38 -0
- package/public-api.d.ts +29 -0
|
@@ -0,0 +1,594 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, combineLatest, of, Subject } from 'rxjs';
|
|
3
|
+
import { delay, distinctUntilChanged, map, shareReplay, switchMap, takeUntil, tap } from 'rxjs/operators';
|
|
4
|
+
import { BarsaApi, MetaobjectDataModel } from '../abstract-classes';
|
|
5
|
+
import { genrateInlineMoId, getControlList, GetDefaultMoObjectInfo, getNewMoGridEditor } from '../constants';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "../pipes";
|
|
8
|
+
export class UlvMainService {
|
|
9
|
+
constructor(_bbbPipe) {
|
|
10
|
+
this._bbbPipe = _bbbPipe;
|
|
11
|
+
this.moDataListSource = new BehaviorSubject([]);
|
|
12
|
+
this._cartableTemplates$ = new BehaviorSubject({});
|
|
13
|
+
this._cartableChildsMo$ = new BehaviorSubject({});
|
|
14
|
+
this._layoutInfoSource = new Subject();
|
|
15
|
+
this._contextSource = new Subject();
|
|
16
|
+
this._inDialog$ = new BehaviorSubject(false);
|
|
17
|
+
this._fullscreen$ = new BehaviorSubject(false);
|
|
18
|
+
this._conditionalFormatsSource = new BehaviorSubject([]);
|
|
19
|
+
this._reportSource = new BehaviorSubject(null);
|
|
20
|
+
this._viewerControlSource = new BehaviorSubject(null);
|
|
21
|
+
this._hideToolbarSource = new BehaviorSubject(true);
|
|
22
|
+
this._onDestroy$ = new Subject();
|
|
23
|
+
this._maskSource = new BehaviorSubject(false);
|
|
24
|
+
this._viewerMaskSource = new BehaviorSubject(false);
|
|
25
|
+
this._visibleSource = new BehaviorSubject(true);
|
|
26
|
+
this._enableSource = new BehaviorSubject(true);
|
|
27
|
+
this._readonlySource = new BehaviorSubject(false);
|
|
28
|
+
this._menuItemsSource = new BehaviorSubject([]);
|
|
29
|
+
this._onlyInlineEditSource = new BehaviorSubject(false);
|
|
30
|
+
this._inlineEditModeSource = new BehaviorSubject(false);
|
|
31
|
+
this._allowInlineEditSource = new BehaviorSubject(false);
|
|
32
|
+
this._titleSource = new BehaviorSubject({
|
|
33
|
+
text: '',
|
|
34
|
+
image: ''
|
|
35
|
+
});
|
|
36
|
+
this._formPanelControlShowWindowSource = new Subject();
|
|
37
|
+
this._searchPanelUiSource = new BehaviorSubject(null);
|
|
38
|
+
this._pagingSettingSource = new BehaviorSubject(null);
|
|
39
|
+
this._toolbarButtonsSource = new BehaviorSubject([]);
|
|
40
|
+
this._destroySource = new Subject();
|
|
41
|
+
this._firstApplyAutomatically = true;
|
|
42
|
+
this._controlInfosMetaobject = [];
|
|
43
|
+
this._selectedSearchPanelSettingsIdSource = new BehaviorSubject('');
|
|
44
|
+
this._defaultSearchPanelSettingsSource = new Subject();
|
|
45
|
+
this._allSearchPanelSettingsSource = new BehaviorSubject([]);
|
|
46
|
+
this._openSearchPanelHiddenSettingsSource = new Subject();
|
|
47
|
+
this._openSearchFilesManageSource = new Subject();
|
|
48
|
+
this._searchPanelMoChangedSource = new BehaviorSubject(false);
|
|
49
|
+
this._newInlineEditMoSource = new BehaviorSubject(null);
|
|
50
|
+
this._hideSearchapanelSource = new BehaviorSubject(false);
|
|
51
|
+
this.context$ = this._contextSource
|
|
52
|
+
.asObservable()
|
|
53
|
+
.pipe(takeUntil(this._onDestroy$), tap((context) => (this.context = context)), tap((context) => this._initialize(context)), tap((context) => this._addEventListener(context)))
|
|
54
|
+
.subscribe();
|
|
55
|
+
this.newInlineEditMo$ = this._newInlineEditMoSource.asObservable().pipe(takeUntil(this._onDestroy$));
|
|
56
|
+
this.viewer$ = this._viewerControlSource.asObservable().pipe(takeUntil(this._onDestroy$));
|
|
57
|
+
this.conditionalFormats$ = this._conditionalFormatsSource.asObservable().pipe(takeUntil(this._onDestroy$));
|
|
58
|
+
this.hideToolbar$ = this._hideToolbarSource.asObservable().pipe(takeUntil(this._onDestroy$));
|
|
59
|
+
this.mask$ = this._maskSource.asObservable().pipe(takeUntil(this._onDestroy$));
|
|
60
|
+
this.viwerMask$ = this._viewerMaskSource.asObservable().pipe(takeUntil(this._onDestroy$));
|
|
61
|
+
this.visible$ = this._visibleSource.asObservable().pipe(takeUntil(this._onDestroy$));
|
|
62
|
+
this.enable$ = this._enableSource.asObservable().pipe(takeUntil(this._onDestroy$));
|
|
63
|
+
this.readonly$ = this._readonlySource.asObservable().pipe(takeUntil(this._onDestroy$));
|
|
64
|
+
this.menuItems$ = this._menuItemsSource.asObservable().pipe(takeUntil(this._onDestroy$), map((items) => items.filter((c) => c.itemId !== 'ExportToExcel')));
|
|
65
|
+
this.title$ = this._titleSource.asObservable().pipe(takeUntil(this._onDestroy$));
|
|
66
|
+
this.formPanelControlShowWindow$ = this._formPanelControlShowWindowSource
|
|
67
|
+
.asObservable()
|
|
68
|
+
.pipe(takeUntil(this._onDestroy$));
|
|
69
|
+
this.searchPanelUi$ = this._searchPanelUiSource.asObservable().pipe(takeUntil(this._onDestroy$), tap((searchPanel) => this._addDefaultSearchPanelSettings(searchPanel)));
|
|
70
|
+
this.openSearchPanelHiddenSettings$ = this._openSearchPanelHiddenSettingsSource.asObservable();
|
|
71
|
+
this.pagingSetting$ = this._pagingSettingSource.asObservable().pipe(takeUntil(this._onDestroy$));
|
|
72
|
+
this.toolbarButtons$ = this._toolbarButtonsSource.asObservable().pipe(takeUntil(this._onDestroy$), map((c) => !c ? [] : c.map((d) => ({ ...d, hideText: d.Command?.IsBuiltin && d.itemId !== 'New' ? true : false }))), map((c) => !c ? [] : [...c.filter((d) => !d.Command?.IsBuiltin), ...c.filter((d) => d.Command?.IsBuiltin)]));
|
|
73
|
+
this.destroy$ = this._destroySource.asObservable().pipe(tap(() => this._unscubscribeContext()));
|
|
74
|
+
this.moDataList$ = this.moDataListSource.asObservable().pipe();
|
|
75
|
+
this.reportId$ = this._reportSource.asObservable().pipe(map((report) => report?.Id));
|
|
76
|
+
this.allowInlineEdit$ = this._allowInlineEditSource.asObservable();
|
|
77
|
+
this.inlineEditMode$ = this._inlineEditModeSource.asObservable();
|
|
78
|
+
this.onlyInlineEdit$ = this._onlyInlineEditSource.asObservable();
|
|
79
|
+
this.openSearchFilesManage$ = this._openSearchFilesManageSource.asObservable();
|
|
80
|
+
this.searchPanelMoChanged$ = this._searchPanelMoChangedSource.asObservable().pipe(distinctUntilChanged());
|
|
81
|
+
this.layoutInfo$ = this._layoutInfoSource.asObservable().pipe(shareReplay(1));
|
|
82
|
+
this.allSearchPanelSettings$ = combineLatest([
|
|
83
|
+
this._allSearchPanelSettingsSource.asObservable(),
|
|
84
|
+
this._defaultSearchPanelSettingsSource.asObservable()
|
|
85
|
+
]).pipe(map(([allSettings, defaultSettings]) => {
|
|
86
|
+
if (defaultSettings && allSettings) {
|
|
87
|
+
defaultSettings.IsDefault = !allSettings.some((c) => c.IsDefault);
|
|
88
|
+
allSettings = [defaultSettings, ...allSettings];
|
|
89
|
+
}
|
|
90
|
+
return allSettings;
|
|
91
|
+
}), delay(0), shareReplay(1));
|
|
92
|
+
this.selectedSearchPanelSettingsId$ = this._selectedSearchPanelSettingsIdSource
|
|
93
|
+
.asObservable()
|
|
94
|
+
.pipe(distinctUntilChanged());
|
|
95
|
+
this.selectedSearchPanelSettings$ = combineLatest([
|
|
96
|
+
this.selectedSearchPanelSettingsId$,
|
|
97
|
+
this.allSearchPanelSettings$
|
|
98
|
+
]).pipe(map(([id, settings]) => settings?.find((c) => c.Id === id)), shareReplay(1));
|
|
99
|
+
}
|
|
100
|
+
get inDialog$() {
|
|
101
|
+
return this._inDialog$.asObservable();
|
|
102
|
+
}
|
|
103
|
+
get fullscreen$() {
|
|
104
|
+
return this._fullscreen$.asObservable();
|
|
105
|
+
}
|
|
106
|
+
get cartableChildsMo$() {
|
|
107
|
+
return this._cartableChildsMo$.asObservable();
|
|
108
|
+
}
|
|
109
|
+
get cartableTemplates$() {
|
|
110
|
+
return this._cartableTemplates$.asObservable();
|
|
111
|
+
}
|
|
112
|
+
get searchPanelUi() {
|
|
113
|
+
return this._searchPanelUiSource.getValue();
|
|
114
|
+
}
|
|
115
|
+
get reportId() {
|
|
116
|
+
return this._reportSource.getValue()?.Id;
|
|
117
|
+
}
|
|
118
|
+
get allSearchPanelSettings() {
|
|
119
|
+
return this._allSearchPanelSettingsSource.getValue();
|
|
120
|
+
}
|
|
121
|
+
get hideSearchpanel$() {
|
|
122
|
+
return this._hideSearchapanelSource.asObservable().pipe(distinctUntilChanged());
|
|
123
|
+
}
|
|
124
|
+
get hideSearchpanel() {
|
|
125
|
+
return this._hideSearchapanelSource.getValue();
|
|
126
|
+
}
|
|
127
|
+
setTitle(title) {
|
|
128
|
+
this._titleSource.next({ text: title, image: '' });
|
|
129
|
+
}
|
|
130
|
+
toggleHideSearchpanel(val) {
|
|
131
|
+
this._hideSearchapanelSource.next(typeof val !== 'undefined' ? val : !this._hideSearchapanelSource.getValue());
|
|
132
|
+
}
|
|
133
|
+
setContext(context) {
|
|
134
|
+
this._contextSource.next(context);
|
|
135
|
+
}
|
|
136
|
+
setInDialog(val) {
|
|
137
|
+
this._inDialog$.next(val);
|
|
138
|
+
}
|
|
139
|
+
setFullscreen(val) {
|
|
140
|
+
this._fullscreen$.next(val);
|
|
141
|
+
}
|
|
142
|
+
createNewInlineMo(isChecked) {
|
|
143
|
+
const context = this.context;
|
|
144
|
+
const formSetting = context.Setting.FormTemplate;
|
|
145
|
+
const typeDefId = context.Setting.Extra.Report.TypeDefId;
|
|
146
|
+
const newMo = getNewMoGridEditor(formSetting, typeDefId);
|
|
147
|
+
newMo.Id = genrateInlineMoId();
|
|
148
|
+
newMo.$IsChecked = isChecked;
|
|
149
|
+
newMo.$NewInlineMo = true;
|
|
150
|
+
if (this._isComposite(context)) {
|
|
151
|
+
const relation = BarsaApi.Common.Util.TryGetValue(this.context.Setting, 'Extra.Relation');
|
|
152
|
+
newMo[relation.ParentFdName] = relation.ParentMoId;
|
|
153
|
+
}
|
|
154
|
+
// this._newInlineEditMoSource.next(newMo);
|
|
155
|
+
return newMo;
|
|
156
|
+
}
|
|
157
|
+
setLayoutInfo(layoutInfo) {
|
|
158
|
+
this._layoutInfoSource.next(layoutInfo);
|
|
159
|
+
}
|
|
160
|
+
destroy() {
|
|
161
|
+
this._onDestroy$.next();
|
|
162
|
+
this._unscubscribeContext();
|
|
163
|
+
}
|
|
164
|
+
pageSizeChanged(pageIndex) {
|
|
165
|
+
this.context.fireEvent('PageChange', this.context, pageIndex);
|
|
166
|
+
}
|
|
167
|
+
pageChanged(pageIndex) {
|
|
168
|
+
this.context.currentPage = pageIndex;
|
|
169
|
+
this.context.fireEvent('PageChange', this.context, pageIndex);
|
|
170
|
+
}
|
|
171
|
+
reSetMoDataList(moDataList) {
|
|
172
|
+
const newMoDataList = moDataList ?? this.moDataListSource.getValue();
|
|
173
|
+
this._moDataListChanged([...newMoDataList]);
|
|
174
|
+
}
|
|
175
|
+
// Search Setting Manager
|
|
176
|
+
clearSearch() {
|
|
177
|
+
const searchPanelUi = this.searchPanelUi;
|
|
178
|
+
const fieldUi = searchPanelUi._dictFieldUi.$Search ?? searchPanelUi._dictFieldUi.جستجو;
|
|
179
|
+
fieldUi.fireEvent('ClearClick');
|
|
180
|
+
}
|
|
181
|
+
search() {
|
|
182
|
+
const searchPanelUi = this.searchPanelUi;
|
|
183
|
+
const fieldUi = searchPanelUi._dictFieldUi.$Search ?? searchPanelUi._dictFieldUi.جستجو;
|
|
184
|
+
fieldUi.fireEvent('SearchClick');
|
|
185
|
+
}
|
|
186
|
+
getValueInlineEdit() {
|
|
187
|
+
return this._inlineEditModeSource.getValue();
|
|
188
|
+
}
|
|
189
|
+
getAllowInlineEdit() {
|
|
190
|
+
return this._allowInlineEditSource.getValue();
|
|
191
|
+
}
|
|
192
|
+
setInlineEdit(value) {
|
|
193
|
+
this._inlineEditModeSource.next(value);
|
|
194
|
+
}
|
|
195
|
+
openSearchFieldsHiddenSettings() {
|
|
196
|
+
this._openSearchPanelHiddenSettingsSource.next();
|
|
197
|
+
}
|
|
198
|
+
openSearchFilesManage() {
|
|
199
|
+
this._openSearchFilesManageSource.next();
|
|
200
|
+
}
|
|
201
|
+
searchPanelMoChanged(change) {
|
|
202
|
+
this._searchPanelMoChangedSource.next(change);
|
|
203
|
+
}
|
|
204
|
+
loadSearchPanelSettings() {
|
|
205
|
+
if (this.context.FormPanelUi) {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
this.reportId$
|
|
209
|
+
.pipe(takeUntil(this._onDestroy$), tap((reportId) => this._loadSearchPanelSettings(reportId)))
|
|
210
|
+
.subscribe();
|
|
211
|
+
}
|
|
212
|
+
addSearchPanelSettings(searchPanelSettings) {
|
|
213
|
+
const allSearchPanelSettings = this._allSearchPanelSettingsSource.getValue();
|
|
214
|
+
allSearchPanelSettings.push(searchPanelSettings);
|
|
215
|
+
this._allSearchPanelSettingsSource.next(allSearchPanelSettings);
|
|
216
|
+
}
|
|
217
|
+
saveSearchPanelSetting(selectedSearchPanelSettings) {
|
|
218
|
+
const searchMo = this.getSearchPanelMo();
|
|
219
|
+
const fieldsSetting = this.getSearchPanelFieldsSetting();
|
|
220
|
+
if (!selectedSearchPanelSettings) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
selectedSearchPanelSettings.SearchMo = JSON.stringify(searchMo);
|
|
224
|
+
selectedSearchPanelSettings.FieldsSetting = JSON.stringify(fieldsSetting);
|
|
225
|
+
BarsaApi.Bw.RunBlMethod('SaveSearchPanelSettings', new BarsaApi.Common.MetaObjectWeb({
|
|
226
|
+
Id: selectedSearchPanelSettings.Id,
|
|
227
|
+
$Caption: selectedSearchPanelSettings.Title,
|
|
228
|
+
ReportId: selectedSearchPanelSettings.Report?.Id,
|
|
229
|
+
Title: selectedSearchPanelSettings.Title,
|
|
230
|
+
IsDefault: selectedSearchPanelSettings.IsDefault,
|
|
231
|
+
IsPublic: selectedSearchPanelSettings.IsPublic,
|
|
232
|
+
ApplyAutomatically: selectedSearchPanelSettings.ApplyAutomatically,
|
|
233
|
+
HideSearchPanel: selectedSearchPanelSettings.HideSearchPanel,
|
|
234
|
+
SearchMo: selectedSearchPanelSettings.SearchMo,
|
|
235
|
+
FieldsSetting: selectedSearchPanelSettings.FieldsSetting
|
|
236
|
+
}), true);
|
|
237
|
+
this.searchPanelMoChanged(false);
|
|
238
|
+
}
|
|
239
|
+
applySearchPanelSettings(searchPanelSettings) {
|
|
240
|
+
const searchPanelUi = this.searchPanelUi;
|
|
241
|
+
if (!searchPanelSettings) {
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
if (this._firstApplyAutomatically && searchPanelSettings.IsPrimary) {
|
|
245
|
+
this._firstApplyAutomatically = false;
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
this._firstApplyAutomatically = false;
|
|
249
|
+
this.resetSearchPanelSettings(searchPanelUi);
|
|
250
|
+
if (searchPanelSettings.SearchMo) {
|
|
251
|
+
const searchMo = JSON.parse(searchPanelSettings.SearchMo);
|
|
252
|
+
Object.keys(searchMo).forEach((c) => {
|
|
253
|
+
const field = searchPanelUi._dictFieldUi[c];
|
|
254
|
+
if (field && c.indexOf('$') === -1) {
|
|
255
|
+
field.SetValue(searchMo[c]);
|
|
256
|
+
searchPanelUi.Mo.SetFValue(c, searchMo[c]);
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
if (searchPanelSettings.IsPrimary && !searchPanelUi.Setting.ImmediateExecute) {
|
|
260
|
+
this.searchPanelMoChanged(false);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
if (searchPanelSettings.ApplyAutomatically) {
|
|
264
|
+
this.search();
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// TODO set hidden fields
|
|
268
|
+
if (searchPanelSettings.FieldsSetting) {
|
|
269
|
+
const settings = JSON.parse(searchPanelSettings.FieldsSetting);
|
|
270
|
+
this.setAndApplySearchPanelSettingFieldsSetting(typeof settings === 'string' ? JSON.parse(settings) : settings);
|
|
271
|
+
}
|
|
272
|
+
this.searchPanelMoChanged(false);
|
|
273
|
+
}
|
|
274
|
+
getSearchPanelMo() {
|
|
275
|
+
return this.searchPanelUi.Mo;
|
|
276
|
+
}
|
|
277
|
+
getSearchPanelFieldsSetting() {
|
|
278
|
+
const searchPanelUi = this.searchPanelUi;
|
|
279
|
+
const fields = searchPanelUi.Setting.View.ControlInfo.filter((c) => c.ControlName !== '$Search' && c.ControlName !== 'جستجو');
|
|
280
|
+
const fieldsSetting = fields.map((c) => ({
|
|
281
|
+
Name: c.ControlName,
|
|
282
|
+
Caption: c.ControlFieldCaptionTranslated,
|
|
283
|
+
Hidden: searchPanelUi._dictFieldUi[c.ControlName].Setting.IsVisible === false ? true : false,
|
|
284
|
+
IsMandatory: c.IsMandatory
|
|
285
|
+
}));
|
|
286
|
+
return fieldsSetting;
|
|
287
|
+
}
|
|
288
|
+
setAndApplySearchPanelSettingFieldsSetting(fieldsSetting) {
|
|
289
|
+
const searchPanelUi = this.searchPanelUi;
|
|
290
|
+
fieldsSetting.forEach((c) => {
|
|
291
|
+
const field = searchPanelUi._dictFieldUi[c.Name];
|
|
292
|
+
if (field) {
|
|
293
|
+
searchPanelUi.fireEvent('ChangeFieldVisible', field.Setting.ControlFieldCaption, !c.Hidden);
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
updateSearchPanelSettings(allSearchPanelSettings) {
|
|
298
|
+
allSearchPanelSettings = allSearchPanelSettings.filter((c) => !c.IsPrimary && !c.IsDeleted);
|
|
299
|
+
this._allSearchPanelSettingsSource.next(allSearchPanelSettings);
|
|
300
|
+
}
|
|
301
|
+
removeSearchPanelSettings(searchPanelSettingsId) {
|
|
302
|
+
const allSearchPanelSettings = this._allSearchPanelSettingsSource.getValue();
|
|
303
|
+
allSearchPanelSettings.filter((c) => c.Id !== searchPanelSettingsId);
|
|
304
|
+
this._allSearchPanelSettingsSource.next(allSearchPanelSettings);
|
|
305
|
+
}
|
|
306
|
+
changeSelectedSearchPanel(selectedSearchPanelSettingsId) {
|
|
307
|
+
this._selectedSearchPanelSettingsIdSource.next(selectedSearchPanelSettingsId);
|
|
308
|
+
}
|
|
309
|
+
loadMetaConditionsControlInfos(typeDefId, fieldDbNames) {
|
|
310
|
+
const mo = GetDefaultMoObjectInfo(typeDefId);
|
|
311
|
+
return of(this._controlInfosMetaobject).pipe(switchMap((controlsInfo) => {
|
|
312
|
+
if (controlsInfo.length > 0) {
|
|
313
|
+
return of(controlsInfo);
|
|
314
|
+
}
|
|
315
|
+
return getControlList(mo, fieldDbNames, true, false);
|
|
316
|
+
}), tap((controlsInfo) => (this._controlInfosMetaobject = controlsInfo)));
|
|
317
|
+
}
|
|
318
|
+
_initCreateNewInlineMo(context) {
|
|
319
|
+
if (!context) {
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
const formSetting = context.Setting.FormTemplate;
|
|
323
|
+
if (formSetting) {
|
|
324
|
+
this.createNewInlineMo(false);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
_isComposite(context) {
|
|
328
|
+
const relationType = BarsaApi.Common.Util.TryGetValue(context.Setting, 'Extra.Relation.RelationType');
|
|
329
|
+
return relationType === BarsaApi.Common.Enums.RelationType.Composition;
|
|
330
|
+
}
|
|
331
|
+
_addEventListener(context) {
|
|
332
|
+
context.on({
|
|
333
|
+
MaskChanged: this._maskChanged.bind(this),
|
|
334
|
+
ViewerMaskChanged: this._viewerMaskChanged.bind(this),
|
|
335
|
+
ViewerControlChanged: this._viewerControlChanged.bind(this),
|
|
336
|
+
VisibleChanged: this._visibleChanged.bind(this),
|
|
337
|
+
ReadonlyChanged: this._readonlyChanged.bind(this),
|
|
338
|
+
MenuItemsChanged: this._menuItemsChanged.bind(this),
|
|
339
|
+
TitleChanged: this._titleChanged.bind(this),
|
|
340
|
+
FormPanelControlShowWindow: this._formPanelControlShowWindowChanged.bind(this),
|
|
341
|
+
SearchPanelChanged: this._searchPanelChanged.bind(this),
|
|
342
|
+
PagingSettingChanged: this._pagingSettingChanged.bind(this),
|
|
343
|
+
ToolbarButtonsChanged: this._toolbarButtonsChanged.bind(this),
|
|
344
|
+
EnableChanged: this._enableChanged.bind(this),
|
|
345
|
+
Destroy: this._destroyChanged.bind(this),
|
|
346
|
+
ExitInlineEdit: this._existInlineEdit.bind(this)
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
_initialize(context) {
|
|
350
|
+
this._initCartablesFormTemplate(context);
|
|
351
|
+
this._initConditionalFormats(context);
|
|
352
|
+
this._initAllowInlineEdit(context);
|
|
353
|
+
this._initOnlyInlineEdit(context);
|
|
354
|
+
this._initInlineEditMode(context);
|
|
355
|
+
this._initReport(context);
|
|
356
|
+
this._initViewerControl(context);
|
|
357
|
+
this._initHideToolbar(context);
|
|
358
|
+
this._initToolbarButtons(context);
|
|
359
|
+
this._initVisible(context);
|
|
360
|
+
this._initEnable(context);
|
|
361
|
+
this._initTitle(context);
|
|
362
|
+
this._initReadonly(context);
|
|
363
|
+
this._initMoDataList(context);
|
|
364
|
+
this._initPagingSetting(context);
|
|
365
|
+
this._initMenuItems(context);
|
|
366
|
+
this._initSearchpanel(context);
|
|
367
|
+
this._initCreateNewInlineMo(context);
|
|
368
|
+
}
|
|
369
|
+
_initCartablesFormTemplate(context) {
|
|
370
|
+
const cartableTemplates = context.Setting.CartableTemplates;
|
|
371
|
+
if (cartableTemplates) {
|
|
372
|
+
const ids = Object.keys(cartableTemplates);
|
|
373
|
+
ids.forEach((id) => {
|
|
374
|
+
if (typeof cartableTemplates[id] === 'string') {
|
|
375
|
+
cartableTemplates[id] = BarsaApi.Ext.decode(cartableTemplates[id]);
|
|
376
|
+
}
|
|
377
|
+
});
|
|
378
|
+
this._cartableTemplates$.next(cartableTemplates);
|
|
379
|
+
}
|
|
380
|
+
this._cartableChildsMo(context);
|
|
381
|
+
}
|
|
382
|
+
_initSearchpanel(context) {
|
|
383
|
+
if (context && context._searchPanelControl) {
|
|
384
|
+
this._searchPanelChanged(context._searchPanelControl);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
_initConditionalFormats(context) {
|
|
388
|
+
if (context && context.Setting.View?.ConditionalFormats) {
|
|
389
|
+
this._conditionalFormatsChanged(context.Setting.View?.ConditionalFormats);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
_initMenuItems(context) {
|
|
393
|
+
if (context && context.menuItems) {
|
|
394
|
+
// const newItems = context.menuItems;
|
|
395
|
+
const newItems = context.menuItems.filter((c) => c.itemId !== 'Delete');
|
|
396
|
+
this._menuItemsChanged(newItems);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
_initReport(context) {
|
|
400
|
+
const report = BarsaApi.Common.Util.TryGetValue(context, 'Setting.Extra.Report', []);
|
|
401
|
+
this._reportSource.next(report);
|
|
402
|
+
}
|
|
403
|
+
_initMoDataList(context) {
|
|
404
|
+
const moDataList = BarsaApi.Common.Util.TryGetValue(context, 'Setting.Data.MoDataList', []);
|
|
405
|
+
this._moDataListChanged(moDataList);
|
|
406
|
+
}
|
|
407
|
+
_cartableChildsMo(context) {
|
|
408
|
+
if (context.Setting.CartableChildsMo) {
|
|
409
|
+
this._cartableChildsMo$.next(context.Setting.CartableChildsMo);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
_initPagingSetting(context) {
|
|
413
|
+
const pagingSetting = BarsaApi.Common.Util.TryGetValue(context, 'Setting.Data.Paging', null);
|
|
414
|
+
this._pagingSettingChanged(pagingSetting);
|
|
415
|
+
}
|
|
416
|
+
_initTitle(context) {
|
|
417
|
+
let title = BarsaApi.Common.Util.TryGetValue(context, 'title', null);
|
|
418
|
+
if (title === null) {
|
|
419
|
+
title = BarsaApi.Common.Util.TryGetValue(context, 'Setting.Extra.Report.Caption', '');
|
|
420
|
+
}
|
|
421
|
+
this._titleChanged({ text: title, image: '' });
|
|
422
|
+
}
|
|
423
|
+
_initReadonly(context) {
|
|
424
|
+
const readonly = context.readonly === true ? true : false;
|
|
425
|
+
this._readonlyChanged(readonly);
|
|
426
|
+
}
|
|
427
|
+
_initEnable(context) {
|
|
428
|
+
const enable = context.enable === false ? false : true;
|
|
429
|
+
this._enableChanged(enable);
|
|
430
|
+
}
|
|
431
|
+
_initVisible(context) {
|
|
432
|
+
const visible = context.visible === false ? false : true;
|
|
433
|
+
this._visibleChanged(visible);
|
|
434
|
+
}
|
|
435
|
+
_initToolbarButtons(context) {
|
|
436
|
+
const buttons = context.tlbButtons;
|
|
437
|
+
if (Array.isArray(buttons)) {
|
|
438
|
+
this._toolbarButtonsChanged(buttons);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
_initInlineEditMode(context) {
|
|
442
|
+
const inlineEditMode = context.Setting?.View?.AutoInlineEdit;
|
|
443
|
+
this._inlineEditModeSource.next(inlineEditMode);
|
|
444
|
+
}
|
|
445
|
+
_initAllowInlineEdit(context) {
|
|
446
|
+
const allowInlineEdit = context.Setting?.View?.AllowInlineEdit;
|
|
447
|
+
const allowEdit = context.Setting.Extra?.DefaultCommandsAccess?.Edit;
|
|
448
|
+
this._allowInlineEditSource.next(allowInlineEdit && allowEdit);
|
|
449
|
+
}
|
|
450
|
+
_initOnlyInlineEdit(context) {
|
|
451
|
+
const onlyInlineEdit = context.Setting?.View?.OnlyInlineEdit;
|
|
452
|
+
this._onlyInlineEditSource.next(onlyInlineEdit);
|
|
453
|
+
}
|
|
454
|
+
_initViewerControl(context) {
|
|
455
|
+
const viewerControl = context.viewerControl;
|
|
456
|
+
if (viewerControl) {
|
|
457
|
+
this._viewerControlChanged(viewerControl);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
_initHideToolbar(context) {
|
|
461
|
+
const hideToolbar = BarsaApi.Common.Util.TryGetValue(context, 'Setting.Extra.Report.HideToolbar', false);
|
|
462
|
+
this._hideToolbarSource.next(hideToolbar);
|
|
463
|
+
}
|
|
464
|
+
_unscubscribeContext() {
|
|
465
|
+
this.context.un('MaskChanged', this._maskChanged);
|
|
466
|
+
this.context.un('ViewerControlChanged', this._viewerControlChanged);
|
|
467
|
+
this.context.un('ViewerMaskChanged', this._viewerMaskChanged);
|
|
468
|
+
this.context.un('VisibleChanged', this._visibleChanged);
|
|
469
|
+
this.context.un('ReadonlyChanged', this._readonlyChanged);
|
|
470
|
+
this.context.un('MenuItemsChanged', this._menuItemsChanged);
|
|
471
|
+
this.context.un('TitleChanged', this._titleChanged);
|
|
472
|
+
this.context.un('FormPanelControlShowWindow', this._formPanelControlShowWindowChanged);
|
|
473
|
+
this.context.un('PagingSettingChanged', this._pagingSettingChanged);
|
|
474
|
+
this.context.un('ToolbarButtonsChanged', this._toolbarButtonsChanged);
|
|
475
|
+
this.context.un('EnableChanged', this._enableChanged);
|
|
476
|
+
this.context.un('Destroy', this._destroyChanged);
|
|
477
|
+
this.context.un('ExitInlineEdit', this._existInlineEdit);
|
|
478
|
+
}
|
|
479
|
+
_conditionalFormatsChanged(conditionalFormats) {
|
|
480
|
+
this._conditionalFormatsSource.next(conditionalFormats);
|
|
481
|
+
}
|
|
482
|
+
_moDataListChanged(moDataList) {
|
|
483
|
+
this.moDataListSource.next(moDataList);
|
|
484
|
+
if (this.context) {
|
|
485
|
+
this._cartableChildsMo(this.context);
|
|
486
|
+
this._initCartablesFormTemplate(this.context);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
_viewerControlChanged(viewerControl) {
|
|
490
|
+
this._viewerControlSource.next(viewerControl);
|
|
491
|
+
this._initConditionalFormats(this.context);
|
|
492
|
+
this._initInlineEditMode(this.context);
|
|
493
|
+
this._initAllowInlineEdit(this.context);
|
|
494
|
+
this._initOnlyInlineEdit(this.context);
|
|
495
|
+
}
|
|
496
|
+
_maskChanged(mask) {
|
|
497
|
+
this._maskSource.next(mask);
|
|
498
|
+
}
|
|
499
|
+
_viewerMaskChanged(viewerMask) {
|
|
500
|
+
this._viewerMaskSource.next(viewerMask);
|
|
501
|
+
}
|
|
502
|
+
_readonlyChanged(readonly) {
|
|
503
|
+
this._readonlySource.next(readonly);
|
|
504
|
+
}
|
|
505
|
+
_visibleChanged(viewerMask) {
|
|
506
|
+
this._visibleSource.next(viewerMask);
|
|
507
|
+
}
|
|
508
|
+
_menuItemsChanged(menuItems) {
|
|
509
|
+
this._menuItemsSource.next(menuItems);
|
|
510
|
+
}
|
|
511
|
+
_titleChanged(titleObj) {
|
|
512
|
+
this._titleSource.next(titleObj);
|
|
513
|
+
}
|
|
514
|
+
_formPanelControlShowWindowChanged(formpanelObj) {
|
|
515
|
+
this._formPanelControlShowWindowSource.next(formpanelObj);
|
|
516
|
+
}
|
|
517
|
+
_searchPanelChanged(searchPanel) {
|
|
518
|
+
this._searchPanelUiSource.next(searchPanel);
|
|
519
|
+
}
|
|
520
|
+
_pagingSettingChanged(pageingSetting) {
|
|
521
|
+
this._pagingSettingSource.next(pageingSetting);
|
|
522
|
+
}
|
|
523
|
+
_toolbarButtonsChanged(buttons) {
|
|
524
|
+
this._toolbarButtonsSource.next(buttons);
|
|
525
|
+
}
|
|
526
|
+
_enableChanged(enable) {
|
|
527
|
+
this._enableSource.next(enable);
|
|
528
|
+
}
|
|
529
|
+
_destroyChanged() {
|
|
530
|
+
this._destroySource.next();
|
|
531
|
+
}
|
|
532
|
+
_existInlineEdit() {
|
|
533
|
+
this._inlineEditModeSource.next(false);
|
|
534
|
+
}
|
|
535
|
+
_addDefaultSearchPanelSettings(searchPanel) {
|
|
536
|
+
const searchMo = JSON.stringify(searchPanel?.Mo ?? new MetaobjectDataModel());
|
|
537
|
+
const StandardText = this._bbbPipe.transform('Standard');
|
|
538
|
+
const standardSettings = {
|
|
539
|
+
Id: '',
|
|
540
|
+
$Caption: StandardText,
|
|
541
|
+
IsStandard: true,
|
|
542
|
+
IsDefault: true,
|
|
543
|
+
IsPublic: true,
|
|
544
|
+
IsPrimary: true,
|
|
545
|
+
ApplyAutomatically: true,
|
|
546
|
+
HideSearchPanel: false,
|
|
547
|
+
Title: StandardText,
|
|
548
|
+
SearchMo: searchMo,
|
|
549
|
+
ReportId: ''
|
|
550
|
+
};
|
|
551
|
+
this._defaultSearchPanelSettingsSource.next(standardSettings);
|
|
552
|
+
}
|
|
553
|
+
_loadSearchPanelSettings(reportId) {
|
|
554
|
+
BarsaApi.Bw.RunBlMethodAsync({
|
|
555
|
+
Parameters: [reportId],
|
|
556
|
+
Method: 'LoadAllUserSearchPanelSettings',
|
|
557
|
+
SuccessFn: (allSearchPanelSettings) => {
|
|
558
|
+
if (Array.isArray(allSearchPanelSettings)) {
|
|
559
|
+
allSearchPanelSettings = BarsaApi.Bw._unwrap(allSearchPanelSettings);
|
|
560
|
+
this._allSearchPanelSettingsSource.next(allSearchPanelSettings);
|
|
561
|
+
const defaultSearch = allSearchPanelSettings.find((c) => c.IsDefault);
|
|
562
|
+
if (defaultSearch) {
|
|
563
|
+
this._selectedSearchPanelSettingsIdSource.next(defaultSearch.Id);
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
},
|
|
567
|
+
FailFn: () => { }
|
|
568
|
+
});
|
|
569
|
+
}
|
|
570
|
+
resetSearchPanelSettings(searchPanelUi) {
|
|
571
|
+
this.clearSearch();
|
|
572
|
+
const fieldUi = searchPanelUi._dictFieldUi;
|
|
573
|
+
const changed = searchPanelUi.Mo.GetChangedObject();
|
|
574
|
+
Object.keys(changed).forEach((c) => {
|
|
575
|
+
const field = searchPanelUi._dictFieldUi[c];
|
|
576
|
+
if (field) {
|
|
577
|
+
field.SetValue(null);
|
|
578
|
+
searchPanelUi.Mo.SetFValue(c, null);
|
|
579
|
+
}
|
|
580
|
+
searchPanelUi.Mo.SetState('New');
|
|
581
|
+
});
|
|
582
|
+
Object.keys(fieldUi).forEach((c) => {
|
|
583
|
+
if (c !== '$Search' && fieldUi[c].LayoutControl) {
|
|
584
|
+
searchPanelUi.fireEvent('ChangeFieldVisible', fieldUi[c].Setting.ControlFieldCaption, true);
|
|
585
|
+
}
|
|
586
|
+
});
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
UlvMainService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: UlvMainService, deps: [{ token: i1.BbbTranslatePipe }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
590
|
+
UlvMainService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: UlvMainService });
|
|
591
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: UlvMainService, decorators: [{
|
|
592
|
+
type: Injectable
|
|
593
|
+
}], ctorParameters: function () { return [{ type: i1.BbbTranslatePipe }]; } });
|
|
594
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWx2bWFpbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2Etbm92aW4tcmF5LWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy91bHZtYWluLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM3RixPQUFPLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRyxPQUFPLEVBQ0gsUUFBUSxFQUVSLG1CQUFtQixFQU10QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsc0JBQXNCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7OztBQUc3RyxNQUFNLE9BQU8sY0FBYztJQTRFdkIsWUFBb0IsUUFBMEI7UUFBMUIsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7UUEzRTlDLHFCQUFnQixHQUFHLElBQUksZUFBZSxDQUF3QixFQUFFLENBQUMsQ0FBQztRQStCbEUsd0JBQW1CLEdBQUcsSUFBSSxlQUFlLENBQXdDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLHVCQUFrQixHQUFHLElBQUksZUFBZSxDQUFnRCxFQUFFLENBQUMsQ0FBQztRQUVwRixzQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBTyxDQUFDO1FBQ3ZDLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQUNwQyxlQUFVLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDakQsaUJBQVksR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFL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QVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckIsYUFBYSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ3ZDO1lBQ0QsYUFBYSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQy9CLElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFO2dCQUM3QyxhQUFhLENBQUMsU0FBUyxDQUFDLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDL0Y7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7OzJHQWhzQlEsY0FBYzsrR0FBZCxjQUFjOzJGQUFkLGNBQWM7a0JBRDFCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlbGF5LCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gICAgQmFyc2FBcGksXG4gICAgTWVudUl0ZW0sXG4gICAgTWV0YW9iamVjdERhdGFNb2RlbCxcbiAgICBQYWdpbmdTZXR0aW5nLFxuICAgIFNlYXJjaFBhbmVsU2V0dGluZ3MsXG4gICAgR2VuZXJhbENvbnRyb2xJbmZvTW9kZWwsXG4gICAgQ29sdW1uSW5mb1R5cGUsXG4gICAgRm9ybVNldHRpbmdcbn0gZnJvbSAnLi4vYWJzdHJhY3QtY2xhc3Nlcyc7XG5pbXBvcnQgeyBnZW5yYXRlSW5saW5lTW9JZCwgZ2V0Q29udHJvbExpc3QsIEdldERlZmF1bHRNb09iamVjdEluZm8sIGdldE5ld01vR3JpZEVkaXRvciB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBCYmJUcmFuc2xhdGVQaXBlIH0gZnJvbSAnLi4vcGlwZXMnO1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFVsdk1haW5TZXJ2aWNlIHtcbiAgICBtb0RhdGFMaXN0U291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNZXRhb2JqZWN0RGF0YU1vZGVsW10+KFtdKTtcbiAgICBjb250ZXh0JDogU3Vic2NyaXB0aW9uO1xuICAgIHZpZXdlciQ6IE9ic2VydmFibGU8YW55PjtcbiAgICBjb25kaXRpb25hbEZvcm1hdHMkOiBPYnNlcnZhYmxlPGFueT47XG4gICAgaGlkZVRvb2xiYXIkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIG1hc2skOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIHZpd2VyTWFzayQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgdmlzaWJsZSQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgZW5hYmxlJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICByZWFkb25seSQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgbWVudUl0ZW1zJDogT2JzZXJ2YWJsZTxNZW51SXRlbVtdPjtcbiAgICB0aXRsZSQ6IE9ic2VydmFibGU8eyB0ZXh0OiBzdHJpbmc7IGltYWdlOiBzdHJpbmcgfT47XG4gICAgZm9ybVBhbmVsQ29udHJvbFNob3dXaW5kb3ckOiBPYnNlcnZhYmxlPHsgZm9ybXBhbmVsQ29udHJvbDogYW55OyBoYXNQYXJlbnRNbzogYm9vbGVhbiB9PjtcbiAgICBzZWFyY2hQYW5lbFVpJDogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIHBhZ2luZ1NldHRpbmckOiBPYnNlcnZhYmxlPFBhZ2luZ1NldHRpbmcgfCBudWxsPjtcbiAgICB0b29sYmFyQnV0dG9ucyQ6IE9ic2VydmFibGU8YW55W10+O1xuICAgIGRlc3Ryb3kkOiBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgIG1vRGF0YUxpc3QkOiBPYnNlcnZhYmxlPE1ldGFvYmplY3REYXRhTW9kZWxbXT47XG4gICAgcmVwb3J0SWQkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gICAgYWxsb3dJbmxpbmVFZGl0JDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICBpbmxpbmVFZGl0TW9kZSQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgb25seUlubGluZUVkaXQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIGNvbnRleHQ6IGFueTtcbiAgICBvcGVuU2VhcmNoUGFuZWxIaWRkZW5TZXR0aW5ncyQ6IE9ic2VydmFibGU8dm9pZD47XG4gICAgb3BlblNlYXJjaEZpbGVzTWFuYWdlJDogT2JzZXJ2YWJsZTx2b2lkPjtcbiAgICBzZWFyY2hQYW5lbE1vQ2hhbmdlZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgYWxsU2VhcmNoUGFuZWxTZXR0aW5ncyQ6IE9ic2VydmFibGU8U2VhcmNoUGFuZWxTZXR0aW5nc1tdPjtcbiAgICBsYXlvdXRJbmZvJDogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIHNlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5nc0lkJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICAgIHNlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5ncyQ6IE9ic2VydmFibGU8U2VhcmNoUGFuZWxTZXR0aW5ncyB8IHVuZGVmaW5lZD47XG4gICAgbmV3SW5saW5lRWRpdE1vJDogT2JzZXJ2YWJsZTxNZXRhb2JqZWN0RGF0YU1vZGVsIHwgbnVsbD47XG4gICAgX2NhcnRhYmxlVGVtcGxhdGVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8eyBba2V5OiBzdHJpbmddOiBGb3JtU2V0dGluZyB9IHwgbnVsbD4oe30pO1xuICAgIF9jYXJ0YWJsZUNoaWxkc01vJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8eyBba2V5OiBzdHJpbmddOiBNZXRhb2JqZWN0RGF0YU1vZGVsIH0gfCBudWxsPih7fSk7XG5cbiAgICBwcml2YXRlIF9sYXlvdXRJbmZvU291cmNlID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICAgIHByaXZhdGUgX2NvbnRleHRTb3VyY2UgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gICAgcHJpdmF0ZSBfaW5EaWFsb2ckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgcHJpdmF0ZSBfZnVsbHNjcmVlbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBwcml2YXRlIF9jb25kaXRpb25hbEZvcm1hdHNTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgcHJpdmF0ZSBfcmVwb3J0U291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpO1xuICAgIHByaXZhdGUgX3ZpZXdlckNvbnRyb2xTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4obnVsbCk7XG4gICAgcHJpdmF0ZSBfaGlkZVRvb2xiYXJTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICAgIHByaXZhdGUgX29uRGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByaXZhdGUgX21hc2tTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBwcml2YXRlIF92aWV3ZXJNYXNrU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgcHJpdmF0ZSBfdmlzaWJsZVNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gICAgcHJpdmF0ZSBfZW5hYmxlU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgICBwcml2YXRlIF9yZWFkb25seVNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIHByaXZhdGUgX21lbnVJdGVtc1NvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWVudUl0ZW1bXT4oW10pO1xuICAgIHByaXZhdGUgX29ubHlJbmxpbmVFZGl0U291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgcHJpdmF0ZSBfaW5saW5lRWRpdE1vZGVTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBwcml2YXRlIF9hbGxvd0lubGluZUVkaXRTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBwcml2YXRlIF90aXRsZVNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8eyB0ZXh0OiBzdHJpbmc7IGltYWdlOiBzdHJpbmcgfT4oe1xuICAgICAgICB0ZXh0OiAnJyxcbiAgICAgICAgaW1hZ2U6ICcnXG4gICAgfSk7XG4gICAgcHJpdmF0ZSBfZm9ybVBhbmVsQ29udHJvbFNob3dXaW5kb3dTb3VyY2UgPSBuZXcgU3ViamVjdDx7XG4gICAgICAgIGZvcm1wYW5lbENvbnRyb2w6IGFueTtcbiAgICAgICAgaGFzUGFyZW50TW86IGFueTtcbiAgICB9PigpO1xuICAgIHByaXZhdGUgX3NlYXJjaFBhbmVsVWlTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4obnVsbCk7XG5cbiAgICBwcml2YXRlIF9wYWdpbmdTZXR0aW5nU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQYWdpbmdTZXR0aW5nIHwgbnVsbD4obnVsbCk7XG4gICAgcHJpdmF0ZSBfdG9vbGJhckJ1dHRvbnNTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgcHJpdmF0ZSBfZGVzdHJveVNvdXJjZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgcHJpdmF0ZSBfZmlyc3RBcHBseUF1dG9tYXRpY2FsbHkgPSB0cnVlO1xuICAgIHByaXZhdGUgX2NvbnRyb2xJbmZvc01ldGFvYmplY3Q6IEdlbmVyYWxDb250cm9sSW5mb01vZGVsW10gPSBbXTtcbiAgICBwcml2YXRlIF9zZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3NJZFNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG4gICAgcHJpdmF0ZSBfZGVmYXVsdFNlYXJjaFBhbmVsU2V0dGluZ3NTb3VyY2UgPSBuZXcgU3ViamVjdDxTZWFyY2hQYW5lbFNldHRpbmdzPigpO1xuICAgIHByaXZhdGUgX2FsbFNlYXJjaFBhbmVsU2V0dGluZ3NTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNlYXJjaFBhbmVsU2V0dGluZ3NbXT4oW10pO1xuICAgIHByaXZhdGUgX29wZW5TZWFyY2hQYW5lbEhpZGRlblNldHRpbmdzU291cmNlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBwcml2YXRlIF9vcGVuU2VhcmNoRmlsZXNNYW5hZ2VTb3VyY2UgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByaXZhdGUgX3NlYXJjaFBhbmVsTW9DaGFuZ2VkU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgcHJpdmF0ZSBfbmV3SW5saW5lRWRpdE1vU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNZXRhb2JqZWN0RGF0YU1vZGVsIHwgbnVsbD4obnVsbCk7XG4gICAgcHJpdmF0ZSBfaGlkZVNlYXJjaGFwYW5lbFNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2JiYlBpcGU6IEJiYlRyYW5zbGF0ZVBpcGUpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0JCA9IHRoaXMuX2NvbnRleHRTb3VyY2VcbiAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpLFxuICAgICAgICAgICAgICAgIHRhcCgoY29udGV4dCkgPT4gKHRoaXMuY29udGV4dCA9IGNvbnRleHQpKSxcbiAgICAgICAgICAgICAgICB0YXAoKGNvbnRleHQpID0+IHRoaXMuX2luaXRpYWxpemUoY29udGV4dCkpLFxuICAgICAgICAgICAgICAgIHRhcCgoY29udGV4dCkgPT4gdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcihjb250ZXh0KSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5uZXdJbmxpbmVFZGl0TW8kID0gdGhpcy5fbmV3SW5saW5lRWRpdE1vU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKTtcbiAgICAgICAgdGhpcy52aWV3ZXIkID0gdGhpcy5fdmlld2VyQ29udHJvbFNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSk7XG4gICAgICAgIHRoaXMuY29uZGl0aW9uYWxGb3JtYXRzJCA9IHRoaXMuX2NvbmRpdGlvbmFsRm9ybWF0c1NvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSk7XG4gICAgICAgIHRoaXMuaGlkZVRvb2xiYXIkID0gdGhpcy5faGlkZVRvb2xiYXJTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpO1xuICAgICAgICB0aGlzLm1hc2skID0gdGhpcy5fbWFza1NvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSk7XG4gICAgICAgIHRoaXMudml3ZXJNYXNrJCA9IHRoaXMuX3ZpZXdlck1hc2tTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpO1xuICAgICAgICB0aGlzLnZpc2libGUkID0gdGhpcy5fdmlzaWJsZVNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSk7XG4gICAgICAgIHRoaXMuZW5hYmxlJCA9IHRoaXMuX2VuYWJsZVNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSk7XG4gICAgICAgIHRoaXMucmVhZG9ubHkkID0gdGhpcy5fcmVhZG9ubHlTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpO1xuICAgICAgICB0aGlzLm1lbnVJdGVtcyQgPSB0aGlzLl9tZW51SXRlbXNTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZShcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSxcbiAgICAgICAgICAgIG1hcCgoaXRlbXMpID0+IGl0ZW1zLmZpbHRlcigoYykgPT4gYy5pdGVtSWQgIT09ICdFeHBvcnRUb0V4Y2VsJykpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudGl0bGUkID0gdGhpcy5fdGl0bGVTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpO1xuICAgICAgICB0aGlzLmZvcm1QYW5lbENvbnRyb2xTaG93V2luZG93JCA9IHRoaXMuX2Zvcm1QYW5lbENvbnRyb2xTaG93V2luZG93U291cmNlXG4gICAgICAgICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSk7XG4gICAgICAgIHRoaXMuc2VhcmNoUGFuZWxVaSQgPSB0aGlzLl9zZWFyY2hQYW5lbFVpU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUoXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCksXG4gICAgICAgICAgICB0YXAoKHNlYXJjaFBhbmVsKSA9PiB0aGlzLl9hZGREZWZhdWx0U2VhcmNoUGFuZWxTZXR0aW5ncyhzZWFyY2hQYW5lbCkpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMub3BlblNlYXJjaFBhbmVsSGlkZGVuU2V0dGluZ3MkID0gdGhpcy5fb3BlblNlYXJjaFBhbmVsSGlkZGVuU2V0dGluZ3NTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgIHRoaXMucGFnaW5nU2V0dGluZyQgPSB0aGlzLl9wYWdpbmdTZXR0aW5nU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKTtcbiAgICAgICAgdGhpcy50b29sYmFyQnV0dG9ucyQgPSB0aGlzLl90b29sYmFyQnV0dG9uc1NvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpLFxuICAgICAgICAgICAgbWFwKChjKSA9PlxuICAgICAgICAgICAgICAgICFjID8gW10gOiBjLm1hcCgoZCkgPT4gKHsgLi4uZCwgaGlkZVRleHQ6IGQuQ29tbWFuZD8uSXNCdWlsdGluICYmIGQuaXRlbUlkICE9PSAnTmV3JyA/IHRydWUgOiBmYWxzZSB9KSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBtYXAoKGMpID0+XG4gICAgICAgICAgICAgICAgIWMgPyBbXSA6IFsuLi5jLmZpbHRlcigoZCkgPT4gIWQuQ29tbWFuZD8uSXNCdWlsdGluKSwgLi4uYy5maWx0ZXIoKGQpID0+IGQuQ29tbWFuZD8uSXNCdWlsdGluKV1cbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JCA9IHRoaXMuX2Rlc3Ryb3lTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZSh0YXAoKCkgPT4gdGhpcy5fdW5zY3Vic2NyaWJlQ29udGV4dCgpKSk7XG4gICAgICAgIHRoaXMubW9EYXRhTGlzdCQgPSB0aGlzLm1vRGF0YUxpc3RTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZSgpO1xuICAgICAgICB0aGlzLnJlcG9ydElkJCA9IHRoaXMuX3JlcG9ydFNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKG1hcCgocmVwb3J0KSA9PiByZXBvcnQ/LklkKSk7XG5cbiAgICAgICAgdGhpcy5hbGxvd0lubGluZUVkaXQkID0gdGhpcy5fYWxsb3dJbmxpbmVFZGl0U291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICB0aGlzLmlubGluZUVkaXRNb2RlJCA9IHRoaXMuX2lubGluZUVkaXRNb2RlU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICB0aGlzLm9ubHlJbmxpbmVFZGl0JCA9IHRoaXMuX29ubHlJbmxpbmVFZGl0U291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICB0aGlzLm9wZW5TZWFyY2hGaWxlc01hbmFnZSQgPSB0aGlzLl9vcGVuU2VhcmNoRmlsZXNNYW5hZ2VTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgIHRoaXMuc2VhcmNoUGFuZWxNb0NoYW5nZWQkID0gdGhpcy5fc2VhcmNoUGFuZWxNb0NoYW5nZWRTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcbiAgICAgICAgdGhpcy5sYXlvdXRJbmZvJCA9IHRoaXMuX2xheW91dEluZm9Tb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZShzaGFyZVJlcGxheSgxKSk7XG4gICAgICAgIHRoaXMuYWxsU2VhcmNoUGFuZWxTZXR0aW5ncyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgIHRoaXMuX2FsbFNlYXJjaFBhbmVsU2V0dGluZ3NTb3VyY2UuYXNPYnNlcnZhYmxlKCksXG4gICAgICAgICAgICB0aGlzLl9kZWZhdWx0U2VhcmNoUGFuZWxTZXR0aW5nc1NvdXJjZS5hc09ic2VydmFibGUoKVxuICAgICAgICBdKS5waXBlKFxuICAgICAgICAgICAgbWFwKChbYWxsU2V0dGluZ3MsIGRlZmF1bHRTZXR0aW5nc10pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFNldHRpbmdzICYmIGFsbFNldHRpbmdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTZXR0aW5ncy5Jc0RlZmF1bHQgPSAhYWxsU2V0dGluZ3Muc29tZSgoYykgPT4gYy5Jc0RlZmF1bHQpO1xuICAgICAgICAgICAgICAgICAgICBhbGxTZXR0aW5ncyA9IFtkZWZhdWx0U2V0dGluZ3MsIC4uLmFsbFNldHRpbmdzXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFsbFNldHRpbmdzO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBkZWxheSgwKSxcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTZWFyY2hQYW5lbFNldHRpbmdzSWQkID0gdGhpcy5fc2VsZWN0ZWRTZWFyY2hQYW5lbFNldHRpbmdzSWRTb3VyY2VcbiAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTZWFyY2hQYW5lbFNldHRpbmdzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3NJZCQsXG4gICAgICAgICAgICB0aGlzLmFsbFNlYXJjaFBhbmVsU2V0dGluZ3MkXG4gICAgICAgIF0pLnBpcGUoXG4gICAgICAgICAgICBtYXAoKFtpZCwgc2V0dGluZ3NdKSA9PiBzZXR0aW5ncz8uZmluZCgoYykgPT4gYy5JZCA9PT0gaWQpKSxcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICk7XG4gICAgfVxuICAgIGdldCBpbkRpYWxvZyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbkRpYWxvZyQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuICAgIGdldCBmdWxsc2NyZWVuJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Z1bGxzY3JlZW4kLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cbiAgICBnZXQgY2FydGFibGVDaGlsZHNNbyQoKTogT2JzZXJ2YWJsZTx7IFtrZXk6IHN0cmluZ106IE1ldGFvYmplY3REYXRhTW9kZWwgfSB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhcnRhYmxlQ2hpbGRzTW8kLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cbiAgICBnZXQgY2FydGFibGVUZW1wbGF0ZXMkKCk6IE9ic2VydmFibGU8eyBba2V5OiBzdHJpbmddOiBGb3JtU2V0dGluZyB9IHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FydGFibGVUZW1wbGF0ZXMkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cbiAgICBnZXQgc2VhcmNoUGFuZWxVaSgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VhcmNoUGFuZWxVaVNvdXJjZS5nZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBnZXQgcmVwb3J0SWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcG9ydFNvdXJjZS5nZXRWYWx1ZSgpPy5JZDtcbiAgICB9XG4gICAgZ2V0IGFsbFNlYXJjaFBhbmVsU2V0dGluZ3MoKTogU2VhcmNoUGFuZWxTZXR0aW5nc1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FsbFNlYXJjaFBhbmVsU2V0dGluZ3NTb3VyY2UuZ2V0VmFsdWUoKTtcbiAgICB9XG4gICAgZ2V0IGhpZGVTZWFyY2hwYW5lbCQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oaWRlU2VhcmNoYXBhbmVsU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gICAgfVxuICAgIGdldCBoaWRlU2VhcmNocGFuZWwoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oaWRlU2VhcmNoYXBhbmVsU291cmNlLmdldFZhbHVlKCk7XG4gICAgfVxuICAgIHNldFRpdGxlKHRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdGl0bGVTb3VyY2UubmV4dCh7IHRleHQ6IHRpdGxlLCBpbWFnZTogJycgfSk7XG4gICAgfVxuICAgIHRvZ2dsZUhpZGVTZWFyY2hwYW5lbCh2YWw/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2hpZGVTZWFyY2hhcGFuZWxTb3VyY2UubmV4dCh0eXBlb2YgdmFsICE9PSAndW5kZWZpbmVkJyA/IHZhbCA6ICF0aGlzLl9oaWRlU2VhcmNoYXBhbmVsU291cmNlLmdldFZhbHVlKCkpO1xuICAgIH1cbiAgICBzZXRDb250ZXh0KGNvbnRleHQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY29udGV4dFNvdXJjZS5uZXh0KGNvbnRleHQpO1xuICAgIH1cbiAgICBzZXRJbkRpYWxvZyh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faW5EaWFsb2ckLm5leHQodmFsKTtcbiAgICB9XG4gICAgc2V0RnVsbHNjcmVlbih2YWw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZnVsbHNjcmVlbiQubmV4dCh2YWwpO1xuICAgIH1cblxuICAgIGNyZWF0ZU5ld0lubGluZU1vKGlzQ2hlY2tlZDogYm9vbGVhbik6IE1ldGFvYmplY3REYXRhTW9kZWwge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBjb25zdCBmb3JtU2V0dGluZyA9IGNvbnRleHQuU2V0dGluZy5Gb3JtVGVtcGxhdGU7XG4gICAgICAgIGNvbnN0IHR5cGVEZWZJZCA9IGNvbnRleHQuU2V0dGluZy5FeHRyYS5SZXBvcnQuVHlwZURlZklkO1xuICAgICAgICBjb25zdCBuZXdNbyA9IGdldE5ld01vR3JpZEVkaXRvcihmb3JtU2V0dGluZywgdHlwZURlZklkKSBhcyBNZXRhb2JqZWN0RGF0YU1vZGVsO1xuICAgICAgICBuZXdNby5JZCA9IGdlbnJhdGVJbmxpbmVNb0lkKCk7XG4gICAgICAgIG5ld01vLiRJc0NoZWNrZWQgPSBpc0NoZWNrZWQ7XG4gICAgICAgIG5ld01vLiROZXdJbmxpbmVNbyA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLl9pc0NvbXBvc2l0ZShjb250ZXh0KSkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRpb24gPSBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZSh0aGlzLmNvbnRleHQuU2V0dGluZywgJ0V4dHJhLlJlbGF0aW9uJyk7XG4gICAgICAgICAgICBuZXdNb1tyZWxhdGlvbi5QYXJlbnRGZE5hbWVdID0gcmVsYXRpb24uUGFyZW50TW9JZDtcbiAgICAgICAgfVxuICAgICAgICAvLyAgdGhpcy5fbmV3SW5saW5lRWRpdE1vU291cmNlLm5leHQobmV3TW8pO1xuICAgICAgICByZXR1cm4gbmV3TW87XG4gICAgfVxuICAgIHNldExheW91dEluZm8obGF5b3V0SW5mbyk6IHZvaWQge1xuICAgICAgICB0aGlzLl9sYXlvdXRJbmZvU291cmNlLm5leHQobGF5b3V0SW5mbyk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25EZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuX3Vuc2N1YnNjcmliZUNvbnRleHQoKTtcbiAgICB9XG5cbiAgICBwYWdlU2l6ZUNoYW5nZWQocGFnZUluZGV4KTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoJ1BhZ2VDaGFuZ2UnLCB0aGlzLmNvbnRleHQsIHBhZ2VJbmRleCk7XG4gICAgfVxuXG4gICAgcGFnZUNoYW5nZWQocGFnZUluZGV4KTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udGV4dC5jdXJyZW50UGFnZSA9IHBhZ2VJbmRleDtcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudCgnUGFnZUNoYW5nZScsIHRoaXMuY29udGV4dCwgcGFnZUluZGV4KTtcbiAgICB9XG5cbiAgICByZVNldE1vRGF0YUxpc3QobW9EYXRhTGlzdD86IE1ldGFvYmplY3REYXRhTW9kZWxbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBuZXdNb0RhdGFMaXN0ID0gbW9EYXRhTGlzdCA/PyB0aGlzLm1vRGF0YUxpc3RTb3VyY2UuZ2V0VmFsdWUoKTtcbiAgICAgICAgdGhpcy5fbW9EYXRhTGlzdENoYW5nZWQoWy4uLm5ld01vRGF0YUxpc3RdKTtcbiAgICB9XG4gICAgLy8gU2VhcmNoIFNldHRpbmcgTWFuYWdlclxuICAgIGNsZWFyU2VhcmNoKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzZWFyY2hQYW5lbFVpID0gdGhpcy5zZWFyY2hQYW5lbFVpO1xuICAgICAgICBjb25zdCBmaWVsZFVpID0gc2VhcmNoUGFuZWxVaS5fZGljdEZpZWxkVWkuJFNlYXJjaCA/PyBzZWFyY2hQYW5lbFVpLl9kaWN0RmllbGRVaS7YrNiz2KrYrNmIO1xuICAgICAgICBmaWVsZFVpLmZpcmVFdmVudCgnQ2xlYXJDbGljaycpO1xuICAgIH1cbiAgICBzZWFyY2goKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlYXJjaFBhbmVsVWkgPSB0aGlzLnNlYXJjaFBhbmVsVWk7XG4gICAgICAgIGNvbnN0IGZpZWxkVWkgPSBzZWFyY2hQYW5lbFVpLl9kaWN0RmllbGRVaS4kU2VhcmNoID8/IHNlYXJjaFBhbmVsVWkuX2RpY3RGaWVsZFVpLtis2LPYqtis2Yg7XG4gICAgICAgIGZpZWxkVWkuZmlyZUV2ZW50KCdTZWFyY2hDbGljaycpO1xuICAgIH1cblxuICAgIGdldFZhbHVlSW5saW5lRWRpdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lubGluZUVkaXRNb2RlU291cmNlLmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgZ2V0QWxsb3dJbmxpbmVFZGl0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWxsb3dJbmxpbmVFZGl0U291cmNlLmdldFZhbHVlKCk7XG4gICAgfVxuICAgIHNldElubGluZUVkaXQodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faW5saW5lRWRpdE1vZGVTb3VyY2UubmV4dCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgb3BlblNlYXJjaEZpZWxkc0hpZGRlblNldHRpbmdzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vcGVuU2VhcmNoUGFuZWxIaWRkZW5TZXR0aW5nc1NvdXJjZS5uZXh0KCk7XG4gICAgfVxuXG4gICAgb3BlblNlYXJjaEZpbGVzTWFuYWdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vcGVuU2VhcmNoRmlsZXNNYW5hZ2VTb3VyY2UubmV4dCgpO1xuICAgIH1cblxuICAgIHNlYXJjaFBhbmVsTW9DaGFuZ2VkKGNoYW5nZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9zZWFyY2hQYW5lbE1vQ2hhbmdlZFNvdXJjZS5uZXh0KGNoYW5nZSk7XG4gICAgfVxuXG4gICAgbG9hZFNlYXJjaFBhbmVsU2V0dGluZ3MoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuRm9ybVBhbmVsVWkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlcG9ydElkJFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpLFxuICAgICAgICAgICAgICAgIHRhcCgocmVwb3J0SWQpID0+IHRoaXMuX2xvYWRTZWFyY2hQYW5lbFNldHRpbmdzKHJlcG9ydElkKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBhZGRTZWFyY2hQYW5lbFNldHRpbmdzKHNlYXJjaFBhbmVsU2V0dGluZ3M6IFNlYXJjaFBhbmVsU2V0dGluZ3MpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYWxsU2VhcmNoUGFuZWxTZXR0aW5ncyA9IHRoaXMuX2FsbFNlYXJjaFBhbmVsU2V0dGluZ3NTb3VyY2UuZ2V0VmFsdWUoKTtcbiAgICAgICAgYWxsU2VhcmNoUGFuZWxTZXR0aW5ncy5wdXNoKHNlYXJjaFBhbmVsU2V0dGluZ3MpO1xuICAgICAgICB0aGlzLl9hbGxTZWFyY2hQYW5lbFNldHRpbmdzU291cmNlLm5leHQoYWxsU2VhcmNoUGFuZWxTZXR0aW5ncyk7XG4gICAgfVxuICAgIHNhdmVTZWFyY2hQYW5lbFNldHRpbmcoc2VsZWN0ZWRTZWFyY2hQYW5lbFNldHRpbmdzOiBTZWFyY2hQYW5lbFNldHRpbmdzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlYXJjaE1vID0gdGhpcy5nZXRTZWFyY2hQYW5lbE1vKCk7XG4gICAgICAgIGNvbnN0IGZpZWxkc1NldHRpbmcgPSB0aGlzLmdldFNlYXJjaFBhbmVsRmllbGRzU2V0dGluZygpO1xuICAgICAgICBpZiAoIXNlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5ncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5ncy5TZWFyY2hNbyA9IEpTT04uc3RyaW5naWZ5KHNlYXJjaE1vKTtcbiAgICAgICAgc2VsZWN0ZWRTZWFyY2hQYW5lbFNldHRpbmdzLkZpZWxkc1NldHRpbmcgPSBKU09OLnN0cmluZ2lmeShmaWVsZHNTZXR0aW5nKTtcbiAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2QoXG4gICAgICAgICAgICAnU2F2ZVNlYXJjaFBhbmVsU2V0dGluZ3MnLFxuICAgICAgICAgICAgbmV3IEJhcnNhQXBpLkNvbW1vbi5NZXRhT2JqZWN0V2ViKHtcbiAgICAgICAgICAgICAgICBJZDogc2VsZWN0ZWRTZWFyY2hQYW5lbFNldHRpbmdzLklkLFxuICAgICAgICAgICAgICAgICRDYXB0aW9uOiBzZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3MuVGl0bGUsXG4gICAgICAgICAgICAgICAgUmVwb3J0SWQ6IHNlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5ncy5SZXBvcnQ/LklkLFxuICAgICAgICAgICAgICAgIFRpdGxlOiBzZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3MuVGl0bGUsXG4gICAgICAgICAgICAgICAgSXNEZWZhdWx0OiBzZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3MuSXNEZWZhdWx0LFxuICAgICAgICAgICAgICAgIElzUHVibGljOiBzZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3MuSXNQdWJsaWMsXG4gICAgICAgICAgICAgICAgQXBwbHlBdXRvbWF0aWNhbGx5OiBzZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3MuQXBwbHlBdXRvbWF0aWNhbGx5LFxuICAgICAgICAgICAgICAgIEhpZGVTZWFyY2hQYW5lbDogc2VsZWN0ZWRTZWFyY2hQYW5lbFNldHRpbmdzLkhpZGVTZWFyY2hQYW5lbCxcbiAgICAgICAgICAgICAgICBTZWFyY2hNbzogc2VsZWN0ZWRTZWFyY2hQYW5lbFNldHRpbmdzLlNlYXJjaE1vLFxuICAgICAgICAgICAgICAgIEZpZWxkc1NldHRpbmc6IHNlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5ncy5GaWVsZHNTZXR0aW5nXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZWFyY2hQYW5lbE1vQ2hhbmdlZChmYWxzZSk7XG4gICAgfVxuXG4gICAgYXBwbHlTZWFyY2hQYW5lbFNldHRpbmdzKHNlYXJjaFBhbmVsU2V0dGluZ3M6IFNlYXJjaFBhbmVsU2V0dGluZ3MgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoUGFuZWxVaSA9IHRoaXMuc2VhcmNoUGFuZWxVaTtcbiAgICAgICAgaWYgKCFzZWFyY2hQYW5lbFNldHRpbmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2ZpcnN0QXBwbHlBdXRvbWF0aWNhbGx5ICYmIHNlYXJjaFBhbmVsU2V0dGluZ3MuSXNQcmltYXJ5KSB7XG4gICAgICAgICAgICB0aGlzLl9maXJzdEFwcGx5QXV0b21hdGljYWxseSA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2ZpcnN0QXBwbHlBdXRvbWF0aWNhbGx5ID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5yZXNldFNlYXJjaFBhbmVsU2V0dGluZ3Moc2VhcmNoUGFuZWxVaSk7XG4gICAgICAgIGlmIChzZWFyY2hQYW5lbFNldHRpbmdzLlNlYXJjaE1vKSB7XG4gICAgICAgICAgICBjb25zdCBzZWFyY2hNbyA9IEpTT04ucGFyc2Uoc2VhcmNoUGFuZWxTZXR0aW5ncy5TZWFyY2hNbyk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhzZWFyY2hNbykuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gc2VhcmNoUGFuZWxVaS5fZGljdEZpZWxkVWlbY107XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkICYmIGMuaW5kZXhPZignJCcpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC5TZXRWYWx1ZShzZWFyY2hNb1tjXSk7XG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaFBhbmVsVWkuTW8uU2V0RlZhbHVlKGMsIHNlYXJjaE1vW2NdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChzZWFyY2hQYW5lbFNldHRpbmdzLklzUHJpbWFyeSAmJiAhc2VhcmNoUGFuZWxVaS5TZXR0aW5nLkltbWVkaWF0ZUV4ZWN1dGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFBhbmVsTW9DaGFuZ2VkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VhcmNoUGFuZWxTZXR0aW5ncy5BcHBseUF1dG9tYXRpY2FsbHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE8gc2V0IGhpZGRlbiBmaWVsZHNcbiAgICAgICAgaWYgKHNlYXJjaFBhbmVsU2V0dGluZ3MuRmllbGRzU2V0dGluZykge1xuICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKHNlYXJjaFBhbmVsU2V0dGluZ3MuRmllbGRzU2V0dGluZyk7XG4gICAgICAgICAgICB0aGlzLnNldEFuZEFwcGx5U2VhcmNoUGFuZWxTZXR0aW5nRmllbGRzU2V0dGluZyhcbiAgICAgICAgICAgICAgICB0eXBlb2Ygc2V0dGluZ3MgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShzZXR0aW5ncykgOiBzZXR0aW5nc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlYXJjaFBhbmVsTW9DaGFuZ2VkKGZhbHNlKTtcbiAgICB9XG4gICAgZ2V0U2VhcmNoUGFuZWxNbygpOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoUGFuZWxVaS5NbztcbiAgICB9XG4gICAgZ2V0U2VhcmNoUGFuZWxGaWVsZHNTZXR0aW5nKCk6IEFycmF5PFBhcnRpYWw8R2VuZXJhbENvbnRyb2xJbmZvTW9kZWw+PiB7XG4gICAgICAgIGNvbnN0IHNlYXJjaFBhbmVsVWkgPSB0aGlzLnNlYXJjaFBhbmVsVWk7XG4gICAgICAgIGNvbnN0IGZpZWxkczogQXJyYXk8R2VuZXJhbENvbnRyb2xJbmZvTW9kZWw+ID0gc2VhcmNoUGFuZWxVaS5TZXR0aW5nLlZpZXcuQ29udHJvbEluZm8uZmlsdGVyKFxuICAgICAgICAgICAgKGMpID0+IGMuQ29udHJvbE5hbWUgIT09ICckU2VhcmNoJyAmJiBjLkNvbnRyb2xOYW1lICE9PSAn2KzYs9iq2KzZiCdcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZmllbGRzU2V0dGluZyA9IGZpZWxkcy5tYXAoKGMpID0+ICh7XG4gICAgICAgICAgICBOYW1lOiBjLkNvbnRyb2xOYW1lLFxuICAgICAgICAgICAgQ2FwdGlvbjogYy5Db250cm9sRmllbGRDYXB0aW9uVHJhbnNsYXRlZCxcbiAgICAgICAgICAgIEhpZGRlbjogc2VhcmNoUGFuZWxVaS5fZGljdEZpZWxkVWlbYy5Db250cm9sTmFtZV0uU2V0dGluZy5Jc1Zpc2libGUgPT09IGZhbHNlID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICAgICAgSXNNYW5kYXRvcnk6IGMuSXNNYW5kYXRvcnlcbiAgICAgICAgfSkpO1xuICAgICAgICByZXR1cm4gZmllbGRzU2V0dGluZztcbiAgICB9XG4gICAgc2V0QW5kQXBwbHlTZWFyY2hQYW5lbFNldHRpbmdGaWVsZHNTZXR0aW5nKGZpZWxkc1NldHRpbmc6IENvbHVtbkluZm9UeXBlW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoUGFuZWxVaSA9IHRoaXMuc2VhcmNoUGFuZWxVaTtcbiAgICAgICAgZmllbGRzU2V0dGluZy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IHNlYXJjaFBhbmVsVWkuX2RpY3RGaWVsZFVpW2MuTmFtZV07XG4gICAgICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgICAgICBzZWFyY2hQYW5lbFVpLmZpcmVFdmVudCgnQ2hhbmdlRmllbGRWaXNpYmxlJywgZmllbGQuU2V0dGluZy5Db250cm9sRmllbGRDYXB0aW9uLCAhYy5IaWRkZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdXBkYXRlU2VhcmNoUGFuZWxTZXR0aW5ncyhhbGxTZWFyY2hQYW5lbFNldHRpbmdzOiBTZWFyY2hQYW5lbFNldHRpbmdzW10pOiB2b2lkIHtcbiAgICAgICAgYWxsU2VhcmNoUGFuZWxTZXR0aW5ncyA9IGFsbFNlYXJjaFBhbmVsU2V0dGluZ3MuZmlsdGVyKChjKSA9PiAhYy5Jc1ByaW1hcnkgJiYgIWMuSXNEZWxldGVkKTtcbiAgICAgICAgdGhpcy5fYWxsU2VhcmNoUGFuZWxTZXR0aW5nc1NvdXJjZS5uZXh0KGFsbFNlYXJjaFBhbmVsU2V0dGluZ3MpO1xuICAgIH1cblxuICAgIHJlbW92ZVNlYXJjaFBhbmVsU2V0dGluZ3Moc2VhcmNoUGFuZWxTZXR0aW5nc0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYWxsU2VhcmNoUGFuZWxTZXR0aW5ncyA9IHRoaXMuX2FsbFNlYXJjaFBhbmVsU2V0dGluZ3NTb3VyY2UuZ2V0VmFsdWUoKTtcbiAgICAgICAgYWxsU2VhcmNoUGFuZWxTZXR0aW5ncy5maWx0ZXIoKGMpID0+IGMuSWQgIT09IHNlYXJjaFBhbmVsU2V0dGluZ3NJZCk7XG4gICAgICAgIHRoaXMuX2FsbFNlYXJjaFBhbmVsU2V0dGluZ3NTb3VyY2UubmV4dChhbGxTZWFyY2hQYW5lbFNldHRpbmdzKTtcbiAgICB9XG5cbiAgICBjaGFuZ2VTZWxlY3RlZFNlYXJjaFBhbmVsKHNlbGVjdGVkU2VhcmNoUGFuZWxTZXR0aW5nc0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRTZWFyY2hQYW5lbFNldHRpbmdzSWRTb3VyY2UubmV4dChzZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3NJZCk7XG4gICAgfVxuXG4gICAgbG9hZE1ldGFDb25kaXRpb25zQ29udHJvbEluZm9zKHR5cGVEZWZJZDogc3RyaW5nLCBmaWVsZERiTmFtZXM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxHZW5lcmFsQ29udHJvbEluZm9Nb2RlbFtdPiB7XG4gICAgICAgIGNvbnN0IG1vID0gR2V0RGVmYXVsdE1vT2JqZWN0SW5mbyh0eXBlRGVmSWQpO1xuICAgICAgICByZXR1cm4gb2YodGhpcy5fY29udHJvbEluZm9zTWV0YW9iamVjdCkucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoY29udHJvbHNJbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xzSW5mby5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihjb250cm9sc0luZm8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29udHJvbExpc3QobW8sIGZpZWxkRGJOYW1lcywgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0YXAoKGNvbnRyb2xzSW5mbzogR2VuZXJhbENvbnRyb2xJbmZvTW9kZWxbXSkgPT4gKHRoaXMuX2NvbnRyb2xJbmZvc01ldGFvYmplY3QgPSBjb250cm9sc0luZm8pKVxuICAgICAgICApO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgX2luaXRDcmVhdGVOZXdJbmxpbmVNbyhjb250ZXh0KTogdm9pZCB7XG4gICAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZvcm1TZXR0aW5nID0gY29udGV4dC5TZXR0aW5nLkZvcm1UZW1wbGF0ZTtcbiAgICAgICAgaWYgKGZvcm1TZXR0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZU5ld0lubGluZU1vKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBfaXNDb21wb3NpdGUoY29udGV4dCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCByZWxhdGlvblR5cGUgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShjb250ZXh0LlNldHRpbmcsICdFeHRyYS5SZWxhdGlvbi5SZWxhdGlvblR5cGUnKTtcbiAgICAgICAgcmV0dXJuIHJlbGF0aW9uVHlwZSA9PT0gQmFyc2FBcGkuQ29tbW9uLkVudW1zLlJlbGF0aW9uVHlwZS5Db21wb3NpdGlvbjtcbiAgICB9XG4gICAgcHJvdGVjdGVkIF9hZGRFdmVudExpc3RlbmVyKGNvbnRleHQ6IGFueSk6IHZvaWQge1xuICAgICAgICBjb250ZXh0Lm9uKHtcbiAgICAgICAgICAgIE1hc2tDaGFuZ2VkOiB0aGlzLl9tYXNrQ2hhbmdlZC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgVmlld2VyTWFza0NoYW5nZWQ6IHRoaXMuX3ZpZXdlck1hc2tDaGFuZ2VkLmJpbmQodGhpcyksXG4gICAgICAgICAgICBWaWV3ZXJDb250cm9sQ2hhbmdlZDogdGhpcy5fdmlld2VyQ29udHJvbENoYW5nZWQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIFZpc2libGVDaGFuZ2VkOiB0aGlzLl92aXNpYmxlQ2hhbmdlZC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgUmVhZG9ubHlDaGFuZ2VkOiB0aGlzLl9yZWFkb25seUNoYW5nZWQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIE1lbnVJdGVtc0NoYW5nZWQ6IHRoaXMuX21lbnVJdGVtc0NoYW5nZWQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIFRpdGxlQ2hhbmdlZDogdGhpcy5fdGl0bGVDaGFuZ2VkLmJpbmQodGhpcyksXG4gICAgICAgICAgICBGb3JtUGFuZWxDb250cm9sU2hvd1dpbmRvdzogdGhpcy5fZm9ybVBhbmVsQ29udHJvbFNob3dXaW5kb3dDaGFuZ2VkLmJpbmQodGhpcyksXG4gICAgICAgICAgICBTZWFyY2hQYW5lbENoYW5nZWQ6IHRoaXMuX3NlYXJjaFBhbmVsQ2hhbmdlZC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgUGFnaW5nU2V0dGluZ0NoYW5nZWQ6IHRoaXMuX3BhZ2luZ1NldHRpbmdDaGFuZ2VkLmJpbmQodGhpcyksXG4gICAgICAgICAgICBUb29sYmFyQnV0dG9uc0NoYW5nZWQ6IHRoaXMuX3Rvb2xiYXJCdXR0b25zQ2hhbmdlZC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgRW5hYmxlQ2hhbmdlZDogdGhpcy5fZW5hYmxlQ2hhbmdlZC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgRGVzdHJveTogdGhpcy5fZGVzdHJveUNoYW5nZWQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIEV4aXRJbmxpbmVFZGl0OiB0aGlzLl9leGlzdElubGluZUVkaXQuYmluZCh0aGlzKVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2luaXRpYWxpemUoY29udGV4dDogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2luaXRDYXJ0YWJsZXNGb3JtVGVtcGxhdGUoY29udGV4dCk7XG4gICAgICAgIHRoaXMuX2luaXRDb25kaXRpb25hbEZvcm1hdHMoY29udGV4dCk7XG4gICAgICAgIHRoaXMuX2luaXRBbGxvd0lubGluZUVkaXQoY29udGV4dCk7XG4gICAgICAgIHRoaXMuX2luaXRPbmx5SW5saW5lRWRpdChjb250ZXh0KTtcbiAgICAgICAgdGhpcy5faW5pdElubGluZUVkaXRNb2RlKGNvbnRleHQpO1xuICAgICAgICB0aGlzLl9pbml0UmVwb3J0KGNvbnRleHQpO1xuICAgICAgICB0aGlzLl9pbml0Vmlld2VyQ29udHJvbChjb250ZXh0KTtcbiAgICAgICAgdGhpcy5faW5pdEhpZGVUb29sYmFyKGNvbnRleHQpO1xuICAgICAgICB0aGlzLl9pbml0VG9vbGJhckJ1dHRvbnMoY29udGV4dCk7XG4gICAgICAgIHRoaXMuX2luaXRWaXNpYmxlKGNvbnRleHQpO1xuICAgICAgICB0aGlzLl9pbml0RW5hYmxlKGNvbnRleHQpO1xuICAgICAgICB0aGlzLl9pbml0VGl0bGUoY29udGV4dCk7XG4gICAgICAgIHRoaXMuX2luaXRSZWFkb25seShjb250ZXh0KTtcbiAgICAgICAgdGhpcy5faW5pdE1vRGF0YUxpc3QoY29udGV4dCk7XG4gICAgICAgIHRoaXMuX2luaXRQYWdpbmdTZXR0aW5nKGNvbnRleHQpO1xuICAgICAgICB0aGlzLl9pbml0TWVudUl0ZW1zKGNvbnRleHQpO1xuICAgICAgICB0aGlzLl9pbml0U2VhcmNocGFuZWwoY29udGV4dCk7XG4gICAgICAgIHRoaXMuX2luaXRDcmVhdGVOZXdJbmxpbmVNbyhjb250ZXh0KTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIF9pbml0Q2FydGFibGVzRm9ybVRlbXBsYXRlKGNvbnRleHQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2FydGFibGVUZW1wbGF0ZXMgPSBjb250ZXh0LlNldHRpbmcuQ2FydGFibGVUZW1wbGF0ZXM7XG4gICAgICAgIGlmIChjYXJ0YWJsZVRlbXBsYXRlcykge1xuICAgICAgICAgICAgY29uc3QgaWRzID0gT2JqZWN0LmtleXMoY2FydGFibGVUZW1wbGF0ZXMpO1xuICAgICAgICAgICAgaWRzLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYXJ0YWJsZVRlbXBsYXRlc1tpZF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhcnRhYmxlVGVtcGxhdGVzW2lkXSA9IEJhcnNhQXBpLkV4dC5kZWNvZGUoY2FydGFibGVUZW1wbGF0ZXNbaWRdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX2NhcnRhYmxlVGVtcGxhdGVzJC5uZXh0KGNhcnRhYmxlVGVtcGxhdGVzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYXJ0YWJsZUNoaWxkc01vKGNvbnRleHQpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgX2luaXRTZWFyY2hwYW5lbChjb250ZXh0KTogdm9pZCB7XG4gICAgICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQuX3NlYXJjaFBhbmVsQ29udHJvbCkge1xuICAgICAgICAgICAgdGhpcy5fc2VhcmNoUGFuZWxDaGFuZ2VkKGNvbnRleHQuX3NlYXJjaFBhbmVsQ29udHJvbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2luaXRDb25kaXRpb25hbEZvcm1hdHMoY29udGV4dCk6IHZvaWQge1xuICAgICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0LlNldHRpbmcuVmlldz8uQ29uZGl0aW9uYWxGb3JtYXRzKSB7XG4gICAgICAgICAgICB0aGlzLl9jb25kaXRpb25hbEZvcm1hdHNDaGFuZ2VkKGNvbnRleHQuU2V0dGluZy5WaWV3Py5Db25kaXRpb25hbEZvcm1hdHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9pbml0TWVudUl0ZW1zKGNvbnRleHQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5tZW51SXRlbXMpIHtcbiAgICAgICAgICAgIC8vIGNvbnN0IG5ld0l0ZW1zID0gY29udGV4dC5tZW51SXRlbXM7XG4gICAgICAgICAgICBjb25zdCBuZXdJdGVtcyA9IGNvbnRleHQubWVudUl0ZW1zLmZpbHRlcigoYykgPT4gYy5pdGVtSWQgIT09ICdEZWxldGUnKTtcbiAgICAgICAgICAgIHRoaXMuX21lbnVJdGVtc0NoYW5nZWQobmV3SXRlbXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9pbml0UmVwb3J0KGNvbnRleHQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVwb3J0ID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoY29udGV4dCwgJ1NldHRpbmcuRXh0cmEuUmVwb3J0JywgW10pO1xuICAgICAgICB0aGlzLl9yZXBvcnRTb3VyY2UubmV4dChyZXBvcnQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfaW5pdE1vRGF0YUxpc3QoY29udGV4dCk6IHZvaWQge1xuICAgICAgICBjb25zdCBtb0RhdGFMaXN0ID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoY29udGV4dCwgJ1NldHRpbmcuRGF0YS5Nb0RhdGFMaXN0JywgW10pO1xuICAgICAgICB0aGlzLl9tb0RhdGFMaXN0Q2hhbmdlZChtb0RhdGFMaXN0KTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIF9jYXJ0YWJsZUNoaWxkc01vKGNvbnRleHQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNvbnRleHQuU2V0dGluZy5DYXJ0YWJsZUNoaWxkc01vKSB7XG4gICAgICAgICAgICB0aGlzLl9jYXJ0YWJsZUNoaWxkc01vJC5uZXh0KGNvbnRleHQuU2V0dGluZy5DYXJ0YWJsZUNoaWxkc01vKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBfaW5pdFBhZ2luZ1NldHRpbmcoY29udGV4dCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYWdpbmdTZXR0aW5nID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoY29udGV4dCwgJ1NldHRpbmcuRGF0YS5QYWdpbmcnLCBudWxsKTtcbiAgICAgICAgdGhpcy5fcGFnaW5nU2V0dGluZ0NoYW5nZWQocGFnaW5nU2V0dGluZyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9pbml0VGl0bGUoY29udGV4dCk6IHZvaWQge1xuICAgICAgICBsZXQgdGl0bGUgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShjb250ZXh0LCAndGl0bGUnLCBudWxsKTtcbiAgICAgICAgaWYgKHRpdGxlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aXRsZSA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGNvbnRleHQsICdTZXR0aW5nLkV4dHJhLlJlcG9ydC5DYXB0aW9uJywgJycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RpdGxlQ2hhbmdlZCh7IHRleHQ6IHRpdGxlLCBpbWFnZTogJycgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9pbml0UmVhZG9ubHkoY29udGV4dCk6IHZvaWQge1xuICAgICAgICBjb25zdCByZWFkb25seSA9IGNvbnRleHQucmVhZG9ubHkgPT09IHRydWUgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIHRoaXMuX3JlYWRvbmx5Q2hhbmdlZChyZWFkb25seSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9pbml0RW5hYmxlKGNvbnRleHQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZW5hYmxlID0gY29udGV4dC5lbmFibGUgPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlO1xuICAgICAgICB0aGlzLl9lbmFibGVDaGFuZ2VkKGVuYWJsZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9pbml0VmlzaWJsZShjb250ZXh0KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZpc2libGUgPSBjb250ZXh0LnZpc2libGUgPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlO1xuICAgICAgICB0aGlzLl92aXNpYmxlQ2hhbmdlZCh2aXNpYmxlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2luaXRUb29sYmFyQnV0dG9ucyhjb250ZXh0KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGJ1dHRvbnMgPSBjb250ZXh0LnRsYkJ1dHRvbnM7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJ1dHRvbnMpKSB7XG4gICAgICAgICAgICB0aGlzLl90b29sYmFyQnV0dG9uc0NoYW5nZWQoYnV0dG9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2luaXRJbmxpbmVFZGl0TW9kZShjb250ZXh0KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlubGluZUVkaXRNb2RlOiBib29sZWFuID0gY29udGV4dC5TZXR0aW5nPy5WaWV3Py5BdXRvSW5saW5lRWRpdDtcbiAgICAgICAgdGhpcy5faW5saW5lRWRpdE1vZGVTb3VyY2UubmV4dChpbmxpbmVFZGl0TW9kZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9pbml0QWxsb3dJbmxpbmVFZGl0KGNvbnRleHQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYWxsb3dJbmxpbmVFZGl0OiBib29sZWFuID0gY29udGV4dC5TZXR0aW5nPy5WaWV3Py5BbGxvd0lubGluZUVkaXQ7XG4gICAgICAgIGNvbnN0IGFsbG93RWRpdCA9IGNvbnRleHQuU2V0dGluZy5FeHRyYT8uRGVmYXVsdENvbW1hbmRzQWNjZXNzPy5FZGl0O1xuICAgICAgICB0aGlzLl9hbGxvd0lubGluZUVkaXRTb3VyY2UubmV4dChhbGxvd0lubGluZUVkaXQgJiYgYWxsb3dFZGl0KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2luaXRPbmx5SW5saW5lRWRpdChjb250ZXh0KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9ubHlJbmxpbmVFZGl0OiBib29sZWFuID0gY29udGV4dC5TZXR0aW5nPy5WaWV3Py5Pbmx5SW5saW5lRWRpdDtcbiAgICAgICAgdGhpcy5fb25seUlubGluZUVkaXRTb3VyY2UubmV4dChvbmx5SW5saW5lRWRpdCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9pbml0Vmlld2VyQ29udHJvbChjb250ZXh0KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZpZXdlckNvbnRyb2wgPSBjb250ZXh0LnZpZXdlckNvbnRyb2w7XG4gICAgICAgIGlmICh2aWV3ZXJDb250cm9sKSB7XG4gICAgICAgICAgICB0aGlzLl92aWV3ZXJDb250cm9sQ2hhbmdlZCh2aWV3ZXJDb250cm9sKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBfaW5pdEhpZGVUb29sYmFyKGNvbnRleHQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaGlkZVRvb2xiYXIgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShjb250ZXh0LCAnU2V0dGluZy5FeHRyYS5SZXBvcnQuSGlkZVRvb2xiYXInLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuX2hpZGVUb29sYmFyU291cmNlLm5leHQoaGlkZVRvb2xiYXIpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfdW5zY3Vic2NyaWJlQ29udGV4dCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LnVuKCdNYXNrQ2hhbmdlZCcsIHRoaXMuX21hc2tDaGFuZ2VkKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnVuKCdWaWV3ZXJDb250cm9sQ2hhbmdlZCcsIHRoaXMuX3ZpZXdlckNvbnRyb2xDaGFuZ2VkKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnVuKCdWaWV3ZXJNYXNrQ2hhbmdlZCcsIHRoaXMuX3ZpZXdlck1hc2tDaGFuZ2VkKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnVuKCdWaXNpYmxlQ2hhbmdlZCcsIHRoaXMuX3Zpc2libGVDaGFuZ2VkKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnVuKCdSZWFkb25seUNoYW5nZWQnLCB0aGlzLl9yZWFkb25seUNoYW5nZWQpO1xuICAgICAgICB0aGlzLmNvbnRleHQudW4oJ01lbnVJdGVtc0NoYW5nZWQnLCB0aGlzLl9tZW51SXRlbXNDaGFuZ2VkKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnVuKCdUaXRsZUNoYW5nZWQnLCB0aGlzLl90aXRsZUNoYW5nZWQpO1xuICAgICAgICB0aGlzLmNvbnRleHQudW4oJ0Zvcm1QYW5lbENvbnRyb2xTaG93V2luZG93JywgdGhpcy5fZm9ybVBhbmVsQ29udHJvbFNob3dXaW5kb3dDaGFuZ2VkKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnVuKCdQYWdpbmdTZXR0aW5nQ2hhbmdlZCcsIHRoaXMuX3BhZ2luZ1NldHRpbmdDaGFuZ2VkKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnVuKCdUb29sYmFyQnV0dG9uc0NoYW5nZWQnLCB0aGlzLl90b29sYmFyQnV0dG9uc0NoYW5nZWQpO1xuICAgICAgICB0aGlzLmNvbnRleHQudW4oJ0VuYWJsZUNoYW5nZWQnLCB0aGlzLl9lbmFibGVDaGFuZ2VkKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnVuKCdEZXN0cm95JywgdGhpcy5fZGVzdHJveUNoYW5nZWQpO1xuICAgICAgICB0aGlzLmNvbnRleHQudW4oJ0V4aXRJbmxpbmVFZGl0JywgdGhpcy5fZXhpc3RJbmxpbmVFZGl0KTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIF9jb25kaXRpb25hbEZvcm1hdHNDaGFuZ2VkKGNvbmRpdGlvbmFsRm9ybWF0czogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NvbmRpdGlvbmFsRm9ybWF0c1NvdXJjZS5uZXh0KGNvbmRpdGlvbmFsRm9ybWF0cyk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBfbW9EYXRhTGlzdENoYW5nZWQobW9EYXRhTGlzdCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vRGF0YUxpc3RTb3VyY2UubmV4dChtb0RhdGFMaXN0KTtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5fY2FydGFibGVDaGlsZHNNbyh0aGlzLmNvbnRleHQpO1xuICAgICAgICAgICAgdGhpcy5faW5pdENhcnRhYmxlc0Zvcm1UZW1wbGF0ZSh0aGlzLmNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF92aWV3ZXJDb250cm9sQ2hhbmdlZCh2aWV3ZXJDb250cm9sKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3ZpZXdlckNvbnRyb2xTb3VyY2UubmV4dCh2aWV3ZXJDb250cm9sKTtcbiAgICAgICAgdGhpcy5faW5pdENvbmRpdGlvbmFsRm9ybWF0cyh0aGlzLmNvbnRleHQpO1xuICAgICAgICB0aGlzLl9pbml0SW5saW5lRWRpdE1vZGUodGhpcy5jb250ZXh0KTtcbiAgICAgICAgdGhpcy5faW5pdEFsbG93SW5saW5lRWRpdCh0aGlzLmNvbnRleHQpO1xuICAgICAgICB0aGlzLl9pbml0T25seUlubGluZUVkaXQodGhpcy5jb250ZXh0KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX21hc2tDaGFuZ2VkKG1hc2s6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbWFza1NvdXJjZS5uZXh0KG1hc2spO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfdmlld2VyTWFza0NoYW5nZWQodmlld2VyTWFzazogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl92aWV3ZXJNYXNrU291cmNlLm5leHQodmlld2VyTWFzayk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9yZWFkb25seUNoYW5nZWQocmVhZG9ubHk6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcmVhZG9ubHlTb3VyY2UubmV4dChyZWFkb25seSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF92aXNpYmxlQ2hhbmdlZCh2aWV3ZXJNYXNrOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Zpc2libGVTb3VyY2UubmV4dCh2aWV3ZXJNYXNrKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX21lbnVJdGVtc0NoYW5nZWQobWVudUl0ZW1zOiBhbnlbXSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9tZW51SXRlbXNTb3VyY2UubmV4dChtZW51SXRlbXMpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfdGl0bGVDaGFuZ2VkKHRpdGxlT2JqOiB7IHRleHQ6IHN0cmluZzsgaW1hZ2U6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3RpdGxlU291cmNlLm5leHQodGl0bGVPYmopO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZm9ybVBhbmVsQ29udHJvbFNob3dXaW5kb3dDaGFuZ2VkKGZvcm1wYW5lbE9iajogeyBmb3JtcGFuZWxDb250cm9sOiBhbnk7IGhhc1BhcmVudE1vOiBhbnkgfSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9mb3JtUGFuZWxDb250cm9sU2hvd1dpbmRvd1NvdXJjZS5uZXh0KGZvcm1wYW5lbE9iaik7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9zZWFyY2hQYW5lbENoYW5nZWQoc2VhcmNoUGFuZWw6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zZWFyY2hQYW5lbFVpU291cmNlLm5leHQoc2VhcmNoUGFuZWwpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfcGFnaW5nU2V0dGluZ0NoYW5nZWQocGFnZWluZ1NldHRpbmc6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9wYWdpbmdTZXR0aW5nU291cmNlLm5leHQocGFnZWluZ1NldHRpbmcpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfdG9vbGJhckJ1dHRvbnNDaGFuZ2VkKGJ1dHRvbnM6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Rvb2xiYXJCdXR0b25zU291cmNlLm5leHQoYnV0dG9ucyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9lbmFibGVDaGFuZ2VkKGVuYWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9lbmFibGVTb3VyY2UubmV4dChlbmFibGUpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZGVzdHJveUNoYW5nZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2Rlc3Ryb3lTb3VyY2UubmV4dCgpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgX2V4aXN0SW5saW5lRWRpdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faW5saW5lRWRpdE1vZGVTb3VyY2UubmV4dChmYWxzZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9hZGREZWZhdWx0U2VhcmNoUGFuZWxTZXR0aW5ncyhzZWFyY2hQYW5lbDogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlYXJjaE1vID0gSlNPTi5zdHJpbmdpZnkoc2VhcmNoUGFuZWw/Lk1vID8/IG5ldyBNZXRhb2JqZWN0RGF0YU1vZGVsKCkpO1xuICAgICAgICBjb25zdCBTdGFuZGFyZFRleHQgPSB0aGlzLl9iYmJQaXBlLnRyYW5zZm9ybSgnU3RhbmRhcmQnKTtcbiAgICAgICAgY29uc3Qgc3RhbmRhcmRTZXR0aW5ncyA9IHtcbiAgICAgICAgICAgIElkOiAnJyxcbiAgICAgICAgICAgICRDYXB0aW9uOiBTdGFuZGFyZFRleHQsXG4gICAgICAgICAgICBJc1N0YW5kYXJkOiB0cnVlLFxuICAgICAgICAgICAgSXNEZWZhdWx0OiB0cnVlLFxuICAgICAgICAgICAgSXNQdWJsaWM6IHRydWUsXG4gICAgICAgICAgICBJc1ByaW1hcnk6IHRydWUsXG4gICAgICAgICAgICBBcHBseUF1dG9tYXRpY2FsbHk6IHRydWUsXG4gICAgICAgICAgICBIaWRlU2VhcmNoUGFuZWw6IGZhbHNlLFxuICAgICAgICAgICAgVGl0bGU6IFN0YW5kYXJkVGV4dCxcbiAgICAgICAgICAgIFNlYXJjaE1vOiBzZWFyY2hNbyxcbiAgICAgICAgICAgIFJlcG9ydElkOiAnJ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kZWZhdWx0U2VhcmNoUGFuZWxTZXR0aW5nc1NvdXJjZS5uZXh0KHN0YW5kYXJkU2V0dGluZ3MpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfbG9hZFNlYXJjaFBhbmVsU2V0dGluZ3MocmVwb3J0SWQpOiB2b2lkIHtcbiAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XG4gICAgICAgICAgICBQYXJhbWV0ZXJzOiBbcmVwb3J0SWRdLFxuICAgICAgICAgICAgTWV0aG9kOiAnTG9hZEFsbFVzZXJTZWFyY2hQYW5lbFNldHRpbmdzJyxcbiAgICAgICAgICAgIFN1Y2Nlc3NGbjogKGFsbFNlYXJjaFBhbmVsU2V0dGluZ3MpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhbGxTZWFyY2hQYW5lbFNldHRpbmdzKSkge1xuICAgICAgICAgICAgICAgICAgICBhbGxTZWFyY2hQYW5lbFNldHRpbmdzID0gQmFyc2FBcGkuQncuX3Vud3JhcChhbGxTZWFyY2hQYW5lbFNldHRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWxsU2VhcmNoUGFuZWxTZXR0aW5nc1NvdXJjZS5uZXh0KGFsbFNlYXJjaFBhbmVsU2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0U2VhcmNoID0gYWxsU2VhcmNoUGFuZWxTZXR0aW5ncy5maW5kKChjKSA9PiBjLklzRGVmYXVsdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0U2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFNlYXJjaFBhbmVsU2V0dGluZ3NJZFNvdXJjZS5uZXh0KGRlZmF1bHRTZWFyY2guSWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIEZhaWxGbjogKCkgPT4ge31cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHByb3RlY3RlZCByZXNldFNlYXJjaFBhbmVsU2V0dGluZ3Moc2VhcmNoUGFuZWxVaSk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XG4gICAgICAgIGNvbnN0IGZpZWxkVWkgPSBzZWFyY2hQYW5lbFVpLl9kaWN0RmllbGRVaTtcbiAgICAgICAgY29uc3QgY2hhbmdlZCA9IHNlYXJjaFBhbmVsVWkuTW8uR2V0Q2hhbmdlZE9iamVjdCgpO1xuICAgICAgICBPYmplY3Qua2V5cyhjaGFuZ2VkKS5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IHNlYXJjaFBhbmVsVWkuX2RpY3RGaWVsZFVpW2NdO1xuICAgICAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgICAgICAgZmllbGQuU2V0VmFsdWUobnVsbCk7XG4gICAgICAgICAgICAgICAgc2VhcmNoUGFuZWxVaS5Nby5TZXRGVmFsdWUoYywgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWFyY2hQYW5lbFVpLk1vLlNldFN0YXRlKCdOZXcnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5rZXlzKGZpZWxkVWkpLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgICAgIGlmIChjICE9PSAnJFNlYXJjaCcgJiYgZmllbGRVaVtjXS5MYXlvdXRDb250cm9sKSB7XG4gICAgICAgICAgICAgICAgc2VhcmNoUGFuZWxVaS5maXJlRXZlbnQoJ0NoYW5nZUZpZWxkVmlzaWJsZScsIGZpZWxkVWlbY10uU2V0dGluZy5Db250cm9sRmllbGRDYXB0aW9uLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
|