barsa-novin-ray-core 2.1.1 → 2.1.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.
Files changed (210) hide show
  1. package/fesm2022/barsa-novin-ray-core.mjs +254 -135
  2. package/fesm2022/barsa-novin-ray-core.mjs.map +1 -1
  3. package/package.json +3 -5
  4. package/esm2022/barsa-novin-ray-core.mjs +0 -5
  5. package/esm2022/lib/abstract-classes/application-base.mjs +0 -24
  6. package/esm2022/lib/abstract-classes/barsa-api.mjs +0 -43
  7. package/esm2022/lib/abstract-classes/base-column-props.mjs +0 -84
  8. package/esm2022/lib/abstract-classes/base.component.mjs +0 -59
  9. package/esm2022/lib/abstract-classes/field-base.mjs +0 -232
  10. package/esm2022/lib/abstract-classes/files-validation-helper.mjs +0 -75
  11. package/esm2022/lib/abstract-classes/form-base.mjs +0 -163
  12. package/esm2022/lib/abstract-classes/form-field-report-page.component.mjs +0 -54
  13. package/esm2022/lib/abstract-classes/form-page-base.mjs +0 -129
  14. package/esm2022/lib/abstract-classes/form-page.component.mjs +0 -53
  15. package/esm2022/lib/abstract-classes/form-props.base.mjs +0 -97
  16. package/esm2022/lib/abstract-classes/form-toolbar-base.mjs +0 -56
  17. package/esm2022/lib/abstract-classes/index.mjs +0 -25
  18. package/esm2022/lib/abstract-classes/layout-item-base.mjs +0 -48
  19. package/esm2022/lib/abstract-classes/layout-panel-base.mjs +0 -63
  20. package/esm2022/lib/abstract-classes/linear-list-helper.mjs +0 -135
  21. package/esm2022/lib/abstract-classes/models.mjs +0 -184
  22. package/esm2022/lib/abstract-classes/module-with-dynamic-components.mjs +0 -2
  23. package/esm2022/lib/abstract-classes/number-base.mjs +0 -200
  24. package/esm2022/lib/abstract-classes/page-base.mjs +0 -97
  25. package/esm2022/lib/abstract-classes/page-with-form-handler-base.mjs +0 -40
  26. package/esm2022/lib/abstract-classes/report-base.mjs +0 -254
  27. package/esm2022/lib/abstract-classes/report-item-base.mjs +0 -53
  28. package/esm2022/lib/abstract-classes/report-view-base.component.mjs +0 -428
  29. package/esm2022/lib/abstract-classes/system-base.mjs +0 -24
  30. package/esm2022/lib/abstract-classes/tile-props.mjs +0 -46
  31. package/esm2022/lib/auth-guard.mjs +0 -48
  32. package/esm2022/lib/barsa-novin-ray-core-routing.module.mjs +0 -292
  33. package/esm2022/lib/barsa-novin-ray-core.module.mjs +0 -487
  34. package/esm2022/lib/base-ulv-setting.component.mjs +0 -45
  35. package/esm2022/lib/base.module.mjs +0 -28
  36. package/esm2022/lib/button-loading/button-loading.component.mjs +0 -18
  37. package/esm2022/lib/constants.mjs +0 -898
  38. package/esm2022/lib/container.component.mjs +0 -99
  39. package/esm2022/lib/controllers/base-controller.mjs +0 -30
  40. package/esm2022/lib/controllers/index.mjs +0 -5
  41. package/esm2022/lib/controllers/login-controller.mjs +0 -54
  42. package/esm2022/lib/controllers/login-verification-controller.mjs +0 -56
  43. package/esm2022/lib/controllers/models.mjs +0 -2
  44. package/esm2022/lib/custom-route-reuse-strategy.mjs +0 -32
  45. package/esm2022/lib/date-services/date-hijri.service.mjs +0 -146
  46. package/esm2022/lib/date-services/date-info.mjs +0 -2
  47. package/esm2022/lib/date-services/date-miladi.service.mjs +0 -124
  48. package/esm2022/lib/date-services/date-shamsi.service.mjs +0 -148
  49. package/esm2022/lib/date-services/date.service.mjs +0 -149
  50. package/esm2022/lib/date-services/index.mjs +0 -6
  51. package/esm2022/lib/device.mjs +0 -663
  52. package/esm2022/lib/directives/absolute-div-body.directive.mjs +0 -45
  53. package/esm2022/lib/directives/anchor-scroll.directive.mjs +0 -24
  54. package/esm2022/lib/directives/attr-rtl.directive.mjs +0 -35
  55. package/esm2022/lib/directives/base.directive.mjs +0 -55
  56. package/esm2022/lib/directives/body-click.directive.mjs +0 -35
  57. package/esm2022/lib/directives/column-resizer.directive.mjs +0 -39
  58. package/esm2022/lib/directives/copy.directive.mjs +0 -59
  59. package/esm2022/lib/directives/count-down.directive.mjs +0 -108
  60. package/esm2022/lib/directives/dynamic-command.directive.mjs +0 -42
  61. package/esm2022/lib/directives/dynamic-style.directive.mjs +0 -57
  62. package/esm2022/lib/directives/ellapsis-text.directive.mjs +0 -69
  63. package/esm2022/lib/directives/ellipsify.directive.mjs +0 -72
  64. package/esm2022/lib/directives/field-binding.directive.mjs +0 -17
  65. package/esm2022/lib/directives/fill-empty-space.mjs +0 -83
  66. package/esm2022/lib/directives/form-close.directive.mjs +0 -32
  67. package/esm2022/lib/directives/img-lazy.directive.mjs +0 -81
  68. package/esm2022/lib/directives/index.mjs +0 -35
  69. package/esm2022/lib/directives/intersection-observer.directive.mjs +0 -51
  70. package/esm2022/lib/directives/items-renderer.directive.mjs +0 -59
  71. package/esm2022/lib/directives/label-mandatory.directive.mjs +0 -48
  72. package/esm2022/lib/directives/load-external-files.directive.mjs +0 -37
  73. package/esm2022/lib/directives/mobile.directive.mjs +0 -29
  74. package/esm2022/lib/directives/nowraptext.directive.mjs +0 -26
  75. package/esm2022/lib/directives/numbers-only-input.directive.mjs +0 -26
  76. package/esm2022/lib/directives/placeHolder.directive.mjs +0 -15
  77. package/esm2022/lib/directives/prevent-default.directive.mjs +0 -20
  78. package/esm2022/lib/directives/render-ulv-paging.directive.mjs +0 -80
  79. package/esm2022/lib/directives/render-ulv-viewer.directive.mjs +0 -75
  80. package/esm2022/lib/directives/route-form-change.directive.mjs +0 -37
  81. package/esm2022/lib/directives/stop-propagation.directive.mjs +0 -20
  82. package/esm2022/lib/directives/table-resizer.directive.mjs +0 -235
  83. package/esm2022/lib/directives/ulv-command.directive.mjs +0 -42
  84. package/esm2022/lib/directives/until-inview.directive.mjs +0 -52
  85. package/esm2022/lib/directives/workflow-choice-command.directive.mjs +0 -60
  86. package/esm2022/lib/dynamic-component/base-dynamic.component.mjs +0 -96
  87. package/esm2022/lib/dynamic-component/base-form-toolbaritem-props.mjs +0 -52
  88. package/esm2022/lib/dynamic-component/base-item-content-props.mjs +0 -80
  89. package/esm2022/lib/dynamic-component/base-view-content-props.mjs +0 -20
  90. package/esm2022/lib/dynamic-component/base-view-item-props.mjs +0 -525
  91. package/esm2022/lib/dynamic-component/base-view-props.mjs +0 -162
  92. package/esm2022/lib/dynamic-component/dynamic-form-toolbar-item.component.mjs +0 -38
  93. package/esm2022/lib/dynamic-component/dynamic-form.component.mjs +0 -66
  94. package/esm2022/lib/dynamic-component/dynamic-item.component.mjs +0 -76
  95. package/esm2022/lib/dynamic-component/dynamic-layout.component.mjs +0 -63
  96. package/esm2022/lib/dynamic-component/index.mjs +0 -11
  97. package/esm2022/lib/empty-page/empty-page.component.mjs +0 -44
  98. package/esm2022/lib/empty-page-with-router-and-router-outlet/empty-page-with-router-and-router-outlet.component.mjs +0 -16
  99. package/esm2022/lib/field-ui/field-ui.component.mjs +0 -146
  100. package/esm2022/lib/form/form.component.mjs +0 -211
  101. package/esm2022/lib/form-new/form-new.component.mjs +0 -30
  102. package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page-routing.module.mjs +0 -54
  103. package/esm2022/lib/form-page-routing/barsa-sap-ui-form-page.module.mjs +0 -29
  104. package/esm2022/lib/form-page-routing/constants.mjs +0 -9
  105. package/esm2022/lib/form-page-routing/index.mjs +0 -3
  106. package/esm2022/lib/from-intersection-observer.mjs +0 -53
  107. package/esm2022/lib/global-error-handler.mjs +0 -26
  108. package/esm2022/lib/injdection-tokens.mjs +0 -8
  109. package/esm2022/lib/login-enter-mobile/login-enter-mobile.component.mjs +0 -64
  110. package/esm2022/lib/login-verification/login-verification.component.mjs +0 -79
  111. package/esm2022/lib/login2/login2.component.mjs +0 -60
  112. package/esm2022/lib/modal-root.component.mjs +0 -33
  113. package/esm2022/lib/not-found/not-found.component.mjs +0 -16
  114. package/esm2022/lib/not-internet/not-internet.component.mjs +0 -21
  115. package/esm2022/lib/pipes/barsa-icon-dict.pipe.mjs +0 -19
  116. package/esm2022/lib/pipes/bbb-translate.pipe.mjs +0 -35
  117. package/esm2022/lib/pipes/can-upload.pipe.mjs +0 -30
  118. package/esm2022/lib/pipes/column-custom-component.pipe.mjs +0 -40
  119. package/esm2022/lib/pipes/column-customui.pipe.mjs +0 -32
  120. package/esm2022/lib/pipes/column-icon.pipe.mjs +0 -22
  121. package/esm2022/lib/pipes/column-value.pipe.mjs +0 -34
  122. package/esm2022/lib/pipes/combo-row-img.pipe.mjs +0 -16
  123. package/esm2022/lib/pipes/context-menu.pipe.mjs +0 -40
  124. package/esm2022/lib/pipes/control-ui.pipe.mjs +0 -31
  125. package/esm2022/lib/pipes/convert-to-style.pipe.mjs +0 -32
  126. package/esm2022/lib/pipes/date-time-to-caption.pipe.mjs +0 -34
  127. package/esm2022/lib/pipes/fileinfo-count.pipe.mjs +0 -20
  128. package/esm2022/lib/pipes/filter-columns-by-details.pipe.mjs +0 -22
  129. package/esm2022/lib/pipes/filter-string.pipe.mjs +0 -44
  130. package/esm2022/lib/pipes/filter-tab.pipe.mjs +0 -19
  131. package/esm2022/lib/pipes/filter-toolbar-control.pipe.mjs +0 -16
  132. package/esm2022/lib/pipes/filter-workflow-mobile.pipe.mjs +0 -24
  133. package/esm2022/lib/pipes/filter.pipe.mjs +0 -33
  134. package/esm2022/lib/pipes/find-column-by-db-name.pipe.mjs +0 -27
  135. package/esm2022/lib/pipes/find-preview-column.pipe.mjs +0 -19
  136. package/esm2022/lib/pipes/fiori-icon.pipe.mjs +0 -42
  137. package/esm2022/lib/pipes/groupby.pipe.mjs +0 -63
  138. package/esm2022/lib/pipes/header-facet-value.pipe.mjs +0 -22
  139. package/esm2022/lib/pipes/hide-columns-inmobile.pipe.mjs +0 -22
  140. package/esm2022/lib/pipes/index.mjs +0 -48
  141. package/esm2022/lib/pipes/list-count.pipe.mjs +0 -17
  142. package/esm2022/lib/pipes/merge-fields-to-columns.pipe.mjs +0 -42
  143. package/esm2022/lib/pipes/mo-info-ulv-data.pipe.mjs +0 -58
  144. package/esm2022/lib/pipes/mo-info-ulv-paging.pipe.mjs +0 -16
  145. package/esm2022/lib/pipes/mo-report-value-concat.pipe.mjs +0 -35
  146. package/esm2022/lib/pipes/mo-report-value.pipe.mjs +0 -17
  147. package/esm2022/lib/pipes/mo-value.pipe.mjs +0 -18
  148. package/esm2022/lib/pipes/multiple-groupby.pipe.mjs +0 -90
  149. package/esm2022/lib/pipes/numeral.pipe.mjs +0 -43
  150. package/esm2022/lib/pipes/picture-field-source.pipe.mjs +0 -22
  151. package/esm2022/lib/pipes/remove-newline.pipe.mjs +0 -20
  152. package/esm2022/lib/pipes/replace.pipe.mjs +0 -17
  153. package/esm2022/lib/pipes/reverse.pipe.mjs +0 -22
  154. package/esm2022/lib/pipes/rownumber.pipe.mjs +0 -25
  155. package/esm2022/lib/pipes/sanitize-text.pipe.mjs +0 -20
  156. package/esm2022/lib/pipes/seperator-fix.pipe.mjs +0 -23
  157. package/esm2022/lib/pipes/sort.pipe.mjs +0 -48
  158. package/esm2022/lib/pipes/th-image-icon.pipe.mjs +0 -22
  159. package/esm2022/lib/pipes/tlbButtons.pipe.mjs +0 -59
  160. package/esm2022/lib/pipes/total-summary.pipe.mjs +0 -16
  161. package/esm2022/lib/pipes/tree-item-isexpanded.pipe.mjs +0 -25
  162. package/esm2022/lib/pipes/visible-value.pipe.mjs +0 -18
  163. package/esm2022/lib/portal-page/portal-page.component.mjs +0 -23
  164. package/esm2022/lib/portal-page/portal-sidebar.component.mjs +0 -36
  165. package/esm2022/lib/redirect-home-guard.mjs +0 -51
  166. package/esm2022/lib/redirect-report-navigator-command/redirect-report-navigator-command.component.mjs +0 -12
  167. package/esm2022/lib/report-container/report-container.component.mjs +0 -63
  168. package/esm2022/lib/resizable-module/resizable.component.mjs +0 -31
  169. package/esm2022/lib/resizable-module/resizable.directive.mjs +0 -41
  170. package/esm2022/lib/resizable-module/resizable.module.mjs +0 -17
  171. package/esm2022/lib/resolvers/index.mjs +0 -6
  172. package/esm2022/lib/resolvers/portal-dynamic-page.resolver.mjs +0 -49
  173. package/esm2022/lib/resolvers/portal-form-page.resolver.mjs +0 -18
  174. package/esm2022/lib/resolvers/portal-page.resolver.mjs +0 -30
  175. package/esm2022/lib/resolvers/portal-report-page.resolver.mjs +0 -37
  176. package/esm2022/lib/resolvers/tile-group-breadcrumb.resolver.mjs +0 -30
  177. package/esm2022/lib/root-page/root-page.component.mjs +0 -21
  178. package/esm2022/lib/root-portal/root-portal.component.mjs +0 -164
  179. package/esm2022/lib/server-connection-error/server-connection-error.component.mjs +0 -19
  180. package/esm2022/lib/services/api.service.mjs +0 -63
  181. package/esm2022/lib/services/audio-recording.service.mjs +0 -95
  182. package/esm2022/lib/services/barsa-dialog.service.mjs +0 -80
  183. package/esm2022/lib/services/barsa-storage.service.mjs +0 -78
  184. package/esm2022/lib/services/breadcrumb.service.mjs +0 -64
  185. package/esm2022/lib/services/column.service.mjs +0 -20
  186. package/esm2022/lib/services/container.service.mjs +0 -69
  187. package/esm2022/lib/services/dynamic-component.service.mjs +0 -55
  188. package/esm2022/lib/services/form-panel.service.mjs +0 -380
  189. package/esm2022/lib/services/form.service.mjs +0 -14
  190. package/esm2022/lib/services/horizontal-layout.service.mjs +0 -16
  191. package/esm2022/lib/services/index.mjs +0 -29
  192. package/esm2022/lib/services/indexeddb.service.mjs +0 -34
  193. package/esm2022/lib/services/layout.service.mjs +0 -42
  194. package/esm2022/lib/services/local-storage.service.mjs +0 -32
  195. package/esm2022/lib/services/log.service.mjs +0 -50
  196. package/esm2022/lib/services/network-status.service.mjs +0 -15
  197. package/esm2022/lib/services/notification-popup.service.mjs +0 -2
  198. package/esm2022/lib/services/notification-sw.service.mjs +0 -180
  199. package/esm2022/lib/services/notification.service.mjs +0 -308
  200. package/esm2022/lib/services/portal.service.mjs +0 -929
  201. package/esm2022/lib/services/prompt-update.service.mjs +0 -56
  202. package/esm2022/lib/services/routing.service.mjs +0 -60
  203. package/esm2022/lib/services/save-scoll-position.service.mjs +0 -29
  204. package/esm2022/lib/services/service-worker-communication.service.mjs +0 -120
  205. package/esm2022/lib/services/toast.service.mjs +0 -2
  206. package/esm2022/lib/services/ui.service.mjs +0 -23
  207. package/esm2022/lib/services/ulvmain.service.mjs +0 -810
  208. package/esm2022/lib/services/upload.service.mjs +0 -161
  209. package/esm2022/lib/services/video-recording.service.mjs +0 -115
  210. package/esm2022/public-api.mjs +0 -44
@@ -1,929 +0,0 @@
1
- import { Inject, Injectable, NgModuleFactory } from '@angular/core';
2
- import { DOCUMENT } from '@angular/common';
3
- import { BehaviorSubject, of, from, forkJoin, fromEvent, Subject, combineLatest } from 'rxjs';
4
- import { tap, map, concatMap, finalize, publishReplay, refCount, exhaustMap, distinctUntilChanged, startWith, debounceTime, filter } from 'rxjs/operators';
5
- import { BarsaApi } from '../abstract-classes/barsa-api';
6
- import { ExecuteDynamicCommand, getComponentDefined, getDeviceIsMobile, getDeviceIsTablet, getHeaderValue, getUniqueId } from '../constants';
7
- import { PortalPageResolver } from '../resolvers/portal-page.resolver';
8
- import { AuthGuard } from '../auth-guard';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "./dynamic-component.service";
11
- import * as i2 from "./api.service";
12
- import * as i3 from "./log.service";
13
- import * as i4 from "./barsa-dialog.service";
14
- import * as i5 from "@angular/router";
15
- import * as i6 from "@angular/common";
16
- import * as i7 from "./local-storage.service";
17
- export class PortalService {
18
- constructor(dcm, apiService, logService, dialogService, compiler, _router, _location, _localStorage, _document) {
19
- this.dcm = dcm;
20
- this.apiService = apiService;
21
- this.logService = logService;
22
- this.dialogService = dialogService;
23
- this.compiler = compiler;
24
- this._router = _router;
25
- this._location = _location;
26
- this._localStorage = _localStorage;
27
- this._document = _document;
28
- this.offsetTop = 0;
29
- this.loginLoading = new BehaviorSubject(false);
30
- this.loaded = false;
31
- this.formPanels = {};
32
- this.cachedImages = {};
33
- this.cachedPageData = {};
34
- this.pages = [];
35
- this.rtlSource = new BehaviorSubject(true);
36
- this.dictionary = {};
37
- this.portalDataSource = new BehaviorSubject(null);
38
- this.openForm$ = new Subject();
39
- this._isAnonumousSource = new BehaviorSubject(true);
40
- this._pushAction$ = new BehaviorSubject(null);
41
- this._deviceSizeSource = new BehaviorSubject(this._initalizeDeviceSize());
42
- this._loggedInSource = new BehaviorSubject(false);
43
- this.routeInitializedSource = new BehaviorSubject(false);
44
- this.dateTextSource = new BehaviorSubject('');
45
- this._navigationStart$ = new BehaviorSubject(null);
46
- this._navigationEnd$ = new BehaviorSubject(null);
47
- this._userPortalSettings$ = new BehaviorSubject({});
48
- this._cssUrlSource = new BehaviorSubject(null);
49
- this._cssVariableUrlSource = new BehaviorSubject(null);
50
- this._cssCustomUrlSource = new BehaviorSubject(null);
51
- this._searchTerm$ = new BehaviorSubject('');
52
- this._windowResize$ = new Subject();
53
- this._deviceLandscape$ = new BehaviorSubject(!window.matchMedia('(orientation: portrait)').matches);
54
- this._standalone$ = new BehaviorSubject(window.matchMedia('(display-mode: standalone)').matches);
55
- this._documentVisibilitychange$ = new Subject();
56
- this.initialize();
57
- this._initLandscape();
58
- this._initStandalone();
59
- this._initVisibilityChange();
60
- this._initPushActions();
61
- }
62
- get userLoggedIn() {
63
- return this._loggedInSource.getValue();
64
- }
65
- get pushAction$() {
66
- return this._pushAction$.asObservable().pipe();
67
- }
68
- get documentVisibilitychange$() {
69
- return this._documentVisibilitychange$.asObservable();
70
- }
71
- get isStandalone() {
72
- return this._standalone$.getValue();
73
- }
74
- get standalone$() {
75
- return this._standalone$.asObservable();
76
- }
77
- get landscape$() {
78
- return this._deviceLandscape$.asObservable();
79
- }
80
- get windowResize$() {
81
- return this._windowResize$.asObservable().pipe(debounceTime(300));
82
- }
83
- get portalData() {
84
- return this.portalDataSource.getValue();
85
- }
86
- get searchTerm$() {
87
- return this._searchTerm$.asObservable();
88
- }
89
- get cssUrl$() {
90
- return this._cssUrlSource.asObservable().pipe(distinctUntilChanged());
91
- }
92
- get cssVariableUrl$() {
93
- return this._cssVariableUrlSource.asObservable().pipe(distinctUntilChanged());
94
- }
95
- get cssCustomUrl$() {
96
- return this._cssCustomUrlSource.asObservable();
97
- }
98
- get userPortalSettings() {
99
- return this._userPortalSettings$.getValue();
100
- }
101
- get userPortalSettings$() {
102
- return this._userPortalSettings$.asObservable();
103
- }
104
- get deviceSize() {
105
- return this._deviceSizeSource.getValue();
106
- }
107
- get isAnonymous$() {
108
- return this._isAnonumousSource.asObservable();
109
- }
110
- get navigationEnd$() {
111
- return this._navigationEnd$.asObservable();
112
- }
113
- get navigationStart$() {
114
- return this._navigationStart$.asObservable();
115
- }
116
- loadMo(id, typedefId) {
117
- return this.apiService.loadPortalPageData(id, typedefId);
118
- }
119
- pushActionNext(pushAction) {
120
- this._localStorage.setItem('pushAction', JSON.stringify(pushAction));
121
- this._pushAction$.next(pushAction);
122
- }
123
- setSearchTerm(term) {
124
- this._searchTerm$.next(term);
125
- }
126
- windowResize() {
127
- this._windowResize$.next();
128
- }
129
- naviationEnd(event) {
130
- this._navigationEnd$.next(event);
131
- }
132
- naviationStart(event) {
133
- this._navigationStart$.next(event);
134
- }
135
- setUserPortalSettings(userPortalSettings) {
136
- const value = this._userPortalSettings$.getValue();
137
- if (userPortalSettings.$TypeDefName) {
138
- value[userPortalSettings.$TypeDefName] = userPortalSettings;
139
- this._userPortalSettings$.next({ ...value });
140
- }
141
- }
142
- setCssUrlTheme(themeUrl, cssVariableUrl) {
143
- this._cssUrlSource.next(themeUrl);
144
- this._cssCustomUrlSource.next(themeUrl);
145
- if (cssVariableUrl) {
146
- this._cssVariableUrlSource.next(cssVariableUrl);
147
- }
148
- }
149
- setData(key, data) {
150
- if (!this.dictionary[key]) {
151
- this.dictionary[key] = new BehaviorSubject(data);
152
- this.dictionary[key].next(data);
153
- }
154
- else {
155
- const oldVal = this.dictionary[key].getValue();
156
- if (oldVal !== data) {
157
- this.dictionary[key].next(data);
158
- }
159
- }
160
- }
161
- getData(key, defaultValue = null) {
162
- if (!this.dictionary[key]) {
163
- this.dictionary[key] = new BehaviorSubject(defaultValue);
164
- }
165
- return this.dictionary[key].asObservable();
166
- }
167
- getDataSync(key, defaultValue = null) {
168
- if (!this.dictionary[key]) {
169
- return defaultValue;
170
- }
171
- return this.dictionary[key].getValue();
172
- }
173
- createForReport(navItem) {
174
- return from(new Promise((resolve, reject) => {
175
- BarsaApi.Ul.UlvMainCtrlr.CreateForReport({}, navItem, (err, result) => {
176
- if (err) {
177
- reject(err);
178
- }
179
- else {
180
- resolve(result);
181
- }
182
- });
183
- }));
184
- }
185
- renderUlvMainUi(navItem, vcr, injector, isReportPage = false) {
186
- return this.createForReport(navItem).pipe(exhaustMap((ulvMainCtrlr) => this.getUlvMainUiComponent(ulvMainCtrlr.Adapter.Control, injector, isReportPage).pipe(tap((ulvManiUiComponent) => vcr.insert(ulvManiUiComponent.hostView)), map(() => ulvMainCtrlr))));
187
- }
188
- getUlvMainUiComponent(customUlvMainUi, injector, isReportPage) {
189
- const customUiSetting = BarsaApi.Common.Util.TryGetValue(customUlvMainUi.Setting, 'CustomUi', null);
190
- const { moduleName, modulePath, componentName, selector } = getComponentDefined(customUlvMainUi, customUiSetting);
191
- return this.getComponent(moduleName, modulePath, componentName, selector, injector).pipe(map((component) => {
192
- const componentInstance = component.instance;
193
- componentInstance.id = customUlvMainUi.id;
194
- componentInstance.context = customUlvMainUi;
195
- componentInstance.isReportPage = isReportPage;
196
- customUlvMainUi.controlUi = componentInstance;
197
- return component;
198
- }));
199
- }
200
- initialize() {
201
- this.deviceSize$ = this._deviceSizeSource.asObservable();
202
- this.portalData$ = this.portalDataSource.asObservable();
203
- this.rtl$ = this.rtlSource.asObservable();
204
- this.userLoggedIn$ = this._loggedInSource
205
- .asObservable()
206
- .pipe(map((isLoggedIn) => isLoggedIn && BarsaApi.LoginFormData.IsAnonymous === false));
207
- this.dirValue$ = this.rtl$.pipe(map((isRtl) => (isRtl ? 'rtl' : 'ltr')));
208
- this.routeInitialized$ = this.routeInitializedSource.asObservable().pipe(distinctUntilChanged());
209
- this._standalone$.asObservable().subscribe((c) => {
210
- if (c) {
211
- this._document.body.classList.add('standalone');
212
- }
213
- else {
214
- this._document.body.classList.add('noStandalone');
215
- }
216
- });
217
- this._deviceLandscape$.asObservable().subscribe((c) => {
218
- if (c) {
219
- this._document.body.classList.add('landscape');
220
- }
221
- });
222
- this._deviceSizeSource.asObservable().subscribe((c) => {
223
- if (c === 's') {
224
- this._document.body.classList.add('smalldevice');
225
- }
226
- });
227
- this.dateText$ = this.dateTextSource.asObservable();
228
- this.portalSettings$ = this.portalDataSource
229
- .asObservable()
230
- .pipe(map((portalData) => (portalData ? portalData.PortalSettings : {})));
231
- fromEvent(window, 'resize')
232
- .pipe(startWith(null), debounceTime(1000))
233
- .subscribe((c) => {
234
- this._windowResize$.next();
235
- this._setDeviceSize();
236
- });
237
- }
238
- _setDeviceSize() {
239
- const deviceSize = this._initalizeDeviceSize();
240
- this._deviceSizeSource.next(deviceSize);
241
- }
242
- _initalizeDeviceSize() {
243
- const _ismobile = getDeviceIsMobile();
244
- if (_ismobile) {
245
- BarsaApi.Bw.IsMobile = true;
246
- }
247
- const _isTablet = getDeviceIsTablet();
248
- let _windoWSize = 's';
249
- if (window.innerWidth <= 600) {
250
- _windoWSize = 's';
251
- }
252
- else if (window.innerWidth > 600 && window.innerWidth <= 992) {
253
- _windoWSize = 'm';
254
- }
255
- else if (window.innerWidth > 992 && window.innerWidth <= 1200) {
256
- _windoWSize = 'l';
257
- }
258
- else {
259
- _windoWSize = 'xl';
260
- }
261
- if (_ismobile && _windoWSize !== 'l' && _windoWSize !== 'xl' && _windoWSize !== 'm') {
262
- return 's';
263
- }
264
- if (_isTablet && _windoWSize !== 'l' && _windoWSize !== 'xl') {
265
- return 'm';
266
- }
267
- return _windoWSize;
268
- }
269
- compileModule(dependency) {
270
- const module$ = this.getModule(dependency);
271
- return module$.pipe(concatMap((modules) => {
272
- const moduleFactory = this.getNgModuleFactory(modules, dependency.name);
273
- return of(moduleFactory);
274
- }));
275
- }
276
- getModule(dependency) {
277
- const { name, kebabName, umd, exportAs } = dependency;
278
- const base = `/assets/modules/${kebabName}/bundles`;
279
- const date = BarsaApi.LoginFormData.abc;
280
- const path = `${base}/${kebabName}.umd.js?t=${date}`;
281
- return of(true).pipe(concatMap(() => {
282
- const modules = this.getRegisteredModules(umd, exportAs, name);
283
- if (modules) {
284
- return of(modules);
285
- }
286
- return this.loadJs$(path).pipe(map(() => this.getRegisteredModules(umd, exportAs, name)));
287
- }));
288
- }
289
- setValueOnObject(path, index, modules, object) {
290
- const splited = path.split('.');
291
- const prop = splited[index];
292
- if (typeof object[prop] === typeof undefined) {
293
- object[prop] = {};
294
- }
295
- if (index === splited.length - 1) {
296
- object[prop] = modules;
297
- return;
298
- }
299
- this.setValueOnObject(path, index + 1, modules, object[prop]);
300
- }
301
- getComponent(moduleName, modulePath, componentName, selector, parentInjector) {
302
- return this.dcm.getComponentBySelector(selector, moduleName, parentInjector);
303
- }
304
- loadJs$(path) {
305
- return from(new Promise((resolve, reject) => {
306
- const script = document.createElement('script');
307
- script.setAttribute('type', 'text/javascript');
308
- script.setAttribute('src', path);
309
- script.onload = () => {
310
- resolve(path);
311
- };
312
- document.getElementsByTagName('head')[0].appendChild(script);
313
- setTimeout(() => {
314
- reject();
315
- }, 5000);
316
- }));
317
- }
318
- ReportExecuteById(reportId) {
319
- const ulvParams = this._getUlvParamsBy('', reportId);
320
- return from(this._reportExecutePromise(ulvParams));
321
- }
322
- ReportExecute(reportName) {
323
- return from(this.ReportExecutePromise(reportName));
324
- }
325
- ReportExecutePromise(reportName) {
326
- const ulvParams = this._getUlvParamsBy(reportName);
327
- return this._reportExecutePromise(ulvParams);
328
- }
329
- _getUlvParamsBy(reportName, reportId) {
330
- return {
331
- Flags: {
332
- Data: 'True',
333
- Extra: 'False',
334
- Search: 'False',
335
- View: 'False'
336
- // General:"False", // ulvmainctrl does not craete ui control raise error
337
- },
338
- ReportName: reportName,
339
- ReportId: reportId,
340
- UsageEnum: 'SystemContainer'
341
- };
342
- }
343
- _reportExecutePromise(ulvParams) {
344
- return new Promise((resolve, reject) => {
345
- BarsaApi.Bw.ExecuteReport({ ulvParams }, (result) => {
346
- resolve(result.Data);
347
- }, (err) => {
348
- reject(err);
349
- });
350
- });
351
- }
352
- addFormPanelCtrlr(id, formpanelCtrlr) {
353
- this.formPanels[id] = formpanelCtrlr;
354
- }
355
- setUserLoginStatus(status) {
356
- this._loggedInSource.next(status);
357
- }
358
- extractAllPages(portalData) {
359
- if (!portalData) {
360
- return;
361
- }
362
- portalData.ChildPageList.MoDataList.forEach((pageData) => {
363
- this.addChildPages(pageData);
364
- });
365
- }
366
- extractAllPages_Old(portalData) {
367
- if (!portalData) {
368
- return;
369
- }
370
- const config = this._router.config;
371
- portalData.ChildPageList.MoDataList.forEach((pageData) => {
372
- const path = pageData.Route.replace('/', '');
373
- config.push(this.createRoute(pageData, path, pageData.HasAuthorize, pageData.PageModule?.$Caption, null, null));
374
- if (pageData.IsDefaultRoute || pageData.IsDefaultRoute === 'True') {
375
- this.defaultRoute = path;
376
- config.push(this.createRoute(pageData, '', false, portalData.PageModule?.$Caption, path, null));
377
- }
378
- this.addChildPages(pageData);
379
- });
380
- this._router.resetConfig(config);
381
- if (this._location.path() === '') {
382
- // this._router.navigate([this.defaultRoute]);
383
- this._router.navigate(['']);
384
- }
385
- // this.routeInitialized();
386
- }
387
- ssoLogin() {
388
- AjaxHelper.AjaxRequest('/api/base/ssologin', null, false, () => {
389
- // console.log(response);
390
- }, () => {
391
- alert('error in sso login.');
392
- }, null);
393
- }
394
- ssoLogout() {
395
- AjaxHelper.AjaxRequest('/api/base/ssologout', null, false, () => {
396
- // console.log(response);
397
- }, () => {
398
- alert('error in sso logout.');
399
- }, null);
400
- }
401
- addChildPages(pageData) {
402
- this.pages.push(pageData);
403
- if (!pageData.ChildPageList?.MoDataList?.length) {
404
- return;
405
- }
406
- pageData.ChildPageList.MoDataList.forEach((childPage) => {
407
- this.addChildPages(childPage);
408
- });
409
- }
410
- /* eslint-disable */
411
- createRoute(pageData, path, hasAuthorized, moduleName, redirectTo, isDynamicRoute) {
412
- return {};
413
- }
414
- createRoute2(pageData, path, hasAuthorized, moduleName, redirectTo = null, isDynamicRoute = false) {
415
- let modulePath = BarsaApi.Common.Util.GetKebabCase(moduleName);
416
- const umd = moduleName;
417
- modulePath = modulePath.substring(1, modulePath.length);
418
- const dynamicRoute = {};
419
- dynamicRoute.path = path;
420
- dynamicRoute.data = { pageData };
421
- if (!isDynamicRoute) {
422
- dynamicRoute.resolve = {
423
- pageData: PortalPageResolver
424
- };
425
- }
426
- if (path === '') {
427
- dynamicRoute.pathMatch = 'full';
428
- }
429
- if (redirectTo) {
430
- dynamicRoute.redirectTo = redirectTo;
431
- }
432
- else {
433
- if (hasAuthorized) {
434
- dynamicRoute.canActivate = [AuthGuard];
435
- }
436
- dynamicRoute.loadChildren = () => {
437
- const dependencies = JSON.parse(pageData.Dependencies); // eval(pageData.Dependencies);
438
- const pageLibrary = {
439
- name: moduleName,
440
- kebabName: modulePath,
441
- umd,
442
- exportAs: [moduleName]
443
- };
444
- const dependencies$ = from(dependencies).pipe(concatMap((dependency) => this.compileModule(dependency)));
445
- return forkJoin([dependencies$]).pipe(concatMap(() => this.getModule(pageLibrary)), map((modules) => modules[moduleName + 'Module']), tap(() => this.routeInitialized()));
446
- };
447
- }
448
- return dynamicRoute;
449
- }
450
- routeInitialized() {
451
- this.routeInitializedSource.next(true);
452
- }
453
- loginByAnonymous() {
454
- this.loginLoading.next(true);
455
- return this.apiService.loginPortal().pipe(map((result) => {
456
- if (typeof result === 'object' && result !== null) {
457
- this.logService.debug(result);
458
- window.localStorage.setItem(BarsaApi.LoginAction.token2StorageKey, result.data.sth);
459
- return true;
460
- }
461
- else {
462
- return false;
463
- }
464
- }), finalize(() => {
465
- this.loginLoading.next(false);
466
- }));
467
- }
468
- getPageData(url, isRoot) {
469
- if (isRoot || url === '' || url === '/') {
470
- return this.portalData$;
471
- }
472
- if (url.indexOf('?') > -1) {
473
- url = url.substr(0, url.indexOf('?'));
474
- }
475
- if (this.cachedPageData[url]) {
476
- return this.cachedPageData[url];
477
- }
478
- const pageData = this.findPageByRoute(url);
479
- this.cachedPageData[url] = this.apiService
480
- .loadPortalPageData(pageData?.Id, this.portalDataSource.getValue()?.ChildPageList.TypeDefId)
481
- .pipe(map((pageMo) => pageMo.Data.Mo), tap((pageMo) => {
482
- this.addChildRoute(pageMo, pageMo.ChildPageList);
483
- this.addChildPages(pageMo);
484
- }), publishReplay(1), refCount());
485
- // this.cachedPageData[url] = this.portalData$.pipe(
486
- // filter((portalData) => portalData != null),
487
- // map((portalData) => ),
488
- // concatMap((pageData) => {
489
- // return
490
- // }),
491
- // tap(pageData=>{})
492
- // );
493
- return this.cachedPageData[url];
494
- }
495
- resolveData(routePageData) {
496
- // const pageData = this.pages.find((c) => c.Route === routePageData.Route && c.Module === routePageData.Module);
497
- const pageData = this.pages.find((c) => c.Route === routePageData.Route);
498
- if (!pageData) {
499
- return of(null);
500
- }
501
- const id = pageData.Id;
502
- if (this.cachedPageData[id]) {
503
- return this.cachedPageData[id];
504
- }
505
- this.cachedPageData[id] = this.apiService
506
- .loadPortalPageData(id, this.portalDataSource.getValue()?.ChildPageList.TypeDefId)
507
- .pipe(map((pageMo) => pageMo.Data.Mo), tap((pageMo) => {
508
- this.addChildRoute(pageMo, pageMo.ChildPageList);
509
- this.addChildPages(pageMo);
510
- }), publishReplay(1), refCount());
511
- // this.cachedPageData[url] = this.portalData$.pipe(
512
- // filter((portalData) => portalData != null),
513
- // map((portalData) => ),
514
- // concatMap((pageData) => {
515
- // return
516
- // }),
517
- // tap(pageData=>{})
518
- // );
519
- return this.cachedPageData[id];
520
- }
521
- addChildRoute(pageMo, ChildPageList) {
522
- return;
523
- }
524
- addChildRoute_Old(pageMo, ChildPageList) {
525
- if (!ChildPageList?.MoDataList?.length) {
526
- return;
527
- }
528
- const config = this._router.config;
529
- const parentPath = pageMo.Route.replace('/', '');
530
- const parentRoute = config.find((c) => (c.path = parentPath));
531
- const children = [];
532
- if (parentRoute) {
533
- ChildPageList.MoDataList.forEach((child) => {
534
- const path = child.Route.replace('/', '');
535
- const childroute = this.createRoute(child, path, child.HasAuthorize, child.PageModule?.$Caption, null, true);
536
- children.push(childroute);
537
- });
538
- // debugger;
539
- parentRoute._loadedConfig.routes[0].children = children;
540
- this._router.resetConfig(config);
541
- }
542
- }
543
- loadPortalData_Old1() {
544
- return this.apiService.loadPortal(BarsaApi.LoginFormData.PortalId, BarsaApi.LoginFormData.PortalTypeDefId).pipe(tap((portalSetting) => {
545
- const portalData = portalSetting.Data.Mo;
546
- this.extractAllPages(portalData);
547
- this.portalDataSource.next(portalData);
548
- }), concatMap(() => from(this.loadSystem())), tap((all) => this.dateTextSource.next(BarsaApi.LoginFormData.DateText)));
549
- }
550
- loadPortalDataSync_Old2() {
551
- const portalSetting = this.apiService.loadPortalSync(BarsaApi.LoginFormData.PortalId, BarsaApi.LoginFormData.PortalTypeDefId);
552
- const portalData = portalSetting.Data.Mo;
553
- this.extractAllPages(portalData);
554
- this.portalDataSource.next(portalData);
555
- this.loadSystem();
556
- this.dateTextSource.next(BarsaApi.LoginFormData.DateText);
557
- }
558
- _getDefaultPage(c) {
559
- if (!c || !c.length) {
560
- return null;
561
- }
562
- let x = c.find((c) => c.IsDefaultRoute === 'True');
563
- if (x) {
564
- return x;
565
- }
566
- let x2 = null;
567
- c.forEach((element) => {
568
- if (x2) {
569
- return;
570
- }
571
- x2 = this._getDefaultPage(element.ChildPageList?.MoDataList);
572
- });
573
- return x2;
574
- }
575
- loadPortalDataSync() {
576
- if (BarsaApi.LoginFormData?.error?.userMessage) {
577
- return;
578
- }
579
- const portalSettingStr = BarsaApi.Bw.RunBlMethod('GetPortal', BarsaApi.LoginFormData.PortalId);
580
- const portalSetting = BarsaApi.Ext.decode(portalSettingStr);
581
- const portalData = portalSetting;
582
- if (portalData) {
583
- const defaultPage = this._getDefaultPage(portalData.ChildPageList.MoDataList);
584
- this.DefaultPage = defaultPage;
585
- let configRoute = this._router.config;
586
- const removePaged = [];
587
- configRoute.forEach((c, index) => {
588
- const route = '/' + c.path;
589
- if (c.path !== '' && portalData.ChildPageList.MoDataList.findIndex((d) => d.Route === route) === -1) {
590
- removePaged.push(c);
591
- }
592
- });
593
- const pathToRemove = removePaged.map((d) => d.path);
594
- configRoute = configRoute.filter((c) => pathToRemove.indexOf(c.path) === -1);
595
- if (defaultPage != null) {
596
- const defaultPageRoute = defaultPage.Route.replace('/', '');
597
- const defaultPath = configRoute.find((c) => c.path === '');
598
- defaultPath && (defaultPath.redirectTo = defaultPageRoute);
599
- configRoute.push({ path: '**', redirectTo: defaultPageRoute });
600
- // const notFoundPath = configRoute.find((c) => c.path === '**');
601
- // notFoundPath && (notFoundPath.redirectTo = defaultPage.Route.replace('/', ''));
602
- this._router.resetConfig(configRoute);
603
- }
604
- }
605
- this.extractAllPages(portalData);
606
- this.portalDataSource.next(portalData);
607
- this.dateTextSource.next(BarsaApi.LoginFormData.DateText);
608
- }
609
- ShowForm(e) {
610
- BarsaApi.Bw.Form.Show({
611
- Mo: e.mo,
612
- MoContext: {
613
- ViewName: e.nama
614
- },
615
- EventHandlers: {
616
- AfterReady: function (sender, ee) {
617
- //do something here
618
- e.afterReady?.(ee);
619
- }
620
- }
621
- });
622
- }
623
- get loginRoute$() {
624
- return this.portalData$.pipe(map((portalData) => {
625
- const loginPage = portalData?.ChildPageList.MoDataList.find((c) => c.IsLoginRoute === 'True');
626
- return loginPage?.Route || 'login';
627
- }));
628
- }
629
- ExecuteNotificationAction(id, actionTitle) {
630
- BarsaApi.Bw.RunBlMethodAsync({
631
- Parameters: [id, actionTitle],
632
- Method: 'ExecuteNotificationAction',
633
- SuccessFn: (e) => {
634
- this._removePushAction();
635
- if (e.DynamicCommandId) {
636
- ExecuteDynamicCommand({ Id: e.DynamicCommandId }, e.Mo);
637
- }
638
- else if (e.ShowFormSetting) {
639
- const { MoId, ViewName } = e.ShowFormSetting;
640
- setTimeout(() => BarsaApi.Bw.Form.Show({ MoId, MoContext: { ViewName } }), 500);
641
- }
642
- },
643
- FailFn: (e) => {
644
- this._removePushAction();
645
- this.logService.error(e);
646
- }
647
- });
648
- }
649
- loadUserPortalSetting() {
650
- if (BarsaApi.LoginFormData?.error?.userMessage) {
651
- return;
652
- }
653
- const ulvParams = {
654
- Flags: {
655
- Data: 'True',
656
- Extra: 'False',
657
- Search: 'False',
658
- View: 'False'
659
- // General:"False", // ulvmainctrl does not craete ui control raise error
660
- },
661
- ReportName: '_تنظيمات_پايه_پورتال',
662
- UsageEnum: 'SystemContainer'
663
- };
664
- BarsaApi.Bw.ExecuteReport({ ulvParams }, (result) => {
665
- const molist = result.Data.MoDataList;
666
- const userPortalSetting = {};
667
- molist.forEach((mo) => {
668
- if (mo.Inheritance && mo.Inheritance.$TypeDefName) {
669
- userPortalSetting[mo.Inheritance.$TypeDefName] = mo.Inheritance;
670
- }
671
- });
672
- this._userPortalSettings$.next(userPortalSetting);
673
- }, (err) => {
674
- this.logService.error(err);
675
- });
676
- // BarsaApi.Bw.RunBlMethodAsync({
677
- // Parameters: [],
678
- // Method: 'GetUserPortalSettings',
679
- // SuccessFn: (userPortalSetting: MetaobjectDataModel) => {
680
- // },
681
- // FailFn: (e) => {
682
- // this.logService.error(e);
683
- // }
684
- // });
685
- }
686
- loadServerStartupData() {
687
- return new Promise((resolve, reject) => {
688
- if (!BarsaApi.Offline.hasInit) {
689
- BarsaApi.Offline.afterInitCallback = () => {
690
- this._loadServerStartupData(resolve, reject);
691
- };
692
- }
693
- else
694
- this._loadServerStartupData(resolve, reject);
695
- });
696
- }
697
- _loadServerStartupData(resolve, reject) {
698
- const ajaxHelper = typeof AjaxHelper2 === 'undefined' ? AjaxHelper : AjaxHelper2;
699
- ajaxHelper.AjaxRequest('/api/base/ServerStartupData', {}, false, (response) => {
700
- let dataText = response.responseText;
701
- dataText = dataText.replace(/'/g, '"');
702
- dataText = BarsaApi.Common.Util.ReplaceArabicCharchter(dataText);
703
- BarsaApi.LoginForm.PortalInitialize(dataText);
704
- if (typeof BarsaApi.LoginFormData.IsAnonymous === 'undefined') {
705
- if (BarsaApi.LoginFormData?.error?.userMessage) {
706
- BarsaApi.Bw.Msg.Error(BarsaApi.LoginFormData?.error?.userMessage);
707
- }
708
- else {
709
- BarsaApi.Bw.Msg.Error('امکان ورود با کاربر پورتال وجود ندارد.');
710
- }
711
- }
712
- if (BarsaApi.LoginFormData.IsServiceDesk) {
713
- const config = this._router.config;
714
- config[0].redirectTo = 'servicedesk';
715
- this._router.resetConfig(config);
716
- }
717
- this._initAfterLoginFormData();
718
- resolve(BarsaApi.LoginFormData);
719
- }, () => {
720
- alert('error in get server startup data.');
721
- reject('error in get server startup data.');
722
- }, null);
723
- }
724
- ShowFormPanelControl(formpanelCtrlr, router, activatedRoute, dialogComponent, isPage, vcr, isReload = false) {
725
- if (!formpanelCtrlr) {
726
- console.warn('form panel controler is undefined!');
727
- return;
728
- }
729
- const mo = formpanelCtrlr.Mo;
730
- const headerLayout = BarsaApi.Common.Util.TryGetValue(formpanelCtrlr, 'Setting.View.HeaderLayout', null);
731
- let isModal = BarsaApi.Common.Util.TryGetValue(formpanelCtrlr, 'Setting.View.ExtraJsonProp.Modal', false);
732
- isModal =
733
- isModal ||
734
- BarsaApi.Common.Util.TryGetValue(formpanelCtrlr, 'Setting.View.CustomUi.Parameters.IsModal', false);
735
- const modalSetting = BarsaApi.Common.Util.TryGetValue(formpanelCtrlr, 'Setting.View.CustomUi.Parameters.ModalSetting', null);
736
- if (modalSetting) {
737
- isModal = true;
738
- }
739
- formpanelCtrlr.Setting.IsModal = isModal;
740
- formpanelCtrlr.IsModal = isModal;
741
- const breadCrumb = getHeaderValue(headerLayout?.BreadCrumb);
742
- const queryParams = {
743
- id: mo.$State === 'New' ? '0' : mo.Id,
744
- tyid: mo.$TypeDefId,
745
- tycp: mo.$Caption ? mo.$Caption : null,
746
- repid: mo.$ReportId,
747
- vid: formpanelCtrlr?.Setting?.View?.TypeViewId,
748
- bc: breadCrumb ? breadCrumb : mo.$State === 'New' ? mo.$TypeDefName : mo.$Caption
749
- };
750
- const id = getUniqueId(4);
751
- this.addFormPanelCtrlr(id, formpanelCtrlr);
752
- this.openForm$.next(); // event emit for other components to know form open
753
- if (isModal) {
754
- this.dialogService.showForm(dialogComponent, {
755
- ...queryParams,
756
- formpanelCtrlr
757
- }, vcr);
758
- }
759
- else {
760
- const state = { formPanelCtrlrId: id };
761
- if (isPage) {
762
- router.navigate([
763
- 'form',
764
- {
765
- outlets: {
766
- main: ['show', { ...queryParams, formPanelCtrlrId: id, isFirst: true }]
767
- }
768
- }
769
- ], {
770
- state,
771
- relativeTo: activatedRoute,
772
- skipLocationChange: isReload
773
- });
774
- }
775
- else {
776
- router.navigate([
777
- 'popup',
778
- {
779
- outlets: {
780
- main: ['show', { ...queryParams, formPanelCtrlrId: id }]
781
- }
782
- }
783
- ], {
784
- relativeTo: activatedRoute,
785
- state,
786
- queryParamsHandling: 'preserve',
787
- skipLocationChange: isReload
788
- });
789
- }
790
- }
791
- }
792
- loadSystem(id = 0) {
793
- if (BarsaApi.LoginFormData?.error?.userMessage) {
794
- return Promise.reject(BarsaApi.LoginFormData?.error?.userMessage);
795
- }
796
- if (id === 0) {
797
- BarsaApi.Ul.ApplicationCtrlr.DefaultSystemId = null;
798
- }
799
- return new Promise((resolve, reject) => {
800
- BarsaApi.Ul.ApplicationCtrlr._loadSystem(id, true, (data) => {
801
- resolve(data);
802
- }, (err) => {
803
- reject(err);
804
- });
805
- });
806
- }
807
- _removePushAction() {
808
- const pushActionStr = this._localStorage.getItem('pushAction');
809
- if (pushActionStr) {
810
- this._localStorage.remove('pushAction');
811
- const pushAction = JSON.parse(pushActionStr);
812
- this._pushAction$.next(pushAction);
813
- }
814
- }
815
- _checkLocalStoragePushAction() {
816
- const pushActionStr = this._localStorage.getItem('pushAction');
817
- if (pushActionStr) {
818
- this._localStorage.remove('pushAction');
819
- const pushAction = JSON.parse(pushActionStr);
820
- this._pushAction$.next(pushAction);
821
- }
822
- }
823
- _initAfterLoginFormData() {
824
- this.rtlSource.next(BarsaApi.LoginFormData.IsRtl);
825
- this._isAnonumousSource.next(BarsaApi.LoginFormData.IsAnonymous);
826
- this.setUserLoginStatus(BarsaApi.LoginFormData.IsUserLoggedIn);
827
- this._loggedInSource.next(this._loggedInSource.getValue() && BarsaApi.LoginFormData.IsAnonymous === false);
828
- }
829
- _initVisibilityChange() {
830
- document.addEventListener('visibilitychange', () => {
831
- if (document.visibilityState === 'visible') {
832
- this._documentVisibilitychange$.next(false);
833
- }
834
- else {
835
- this._documentVisibilitychange$.next(true);
836
- }
837
- });
838
- }
839
- _initStandalone() {
840
- window.matchMedia('(display-mode: standalone)').addEventListener('change', (e) => {
841
- const isMatch = e.matches;
842
- if (isMatch) {
843
- this._standalone$.next(true);
844
- }
845
- else {
846
- this._standalone$.next(false);
847
- }
848
- });
849
- }
850
- _initPushActions() {
851
- this._checkLocalStoragePushAction();
852
- combineLatest([this.userLoggedIn$, this.pushAction$])
853
- .pipe(
854
- // withLatestFrom(this._portalService.pushAction$),
855
- // filter(([userLoggedin, action]) => userLoggedin)
856
- filter(([userLoggedin, pushAction]) => userLoggedin))
857
- .subscribe(([userLoggedin, pushAction]) => {
858
- if (pushAction != null) {
859
- if (!pushAction.notificationTag) {
860
- if (pushAction.moid && pushAction.tpid && pushAction.action == 'show') {
861
- setTimeout(() => BarsaApi.Bw.Form.Show({ MoId: pushAction.moid }), 500);
862
- }
863
- }
864
- else {
865
- this.ExecuteNotificationAction(pushAction.notificationTag, pushAction.action);
866
- }
867
- }
868
- });
869
- }
870
- _initLandscape() {
871
- window.matchMedia('(orientation: portrait)').addEventListener('change', (e) => {
872
- const isMatch = e.matches;
873
- if (isMatch) {
874
- this._deviceLandscape$.next(false); // portrait
875
- }
876
- else {
877
- this._deviceLandscape$.next(true); // landscape
878
- }
879
- });
880
- }
881
- findPageByRoute(url) {
882
- const findedPage = this.pages.find((c) => c.Route === url);
883
- return findedPage || null;
884
- }
885
- getNgModuleFactory(modules, moduleName) {
886
- const moduleClass = modules[moduleName + 'Module'];
887
- let moduleFactory;
888
- if (moduleClass instanceof NgModuleFactory) {
889
- moduleFactory = moduleClass;
890
- }
891
- else {
892
- const compiled = this.compiler.compileModuleAndAllComponentsSync(moduleClass);
893
- moduleFactory = compiled.ngModuleFactory;
894
- }
895
- return moduleFactory;
896
- }
897
- getRegisteredModules(umd, exportAs, moduleName) {
898
- let modules;
899
- if (umd !== '') {
900
- modules = window;
901
- umd.split('.').forEach((c) => {
902
- if (typeof modules !== typeof undefined) {
903
- modules = modules[c];
904
- }
905
- });
906
- }
907
- else {
908
- modules = window[moduleName];
909
- }
910
- if (exportAs.length > 0 && modules) {
911
- exportAs.forEach((c) => {
912
- this.setValueOnObject(c, 0, modules, window);
913
- });
914
- }
915
- return modules;
916
- }
917
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PortalService, deps: [{ token: i1.DynamicComponentService }, { token: i2.ApiService }, { token: i3.LogService }, { token: i4.BarsaDialogService }, { token: i0.Compiler }, { token: i5.Router }, { token: i6.Location }, { token: i7.LocalStorageService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
918
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PortalService, providedIn: 'root' }); }
919
- }
920
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PortalService, decorators: [{
921
- type: Injectable,
922
- args: [{
923
- providedIn: 'root'
924
- }]
925
- }], ctorParameters: () => [{ type: i1.DynamicComponentService }, { type: i2.ApiService }, { type: i3.LogService }, { type: i4.BarsaDialogService }, { type: i0.Compiler }, { type: i5.Router }, { type: i6.Location }, { type: i7.LocalStorageService }, { type: Document, decorators: [{
926
- type: Inject,
927
- args: [DOCUMENT]
928
- }] }] });
929
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydGFsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1ub3Zpbi1yYXktY29yZS9zcmMvbGliL3NlcnZpY2VzL3BvcnRhbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHSCxNQUFNLEVBQ04sVUFBVSxFQUVWLGVBQWUsRUFHbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFFBQVEsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRXJELE9BQU8sRUFBYyxlQUFlLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUcsT0FBTyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBQ0gsU0FBUyxFQUNULFFBQVEsRUFDUixhQUFhLEVBQ2IsUUFBUSxFQUNSLFVBQVUsRUFDVixvQkFBb0IsRUFDcEIsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ1QsTUFBTSxnQkFBZ0IsQ0FBQztBQWN4QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHekQsT0FBTyxFQUNILHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixjQUFjLEVBQ2QsV0FBVyxFQUNkLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7OztBQVcxQyxNQUFNLE9BQU8sYUFBYTtJQTJDdEIsWUFDWSxHQUE0QixFQUM1QixVQUFzQixFQUN0QixVQUFzQixFQUN0QixhQUFpQyxFQUNqQyxRQUFrQixFQUNsQixPQUFlLEVBQ2YsU0FBbUIsRUFDbkIsYUFBa0MsRUFDaEIsU0FBbUI7UUFS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QUFPLEtBQUssT0FBTyxTQUFTLEVBQUUsQ0FBQztvQkFDdEMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekIsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQzthQUFNLENBQUM7WUFDSixPQUFPLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ2pDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2pELENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7K0dBdmlDUSxhQUFhLHdQQW9EVixRQUFRO21IQXBEWCxhQUFhLGNBRlYsTUFBTTs7NEZBRVQsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7OzBCQXFEUSxNQUFNOzJCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBpbGVyLFxuICAgIENvbXBvbmVudFJlZixcbiAgICBJbmplY3QsXG4gICAgSW5qZWN0YWJsZSxcbiAgICBJbmplY3RvcixcbiAgICBOZ01vZHVsZUZhY3RvcnksXG4gICAgVHlwZSxcbiAgICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRE9DVU1FTlQsIExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBOYXZpZ2F0aW9uRW5kLCBOYXZpZ2F0aW9uU3RhcnQsIFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0LCBvZiwgZnJvbSwgZm9ya0pvaW4sIGZyb21FdmVudCwgU3ViamVjdCwgY29tYmluZUxhdGVzdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgICB0YXAsXG4gICAgbWFwLFxuICAgIGNvbmNhdE1hcCxcbiAgICBmaW5hbGl6ZSxcbiAgICBwdWJsaXNoUmVwbGF5LFxuICAgIHJlZkNvdW50LFxuICAgIGV4aGF1c3RNYXAsXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gICAgc3RhcnRXaXRoLFxuICAgIGRlYm91bmNlVGltZSxcbiAgICBmaWx0ZXJcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICAgIEFiYnJldmF0aW9uRGV2aWNlU2l6ZSxcbiAgICBMb2dpblJlc3VsdCxcbiAgICBNZXRhb2JqZWN0RGF0YU1vZGVsLFxuICAgIE1vRm9yUmVwb3J0TW9kZWwsXG4gICAgUGFnZURhdGFNb2RlbCxcbiAgICBQb3J0YWxEYXRhTW9kZWwsXG4gICAgUmVwb3J0TW9kZWwsXG4gICAgVWx2UGFyYW1UeXBlXG59IGZyb20gJy4uL2Fic3RyYWN0LWNsYXNzZXMvbW9kZWxzJztcbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICcuL2FwaS5zZXJ2aWNlJztcbmltcG9ydCB7IExvZ1NlcnZpY2UgfSBmcm9tICcuL2xvZy5zZXJ2aWNlJztcbmltcG9ydCB7IEJhcnNhQXBpIH0gZnJvbSAnLi4vYWJzdHJhY3QtY2xhc3Nlcy9iYXJzYS1hcGknO1xuaW1wb3J0IHsgQmFyc2FEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi9iYXJzYS1kaWFsb2cuc2VydmljZSc7XG5cbmltcG9ydCB7XG4gICAgRXhlY3V0ZUR5bmFtaWNDb21tYW5kLFxuICAgIGdldENvbXBvbmVudERlZmluZWQsXG4gICAgZ2V0RGV2aWNlSXNNb2JpbGUsXG4gICAgZ2V0RGV2aWNlSXNUYWJsZXQsXG4gICAgZ2V0SGVhZGVyVmFsdWUsXG4gICAgZ2V0VW5pcXVlSWRcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFBvcnRhbFBhZ2VSZXNvbHZlciB9IGZyb20gJy4uL3Jlc29sdmVycy9wb3J0YWwtcGFnZS5yZXNvbHZlcic7XG5pbXBvcnQgeyBBdXRoR3VhcmQgfSBmcm9tICcuLi9hdXRoLWd1YXJkJztcbmltcG9ydCB7IER5bmFtaWNDb21wb25lbnRTZXJ2aWNlIH0gZnJvbSAnLi9keW5hbWljLWNvbXBvbmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhZmVSZXNvdXJjZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgTG9jYWxTdG9yYWdlU2VydmljZSB9IGZyb20gJy4vbG9jYWwtc3RvcmFnZS5zZXJ2aWNlJztcblxuZGVjbGFyZSBsZXQgQWpheEhlbHBlcjogYW55O1xuZGVjbGFyZSBsZXQgQWpheEhlbHBlcjI6IGFueTtcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQb3J0YWxTZXJ2aWNlIHtcbiAgICBwdWJsaWMgb2Zmc2V0VG9wID0gMDtcblxuICAgIGxvZ2luTG9hZGluZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgbG9hZGVkID0gZmFsc2U7XG4gICAgZm9ybVBhbmVsczogYW55ID0ge307XG4gICAgY2FjaGVkSW1hZ2VzOiBhbnkgPSB7fTtcbiAgICBkYXRlVGV4dCQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgICBkZWZhdWx0Um91dGU6IHN0cmluZztcbiAgICBjYWNoZWRQYWdlRGF0YTogeyBba2V5OiBzdHJpbmddOiBPYnNlcnZhYmxlPFBhZ2VEYXRhTW9kZWw+IH0gPSB7fTtcbiAgICBwYWdlczogUGFnZURhdGFNb2RlbFtdID0gW107XG4gICAgcnRsU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgICB1c2VyTG9nZ2VkSW4kOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIGRpY3Rpb25hcnk6IHsgW2tleTogc3RyaW5nXTogQmVoYXZpb3JTdWJqZWN0PGFueT4gfSA9IHt9O1xuICAgIHBvcnRhbERhdGFTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFBvcnRhbERhdGFNb2RlbCB8IG51bGw+KG51bGwpO1xuICAgIHBvcnRhbFNldHRpbmdzJDogT2JzZXJ2YWJsZTxNZXRhb2JqZWN0RGF0YU1vZGVsPjtcbiAgICBwb3J0YWxEYXRhJDogT2JzZXJ2YWJsZTxQb3J0YWxEYXRhTW9kZWwgfCBudWxsPjtcbiAgICBkZXZpY2VTaXplJDogT2JzZXJ2YWJsZTxBYmJyZXZhdGlvbkRldmljZVNpemU+O1xuICAgIHJ0bCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgZGlyVmFsdWUkOiBPYnNlcnZhYmxlPCdydGwnIHwgJ2x0cic+O1xuICAgIHJvdXRlSW5pdGlhbGl6ZWQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIG9wZW5Gb3JtJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgX2lzQW5vbnVtb3VzU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgICBfcHVzaEFjdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHsgbm90aWZpY2F0aW9uVGFnOiBzdHJpbmc7IGFjdGlvbjogc3RyaW5nOyBtb2lkOiBzdHJpbmc7IHRwaWQ6IHN0cmluZyB9IHwgbnVsbD4oXG4gICAgICAgIG51bGxcbiAgICApO1xuICAgIHByaXZhdGUgX2RldmljZVNpemVTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFiYnJldmF0aW9uRGV2aWNlU2l6ZT4odGhpcy5faW5pdGFsaXplRGV2aWNlU2l6ZSgpKTtcbiAgICBwcml2YXRlIF9sb2dnZWRJblNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIHByaXZhdGUgcm91dGVJbml0aWFsaXplZFNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIHByaXZhdGUgZGF0ZVRleHRTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuICAgIHByaXZhdGUgX25hdmlnYXRpb25TdGFydCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE5hdmlnYXRpb25TdGFydCB8IG51bGw+KG51bGwpO1xuICAgIHByaXZhdGUgX25hdmlnYXRpb25FbmQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxOYXZpZ2F0aW9uRW5kIHwgbnVsbD4obnVsbCk7XG4gICAgcHJpdmF0ZSBfdXNlclBvcnRhbFNldHRpbmdzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UmVjb3JkPHN0cmluZywgTWV0YW9iamVjdERhdGFNb2RlbD4+KHt9KTtcbiAgICBwcml2YXRlIF9jc3NVcmxTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNhZmVSZXNvdXJjZVVybCB8IG51bGw+KG51bGwpO1xuICAgIHByaXZhdGUgX2Nzc1ZhcmlhYmxlVXJsU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTYWZlUmVzb3VyY2VVcmwgfCBudWxsPihudWxsKTtcbiAgICBwcml2YXRlIF9jc3NDdXN0b21VcmxTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNhZmVSZXNvdXJjZVVybCB8IG51bGw+KG51bGwpO1xuICAgIHByaXZhdGUgX3NlYXJjaFRlcm0kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgICBwcml2YXRlIF93aW5kb3dSZXNpemUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBwcml2YXRlIF9kZXZpY2VMYW5kc2NhcGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPighd2luZG93Lm1hdGNoTWVkaWEoJyhvcmllbnRhdGlvbjogcG9ydHJhaXQpJykubWF0Y2hlcyk7XG4gICAgcHJpdmF0ZSBfc3RhbmRhbG9uZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHdpbmRvdy5tYXRjaE1lZGlhKCcoZGlzcGxheS1tb2RlOiBzdGFuZGFsb25lKScpLm1hdGNoZXMpO1xuICAgIHByaXZhdGUgX2RvY3VtZW50VmlzaWJpbGl0eWNoYW5nZSQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICAgIERlZmF1bHRQYWdlOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBkY206IER5bmFtaWNDb21wb25lbnRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGFwaVNlcnZpY2U6IEFwaVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbG9nU2VydmljZTogTG9nU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlOiBCYXJzYURpYWxvZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY29tcGlsZXI6IENvbXBpbGVyLFxuICAgICAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSBfbG9jYXRpb246IExvY2F0aW9uLFxuICAgICAgICBwcml2YXRlIF9sb2NhbFN0b3JhZ2U6IExvY2FsU3RvcmFnZVNlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50OiBEb2N1bWVudFxuICAgICkge1xuICAgICAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgICAgICAgdGhpcy5faW5pdExhbmRzY2FwZSgpO1xuICAgICAgICB0aGlzLl9pbml0U3RhbmRhbG9uZSgpO1xuICAgICAgICB0aGlzLl9pbml0VmlzaWJpbGl0eUNoYW5nZSgpO1xuICAgICAgICB0aGlzLl9pbml0UHVzaEFjdGlvbnMoKTtcbiAgICB9XG5cbiAgICBnZXQgdXNlckxvZ2dlZEluKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9nZ2VkSW5Tb3VyY2UuZ2V0VmFsdWUoKTtcbiAgICB9XG4gICAgZ2V0IHB1c2hBY3Rpb24kKCk6IE9ic2VydmFibGU8eyBub3RpZmljYXRpb25UYWc6IHN0cmluZzsgbW9pZDogc3RyaW5nOyB0cGlkOiBzdHJpbmc7IGFjdGlvbjogc3RyaW5nIH0gfCBudWxsPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoQWN0aW9uJC5hc09ic2VydmFibGUoKS5waXBlKCk7XG4gICAgfVxuICAgIGdldCBkb2N1bWVudFZpc2liaWxpdHljaGFuZ2UkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZG9jdW1lbnRWaXNpYmlsaXR5Y2hhbmdlJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG4gICAgZ2V0IGlzU3RhbmRhbG9uZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YW5kYWxvbmUkLmdldFZhbHVlKCk7XG4gICAgfVxuICAgIGdldCBzdGFuZGFsb25lJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YW5kYWxvbmUkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cbiAgICBnZXQgbGFuZHNjYXBlJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RldmljZUxhbmRzY2FwZSQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuICAgIGdldCB3aW5kb3dSZXNpemUkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2luZG93UmVzaXplJC5hc09ic2VydmFibGUoKS5waXBlKGRlYm91bmNlVGltZSgzMDApKTtcbiAgICB9XG4gICAgZ2V0IHBvcnRhbERhdGEoKTogUG9ydGFsRGF0YU1vZGVsIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvcnRhbERhdGFTb3VyY2UuZ2V0VmFsdWUoKTtcbiAgICB9XG4gICAgZ2V0IHNlYXJjaFRlcm0kKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWFyY2hUZXJtJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG4gICAgZ2V0IGNzc1VybCQoKTogT2JzZXJ2YWJsZTxTYWZlUmVzb3VyY2VVcmwgfCBudWxsPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jc3NVcmxTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcbiAgICB9XG4gICAgZ2V0IGNzc1ZhcmlhYmxlVXJsJCgpOiBPYnNlcnZhYmxlPFNhZmVSZXNvdXJjZVVybCB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nzc1ZhcmlhYmxlVXJsU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gICAgfVxuICAgIGdldCBjc3NDdXN0b21VcmwkKCk6IE9ic2VydmFibGU8U2FmZVJlc291cmNlVXJsIHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3NzQ3VzdG9tVXJsU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cbiAgICBnZXQgdXNlclBvcnRhbFNldHRpbmdzKCk6IFJlY29yZDxzdHJpbmcsIE1ldGFvYmplY3REYXRhTW9kZWw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJQb3J0YWxTZXR0aW5ncyQuZ2V0VmFsdWUoKTtcbiAgICB9XG4gICAgZ2V0IHVzZXJQb3J0YWxTZXR0aW5ncyQoKTogT2JzZXJ2YWJsZTxSZWNvcmQ8c3RyaW5nLCBNZXRhb2JqZWN0RGF0YU1vZGVsPj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXNlclBvcnRhbFNldHRpbmdzJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG4gICAgZ2V0IGRldmljZVNpemUoKTogQWJicmV2YXRpb25EZXZpY2VTaXplIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RldmljZVNpemVTb3VyY2UuZ2V0VmFsdWUoKTtcbiAgICB9XG4gICAgZ2V0IGlzQW5vbnltb3VzJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzQW5vbnVtb3VzU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cbiAgICBnZXQgbmF2aWdhdGlvbkVuZCQoKTogT2JzZXJ2YWJsZTxOYXZpZ2F0aW9uRW5kIHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmF2aWdhdGlvbkVuZCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuICAgIGdldCBuYXZpZ2F0aW9uU3RhcnQkKCk6IE9ic2VydmFibGU8TmF2aWdhdGlvblN0YXJ0IHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmF2aWdhdGlvblN0YXJ0JC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZE1vKGlkOiBzdHJpbmcsIHR5cGVkZWZJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5sb2FkUG9ydGFsUGFnZURhdGEoaWQsIHR5cGVkZWZJZCk7XG4gICAgfVxuICAgIHB1c2hBY3Rpb25OZXh0KHB1c2hBY3Rpb246IHsgbm90aWZpY2F0aW9uVGFnOyBtb2lkOyB0cGlkOyBhY3Rpb24gfSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9sb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncHVzaEFjdGlvbicsIEpTT04uc3RyaW5naWZ5KHB1c2hBY3Rpb24pKTtcbiAgICAgICAgdGhpcy5fcHVzaEFjdGlvbiQubmV4dChwdXNoQWN0aW9uKTtcbiAgICB9XG4gICAgc2V0U2VhcmNoVGVybSh0ZXJtOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc2VhcmNoVGVybSQubmV4dCh0ZXJtKTtcbiAgICB9XG4gICAgd2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl93aW5kb3dSZXNpemUkLm5leHQoKTtcbiAgICB9XG4gICAgbmF2aWF0aW9uRW5kKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX25hdmlnYXRpb25FbmQkLm5leHQoZXZlbnQpO1xuICAgIH1cbiAgICBuYXZpYXRpb25TdGFydChldmVudDogTmF2aWdhdGlvblN0YXJ0KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX25hdmlnYXRpb25TdGFydCQubmV4dChldmVudCk7XG4gICAgfVxuICAgIHNldFVzZXJQb3J0YWxTZXR0aW5ncyh1c2VyUG9ydGFsU2V0dGluZ3M6IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl91c2VyUG9ydGFsU2V0dGluZ3MkLmdldFZhbHVlKCk7XG4gICAgICAgIGlmICh1c2VyUG9ydGFsU2V0dGluZ3MuJFR5cGVEZWZOYW1lKSB7XG4gICAgICAgICAgICB2YWx1ZVt1c2VyUG9ydGFsU2V0dGluZ3MuJFR5cGVEZWZOYW1lXSA9IHVzZXJQb3J0YWxTZXR0aW5ncztcbiAgICAgICAgICAgIHRoaXMuX3VzZXJQb3J0YWxTZXR0aW5ncyQubmV4dCh7IC4uLnZhbHVlIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldENzc1VybFRoZW1lKHRoZW1lVXJsOiBTYWZlUmVzb3VyY2VVcmwsIGNzc1ZhcmlhYmxlVXJsPzogU2FmZVJlc291cmNlVXJsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2Nzc1VybFNvdXJjZS5uZXh0KHRoZW1lVXJsKTtcbiAgICAgICAgdGhpcy5fY3NzQ3VzdG9tVXJsU291cmNlLm5leHQodGhlbWVVcmwpO1xuICAgICAgICBpZiAoY3NzVmFyaWFibGVVcmwpIHtcbiAgICAgICAgICAgIHRoaXMuX2Nzc1ZhcmlhYmxlVXJsU291cmNlLm5leHQoY3NzVmFyaWFibGVVcmwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0RGF0YShrZXksIGRhdGEpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmRpY3Rpb25hcnlba2V5XSkge1xuICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJ5W2tleV0gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oZGF0YSk7XG4gICAgICAgICAgICB0aGlzLmRpY3Rpb25hcnlba2V5XS5uZXh0KGRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgb2xkVmFsID0gdGhpcy5kaWN0aW9uYXJ5W2tleV0uZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGlmIChvbGRWYWwgIT09IGRhdGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpY3Rpb25hcnlba2V5XS5uZXh0KGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGdldERhdGEoa2V5LCBkZWZhdWx0VmFsdWU6IGFueSA9IG51bGwpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBpZiAoIXRoaXMuZGljdGlvbmFyeVtrZXldKSB7XG4gICAgICAgICAgICB0aGlzLmRpY3Rpb25hcnlba2V5XSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihkZWZhdWx0VmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3Rpb25hcnlba2V5XS5hc09ic2VydmFibGUoKTtcbiAgICB9XG4gICAgZ2V0RGF0YVN5bmM8VD4oa2V5LCBkZWZhdWx0VmFsdWU6IGFueSA9IG51bGwpOiBUIHwgbnVsbCB7XG4gICAgICAgIGlmICghdGhpcy5kaWN0aW9uYXJ5W2tleV0pIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGljdGlvbmFyeVtrZXldLmdldFZhbHVlKCk7XG4gICAgfVxuICAgIGNyZWF0ZUZvclJlcG9ydChuYXZJdGVtKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIGZyb20oXG4gICAgICAgICAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgQmFyc2FBcGkuVWwuVWx2TWFpbkN0cmxyLkNyZWF0ZUZvclJlcG9ydCh7fSwgbmF2SXRlbSwgKGVyciwgcmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbiAgICByZW5kZXJVbHZNYWluVWkoXG4gICAgICAgIG5hdkl0ZW0sXG4gICAgICAgIHZjcjogVmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBpc1JlcG9ydFBhZ2U6IGJvb2xlYW4gPSBmYWxzZVxuICAgICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUZvclJlcG9ydChuYXZJdGVtKS5waXBlKFxuICAgICAgICAgICAgZXhoYXVzdE1hcCgodWx2TWFpbkN0cmxyKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VWx2TWFpblVpQ29tcG9uZW50KHVsdk1haW5DdHJsci5BZGFwdGVyLkNvbnRyb2wsIGluamVjdG9yLCBpc1JlcG9ydFBhZ2UpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRhcCgodWx2TWFuaVVpQ29tcG9uZW50KSA9PiB2Y3IuaW5zZXJ0KHVsdk1hbmlVaUNvbXBvbmVudC5ob3N0VmlldykpLFxuICAgICAgICAgICAgICAgICAgICBtYXAoKCkgPT4gdWx2TWFpbkN0cmxyKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZ2V0VWx2TWFpblVpQ29tcG9uZW50KGN1c3RvbVVsdk1haW5VaSwgaW5qZWN0b3I6IEluamVjdG9yLCBpc1JlcG9ydFBhZ2UpOiBPYnNlcnZhYmxlPENvbXBvbmVudFJlZjxhbnk+PiB7XG4gICAgICAgIGNvbnN0IGN1c3RvbVVpU2V0dGluZyA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGN1c3RvbVVsdk1haW5VaS5TZXR0aW5nLCAnQ3VzdG9tVWknLCBudWxsKTtcbiAgICAgICAgY29uc3QgeyBtb2R1bGVOYW1lLCBtb2R1bGVQYXRoLCBjb21wb25lbnROYW1lLCBzZWxlY3RvciB9ID0gZ2V0Q29tcG9uZW50RGVmaW5lZChcbiAgICAgICAgICAgIGN1c3RvbVVsdk1haW5VaSxcbiAgICAgICAgICAgIGN1c3RvbVVpU2V0dGluZ1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRDb21wb25lbnQobW9kdWxlTmFtZSwgbW9kdWxlUGF0aCwgY29tcG9uZW50TmFtZSwgc2VsZWN0b3IsIGluamVjdG9yKS5waXBlKFxuICAgICAgICAgICAgbWFwKChjb21wb25lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRJbnN0YW5jZSA9IGNvbXBvbmVudC5pbnN0YW5jZTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5pZCA9IGN1c3RvbVVsdk1haW5VaS5pZDtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5jb250ZXh0ID0gY3VzdG9tVWx2TWFpblVpO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudEluc3RhbmNlLmlzUmVwb3J0UGFnZSA9IGlzUmVwb3J0UGFnZTtcbiAgICAgICAgICAgICAgICBjdXN0b21VbHZNYWluVWkuY29udHJvbFVpID0gY29tcG9uZW50SW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuICAgIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGV2aWNlU2l6ZSQgPSB0aGlzLl9kZXZpY2VTaXplU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICB0aGlzLnBvcnRhbERhdGEkID0gdGhpcy5wb3J0YWxEYXRhU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICB0aGlzLnJ0bCQgPSB0aGlzLnJ0bFNvdXJjZS5hc09ic2VydmFibGUoKTtcbiAgICAgICAgdGhpcy51c2VyTG9nZ2VkSW4kID0gdGhpcy5fbG9nZ2VkSW5Tb3VyY2VcbiAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAgICAgLnBpcGUobWFwKChpc0xvZ2dlZEluKSA9PiBpc0xvZ2dlZEluICYmIEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuSXNBbm9ueW1vdXMgPT09IGZhbHNlKSk7XG4gICAgICAgIHRoaXMuZGlyVmFsdWUkID0gdGhpcy5ydGwkLnBpcGUobWFwKChpc1J0bCkgPT4gKGlzUnRsID8gJ3J0bCcgOiAnbHRyJykpKTtcbiAgICAgICAgdGhpcy5yb3V0ZUluaXRpYWxpemVkJCA9IHRoaXMucm91dGVJbml0aWFsaXplZFNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgICAgICB0aGlzLl9zdGFuZGFsb25lJC5hc09ic2VydmFibGUoKS5zdWJzY3JpYmUoKGMpID0+IHtcbiAgICAgICAgICAgIGlmIChjKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdzdGFuZGFsb25lJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnbm9TdGFuZGFsb25lJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9kZXZpY2VMYW5kc2NhcGUkLmFzT2JzZXJ2YWJsZSgpLnN1YnNjcmliZSgoYykgPT4ge1xuICAgICAgICAgICAgaWYgKGMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ2xhbmRzY2FwZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fZGV2aWNlU2l6ZVNvdXJjZS5hc09ic2VydmFibGUoKS5zdWJzY3JpYmUoKGMpID0+IHtcbiAgICAgICAgICAgIGlmIChjID09PSAncycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ3NtYWxsZGV2aWNlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRhdGVUZXh0JCA9IHRoaXMuZGF0ZVRleHRTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgIHRoaXMucG9ydGFsU2V0dGluZ3MkID0gdGhpcy5wb3J0YWxEYXRhU291cmNlXG4gICAgICAgICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgICAgIC5waXBlKG1hcCgocG9ydGFsRGF0YSkgPT4gKHBvcnRhbERhdGEgPyBwb3J0YWxEYXRhLlBvcnRhbFNldHRpbmdzIDogKHt9IGFzIGFueSkpKSk7XG4gICAgICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKVxuICAgICAgICAgICAgLnBpcGUoc3RhcnRXaXRoKG51bGwpLCBkZWJvdW5jZVRpbWUoMTAwMCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2luZG93UmVzaXplJC5uZXh0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0RGV2aWNlU2l6ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuICAgIF9zZXREZXZpY2VTaXplKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBkZXZpY2VTaXplID0gdGhpcy5faW5pdGFsaXplRGV2aWNlU2l6ZSgpO1xuICAgICAgICB0aGlzLl9kZXZpY2VTaXplU291cmNlLm5leHQoZGV2aWNlU2l6ZSk7XG4gICAgfVxuICAgIF9pbml0YWxpemVEZXZpY2VTaXplKCk6IEFiYnJldmF0aW9uRGV2aWNlU2l6ZSB7XG4gICAgICAgIGNvbnN0IF9pc21vYmlsZSA9IGdldERldmljZUlzTW9iaWxlKCk7XG4gICAgICAgIGlmIChfaXNtb2JpbGUpIHtcbiAgICAgICAgICAgIEJhcnNhQXBpLkJ3LklzTW9iaWxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBfaXNUYWJsZXQgPSBnZXREZXZpY2VJc1RhYmxldCgpO1xuICAgICAgICBsZXQgX3dpbmRvV1NpemU6IEFiYnJldmF0aW9uRGV2aWNlU2l6ZSA9ICdzJztcbiAgICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDw9IDYwMCkge1xuICAgICAgICAgICAgX3dpbmRvV1NpemUgPSAncyc7XG4gICAgICAgIH0gZWxzZSBpZiAod2luZG93LmlubmVyV2lkdGggPiA2MDAgJiYgd2luZG93LmlubmVyV2lkdGggPD0gOTkyKSB7XG4gICAgICAgICAgICBfd2luZG9XU2l6ZSA9ICdtJztcbiAgICAgICAgfSBlbHNlIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA+IDk5MiAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8PSAxMjAwKSB7XG4gICAgICAgICAgICBfd2luZG9XU2l6ZSA9ICdsJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF93aW5kb1dTaXplID0gJ3hsJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoX2lzbW9iaWxlICYmIF93aW5kb1dTaXplICE9PSAnbCcgJiYgX3dpbmRvV1NpemUgIT09ICd4bCcgJiYgX3dpbmRvV1NpemUgIT09ICdtJykge1xuICAgICAgICAgICAgcmV0dXJuICdzJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoX2lzVGFibGV0ICYmIF93aW5kb1dTaXplICE9PSAnbCcgJiYgX3dpbmRvV1NpemUgIT09ICd4bCcpIHtcbiAgICAgICAgICAgIHJldHVybiAnbSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF93aW5kb1dTaXplO1xuICAgIH1cbiAgICBjb21waWxlTW9kdWxlKGRlcGVuZGVuY3k6IExpYnJhcnlEZXBlbmVjeSk6IE9ic2VydmFibGU8TmdNb2R1bGVGYWN0b3J5PGFueT4+IHtcbiAgICAgICAgY29uc3QgbW9kdWxlJCA9IHRoaXMuZ2V0TW9kdWxlKGRlcGVuZGVuY3kpO1xuICAgICAgICByZXR1cm4gbW9kdWxlJC5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKChtb2R1bGVzKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlRmFjdG9yeSA9IHRoaXMuZ2V0TmdNb2R1bGVGYWN0b3J5KG1vZHVsZXMsIGRlcGVuZGVuY3kubmFtZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKG1vZHVsZUZhY3RvcnkpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZ2V0TW9kdWxlKGRlcGVuZGVuY3k6IExpYnJhcnlEZXBlbmVjeSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHsgbmFtZSwga2ViYWJOYW1lLCB1bWQsIGV4cG9ydEFzIH0gPSBkZXBlbmRlbmN5O1xuICAgICAgICBjb25zdCBiYXNlID0gYC9hc3NldHMvbW9kdWxlcy8ke2tlYmFiTmFtZX0vYnVuZGxlc2A7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLmFiYztcbiAgICAgICAgY29uc3QgcGF0aCA9IGAke2Jhc2V9LyR7a2ViYWJOYW1lfS51bWQuanM/dD0ke2RhdGV9YDtcbiAgICAgICAgcmV0dXJuIG9mKHRydWUpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vZHVsZXMgPSB0aGlzLmdldFJlZ2lzdGVyZWRNb2R1bGVzKHVtZCwgZXhwb3J0QXMsIG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChtb2R1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihtb2R1bGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZEpzJChwYXRoKS5waXBlKG1hcCgoKSA9PiB0aGlzLmdldFJlZ2lzdGVyZWRNb2R1bGVzKHVtZCwgZXhwb3J0QXMsIG5hbWUpKSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHNldFZhbHVlT25PYmplY3QocGF0aCwgaW5kZXgsIG1vZHVsZXMsIG9iamVjdCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzcGxpdGVkID0gcGF0aC5zcGxpdCgnLicpO1xuICAgICAgICBjb25zdCBwcm9wID0gc3BsaXRlZFtpbmRleF07XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0W3Byb3BdID09PSB0eXBlb2YgdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvYmplY3RbcHJvcF0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXggPT09IHNwbGl0ZWQubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgb2JqZWN0W3Byb3BdID0gbW9kdWxlcztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFZhbHVlT25PYmplY3QocGF0aCwgaW5kZXggKyAxLCBtb2R1bGVzLCBvYmplY3RbcHJvcF0pO1xuICAgIH1cblxuICAgIGdldENvbXBvbmVudChcbiAgICAgICAgbW9kdWxlTmFtZTogc3RyaW5nLFxuICAgICAgICBtb2R1bGVQYXRoOiBzdHJpbmcsXG4gICAgICAgIGNvbXBvbmVudE5hbWU6IHN0cmluZyxcbiAgICAgICAgc2VsZWN0b3I6IHN0cmluZyxcbiAgICAgICAgcGFyZW50SW5qZWN0b3I6IEluamVjdG9yXG4gICAgKTogT2JzZXJ2YWJsZTxDb21wb25lbnRSZWY8YW55Pj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kY20uZ2V0Q29tcG9uZW50QnlTZWxlY3RvcihzZWxlY3RvciwgbW9kdWxlTmFtZSwgcGFyZW50SW5qZWN0b3IpO1xuICAgIH1cbiAgICBsb2FkSnMkKHBhdGgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gZnJvbShcbiAgICAgICAgICAgIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dC9qYXZhc2NyaXB0Jyk7XG4gICAgICAgICAgICAgICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgnc3JjJywgcGF0aCk7XG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShwYXRoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgfSwgNTAwMCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbiAgICBSZXBvcnRFeGVjdXRlQnlJZChyZXBvcnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxNb0ZvclJlcG9ydE1vZGVsPiB7XG4gICAgICAgIGNvbnN0IHVsdlBhcmFtcyA9IHRoaXMuX2dldFVsdlBhcmFtc0J5KCcnLCByZXBvcnRJZCk7XG4gICAgICAgIHJldHVybiBmcm9tKHRoaXMuX3JlcG9ydEV4ZWN1dGVQcm9taXNlKHVsdlBhcmFtcykpO1xuICAgIH1cbiAgICBSZXBvcnRFeGVjdXRlKHJlcG9ydE5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8TW9Gb3JSZXBvcnRNb2RlbD4ge1xuICAgICAgICByZXR1cm4gZnJvbSh0aGlzLlJlcG9ydEV4ZWN1dGVQcm9taXNlKHJlcG9ydE5hbWUpKTtcbiAgICB9XG4gICAgUmVwb3J0RXhlY3V0ZVByb21pc2UocmVwb3J0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxNb0ZvclJlcG9ydE1vZGVsPiB7XG4gICAgICAgIGNvbnN0IHVsdlBhcmFtcyA9IHRoaXMuX2dldFVsdlBhcmFtc0J5KHJlcG9ydE5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVwb3J0RXhlY3V0ZVByb21pc2UodWx2UGFyYW1zKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfZ2V0VWx2UGFyYW1zQnkocmVwb3J0TmFtZTogc3RyaW5nLCByZXBvcnRJZD86IHN0cmluZyk6IFVsdlBhcmFtVHlwZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBGbGFnczoge1xuICAgICAgICAgICAgICAgIERhdGE6ICdUcnVlJyxcbiAgICAgICAgICAgICAgICBFeHRyYTogJ0ZhbHNlJyxcbiAgICAgICAgICAgICAgICBTZWFyY2g6ICdGYWxzZScsXG4gICAgICAgICAgICAgICAgVmlldzogJ0ZhbHNlJ1xuICAgICAgICAgICAgICAgIC8vIEdlbmVyYWw6XCJGYWxzZVwiLCAvLyB1bHZtYWluY3RybCBkb2VzIG5vdCBjcmFldGUgdWkgY29udHJvbCByYWlzZSBlcnJvclxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFJlcG9ydE5hbWU6IHJlcG9ydE5hbWUsXG4gICAgICAgICAgICBSZXBvcnRJZDogcmVwb3J0SWQsXG4gICAgICAgICAgICBVc2FnZUVudW06ICdTeXN0ZW1Db250YWluZXInXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVwb3J0RXhlY3V0ZVByb21pc2UodWx2UGFyYW1zOiBVbHZQYXJhbVR5cGUpOiBQcm9taXNlPE1vRm9yUmVwb3J0TW9kZWw+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPE1vRm9yUmVwb3J0TW9kZWw+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIEJhcnNhQXBpLkJ3LkV4ZWN1dGVSZXBvcnQoXG4gICAgICAgICAgICAgICAgeyB1bHZQYXJhbXMgfSxcbiAgICAgICAgICAgICAgICAocmVzdWx0OiBSZXBvcnRNb2RlbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdC5EYXRhKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWRkRm9ybVBhbmVsQ3RybHIoaWQsIGZvcm1wYW5lbEN0cmxyOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb3JtUGFuZWxzW2lkXSA9IGZvcm1wYW5lbEN0cmxyO1xuICAgIH1cbiAgICBzZXRVc2VyTG9naW5TdGF0dXMoc3RhdHVzOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2xvZ2dlZEluU291cmNlLm5leHQoc3RhdHVzKTtcbiAgICB9XG4gICAgZXh0cmFjdEFsbFBhZ2VzKHBvcnRhbERhdGE6IFBvcnRhbERhdGFNb2RlbCB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFwb3J0YWxEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcG9ydGFsRGF0YS5DaGlsZFBhZ2VMaXN0Lk1vRGF0YUxpc3QuZm9yRWFjaCgocGFnZURhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGRQYWdlcyhwYWdlRGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBleHRyYWN0QWxsUGFnZXNfT2xkKHBvcnRhbERhdGE6IFBvcnRhbERhdGFNb2RlbCB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFwb3J0YWxEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLl9yb3V0ZXIuY29uZmlnO1xuICAgICAgICBwb3J0YWxEYXRhLkNoaWxkUGFnZUxpc3QuTW9EYXRhTGlzdC5mb3JFYWNoKChwYWdlRGF0YSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF0aCA9IHBhZ2VEYXRhLlJvdXRlLnJlcGxhY2UoJy8nLCAnJyk7XG4gICAgICAgICAgICBjb25maWcucHVzaChcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVJvdXRlKHBhZ2VEYXRhLCBwYXRoLCBwYWdlRGF0YS5IYXNBdXRob3JpemUsIHBhZ2VEYXRhLlBhZ2VNb2R1bGU/LiRDYXB0aW9uLCBudWxsLCBudWxsKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChwYWdlRGF0YS5Jc0RlZmF1bHRSb3V0ZSB8fCBwYWdlRGF0YS5Jc0RlZmF1bHRSb3V0ZSA9PT0gJ1RydWUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0Um91dGUgPSBwYXRoO1xuICAgICAgICAgICAgICAgIGNvbmZpZy5wdXNoKHRoaXMuY3JlYXRlUm91dGUocGFnZURhdGEsICcnLCBmYWxzZSwgcG9ydGFsRGF0YS5QYWdlTW9kdWxlPy4kQ2FwdGlvbiwgcGF0aCwgbnVsbCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmFkZENoaWxkUGFnZXMocGFnZURhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fcm91dGVyLnJlc2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICAgIGlmICh0aGlzLl9sb2NhdGlvbi5wYXRoKCkgPT09ICcnKSB7XG4gICAgICAgICAgICAvLyB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW3RoaXMuZGVmYXVsdFJvdXRlXSk7XG4gICAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoWycnXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhpcy5yb3V0ZUluaXRpYWxpemVkKCk7XG4gICAgfVxuICAgIHNzb0xvZ2luKCk6IHZvaWQge1xuICAgICAgICBBamF4SGVscGVyLkFqYXhSZXF1ZXN0KFxuICAgICAgICAgICAgJy9hcGkvYmFzZS9zc29sb2dpbicsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBhbGVydCgnZXJyb3IgaW4gc3NvIGxvZ2luLicpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgc3NvTG9nb3V0KCk6IHZvaWQge1xuICAgICAgICBBamF4SGVscGVyLkFqYXhSZXF1ZXN0KFxuICAgICAgICAgICAgJy9hcGkvYmFzZS9zc29sb2dvdXQnLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYWxlcnQoJ2Vycm9yIGluIHNzbyBsb2dvdXQuJyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgIH1cbiAgICBhZGRDaGlsZFBhZ2VzKHBhZ2VEYXRhOiBQYWdlRGF0YU1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGFnZXMucHVzaChwYWdlRGF0YSk7XG4gICAgICAgIGlmICghcGFnZURhdGEuQ2hpbGRQYWdlTGlzdD8uTW9EYXRhTGlzdD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcGFnZURhdGEuQ2hpbGRQYWdlTGlzdC5Nb0RhdGFMaXN0LmZvckVhY2goKGNoaWxkUGFnZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hZGRDaGlsZFBhZ2VzKGNoaWxkUGFnZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgIGNyZWF0ZVJvdXRlKHBhZ2VEYXRhLCBwYXRoLCBoYXNBdXRob3JpemVkLCBtb2R1bGVOYW1lLCByZWRpcmVjdFRvLCBpc0R5bmFtaWNSb3V0ZSk6IFJvdXRlIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjcmVhdGVSb3V0ZTIoXG4gICAgICAgIHBhZ2VEYXRhLFxuICAgICAgICBwYXRoLFxuICAgICAgICBoYXNBdXRob3JpemVkLFxuICAgICAgICBtb2R1bGVOYW1lLFxuICAgICAgICByZWRpcmVjdFRvOiBzdHJpbmcgfCBudWxsID0gbnVsbCxcbiAgICAgICAgaXNEeW5hbWljUm91dGU6IGJvb2xlYW4gPSBmYWxzZVxuICAgICk6IFJvdXRlIHtcbiAgICAgICAgbGV0IG1vZHVsZVBhdGg6IHN0cmluZyA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLkdldEtlYmFiQ2FzZShtb2R1bGVOYW1lKTtcbiAgICAgICAgY29uc3QgdW1kID0gbW9kdWxlTmFtZTtcbiAgICAgICAgbW9kdWxlUGF0aCA9IG1vZHVsZVBhdGguc3Vic3RyaW5nKDEsIG1vZHVsZVBhdGgubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgZHluYW1pY1JvdXRlOiBSb3V0ZSA9IHt9O1xuICAgICAgICBkeW5hbWljUm91dGUucGF0aCA9IHBhdGg7XG4gICAgICAgIGR5bmFtaWNSb3V0ZS5kYXRhID0geyBwYWdlRGF0YSB9O1xuICAgICAgICBpZiAoIWlzRHluYW1pY1JvdXRlKSB7XG4gICAgICAgICAgICBkeW5hbWljUm91dGUucmVzb2x2ZSA9IHtcbiAgICAgICAgICAgICAgICBwYWdlRGF0YTogUG9ydGFsUGFnZVJlc29sdmVyXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoID09PSAnJykge1xuICAgICAgICAgICAgZHluYW1pY1JvdXRlLnBhdGhNYXRjaCA9ICdmdWxsJztcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVkaXJlY3RUbykge1xuICAgICAgICAgICAgZHluYW1pY1JvdXRlLnJlZGlyZWN0VG8gPSByZWRpcmVjdFRvO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGhhc0F1dGhvcml6ZWQpIHtcbiAgICAgICAgICAgICAgICBkeW5hbWljUm91dGUuY2FuQWN0aXZhdGUgPSBbQXV0aEd1YXJkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGR5bmFtaWNSb3V0ZS5sb2FkQ2hpbGRyZW4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwZW5kZW5jaWVzOiBMaWJyYXJ5RGVwZW5lY3lbXSA9IEpTT04ucGFyc2UocGFnZURhdGEuRGVwZW5kZW5jaWVzKTsgLy8gZXZhbChwYWdlRGF0YS5EZXBlbmRlbmNpZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VMaWJyYXJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBtb2R1bGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICBrZWJhYk5hbWU6IG1vZHVsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHVtZCxcbiAgICAgICAgICAgICAgICAgICAgZXhwb3J0QXM6IFttb2R1bGVOYW1lXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwZW5kZW5jaWVzJCA9IGZyb20oZGVwZW5kZW5jaWVzKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICBjb25jYXRNYXAoKGRlcGVuZGVuY3k6IExpYnJhcnlEZXBlbmVjeSkgPT4gdGhpcy5jb21waWxlTW9kdWxlKGRlcGVuZGVuY3kpKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKFtkZXBlbmRlbmNpZXMkXSkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuZ2V0TW9kdWxlKHBhZ2VMaWJyYXJ5KSksXG4gICAgICAgICAgICAgICAgICAgIG1hcCgobW9kdWxlcykgPT4gbW9kdWxlc1ttb2R1bGVOYW1lICsgJ01vZHVsZSddKSxcbiAgICAgICAgICAgICAgICAgICAgdGFwKCgpID0+IHRoaXMucm91dGVJbml0aWFsaXplZCgpKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGR5bmFtaWNSb3V0ZTtcbiAgICB9XG4gICAgcm91dGVJbml0aWFsaXplZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yb3V0ZUluaXRpYWxpemVkU291cmNlLm5leHQodHJ1ZSk7XG4gICAgfVxuICAgIHB1YmxpYyBsb2dpbkJ5QW5vbnltb3VzKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICB0aGlzLmxvZ2luTG9hZGluZy5uZXh0KHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLmxvZ2luUG9ydGFsKCkucGlwZShcbiAgICAgICAgICAgIG1hcCgocmVzdWx0OiBMb2dpblJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dTZXJ2aWNlLmRlYnVnKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShCYXJzYUFwaS5Mb2dpbkFjdGlvbi50b2tlbjJTdG9yYWdlS2V5LCByZXN1bHQuZGF0YS5zdGgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dpbkxvYWRpbmcubmV4dChmYWxzZSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0UGFnZURhdGEodXJsOiBzdHJpbmcsIGlzUm9vdDogYm9vbGVhbik6IE9ic2VydmFibGU8UGFnZURhdGFNb2RlbCB8IG51bGw+IHtcbiAgICAgICAgaWYgKGlzUm9vdCB8fCB1cmwgPT09ICcnIHx8IHVybCA9PT0gJy8nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3J0YWxEYXRhJDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cmwuaW5kZXhPZignPycpID4gLTEpIHtcbiAgICAgICAgICAgIHVybCA9IHVybC5zdWJzdHIoMCwgdXJsLmluZGV4T2YoJz8nKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2FjaGVkUGFnZURhdGFbdXJsXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkUGFnZURhdGFbdXJsXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWdlRGF0YSA9IHRoaXMuZmluZFBhZ2VCeVJvdXRlKHVybCk7XG5cbiAgICAgICAgdGhpcy5jYWNoZWRQYWdlRGF0YVt1cmxdID0gdGhpcy5hcGlTZXJ2aWNlXG4gICAgICAgICAgICAubG9hZFBvcnRhbFBhZ2VEYXRhKHBhZ2VEYXRhPy5JZCwgdGhpcy5wb3J0YWxEYXRhU291cmNlLmdldFZhbHVlKCk/LkNoaWxkUGFnZUxpc3QuVHlwZURlZklkKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChwYWdlTW8pID0+IHBhZ2VNby5EYXRhLk1vKSxcbiAgICAgICAgICAgICAgICB0YXAoKHBhZ2VNbykgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZENoaWxkUm91dGUocGFnZU1vLCBwYWdlTW8uQ2hpbGRQYWdlTGlzdCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGRQYWdlcyhwYWdlTW8pO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHB1Ymxpc2hSZXBsYXkoMSksXG4gICAgICAgICAgICAgICAgcmVmQ291bnQoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgLy8gdGhpcy5jYWNoZWRQYWdlRGF0YVt1cmxdID0gdGhpcy5wb3J0YWxEYXRhJC5waXBlKFxuICAgICAgICAvLyAgIGZpbHRlcigocG9ydGFsRGF0YSkgPT4gcG9ydGFsRGF0YSAhPSBudWxsKSxcbiAgICAgICAgLy8gICBtYXAoKHBvcnRhbERhdGEpID0+ICksXG4gICAgICAgIC8vICAgY29uY2F0TWFwKChwYWdlRGF0YSkgPT4ge1xuICAgICAgICAvLyAgICAgcmV0dXJuXG4gICAgICAgIC8vICAgfSksXG5cbiAgICAgICAgLy8gICB0YXAocGFnZURhdGE9Pnt9KVxuICAgICAgICAvLyApO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRQYWdlRGF0YVt1cmxdO1xuICAgIH1cbiAgICBwdWJsaWMgcmVzb2x2ZURhdGEocm91dGVQYWdlRGF0YSk6IE9ic2VydmFibGU8UGFnZURhdGFNb2RlbCB8IG51bGw+IHtcbiAgICAgICAgLy8gY29uc3QgcGFnZURhdGEgPSB0aGlzLnBhZ2VzLmZpbmQoKGMpID0+IGMuUm91dGUgPT09IHJvdXRlUGFnZURhdGEuUm91dGUgJiYgYy5Nb2R1bGUgPT09IHJvdXRlUGFnZURhdGEuTW9kdWxlKTtcbiAgICAgICAgY29uc3QgcGFnZURhdGEgPSB0aGlzLnBhZ2VzLmZpbmQoKGMpID0+IGMuUm91dGUgPT09IHJvdXRlUGFnZURhdGEuUm91dGUpO1xuICAgICAgICBpZiAoIXBhZ2VEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaWQgPSBwYWdlRGF0YS5JZDtcblxuICAgICAgICBpZiAodGhpcy5jYWNoZWRQYWdlRGF0YVtpZF0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhY2hlZFBhZ2VEYXRhW2lkXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhY2hlZFBhZ2VEYXRhW2lkXSA9IHRoaXMuYXBpU2VydmljZVxuICAgICAgICAgICAgLmxvYWRQb3J0YWxQYWdlRGF0YShpZCwgdGhpcy5wb3J0YWxEYXRhU291cmNlLmdldFZhbHVlKCk/LkNoaWxkUGFnZUxpc3QuVHlwZURlZklkKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChwYWdlTW8pID0+IHBhZ2VNby5EYXRhLk1vKSxcbiAgICAgICAgICAgICAgICB0YXAoKHBhZ2VNbykgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZENoaWxkUm91dGUocGFnZU1vLCBwYWdlTW8uQ2hpbGRQYWdlTGlzdCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGRQYWdlcyhwYWdlTW8pO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHB1Ymxpc2hSZXBsYXkoMSksXG4gICAgICAgICAgICAgICAgcmVmQ291bnQoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgLy8gdGhpcy5jYWNoZWRQYWdlRGF0YVt1cmxdID0gdGhpcy5wb3J0YWxEYXRhJC5waXBlKFxuICAgICAgICAvLyAgIGZpbHRlcigocG9ydGFsRGF0YSkgPT4gcG9ydGFsRGF0YSAhPSBudWxsKSxcbiAgICAgICAgLy8gICBtYXAoKHBvcnRhbERhdGEpID0+ICksXG4gICAgICAgIC8vICAgY29uY2F0TWFwKChwYWdlRGF0YSkgPT4ge1xuICAgICAgICAvLyAgICAgcmV0dXJuXG4gICAgICAgIC8vICAgfSksXG5cbiAgICAgICAgLy8gICB0YXAocGFnZURhdGE9Pnt9KVxuICAgICAgICAvLyApO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRQYWdlRGF0YVtpZF07XG4gICAgfVxuXG4gICAgYWRkQ2hpbGRSb3V0ZShwYWdlTW86IE1ldGFvYmplY3REYXRhTW9kZWwsIENoaWxkUGFnZUxpc3Q6IE1vRm9yUmVwb3J0TW9kZWwpOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhZGRDaGlsZFJvdXRlX09sZChwYWdlTW86IE1ldGFvYmplY3REYXRhTW9kZWwsIENoaWxkUGFnZUxpc3Q6IE1vRm9yUmVwb3J0TW9kZWwpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFDaGlsZFBhZ2VMaXN0Py5Nb0RhdGFMaXN0Py5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuX3JvdXRlci5jb25maWc7XG4gICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYWdlTW8uUm91dGUucmVwbGFjZSgnLycsICcnKTtcbiAgICAgICAgY29uc3QgcGFyZW50Um91dGUgPSBjb25maWcuZmluZCgoYykgPT4gKGMucGF0aCA9IHBhcmVudFBhdGgpKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW46IFJvdXRlW10gPSBbXTtcbiAgICAgICAgaWYgKHBhcmVudFJvdXRlKSB7XG4gICAgICAgICAgICBDaGlsZFBhZ2VMaXN0Lk1vRGF0YUxpc3QuZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gY2hpbGQuUm91dGUucmVwbGFjZSgnLycsICcnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJvdXRlID0gdGhpcy5jcmVhdGVSb3V0ZShcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLkhhc0F1dGhvcml6ZSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuUGFnZU1vZHVsZT8uJENhcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGRyb3V0ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGRlYnVnZ2VyO1xuXG4gICAgICAgICAgICAocGFyZW50Um91dGUgYXMgYW55KS5fbG9hZGVkQ29uZmlnLnJvdXRlc1swXS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuXG4gICAgICAgICAgICB0aGlzLl9yb3V0ZXIucmVzZXRDb25maWcoY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkUG9ydGFsRGF0YV9PbGQxKCk6IE9ic2VydmFibGU8UG9ydGFsRGF0YU1vZGVsPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UubG9hZFBvcnRhbChCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLlBvcnRhbElkLCBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLlBvcnRhbFR5cGVEZWZJZCkucGlwZShcbiAgICAgICAgICAgIHRhcCgocG9ydGFsU2V0dGluZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvcnRhbERhdGEgPSBwb3J0YWxTZXR0aW5nLkRhdGEuTW87XG4gICAgICAgICAgICAgICAgdGhpcy5leHRyYWN0QWxsUGFnZXMocG9ydGFsRGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3J0YWxEYXRhU291cmNlLm5leHQocG9ydGFsRGF0YSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiBmcm9tKHRoaXMubG9hZFN5c3RlbSgpKSksXG4gICAgICAgICAgICB0YXAoKGFsbCkgPT4gdGhpcy5kYXRlVGV4dFNvdXJjZS5uZXh0KEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuRGF0ZVRleHQpKVxuICAgICAgICApO1xuICAgIH1cbiAgICBwdWJsaWMgbG9hZFBvcnRhbERhdGFTeW5jX09sZDIoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBvcnRhbFNldHRpbmcgPSB0aGlzLmFwaVNlcnZpY2UubG9hZFBvcnRhbFN5bmMoXG4gICAgICAgICAgICBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLlBvcnRhbElkLFxuICAgICAgICAgICAgQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5Qb3J0YWxUeXBlRGVmSWRcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcG9ydGFsRGF0YSA9IHBvcnRhbFNldHRpbmcuRGF0YS5NbztcblxuICAgICAgICB0aGlzLmV4dHJhY3RBbGxQYWdlcyhwb3J0YWxEYXRhKTtcblxuICAgICAgICB0aGlzLnBvcnRhbERhdGFTb3VyY2UubmV4dChwb3J0YWxEYXRhKTtcblxuICAgICAgICB0aGlzLmxvYWRTeXN0ZW0oKTtcblxuICAgICAgICB0aGlzLmRhdGVUZXh0U291cmNlLm5leHQoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5EYXRlVGV4dCk7XG4gICAgfVxuICAgIHByaXZhdGUgX2dldERlZmF1bHRQYWdlKGM6IE1ldGFvYmplY3REYXRhTW9kZWxbXSk6IE1ldGFvYmplY3REYXRhTW9kZWwgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKCFjIHx8ICFjLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHggPSBjLmZpbmQoKGMpID0+IGMuSXNEZWZhdWx0Um91dGUgPT09ICdUcnVlJyk7XG4gICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeDI6IGFueSA9IG51bGw7XG4gICAgICAgIGMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHgyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeDIgPSB0aGlzLl9nZXREZWZhdWx0UGFnZShlbGVtZW50LkNoaWxkUGFnZUxpc3Q/Lk1vRGF0YUxpc3QpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHgyO1xuICAgIH1cbiAgICBwdWJsaWMgbG9hZFBvcnRhbERhdGFTeW5jKCk6IHZvaWQge1xuICAgICAgICBpZiAoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YT8uZXJyb3I/LnVzZXJNZXNzYWdlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG9ydGFsU2V0dGluZ1N0ciA9IEJhcnNhQXBpLkJ3LlJ1bkJsTWV0aG9kKCdHZXRQb3J0YWwnLCBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLlBvcnRhbElkKTtcbiAgICAgICAgY29uc3QgcG9ydGFsU2V0dGluZyA9IEJhcnNhQXBpLkV4dC5kZWNvZGUocG9ydGFsU2V0dGluZ1N0cik7XG4gICAgICAgIGNvbnN0IHBvcnRhbERhdGE6IFBhZ2VEYXRhTW9kZWwgPSBwb3J0YWxTZXR0aW5nO1xuICAgICAgICBpZiAocG9ydGFsRGF0YSkge1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFBhZ2UgPSB0aGlzLl9nZXREZWZhdWx0UGFnZShwb3J0YWxEYXRhLkNoaWxkUGFnZUxpc3QuTW9EYXRhTGlzdCk7XG4gICAgICAgICAgICB0aGlzLkRlZmF1bHRQYWdlID0gZGVmYXVsdFBhZ2U7XG4gICAgICAgICAgICBsZXQgY29uZmlnUm91dGUgPSB0aGlzLl9yb3V0ZXIuY29uZmlnO1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlUGFnZWQ6IFJvdXRlW10gPSBbXTtcbiAgICAgICAgICAgIGNvbmZpZ1JvdXRlLmZvckVhY2goKGMsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm91dGUgPSAnLycgKyBjLnBhdGg7XG4gICAgICAgICAgICAgICAgaWYgKGMucGF0aCAhPT0gJycgJiYgcG9ydGFsRGF0YS5DaGlsZFBhZ2VMaXN0Lk1vRGF0YUxpc3QuZmluZEluZGV4KChkKSA9PiBkLlJvdXRlID09PSByb3V0ZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZVBhZ2VkLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBwYXRoVG9SZW1vdmUgPSByZW1vdmVQYWdlZC5tYXAoKGQpID0+IGQucGF0aCk7XG4gICAgICAgICAgICBjb25maWdSb3V0ZSA9IGNvbmZpZ1JvdXRlLmZpbHRlcigoYykgPT4gcGF0aFRvUmVtb3ZlLmluZGV4T2YoYy5wYXRoKSA9PT0gLTEpO1xuICAgICAgICAgICAgaWYgKGRlZmF1bHRQYWdlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0UGFnZVJvdXRlID0gZGVmYXVsdFBhZ2UuUm91dGUucmVwbGFjZSgnLycsICcnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0UGF0aCA9IGNvbmZpZ1JvdXRlLmZpbmQoKGMpID0+IGMucGF0aCA9PT0gJycpO1xuICAgICAgICAgICAgICAgIGRlZmF1bHRQYXRoICYmIChkZWZhdWx0UGF0aC5yZWRpcmVjdFRvID0gZGVmYXVsdFBhZ2VSb3V0ZSk7XG4gICAgICAgICAgICAgICAgY29uZmlnUm91dGUucHVzaCh7IHBhdGg6ICcqKicsIHJlZGlyZWN0VG86IGRlZmF1bHRQYWdlUm91dGUgfSk7XG4gICAgICAgICAgICAgICAgLy8gY29uc3Qgbm90Rm91bmRQYXRoID0gY29uZmlnUm91dGUuZmluZCgoYykgPT4gYy5wYXRoID09PSAnKionKTtcbiAgICAgICAgICAgICAgICAvLyBub3RGb3VuZFBhdGggJiYgKG5vdEZvdW5kUGF0aC5yZWRpcmVjdFRvID0gZGVmYXVsdFBhZ2UuUm91dGUucmVwbGFjZSgnLycsICcnKSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9yb3V0ZXIucmVzZXRDb25maWcoY29uZmlnUm91dGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXh0cmFjdEFsbFBhZ2VzKHBvcnRhbERhdGEgYXMgUG9ydGFsRGF0YU1vZGVsKTtcblxuICAgICAgICB0aGlzLnBvcnRhbERhdGFTb3VyY2UubmV4dChwb3J0YWxEYXRhIGFzIFBvcnRhbERhdGFNb2RlbCk7XG5cbiAgICAgICAgdGhpcy5kYXRlVGV4dFNvdXJjZS5uZXh0KEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuRGF0ZVRleHQpO1xuICAgIH1cbiAgICBwdWJsaWMgU2hvd0Zvcm0oZTogeyBtbzogTWV0YW9iamVjdERhdGFNb2RlbDsgbmFtYTogc3RyaW5nOyBhZnRlclJlYWR5PzogKGU6IGFueSkgPT4gdm9pZCB9KTogdm9pZCB7XG4gICAgICAgIEJhcnNhQXBpLkJ3LkZvcm0uU2hvdyh7XG4gICAgICAgICAgICBNbzogZS5tbyxcbiAgICAgICAgICAgIE1vQ29udGV4dDoge1xuICAgICAgICAgICAgICAgIFZpZXdOYW1lOiBlLm5hbWFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBFdmVudEhhbmRsZXJzOiB7XG4gICAgICAgICAgICAgICAgQWZ0ZXJSZWFkeTogZnVuY3Rpb24gKHNlbmRlciwgZWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kbyBzb21ldGhpbmcgaGVyZVxuICAgICAgICAgICAgICAgICAgICBlLmFmdGVyUmVhZHk/LihlZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIGdldCBsb2dpblJvdXRlJCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3J0YWxEYXRhJC5waXBlKFxuICAgICAgICAgICAgbWFwKChwb3J0YWxEYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9naW5QYWdlID0gcG9ydGFsRGF0YT8uQ2hpbGRQYWdlTGlzdC5Nb0RhdGFMaXN0LmZpbmQoKGMpID0+IGMuSXNMb2dpblJvdXRlID09PSAnVHJ1ZScpO1xuICAgICAgICAgICAgICAgIHJldHVybiBsb2dpblBhZ2U/LlJvdXRlIHx8ICdsb2dpbic7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbiAgICBwdWJsaWMgRXhlY3V0ZU5vdGlmaWNhdGlvbkFjdGlvbihpZDogc3RyaW5nLCBhY3Rpb25UaXRsZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIEJhcnNhQXBpLkJ3LlJ1bkJsTWV0aG9kQXN5bmMoe1xuICAgICAgICAgICAgUGFyYW1ldGVyczogW2lkLCBhY3Rpb25UaXRsZV0sXG4gICAgICAgICAgICBNZXRob2Q6ICdFeGVjdXRlTm90aWZpY2F0aW9uQWN0aW9uJyxcbiAgICAgICAgICAgIFN1Y2Nlc3NGbjogKGU6IHtcbiAgICAgICAgICAgICAgICBNbzogTWV0YW9iamVjdERhdGFNb2RlbDtcbiAgICAgICAgICAgICAgICBEeW5hbWljQ29tbWFuZElkOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgU2hvd0Zvcm1TZXR0aW5nOiB7IE1vSWQ6IHN0cmluZzsgVmlld05hbWU6IHN0cmluZyB9O1xuICAgICAgICAgICAgfSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZVB1c2hBY3Rpb24oKTtcbiAgICAgICAgICAgICAgICBpZiAoZS5EeW5hbWljQ29tbWFuZElkKSB7XG4gICAgICAgICAgICAgICAgICAgIEV4ZWN1dGVEeW5hbWljQ29tbWFuZCh7IElkOiBlLkR5bmFtaWNDb21tYW5kSWQgfSwgZS5Nbyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLlNob3dGb3JtU2V0dGluZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IE1vSWQsIFZpZXdOYW1lIH0gPSBlLlNob3dGb3JtU2V0dGluZztcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBCYXJzYUFwaS5Cdy5Gb3JtLlNob3coeyBNb0lkLCBNb0NvbnRleHQ6IHsgVmlld05hbWUgfSB9KSwgNTAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgRmFpbEZuOiAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZVB1c2hBY3Rpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgbG9hZFVzZXJQb3J0YWxTZXR0aW5nKCk6IHZvaWQge1xuICAgICAgICBpZiAoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YT8uZXJyb3I/LnVzZXJNZXNzYWdlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdWx2UGFyYW1zID0ge1xuICAgICAgICAgICAgRmxhZ3M6IHtcbiAgICAgICAgICAgICAgICBEYXRhOiAnVHJ1ZScsXG4gICAgICAgICAgICAgICAgRXh0cmE6ICdGYWxzZScsXG4gICAgICAgICAgICAgICAgU2VhcmNoOiAnRmFsc2UnLFxuICAgICAgICAgICAgICAgIFZpZXc6ICdGYWxzZSdcbiAgICAgICAgICAgICAgICAvLyBHZW5lcmFsOlwiRmFsc2VcIiwgLy8gdWx2bWFpbmN0cmwgZG9lcyBub3QgY3JhZXRlIHVpIGNvbnRyb2wgcmFpc2UgZXJyb3JcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBSZXBvcnROYW1lOiAnX9iq2YbYuNmK2YXYp9iqX9m+2KfZitmHX9m+2YjYsdiq2KfZhCcsXG4gICAgICAgICAgICBVc2FnZUVudW06ICdTeXN0ZW1Db250YWluZXInXG4gICAgICAgIH07XG4gICAgICAgIEJhcnNhQXBpLkJ3LkV4ZWN1dGVSZXBvcnQoXG4gICAgICAgICAgICB7IHVsdlBhcmFtcyB9LFxuICAgICAgICAgICAgKHJlc3VsdDogUmVwb3J0TW9kZWwpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtb2xpc3QgPSByZXN1bHQuRGF0YS5Nb0RhdGFMaXN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJQb3J0YWxTZXR0aW5nOiBSZWNvcmQ8c3RyaW5nLCBNZXRhb2JqZWN0RGF0YU1vZGVsPiA9IHt9O1xuICAgICAgICAgICAgICAgIG1vbGlzdC5mb3JFYWNoKChtbykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobW8uSW5oZXJpdGFuY2UgJiYgbW8uSW5oZXJpdGFuY2UuJFR5cGVEZWZOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyUG9ydGFsU2V0dGluZ1ttby5Jbmhlcml0YW5jZS4kVHlwZURlZk5hbWVdID0gbW8uSW5oZXJpdGFuY2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLl91c2VyUG9ydGFsU2V0dGluZ3MkLm5leHQodXNlclBvcnRhbFNldHRpbmcpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgLy8gQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XG4gICAgICAgIC8vICAgICBQYXJhbWV0ZXJzOiBbXSxcbiAgICAgICAgLy8gICAgIE1ldGhvZDogJ0dldFVzZXJQb3J0YWxTZXR0aW5ncycsXG4gICAgICAgIC8vICAgICBTdWNjZXNzRm46ICh1c2VyUG9ydGFsU2V0dGluZzogTWV0YW9iamVjdERhdGFNb2RlbCkgPT4ge1xuICAgICAgICAvLyAgICAgfSxcbiAgICAgICAgLy8gICAgIEZhaWxGbjogKGUpID0+IHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmxvZ1NlcnZpY2UuZXJyb3IoZSk7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH0pO1xuICAgIH1cbiAgICBsb2FkU2VydmVyU3RhcnR1cERhdGEoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIUJhcnNhQXBpLk9mZmxpbmUuaGFzSW5pdCkge1xuICAgICAgICAgICAgICAgIEJhcnNhQXBpLk9mZmxpbmUuYWZ0ZXJJbml0Q2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRTZXJ2ZXJTdGFydHVwRGF0YShyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2UgdGhpcy5fbG9hZFNlcnZlclN0YXJ0dXBEYXRhKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfbG9hZFNlcnZlclN0YXJ0dXBEYXRhKHJlc29sdmUsIHJlamVjdCk6IHZvaWQge1xuICAgICAgICBjb25zdCBhamF4SGVscGVyID0gdHlwZW9mIEFqYXhIZWxwZXIyID09PSAndW5kZWZpbmVkJyA/IEFqYXhIZWxwZXIgOiBBamF4SGVscGVyMjtcbiAgICAgICAgYWpheEhlbHBlci5BamF4UmVxdWVzdChcbiAgICAgICAgICAgICcvYXBpL2Jhc2UvU2VydmVyU3RhcnR1cERhdGEnLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhVGV4dCA9IHJlc3BvbnNlLnJlc3BvbnNlVGV4dDtcbiAgICAgICAgICAgICAgICBkYXRhVGV4dCA9IGRhdGFUZXh0LnJlcGxhY2UoLycvZywgJ1wiJyk7XG4gICAgICAgICAgICAgICAgZGF0YVRleHQgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5SZXBsYWNlQXJhYmljQ2hhcmNodGVyKGRhdGFUZXh0KTtcbiAgICAgICAgICAgICAgICBCYXJzYUFwaS5Mb2dpbkZvcm0uUG9ydGFsSW5pdGlhbGl6ZShkYXRhVGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLklzQW5vbnltb3VzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YT8uZXJyb3I/LnVzZXJNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBCYXJzYUFwaS5Cdy5Nc2cuRXJyb3IoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YT8uZXJyb3I/LnVzZXJNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEJhcnNhQXBpLkJ3Lk1zZy5FcnJvcign2KfZhdqp2KfZhiDZiNix2YjYryDYqNinINqp2KfYsdio2LEg2b7ZiNix2KrYp9mEINmI2KzZiNivINmG2K/Yp9ix2K8uJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5Jc1NlcnZpY2VEZXNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuX3JvdXRlci5jb25maWc7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ1swXS5yZWRpcmVjdFRvID0gJ3NlcnZpY2VkZXNrJztcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yb3V0ZXIucmVzZXRDb25maWcoY29uZmlnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5faW5pdEFmdGVyTG9naW5Gb3JtRGF0YSgpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoQmFyc2FBcGkuTG9naW5Gb3JtRGF0YSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGFsZXJ0KCdlcnJvciBpbiBnZXQgc2VydmVyIHN0YXJ0dXAgZGF0YS4nKTtcbiAgICAgICAgICAgICAgICByZWplY3QoJ2Vycm9yIGluIGdldCBzZXJ2ZXIgc3RhcnR1cCBkYXRhLicpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBTaG93Rm9ybVBhbmVsQ29udHJvbChcbiAgICAgICAgZm9ybXBhbmVsQ3RybHI6IGFueSxcbiAgICAgICAgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgZGlhbG9nQ29tcG9uZW50OiBUeXBlPGFueT4sXG4gICAgICAgIGlzUGFnZTogYm9vbGVhbixcbiAgICAgICAgdmNyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBpc1JlbG9hZDogYm9vbGVhbiA9IGZhbHNlXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGlmICghZm9ybXBhbmVsQ3RybHIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignZm9ybSBwYW5lbCBjb250cm9sZXIgaXMgdW5kZWZpbmVkIScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1vID0gZm9ybXBhbmVsQ3RybHIuTW87XG4gICAgICAgIGNvbnN0IGhlYWRlckxheW91dCA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGZvcm1wYW5lbEN0cmxyLCAnU2V0dGluZy5WaWV3LkhlYWRlckxheW91dCcsIG51bGwpO1xuICAgICAgICBsZXQgaXNNb2RhbCA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGZvcm1wYW5lbEN0cmxyLCAnU2V0dGluZy5WaWV3LkV4dHJhSnNvblByb3AuTW9kYWwnLCBmYWxzZSk7XG4gICAgICAgIGlzTW9kYWwgPVxuICAgICAgICAgICAgaXNNb2RhbCB8fFxuICAgICAgICAgICAgQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoZm9ybXBhbmVsQ3RybHIsICdTZXR0aW5nLlZpZXcuQ3VzdG9tVWkuUGFyYW1ldGVycy5Jc01vZGFsJywgZmFsc2UpO1xuICAgICAgICBjb25zdCBtb2RhbFNldHRpbmcgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShcbiAgICAgICAgICAgIGZvcm1wYW5lbEN0cmxyLFxuICAgICAgICAgICAgJ1NldHRpbmcuVmlldy5DdXN0b21VaS5QYXJhbWV0ZXJzLk1vZGFsU2V0dGluZycsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChtb2RhbFNldHRpbmcpIHtcbiAgICAgICAgICAgIGlzTW9kYWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZvcm1wYW5lbEN0cmxyLlNldHRpbmcuSXNNb2RhbCA9IGlzTW9kYWw7XG4gICAgICAgIGZvcm1wYW5lbEN0cmxyLklzTW9kYWwgPSBpc01vZGFsO1xuICAgICAgICBjb25zdCBicmVhZENydW1iID0gZ2V0SGVhZGVyVmFsdWUoaGVhZGVyTGF5b3V0Py5CcmVhZENydW1iKTtcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSB7XG4gICAgICAgICAgICBpZDogbW8uJFN0YXRlID09PSAnTmV3JyA/ICcwJyA6IG1vLklkLFxuICAgICAgICAgICAgdHlpZDogbW8uJFR5cGVEZWZJZCxcbiAgICAgICAgICAgIHR5Y3A6IG1vLiRDYXB0aW9uID8gbW8uJENhcHRpb24gOiBudWxsLFxuICAgICAgICAgICAgcmVwaWQ6IG1vLiRSZXBvcnRJZCxcbiAgICAgICAgICAgIHZpZDogZm9ybXBhbmVsQ3RybHI/LlNldHRpbmc/LlZpZXc/LlR5cGVWaWV3SWQsXG4gICAgICAgICAgICBiYzogYnJlYWRDcnVtYiA/IGJyZWFkQ3J1bWIgOiBtby4kU3RhdGUgPT09ICdOZXcnID8gbW8uJFR5cGVEZWZOYW1lIDogbW8uJENhcHRpb25cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaWQgPSBnZXRVbmlxdWVJZCg0KTtcbiAgICAgICAgdGhpcy5hZGRGb3JtUGFuZWxDdHJscihpZCwgZm9ybXBhbmVsQ3RybHIpO1xuICAgICAgICB0aGlzLm9wZW5Gb3JtJC5uZXh0KCk7IC8vIGV2ZW50IGVtaXQgZm9yIG90aGVyIGNvbXBvbmVudHMgdG8ga25vdyBmb3JtIG9wZW5cbiAgICAgICAgaWYgKGlzTW9kYWwpIHtcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5zaG93Rm9ybShcbiAgICAgICAgICAgICAgICBkaWFsb2dDb21wb25lbnQsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAuLi5xdWVyeVBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgZm9ybXBhbmVsQ3RybHJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHZjclxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0geyBmb3JtUGFuZWxDdHJscklkOiBpZCB9O1xuICAgICAgICAgICAgaWYgKGlzUGFnZSkge1xuICAgICAgICAgICAgICAgIHJvdXRlci5uYXZpZ2F0ZShcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2Zvcm0nLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxldHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbjogWydzaG93JywgeyAuLi5xdWVyeVBhcmFtcywgZm9ybVBhbmVsQ3RybHJJZDogaWQsIGlzRmlyc3Q6IHRydWUgfV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVUbzogYWN0aXZhdGVkUm91dGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBza2lwTG9jYXRpb25DaGFuZ2U6IGlzUmVsb2FkXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByb3V0ZXIubmF2aWdhdGUoXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdwb3B1cCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGV0czoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluOiBbJ3Nob3cnLCB7IC4uLnF1ZXJ5UGFyYW1zLCBmb3JtUGFuZWxDdHJscklkOiBpZCB9XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVUbzogYWN0aXZhdGVkUm91dGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdwcmVzZXJ2ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBza2lwTG9jYXRpb25DaGFuZ2U6IGlzUmVsb2FkXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBsb2FkU3lzdGVtKGlkOiBudW1iZXIgPSAwKTogUHJvbWlzZTxQb3J0YWxEYXRhTW9kZWw+IHtcbiAgICAgICAgaWYgKEJhcnNhQXBpLkxvZ2luRm9ybURhdGE/LmVycm9yPy51c2VyTWVzc2FnZSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KEJhcnNhQXBpLkxvZ2luRm9ybURhdGE/LmVycm9yPy51c2VyTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlkID09PSAwKSB7XG4gICAgICAgICAgICBCYXJzYUFwaS5VbC5BcHBsaWNhdGlvbkN0cmxyLkRlZmF1bHRTeXN0ZW1JZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIEJhcnNhQXBpLlVsLkFwcGxpY2F0aW9uQ3RybHIuX2xvYWRTeXN0ZW0oXG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfcmVtb3ZlUHVzaEFjdGlvbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcHVzaEFjdGlvblN0ciA9IHRoaXMuX2xvY2FsU3RvcmFnZS5nZXRJdGVtKCdwdXNoQWN0aW9uJyk7XG4gICAgICAgIGlmIChwdXNoQWN0aW9uU3RyKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2NhbFN0b3JhZ2UucmVtb3ZlKCdwdXNoQWN0aW9uJyk7XG4gICAgICAgICAgICBjb25zdCBwdXNoQWN0aW9uID0gSlNPTi5wYXJzZShwdXNoQWN0aW9uU3RyKTtcbiAgICAgICAgICAgIHRoaXMuX3B1c2hBY3Rpb24kLm5leHQocHVzaEFjdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBfY2hlY2tMb2NhbFN0b3JhZ2VQdXNoQWN0aW9uKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwdXNoQWN0aW9uU3RyID0gdGhpcy5fbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3B1c2hBY3Rpb24nKTtcbiAgICAgICAgaWYgKHB1c2hBY3Rpb25TdHIpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZS5yZW1vdmUoJ3B1c2hBY3Rpb24nKTtcbiAgICAgICAgICAgIGNvbnN0IHB1c2hBY3Rpb24gPSBKU09OLnBhcnNlKHB1c2hBY3Rpb25TdHIpO1xuICAgICAgICAgICAgdGhpcy5fcHVzaEFjdGlvbiQubmV4dChwdXNoQWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIF9pbml0QWZ0ZXJMb2dpbkZvcm1EYXRhKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJ0bFNvdXJjZS5uZXh0KEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuSXNSdGwpO1xuICAgICAgICB0aGlzLl9pc0Fub251bW91c1NvdXJjZS5uZXh0KEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuSXNBbm9ueW1vdXMpO1xuICAgICAgICB0aGlzLnNldFVzZXJMb2dpblN0YXR1cyhCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLklzVXNlckxvZ2dlZEluKTtcbiAgICAgICAgdGhpcy5fbG9nZ2VkSW5Tb3VyY2UubmV4dCh0aGlzLl9sb2dnZWRJblNvdXJjZS5nZXRWYWx1ZSgpICYmIEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuSXNBbm9ueW1vdXMgPT09IGZhbHNlKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfaW5pdFZpc2liaWxpdHlDaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAndmlzaWJsZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kb2N1bWVudFZpc2liaWxpdHljaGFuZ2UkLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kb2N1bWVudFZpc2liaWxpdHljaGFuZ2UkLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwcml2YXRlIF9pbml0U3RhbmRhbG9uZSgpOiB2b2lkIHtcbiAgICAgICAgd2luZG93Lm1hdGNoTWVkaWEoJyhkaXNwbGF5LW1vZGU6IHN0YW5kYWxvbmUpJykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzTWF0Y2ggPSBlLm1hdGNoZXM7XG5cbiAgICAgICAgICAgIGlmIChpc01hdGNoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhbmRhbG9uZSQubmV4dCh0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhbmRhbG9uZSQubmV4dChmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwcml2YXRlIF9pbml0UHVzaEFjdGlvbnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9jYWxTdG9yYWdlUHVzaEFjdGlvbigpO1xuICAgICAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnVzZXJMb2dnZWRJbiQsIHRoaXMucHVzaEFjdGlvbiRdKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgLy8gd2l0aExhdGVzdEZyb20odGhpcy5fcG9ydGFsU2VydmljZS5wdXNoQWN0aW9uJCksXG4gICAgICAgICAgICAgICAgLy8gZmlsdGVyKChbdXNlckxvZ2dlZGluLCBhY3Rpb25dKSA9PiB1c2VyTG9nZ2VkaW4pXG4gICAgICAgICAgICAgICAgZmlsdGVyKChbdXNlckxvZ2dlZGluLCBwdXNoQWN0aW9uXSkgPT4gdXNlckxvZ2dlZGluKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoW3VzZXJMb2dnZWRpbiwgcHVzaEFjdGlvbl0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocHVzaEFjdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcHVzaEFjdGlvbi5ub3RpZmljYXRpb25UYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdXNoQWN0aW9uLm1vaWQgJiYgcHVzaEFjdGlvbi50cGlkICYmIHB1c2hBY3Rpb24uYWN0aW9uID09ICdzaG93Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gQmFyc2FBcGkuQncuRm9ybS5TaG93KHsgTW9JZDogcHVzaEFjdGlvbi5tb2lkIH0pLCA1MDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5FeGVjdXRlTm90aWZpY2F0aW9uQWN0aW9uKHB1c2hBY3Rpb24ubm90aWZpY2F0aW9uVGFnLCBwdXNoQWN0aW9uLmFjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfaW5pdExhbmRzY2FwZSgpOiB2b2lkIHtcbiAgICAgICAgd2luZG93Lm1hdGNoTWVkaWEoJyhvcmllbnRhdGlvbjogcG9ydHJhaXQpJykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzTWF0Y2ggPSBlLm1hdGNoZXM7XG5cbiAgICAgICAgICAgIGlmIChpc01hdGNoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGV2aWNlTGFuZHNjYXBlJC5uZXh0KGZhbHNlKTsgLy8gcG9ydHJhaXRcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGV2aWNlTGFuZHNjYXBlJC5uZXh0KHRydWUpOyAvLyBsYW5kc2NhcGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHByaXZhdGUgZmluZFBhZ2VCeVJvdXRlKHVybDogc3RyaW5nKTogUGFnZURhdGFNb2RlbCB8IG51bGwge1xuICAgICAgICBjb25zdCBmaW5kZWRQYWdlID0gdGhpcy5wYWdlcy5maW5kKChjKSA9PiBjLlJvdXRlID09PSB1cmwpO1xuICAgICAgICByZXR1cm4gZmluZGVkUGFnZSB8fCBudWxsO1xuICAgIH1cbiAgICBwcml2YXRlIGdldE5nTW9kdWxlRmFjdG9yeShtb2R1bGVzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBtb2R1bGVOYW1lOiBzdHJpbmcpOiBOZ01vZHVsZUZhY3Rvcnk8YW55PiB7XG4gICAgICAgIGNvbnN0IG1vZHVsZUNsYXNzID0gbW9kdWxlc1ttb2R1bGVOYW1lICsgJ01vZHVsZSddO1xuICAgICAgICBsZXQgbW9kdWxlRmFjdG9yeTogTmdNb2R1bGVGYWN0b3J5PGFueT47XG4gICAgICAgIGlmIChtb2R1bGVDbGFzcyBpbnN0YW5jZW9mIE5nTW9kdWxlRmFjdG9yeSkge1xuICAgICAgICAgICAgbW9kdWxlRmFjdG9yeSA9IG1vZHVsZUNsYXNzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY29tcGlsZWQgPSB0aGlzLmNvbXBpbGVyLmNvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzU3luYyhtb2R1bGVDbGFzcyk7XG4gICAgICAgICAgICBtb2R1bGVGYWN0b3J5ID0gY29tcGlsZWQubmdNb2R1bGVGYWN0b3J5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtb2R1bGVGYWN0b3J5O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UmVnaXN0ZXJlZE1vZHVsZXModW1kOiBzdHJpbmcsIGV4cG9ydEFzOiBzdHJpbmdbXSwgbW9kdWxlTmFtZTogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgICAgIGxldCBtb2R1bGVzO1xuICAgICAgICBpZiAodW1kICE9PSAnJykge1xuICAgICAgICAgICAgbW9kdWxlcyA9IHdpbmRvdztcbiAgICAgICAgICAgIHVtZC5zcGxpdCgnLicpLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1vZHVsZXMgIT09IHR5cGVvZiB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlcyA9IG1vZHVsZXNbY107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtb2R1bGVzID0gd2luZG93W21vZHVsZU5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChleHBvcnRBcy5sZW5ndGggPiAwICYmIG1vZHVsZXMpIHtcbiAgICAgICAgICAgIGV4cG9ydEFzLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlT25PYmplY3QoYywgMCwgbW9kdWxlcywgd2luZG93KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtb2R1bGVzO1xuICAgIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgTGlicmFyeURlcGVuZWN5IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAga2ViYWJOYW1lOiBzdHJpbmc7XG4gICAgdW1kOiBzdHJpbmc7XG4gICAgZXhwb3J0QXM6IHN0cmluZ1tdO1xufVxuZXhwb3J0IGludGVyZmFjZSBCcmVhZENydW1iSW5mbyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgICByb3V0ZTogQWN0aXZhdGVkUm91dGU7XG59XG4iXX0=