@veloceapps/sdk 11.0.0-8 → 11.0.0-80

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 (181) hide show
  1. package/cms/cms.actions.d.ts +92 -29
  2. package/cms/components/element-renderer/element-renderer.component.d.ts +3 -10
  3. package/cms/components/preview/preview.component.d.ts +5 -6
  4. package/cms/components/preview/preview.types.d.ts +0 -4
  5. package/cms/services/element-context.service.d.ts +0 -1
  6. package/cms/types/common.types.d.ts +2 -0
  7. package/cms/types/index.d.ts +0 -1
  8. package/cms/utils/path.utils.d.ts +1 -2
  9. package/cms/vendor-map.d.ts +17 -40
  10. package/core/index.d.ts +1 -1
  11. package/core/modules/configuration/index.d.ts +3 -4
  12. package/core/modules/configuration/services/configuration-runtime.service.d.ts +8 -19
  13. package/core/modules/configuration/services/configuration-state.service.d.ts +8 -8
  14. package/core/modules/configuration/services/configuration.service.d.ts +23 -47
  15. package/core/modules/configuration/services/test-mode-configuration.service.d.ts +23 -0
  16. package/core/modules/configuration/types/configuration-runtime.types.d.ts +0 -5
  17. package/core/modules/configuration/types/configuration.types.d.ts +4 -2
  18. package/core/modules/configuration/types/index.d.ts +2 -0
  19. package/core/modules/flow-configuration/index.d.ts +0 -3
  20. package/core/modules/flow-configuration/services/flow-configuration.service.d.ts +11 -38
  21. package/core/operators/filter-successful-execute.operator.d.ts +3 -0
  22. package/core/operators/index.d.ts +1 -0
  23. package/core/services/catalog-products.service.d.ts +11 -0
  24. package/core/services/flow-info.service.d.ts +27 -12
  25. package/core/services/flow-state-configuration.service.d.ts +2 -8
  26. package/core/services/flow-state.service.d.ts +13 -22
  27. package/core/services/index.d.ts +3 -3
  28. package/core/services/integration.state.d.ts +1 -1
  29. package/core/services/product-images.service.d.ts +3 -3
  30. package/core/services/runtime-settings.service.d.ts +1 -1
  31. package/core/services/sales-transaction.service.d.ts +27 -0
  32. package/core/types/flow-customization.types.d.ts +2 -2
  33. package/core/types/flow-state.types.d.ts +2 -2
  34. package/core/types/index.d.ts +0 -1
  35. package/core/utils/index.d.ts +2 -2
  36. package/core/utils/transaction-item.utils.d.ts +7 -0
  37. package/core/utils/transaction-item.worker.d.ts +8 -0
  38. package/esm2020/cms/cms.actions.mjs +93 -71
  39. package/esm2020/cms/cms.default.mjs +2 -3
  40. package/esm2020/cms/components/element-renderer/element-renderer.component.mjs +7 -64
  41. package/esm2020/cms/components/element-tools-panel/element-tools-panel.component.mjs +3 -3
  42. package/esm2020/cms/components/preview/preview.component.mjs +19 -28
  43. package/esm2020/cms/components/preview/preview.types.mjs +1 -1
  44. package/esm2020/cms/services/element-context.service.mjs +1 -1
  45. package/esm2020/cms/types/common.types.mjs +1 -1
  46. package/esm2020/cms/types/index.mjs +1 -2
  47. package/esm2020/cms/utils/element.utils.mjs +3 -3
  48. package/esm2020/cms/utils/elements-resolver.mjs +16 -5
  49. package/esm2020/cms/utils/path.utils.mjs +1 -10
  50. package/esm2020/cms/vendor-map.mjs +17 -18
  51. package/esm2020/core/core.module.mjs +7 -7
  52. package/esm2020/core/index.mjs +2 -2
  53. package/esm2020/core/modules/configuration/configuration.module.mjs +14 -4
  54. package/esm2020/core/modules/configuration/index.mjs +4 -5
  55. package/esm2020/core/modules/configuration/services/configuration-runtime.service.mjs +16 -101
  56. package/esm2020/core/modules/configuration/services/configuration-state.service.mjs +65 -77
  57. package/esm2020/core/modules/configuration/services/configuration.service.mjs +109 -223
  58. package/esm2020/core/modules/configuration/services/test-mode-configuration.service.mjs +74 -0
  59. package/esm2020/core/modules/configuration/types/configuration-runtime.types.mjs +1 -1
  60. package/esm2020/core/modules/configuration/types/configuration.types.mjs +1 -1
  61. package/esm2020/core/modules/configuration/types/index.mjs +3 -0
  62. package/esm2020/core/modules/flow-configuration/flow-configuration.module.mjs +3 -4
  63. package/esm2020/core/modules/flow-configuration/index.mjs +1 -4
  64. package/esm2020/core/modules/flow-configuration/services/flow-configuration.service.mjs +44 -128
  65. package/esm2020/core/operators/filter-successful-execute.operator.mjs +5 -0
  66. package/esm2020/core/operators/index.mjs +2 -0
  67. package/esm2020/core/services/catalog-products.service.mjs +25 -0
  68. package/esm2020/core/services/flow-info.service.mjs +82 -31
  69. package/esm2020/core/services/flow-state-configuration.service.mjs +10 -25
  70. package/esm2020/core/services/flow-state.service.mjs +60 -172
  71. package/esm2020/core/services/index.mjs +4 -4
  72. package/esm2020/core/services/integration.state.mjs +2 -2
  73. package/esm2020/core/services/product-images.service.mjs +8 -8
  74. package/esm2020/core/services/runtime-settings.service.mjs +3 -3
  75. package/esm2020/core/services/sales-transaction.service.mjs +62 -0
  76. package/esm2020/core/types/flow-customization.types.mjs +1 -1
  77. package/esm2020/core/types/flow-state.types.mjs +1 -1
  78. package/esm2020/core/types/index.mjs +1 -2
  79. package/esm2020/core/utils/index.mjs +3 -3
  80. package/esm2020/core/utils/transaction-item.utils.mjs +60 -0
  81. package/esm2020/core/utils/transaction-item.worker.mjs +16 -0
  82. package/esm2020/src/components/flow-header/flow-header.component.mjs +8 -12
  83. package/esm2020/src/components/guided-selling/guided-selling.component.mjs +8 -12
  84. package/esm2020/src/flow-routing.module.mjs +12 -41
  85. package/esm2020/src/flow.component.mjs +5 -5
  86. package/esm2020/src/guards/flow.guard.mjs +13 -14
  87. package/esm2020/src/guards/product-unload.guard.mjs +7 -9
  88. package/esm2020/src/index.mjs +1 -3
  89. package/esm2020/src/pages/assets/assets.component.mjs +8 -9
  90. package/esm2020/src/pages/catalog/catalog.component.mjs +8 -9
  91. package/esm2020/src/pages/debug/debug.component.mjs +14 -23
  92. package/esm2020/src/pages/product/product.component.mjs +12 -89
  93. package/esm2020/src/pages/product/product.module.mjs +5 -5
  94. package/esm2020/src/pages/record-not-found/record-not-found.component.mjs +5 -6
  95. package/esm2020/src/pages/shopping-cart/shopping-cart.component.mjs +8 -9
  96. package/esm2020/src/resolvers/flow.resolver.mjs +10 -18
  97. package/esm2020/src/resolvers/pcm-model.resolver.mjs +12 -0
  98. package/esm2020/src/resolvers/sales-transaction.resolver.mjs +64 -0
  99. package/esm2020/src/resolvers/ui-definition.resolver.mjs +42 -0
  100. package/esm2020/src/services/flow-dialog.service.mjs +8 -8
  101. package/esm2020/src/services/flow-router.service.mjs +16 -33
  102. package/esm2020/src/services/flow.service.mjs +13 -54
  103. package/esm2020/src/types/index.mjs +2 -3
  104. package/esm2020/src/types/route.types.mjs +1 -1
  105. package/fesm2015/veloceapps-sdk-cms.mjs +162 -309
  106. package/fesm2015/veloceapps-sdk-cms.mjs.map +1 -1
  107. package/fesm2015/veloceapps-sdk-core.mjs +812 -1657
  108. package/fesm2015/veloceapps-sdk-core.mjs.map +1 -1
  109. package/fesm2015/veloceapps-sdk.mjs +188 -801
  110. package/fesm2015/veloceapps-sdk.mjs.map +1 -1
  111. package/fesm2020/veloceapps-sdk-cms.mjs +158 -300
  112. package/fesm2020/veloceapps-sdk-cms.mjs.map +1 -1
  113. package/fesm2020/veloceapps-sdk-core.mjs +875 -1741
  114. package/fesm2020/veloceapps-sdk-core.mjs.map +1 -1
  115. package/fesm2020/veloceapps-sdk.mjs +188 -795
  116. package/fesm2020/veloceapps-sdk.mjs.map +1 -1
  117. package/package.json +1 -1
  118. package/src/components/flow-header/flow-header.component.d.ts +3 -3
  119. package/src/components/guided-selling/guided-selling.component.d.ts +3 -3
  120. package/src/flow-routing.module.d.ts +1 -2
  121. package/src/flow.component.d.ts +2 -2
  122. package/src/guards/product-unload.guard.d.ts +5 -6
  123. package/src/index.d.ts +0 -2
  124. package/src/pages/assets/assets.component.d.ts +3 -3
  125. package/src/pages/catalog/catalog.component.d.ts +3 -3
  126. package/src/pages/debug/debug.component.d.ts +2 -5
  127. package/src/pages/product/product.component.d.ts +5 -14
  128. package/src/pages/product/product.module.d.ts +1 -1
  129. package/src/pages/record-not-found/record-not-found.component.d.ts +2 -3
  130. package/src/pages/shopping-cart/shopping-cart.component.d.ts +3 -3
  131. package/src/resolvers/flow.resolver.d.ts +5 -6
  132. package/src/resolvers/pcm-model.resolver.d.ts +3 -0
  133. package/src/resolvers/sales-transaction.resolver.d.ts +18 -0
  134. package/src/resolvers/ui-definition.resolver.d.ts +3 -0
  135. package/src/services/flow-dialog.service.d.ts +5 -4
  136. package/src/services/flow-router.service.d.ts +4 -6
  137. package/src/services/flow.service.d.ts +2 -7
  138. package/src/types/index.d.ts +1 -2
  139. package/src/types/route.types.d.ts +0 -5
  140. package/cms/plugins/configuration.plugin.d.ts +0 -23
  141. package/cms/types/configuration.types.d.ts +0 -21
  142. package/core/modules/configuration/helpers.d.ts +0 -6
  143. package/core/modules/configuration/services/runtime-context.service.d.ts +0 -12
  144. package/core/modules/flow-configuration/services/flow-update.service.d.ts +0 -13
  145. package/core/modules/flow-configuration/types/update.types.d.ts +0 -12
  146. package/core/services/context.service.d.ts +0 -23
  147. package/core/services/quote-draft.service.d.ts +0 -50
  148. package/core/types/runtime.types.d.ts +0 -30
  149. package/core/utils/line-item.utils.d.ts +0 -25
  150. package/core/utils/line-item.worker.d.ts +0 -9
  151. package/esm2020/cms/plugins/configuration.plugin.mjs +0 -109
  152. package/esm2020/cms/types/configuration.types.mjs +0 -2
  153. package/esm2020/core/modules/configuration/helpers.mjs +0 -73
  154. package/esm2020/core/modules/configuration/services/runtime-context.service.mjs +0 -45
  155. package/esm2020/core/modules/flow-configuration/services/flow-update.service.mjs +0 -138
  156. package/esm2020/core/modules/flow-configuration/types/update.types.mjs +0 -2
  157. package/esm2020/core/services/context.service.mjs +0 -91
  158. package/esm2020/core/services/quote-draft.service.mjs +0 -192
  159. package/esm2020/core/types/runtime.types.mjs +0 -16
  160. package/esm2020/core/utils/line-item.utils.mjs +0 -187
  161. package/esm2020/core/utils/line-item.worker.mjs +0 -19
  162. package/esm2020/src/guards/context.guard.mjs +0 -91
  163. package/esm2020/src/guards/index.mjs +0 -2
  164. package/esm2020/src/pages/remote/remote.component.mjs +0 -342
  165. package/esm2020/src/pages/remote/remote.module.mjs +0 -20
  166. package/esm2020/src/pages/remote/remote.types.mjs +0 -2
  167. package/esm2020/src/resolvers/quote.resolver.mjs +0 -82
  168. package/esm2020/src/types/context-route.types.mjs +0 -2
  169. package/esm2020/src/types/metrics.types.mjs +0 -2
  170. package/esm2020/src/utils/flow.utils.mjs +0 -25
  171. package/esm2020/src/utils/index.mjs +0 -2
  172. package/src/guards/context.guard.d.ts +0 -19
  173. package/src/guards/index.d.ts +0 -1
  174. package/src/pages/remote/remote.component.d.ts +0 -46
  175. package/src/pages/remote/remote.module.d.ts +0 -10
  176. package/src/pages/remote/remote.types.d.ts +0 -4
  177. package/src/resolvers/quote.resolver.d.ts +0 -19
  178. package/src/types/context-route.types.d.ts +0 -5
  179. package/src/types/metrics.types.d.ts +0 -5
  180. package/src/utils/flow.utils.d.ts +0 -8
  181. package/src/utils/index.d.ts +0 -1
@@ -1,10 +1,12 @@
1
1
  import { Injectable } from '@angular/core';
2
- import { FlowStateApiService, QuoteApiService } from '@veloceapps/api';
2
+ import { FlowStateApiService } from '@veloceapps/api';
3
+ import { SalesTransactionApiService } from '@veloceapps/api/v2';
3
4
  import { ToastService, ToastType } from '@veloceapps/components';
4
- import { ConfigurationTranslatorUtils, EntityUtil, isDefined, UUID, } from '@veloceapps/core';
5
+ import { EntityUtil, isDefined, UUID, } from '@veloceapps/core';
5
6
  import { assign, cloneDeep } from 'lodash';
6
- import { BehaviorSubject, buffer, catchError, combineLatest, debounceTime, distinctUntilChanged, filter, finalize, map, of, share, shareReplay, Subject, switchMap, take, takeUntil, tap, throwError, } from 'rxjs';
7
- import { FlowInfoService, FlowStateService, QuoteDraftService } from '../../../services';
7
+ import { BehaviorSubject, buffer, catchError, combineLatest, debounceTime, distinctUntilChanged, filter, finalize, first, map, of, share, shareReplay, Subject, switchMap, take, takeUntil, tap, throwError, } from 'rxjs';
8
+ import { FlowInfoService, FlowStateService, SalesTransactionService } from '../../../services';
9
+ import { generateTransactionItem } from '../../../utils';
8
10
  import { FlowConfigurationService } from '../../flow-configuration';
9
11
  import { ConfigurationRuntimeService } from './configuration-runtime.service';
10
12
  import { ConfigurationService } from './configuration.service';
@@ -12,20 +14,21 @@ import * as i0 from "@angular/core";
12
14
  import * as i1 from "./configuration-runtime.service";
13
15
  import * as i2 from "./configuration.service";
14
16
  import * as i3 from "../../../services";
15
- import * as i4 from "@veloceapps/components";
16
- import * as i5 from "../../flow-configuration";
17
- import * as i6 from "@veloceapps/api";
17
+ import * as i4 from "../../flow-configuration";
18
+ import * as i5 from "@veloceapps/api";
19
+ import * as i6 from "@veloceapps/api/v2";
20
+ import * as i7 from "@veloceapps/components";
18
21
  export class ConfigurationStateService {
19
- constructor(configurationRuntimeService, configurationService, quoteDraftService, toastService, flowStateService, flowInfoService, flowConfigurationService, flowStateApiService, quoteApiService) {
22
+ constructor(configurationRuntimeService, configurationService, flowStateService, flowInfoService, flowConfigurationService, flowStateApiService, salesTransactionService, salesTransactionApiService, toastService) {
20
23
  this.configurationRuntimeService = configurationRuntimeService;
21
24
  this.configurationService = configurationService;
22
- this.quoteDraftService = quoteDraftService;
23
- this.toastService = toastService;
24
25
  this.flowStateService = flowStateService;
25
26
  this.flowInfoService = flowInfoService;
26
27
  this.flowConfigurationService = flowConfigurationService;
27
28
  this.flowStateApiService = flowStateApiService;
28
- this.quoteApiService = quoteApiService;
29
+ this.salesTransactionService = salesTransactionService;
30
+ this.salesTransactionApiService = salesTransactionApiService;
31
+ this.toastService = toastService;
29
32
  this.isInitialized$ = new BehaviorSubject(false);
30
33
  this.canceledConfiguration$ = new Subject();
31
34
  this.NOT_INITIALIZED = Symbol();
@@ -49,9 +52,9 @@ export class ConfigurationStateService {
49
52
  request$ = this.initStateful$();
50
53
  }
51
54
  else {
52
- request$ = this.initStateless$();
55
+ request$ = this.configurationService.init$();
53
56
  }
54
- return request$.pipe(finalize(() => {
57
+ return request$.pipe(take(1), tap(() => {
55
58
  this.isInitialized$.next(true);
56
59
  this.canceledConfiguration$ = new Subject();
57
60
  }));
@@ -65,6 +68,7 @@ export class ConfigurationStateService {
65
68
  this.configurationStore = {};
66
69
  this.executedFunctions = {};
67
70
  this.configurationService.reset();
71
+ this.configurationRuntimeService.reset();
68
72
  }
69
73
  execute$(exec) {
70
74
  const request = this.execToRequest(exec);
@@ -133,50 +137,40 @@ export class ConfigurationStateService {
133
137
  }
134
138
  }), takeUntil(this.canceledConfiguration$));
135
139
  }
136
- saveConfiguration(flow) {
140
+ saveConfiguration() {
137
141
  if (this.isStatefulConfiguration) {
138
- return this.flowStateApiService
139
- .saveConfiguration(this.flowStateService.stateId ?? '', this.stateId ?? '')
140
- .pipe(switchMap(r => this.flowStateService.executeRequest$({}, true).pipe(map(() => r))));
142
+ return this.flowStateApiService.saveConfiguration(this.flowStateService.stateId ?? '', this.stateId ?? '').pipe(switchMap(r => this.flowStateService.executeRequest$({}, true).pipe(map(() => r))), map(r => ({ id: r.quoteId })));
143
+ }
144
+ const state = this.salesTransactionService.state;
145
+ if (!state) {
146
+ return of({ id: '' });
147
+ }
148
+ const { standalone } = this.flowInfoService.flow.properties;
149
+ if (standalone) {
150
+ return this.salesTransactionApiService.upsert(state);
151
+ }
152
+ const transactionContext = this.salesTransactionService.state;
153
+ const configurationRoot = this.configurationService.root;
154
+ if (!transactionContext || !configurationRoot) {
155
+ return of({ id: '' });
156
+ }
157
+ const stateItems = transactionContext.salesTransaction.salesTransactionItems;
158
+ const isNewTransactionItem = stateItems.every(ti => ti.id !== configurationRoot.id);
159
+ let salesTransactionItems;
160
+ if (isNewTransactionItem) {
161
+ salesTransactionItems = [...stateItems, configurationRoot];
141
162
  }
142
163
  else {
143
- if (!flow) {
144
- const quoteDraft = this.quoteDraftService.quoteDraft;
145
- if (!quoteDraft) {
146
- return of({ quoteId: '' });
147
- }
148
- const rootLineItem = this.configurationService.getSnapshot();
149
- const asset = this.configurationService.getAsset();
150
- const currentState = rootLineItem ? [rootLineItem] : [];
151
- const initialState = asset ? [asset] : [];
152
- return this.quoteApiService.upsertQuote({ ...quoteDraft, currentState, initialState });
153
- }
154
- else {
155
- const quoteDraft = this.quoteDraftService.quoteDraft;
156
- const lineItem = this.configurationService.getSnapshot();
157
- if (!quoteDraft || !lineItem) {
158
- return of({ quoteId: '' });
159
- }
160
- const isNewLineItem = quoteDraft.currentState.every(li => li.id !== lineItem.id);
161
- let currentState;
162
- if (isNewLineItem) {
163
- currentState = [...quoteDraft.currentState, lineItem];
164
- }
165
- else {
166
- currentState = quoteDraft.currentState.map(li => (li.id === lineItem.id ? lineItem : li));
167
- }
168
- const asset = this.configurationService.getAsset();
169
- const initialState = [...(this.quoteDraftService.quoteDraft?.initialState ?? [])];
170
- if (asset) {
171
- if (!initialState.some(li => li.id === asset.id)) {
172
- initialState.push(asset);
173
- }
174
- }
175
- return this.flowConfigurationService
176
- .calculate$({ ...quoteDraft, currentState, initialState })
177
- .pipe(map(() => ({ quoteId: '' })));
178
- }
164
+ salesTransactionItems = stateItems.map(ti => (ti.id === configurationRoot.id ? configurationRoot : ti));
179
165
  }
166
+ const newState = {
167
+ ...transactionContext,
168
+ salesTransaction: {
169
+ ...transactionContext.salesTransaction,
170
+ salesTransactionItems,
171
+ },
172
+ };
173
+ return this.flowConfigurationService.calculate$(newState).pipe(map(() => ({ id: '' })));
180
174
  }
181
175
  cancelConfiguration() {
182
176
  if (!this.isInitialized$.value) {
@@ -195,24 +189,23 @@ export class ConfigurationStateService {
195
189
  return this.flowInfoService.flow?.properties.stateful ?? false;
196
190
  }
197
191
  initStateful$() {
198
- this.ownerId = this.configurationRuntimeService.runtimeContext?.uiDefinitionContainer?.id ?? '';
199
- const lineItemId = this.configurationRuntimeService.runtimeContext?.properties?.lineItemId;
200
- if (!this.flowStateService.stateId) {
192
+ this.ownerId = this.configurationRuntimeService.uiDefinitionContainer?.id ?? '';
193
+ const { productId, transactionItemId } = this.flowInfoService.context;
194
+ if (!productId || !this.flowStateService.stateId) {
201
195
  return of(undefined);
202
196
  }
203
- const container = this.configurationRuntimeService.runtimeContext?.uiDefinitionContainer;
204
- const lineItem = this.configurationService.generateLineItem();
197
+ const container = this.configurationRuntimeService.uiDefinitionContainer;
205
198
  let request$;
206
- if (!lineItemId) {
199
+ if (!transactionItemId) {
207
200
  request$ = this.flowStateApiService.newConfiguration(this.flowStateService.stateId, {
208
- lineItem,
201
+ transactionItem: generateTransactionItem(productId),
209
202
  actionsOverride: container?.actions?.map(processor => ({ ...processor, ownerId: this.ownerId })),
210
203
  selectorsOverride: container?.selectors?.map(processor => ({ ...processor, ownerId: this.ownerId })),
211
204
  });
212
205
  }
213
206
  else {
214
207
  request$ = this.flowStateApiService.startConfiguration(this.flowStateService.stateId, {
215
- lineItemId,
208
+ transactionItemId,
216
209
  actionsOverride: container?.actions?.map(processor => ({ ...processor, ownerId: this.ownerId })),
217
210
  selectorsOverride: container?.selectors?.map(processor => ({ ...processor, ownerId: this.ownerId })),
218
211
  });
@@ -222,9 +215,6 @@ export class ConfigurationStateService {
222
215
  return undefined;
223
216
  }));
224
217
  }
225
- initStateless$() {
226
- return this.configurationService.configure().pipe(map(() => undefined));
227
- }
228
218
  execToRequest(exec) {
229
219
  return {
230
220
  actions: exec.actions?.map(action => ({
@@ -268,33 +258,31 @@ export class ConfigurationStateService {
268
258
  }
269
259
  executeStateless$(request) {
270
260
  this.executionInProgress$.next(true);
271
- return of(undefined).pipe(switchMap(() => {
261
+ return this.configurationService.state$.pipe(first(), switchMap(state => {
272
262
  // Apply actions and execute configuration/price call
273
263
  // No need to run configuration if no actions in the request
274
264
  if (!request.actions?.length) {
275
265
  return of(undefined);
276
266
  }
277
- let configurationRequest = this.configurationService.generateRequest(false);
278
267
  request.actions.forEach(action => {
279
- configurationRequest = this.executeActionScript(configurationRequest, action) ?? configurationRequest;
268
+ state = this.executeActionScript(state, action) ?? state;
280
269
  });
281
- configurationRequest = ConfigurationTranslatorUtils.lightenConfigurationRequest(configurationRequest);
282
- return this.configurationService.configureRequest$(configurationRequest);
270
+ return this.configurationService.configureRequest$(state);
283
271
  }), map(() => {
284
272
  // Run selectors and apply them to the state
285
- const configurationState = this.configurationService.stateSnapshot;
273
+ const configurationState = this.configurationService.state;
286
274
  if (!configurationState) {
287
275
  return { stateId: '', selectors: {} };
288
276
  }
289
277
  return this.runStatelessSelectors(request, configurationState);
290
278
  }), tap(() => this.executionInProgress$.next(false)), catchError(error => {
291
- const configurationState = this.configurationService.previousStateSnapshot;
279
+ const configurationState = this.configurationService.previousState;
292
280
  if (configurationState) {
293
281
  const selectorsResult = this.runStatelessSelectors(request, configurationState);
294
282
  this.handleSelectorsResponse(selectorsResult.selectors);
295
283
  }
296
284
  this.executionInProgress$.next(false);
297
- if (!this.configurationRuntimeService.uiDefinitionProperties.suppressToastMessages) {
285
+ if (!this.configurationRuntimeService.uiDefinitionProps.suppressToastMessages) {
298
286
  this.toastService.add({ severity: ToastType.error, summary: String(error) });
299
287
  }
300
288
  return throwError(() => error);
@@ -329,7 +317,7 @@ export class ConfigurationStateService {
329
317
  ])), map(([response]) => response), take(1));
330
318
  }
331
319
  executeActionScript(request, processor) {
332
- const { actions } = this.configurationRuntimeService.runtimeContext?.uiDefinitionContainer ?? {};
320
+ const { actions } = this.configurationRuntimeService.uiDefinitionContainer ?? {};
333
321
  const configurationProcessor = actions?.find(action => action.apiName === processor.apiName);
334
322
  if (!configurationProcessor?.script) {
335
323
  throw `ConfigurationProcessor ${processor.apiName} not found`;
@@ -337,7 +325,7 @@ export class ConfigurationStateService {
337
325
  return this.executeProcessorScript(request, configurationProcessor, processor.inputData);
338
326
  }
339
327
  executeSelectorScript(request, processor) {
340
- const { selectors } = this.configurationRuntimeService.runtimeContext?.uiDefinitionContainer ?? {};
328
+ const { selectors } = this.configurationRuntimeService.uiDefinitionContainer ?? {};
341
329
  const configurationProcessor = selectors?.find(selector => selector.apiName === processor.apiName);
342
330
  if (!configurationProcessor?.script) {
343
331
  throw `ConfigurationProcessor ${processor.apiName} not found`;
@@ -378,9 +366,9 @@ export class ConfigurationStateService {
378
366
  }, { stateId: '', selectors: {} });
379
367
  }
380
368
  }
381
- ConfigurationStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, deps: [{ token: i1.ConfigurationRuntimeService }, { token: i2.ConfigurationService }, { token: i3.QuoteDraftService }, { token: i4.ToastService }, { token: i3.FlowStateService }, { token: i3.FlowInfoService }, { token: i5.FlowConfigurationService }, { token: i6.FlowStateApiService }, { token: i6.QuoteApiService }], target: i0.ɵɵFactoryTarget.Injectable });
369
+ ConfigurationStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, deps: [{ token: i1.ConfigurationRuntimeService }, { token: i2.ConfigurationService }, { token: i3.FlowStateService }, { token: i3.FlowInfoService }, { token: i4.FlowConfigurationService }, { token: i5.FlowStateApiService }, { token: i3.SalesTransactionService }, { token: i6.SalesTransactionApiService }, { token: i7.ToastService }], target: i0.ɵɵFactoryTarget.Injectable });
382
370
  ConfigurationStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService });
383
371
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, decorators: [{
384
372
  type: Injectable
385
- }], ctorParameters: function () { return [{ type: i1.ConfigurationRuntimeService }, { type: i2.ConfigurationService }, { type: i3.QuoteDraftService }, { type: i4.ToastService }, { type: i3.FlowStateService }, { type: i3.FlowInfoService }, { type: i5.FlowConfigurationService }, { type: i6.FlowStateApiService }, { type: i6.QuoteApiService }]; } });
386
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zZGsvY29yZS9tb2R1bGVzL2NvbmZpZ3VyYXRpb24vc2VydmljZXMvY29uZmlndXJhdGlvbi1zdGF0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBcUIsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRixPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pFLE9BQU8sRUFJTCw0QkFBNEIsRUFFNUIsVUFBVSxFQU1WLFNBQVMsRUFFVCxJQUFJLEdBQ0wsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBYyxNQUFNLFFBQVEsQ0FBQztBQUN2RCxPQUFPLEVBQ0wsZUFBZSxFQUNmLE1BQU0sRUFDTixVQUFVLEVBQ1YsYUFBYSxFQUNiLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLFFBQVEsRUFDUixHQUFHLEVBRUgsRUFBRSxFQUNGLEtBQUssRUFDTCxXQUFXLEVBQ1gsT0FBTyxFQUNQLFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNULEdBQUcsRUFDSCxVQUFVLEdBQ1gsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFekYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDcEUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDOUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7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RU8scUJBQXFCLENBQzNCLE9BQXFDLEVBQ3JDLGtCQUFrQztRQUVsQyxPQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQ3ZELENBQUMsTUFBZ0MsRUFBRSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFO1lBQ3BELElBQUk7Z0JBQ0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRztvQkFDdEIsT0FBTyxFQUFFLElBQUk7b0JBQ2IsTUFBTSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLENBQUM7aUJBQ2pFLENBQUM7YUFDSDtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pCLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUc7b0JBQ3RCLE9BQU8sRUFBRSxLQUFLO29CQUNkLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2lCQUN4QixDQUFDO2FBQ0g7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLEVBQ0QsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FDL0IsQ0FBQztJQUNKLENBQUM7O3NIQTVlVSx5QkFBeUI7MEhBQXpCLHlCQUF5QjsyRkFBekIseUJBQXlCO2tCQURyQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmxvd1N0YXRlQXBpU2VydmljZSwgUXVvdGVBcGlTZXJ2aWNlLCBTYXZlUXVvdGVSZXNwb25zZSB9IGZyb20gJ0B2ZWxvY2VhcHBzL2FwaSc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UsIFRvYXN0VHlwZSB9IGZyb20gJ0B2ZWxvY2VhcHBzL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtcbiAgQ29uZmlndXJhdGlvblByb2Nlc3NvcixcbiAgQ29uZmlndXJhdGlvblByb2Nlc3NvclNjcmlwdEZuLFxuICBDb25maWd1cmF0aW9uUmVxdWVzdCxcbiAgQ29uZmlndXJhdGlvblRyYW5zbGF0b3JVdGlscyxcbiAgQ29uZmlndXJlUHJpY2UsXG4gIEVudGl0eVV0aWwsXG4gIEZsb3dTdGF0ZUV4ZWN1dGFibGVEVE8sXG4gIEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3QsXG4gIEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3REVE8sXG4gIEZsb3dTdGF0ZUV4ZWN1dGlvblJlc3VsdCxcbiAgRmxvd1N0YXRlU2VsZWN0b3JSZXNwb25zZSxcbiAgaXNEZWZpbmVkLFxuICBMaW5lSXRlbSxcbiAgVVVJRCxcbn0gZnJvbSAnQHZlbG9jZWFwcHMvY29yZSc7XG5pbXBvcnQgeyBhc3NpZ24sIGNsb25lRGVlcCwgRGljdGlvbmFyeSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGJ1ZmZlcixcbiAgY2F0Y2hFcnJvcixcbiAgY29tYmluZUxhdGVzdCxcbiAgZGVib3VuY2VUaW1lLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBmaW5hbGl6ZSxcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgc2hhcmUsXG4gIHNoYXJlUmVwbGF5LFxuICBTdWJqZWN0LFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFwLFxuICB0aHJvd0Vycm9yLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEZsb3dJbmZvU2VydmljZSwgRmxvd1N0YXRlU2VydmljZSwgUXVvdGVEcmFmdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBGbG93U3RhdGVTdWJzY3JpcHRpb25PcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvZmxvdy1zdGF0ZS50eXBlcyc7XG5pbXBvcnQgeyBGbG93Q29uZmlndXJhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9mbG93LWNvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvblJ1bnRpbWVTZXJ2aWNlIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uLXJ1bnRpbWUuc2VydmljZSc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uU2VydmljZSB9IGZyb20gJy4vY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcblxudHlwZSBTdGF0ZVN1YnNjcmlwdGlvbiA9IHtcbiAgcmVxdWVzdDogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdERUTztcbiAgZGF0YSQ6IEJlaGF2aW9yU3ViamVjdDx1bmtub3duPjtcbn07XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uU3RhdGVTZXJ2aWNlIHtcbiAgcHVibGljIGlzSW5pdGlhbGl6ZWQkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIGNhbmNlbGVkQ29uZmlndXJhdGlvbiQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgTk9UX0lOSVRJQUxJWkVEID0gU3ltYm9sKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgRVhFQ1VUSU9OX0JVRkZFUl9USU1FID0gMTAwO1xuXG4gIHByaXZhdGUgZXhlY3V0ZWRGdW5jdGlvbnM6IERpY3Rpb25hcnk8Q29uZmlndXJhdGlvblByb2Nlc3NvclNjcmlwdEZuPiA9IHt9O1xuICBwcml2YXRlIHN0YXRlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG93bmVySWQgPSAnJztcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBTdGF0ZVN1YnNjcmlwdGlvbj4gPSB7fTtcbiAgcHJpdmF0ZSBjb25maWd1cmF0aW9uU3RvcmU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgcHJpdmF0ZSBleGVjdXRpb25JblByb2dyZXNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBwcml2YXRlIHN0YXRlZnVsUmVxdWVzdFN0cmVhbSQgPSBuZXcgU3ViamVjdDxGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0RFRPPigpO1xuICBwcml2YXRlIHN0YXRlZnVsRXhlY3V0aW9uUmVxdWVzdCQ6IE9ic2VydmFibGU8Rmxvd1N0YXRlRXhlY3V0aW9uUmVzdWx0PjtcbiAgcHJpdmF0ZSBzdGF0ZWxlc3NFeGVjdXRpb25SZXF1ZXN0JDogT2JzZXJ2YWJsZTxGbG93U3RhdGVFeGVjdXRpb25SZXN1bHQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjb25maWd1cmF0aW9uUnVudGltZVNlcnZpY2U6IENvbmZpZ3VyYXRpb25SdW50aW1lU2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpZ3VyYXRpb25TZXJ2aWNlOiBDb25maWd1cmF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHF1b3RlRHJhZnRTZXJ2aWNlOiBRdW90ZURyYWZ0U2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmxvd1N0YXRlU2VydmljZTogRmxvd1N0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIGZsb3dJbmZvU2VydmljZTogRmxvd0luZm9TZXJ2aWNlLFxuICAgIHByaXZhdGUgZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlOiBGbG93Q29uZmlndXJhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmbG93U3RhdGVBcGlTZXJ2aWNlOiBGbG93U3RhdGVBcGlTZXJ2aWNlLFxuICAgIHByaXZhdGUgcXVvdGVBcGlTZXJ2aWNlOiBRdW90ZUFwaVNlcnZpY2UsXG4gICkge1xuICAgIHRoaXMuc3RhdGVmdWxFeGVjdXRpb25SZXF1ZXN0JCA9IHRoaXMuaW5pdEJ1ZmZlcmVkUmVxdWVzdCQoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNFeGVjdXRpb25JblByb2dyZXNzJCgpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRpb25JblByb2dyZXNzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0JCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBsZXQgcmVxdWVzdCQ7XG4gICAgaWYgKHRoaXMuZmxvd1N0YXRlU2VydmljZS5zdGF0ZUlkICYmIHRoaXMuaXNTdGF0ZWZ1bENvbmZpZ3VyYXRpb24pIHtcbiAgICAgIHJlcXVlc3QkID0gdGhpcy5pbml0U3RhdGVmdWwkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcXVlc3QkID0gdGhpcy5pbml0U3RhdGVsZXNzJCgpO1xuICAgIH1cblxuICAgIHJldHVybiByZXF1ZXN0JC5waXBlKFxuICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuY2FuY2VsZWRDb25maWd1cmF0aW9uJCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNsZWFudXAoKTogdm9pZCB7XG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLnN1YnNjcmlwdGlvbnMpLmZvckVhY2goKHsgZGF0YSQgfSkgPT4gZGF0YSQuY29tcGxldGUoKSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zID0ge307XG5cbiAgICBpZiAodGhpcy5zdGF0ZUlkKSB7XG4gICAgICB0aGlzLmNhbmNlbENvbmZpZ3VyYXRpb24oKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb25TdG9yZSA9IHt9O1xuICAgIHRoaXMuZXhlY3V0ZWRGdW5jdGlvbnMgPSB7fTtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLnJlc2V0KCk7XG4gIH1cblxuICBwdWJsaWMgZXhlY3V0ZSQoZXhlYzogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdCk6IE9ic2VydmFibGU8Rmxvd1N0YXRlRXhlY3V0aW9uUmVzdWx0WydzZWxlY3RvcnMnXT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmV4ZWNUb1JlcXVlc3QoZXhlYyk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUmVxdWVzdCQocmVxdWVzdCkucGlwZShcbiAgICAgIG1hcChyZXN1bHQgPT4ge1xuICAgICAgICAvLyBLZWVwIG9ubHkgcmVxdWVzdGVkIHJlc3VsdHNcbiAgICAgICAgY29uc3QgYWN0dWFsU2VsZWN0b3JzID0gT2JqZWN0LmVudHJpZXMocmVzdWx0LnNlbGVjdG9ycykucmVkdWNlKFxuICAgICAgICAgICh0cnVuazogUmVjb3JkPHN0cmluZywgRmxvd1N0YXRlU2VsZWN0b3JSZXNwb25zZT4sIFtyZXF1ZXN0SWQsIHJlc3VsdF0pID0+IHtcbiAgICAgICAgICAgIGlmIChleGVjLnNlbGVjdG9ycz8uW3JlcXVlc3RJZF0pIHtcbiAgICAgICAgICAgICAgdHJ1bmtbcmVxdWVzdElkXSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVuaztcbiAgICAgICAgICB9LFxuICAgICAgICAgIHt9LFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBhY3R1YWxTZWxlY3RvcnM7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGRpc3BhdGNoJChhY3Rpb25OYW1lOiBzdHJpbmcsIGlucHV0RGF0YTogdW5rbm93biA9IHt9KTogT2JzZXJ2YWJsZTxGbG93U3RhdGVFeGVjdXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCBleGVjOiBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0ID0ge1xuICAgICAgYWN0aW9uczogW3sgbmFtZTogYWN0aW9uTmFtZSwgaW5wdXREYXRhIH1dLFxuICAgIH07XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuZXhlY1RvUmVxdWVzdChleGVjKTtcblxuICAgIGNvbnN0IGV4ZWN1dGlvblJlcXVlc3QkID0gdGhpcy5leGVjdXRlUmVxdWVzdCQocmVxdWVzdCk7XG5cbiAgICBpZiAodGhpcy5pc1N0YXRlZnVsQ29uZmlndXJhdGlvbikge1xuICAgICAgcmV0dXJuIGV4ZWN1dGlvblJlcXVlc3QkO1xuICAgIH1cblxuICAgIC8vIHByZXZlbnQgcGFyYWxsZWwgY29uZmlndXJhdGlvbiByZXF1ZXN0cyBpbiBzdGF0ZWxlc3MgbW9kZVxuICAgIGlmICghdGhpcy5zdGF0ZWxlc3NFeGVjdXRpb25SZXF1ZXN0JCkge1xuICAgICAgdGhpcy5zdGF0ZWxlc3NFeGVjdXRpb25SZXF1ZXN0JCA9IGV4ZWN1dGlvblJlcXVlc3QkLnBpcGUoXG4gICAgICAgIHNoYXJlUmVwbGF5KCksXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIGZpbmFsaXplKCgpID0+ICh0aGlzLnN0YXRlbGVzc0V4ZWN1dGlvblJlcXVlc3QkID0gbnVsbCkpLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVsZXNzRXhlY3V0aW9uUmVxdWVzdCQ7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0JDxSZXNwb25zZSA9IHVua25vd24+KFxuICAgIHNlbGVjdG9yTmFtZTogc3RyaW5nLFxuICAgIGlucHV0RGF0YTogdW5rbm93biA9IHt9LFxuICApOiBPYnNlcnZhYmxlPEZsb3dTdGF0ZVNlbGVjdG9yUmVzcG9uc2U8UmVzcG9uc2U+PiB7XG4gICAgY29uc3QgcmVxdWVzdElkID0gVVVJRC5VVUlEKCk7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuZXhlY1RvUmVxdWVzdCh7XG4gICAgICBzZWxlY3RvcnM6IHtcbiAgICAgICAgW3JlcXVlc3RJZF06IHtcbiAgICAgICAgICBuYW1lOiBzZWxlY3Rvck5hbWUsXG4gICAgICAgICAgaW5wdXREYXRhLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVSZXF1ZXN0JChyZXF1ZXN0KS5waXBlKFxuICAgICAgbWFwKHJlc3BvbnNlID0+IHJlc3BvbnNlLnNlbGVjdG9yc1tyZXF1ZXN0SWRdIGFzIEZsb3dTdGF0ZVNlbGVjdG9yUmVzcG9uc2U8UmVzcG9uc2U+KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHN1YnNjcmliZSQ8UmVzcG9uc2UgPSB1bmtub3duPihcbiAgICBzZWxlY3Rvck5hbWU6IHN0cmluZyxcbiAgICBpbnB1dERhdGE6IHVua25vd24gPSB7fSxcbiAgICBvcHRpb25zPzogRmxvd1N0YXRlU3Vic2NyaXB0aW9uT3B0aW9ucyxcbiAgKTogT2JzZXJ2YWJsZTxGbG93U3RhdGVTZWxlY3RvclJlc3BvbnNlPFJlc3BvbnNlPj4ge1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IFVVSUQuVVVJRCgpO1xuXG4gICAgbGV0IHN1YnNjcmlwdGlvbiA9IHRoaXMuc3Vic2NyaXB0aW9uc1tyZXF1ZXN0SWRdO1xuICAgIGlmICghc3Vic2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5leGVjVG9SZXF1ZXN0KHtcbiAgICAgICAgc2VsZWN0b3JzOiB7XG4gICAgICAgICAgW3JlcXVlc3RJZF06IHtcbiAgICAgICAgICAgIG5hbWU6IHNlbGVjdG9yTmFtZSxcbiAgICAgICAgICAgIGlucHV0RGF0YSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHN1YnNjcmlwdGlvbiA9IHtcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgZGF0YSQ6IG5ldyBCZWhhdmlvclN1YmplY3Q8dW5rbm93bj4odGhpcy5OT1RfSU5JVElBTElaRUQpLFxuICAgICAgfTtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uc1tyZXF1ZXN0SWRdID0gc3Vic2NyaXB0aW9uO1xuXG4gICAgICBpZiAoIW9wdGlvbnM/LmNvbGQpIHtcbiAgICAgICAgdGhpcy5leGVjdXRlUmVxdWVzdCQocmVxdWVzdCkuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1YnNjcmlwdGlvbi5kYXRhJC5waXBlKFxuICAgICAgZmlsdGVyKGRhdGEgPT4gZGF0YSAhPSB0aGlzLk5PVF9JTklUSUFMSVpFRCksXG4gICAgICBtYXAoZGF0YSA9PiBkYXRhIGFzIEZsb3dTdGF0ZVNlbGVjdG9yUmVzcG9uc2U8UmVzcG9uc2U+KSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zdWJzY3JpcHRpb25zW3JlcXVlc3RJZF0/LmRhdGEkLm9ic2VydmVkKSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuc3Vic2NyaXB0aW9uc1tyZXF1ZXN0SWRdO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLmNhbmNlbGVkQ29uZmlndXJhdGlvbiQpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUNvbmZpZ3VyYXRpb24oZmxvdz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPFNhdmVRdW90ZVJlc3BvbnNlPiB7XG4gICAgaWYgKHRoaXMuaXNTdGF0ZWZ1bENvbmZpZ3VyYXRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLmZsb3dTdGF0ZUFwaVNlcnZpY2VcbiAgICAgICAgLnNhdmVDb25maWd1cmF0aW9uKHRoaXMuZmxvd1N0YXRlU2VydmljZS5zdGF0ZUlkID8/ICcnLCB0aGlzLnN0YXRlSWQgPz8gJycpXG4gICAgICAgIC5waXBlKHN3aXRjaE1hcChyID0+IHRoaXMuZmxvd1N0YXRlU2VydmljZS5leGVjdXRlUmVxdWVzdCQoe30sIHRydWUpLnBpcGUobWFwKCgpID0+IHIpKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWZsb3cpIHtcbiAgICAgICAgY29uc3QgcXVvdGVEcmFmdCA9IHRoaXMucXVvdGVEcmFmdFNlcnZpY2UucXVvdGVEcmFmdDtcbiAgICAgICAgaWYgKCFxdW90ZURyYWZ0KSB7XG4gICAgICAgICAgcmV0dXJuIG9mKHsgcXVvdGVJZDogJycgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb290TGluZUl0ZW0gPSB0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldFNuYXBzaG90KCk7XG4gICAgICAgIGNvbnN0IGFzc2V0ID0gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5nZXRBc3NldCgpO1xuICAgICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSByb290TGluZUl0ZW0gPyBbcm9vdExpbmVJdGVtXSA6IFtdO1xuICAgICAgICBjb25zdCBpbml0aWFsU3RhdGUgPSBhc3NldCA/IFthc3NldF0gOiBbXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5xdW90ZUFwaVNlcnZpY2UudXBzZXJ0UXVvdGUoeyAuLi5xdW90ZURyYWZ0LCBjdXJyZW50U3RhdGUsIGluaXRpYWxTdGF0ZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHF1b3RlRHJhZnQgPSB0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLnF1b3RlRHJhZnQ7XG4gICAgICAgIGNvbnN0IGxpbmVJdGVtID0gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5nZXRTbmFwc2hvdCgpO1xuXG4gICAgICAgIGlmICghcXVvdGVEcmFmdCB8fCAhbGluZUl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gb2YoeyBxdW90ZUlkOiAnJyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzTmV3TGluZUl0ZW0gPSBxdW90ZURyYWZ0LmN1cnJlbnRTdGF0ZS5ldmVyeShsaSA9PiBsaS5pZCAhPT0gbGluZUl0ZW0uaWQpO1xuXG4gICAgICAgIGxldCBjdXJyZW50U3RhdGU6IExpbmVJdGVtW107XG4gICAgICAgIGlmIChpc05ld0xpbmVJdGVtKSB7XG4gICAgICAgICAgY3VycmVudFN0YXRlID0gWy4uLnF1b3RlRHJhZnQuY3VycmVudFN0YXRlLCBsaW5lSXRlbV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudFN0YXRlID0gcXVvdGVEcmFmdC5jdXJyZW50U3RhdGUubWFwKGxpID0+IChsaS5pZCA9PT0gbGluZUl0ZW0uaWQgPyBsaW5lSXRlbSA6IGxpKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhc3NldCA9IHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UuZ2V0QXNzZXQoKTtcbiAgICAgICAgY29uc3QgaW5pdGlhbFN0YXRlID0gWy4uLih0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLnF1b3RlRHJhZnQ/LmluaXRpYWxTdGF0ZSA/PyBbXSldO1xuICAgICAgICBpZiAoYXNzZXQpIHtcbiAgICAgICAgICBpZiAoIWluaXRpYWxTdGF0ZS5zb21lKGxpID0+IGxpLmlkID09PSBhc3NldC5pZCkpIHtcbiAgICAgICAgICAgIGluaXRpYWxTdGF0ZS5wdXNoKGFzc2V0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5mbG93Q29uZmlndXJhdGlvblNlcnZpY2VcbiAgICAgICAgICAuY2FsY3VsYXRlJCh7IC4uLnF1b3RlRHJhZnQsIGN1cnJlbnRTdGF0ZSwgaW5pdGlhbFN0YXRlIH0pXG4gICAgICAgICAgLnBpcGUobWFwKCgpID0+ICh7IHF1b3RlSWQ6ICcnIH0pKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbmNlbENvbmZpZ3VyYXRpb24oKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQkLnZhbHVlKSB7XG4gICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICB0aGlzLmNhbmNlbGVkQ29uZmlndXJhdGlvbiQubmV4dCgpO1xuICAgIHRoaXMuY2FuY2VsZWRDb25maWd1cmF0aW9uJC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IHt9O1xuXG4gICAgdGhpcy5pc0luaXRpYWxpemVkJC5uZXh0KGZhbHNlKTtcbiAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCQudmFsdWUgfHwgIXRoaXMuaXNTdGF0ZWZ1bENvbmZpZ3VyYXRpb24pIHtcbiAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mbG93U3RhdGVBcGlTZXJ2aWNlLmNhbmNlbENvbmZpZ3VyYXRpb24odGhpcy5mbG93U3RhdGVTZXJ2aWNlLnN0YXRlSWQgPz8gJycsIHRoaXMuc3RhdGVJZCA/PyAnJyk7XG4gIH1cblxuICBwcml2YXRlIGdldCBpc1N0YXRlZnVsQ29uZmlndXJhdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mbG93SW5mb1NlcnZpY2UuZmxvdz8ucHJvcGVydGllcy5zdGF0ZWZ1bCA/PyBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFN0YXRlZnVsJCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICB0aGlzLm93bmVySWQgPSB0aGlzLmNvbmZpZ3VyYXRpb25SdW50aW1lU2VydmljZS5ydW50aW1lQ29udGV4dD8udWlEZWZpbml0aW9uQ29udGFpbmVyPy5pZCA/PyAnJztcbiAgICBjb25zdCBsaW5lSXRlbUlkID0gdGhpcy5jb25maWd1cmF0aW9uUnVudGltZVNlcnZpY2UucnVudGltZUNvbnRleHQ/LnByb3BlcnRpZXM/LmxpbmVJdGVtSWQ7XG4gICAgaWYgKCF0aGlzLmZsb3dTdGF0ZVNlcnZpY2Uuc3RhdGVJZCkge1xuICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb25maWd1cmF0aW9uUnVudGltZVNlcnZpY2UucnVudGltZUNvbnRleHQ/LnVpRGVmaW5pdGlvbkNvbnRhaW5lcjtcblxuICAgIGNvbnN0IGxpbmVJdGVtID0gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5nZW5lcmF0ZUxpbmVJdGVtKCk7XG5cbiAgICBsZXQgcmVxdWVzdCQ6IE9ic2VydmFibGU8Rmxvd1N0YXRlRXhlY3V0aW9uUmVzdWx0PjtcblxuICAgIGlmICghbGluZUl0ZW1JZCkge1xuICAgICAgcmVxdWVzdCQgPSB0aGlzLmZsb3dTdGF0ZUFwaVNlcnZpY2UubmV3Q29uZmlndXJhdGlvbih0aGlzLmZsb3dTdGF0ZVNlcnZpY2Uuc3RhdGVJZCwge1xuICAgICAgICBsaW5lSXRlbSxcbiAgICAgICAgYWN0aW9uc092ZXJyaWRlOiBjb250YWluZXI/LmFjdGlvbnM/Lm1hcChwcm9jZXNzb3IgPT4gKHsgLi4ucHJvY2Vzc29yLCBvd25lcklkOiB0aGlzLm93bmVySWQgfSkpLFxuICAgICAgICBzZWxlY3RvcnNPdmVycmlkZTogY29udGFpbmVyPy5zZWxlY3RvcnM/Lm1hcChwcm9jZXNzb3IgPT4gKHsgLi4ucHJvY2Vzc29yLCBvd25lcklkOiB0aGlzLm93bmVySWQgfSkpLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcXVlc3QkID0gdGhpcy5mbG93U3RhdGVBcGlTZXJ2aWNlLnN0YXJ0Q29uZmlndXJhdGlvbih0aGlzLmZsb3dTdGF0ZVNlcnZpY2Uuc3RhdGVJZCwge1xuICAgICAgICBsaW5lSXRlbUlkLFxuICAgICAgICBhY3Rpb25zT3ZlcnJpZGU6IGNvbnRhaW5lcj8uYWN0aW9ucz8ubWFwKHByb2Nlc3NvciA9PiAoeyAuLi5wcm9jZXNzb3IsIG93bmVySWQ6IHRoaXMub3duZXJJZCB9KSksXG4gICAgICAgIHNlbGVjdG9yc092ZXJyaWRlOiBjb250YWluZXI/LnNlbGVjdG9ycz8ubWFwKHByb2Nlc3NvciA9PiAoeyAuLi5wcm9jZXNzb3IsIG93bmVySWQ6IHRoaXMub3duZXJJZCB9KSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVxdWVzdCQucGlwZShcbiAgICAgIG1hcChyID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZUlkID0gci5zdGF0ZUlkO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFN0YXRlbGVzcyQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UuY29uZmlndXJlKCkucGlwZShtYXAoKCkgPT4gdW5kZWZpbmVkKSk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWNUb1JlcXVlc3QoZXhlYzogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdCk6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3REVE8ge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb25zOiBleGVjLmFjdGlvbnM/Lm1hcChhY3Rpb24gPT4gKHtcbiAgICAgICAgYXBpTmFtZTogYWN0aW9uLm5hbWUsXG4gICAgICAgIG93bmVySWQ6IHRoaXMub3duZXJJZCxcbiAgICAgICAgaW5wdXREYXRhOiBhY3Rpb24uaW5wdXREYXRhID8/IHt9LFxuICAgICAgfSkpLFxuICAgICAgc2VsZWN0b3JzOlxuICAgICAgICBleGVjLnNlbGVjdG9ycyAmJlxuICAgICAgICBPYmplY3QuZW50cmllcyhleGVjLnNlbGVjdG9ycykucmVkdWNlKFxuICAgICAgICAgICh0cnVuazogUmVjb3JkPHN0cmluZywgRmxvd1N0YXRlRXhlY3V0YWJsZURUTz4sIFtrZXksIHNlbGVjdG9yXSkgPT4gKHtcbiAgICAgICAgICAgIC4uLnRydW5rLFxuICAgICAgICAgICAgW2tleV06IHsgYXBpTmFtZTogc2VsZWN0b3IubmFtZSwgb3duZXJJZDogdGhpcy5vd25lcklkLCBpbnB1dERhdGE6IHNlbGVjdG9yLmlucHV0RGF0YSA/PyB7fSB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHt9LFxuICAgICAgICApLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVNlbGVjdG9yc1Jlc3BvbnNlKHNlbGVjdG9yczogUmVjb3JkPHN0cmluZywgRmxvd1N0YXRlU2VsZWN0b3JSZXNwb25zZTx1bmtub3duPj4pOiB2b2lkIHtcbiAgICBPYmplY3QuZW50cmllcyhzZWxlY3RvcnMpLmZvckVhY2goKFtyZXF1ZXN0SWQsIHNlbGVjdG9yUmVzdWx0XSkgPT4ge1xuICAgICAgaWYgKCFzZWxlY3RvclJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiBUb2FzdFR5cGUuZXJyb3IsIHN1bW1hcnk6IHNlbGVjdG9yUmVzdWx0LmVycm9yTWVzc2FnZSB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uJCA9IHRoaXMuc3Vic2NyaXB0aW9uc1tyZXF1ZXN0SWRdPy5kYXRhJDtcbiAgICAgIGlmIChzdWJzY3JpcHRpb24kKSB7XG4gICAgICAgIHN1YnNjcmlwdGlvbiQubmV4dChzZWxlY3RvclJlc3VsdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVSZXF1ZXN0JChcbiAgICByZXE6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3REVE8sXG4gICAgZm9yY2VTdWJzY3JpcHRpb25zPzogYm9vbGVhbixcbiAgKTogT2JzZXJ2YWJsZTxGbG93U3RhdGVFeGVjdXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCBmdWxsUmVxdWVzdCA9IGNsb25lRGVlcChyZXEpO1xuICAgIGlmIChmdWxsUmVxdWVzdC5hY3Rpb25zPy5sZW5ndGggfHwgZm9yY2VTdWJzY3JpcHRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IHN1YnNjcmlwdGlvbiBvZiBPYmplY3QudmFsdWVzKHRoaXMuc3Vic2NyaXB0aW9ucykpIHtcbiAgICAgICAgZnVsbFJlcXVlc3Quc2VsZWN0b3JzID0gYXNzaWduKGZ1bGxSZXF1ZXN0LnNlbGVjdG9ycywgc3Vic2NyaXB0aW9uLnJlcXVlc3Quc2VsZWN0b3JzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZXhlY3V0aW9uJDtcblxuICAgIGlmICh0aGlzLmlzU3RhdGVmdWxDb25maWd1cmF0aW9uKSB7XG4gICAgICBleGVjdXRpb24kID0gdGhpcy5leGVjdXRlU3RhdGVmdWwkKGZ1bGxSZXF1ZXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhlY3V0aW9uJCA9IHRoaXMuZXhlY3V0ZVN0YXRlbGVzcyQoZnVsbFJlcXVlc3QpO1xuICAgIH1cblxuICAgIHJldHVybiBleGVjdXRpb24kLnBpcGUodGFwKHJlc3VsdCA9PiB0aGlzLmhhbmRsZVNlbGVjdG9yc1Jlc3BvbnNlKHJlc3VsdC5zZWxlY3RvcnMpKSk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVTdGF0ZWxlc3MkKHJlcXVlc3Q6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3REVE8pOiBPYnNlcnZhYmxlPEZsb3dTdGF0ZUV4ZWN1dGlvblJlc3VsdD4ge1xuICAgIHRoaXMuZXhlY3V0aW9uSW5Qcm9ncmVzcyQubmV4dCh0cnVlKTtcblxuICAgIHJldHVybiBvZih1bmRlZmluZWQpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICAvLyBBcHBseSBhY3Rpb25zIGFuZCBleGVjdXRlIGNvbmZpZ3VyYXRpb24vcHJpY2UgY2FsbFxuICAgICAgICAvLyBObyBuZWVkIHRvIHJ1biBjb25maWd1cmF0aW9uIGlmIG5vIGFjdGlvbnMgaW4gdGhlIHJlcXVlc3RcbiAgICAgICAgaWYgKCFyZXF1ZXN0LmFjdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvbmZpZ3VyYXRpb25SZXF1ZXN0ID0gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5nZW5lcmF0ZVJlcXVlc3QoZmFsc2UpO1xuICAgICAgICByZXF1ZXN0LmFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgICAgIGNvbmZpZ3VyYXRpb25SZXF1ZXN0ID0gdGhpcy5leGVjdXRlQWN0aW9uU2NyaXB0KGNvbmZpZ3VyYXRpb25SZXF1ZXN0LCBhY3Rpb24pID8/IGNvbmZpZ3VyYXRpb25SZXF1ZXN0O1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25maWd1cmF0aW9uUmVxdWVzdCA9IENvbmZpZ3VyYXRpb25UcmFuc2xhdG9yVXRpbHMubGlnaHRlbkNvbmZpZ3VyYXRpb25SZXF1ZXN0KGNvbmZpZ3VyYXRpb25SZXF1ZXN0KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5jb25maWd1cmVSZXF1ZXN0JChjb25maWd1cmF0aW9uUmVxdWVzdCk7XG4gICAgICB9KSxcbiAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgIC8vIFJ1biBzZWxlY3RvcnMgYW5kIGFwcGx5IHRoZW0gdG8gdGhlIHN0YXRlXG4gICAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb25TdGF0ZSA9IHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2Uuc3RhdGVTbmFwc2hvdDtcbiAgICAgICAgaWYgKCFjb25maWd1cmF0aW9uU3RhdGUpIHtcbiAgICAgICAgICByZXR1cm4geyBzdGF0ZUlkOiAnJywgc2VsZWN0b3JzOiB7fSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucnVuU3RhdGVsZXNzU2VsZWN0b3JzKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25TdGF0ZSk7XG4gICAgICB9KSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLmV4ZWN1dGlvbkluUHJvZ3Jlc3MkLm5leHQoZmFsc2UpKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICBjb25zdCBjb25maWd1cmF0aW9uU3RhdGUgPSB0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLnByZXZpb3VzU3RhdGVTbmFwc2hvdDtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25TdGF0ZSkge1xuICAgICAgICAgIGNvbnN0IHNlbGVjdG9yc1Jlc3VsdCA9IHRoaXMucnVuU3RhdGVsZXNzU2VsZWN0b3JzKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25TdGF0ZSk7XG4gICAgICAgICAgdGhpcy5oYW5kbGVTZWxlY3RvcnNSZXNwb25zZShzZWxlY3RvcnNSZXN1bHQuc2VsZWN0b3JzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV4ZWN1dGlvbkluUHJvZ3Jlc3MkLm5leHQoZmFsc2UpO1xuXG4gICAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uUnVudGltZVNlcnZpY2UudWlEZWZpbml0aW9uUHJvcGVydGllcy5zdXBwcmVzc1RvYXN0TWVzc2FnZXMpIHtcbiAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5hZGQoeyBzZXZlcml0eTogVG9hc3RUeXBlLmVycm9yLCBzdW1tYXJ5OiBTdHJpbmcoZXJyb3IpIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEJ1ZmZlcmVkUmVxdWVzdCQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVmdWxSZXF1ZXN0U3RyZWFtJC5waXBlKFxuICAgICAgYnVmZmVyKHRoaXMuc3RhdGVmdWxSZXF1ZXN0U3RyZWFtJC5waXBlKGRlYm91bmNlVGltZSh0aGlzLkVYRUNVVElPTl9CVUZGRVJfVElNRSkpKSxcbiAgICAgIHN3aXRjaE1hcChyZXF1ZXN0cyA9PiB7XG4gICAgICAgIGlmICghdGhpcy5mbG93U3RhdGVTZXJ2aWNlLnN0YXRlSWQgfHwgIXRoaXMuc3RhdGVJZCkge1xuICAgICAgICAgIHRocm93ICdTdGF0ZWZ1bCBzZXNzaW9uIGlzIG5vdCBpbml0aWFsaXplZCc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtZXJnZSBidWZmZXJlZCByZXF1ZXN0c1xuICAgICAgICBjb25zdCByZXF1ZXN0OiBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0RFRPID0ge1xuICAgICAgICAgIGFjdGlvbnM6IHJlcXVlc3RzLmZsYXRNYXAoKHsgYWN0aW9ucyB9KSA9PiBhY3Rpb25zKS5maWx0ZXIoaXNEZWZpbmVkKSxcbiAgICAgICAgICBzZWxlY3RvcnM6IHJlcXVlc3RzXG4gICAgICAgICAgICAubWFwKCh7IHNlbGVjdG9ycyB9KSA9PiBzZWxlY3RvcnMpXG4gICAgICAgICAgICAuZmlsdGVyKGlzRGVmaW5lZClcbiAgICAgICAgICAgIC5yZWR1Y2UoKGFjYywgc2VsZWN0b3JzTWFwKSA9PiBPYmplY3QuYXNzaWduKGFjYywgc2VsZWN0b3JzTWFwKSwge30pLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuZXhlY3V0aW9uSW5Qcm9ncmVzcyQubmV4dCh0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxvd1N0YXRlQXBpU2VydmljZS5leGVjdXRlQ29uZmlndXJhdGlvbih0aGlzLmZsb3dTdGF0ZVNlcnZpY2Uuc3RhdGVJZCwgdGhpcy5zdGF0ZUlkLCByZXF1ZXN0KTtcbiAgICAgIH0pLFxuICAgICAgdGFwKCh7IHN0YXRlSWQgfSkgPT4gKHRoaXMuc3RhdGVJZCA9IHN0YXRlSWQpKSxcbiAgICAgIHNoYXJlKCksXG4gICAgICB0YXAoKCkgPT4gdGhpcy5leGVjdXRpb25JblByb2dyZXNzJC5uZXh0KGZhbHNlKSksXG4gICAgICBjYXRjaEVycm9yKGUgPT4ge1xuICAgICAgICB0aGlzLmV4ZWN1dGlvbkluUHJvZ3Jlc3MkLm5leHQoZmFsc2UpO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVTdGF0ZWZ1bCQocmVxdWVzdDogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdERUTyk6IE9ic2VydmFibGU8Rmxvd1N0YXRlRXhlY3V0aW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0aW9uSW5Qcm9ncmVzcyQucGlwZShcbiAgICAgIGZpbHRlcihpblByb2dyZXNzID0+ICFpblByb2dyZXNzKSxcbiAgICAgIHRha2UoMSksXG4gICAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgICAgLy8gbWFrZSBzdXJlIHN0cmVhbSBzd2l0Y2hlcyB0byBzdGF0ZWZ1bEV4ZWN1dGlvblJlcXVlc3QkIGJlZm9yZSBwdXNoaW5nIGFuIGV4ZWN1dGlvbiByZXF1ZXN0XG4gICAgICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICAgIHRoaXMuc3RhdGVmdWxFeGVjdXRpb25SZXF1ZXN0JCxcbiAgICAgICAgICBvZih1bmRlZmluZWQpLnBpcGUodGFwKCgpID0+IHRoaXMuc3RhdGVmdWxSZXF1ZXN0U3RyZWFtJC5uZXh0KHJlcXVlc3QpKSksXG4gICAgICAgIF0pLFxuICAgICAgKSxcbiAgICAgIG1hcCgoW3Jlc3BvbnNlXSkgPT4gcmVzcG9uc2UpLFxuICAgICAgdGFrZSgxKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBleGVjdXRlQWN0aW9uU2NyaXB0KHJlcXVlc3Q6IENvbmZpZ3VyYXRpb25SZXF1ZXN0LCBwcm9jZXNzb3I6IEZsb3dTdGF0ZUV4ZWN1dGFibGVEVE8pOiBDb25maWd1cmF0aW9uUmVxdWVzdCB7XG4gICAgY29uc3QgeyBhY3Rpb25zIH0gPSB0aGlzLmNvbmZpZ3VyYXRpb25SdW50aW1lU2VydmljZS5ydW50aW1lQ29udGV4dD8udWlEZWZpbml0aW9uQ29udGFpbmVyID8/IHt9O1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb25Qcm9jZXNzb3IgPSBhY3Rpb25zPy5maW5kKGFjdGlvbiA9PiBhY3Rpb24uYXBpTmFtZSA9PT0gcHJvY2Vzc29yLmFwaU5hbWUpO1xuXG4gICAgaWYgKCFjb25maWd1cmF0aW9uUHJvY2Vzc29yPy5zY3JpcHQpIHtcbiAgICAgIHRocm93IGBDb25maWd1cmF0aW9uUHJvY2Vzc29yICR7cHJvY2Vzc29yLmFwaU5hbWV9IG5vdCBmb3VuZGA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVByb2Nlc3NvclNjcmlwdChyZXF1ZXN0LCBjb25maWd1cmF0aW9uUHJvY2Vzc29yLCBwcm9jZXNzb3IuaW5wdXREYXRhKSBhcyBDb25maWd1cmF0aW9uUmVxdWVzdDtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZVNlbGVjdG9yU2NyaXB0KHJlcXVlc3Q6IENvbmZpZ3VyZVByaWNlLCBwcm9jZXNzb3I6IEZsb3dTdGF0ZUV4ZWN1dGFibGVEVE8pOiB1bmtub3duIHtcbiAgICBjb25zdCB7IHNlbGVjdG9ycyB9ID0gdGhpcy5jb25maWd1cmF0aW9uUnVudGltZVNlcnZpY2UucnVudGltZUNvbnRleHQ/LnVpRGVmaW5pdGlvbkNvbnRhaW5lciA/PyB7fTtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uUHJvY2Vzc29yID0gc2VsZWN0b3JzPy5maW5kKHNlbGVjdG9yID0+IHNlbGVjdG9yLmFwaU5hbWUgPT09IHByb2Nlc3Nvci5hcGlOYW1lKTtcblxuICAgIGlmICghY29uZmlndXJhdGlvblByb2Nlc3Nvcj8uc2NyaXB0KSB7XG4gICAgICB0aHJvdyBgQ29uZmlndXJhdGlvblByb2Nlc3NvciAke3Byb2Nlc3Nvci5hcGlOYW1lfSBub3QgZm91bmRgO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVQcm9jZXNzb3JTY3JpcHQocmVxdWVzdCwgY29uZmlndXJhdGlvblByb2Nlc3NvciwgcHJvY2Vzc29yLmlucHV0RGF0YSk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVQcm9jZXNzb3JTY3JpcHQoXG4gICAgcmVxdWVzdDogQ29uZmlndXJhdGlvblJlcXVlc3QgfCBDb25maWd1cmVQcmljZSxcbiAgICBjb25maWd1cmF0aW9uUHJvY2Vzc29yOiBDb25maWd1cmF0aW9uUHJvY2Vzc29yLFxuICAgIGlucHV0RGF0YTogdW5rbm93bixcbiAgKTogdW5rbm93biB7XG4gICAgbGV0IGZ1bmN0aW9uVG9FeGVjdXRlID0gdGhpcy5leGVjdXRlZEZ1bmN0aW9uc1tjb25maWd1cmF0aW9uUHJvY2Vzc29yLmFwaU5hbWVdO1xuICAgIGlmICghZnVuY3Rpb25Ub0V4ZWN1dGUpIHtcbiAgICAgIGNvbnN0IHNjcmlwdCA9IGAke2NvbmZpZ3VyYXRpb25Qcm9jZXNzb3Iuc2NyaXB0fVxcbnJldHVybiB0cmFuc2Zvcm07YDtcbiAgICAgIGNvbnN0IHNvdXJjZU1hcCA9IGBcXG4vLyMgc291cmNlVVJMPSR7Y29uZmlndXJhdGlvblByb2Nlc3Nvci5hcGlOYW1lfS5qc2A7XG4gICAgICBmdW5jdGlvblRvRXhlY3V0ZSA9IG5ldyBGdW5jdGlvbihzY3JpcHQgKyBzb3VyY2VNYXApKCkgYXMgQ29uZmlndXJhdGlvblByb2Nlc3NvclNjcmlwdEZuO1xuICAgICAgdGhpcy5leGVjdXRlZEZ1bmN0aW9uc1tjb25maWd1cmF0aW9uUHJvY2Vzc29yLmFwaU5hbWVdID0gZnVuY3Rpb25Ub0V4ZWN1dGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uVG9FeGVjdXRlKHtcbiAgICAgIHJlcXVlc3QsXG4gICAgICBpbnB1dERhdGEsXG4gICAgICBmbG93U3RvcmU6IHRoaXMuZmxvd1N0YXRlU2VydmljZS5nZXRGbG93U3RvcmUoKSxcbiAgICAgIGNvbmZpZ3VyYXRpb25TdG9yZTogdGhpcy5jb25maWd1cmF0aW9uU3RvcmUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJ1blN0YXRlbGVzc1NlbGVjdG9ycyhcbiAgICByZXF1ZXN0OiBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0RFRPLFxuICAgIGNvbmZpZ3VyYXRpb25TdGF0ZTogQ29uZmlndXJlUHJpY2UsXG4gICk6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlc3VsdCB7XG4gICAgcmV0dXJuIEVudGl0eVV0aWwuZW50cmllcyhyZXF1ZXN0LnNlbGVjdG9ycyA/PyB7fSkucmVkdWNlKFxuICAgICAgKHJlc3VsdDogRmxvd1N0YXRlRXhlY3V0aW9uUmVzdWx0LCBba2V5LCBzZWxlY3Rvcl0pID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXN1bHQuc2VsZWN0b3JzW2tleV0gPSB7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgcmVzdWx0OiB0aGlzLmV4ZWN1dGVTZWxlY3RvclNjcmlwdChjb25maWd1cmF0aW9uU3RhdGUsIHNlbGVjdG9yKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICByZXN1bHQuc2VsZWN0b3JzW2tleV0gPSB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZTogU3RyaW5nKGUpLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIHsgc3RhdGVJZDogJycsIHNlbGVjdG9yczoge30gfSxcbiAgICApO1xuICB9XG59XG4iXX0=
373
+ }], ctorParameters: function () { return [{ type: i1.ConfigurationRuntimeService }, { type: i2.ConfigurationService }, { type: i3.FlowStateService }, { type: i3.FlowInfoService }, { type: i4.FlowConfigurationService }, { type: i5.FlowStateApiService }, { type: i3.SalesTransactionService }, { type: i6.SalesTransactionApiService }, { type: i7.ToastService }]; } });
374
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zZGsvY29yZS9tb2R1bGVzL2NvbmZpZ3VyYXRpb24vc2VydmljZXMvY29uZmlndXJhdGlvbi1zdGF0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLDBCQUEwQixFQUFrQyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hHLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakUsT0FBTyxFQUdMLFVBQVUsRUFNVixTQUFTLEVBR1QsSUFBSSxHQUNMLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQWMsTUFBTSxRQUFRLENBQUM7QUFDdkQsT0FBTyxFQUNMLGVBQWUsRUFDZixNQUFNLEVBQ04sVUFBVSxFQUNWLGFBQWEsRUFDYixZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUNMLEdBQUcsRUFFSCxFQUFFLEVBQ0YsS0FBSyxFQUNMLFdBQVcsRUFDWCxPQUFPLEVBQ1AsU0FBUyxFQUNULElBQUksRUFDSixTQUFTLEVBQ1QsR0FBRyxFQUNILFVBQVUsR0FDWCxNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUvRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUs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RUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQy9CLENBQUM7SUFDSixDQUFDOztzSEFqZVUseUJBQXlCOzBIQUF6Qix5QkFBeUI7MkZBQXpCLHlCQUF5QjtrQkFEckMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZsb3dTdGF0ZUFwaVNlcnZpY2UgfSBmcm9tICdAdmVsb2NlYXBwcy9hcGknO1xuaW1wb3J0IHsgU2FsZXNUcmFuc2FjdGlvbkFwaVNlcnZpY2UsIFNhbGVzVHJhbnNhY3Rpb25VcHNlcnRSZXNwb25zZSB9IGZyb20gJ0B2ZWxvY2VhcHBzL2FwaS92Mic7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UsIFRvYXN0VHlwZSB9IGZyb20gJ0B2ZWxvY2VhcHBzL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtcbiAgQ29uZmlndXJhdGlvblByb2Nlc3NvcixcbiAgQ29uZmlndXJhdGlvblByb2Nlc3NvclNjcmlwdEZuLFxuICBFbnRpdHlVdGlsLFxuICBGbG93U3RhdGVFeGVjdXRhYmxlRFRPLFxuICBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0LFxuICBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0RFRPLFxuICBGbG93U3RhdGVFeGVjdXRpb25SZXN1bHQsXG4gIEZsb3dTdGF0ZVNlbGVjdG9yUmVzcG9uc2UsXG4gIGlzRGVmaW5lZCxcbiAgU2FsZXNUcmFuc2FjdGlvbkl0ZW0sXG4gIFRyYW5zYWN0aW9uQ29udGV4dCxcbiAgVVVJRCxcbn0gZnJvbSAnQHZlbG9jZWFwcHMvY29yZSc7XG5pbXBvcnQgeyBhc3NpZ24sIGNsb25lRGVlcCwgRGljdGlvbmFyeSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGJ1ZmZlcixcbiAgY2F0Y2hFcnJvcixcbiAgY29tYmluZUxhdGVzdCxcbiAgZGVib3VuY2VUaW1lLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBmaW5hbGl6ZSxcbiAgZmlyc3QsXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIHNoYXJlLFxuICBzaGFyZVJlcGxheSxcbiAgU3ViamVjdCxcbiAgc3dpdGNoTWFwLFxuICB0YWtlLFxuICB0YWtlVW50aWwsXG4gIHRhcCxcbiAgdGhyb3dFcnJvcixcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBGbG93SW5mb1NlcnZpY2UsIEZsb3dTdGF0ZVNlcnZpY2UsIFNhbGVzVHJhbnNhY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgRmxvd1N0YXRlU3Vic2NyaXB0aW9uT3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2Zsb3ctc3RhdGUudHlwZXMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUcmFuc2FjdGlvbkl0ZW0gfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgeyBGbG93Q29uZmlndXJhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9mbG93LWNvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvblJ1bnRpbWVTZXJ2aWNlIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uLXJ1bnRpbWUuc2VydmljZSc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uU2VydmljZSB9IGZyb20gJy4vY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcblxudHlwZSBTdGF0ZVN1YnNjcmlwdGlvbiA9IHtcbiAgcmVxdWVzdDogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdERUTztcbiAgZGF0YSQ6IEJlaGF2aW9yU3ViamVjdDx1bmtub3duPjtcbn07XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uU3RhdGVTZXJ2aWNlIHtcbiAgcHVibGljIGlzSW5pdGlhbGl6ZWQkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIGNhbmNlbGVkQ29uZmlndXJhdGlvbiQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgTk9UX0lOSVRJQUxJWkVEID0gU3ltYm9sKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgRVhFQ1VUSU9OX0JVRkZFUl9USU1FID0gMTAwO1xuXG4gIHByaXZhdGUgZXhlY3V0ZWRGdW5jdGlvbnM6IERpY3Rpb25hcnk8Q29uZmlndXJhdGlvblByb2Nlc3NvclNjcmlwdEZuPiA9IHt9O1xuICBwcml2YXRlIHN0YXRlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG93bmVySWQgPSAnJztcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBTdGF0ZVN1YnNjcmlwdGlvbj4gPSB7fTtcbiAgcHJpdmF0ZSBjb25maWd1cmF0aW9uU3RvcmU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgcHJpdmF0ZSBleGVjdXRpb25JblByb2dyZXNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBwcml2YXRlIHN0YXRlZnVsUmVxdWVzdFN0cmVhbSQgPSBuZXcgU3ViamVjdDxGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0RFRPPigpO1xuICBwcml2YXRlIHN0YXRlZnVsRXhlY3V0aW9uUmVxdWVzdCQ6IE9ic2VydmFibGU8Rmxvd1N0YXRlRXhlY3V0aW9uUmVzdWx0PjtcbiAgcHJpdmF0ZSBzdGF0ZWxlc3NFeGVjdXRpb25SZXF1ZXN0JDogT2JzZXJ2YWJsZTxGbG93U3RhdGVFeGVjdXRpb25SZXN1bHQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjb25maWd1cmF0aW9uUnVudGltZVNlcnZpY2U6IENvbmZpZ3VyYXRpb25SdW50aW1lU2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpZ3VyYXRpb25TZXJ2aWNlOiBDb25maWd1cmF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGZsb3dTdGF0ZVNlcnZpY2U6IEZsb3dTdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmbG93SW5mb1NlcnZpY2U6IEZsb3dJbmZvU2VydmljZSxcbiAgICBwcml2YXRlIGZsb3dDb25maWd1cmF0aW9uU2VydmljZTogRmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgZmxvd1N0YXRlQXBpU2VydmljZTogRmxvd1N0YXRlQXBpU2VydmljZSxcbiAgICBwcml2YXRlIHNhbGVzVHJhbnNhY3Rpb25TZXJ2aWNlOiBTYWxlc1RyYW5zYWN0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHNhbGVzVHJhbnNhY3Rpb25BcGlTZXJ2aWNlOiBTYWxlc1RyYW5zYWN0aW9uQXBpU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxuICApIHtcbiAgICB0aGlzLnN0YXRlZnVsRXhlY3V0aW9uUmVxdWVzdCQgPSB0aGlzLmluaXRCdWZmZXJlZFJlcXVlc3QkKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRXhlY3V0aW9uSW5Qcm9ncmVzcyQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0aW9uSW5Qcm9ncmVzcyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdCQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgbGV0IHJlcXVlc3QkO1xuICAgIGlmICh0aGlzLmZsb3dTdGF0ZVNlcnZpY2Uuc3RhdGVJZCAmJiB0aGlzLmlzU3RhdGVmdWxDb25maWd1cmF0aW9uKSB7XG4gICAgICByZXF1ZXN0JCA9IHRoaXMuaW5pdFN0YXRlZnVsJCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXF1ZXN0JCA9IHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UuaW5pdCQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVxdWVzdCQucGlwZShcbiAgICAgIHRha2UoMSksXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuY2FuY2VsZWRDb25maWd1cmF0aW9uJCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNsZWFudXAoKTogdm9pZCB7XG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLnN1YnNjcmlwdGlvbnMpLmZvckVhY2goKHsgZGF0YSQgfSkgPT4gZGF0YSQuY29tcGxldGUoKSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zID0ge307XG5cbiAgICBpZiAodGhpcy5zdGF0ZUlkKSB7XG4gICAgICB0aGlzLmNhbmNlbENvbmZpZ3VyYXRpb24oKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb25TdG9yZSA9IHt9O1xuICAgIHRoaXMuZXhlY3V0ZWRGdW5jdGlvbnMgPSB7fTtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLnJlc2V0KCk7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uUnVudGltZVNlcnZpY2UucmVzZXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBleGVjdXRlJChleGVjOiBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0KTogT2JzZXJ2YWJsZTxGbG93U3RhdGVFeGVjdXRpb25SZXN1bHRbJ3NlbGVjdG9ycyddPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuZXhlY1RvUmVxdWVzdChleGVjKTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVSZXF1ZXN0JChyZXF1ZXN0KS5waXBlKFxuICAgICAgbWFwKHJlc3VsdCA9PiB7XG4gICAgICAgIC8vIEtlZXAgb25seSByZXF1ZXN0ZWQgcmVzdWx0c1xuICAgICAgICBjb25zdCBhY3R1YWxTZWxlY3RvcnMgPSBPYmplY3QuZW50cmllcyhyZXN1bHQuc2VsZWN0b3JzKS5yZWR1Y2UoXG4gICAgICAgICAgKHRydW5rOiBSZWNvcmQ8c3RyaW5nLCBGbG93U3RhdGVTZWxlY3RvclJlc3BvbnNlPiwgW3JlcXVlc3RJZCwgcmVzdWx0XSkgPT4ge1xuICAgICAgICAgICAgaWYgKGV4ZWMuc2VsZWN0b3JzPy5bcmVxdWVzdElkXSkge1xuICAgICAgICAgICAgICB0cnVua1tyZXF1ZXN0SWRdID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydW5rO1xuICAgICAgICAgIH0sXG4gICAgICAgICAge30sXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIGFjdHVhbFNlbGVjdG9ycztcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZGlzcGF0Y2gkKGFjdGlvbk5hbWU6IHN0cmluZywgaW5wdXREYXRhOiB1bmtub3duID0ge30pOiBPYnNlcnZhYmxlPEZsb3dTdGF0ZUV4ZWN1dGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IGV4ZWM6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3QgPSB7XG4gICAgICBhY3Rpb25zOiBbeyBuYW1lOiBhY3Rpb25OYW1lLCBpbnB1dERhdGEgfV0sXG4gICAgfTtcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5leGVjVG9SZXF1ZXN0KGV4ZWMpO1xuXG4gICAgY29uc3QgZXhlY3V0aW9uUmVxdWVzdCQgPSB0aGlzLmV4ZWN1dGVSZXF1ZXN0JChyZXF1ZXN0KTtcblxuICAgIGlmICh0aGlzLmlzU3RhdGVmdWxDb25maWd1cmF0aW9uKSB7XG4gICAgICByZXR1cm4gZXhlY3V0aW9uUmVxdWVzdCQ7XG4gICAgfVxuXG4gICAgLy8gcHJldmVudCBwYXJhbGxlbCBjb25maWd1cmF0aW9uIHJlcXVlc3RzIGluIHN0YXRlbGVzcyBtb2RlXG4gICAgaWYgKCF0aGlzLnN0YXRlbGVzc0V4ZWN1dGlvblJlcXVlc3QkKSB7XG4gICAgICB0aGlzLnN0YXRlbGVzc0V4ZWN1dGlvblJlcXVlc3QkID0gZXhlY3V0aW9uUmVxdWVzdCQucGlwZShcbiAgICAgICAgc2hhcmVSZXBsYXkoKSxcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgZmluYWxpemUoKCkgPT4gKHRoaXMuc3RhdGVsZXNzRXhlY3V0aW9uUmVxdWVzdCQgPSBudWxsKSksXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGF0ZWxlc3NFeGVjdXRpb25SZXF1ZXN0JDtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3QkPFJlc3BvbnNlID0gdW5rbm93bj4oXG4gICAgc2VsZWN0b3JOYW1lOiBzdHJpbmcsXG4gICAgaW5wdXREYXRhOiB1bmtub3duID0ge30sXG4gICk6IE9ic2VydmFibGU8Rmxvd1N0YXRlU2VsZWN0b3JSZXNwb25zZTxSZXNwb25zZT4+IHtcbiAgICBjb25zdCByZXF1ZXN0SWQgPSBVVUlELlVVSUQoKTtcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5leGVjVG9SZXF1ZXN0KHtcbiAgICAgIHNlbGVjdG9yczoge1xuICAgICAgICBbcmVxdWVzdElkXToge1xuICAgICAgICAgIG5hbWU6IHNlbGVjdG9yTmFtZSxcbiAgICAgICAgICBpbnB1dERhdGEsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVJlcXVlc3QkKHJlcXVlc3QpLnBpcGUoXG4gICAgICBtYXAocmVzcG9uc2UgPT4gcmVzcG9uc2Uuc2VsZWN0b3JzW3JlcXVlc3RJZF0gYXMgRmxvd1N0YXRlU2VsZWN0b3JSZXNwb25zZTxSZXNwb25zZT4pLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc3Vic2NyaWJlJDxSZXNwb25zZSA9IHVua25vd24+KFxuICAgIHNlbGVjdG9yTmFtZTogc3RyaW5nLFxuICAgIGlucHV0RGF0YTogdW5rbm93biA9IHt9LFxuICAgIG9wdGlvbnM/OiBGbG93U3RhdGVTdWJzY3JpcHRpb25PcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPEZsb3dTdGF0ZVNlbGVjdG9yUmVzcG9uc2U8UmVzcG9uc2U+PiB7XG4gICAgY29uc3QgcmVxdWVzdElkID0gVVVJRC5VVUlEKCk7XG5cbiAgICBsZXQgc3Vic2NyaXB0aW9uID0gdGhpcy5zdWJzY3JpcHRpb25zW3JlcXVlc3RJZF07XG4gICAgaWYgKCFzdWJzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmV4ZWNUb1JlcXVlc3Qoe1xuICAgICAgICBzZWxlY3RvcnM6IHtcbiAgICAgICAgICBbcmVxdWVzdElkXToge1xuICAgICAgICAgICAgbmFtZTogc2VsZWN0b3JOYW1lLFxuICAgICAgICAgICAgaW5wdXREYXRhLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgc3Vic2NyaXB0aW9uID0ge1xuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBkYXRhJDogbmV3IEJlaGF2aW9yU3ViamVjdDx1bmtub3duPih0aGlzLk5PVF9JTklUSUFMSVpFRCksXG4gICAgICB9O1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zW3JlcXVlc3RJZF0gPSBzdWJzY3JpcHRpb247XG5cbiAgICAgIGlmICghb3B0aW9ucz8uY29sZCkge1xuICAgICAgICB0aGlzLmV4ZWN1dGVSZXF1ZXN0JChyZXF1ZXN0KS5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3Vic2NyaXB0aW9uLmRhdGEkLnBpcGUoXG4gICAgICBmaWx0ZXIoZGF0YSA9PiBkYXRhICE9IHRoaXMuTk9UX0lOSVRJQUxJWkVEKSxcbiAgICAgIG1hcChkYXRhID0+IGRhdGEgYXMgRmxvd1N0YXRlU2VsZWN0b3JSZXNwb25zZTxSZXNwb25zZT4pLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN1YnNjcmlwdGlvbnNbcmVxdWVzdElkXT8uZGF0YSQub2JzZXJ2ZWQpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5zdWJzY3JpcHRpb25zW3JlcXVlc3RJZF07XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgdGFrZVVudGlsKHRoaXMuY2FuY2VsZWRDb25maWd1cmF0aW9uJCksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlQ29uZmlndXJhdGlvbigpOiBPYnNlcnZhYmxlPFNhbGVzVHJhbnNhY3Rpb25VcHNlcnRSZXNwb25zZT4ge1xuICAgIGlmICh0aGlzLmlzU3RhdGVmdWxDb25maWd1cmF0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy5mbG93U3RhdGVBcGlTZXJ2aWNlLnNhdmVDb25maWd1cmF0aW9uKHRoaXMuZmxvd1N0YXRlU2VydmljZS5zdGF0ZUlkID8/ICcnLCB0aGlzLnN0YXRlSWQgPz8gJycpLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcChyID0+IHRoaXMuZmxvd1N0YXRlU2VydmljZS5leGVjdXRlUmVxdWVzdCQoe30sIHRydWUpLnBpcGUobWFwKCgpID0+IHIpKSksXG4gICAgICAgIG1hcChyID0+ICh7IGlkOiByLnF1b3RlSWQgfSkpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc2FsZXNUcmFuc2FjdGlvblNlcnZpY2Uuc3RhdGU7XG4gICAgaWYgKCFzdGF0ZSkge1xuICAgICAgcmV0dXJuIG9mKHsgaWQ6ICcnIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHsgc3RhbmRhbG9uZSB9ID0gdGhpcy5mbG93SW5mb1NlcnZpY2UuZmxvdy5wcm9wZXJ0aWVzO1xuICAgIGlmIChzdGFuZGFsb25lKSB7XG4gICAgICByZXR1cm4gdGhpcy5zYWxlc1RyYW5zYWN0aW9uQXBpU2VydmljZS51cHNlcnQoc3RhdGUpO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uQ29udGV4dCA9IHRoaXMuc2FsZXNUcmFuc2FjdGlvblNlcnZpY2Uuc3RhdGU7XG4gICAgY29uc3QgY29uZmlndXJhdGlvblJvb3QgPSB0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLnJvb3Q7XG4gICAgaWYgKCF0cmFuc2FjdGlvbkNvbnRleHQgfHwgIWNvbmZpZ3VyYXRpb25Sb290KSB7XG4gICAgICByZXR1cm4gb2YoeyBpZDogJycgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGVJdGVtcyA9IHRyYW5zYWN0aW9uQ29udGV4dC5zYWxlc1RyYW5zYWN0aW9uLnNhbGVzVHJhbnNhY3Rpb25JdGVtcztcbiAgICBjb25zdCBpc05ld1RyYW5zYWN0aW9uSXRlbSA9IHN0YXRlSXRlbXMuZXZlcnkodGkgPT4gdGkuaWQgIT09IGNvbmZpZ3VyYXRpb25Sb290LmlkKTtcblxuICAgIGxldCBzYWxlc1RyYW5zYWN0aW9uSXRlbXM6IFNhbGVzVHJhbnNhY3Rpb25JdGVtW107XG4gICAgaWYgKGlzTmV3VHJhbnNhY3Rpb25JdGVtKSB7XG4gICAgICBzYWxlc1RyYW5zYWN0aW9uSXRlbXMgPSBbLi4uc3RhdGVJdGVtcywgY29uZmlndXJhdGlvblJvb3RdO1xuICAgIH0gZWxzZSB7XG4gICAgICBzYWxlc1RyYW5zYWN0aW9uSXRlbXMgPSBzdGF0ZUl0ZW1zLm1hcCh0aSA9PiAodGkuaWQgPT09IGNvbmZpZ3VyYXRpb25Sb290LmlkID8gY29uZmlndXJhdGlvblJvb3QgOiB0aSkpO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1N0YXRlOiBUcmFuc2FjdGlvbkNvbnRleHQgPSB7XG4gICAgICAuLi50cmFuc2FjdGlvbkNvbnRleHQsXG4gICAgICBzYWxlc1RyYW5zYWN0aW9uOiB7XG4gICAgICAgIC4uLnRyYW5zYWN0aW9uQ29udGV4dC5zYWxlc1RyYW5zYWN0aW9uLFxuICAgICAgICBzYWxlc1RyYW5zYWN0aW9uSXRlbXMsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5mbG93Q29uZmlndXJhdGlvblNlcnZpY2UuY2FsY3VsYXRlJChuZXdTdGF0ZSkucGlwZShtYXAoKCkgPT4gKHsgaWQ6ICcnIH0pKSk7XG4gIH1cblxuICBwdWJsaWMgY2FuY2VsQ29uZmlndXJhdGlvbigpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCQudmFsdWUpIHtcbiAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIHRoaXMuY2FuY2VsZWRDb25maWd1cmF0aW9uJC5uZXh0KCk7XG4gICAgdGhpcy5jYW5jZWxlZENvbmZpZ3VyYXRpb24kLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zID0ge307XG5cbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQkLm5leHQoZmFsc2UpO1xuICAgIGlmICghdGhpcy5pc0luaXRpYWxpemVkJC52YWx1ZSB8fCAhdGhpcy5pc1N0YXRlZnVsQ29uZmlndXJhdGlvbikge1xuICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZsb3dTdGF0ZUFwaVNlcnZpY2UuY2FuY2VsQ29uZmlndXJhdGlvbih0aGlzLmZsb3dTdGF0ZVNlcnZpY2Uuc3RhdGVJZCA/PyAnJywgdGhpcy5zdGF0ZUlkID8/ICcnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGlzU3RhdGVmdWxDb25maWd1cmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZsb3dJbmZvU2VydmljZS5mbG93Py5wcm9wZXJ0aWVzLnN0YXRlZnVsID8/IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0U3RhdGVmdWwkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHRoaXMub3duZXJJZCA9IHRoaXMuY29uZmlndXJhdGlvblJ1bnRpbWVTZXJ2aWNlLnVpRGVmaW5pdGlvbkNvbnRhaW5lcj8uaWQgPz8gJyc7XG4gICAgY29uc3QgeyBwcm9kdWN0SWQsIHRyYW5zYWN0aW9uSXRlbUlkIH0gPSB0aGlzLmZsb3dJbmZvU2VydmljZS5jb250ZXh0O1xuICAgIGlmICghcHJvZHVjdElkIHx8ICF0aGlzLmZsb3dTdGF0ZVNlcnZpY2Uuc3RhdGVJZCkge1xuICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb25maWd1cmF0aW9uUnVudGltZVNlcnZpY2UudWlEZWZpbml0aW9uQ29udGFpbmVyO1xuXG4gICAgbGV0IHJlcXVlc3QkOiBPYnNlcnZhYmxlPEZsb3dTdGF0ZUV4ZWN1dGlvblJlc3VsdD47XG5cbiAgICBpZiAoIXRyYW5zYWN0aW9uSXRlbUlkKSB7XG4gICAgICByZXF1ZXN0JCA9IHRoaXMuZmxvd1N0YXRlQXBpU2VydmljZS5uZXdDb25maWd1cmF0aW9uKHRoaXMuZmxvd1N0YXRlU2VydmljZS5zdGF0ZUlkLCB7XG4gICAgICAgIHRyYW5zYWN0aW9uSXRlbTogZ2VuZXJhdGVUcmFuc2FjdGlvbkl0ZW0ocHJvZHVjdElkKSxcbiAgICAgICAgYWN0aW9uc092ZXJyaWRlOiBjb250YWluZXI/LmFjdGlvbnM/Lm1hcChwcm9jZXNzb3IgPT4gKHsgLi4ucHJvY2Vzc29yLCBvd25lcklkOiB0aGlzLm93bmVySWQgfSkpLFxuICAgICAgICBzZWxlY3RvcnNPdmVycmlkZTogY29udGFpbmVyPy5zZWxlY3RvcnM/Lm1hcChwcm9jZXNzb3IgPT4gKHsgLi4ucHJvY2Vzc29yLCBvd25lcklkOiB0aGlzLm93bmVySWQgfSkpLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcXVlc3QkID0gdGhpcy5mbG93U3RhdGVBcGlTZXJ2aWNlLnN0YXJ0Q29uZmlndXJhdGlvbih0aGlzLmZsb3dTdGF0ZVNlcnZpY2Uuc3RhdGVJZCwge1xuICAgICAgICB0cmFuc2FjdGlvbkl0ZW1JZCxcbiAgICAgICAgYWN0aW9uc092ZXJyaWRlOiBjb250YWluZXI/LmFjdGlvbnM/Lm1hcChwcm9jZXNzb3IgPT4gKHsgLi4ucHJvY2Vzc29yLCBvd25lcklkOiB0aGlzLm93bmVySWQgfSkpLFxuICAgICAgICBzZWxlY3RvcnNPdmVycmlkZTogY29udGFpbmVyPy5zZWxlY3RvcnM/Lm1hcChwcm9jZXNzb3IgPT4gKHsgLi4ucHJvY2Vzc29yLCBvd25lcklkOiB0aGlzLm93bmVySWQgfSkpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcXVlc3QkLnBpcGUoXG4gICAgICBtYXAociA9PiB7XG4gICAgICAgIHRoaXMuc3RhdGVJZCA9IHIuc3RhdGVJZDtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWNUb1JlcXVlc3QoZXhlYzogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdCk6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3REVE8ge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb25zOiBleGVjLmFjdGlvbnM/Lm1hcChhY3Rpb24gPT4gKHtcbiAgICAgICAgYXBpTmFtZTogYWN0aW9uLm5hbWUsXG4gICAgICAgIG93bmVySWQ6IHRoaXMub3duZXJJZCxcbiAgICAgICAgaW5wdXREYXRhOiBhY3Rpb24uaW5wdXREYXRhID8/IHt9LFxuICAgICAgfSkpLFxuICAgICAgc2VsZWN0b3JzOlxuICAgICAgICBleGVjLnNlbGVjdG9ycyAmJlxuICAgICAgICBPYmplY3QuZW50cmllcyhleGVjLnNlbGVjdG9ycykucmVkdWNlKFxuICAgICAgICAgICh0cnVuazogUmVjb3JkPHN0cmluZywgRmxvd1N0YXRlRXhlY3V0YWJsZURUTz4sIFtrZXksIHNlbGVjdG9yXSkgPT4gKHtcbiAgICAgICAgICAgIC4uLnRydW5rLFxuICAgICAgICAgICAgW2tleV06IHsgYXBpTmFtZTogc2VsZWN0b3IubmFtZSwgb3duZXJJZDogdGhpcy5vd25lcklkLCBpbnB1dERhdGE6IHNlbGVjdG9yLmlucHV0RGF0YSA/PyB7fSB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHt9LFxuICAgICAgICApLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVNlbGVjdG9yc1Jlc3BvbnNlKHNlbGVjdG9yczogUmVjb3JkPHN0cmluZywgRmxvd1N0YXRlU2VsZWN0b3JSZXNwb25zZTx1bmtub3duPj4pOiB2b2lkIHtcbiAgICBPYmplY3QuZW50cmllcyhzZWxlY3RvcnMpLmZvckVhY2goKFtyZXF1ZXN0SWQsIHNlbGVjdG9yUmVzdWx0XSkgPT4ge1xuICAgICAgaWYgKCFzZWxlY3RvclJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiBUb2FzdFR5cGUuZXJyb3IsIHN1bW1hcnk6IHNlbGVjdG9yUmVzdWx0LmVycm9yTWVzc2FnZSB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uJCA9IHRoaXMuc3Vic2NyaXB0aW9uc1tyZXF1ZXN0SWRdPy5kYXRhJDtcbiAgICAgIGlmIChzdWJzY3JpcHRpb24kKSB7XG4gICAgICAgIHN1YnNjcmlwdGlvbiQubmV4dChzZWxlY3RvclJlc3VsdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVSZXF1ZXN0JChcbiAgICByZXE6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3REVE8sXG4gICAgZm9yY2VTdWJzY3JpcHRpb25zPzogYm9vbGVhbixcbiAgKTogT2JzZXJ2YWJsZTxGbG93U3RhdGVFeGVjdXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCBmdWxsUmVxdWVzdCA9IGNsb25lRGVlcChyZXEpO1xuICAgIGlmIChmdWxsUmVxdWVzdC5hY3Rpb25zPy5sZW5ndGggfHwgZm9yY2VTdWJzY3JpcHRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IHN1YnNjcmlwdGlvbiBvZiBPYmplY3QudmFsdWVzKHRoaXMuc3Vic2NyaXB0aW9ucykpIHtcbiAgICAgICAgZnVsbFJlcXVlc3Quc2VsZWN0b3JzID0gYXNzaWduKGZ1bGxSZXF1ZXN0LnNlbGVjdG9ycywgc3Vic2NyaXB0aW9uLnJlcXVlc3Quc2VsZWN0b3JzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZXhlY3V0aW9uJDtcblxuICAgIGlmICh0aGlzLmlzU3RhdGVmdWxDb25maWd1cmF0aW9uKSB7XG4gICAgICBleGVjdXRpb24kID0gdGhpcy5leGVjdXRlU3RhdGVmdWwkKGZ1bGxSZXF1ZXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhlY3V0aW9uJCA9IHRoaXMuZXhlY3V0ZVN0YXRlbGVzcyQoZnVsbFJlcXVlc3QpO1xuICAgIH1cblxuICAgIHJldHVybiBleGVjdXRpb24kLnBpcGUodGFwKHJlc3VsdCA9PiB0aGlzLmhhbmRsZVNlbGVjdG9yc1Jlc3BvbnNlKHJlc3VsdC5zZWxlY3RvcnMpKSk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVTdGF0ZWxlc3MkKHJlcXVlc3Q6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3REVE8pOiBPYnNlcnZhYmxlPEZsb3dTdGF0ZUV4ZWN1dGlvblJlc3VsdD4ge1xuICAgIHRoaXMuZXhlY3V0aW9uSW5Qcm9ncmVzcyQubmV4dCh0cnVlKTtcblxuICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLnN0YXRlJC5waXBlKFxuICAgICAgZmlyc3QoKSxcbiAgICAgIHN3aXRjaE1hcChzdGF0ZSA9PiB7XG4gICAgICAgIC8vIEFwcGx5IGFjdGlvbnMgYW5kIGV4ZWN1dGUgY29uZmlndXJhdGlvbi9wcmljZSBjYWxsXG4gICAgICAgIC8vIE5vIG5lZWQgdG8gcnVuIGNvbmZpZ3VyYXRpb24gaWYgbm8gYWN0aW9ucyBpbiB0aGUgcmVxdWVzdFxuICAgICAgICBpZiAoIXJlcXVlc3QuYWN0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXF1ZXN0LmFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgICAgIHN0YXRlID0gdGhpcy5leGVjdXRlQWN0aW9uU2NyaXB0KHN0YXRlLCBhY3Rpb24pID8/IHN0YXRlO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5jb25maWd1cmVSZXF1ZXN0JChzdGF0ZSk7XG4gICAgICB9KSxcbiAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgIC8vIFJ1biBzZWxlY3RvcnMgYW5kIGFwcGx5IHRoZW0gdG8gdGhlIHN0YXRlXG4gICAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb25TdGF0ZSA9IHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2Uuc3RhdGU7XG4gICAgICAgIGlmICghY29uZmlndXJhdGlvblN0YXRlKSB7XG4gICAgICAgICAgcmV0dXJuIHsgc3RhdGVJZDogJycsIHNlbGVjdG9yczoge30gfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnJ1blN0YXRlbGVzc1NlbGVjdG9ycyhyZXF1ZXN0LCBjb25maWd1cmF0aW9uU3RhdGUpO1xuICAgICAgfSksXG4gICAgICB0YXAoKCkgPT4gdGhpcy5leGVjdXRpb25JblByb2dyZXNzJC5uZXh0KGZhbHNlKSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgY29uc3QgY29uZmlndXJhdGlvblN0YXRlID0gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5wcmV2aW91c1N0YXRlO1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvblN0YXRlKSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0b3JzUmVzdWx0ID0gdGhpcy5ydW5TdGF0ZWxlc3NTZWxlY3RvcnMocmVxdWVzdCwgY29uZmlndXJhdGlvblN0YXRlKTtcbiAgICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdG9yc1Jlc3BvbnNlKHNlbGVjdG9yc1Jlc3VsdC5zZWxlY3RvcnMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXhlY3V0aW9uSW5Qcm9ncmVzcyQubmV4dChmYWxzZSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb25SdW50aW1lU2VydmljZS51aURlZmluaXRpb25Qcm9wcy5zdXBwcmVzc1RvYXN0TWVzc2FnZXMpIHtcbiAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5hZGQoeyBzZXZlcml0eTogVG9hc3RUeXBlLmVycm9yLCBzdW1tYXJ5OiBTdHJpbmcoZXJyb3IpIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEJ1ZmZlcmVkUmVxdWVzdCQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVmdWxSZXF1ZXN0U3RyZWFtJC5waXBlKFxuICAgICAgYnVmZmVyKHRoaXMuc3RhdGVmdWxSZXF1ZXN0U3RyZWFtJC5waXBlKGRlYm91bmNlVGltZSh0aGlzLkVYRUNVVElPTl9CVUZGRVJfVElNRSkpKSxcbiAgICAgIHN3aXRjaE1hcChyZXF1ZXN0cyA9PiB7XG4gICAgICAgIGlmICghdGhpcy5mbG93U3RhdGVTZXJ2aWNlLnN0YXRlSWQgfHwgIXRoaXMuc3RhdGVJZCkge1xuICAgICAgICAgIHRocm93ICdTdGF0ZWZ1bCBzZXNzaW9uIGlzIG5vdCBpbml0aWFsaXplZCc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtZXJnZSBidWZmZXJlZCByZXF1ZXN0c1xuICAgICAgICBjb25zdCByZXF1ZXN0OiBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0RFRPID0ge1xuICAgICAgICAgIGFjdGlvbnM6IHJlcXVlc3RzLmZsYXRNYXAoKHsgYWN0aW9ucyB9KSA9PiBhY3Rpb25zKS5maWx0ZXIoaXNEZWZpbmVkKSxcbiAgICAgICAgICBzZWxlY3RvcnM6IHJlcXVlc3RzXG4gICAgICAgICAgICAubWFwKCh7IHNlbGVjdG9ycyB9KSA9PiBzZWxlY3RvcnMpXG4gICAgICAgICAgICAuZmlsdGVyKGlzRGVmaW5lZClcbiAgICAgICAgICAgIC5yZWR1Y2UoKGFjYywgc2VsZWN0b3JzTWFwKSA9PiBPYmplY3QuYXNzaWduKGFjYywgc2VsZWN0b3JzTWFwKSwge30pLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuZXhlY3V0aW9uSW5Qcm9ncmVzcyQubmV4dCh0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxvd1N0YXRlQXBpU2VydmljZS5leGVjdXRlQ29uZmlndXJhdGlvbih0aGlzLmZsb3dTdGF0ZVNlcnZpY2Uuc3RhdGVJZCwgdGhpcy5zdGF0ZUlkLCByZXF1ZXN0KTtcbiAgICAgIH0pLFxuICAgICAgdGFwKCh7IHN0YXRlSWQgfSkgPT4gKHRoaXMuc3RhdGVJZCA9IHN0YXRlSWQpKSxcbiAgICAgIHNoYXJlKCksXG4gICAgICB0YXAoKCkgPT4gdGhpcy5leGVjdXRpb25JblByb2dyZXNzJC5uZXh0KGZhbHNlKSksXG4gICAgICBjYXRjaEVycm9yKGUgPT4ge1xuICAgICAgICB0aGlzLmV4ZWN1dGlvbkluUHJvZ3Jlc3MkLm5leHQoZmFsc2UpO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVTdGF0ZWZ1bCQocmVxdWVzdDogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdERUTyk6IE9ic2VydmFibGU8Rmxvd1N0YXRlRXhlY3V0aW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0aW9uSW5Qcm9ncmVzcyQucGlwZShcbiAgICAgIGZpbHRlcihpblByb2dyZXNzID0+ICFpblByb2dyZXNzKSxcbiAgICAgIHRha2UoMSksXG4gICAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgICAgLy8gbWFrZSBzdXJlIHN0cmVhbSBzd2l0Y2hlcyB0byBzdGF0ZWZ1bEV4ZWN1dGlvblJlcXVlc3QkIGJlZm9yZSBwdXNoaW5nIGFuIGV4ZWN1dGlvbiByZXF1ZXN0XG4gICAgICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICAgIHRoaXMuc3RhdGVmdWxFeGVjdXRpb25SZXF1ZXN0JCxcbiAgICAgICAgICBvZih1bmRlZmluZWQpLnBpcGUodGFwKCgpID0+IHRoaXMuc3RhdGVmdWxSZXF1ZXN0U3RyZWFtJC5uZXh0KHJlcXVlc3QpKSksXG4gICAgICAgIF0pLFxuICAgICAgKSxcbiAgICAgIG1hcCgoW3Jlc3BvbnNlXSkgPT4gcmVzcG9uc2UpLFxuICAgICAgdGFrZSgxKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBleGVjdXRlQWN0aW9uU2NyaXB0KHJlcXVlc3Q6IFRyYW5zYWN0aW9uQ29udGV4dCwgcHJvY2Vzc29yOiBGbG93U3RhdGVFeGVjdXRhYmxlRFRPKTogVHJhbnNhY3Rpb25Db250ZXh0IHtcbiAgICBjb25zdCB7IGFjdGlvbnMgfSA9IHRoaXMuY29uZmlndXJhdGlvblJ1bnRpbWVTZXJ2aWNlLnVpRGVmaW5pdGlvbkNvbnRhaW5lciA/PyB7fTtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uUHJvY2Vzc29yID0gYWN0aW9ucz8uZmluZChhY3Rpb24gPT4gYWN0aW9uLmFwaU5hbWUgPT09IHByb2Nlc3Nvci5hcGlOYW1lKTtcblxuICAgIGlmICghY29uZmlndXJhdGlvblByb2Nlc3Nvcj8uc2NyaXB0KSB7XG4gICAgICB0aHJvdyBgQ29uZmlndXJhdGlvblByb2Nlc3NvciAke3Byb2Nlc3Nvci5hcGlOYW1lfSBub3QgZm91bmRgO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVQcm9jZXNzb3JTY3JpcHQocmVxdWVzdCwgY29uZmlndXJhdGlvblByb2Nlc3NvciwgcHJvY2Vzc29yLmlucHV0RGF0YSkgYXMgVHJhbnNhY3Rpb25Db250ZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSBleGVjdXRlU2VsZWN0b3JTY3JpcHQocmVxdWVzdDogVHJhbnNhY3Rpb25Db250ZXh0LCBwcm9jZXNzb3I6IEZsb3dTdGF0ZUV4ZWN1dGFibGVEVE8pOiB1bmtub3duIHtcbiAgICBjb25zdCB7IHNlbGVjdG9ycyB9ID0gdGhpcy5jb25maWd1cmF0aW9uUnVudGltZVNlcnZpY2UudWlEZWZpbml0aW9uQ29udGFpbmVyID8/IHt9O1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb25Qcm9jZXNzb3IgPSBzZWxlY3RvcnM/LmZpbmQoc2VsZWN0b3IgPT4gc2VsZWN0b3IuYXBpTmFtZSA9PT0gcHJvY2Vzc29yLmFwaU5hbWUpO1xuXG4gICAgaWYgKCFjb25maWd1cmF0aW9uUHJvY2Vzc29yPy5zY3JpcHQpIHtcbiAgICAgIHRocm93IGBDb25maWd1cmF0aW9uUHJvY2Vzc29yICR7cHJvY2Vzc29yLmFwaU5hbWV9IG5vdCBmb3VuZGA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVByb2Nlc3NvclNjcmlwdChyZXF1ZXN0LCBjb25maWd1cmF0aW9uUHJvY2Vzc29yLCBwcm9jZXNzb3IuaW5wdXREYXRhKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZVByb2Nlc3NvclNjcmlwdChcbiAgICByZXF1ZXN0OiBUcmFuc2FjdGlvbkNvbnRleHQsXG4gICAgY29uZmlndXJhdGlvblByb2Nlc3NvcjogQ29uZmlndXJhdGlvblByb2Nlc3NvcixcbiAgICBpbnB1dERhdGE6IHVua25vd24sXG4gICk6IHVua25vd24ge1xuICAgIGxldCBmdW5jdGlvblRvRXhlY3V0ZSA9IHRoaXMuZXhlY3V0ZWRGdW5jdGlvbnNbY29uZmlndXJhdGlvblByb2Nlc3Nvci5hcGlOYW1lXTtcbiAgICBpZiAoIWZ1bmN0aW9uVG9FeGVjdXRlKSB7XG4gICAgICBjb25zdCBzY3JpcHQgPSBgJHtjb25maWd1cmF0aW9uUHJvY2Vzc29yLnNjcmlwdH1cXG5yZXR1cm4gdHJhbnNmb3JtO2A7XG4gICAgICBjb25zdCBzb3VyY2VNYXAgPSBgXFxuLy8jIHNvdXJjZVVSTD0ke2NvbmZpZ3VyYXRpb25Qcm9jZXNzb3IuYXBpTmFtZX0uanNgO1xuICAgICAgZnVuY3Rpb25Ub0V4ZWN1dGUgPSBuZXcgRnVuY3Rpb24oc2NyaXB0ICsgc291cmNlTWFwKSgpIGFzIENvbmZpZ3VyYXRpb25Qcm9jZXNzb3JTY3JpcHRGbjtcbiAgICAgIHRoaXMuZXhlY3V0ZWRGdW5jdGlvbnNbY29uZmlndXJhdGlvblByb2Nlc3Nvci5hcGlOYW1lXSA9IGZ1bmN0aW9uVG9FeGVjdXRlO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvblRvRXhlY3V0ZSh7XG4gICAgICByZXF1ZXN0LFxuICAgICAgaW5wdXREYXRhLFxuICAgICAgZmxvd1N0b3JlOiB0aGlzLmZsb3dTdGF0ZVNlcnZpY2UuZ2V0Rmxvd1N0b3JlKCksXG4gICAgICBjb25maWd1cmF0aW9uU3RvcmU6IHRoaXMuY29uZmlndXJhdGlvblN0b3JlLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBydW5TdGF0ZWxlc3NTZWxlY3RvcnMoXG4gICAgcmVxdWVzdDogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdERUTyxcbiAgICBjb25maWd1cmF0aW9uU3RhdGU6IFRyYW5zYWN0aW9uQ29udGV4dCxcbiAgKTogRmxvd1N0YXRlRXhlY3V0aW9uUmVzdWx0IHtcbiAgICByZXR1cm4gRW50aXR5VXRpbC5lbnRyaWVzKHJlcXVlc3Quc2VsZWN0b3JzID8/IHt9KS5yZWR1Y2UoXG4gICAgICAocmVzdWx0OiBGbG93U3RhdGVFeGVjdXRpb25SZXN1bHQsIFtrZXksIHNlbGVjdG9yXSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdC5zZWxlY3RvcnNba2V5XSA9IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICByZXN1bHQ6IHRoaXMuZXhlY3V0ZVNlbGVjdG9yU2NyaXB0KGNvbmZpZ3VyYXRpb25TdGF0ZSwgc2VsZWN0b3IpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIHJlc3VsdC5zZWxlY3RvcnNba2V5XSA9IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBTdHJpbmcoZSksXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICAgeyBzdGF0ZUlkOiAnJywgc2VsZWN0b3JzOiB7fSB9LFxuICAgICk7XG4gIH1cbn1cbiJdfQ==