@veloceapps/sdk 8.0.0-99 → 9.0.0-0
Sign up to get free protection for your applications and to get access to all the features.
- package/cms/README.md +0 -20
- package/cms/cms.actions.d.ts +9 -1
- package/cms/components/preview/preview.component.d.ts +2 -3
- package/cms/components/preview/preview.types.d.ts +4 -0
- package/cms/index.d.ts +1 -0
- package/cms/modules/runtime/services/runtime.service.d.ts +1 -1
- package/cms/services/index.d.ts +0 -1
- package/cms/services/resources.service.d.ts +2 -0
- package/cms/types/index.d.ts +0 -1
- package/cms/utils/element-metadata-worker.d.ts +11 -0
- package/cms/utils/elements-resolver.d.ts +0 -2
- package/cms/utils/index.d.ts +3 -0
- package/cms/utils/transpilation-worker.d.ts +13 -0
- package/cms/vendor-map.d.ts +21 -18
- package/core/README.md +20 -0
- package/core/modules/configuration/configuration.module.d.ts +2 -1
- package/core/modules/configuration/helpers.d.ts +2 -1
- package/core/modules/configuration/index.d.ts +1 -1
- package/core/modules/configuration/services/configuration-state.service.d.ts +54 -0
- package/core/modules/configuration/services/configuration.service.d.ts +6 -6
- package/core/modules/configuration/types/configuration.types.d.ts +4 -0
- package/core/modules/flow-configuration/flow-configuration.module.d.ts +2 -1
- package/core/modules/flow-configuration/services/flow-configuration.service.d.ts +5 -0
- package/core/services/context.service.d.ts +2 -0
- package/core/services/flow-info.service.d.ts +29 -0
- package/core/services/flow-state-configuration.service.d.ts +19 -0
- package/core/services/flow-state.service.d.ts +80 -0
- package/core/services/index.d.ts +4 -1
- package/core/services/quote-draft.service.d.ts +12 -28
- package/core/types/flow-customization.types.d.ts +22 -0
- package/core/types/flow-state.types.d.ts +11 -0
- package/core/types/index.d.ts +3 -1
- package/{cms → core}/types/integration.types.d.ts +0 -1
- package/core/utils/line-item.utils.d.ts +1 -3
- package/esm2020/cms/cms.actions.mjs +11 -1
- package/esm2020/cms/components/element-renderer/element-renderer.component.mjs +3 -3
- package/esm2020/cms/components/element-tools-panel/element-tools-panel.component.mjs +3 -3
- package/esm2020/cms/components/preview/preview.component.mjs +10 -10
- package/esm2020/cms/components/preview/preview.module.mjs +2 -2
- package/esm2020/cms/components/preview/preview.types.mjs +1 -1
- package/esm2020/cms/index.mjs +2 -1
- package/esm2020/cms/launcher.module.mjs +4 -4
- package/esm2020/cms/modules/migrations/migrations.mjs +2 -2
- package/esm2020/cms/modules/migrations/services/migrations.service.mjs +6 -2
- package/esm2020/cms/modules/runtime/services/compilation.service.mjs +8 -8
- package/esm2020/cms/modules/runtime/services/runtime.service.mjs +4 -4
- package/esm2020/cms/plugins/configuration.plugin.mjs +8 -4
- package/esm2020/cms/services/index.mjs +1 -2
- package/esm2020/cms/services/io-provider.service.mjs +10 -9
- package/esm2020/cms/services/resources.service.mjs +10 -6
- package/esm2020/cms/services/templates.service.mjs +10 -9
- package/esm2020/cms/types/index.mjs +1 -2
- package/esm2020/cms/utils/element-metadata-worker.mjs +31 -0
- package/esm2020/cms/utils/elements-resolver.mjs +13 -27
- package/esm2020/cms/utils/encoding.utils.mjs +3 -2
- package/esm2020/cms/utils/index.mjs +4 -1
- package/esm2020/cms/utils/path.utils.mjs +3 -3
- package/esm2020/cms/utils/script.utils.mjs +19 -15
- package/esm2020/cms/utils/transpilation-worker.mjs +52 -0
- package/esm2020/cms/vendor-map.mjs +10 -5
- package/esm2020/core/core.module.mjs +19 -3
- package/esm2020/core/modules/configuration/configuration.module.mjs +7 -23
- package/esm2020/core/modules/configuration/helpers.mjs +21 -1
- package/esm2020/core/modules/configuration/index.mjs +2 -2
- package/esm2020/core/modules/configuration/services/configuration-state.service.mjs +335 -0
- package/esm2020/core/modules/configuration/services/configuration.service.mjs +56 -50
- package/esm2020/core/modules/configuration/types/configuration.types.mjs +1 -1
- package/esm2020/core/modules/flow-configuration/flow-configuration.module.mjs +6 -6
- package/esm2020/core/modules/flow-configuration/services/flow-configuration.service.mjs +12 -9
- package/esm2020/core/services/context.service.mjs +17 -5
- package/esm2020/core/services/flow-info.service.mjs +99 -0
- package/esm2020/core/services/flow-state-configuration.service.mjs +53 -0
- package/esm2020/core/services/flow-state.service.mjs +512 -0
- package/esm2020/core/services/index.mjs +5 -2
- package/esm2020/core/services/integration.state.mjs +36 -0
- package/esm2020/core/services/product-images.service.mjs +4 -5
- package/esm2020/core/services/quote-draft.service.mjs +39 -91
- package/esm2020/core/services/runtime-settings.service.mjs +7 -5
- package/esm2020/core/types/flow-customization.types.mjs +3 -0
- package/esm2020/core/types/flow-state.types.mjs +2 -0
- package/esm2020/core/types/index.mjs +4 -2
- package/esm2020/core/types/integration.types.mjs +2 -0
- package/esm2020/core/utils/line-item.utils.mjs +33 -32
- package/esm2020/src/components/doc-gen/doc-gen.component.mjs +44 -51
- package/esm2020/src/components/flow-header/flow-header.component.mjs +36 -47
- package/esm2020/src/components/guided-selling/guided-selling.component.mjs +35 -46
- package/esm2020/src/flow-routing.module.mjs +5 -18
- package/esm2020/src/flow.component.mjs +22 -37
- package/esm2020/src/guards/context.guard.mjs +6 -11
- package/esm2020/src/guards/flow.guard.mjs +23 -9
- package/esm2020/src/pages/assets/assets.component.mjs +30 -34
- package/esm2020/src/pages/catalog/catalog.component.mjs +30 -34
- package/esm2020/src/pages/debug/debug.component.mjs +2 -2
- package/esm2020/src/pages/product/product.component.mjs +34 -20
- package/esm2020/src/pages/record-not-found/record-not-found.component.mjs +6 -3
- package/esm2020/src/pages/remote/remote.component.mjs +15 -14
- package/esm2020/src/pages/shopping-cart/shopping-cart.component.mjs +31 -35
- package/esm2020/src/resolvers/flow.resolver.mjs +37 -55
- package/esm2020/src/resolvers/quote.resolver.mjs +55 -67
- package/esm2020/src/services/doc-gen.service.mjs +4 -3
- package/esm2020/src/services/flow-dialog.service.mjs +17 -6
- package/esm2020/src/services/flow-router.service.mjs +42 -15
- package/esm2020/src/services/flow.service.mjs +67 -52
- package/esm2020/src/services/guided-selling.service.mjs +5 -4
- package/esm2020/src/types/index.mjs +1 -2
- package/fesm2015/veloceapps-sdk-cms.mjs +270 -191
- package/fesm2015/veloceapps-sdk-cms.mjs.map +1 -1
- package/fesm2015/veloceapps-sdk-core.mjs +1195 -427
- package/fesm2015/veloceapps-sdk-core.mjs.map +1 -1
- package/fesm2015/veloceapps-sdk.mjs +776 -826
- package/fesm2015/veloceapps-sdk.mjs.map +1 -1
- package/fesm2020/veloceapps-sdk-cms.mjs +275 -206
- package/fesm2020/veloceapps-sdk-cms.mjs.map +1 -1
- package/fesm2020/veloceapps-sdk-core.mjs +1176 -454
- package/fesm2020/veloceapps-sdk-core.mjs.map +1 -1
- package/fesm2020/veloceapps-sdk.mjs +899 -945
- package/fesm2020/veloceapps-sdk.mjs.map +1 -1
- package/package.json +8 -7
- package/src/components/doc-gen/doc-gen.component.d.ts +7 -10
- package/src/components/flow-header/flow-header.component.d.ts +6 -9
- package/src/components/guided-selling/guided-selling.component.d.ts +6 -9
- package/src/flow-routing.module.d.ts +1 -2
- package/src/flow.component.d.ts +7 -12
- package/src/guards/context.guard.d.ts +0 -1
- package/src/guards/flow.guard.d.ts +1 -1
- package/src/pages/assets/assets.component.d.ts +5 -7
- package/src/pages/catalog/catalog.component.d.ts +5 -7
- package/src/pages/product/product.component.d.ts +8 -7
- package/src/pages/record-not-found/record-not-found.component.d.ts +2 -0
- package/src/pages/remote/remote.component.d.ts +2 -3
- package/src/pages/shopping-cart/shopping-cart.component.d.ts +5 -7
- package/src/resolvers/flow.resolver.d.ts +6 -9
- package/src/resolvers/quote.resolver.d.ts +7 -14
- package/src/services/doc-gen.service.d.ts +1 -1
- package/src/services/flow-dialog.service.d.ts +4 -2
- package/src/services/flow-router.service.d.ts +6 -3
- package/src/services/flow.service.d.ts +10 -14
- package/src/services/guided-selling.service.d.ts +1 -1
- package/src/types/index.d.ts +0 -1
- package/core/modules/configuration/services/configuration.state.d.ts +0 -30
- package/core/services/metric-calculation/metric-calculation.service.d.ts +0 -25
- package/core/services/metric-calculation/metric-calculation.types.d.ts +0 -1
- package/core/services/metric-calculation/metric-calculation.utils.d.ts +0 -5
- package/esm2020/cms/services/integration.state.mjs +0 -37
- package/esm2020/cms/types/integration.types.mjs +0 -2
- package/esm2020/core/modules/configuration/services/configuration.state.mjs +0 -142
- package/esm2020/core/services/metric-calculation/metric-calculation.service.mjs +0 -85
- package/esm2020/core/services/metric-calculation/metric-calculation.types.mjs +0 -2
- package/esm2020/core/services/metric-calculation/metric-calculation.utils.mjs +0 -42
- package/esm2020/src/pages/empty-account/empty-account.component.mjs +0 -12
- package/esm2020/src/pages/empty-account/empty-account.module.mjs +0 -20
- package/esm2020/src/types/flow-customization.types.mjs +0 -3
- package/src/pages/empty-account/empty-account.component.d.ts +0 -5
- package/src/pages/empty-account/empty-account.module.d.ts +0 -10
- package/src/types/flow-customization.types.d.ts +0 -12
- /package/{cms → core}/services/integration.state.d.ts +0 -0
@@ -0,0 +1,512 @@
|
|
1
|
+
import { Inject, Injectable, Optional } from '@angular/core';
|
2
|
+
import { ConfigurationProcessorsApiService, FlowStateApiService, QuoteApiService } from '@veloceapps/api';
|
3
|
+
import { ToastService, ToastType } from '@veloceapps/components';
|
4
|
+
import { ConfigurationContextMode, ConfigurationProcessorTypes, EntityUtil, isDefined, UITemplateType, UUID, } from '@veloceapps/core';
|
5
|
+
import { assign, cloneDeep, flatten } from 'lodash';
|
6
|
+
import { BehaviorSubject, buffer, catchError, combineLatest, debounceTime, filter, finalize, forkJoin, map, noop, of, share, shareReplay, Subject, switchMap, take, takeUntil, tap, throwError, } from 'rxjs';
|
7
|
+
import { FlowConfigurationService } from '../modules';
|
8
|
+
import { FLOW_CUSTOMIZATION } from '../types/flow-customization.types';
|
9
|
+
import { ContextService } from './context.service';
|
10
|
+
import { FlowInfoService } from './flow-info.service';
|
11
|
+
import { QuoteDraftService } from './quote-draft.service';
|
12
|
+
import * as i0 from "@angular/core";
|
13
|
+
import * as i1 from "./context.service";
|
14
|
+
import * as i2 from "./quote-draft.service";
|
15
|
+
import * as i3 from "./flow-info.service";
|
16
|
+
import * as i4 from "../modules";
|
17
|
+
import * as i5 from "@veloceapps/api";
|
18
|
+
import * as i6 from "@veloceapps/components";
|
19
|
+
export class FlowStateService {
|
20
|
+
constructor(contextService, quoteDraftService, flowInfoService, flowConfiguration, processorsApiService, flowStateApiService, quoteApiService, toastService, customizationService) {
|
21
|
+
this.contextService = contextService;
|
22
|
+
this.quoteDraftService = quoteDraftService;
|
23
|
+
this.flowInfoService = flowInfoService;
|
24
|
+
this.flowConfiguration = flowConfiguration;
|
25
|
+
this.processorsApiService = processorsApiService;
|
26
|
+
this.flowStateApiService = flowStateApiService;
|
27
|
+
this.quoteApiService = quoteApiService;
|
28
|
+
this.toastService = toastService;
|
29
|
+
this.customizationService = customizationService;
|
30
|
+
this.NOT_INITIALIZED = Symbol();
|
31
|
+
this.EXECUTION_BUFFER_TIME = 100;
|
32
|
+
this.executedFunctions = {};
|
33
|
+
this.stateId$ = new BehaviorSubject(null);
|
34
|
+
this._hasStatefulUnsavedChanges = true;
|
35
|
+
this.processors = {};
|
36
|
+
this.subscriptions = {};
|
37
|
+
this.flowStore = {};
|
38
|
+
this.statefulExecutionInProgress$ = new BehaviorSubject(false);
|
39
|
+
this.statefulRequestStream$ = new Subject();
|
40
|
+
this.cleanup$ = new Subject();
|
41
|
+
this.statefulExecutionRequest$ = this.initBufferedRequest$();
|
42
|
+
/*
|
43
|
+
In stateless mode watch QuoteDraft changes and call executeRequest so that
|
44
|
+
all subscriptions get their updates according to updated QuoteDraft
|
45
|
+
*/
|
46
|
+
this.isInitialized$()
|
47
|
+
.pipe(filter(Boolean), filter(() => !this.getFlowSafe().properties.stateful), switchMap(() => this.flowConfiguration.updated$), switchMap(() => this.executeRequest$({}, true)))
|
48
|
+
.subscribe();
|
49
|
+
this.charges$ = this.flowInfoService.flow$.pipe(filter(isDefined), switchMap(() => {
|
50
|
+
if (this.flowInfoService.isLegacy) {
|
51
|
+
return this.quoteDraftService.quoteDraft$.pipe(map(quoteDraft => quoteDraft.charges));
|
52
|
+
}
|
53
|
+
else {
|
54
|
+
return this.subscribe$(UITemplateType.FLOW_ENGINE, 'CHARGES', null, {
|
55
|
+
cold: true,
|
56
|
+
}).pipe(map(response => (response.success ? response.result : {})));
|
57
|
+
}
|
58
|
+
}), shareReplay(1));
|
59
|
+
this.charges$.subscribe();
|
60
|
+
this.pricePlans$ = this.flowInfoService.flow$.pipe(filter(isDefined), switchMap(() => {
|
61
|
+
if (this.flowInfoService.isLegacy) {
|
62
|
+
return this.quoteDraftService.quoteDraft$.pipe(map(quoteDraft => quoteDraft.pricePlans));
|
63
|
+
}
|
64
|
+
else {
|
65
|
+
return this.subscribe$(UITemplateType.FLOW_ENGINE, 'PRICE_PLANS', null, {
|
66
|
+
cold: true,
|
67
|
+
}).pipe(map(response => (response.success ? response.result : {})));
|
68
|
+
}
|
69
|
+
}), shareReplay(1));
|
70
|
+
this.pricePlans$.subscribe();
|
71
|
+
this.activeMetrics$ = this.flowInfoService.flow$.pipe(filter(isDefined), switchMap(() => {
|
72
|
+
if (this.flowInfoService.isLegacy) {
|
73
|
+
return this.quoteDraftService.quoteDraft$.pipe(map(quoteDraft => quoteDraft.activeMetrics));
|
74
|
+
}
|
75
|
+
else {
|
76
|
+
return this.subscribe$(UITemplateType.FLOW_ENGINE, 'ACTIVE_METRICS', null, {
|
77
|
+
cold: true,
|
78
|
+
}).pipe(map(response => (response.success ? response.result : [])));
|
79
|
+
}
|
80
|
+
}), shareReplay(1));
|
81
|
+
this.activeMetrics$.subscribe();
|
82
|
+
this.isPriceListLocked$ = this.flowInfoService.flow$.pipe(filter(isDefined), switchMap(() => {
|
83
|
+
if (this.flowInfoService.isLegacy) {
|
84
|
+
return of(false);
|
85
|
+
}
|
86
|
+
else {
|
87
|
+
return this.subscribe$(UITemplateType.FLOW_ENGINE, 'IS_PRICE_LIST_LOCKED', null, {
|
88
|
+
cold: true,
|
89
|
+
}).pipe(map(response => (response.success ? response.result : false)));
|
90
|
+
}
|
91
|
+
}), shareReplay(1));
|
92
|
+
this.isPriceListLocked$.subscribe();
|
93
|
+
}
|
94
|
+
init$() {
|
95
|
+
return this.initProcessors$().pipe(switchMap(() => {
|
96
|
+
if (this.getFlowSafe().properties.stateful) {
|
97
|
+
return this.initStateful$();
|
98
|
+
}
|
99
|
+
else {
|
100
|
+
return this.initStateless$();
|
101
|
+
}
|
102
|
+
}));
|
103
|
+
}
|
104
|
+
cleanup() {
|
105
|
+
Object.values(this.subscriptions).forEach(({ data$ }) => data$.complete());
|
106
|
+
this.subscriptions = {};
|
107
|
+
if (this.stateId$.value) {
|
108
|
+
this.flowStateApiService.cancel(this.stateId$.value).subscribe();
|
109
|
+
this.stateId$.next(null);
|
110
|
+
}
|
111
|
+
this.processors = {};
|
112
|
+
this.flowStore = {};
|
113
|
+
this.cleanup$.next();
|
114
|
+
}
|
115
|
+
get hasUnsavedChanges() {
|
116
|
+
return this.getFlowSafe().properties.stateful
|
117
|
+
? this._hasStatefulUnsavedChanges
|
118
|
+
: this.quoteDraftService.hasUnsavedChanges;
|
119
|
+
}
|
120
|
+
get stateId() {
|
121
|
+
return this.stateId$.value;
|
122
|
+
}
|
123
|
+
get isExecutionInProgress$() {
|
124
|
+
return this.statefulExecutionInProgress$.asObservable();
|
125
|
+
}
|
126
|
+
isInitialized$() {
|
127
|
+
return combineLatest([this.stateId$, this.quoteDraftService.isInitialized$]).pipe(map(values => values.some(Boolean)));
|
128
|
+
}
|
129
|
+
isInitialized() {
|
130
|
+
return Boolean(this.stateId$.value) || this.quoteDraftService.isInitialized;
|
131
|
+
}
|
132
|
+
execute$(scope, exec) {
|
133
|
+
const request = this.execToRequest(scope, exec);
|
134
|
+
return this.executeRequest$(request).pipe(map(result => {
|
135
|
+
// Keep only requested results
|
136
|
+
const actualSelectors = Object.entries(result.selectors).reduce((trunk, [requestId, result]) => {
|
137
|
+
if (exec.selectors?.[requestId]) {
|
138
|
+
trunk[requestId] = result;
|
139
|
+
}
|
140
|
+
return trunk;
|
141
|
+
}, {});
|
142
|
+
return actualSelectors;
|
143
|
+
}));
|
144
|
+
}
|
145
|
+
dispatch$(scope, action, inputData) {
|
146
|
+
const exec = {
|
147
|
+
actions: [{ name: action, inputData }],
|
148
|
+
};
|
149
|
+
const request = this.execToRequest(scope, exec);
|
150
|
+
return this.executeRequest$(request).pipe(map(noop));
|
151
|
+
}
|
152
|
+
select$(scope, selectorName, inputData) {
|
153
|
+
const requestId = this.generateRequestId(scope, selectorName, inputData);
|
154
|
+
const request = this.execToRequest(scope, {
|
155
|
+
selectors: {
|
156
|
+
[requestId]: {
|
157
|
+
name: selectorName,
|
158
|
+
inputData,
|
159
|
+
},
|
160
|
+
},
|
161
|
+
});
|
162
|
+
return this.executeRequest$(request).pipe(map(response => response.selectors[requestId]));
|
163
|
+
}
|
164
|
+
subscribe$(scope, selectorName, inputData, options) {
|
165
|
+
const requestId = this.generateRequestId(scope, selectorName, inputData);
|
166
|
+
let subscription = this.subscriptions[requestId];
|
167
|
+
if (!subscription) {
|
168
|
+
const request = this.execToRequest(scope, {
|
169
|
+
selectors: {
|
170
|
+
[requestId]: {
|
171
|
+
name: selectorName,
|
172
|
+
inputData,
|
173
|
+
},
|
174
|
+
},
|
175
|
+
});
|
176
|
+
subscription = {
|
177
|
+
request,
|
178
|
+
data$: new BehaviorSubject(this.NOT_INITIALIZED),
|
179
|
+
};
|
180
|
+
this.subscriptions[requestId] = subscription;
|
181
|
+
if (!options?.cold) {
|
182
|
+
this.executeRequest$(request).subscribe();
|
183
|
+
}
|
184
|
+
}
|
185
|
+
return subscription.data$.pipe(filter(data => data != this.NOT_INITIALIZED), map(data => data), finalize(() => {
|
186
|
+
if (!this.subscriptions[requestId]?.data$.observed) {
|
187
|
+
delete this.subscriptions[requestId];
|
188
|
+
}
|
189
|
+
}));
|
190
|
+
}
|
191
|
+
save$() {
|
192
|
+
if (this.getFlowSafe().properties.stateful) {
|
193
|
+
if (this.stateId$.value) {
|
194
|
+
return this.flowStateApiService.save(this.stateId$.value);
|
195
|
+
}
|
196
|
+
}
|
197
|
+
else {
|
198
|
+
const quoteDraft = this.quoteDraftService.quoteDraft;
|
199
|
+
if (quoteDraft) {
|
200
|
+
return this.quoteApiService.upsertQuote(quoteDraft).pipe(tap(({ configurationId }) => {
|
201
|
+
this.contextService.update({ properties: { ConfigurationId: configurationId } });
|
202
|
+
}));
|
203
|
+
}
|
204
|
+
}
|
205
|
+
return of({ quoteId: '' });
|
206
|
+
}
|
207
|
+
submit$() {
|
208
|
+
if (this.getFlowSafe().properties.stateful) {
|
209
|
+
if (this.stateId$.value) {
|
210
|
+
return this.flowStateApiService.submit(this.stateId$.value);
|
211
|
+
}
|
212
|
+
}
|
213
|
+
else {
|
214
|
+
const quoteDraft = this.quoteDraftService.quoteDraft;
|
215
|
+
if (quoteDraft) {
|
216
|
+
return this.quoteApiService.submitQuote(quoteDraft).pipe(tap(({ configurationId }) => {
|
217
|
+
this.contextService.update({ properties: { ConfigurationId: configurationId } });
|
218
|
+
}));
|
219
|
+
}
|
220
|
+
}
|
221
|
+
return of({ quoteId: '' });
|
222
|
+
}
|
223
|
+
getFlowStore() {
|
224
|
+
return this.flowStore;
|
225
|
+
}
|
226
|
+
getOwnerIdByScope(scope) {
|
227
|
+
const ownerId = this.flowInfoService.templates[scope]?.id;
|
228
|
+
if (!ownerId) {
|
229
|
+
throw `OwnerId is not found for scope ${scope}`;
|
230
|
+
}
|
231
|
+
return ownerId;
|
232
|
+
}
|
233
|
+
getScopeByOwnerId(id) {
|
234
|
+
for (const template of Object.values(this.flowInfoService.templates)) {
|
235
|
+
if (template.id === id) {
|
236
|
+
return template.type;
|
237
|
+
}
|
238
|
+
}
|
239
|
+
return;
|
240
|
+
}
|
241
|
+
execToRequest(scope, exec) {
|
242
|
+
const ownerId = this.getOwnerIdByScope(scope);
|
243
|
+
return {
|
244
|
+
actions: exec.actions?.map(action => ({ apiName: action.name, ownerId, inputData: action.inputData ?? {} })),
|
245
|
+
selectors: exec.selectors &&
|
246
|
+
Object.entries(exec.selectors).reduce((trunk, [key, selector]) => ({
|
247
|
+
...trunk,
|
248
|
+
[key]: { apiName: selector.name, ownerId, inputData: selector.inputData ?? {} },
|
249
|
+
}), {}),
|
250
|
+
};
|
251
|
+
}
|
252
|
+
executeRequest$(request, forceSubscriptions = false) {
|
253
|
+
const fullRequest = cloneDeep(request);
|
254
|
+
if (fullRequest.actions?.length || forceSubscriptions) {
|
255
|
+
for (const subscription of Object.values(this.subscriptions)) {
|
256
|
+
fullRequest.selectors = assign(fullRequest.selectors, subscription.request.selectors);
|
257
|
+
}
|
258
|
+
}
|
259
|
+
const execution$ = this.getFlowSafe().properties.stateful
|
260
|
+
? this.executeStateful$(fullRequest)
|
261
|
+
: this.executeStateless$(fullRequest);
|
262
|
+
return execution$.pipe(tap(result => this.handleSelectorsResponse(result.selectors)));
|
263
|
+
}
|
264
|
+
handleSelectorsResponse(selectors) {
|
265
|
+
Object.entries(selectors).forEach(([requestId, selectorResult]) => {
|
266
|
+
if (!selectorResult.success) {
|
267
|
+
this.toastService.add({ severity: ToastType.error, summary: selectorResult.errorMessage });
|
268
|
+
}
|
269
|
+
const subscription$ = this.subscriptions[requestId]?.data$;
|
270
|
+
if (subscription$ && subscription$.value !== selectorResult) {
|
271
|
+
subscription$.next(selectorResult);
|
272
|
+
}
|
273
|
+
});
|
274
|
+
}
|
275
|
+
initStateful$() {
|
276
|
+
// Subscriptions
|
277
|
+
this.subscribe$(UITemplateType.FLOW_ENGINE, 'CONTEXT', null, { cold: true })
|
278
|
+
.pipe(tap(response => {
|
279
|
+
if (response.success) {
|
280
|
+
this.contextService.update(response.result);
|
281
|
+
}
|
282
|
+
}), takeUntil(this.cleanup$))
|
283
|
+
.subscribe();
|
284
|
+
const processorsList = flatten(Object.values(this.processors).map(ownerMap => Object.values(ownerMap ?? {})));
|
285
|
+
const processors = processorsList.length ? processorsList : undefined;
|
286
|
+
const selectors = Object.values(this.subscriptions)
|
287
|
+
.map(({ request }) => request.selectors)
|
288
|
+
.filter(isDefined)
|
289
|
+
.reduce((trunk, selectors) => ({ ...trunk, ...selectors }), {});
|
290
|
+
const request = this.getDefaultExecutionRequestDTO();
|
291
|
+
return this.flowStateApiService
|
292
|
+
.init({
|
293
|
+
quoteId: this.contextService.resolve().headerId,
|
294
|
+
params: this.flowInfoService.params ?? {},
|
295
|
+
actionsOverride: processors?.filter(processor => processor.type === ConfigurationProcessorTypes.ACTION),
|
296
|
+
selectorsOverride: processors?.filter(processor => processor.type === ConfigurationProcessorTypes.SELECTOR),
|
297
|
+
selectors: { ...selectors, ...request.selectors },
|
298
|
+
actions: request.actions,
|
299
|
+
})
|
300
|
+
.pipe(map(({ stateId, selectors }) => {
|
301
|
+
this.handleSelectorsResponse(selectors);
|
302
|
+
this.stateId$.next(stateId);
|
303
|
+
}));
|
304
|
+
}
|
305
|
+
initBufferedRequest$() {
|
306
|
+
return this.statefulRequestStream$.pipe(buffer(this.statefulRequestStream$.pipe(debounceTime(this.EXECUTION_BUFFER_TIME))), switchMap(requests => {
|
307
|
+
if (!this.stateId$.value) {
|
308
|
+
throw 'Stateful session is not initialized';
|
309
|
+
}
|
310
|
+
// merge buffered requests
|
311
|
+
const request = {
|
312
|
+
actions: requests.flatMap(({ actions }) => actions).filter(isDefined),
|
313
|
+
selectors: requests
|
314
|
+
.map(({ selectors }) => selectors)
|
315
|
+
.filter(isDefined)
|
316
|
+
.reduce((acc, selectorsMap) => Object.assign(acc, selectorsMap), {}),
|
317
|
+
};
|
318
|
+
this.statefulExecutionInProgress$.next(true);
|
319
|
+
return this.flowStateApiService.execute(this.stateId$.value, request);
|
320
|
+
}), tap(({ stateId }) => this.stateId$.next(stateId)), share(), tap(() => this.statefulExecutionInProgress$.next(false)), catchError(e => {
|
321
|
+
this.statefulExecutionInProgress$.next(false);
|
322
|
+
return throwError(() => e);
|
323
|
+
}));
|
324
|
+
}
|
325
|
+
executeStateful$(request) {
|
326
|
+
return this.statefulExecutionInProgress$.pipe(filter(inProgress => !inProgress), take(1), switchMap(() =>
|
327
|
+
// make sure stream switches to statefulExecutionRequest$ before pushing an execution request
|
328
|
+
combineLatest([
|
329
|
+
this.statefulExecutionRequest$,
|
330
|
+
of(undefined).pipe(tap(() => this.statefulRequestStream$.next(request))),
|
331
|
+
])), map(([response]) => response), take(1));
|
332
|
+
}
|
333
|
+
initStateless$() {
|
334
|
+
const { headerId } = this.contextService.resolve();
|
335
|
+
return this.quoteDraftService.init(headerId, this.flowInfoService.params ?? {}).pipe(tap(() => {
|
336
|
+
const assets = this.quoteDraftService.assetsState;
|
337
|
+
if (assets) {
|
338
|
+
this.flowStore = { ...this.flowStore, assets };
|
339
|
+
}
|
340
|
+
}), switchMap(() => this.executeRequest$(this.getDefaultExecutionRequestDTO())), switchMap(() => this.calculate$()), tap(() => this.quoteDraftService.finalizeInit()), map(noop));
|
341
|
+
}
|
342
|
+
calculate$() {
|
343
|
+
const flowState = this.quoteDraftService.quoteDraft;
|
344
|
+
if (!flowState) {
|
345
|
+
return of(undefined);
|
346
|
+
}
|
347
|
+
/*
|
348
|
+
Don't execute procedures when:
|
349
|
+
* Initializing a standalone product configuration UI, as procedure is execute in /price call
|
350
|
+
* Initializing an empty account (account with no assets)
|
351
|
+
*/
|
352
|
+
const isEmptyAccountMode = this.contextService.mode === ConfigurationContextMode.ACCOUNT &&
|
353
|
+
!this.quoteDraftService.hasProducts &&
|
354
|
+
!this.quoteDraftService.hasAssets &&
|
355
|
+
!this.quoteDraftService.quoteDraft?.initialState.length;
|
356
|
+
if (this.quoteDraftService.isStandalone || isEmptyAccountMode) {
|
357
|
+
return of(undefined);
|
358
|
+
}
|
359
|
+
return this.flowConfiguration.calculate$(flowState);
|
360
|
+
}
|
361
|
+
executeStateless$(request) {
|
362
|
+
return of(undefined).pipe(tap(() => this.executeStatelessActions(request)), switchMap(() => {
|
363
|
+
/*
|
364
|
+
Skip price calculation in case
|
365
|
+
1. No actions in the request
|
366
|
+
2. Initialization process execution (state not initialized yet)
|
367
|
+
*/
|
368
|
+
if (!request.actions?.length || !this.isInitialized()) {
|
369
|
+
return of(undefined);
|
370
|
+
}
|
371
|
+
else {
|
372
|
+
return this.calculate$();
|
373
|
+
}
|
374
|
+
}), map(() => this.executeStatelessSelectors(request)));
|
375
|
+
}
|
376
|
+
executeStatelessActions(request) {
|
377
|
+
if (!this.quoteDraftService.quoteDraft || !request.actions?.length) {
|
378
|
+
return;
|
379
|
+
}
|
380
|
+
let flowState = this.quoteDraftService.quoteDraft;
|
381
|
+
request.actions.forEach(action => {
|
382
|
+
try {
|
383
|
+
flowState = this.executeActionScript(flowState, action) ?? flowState;
|
384
|
+
}
|
385
|
+
catch (e) {
|
386
|
+
console.error(e);
|
387
|
+
this.toastService.add({ severity: ToastType.error, summary: String(e) });
|
388
|
+
throw e;
|
389
|
+
}
|
390
|
+
});
|
391
|
+
this.quoteDraftService.updateQuoteDraft(flowState);
|
392
|
+
}
|
393
|
+
executeStatelessSelectors(request) {
|
394
|
+
if (!this.quoteDraftService.quoteDraft) {
|
395
|
+
throw 'QuoteDraft is not initialized';
|
396
|
+
}
|
397
|
+
const flowState = this.quoteDraftService.quoteDraft;
|
398
|
+
return EntityUtil.entries(request.selectors ?? {}).reduce((result, [key, selector]) => {
|
399
|
+
try {
|
400
|
+
result.selectors[key] = {
|
401
|
+
success: true,
|
402
|
+
result: this.executeSelectorScript(flowState, selector),
|
403
|
+
};
|
404
|
+
}
|
405
|
+
catch (e) {
|
406
|
+
console.error(e);
|
407
|
+
result.selectors[key] = {
|
408
|
+
success: false,
|
409
|
+
errorMessage: String(e),
|
410
|
+
};
|
411
|
+
}
|
412
|
+
return result;
|
413
|
+
}, { stateId: '', selectors: {} });
|
414
|
+
}
|
415
|
+
getFlowSafe() {
|
416
|
+
if (!this.flowInfoService.flow) {
|
417
|
+
throw 'Flow is not defined';
|
418
|
+
}
|
419
|
+
return this.flowInfoService.flow;
|
420
|
+
}
|
421
|
+
initProcessors$() {
|
422
|
+
const hasOverrides = Boolean(this.customizationService?.getTemplateConfigurationProcessors);
|
423
|
+
const flow = this.getFlowSafe();
|
424
|
+
if (flow.properties.stateful && !hasOverrides) {
|
425
|
+
// Skip initialization as backend will take processors from SF
|
426
|
+
return of(undefined);
|
427
|
+
}
|
428
|
+
const owners$ = Object.values(this.flowInfoService.templates)
|
429
|
+
.map(template => {
|
430
|
+
if (!template) {
|
431
|
+
return;
|
432
|
+
}
|
433
|
+
const localProcessors$ = this.customizationService?.getTemplateConfigurationProcessors?.(template.name) ?? of(null);
|
434
|
+
return localProcessors$.pipe(switchMap(processors => processors ? of(processors) : this.processorsApiService.fetchConfigurationProcessors$(template.id)), tap(processors => {
|
435
|
+
const processorsMap = processors.reduce((acc, p) => {
|
436
|
+
acc[p.apiName] = p;
|
437
|
+
return acc;
|
438
|
+
}, {});
|
439
|
+
this.processors[template.id] = processorsMap;
|
440
|
+
}));
|
441
|
+
})
|
442
|
+
.filter(isDefined);
|
443
|
+
if (!owners$.length) {
|
444
|
+
return of(undefined);
|
445
|
+
}
|
446
|
+
return forkJoin(owners$).pipe(map(noop));
|
447
|
+
}
|
448
|
+
executeActionScript(request, executable) {
|
449
|
+
const configurationProcessor = this.processors[executable.ownerId]?.[executable.apiName];
|
450
|
+
if (!configurationProcessor?.script) {
|
451
|
+
const scope = this.getScopeByOwnerId(executable.ownerId);
|
452
|
+
const scopeText = scope ? ` in ${scope}` : '';
|
453
|
+
throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
|
454
|
+
}
|
455
|
+
return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
|
456
|
+
}
|
457
|
+
executeSelectorScript(request, executable) {
|
458
|
+
const configurationProcessor = this.processors[executable.ownerId]?.[executable.apiName];
|
459
|
+
if (!configurationProcessor?.script) {
|
460
|
+
const scope = this.getScopeByOwnerId(executable.ownerId);
|
461
|
+
const scopeText = scope ? ` in ${scope}` : '';
|
462
|
+
throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
|
463
|
+
}
|
464
|
+
return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
|
465
|
+
}
|
466
|
+
executeProcessorScript(request, configurationProcessor, inputData) {
|
467
|
+
const scope = this.getScopeByOwnerId(configurationProcessor.ownerId ?? '');
|
468
|
+
let functionToExecute = this.executedFunctions[scope + configurationProcessor.apiName];
|
469
|
+
if (!functionToExecute) {
|
470
|
+
const script = `${configurationProcessor.script}\nreturn transform;`;
|
471
|
+
const sourceMap = `\n//# sourceURL=${scope ? scope + '/' : ''}${configurationProcessor.apiName}.js`;
|
472
|
+
functionToExecute = new Function(script + sourceMap)();
|
473
|
+
this.executedFunctions[scope + configurationProcessor.apiName] = functionToExecute;
|
474
|
+
}
|
475
|
+
return functionToExecute({
|
476
|
+
request,
|
477
|
+
inputData,
|
478
|
+
flowStore: this.flowStore,
|
479
|
+
});
|
480
|
+
}
|
481
|
+
generateRequestId(scope, selectorName, inputData) {
|
482
|
+
const inputDataHash = UUID.hex(JSON.stringify(inputData) || '').slice(0, 8);
|
483
|
+
return `${scope}/${selectorName}/${inputDataHash}`;
|
484
|
+
}
|
485
|
+
getDefaultExecutionRequestDTO() {
|
486
|
+
const request = {
|
487
|
+
actions: [],
|
488
|
+
selectors: {},
|
489
|
+
};
|
490
|
+
if (this.getFlowSafe().properties.standalone) {
|
491
|
+
return request;
|
492
|
+
}
|
493
|
+
const flowEngineTemplateId = this.getOwnerIdByScope(UITemplateType.FLOW_ENGINE);
|
494
|
+
request.actions?.push({
|
495
|
+
apiName: 'UPDATE_CONTEXT_PROPERTIES',
|
496
|
+
ownerId: flowEngineTemplateId,
|
497
|
+
inputData: this.contextService.resolve().properties,
|
498
|
+
});
|
499
|
+
return request;
|
500
|
+
}
|
501
|
+
}
|
502
|
+
FlowStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, deps: [{ token: i1.ContextService }, { token: i2.QuoteDraftService }, { token: i3.FlowInfoService }, { token: i4.FlowConfigurationService }, { token: i5.ConfigurationProcessorsApiService }, { token: i5.FlowStateApiService }, { token: i5.QuoteApiService }, { token: i6.ToastService }, { token: FLOW_CUSTOMIZATION, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
503
|
+
FlowStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService });
|
504
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, decorators: [{
|
505
|
+
type: Injectable
|
506
|
+
}], ctorParameters: function () { return [{ type: i1.ContextService }, { type: i2.QuoteDraftService }, { type: i3.FlowInfoService }, { type: i4.FlowConfigurationService }, { type: i5.ConfigurationProcessorsApiService }, { type: i5.FlowStateApiService }, { type: i5.QuoteApiService }, { type: i6.ToastService }, { type: undefined, decorators: [{
|
507
|
+
type: Optional
|
508
|
+
}, {
|
509
|
+
type: Inject,
|
510
|
+
args: [FLOW_CUSTOMIZATION]
|
511
|
+
}] }]; } });
|
512
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvdy1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zZGsvY29yZS9zZXJ2aWNlcy9mbG93LXN0YXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRyxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pFLE9BQU8sRUFJTCx3QkFBd0IsRUFHeEIsMkJBQTJCLEVBQzNCLFVBQVUsRUFRVixTQUFTLEVBRVQsY0FBYyxFQUNkLElBQUksR0FDTCxNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFjLE9BQU8sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsZUFBZSxFQUNmLE1BQU0sRUFDTixVQUFVLEVBQ1YsYUFBYSxFQUNiLFlBQVksRUFDWixNQUFNLEVBQ04sUUFBUSxFQUNSLFFBQVEsRUFDUixHQUFHLEVBQ0gsSUFBSSxFQUVKLEVBQUUsRUFDRixLQUFLLEVBQ0wsV0FBVyxFQUNYLE9BQU8sRUFDUCxTQUFTLEVBQ1QsSUFBSSxFQUNKLFNBQVMsRUFDVCxHQUFHLEVBQ0gsVUFBVSxHQUNYLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3RELE9BQU8sRUFBcUIsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUUxRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RE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QU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDO1lBQ3BCLE9BQU8sRUFBRSwyQkFBMkI7WUFDcEMsT0FBTyxFQUFFLG9CQUFvQjtZQUM3QixTQUFTLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVO1NBQ3BELENBQUMsQ0FBQztRQUVILE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7OzZHQWhxQlUsZ0JBQWdCLHVTQStCTCxrQkFBa0I7aUhBL0I3QixnQkFBZ0I7MkZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVTs7MEJBZ0NOLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvblByb2Nlc3NvcnNBcGlTZXJ2aWNlLCBGbG93U3RhdGVBcGlTZXJ2aWNlLCBRdW90ZUFwaVNlcnZpY2UgfSBmcm9tICdAdmVsb2NlYXBwcy9hcGknO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlLCBUb2FzdFR5cGUgfSBmcm9tICdAdmVsb2NlYXBwcy9jb21wb25lbnRzJztcbmltcG9ydCB7XG4gIENoYXJnZSxcbiAgQ29tcGlsZWRQcmljZVBsYW4sXG4gIENvbmZpZ3VyYXRpb25Db250ZXh0LFxuICBDb25maWd1cmF0aW9uQ29udGV4dE1vZGUsXG4gIENvbmZpZ3VyYXRpb25Qcm9jZXNzb3IsXG4gIENvbmZpZ3VyYXRpb25Qcm9jZXNzb3JTY3JpcHRGbixcbiAgQ29uZmlndXJhdGlvblByb2Nlc3NvclR5cGVzLFxuICBFbnRpdHlVdGlsLFxuICBGbG93LFxuICBGbG93U3RhdGUsXG4gIEZsb3dTdGF0ZUV4ZWN1dGFibGVEVE8sXG4gIEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3QsXG4gIEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3REVE8sXG4gIEZsb3dTdGF0ZUV4ZWN1dGlvblJlc3VsdCxcbiAgRmxvd1N0YXRlU2VsZWN0b3JSZXNwb25zZSxcbiAgaXNEZWZpbmVkLFxuICBNZXRyaWNSdWxlLFxuICBVSVRlbXBsYXRlVHlwZSxcbiAgVVVJRCxcbn0gZnJvbSAnQHZlbG9jZWFwcHMvY29yZSc7XG5pbXBvcnQgeyBhc3NpZ24sIGNsb25lRGVlcCwgRGljdGlvbmFyeSwgZmxhdHRlbiB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGJ1ZmZlcixcbiAgY2F0Y2hFcnJvcixcbiAgY29tYmluZUxhdGVzdCxcbiAgZGVib3VuY2VUaW1lLFxuICBmaWx0ZXIsXG4gIGZpbmFsaXplLFxuICBmb3JrSm9pbixcbiAgbWFwLFxuICBub29wLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgc2hhcmUsXG4gIHNoYXJlUmVwbGF5LFxuICBTdWJqZWN0LFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFwLFxuICB0aHJvd0Vycm9yLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEZsb3dDb25maWd1cmF0aW9uU2VydmljZSB9IGZyb20gJy4uL21vZHVsZXMnO1xuaW1wb3J0IHsgRmxvd0N1c3RvbWl6YXRpb24sIEZMT1dfQ1VTVE9NSVpBVElPTiB9IGZyb20gJy4uL3R5cGVzL2Zsb3ctY3VzdG9taXphdGlvbi50eXBlcyc7XG5pbXBvcnQgeyBGbG93U3RhdGVTdWJzY3JpcHRpb25PcHRpb25zLCBGbG93U3RvcmUgfSBmcm9tICcuLi90eXBlcy9mbG93LXN0YXRlLnR5cGVzJztcbmltcG9ydCB7IENvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi9jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRmxvd0luZm9TZXJ2aWNlIH0gZnJvbSAnLi9mbG93LWluZm8uc2VydmljZSc7XG5pbXBvcnQgeyBRdW90ZURyYWZ0U2VydmljZSB9IGZyb20gJy4vcXVvdGUtZHJhZnQuc2VydmljZSc7XG5cbnR5cGUgUHJvY2Vzc29yc01hcCA9IFBhcnRpYWw8e1xuICBbb3duZXJJZDogc3RyaW5nXToge1xuICAgIFthcGlOYW1lOiBzdHJpbmddOiBDb25maWd1cmF0aW9uUHJvY2Vzc29yO1xuICB9O1xufT47XG5cbnR5cGUgU3Vic2NyaXB0aW9uID0ge1xuICByZXF1ZXN0OiBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0RFRPO1xuICBkYXRhJDogQmVoYXZpb3JTdWJqZWN0PHVua25vd24+O1xufTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZsb3dTdGF0ZVNlcnZpY2Uge1xuICBwdWJsaWMgY2hhcmdlcyQ6IE9ic2VydmFibGU8RGljdGlvbmFyeTxDaGFyZ2U+PjtcbiAgcHVibGljIHByaWNlUGxhbnMkOiBPYnNlcnZhYmxlPERpY3Rpb25hcnk8Q29tcGlsZWRQcmljZVBsYW4+PjtcbiAgcHVibGljIGFjdGl2ZU1ldHJpY3MkOiBPYnNlcnZhYmxlPE1ldHJpY1J1bGVbXT47XG4gIHB1YmxpYyBpc1ByaWNlTGlzdExvY2tlZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBOT1RfSU5JVElBTElaRUQgPSBTeW1ib2woKTtcbiAgcHJpdmF0ZSByZWFkb25seSBFWEVDVVRJT05fQlVGRkVSX1RJTUUgPSAxMDA7XG5cbiAgcHJpdmF0ZSBleGVjdXRlZEZ1bmN0aW9uczogRGljdGlvbmFyeTxDb25maWd1cmF0aW9uUHJvY2Vzc29yU2NyaXB0Rm4+ID0ge307XG4gIHByaXZhdGUgc3RhdGVJZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIF9oYXNTdGF0ZWZ1bFVuc2F2ZWRDaGFuZ2VzID0gdHJ1ZTtcbiAgcHJpdmF0ZSBwcm9jZXNzb3JzOiBQcm9jZXNzb3JzTWFwID0ge307XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogUmVjb3JkPHN0cmluZywgU3Vic2NyaXB0aW9uPiA9IHt9O1xuICBwcml2YXRlIGZsb3dTdG9yZTogRmxvd1N0b3JlID0ge307XG5cbiAgcHJpdmF0ZSBzdGF0ZWZ1bEV4ZWN1dGlvbkluUHJvZ3Jlc3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIHByaXZhdGUgc3RhdGVmdWxSZXF1ZXN0U3RyZWFtJCA9IG5ldyBTdWJqZWN0PEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3REVE8+KCk7XG4gIHByaXZhdGUgc3RhdGVmdWxFeGVjdXRpb25SZXF1ZXN0JDogT2JzZXJ2YWJsZTxGbG93U3RhdGVFeGVjdXRpb25SZXN1bHQ+O1xuXG4gIHByaXZhdGUgY2xlYW51cCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY29udGV4dFNlcnZpY2U6IENvbnRleHRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcXVvdGVEcmFmdFNlcnZpY2U6IFF1b3RlRHJhZnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmxvd0luZm9TZXJ2aWNlOiBGbG93SW5mb1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBmbG93Q29uZmlndXJhdGlvbjogRmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcHJvY2Vzc29yc0FwaVNlcnZpY2U6IENvbmZpZ3VyYXRpb25Qcm9jZXNzb3JzQXBpU2VydmljZSxcbiAgICBwcml2YXRlIGZsb3dTdGF0ZUFwaVNlcnZpY2U6IEZsb3dTdGF0ZUFwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBxdW90ZUFwaVNlcnZpY2U6IFF1b3RlQXBpU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRkxPV19DVVNUT01JWkFUSU9OKSBwcml2YXRlIGN1c3RvbWl6YXRpb25TZXJ2aWNlPzogRmxvd0N1c3RvbWl6YXRpb24sXG4gICkge1xuICAgIHRoaXMuc3RhdGVmdWxFeGVjdXRpb25SZXF1ZXN0JCA9IHRoaXMuaW5pdEJ1ZmZlcmVkUmVxdWVzdCQoKTtcblxuICAgIC8qXG4gICAgICBJbiBzdGF0ZWxlc3MgbW9kZSB3YXRjaCBRdW90ZURyYWZ0IGNoYW5nZXMgYW5kIGNhbGwgZXhlY3V0ZVJlcXVlc3Qgc28gdGhhdFxuICAgICAgYWxsIHN1YnNjcmlwdGlvbnMgZ2V0IHRoZWlyIHVwZGF0ZXMgYWNjb3JkaW5nIHRvIHVwZGF0ZWQgUXVvdGVEcmFmdFxuICAgICovXG4gICAgdGhpcy5pc0luaXRpYWxpemVkJCgpXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKEJvb2xlYW4pLFxuICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMuZ2V0Rmxvd1NhZmUoKS5wcm9wZXJ0aWVzLnN0YXRlZnVsKSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZmxvd0NvbmZpZ3VyYXRpb24udXBkYXRlZCQpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5leGVjdXRlUmVxdWVzdCQoe30sIHRydWUpKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMuY2hhcmdlcyQgPSB0aGlzLmZsb3dJbmZvU2VydmljZS5mbG93JC5waXBlKFxuICAgICAgZmlsdGVyKGlzRGVmaW5lZCksXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5mbG93SW5mb1NlcnZpY2UuaXNMZWdhY3kpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5xdW90ZURyYWZ0U2VydmljZS5xdW90ZURyYWZ0JC5waXBlKG1hcChxdW90ZURyYWZ0ID0+IHF1b3RlRHJhZnQuY2hhcmdlcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLnN1YnNjcmliZSQ8RGljdGlvbmFyeTxDaGFyZ2U+PihVSVRlbXBsYXRlVHlwZS5GTE9XX0VOR0lORSwgJ0NIQVJHRVMnLCBudWxsLCB7XG4gICAgICAgICAgICBjb2xkOiB0cnVlLFxuICAgICAgICAgIH0pLnBpcGUobWFwKHJlc3BvbnNlID0+IChyZXNwb25zZS5zdWNjZXNzID8gcmVzcG9uc2UucmVzdWx0IDoge30pKSk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgc2hhcmVSZXBsYXkoMSksXG4gICAgKTtcbiAgICB0aGlzLmNoYXJnZXMkLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5wcmljZVBsYW5zJCA9IHRoaXMuZmxvd0luZm9TZXJ2aWNlLmZsb3ckLnBpcGUoXG4gICAgICBmaWx0ZXIoaXNEZWZpbmVkKSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmZsb3dJbmZvU2VydmljZS5pc0xlZ2FjeSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLnF1b3RlRHJhZnQkLnBpcGUobWFwKHF1b3RlRHJhZnQgPT4gcXVvdGVEcmFmdC5wcmljZVBsYW5zKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3Vic2NyaWJlJDxEaWN0aW9uYXJ5PENvbXBpbGVkUHJpY2VQbGFuPj4oVUlUZW1wbGF0ZVR5cGUuRkxPV19FTkdJTkUsICdQUklDRV9QTEFOUycsIG51bGwsIHtcbiAgICAgICAgICAgIGNvbGQ6IHRydWUsXG4gICAgICAgICAgfSkucGlwZShtYXAocmVzcG9uc2UgPT4gKHJlc3BvbnNlLnN1Y2Nlc3MgPyByZXNwb25zZS5yZXN1bHQgOiB7fSkpKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBzaGFyZVJlcGxheSgxKSxcbiAgICApO1xuICAgIHRoaXMucHJpY2VQbGFucyQuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLmFjdGl2ZU1ldHJpY3MkID0gdGhpcy5mbG93SW5mb1NlcnZpY2UuZmxvdyQucGlwZShcbiAgICAgIGZpbHRlcihpc0RlZmluZWQpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZmxvd0luZm9TZXJ2aWNlLmlzTGVnYWN5KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucXVvdGVEcmFmdFNlcnZpY2UucXVvdGVEcmFmdCQucGlwZShtYXAocXVvdGVEcmFmdCA9PiBxdW90ZURyYWZ0LmFjdGl2ZU1ldHJpY3MpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdWJzY3JpYmUkPE1ldHJpY1J1bGVbXT4oVUlUZW1wbGF0ZVR5cGUuRkxPV19FTkdJTkUsICdBQ1RJVkVfTUVUUklDUycsIG51bGwsIHtcbiAgICAgICAgICAgIGNvbGQ6IHRydWUsXG4gICAgICAgICAgfSkucGlwZShtYXAocmVzcG9uc2UgPT4gKHJlc3BvbnNlLnN1Y2Nlc3MgPyByZXNwb25zZS5yZXN1bHQgOiBbXSkpKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBzaGFyZVJlcGxheSgxKSxcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlTWV0cmljcyQuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLmlzUHJpY2VMaXN0TG9ja2VkJCA9IHRoaXMuZmxvd0luZm9TZXJ2aWNlLmZsb3ckLnBpcGUoXG4gICAgICBmaWx0ZXIoaXNEZWZpbmVkKSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmZsb3dJbmZvU2VydmljZS5pc0xlZ2FjeSkge1xuICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3Vic2NyaWJlJDxib29sZWFuPihVSVRlbXBsYXRlVHlwZS5GTE9XX0VOR0lORSwgJ0lTX1BSSUNFX0xJU1RfTE9DS0VEJywgbnVsbCwge1xuICAgICAgICAgICAgY29sZDogdHJ1ZSxcbiAgICAgICAgICB9KS5waXBlKG1hcChyZXNwb25zZSA9PiAocmVzcG9uc2Uuc3VjY2VzcyA/IHJlc3BvbnNlLnJlc3VsdCA6IGZhbHNlKSkpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpLFxuICAgICk7XG4gICAgdGhpcy5pc1ByaWNlTGlzdExvY2tlZCQuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdCQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuaW5pdFByb2Nlc3NvcnMkKCkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmdldEZsb3dTYWZlKCkucHJvcGVydGllcy5zdGF0ZWZ1bCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmluaXRTdGF0ZWZ1bCQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pbml0U3RhdGVsZXNzJCgpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNsZWFudXAoKTogdm9pZCB7XG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLnN1YnNjcmlwdGlvbnMpLmZvckVhY2goKHsgZGF0YSQgfSkgPT4gZGF0YSQuY29tcGxldGUoKSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zID0ge307XG5cbiAgICBpZiAodGhpcy5zdGF0ZUlkJC52YWx1ZSkge1xuICAgICAgdGhpcy5mbG93U3RhdGVBcGlTZXJ2aWNlLmNhbmNlbCh0aGlzLnN0YXRlSWQkLnZhbHVlKS5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuc3RhdGVJZCQubmV4dChudWxsKTtcbiAgICB9XG5cbiAgICB0aGlzLnByb2Nlc3NvcnMgPSB7fTtcbiAgICB0aGlzLmZsb3dTdG9yZSA9IHt9O1xuICAgIHRoaXMuY2xlYW51cCQubmV4dCgpO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNVbnNhdmVkQ2hhbmdlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRGbG93U2FmZSgpLnByb3BlcnRpZXMuc3RhdGVmdWxcbiAgICAgID8gdGhpcy5faGFzU3RhdGVmdWxVbnNhdmVkQ2hhbmdlc1xuICAgICAgOiB0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLmhhc1Vuc2F2ZWRDaGFuZ2VzO1xuICB9XG5cbiAgcHVibGljIGdldCBzdGF0ZUlkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnN0YXRlSWQkLnZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0V4ZWN1dGlvbkluUHJvZ3Jlc3MkKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlZnVsRXhlY3V0aW9uSW5Qcm9ncmVzcyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgaXNJbml0aWFsaXplZCQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW3RoaXMuc3RhdGVJZCQsIHRoaXMucXVvdGVEcmFmdFNlcnZpY2UuaXNJbml0aWFsaXplZCRdKS5waXBlKFxuICAgICAgbWFwKHZhbHVlcyA9PiB2YWx1ZXMuc29tZShCb29sZWFuKSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0luaXRpYWxpemVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuc3RhdGVJZCQudmFsdWUpIHx8IHRoaXMucXVvdGVEcmFmdFNlcnZpY2UuaXNJbml0aWFsaXplZDtcbiAgfVxuXG4gIHB1YmxpYyBleGVjdXRlJChcbiAgICBzY29wZTogVUlUZW1wbGF0ZVR5cGUsXG4gICAgZXhlYzogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdCxcbiAgKTogT2JzZXJ2YWJsZTxGbG93U3RhdGVFeGVjdXRpb25SZXN1bHRbJ3NlbGVjdG9ycyddPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuZXhlY1RvUmVxdWVzdChzY29wZSwgZXhlYyk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUmVxdWVzdCQocmVxdWVzdCkucGlwZShcbiAgICAgIG1hcChyZXN1bHQgPT4ge1xuICAgICAgICAvLyBLZWVwIG9ubHkgcmVxdWVzdGVkIHJlc3VsdHNcbiAgICAgICAgY29uc3QgYWN0dWFsU2VsZWN0b3JzID0gT2JqZWN0LmVudHJpZXMocmVzdWx0LnNlbGVjdG9ycykucmVkdWNlKFxuICAgICAgICAgICh0cnVuazogUmVjb3JkPHN0cmluZywgRmxvd1N0YXRlU2VsZWN0b3JSZXNwb25zZT4sIFtyZXF1ZXN0SWQsIHJlc3VsdF0pID0+IHtcbiAgICAgICAgICAgIGlmIChleGVjLnNlbGVjdG9ycz8uW3JlcXVlc3RJZF0pIHtcbiAgICAgICAgICAgICAgdHJ1bmtbcmVxdWVzdElkXSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVuaztcbiAgICAgICAgICB9LFxuICAgICAgICAgIHt9LFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBhY3R1YWxTZWxlY3RvcnM7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGRpc3BhdGNoJChzY29wZTogVUlUZW1wbGF0ZVR5cGUsIGFjdGlvbjogc3RyaW5nLCBpbnB1dERhdGE/OiB1bmtub3duKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgY29uc3QgZXhlYzogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdCA9IHtcbiAgICAgIGFjdGlvbnM6IFt7IG5hbWU6IGFjdGlvbiwgaW5wdXREYXRhIH1dLFxuICAgIH07XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuZXhlY1RvUmVxdWVzdChzY29wZSwgZXhlYyk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUmVxdWVzdCQocmVxdWVzdCkucGlwZShtYXAobm9vcCkpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdCQ8UmVzcG9uc2UgPSB1bmtub3duPihcbiAgICBzY29wZTogVUlUZW1wbGF0ZVR5cGUsXG4gICAgc2VsZWN0b3JOYW1lOiBzdHJpbmcsXG4gICAgaW5wdXREYXRhPzogdW5rbm93bixcbiAgKTogT2JzZXJ2YWJsZTxGbG93U3RhdGVTZWxlY3RvclJlc3BvbnNlPFJlc3BvbnNlPj4ge1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMuZ2VuZXJhdGVSZXF1ZXN0SWQoc2NvcGUsIHNlbGVjdG9yTmFtZSwgaW5wdXREYXRhKTtcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5leGVjVG9SZXF1ZXN0KHNjb3BlLCB7XG4gICAgICBzZWxlY3RvcnM6IHtcbiAgICAgICAgW3JlcXVlc3RJZF06IHtcbiAgICAgICAgICBuYW1lOiBzZWxlY3Rvck5hbWUsXG4gICAgICAgICAgaW5wdXREYXRhLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVSZXF1ZXN0JChyZXF1ZXN0KS5waXBlKFxuICAgICAgbWFwKHJlc3BvbnNlID0+IHJlc3BvbnNlLnNlbGVjdG9yc1tyZXF1ZXN0SWRdIGFzIEZsb3dTdGF0ZVNlbGVjdG9yUmVzcG9uc2U8UmVzcG9uc2U+KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHN1YnNjcmliZSQ8UmVzcG9uc2UgPSB1bmtub3duPihcbiAgICBzY29wZTogVUlUZW1wbGF0ZVR5cGUsXG4gICAgc2VsZWN0b3JOYW1lOiBzdHJpbmcsXG4gICAgaW5wdXREYXRhPzogdW5rbm93bixcbiAgICBvcHRpb25zPzogRmxvd1N0YXRlU3Vic2NyaXB0aW9uT3B0aW9ucyxcbiAgKTogT2JzZXJ2YWJsZTxGbG93U3RhdGVTZWxlY3RvclJlc3BvbnNlPFJlc3BvbnNlPj4ge1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMuZ2VuZXJhdGVSZXF1ZXN0SWQoc2NvcGUsIHNlbGVjdG9yTmFtZSwgaW5wdXREYXRhKTtcblxuICAgIGxldCBzdWJzY3JpcHRpb24gPSB0aGlzLnN1YnNjcmlwdGlvbnNbcmVxdWVzdElkXTtcblxuICAgIGlmICghc3Vic2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5leGVjVG9SZXF1ZXN0KHNjb3BlLCB7XG4gICAgICAgIHNlbGVjdG9yczoge1xuICAgICAgICAgIFtyZXF1ZXN0SWRdOiB7XG4gICAgICAgICAgICBuYW1lOiBzZWxlY3Rvck5hbWUsXG4gICAgICAgICAgICBpbnB1dERhdGEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBzdWJzY3JpcHRpb24gPSB7XG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIGRhdGEkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PHVua25vd24+KHRoaXMuTk9UX0lOSVRJQUxJWkVEKSxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uc1tyZXF1ZXN0SWRdID0gc3Vic2NyaXB0aW9uO1xuXG4gICAgICBpZiAoIW9wdGlvbnM/LmNvbGQpIHtcbiAgICAgICAgdGhpcy5leGVjdXRlUmVxdWVzdCQocmVxdWVzdCkuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1YnNjcmlwdGlvbi5kYXRhJC5waXBlKFxuICAgICAgZmlsdGVyKGRhdGEgPT4gZGF0YSAhPSB0aGlzLk5PVF9JTklUSUFMSVpFRCksXG4gICAgICBtYXAoZGF0YSA9PiBkYXRhIGFzIEZsb3dTdGF0ZVNlbGVjdG9yUmVzcG9uc2U8UmVzcG9uc2U+KSxcbiAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN1YnNjcmlwdGlvbnNbcmVxdWVzdElkXT8uZGF0YSQub2JzZXJ2ZWQpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5zdWJzY3JpcHRpb25zW3JlcXVlc3RJZF07XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZSQoKTogT2JzZXJ2YWJsZTx7IHF1b3RlSWQ6IHN0cmluZyB9PiB7XG4gICAgaWYgKHRoaXMuZ2V0Rmxvd1NhZmUoKS5wcm9wZXJ0aWVzLnN0YXRlZnVsKSB7XG4gICAgICBpZiAodGhpcy5zdGF0ZUlkJC52YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbG93U3RhdGVBcGlTZXJ2aWNlLnNhdmUodGhpcy5zdGF0ZUlkJC52YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHF1b3RlRHJhZnQgPSB0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLnF1b3RlRHJhZnQ7XG4gICAgICBpZiAocXVvdGVEcmFmdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdW90ZUFwaVNlcnZpY2UudXBzZXJ0UXVvdGUocXVvdGVEcmFmdCkucGlwZShcbiAgICAgICAgICB0YXAoKHsgY29uZmlndXJhdGlvbklkIH0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dFNlcnZpY2UudXBkYXRlKHsgcHJvcGVydGllczogeyBDb25maWd1cmF0aW9uSWQ6IGNvbmZpZ3VyYXRpb25JZCB9IH0pO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvZih7IHF1b3RlSWQ6ICcnIH0pO1xuICB9XG5cbiAgcHVibGljIHN1Ym1pdCQoKTogT2JzZXJ2YWJsZTx7IHF1b3RlSWQ6IHN0cmluZyB9PiB7XG4gICAgaWYgKHRoaXMuZ2V0Rmxvd1NhZmUoKS5wcm9wZXJ0aWVzLnN0YXRlZnVsKSB7XG4gICAgICBpZiAodGhpcy5zdGF0ZUlkJC52YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbG93U3RhdGVBcGlTZXJ2aWNlLnN1Ym1pdCh0aGlzLnN0YXRlSWQkLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcXVvdGVEcmFmdCA9IHRoaXMucXVvdGVEcmFmdFNlcnZpY2UucXVvdGVEcmFmdDtcbiAgICAgIGlmIChxdW90ZURyYWZ0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1b3RlQXBpU2VydmljZS5zdWJtaXRRdW90ZShxdW90ZURyYWZ0KS5waXBlKFxuICAgICAgICAgIHRhcCgoeyBjb25maWd1cmF0aW9uSWQgfSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0U2VydmljZS51cGRhdGUoeyBwcm9wZXJ0aWVzOiB7IENvbmZpZ3VyYXRpb25JZDogY29uZmlndXJhdGlvbklkIH0gfSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mKHsgcXVvdGVJZDogJycgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Rmxvd1N0b3JlKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5mbG93U3RvcmU7XG4gIH1cblxuICBwcml2YXRlIGdldE93bmVySWRCeVNjb3BlKHNjb3BlOiBVSVRlbXBsYXRlVHlwZSk6IHN0cmluZyB7XG4gICAgY29uc3Qgb3duZXJJZCA9IHRoaXMuZmxvd0luZm9TZXJ2aWNlLnRlbXBsYXRlc1tzY29wZV0/LmlkO1xuICAgIGlmICghb3duZXJJZCkge1xuICAgICAgdGhyb3cgYE93bmVySWQgaXMgbm90IGZvdW5kIGZvciBzY29wZSAke3Njb3BlfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIG93bmVySWQ7XG4gIH1cblxuICBwcml2YXRlIGdldFNjb3BlQnlPd25lcklkKGlkOiBzdHJpbmcpOiBVSVRlbXBsYXRlVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgZm9yIChjb25zdCB0ZW1wbGF0ZSBvZiBPYmplY3QudmFsdWVzKHRoaXMuZmxvd0luZm9TZXJ2aWNlLnRlbXBsYXRlcykpIHtcbiAgICAgIGlmICh0ZW1wbGF0ZS5pZCA9PT0gaWQpIHtcbiAgICAgICAgcmV0dXJuIHRlbXBsYXRlLnR5cGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHJpdmF0ZSBleGVjVG9SZXF1ZXN0KHNjb3BlOiBVSVRlbXBsYXRlVHlwZSwgZXhlYzogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdCk6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3REVE8ge1xuICAgIGNvbnN0IG93bmVySWQgPSB0aGlzLmdldE93bmVySWRCeVNjb3BlKHNjb3BlKTtcblxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb25zOiBleGVjLmFjdGlvbnM/Lm1hcChhY3Rpb24gPT4gKHsgYXBpTmFtZTogYWN0aW9uLm5hbWUsIG93bmVySWQsIGlucHV0RGF0YTogYWN0aW9uLmlucHV0RGF0YSA/PyB7fSB9KSksXG4gICAgICBzZWxlY3RvcnM6XG4gICAgICAgIGV4ZWMuc2VsZWN0b3JzICYmXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGV4ZWMuc2VsZWN0b3JzKS5yZWR1Y2UoXG4gICAgICAgICAgKHRydW5rOiBSZWNvcmQ8c3RyaW5nLCBGbG93U3RhdGVFeGVjdXRhYmxlRFRPPiwgW2tleSwgc2VsZWN0b3JdKSA9PiAoe1xuICAgICAgICAgICAgLi4udHJ1bmssXG4gICAgICAgICAgICBba2V5XTogeyBhcGlOYW1lOiBzZWxlY3Rvci5uYW1lLCBvd25lcklkLCBpbnB1dERhdGE6IHNlbGVjdG9yLmlucHV0RGF0YSA/PyB7fSB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHt9LFxuICAgICAgICApLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZXhlY3V0ZVJlcXVlc3QkKFxuICAgIHJlcXVlc3Q6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3REVE8sXG4gICAgZm9yY2VTdWJzY3JpcHRpb25zOiBib29sZWFuID0gZmFsc2UsXG4gICk6IE9ic2VydmFibGU8Rmxvd1N0YXRlRXhlY3V0aW9uUmVzdWx0PiB7XG4gICAgY29uc3QgZnVsbFJlcXVlc3QgPSBjbG9uZURlZXAocmVxdWVzdCk7XG4gICAgaWYgKGZ1bGxSZXF1ZXN0LmFjdGlvbnM/Lmxlbmd0aCB8fCBmb3JjZVN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uIG9mIE9iamVjdC52YWx1ZXModGhpcy5zdWJzY3JpcHRpb25zKSkge1xuICAgICAgICBmdWxsUmVxdWVzdC5zZWxlY3RvcnMgPSBhc3NpZ24oZnVsbFJlcXVlc3Quc2VsZWN0b3JzLCBzdWJzY3JpcHRpb24ucmVxdWVzdC5zZWxlY3RvcnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGV4ZWN1dGlvbiQgPSB0aGlzLmdldEZsb3dTYWZlKCkucHJvcGVydGllcy5zdGF0ZWZ1bFxuICAgICAgPyB0aGlzLmV4ZWN1dGVTdGF0ZWZ1bCQoZnVsbFJlcXVlc3QpXG4gICAgICA6IHRoaXMuZXhlY3V0ZVN0YXRlbGVzcyQoZnVsbFJlcXVlc3QpO1xuXG4gICAgcmV0dXJuIGV4ZWN1dGlvbiQucGlwZSh0YXAocmVzdWx0ID0+IHRoaXMuaGFuZGxlU2VsZWN0b3JzUmVzcG9uc2UocmVzdWx0LnNlbGVjdG9ycykpKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlU2VsZWN0b3JzUmVzcG9uc2Uoc2VsZWN0b3JzOiBSZWNvcmQ8c3RyaW5nLCBGbG93U3RhdGVTZWxlY3RvclJlc3BvbnNlPHVua25vd24+Pik6IHZvaWQge1xuICAgIE9iamVjdC5lbnRyaWVzKHNlbGVjdG9ycykuZm9yRWFjaCgoW3JlcXVlc3RJZCwgc2VsZWN0b3JSZXN1bHRdKSA9PiB7XG4gICAgICBpZiAoIXNlbGVjdG9yUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6IFRvYXN0VHlwZS5lcnJvciwgc3VtbWFyeTogc2VsZWN0b3JSZXN1bHQuZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdWJzY3JpcHRpb24kID0gdGhpcy5zdWJzY3JpcHRpb25zW3JlcXVlc3RJZF0/LmRhdGEkO1xuICAgICAgaWYgKHN1YnNjcmlwdGlvbiQgJiYgc3Vic2NyaXB0aW9uJC52YWx1ZSAhPT0gc2VsZWN0b3JSZXN1bHQpIHtcbiAgICAgICAgc3Vic2NyaXB0aW9uJC5uZXh0KHNlbGVjdG9yUmVzdWx0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFN0YXRlZnVsJCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAvLyBTdWJzY3JpcHRpb25zXG4gICAgdGhpcy5zdWJzY3JpYmUkPENvbmZpZ3VyYXRpb25Db250ZXh0PihVSVRlbXBsYXRlVHlwZS5GTE9XX0VOR0lORSwgJ0NPTlRFWFQnLCBudWxsLCB7IGNvbGQ6IHRydWUgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLnVwZGF0ZShyZXNwb25zZS5yZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmNsZWFudXAkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIGNvbnN0IHByb2Nlc3NvcnNMaXN0ID0gZmxhdHRlbihPYmplY3QudmFsdWVzKHRoaXMucHJvY2Vzc29ycykubWFwKG93bmVyTWFwID0+IE9iamVjdC52YWx1ZXMob3duZXJNYXAgPz8ge30pKSk7XG4gICAgY29uc3QgcHJvY2Vzc29ycyA9IHByb2Nlc3NvcnNMaXN0Lmxlbmd0aCA/IHByb2Nlc3NvcnNMaXN0IDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHNlbGVjdG9ycyA9IE9iamVjdC52YWx1ZXModGhpcy5zdWJzY3JpcHRpb25zKVxuICAgICAgLm1hcCgoeyByZXF1ZXN0IH0pID0+IHJlcXVlc3Quc2VsZWN0b3JzKVxuICAgICAgLmZpbHRlcihpc0RlZmluZWQpXG4gICAgICAucmVkdWNlKCh0cnVuaywgc2VsZWN0b3JzKSA9PiAoeyAuLi50cnVuaywgLi4uc2VsZWN0b3JzIH0pLCB7fSk7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuZ2V0RGVmYXVsdEV4ZWN1dGlvblJlcXVlc3REVE8oKTtcblxuICAgIHJldHVybiB0aGlzLmZsb3dTdGF0ZUFwaVNlcnZpY2VcbiAgICAgIC5pbml0KHtcbiAgICAgICAgcXVvdGVJZDogdGhpcy5jb250ZXh0U2VydmljZS5yZXNvbHZlKCkuaGVhZGVySWQsXG4gICAgICAgIHBhcmFtczogdGhpcy5mbG93SW5mb1NlcnZpY2UucGFyYW1zID8/IHt9LFxuICAgICAgICBhY3Rpb25zT3ZlcnJpZGU6IHByb2Nlc3NvcnM/LmZpbHRlcihwcm9jZXNzb3IgPT4gcHJvY2Vzc29yLnR5cGUgPT09IENvbmZpZ3VyYXRpb25Qcm9jZXNzb3JUeXBlcy5BQ1RJT04pLFxuICAgICAgICBzZWxlY3RvcnNPdmVycmlkZTogcHJvY2Vzc29ycz8uZmlsdGVyKHByb2Nlc3NvciA9PiBwcm9jZXNzb3IudHlwZSA9PT0gQ29uZmlndXJhdGlvblByb2Nlc3NvclR5cGVzLlNFTEVDVE9SKSxcbiAgICAgICAgc2VsZWN0b3JzOiB7IC4uLnNlbGVjdG9ycywgLi4ucmVxdWVzdC5zZWxlY3RvcnMgfSxcbiAgICAgICAgYWN0aW9uczogcmVxdWVzdC5hY3Rpb25zLFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHsgc3RhdGVJZCwgc2VsZWN0b3JzIH0pID0+IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdG9yc1Jlc3BvbnNlKHNlbGVjdG9ycyk7XG4gICAgICAgICAgdGhpcy5zdGF0ZUlkJC5uZXh0KHN0YXRlSWQpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGluaXRCdWZmZXJlZFJlcXVlc3QkKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlZnVsUmVxdWVzdFN0cmVhbSQucGlwZShcbiAgICAgIGJ1ZmZlcih0aGlzLnN0YXRlZnVsUmVxdWVzdFN0cmVhbSQucGlwZShkZWJvdW5jZVRpbWUodGhpcy5FWEVDVVRJT05fQlVGRkVSX1RJTUUpKSksXG4gICAgICBzd2l0Y2hNYXAocmVxdWVzdHMgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuc3RhdGVJZCQudmFsdWUpIHtcbiAgICAgICAgICB0aHJvdyAnU3RhdGVmdWwgc2Vzc2lvbiBpcyBub3QgaW5pdGlhbGl6ZWQnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWVyZ2UgYnVmZmVyZWQgcmVxdWVzdHNcbiAgICAgICAgY29uc3QgcmVxdWVzdDogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdERUTyA9IHtcbiAgICAgICAgICBhY3Rpb25zOiByZXF1ZXN0cy5mbGF0TWFwKCh7IGFjdGlvbnMgfSkgPT4gYWN0aW9ucykuZmlsdGVyKGlzRGVmaW5lZCksXG4gICAgICAgICAgc2VsZWN0b3JzOiByZXF1ZXN0c1xuICAgICAgICAgICAgLm1hcCgoeyBzZWxlY3RvcnMgfSkgPT4gc2VsZWN0b3JzKVxuICAgICAgICAgICAgLmZpbHRlcihpc0RlZmluZWQpXG4gICAgICAgICAgICAucmVkdWNlKChhY2MsIHNlbGVjdG9yc01hcCkgPT4gT2JqZWN0LmFzc2lnbihhY2MsIHNlbGVjdG9yc01hcCksIHt9KSxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnN0YXRlZnVsRXhlY3V0aW9uSW5Qcm9ncmVzcyQubmV4dCh0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxvd1N0YXRlQXBpU2VydmljZS5leGVjdXRlKHRoaXMuc3RhdGVJZCQudmFsdWUsIHJlcXVlc3QpO1xuICAgICAgfSksXG4gICAgICB0YXAoKHsgc3RhdGVJZCB9KSA9PiB0aGlzLnN0YXRlSWQkLm5leHQoc3RhdGVJZCkpLFxuICAgICAgc2hhcmUoKSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLnN0YXRlZnVsRXhlY3V0aW9uSW5Qcm9ncmVzcyQubmV4dChmYWxzZSkpLFxuICAgICAgY2F0Y2hFcnJvcihlID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZWZ1bEV4ZWN1dGlvbkluUHJvZ3Jlc3MkLm5leHQoZmFsc2UpO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVTdGF0ZWZ1bCQocmVxdWVzdDogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdERUTyk6IE9ic2VydmFibGU8Rmxvd1N0YXRlRXhlY3V0aW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVmdWxFeGVjdXRpb25JblByb2dyZXNzJC5waXBlKFxuICAgICAgZmlsdGVyKGluUHJvZ3Jlc3MgPT4gIWluUHJvZ3Jlc3MpLFxuICAgICAgdGFrZSgxKSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PlxuICAgICAgICAvLyBtYWtlIHN1cmUgc3RyZWFtIHN3aXRjaGVzIHRvIHN0YXRlZnVsRXhlY3V0aW9uUmVxdWVzdCQgYmVmb3JlIHB1c2hpbmcgYW4gZXhlY3V0aW9uIHJlcXVlc3RcbiAgICAgICAgY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgdGhpcy5zdGF0ZWZ1bEV4ZWN1dGlvblJlcXVlc3QkLFxuICAgICAgICAgIG9mKHVuZGVmaW5lZCkucGlwZSh0YXAoKCkgPT4gdGhpcy5zdGF0ZWZ1bFJlcXVlc3RTdHJlYW0kLm5leHQocmVxdWVzdCkpKSxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgICAgbWFwKChbcmVzcG9uc2VdKSA9PiByZXNwb25zZSksXG4gICAgICB0YWtlKDEpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGluaXRTdGF0ZWxlc3MkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGNvbnN0IHsgaGVhZGVySWQgfSA9IHRoaXMuY29udGV4dFNlcnZpY2UucmVzb2x2ZSgpO1xuICAgIHJldHVybiB0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLmluaXQoaGVhZGVySWQsIHRoaXMuZmxvd0luZm9TZXJ2aWNlLnBhcmFtcyA/PyB7fSkucGlwZShcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFzc2V0cyA9IHRoaXMucXVvdGVEcmFmdFNlcnZpY2UuYXNzZXRzU3RhdGU7XG4gICAgICAgIGlmIChhc3NldHMpIHtcbiAgICAgICAgICB0aGlzLmZsb3dTdG9yZSA9IHsgLi4udGhpcy5mbG93U3RvcmUsIGFzc2V0cyB9O1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmV4ZWN1dGVSZXF1ZXN0JCh0aGlzLmdldERlZmF1bHRFeGVjdXRpb25SZXF1ZXN0RFRPKCkpKSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmNhbGN1bGF0ZSQoKSksXG4gICAgICB0YXAoKCkgPT4gdGhpcy5xdW90ZURyYWZ0U2VydmljZS5maW5hbGl6ZUluaXQoKSksXG4gICAgICBtYXAobm9vcCksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlJCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBjb25zdCBmbG93U3RhdGUgPSB0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLnF1b3RlRHJhZnQ7XG4gICAgaWYgKCFmbG93U3RhdGUpIHtcbiAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIC8qXG4gICAgICBEb24ndCBleGVjdXRlIHByb2NlZHVyZXMgd2hlbjpcbiAgICAgICAgKiBJbml0aWFsaXppbmcgYSBzdGFuZGFsb25lIHByb2R1Y3QgY29uZmlndXJhdGlvbiBVSSwgYXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGUgaW4gL3ByaWNlIGNhbGxcbiAgICAgICAgKiBJbml0aWFsaXppbmcgYW4gZW1wdHkgYWNjb3VudCAoYWNjb3VudCB3aXRoIG5vIGFzc2V0cylcbiAgICAqL1xuICAgIGNvbnN0IGlzRW1wdHlBY2NvdW50TW9kZSA9XG4gICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLm1vZGUgPT09IENvbmZpZ3VyYXRpb25Db250ZXh0TW9kZS5BQ0NPVU5UICYmXG4gICAgICAhdGhpcy5xdW90ZURyYWZ0U2VydmljZS5oYXNQcm9kdWN0cyAmJlxuICAgICAgIXRoaXMucXVvdGVEcmFmdFNlcnZpY2UuaGFzQXNzZXRzICYmXG4gICAgICAhdGhpcy5xdW90ZURyYWZ0U2VydmljZS5xdW90ZURyYWZ0Py5pbml0aWFsU3RhdGUubGVuZ3RoO1xuXG4gICAgaWYgKHRoaXMucXVvdGVEcmFmdFNlcnZpY2UuaXNTdGFuZGFsb25lIHx8IGlzRW1wdHlBY2NvdW50TW9kZSkge1xuICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZmxvd0NvbmZpZ3VyYXRpb24uY2FsY3VsYXRlJChmbG93U3RhdGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBleGVjdXRlU3RhdGVsZXNzJChyZXF1ZXN0OiBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0RFRPKTogT2JzZXJ2YWJsZTxGbG93U3RhdGVFeGVjdXRpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gb2YodW5kZWZpbmVkKS5waXBlKFxuICAgICAgdGFwKCgpID0+IHRoaXMuZXhlY3V0ZVN0YXRlbGVzc0FjdGlvbnMocmVxdWVzdCkpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgLypcbiAgICAgICAgICBTa2lwIHByaWNlIGNhbGN1bGF0aW9uIGluIGNhc2VcbiAgICAgICAgICAxLiBObyBhY3Rpb25zIGluIHRoZSByZXF1ZXN0XG4gICAgICAgICAgMi4gSW5pdGlhbGl6YXRpb24gcHJvY2VzcyBleGVjdXRpb24gKHN0YXRlIG5vdCBpbml0aWFsaXplZCB5ZXQpXG4gICAgICAgICovXG4gICAgICAgIGlmICghcmVxdWVzdC5hY3Rpb25zPy5sZW5ndGggfHwgIXRoaXMuaXNJbml0aWFsaXplZCgpKSB7XG4gICAgICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlJCgpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIG1hcCgoKSA9PiB0aGlzLmV4ZWN1dGVTdGF0ZWxlc3NTZWxlY3RvcnMocmVxdWVzdCkpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVTdGF0ZWxlc3NBY3Rpb25zKHJlcXVlc3Q6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3REVE8pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucXVvdGVEcmFmdFNlcnZpY2UucXVvdGVEcmFmdCB8fCAhcmVxdWVzdC5hY3Rpb25zPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZmxvd1N0YXRlID0gdGhpcy5xdW90ZURyYWZ0U2VydmljZS5xdW90ZURyYWZ0O1xuICAgIHJlcXVlc3QuYWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBmbG93U3RhdGUgPSB0aGlzLmV4ZWN1dGVBY3Rpb25TY3JpcHQoZmxvd1N0YXRlLCBhY3Rpb24pID8/IGZsb3dTdGF0ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6IFRvYXN0VHlwZS5lcnJvciwgc3VtbWFyeTogU3RyaW5nKGUpIH0pO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5xdW90ZURyYWZ0U2VydmljZS51cGRhdGVRdW90ZURyYWZ0KGZsb3dTdGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVTdGF0ZWxlc3NTZWxlY3RvcnMocmVxdWVzdDogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdERUTyk6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlc3VsdCB7XG4gICAgaWYgKCF0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLnF1b3RlRHJhZnQpIHtcbiAgICAgIHRocm93ICdRdW90ZURyYWZ0IGlzIG5vdCBpbml0aWFsaXplZCc7XG4gICAgfVxuXG4gICAgY29uc3QgZmxvd1N0YXRlID0gdGhpcy5xdW90ZURyYWZ0U2VydmljZS5xdW90ZURyYWZ0O1xuICAgIHJldHVybiBFbnRpdHlVdGlsLmVudHJpZXMocmVxdWVzdC5zZWxlY3RvcnMgPz8ge30pLnJlZHVjZShcbiAgICAgIChyZXN1bHQ6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlc3VsdCwgW2tleSwgc2VsZWN0b3JdKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzdWx0LnNlbGVjdG9yc1trZXldID0ge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIHJlc3VsdDogdGhpcy5leGVjdXRlU2VsZWN0b3JTY3JpcHQoZmxvd1N0YXRlLCBzZWxlY3RvciksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgcmVzdWx0LnNlbGVjdG9yc1trZXldID0ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U6IFN0cmluZyhlKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICB7IHN0YXRlSWQ6ICcnLCBzZWxlY3RvcnM6IHt9IH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Rmxvd1NhZmUoKTogRmxvdyB7XG4gICAgaWYgKCF0aGlzLmZsb3dJbmZvU2VydmljZS5mbG93KSB7XG4gICAgICB0aHJvdyAnRmxvdyBpcyBub3QgZGVmaW5lZCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZmxvd0luZm9TZXJ2aWNlLmZsb3c7XG4gIH1cblxuICBwcml2YXRlIGluaXRQcm9jZXNzb3JzJCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBjb25zdCBoYXNPdmVycmlkZXMgPSBCb29sZWFuKHRoaXMuY3VzdG9taXphdGlvblNlcnZpY2U/LmdldFRlbXBsYXRlQ29uZmlndXJhdGlvblByb2Nlc3NvcnMpO1xuICAgIGNvbnN0IGZsb3cgPSB0aGlzLmdldEZsb3dTYWZlKCk7XG5cbiAgICBpZiAoZmxvdy5wcm9wZXJ0aWVzLnN0YXRlZnVsICYmICFoYXNPdmVycmlkZXMpIHtcbiAgICAgIC8vIFNraXAgaW5pdGlhbGl6YXRpb24gYXMgYmFja2VuZCB3aWxsIHRha2UgcHJvY2Vzc29ycyBmcm9tIFNGXG4gICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBjb25zdCBvd25lcnMkID0gT2JqZWN0LnZhbHVlcyh0aGlzLmZsb3dJbmZvU2VydmljZS50ZW1wbGF0ZXMpXG4gICAgICAubWFwKHRlbXBsYXRlID0+IHtcbiAgICAgICAgaWYgKCF0ZW1wbGF0ZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvY2FsUHJvY2Vzc29ycyQgPVxuICAgICAgICAgIHRoaXMuY3VzdG9taXphdGlvblNlcnZpY2U/LmdldFRlbXBsYXRlQ29uZmlndXJhdGlvblByb2Nlc3NvcnM/Lih0ZW1wbGF0ZS5uYW1lKSA/PyBvZihudWxsKTtcblxuICAgICAgICByZXR1cm4gbG9jYWxQcm9jZXNzb3JzJC5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcChwcm9jZXNzb3JzID0+XG4gICAgICAgICAgICBwcm9jZXNzb3JzID8gb2YocHJvY2Vzc29ycykgOiB0aGlzLnByb2Nlc3NvcnNBcGlTZXJ2aWNlLmZldGNoQ29uZmlndXJhdGlvblByb2Nlc3NvcnMkKHRlbXBsYXRlLmlkKSxcbiAgICAgICAgICApLFxuICAgICAgICAgIHRhcChwcm9jZXNzb3JzID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NvcnNNYXAgPSBwcm9jZXNzb3JzLnJlZHVjZSgoYWNjOiBSZWNvcmQ8c3RyaW5nLCBDb25maWd1cmF0aW9uUHJvY2Vzc29yPiwgcCkgPT4ge1xuICAgICAgICAgICAgICBhY2NbcC5hcGlOYW1lXSA9IHA7XG4gICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9LCB7fSk7XG5cbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc29yc1t0ZW1wbGF0ZS5pZF0gPSBwcm9jZXNzb3JzTWFwO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoaXNEZWZpbmVkKTtcblxuICAgIGlmICghb3duZXJzJC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIHJldHVybiBmb3JrSm9pbihvd25lcnMkKS5waXBlKG1hcChub29wKSk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVBY3Rpb25TY3JpcHQocmVxdWVzdDogRmxvd1N0YXRlLCBleGVjdXRhYmxlOiBGbG93U3RhdGVFeGVjdXRhYmxlRFRPKTogRmxvd1N0YXRlIHwgbnVsbCB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvblByb2Nlc3NvciA9IHRoaXMucHJvY2Vzc29yc1tleGVjdXRhYmxlLm93bmVySWRdPy5bZXhlY3V0YWJsZS5hcGlOYW1lXTtcblxuICAgIGlmICghY29uZmlndXJhdGlvblByb2Nlc3Nvcj8uc2NyaXB0KSB7XG4gICAgICBjb25zdCBzY29wZSA9IHRoaXMuZ2V0U2NvcGVCeU93bmVySWQoZXhlY3V0YWJsZS5vd25lcklkKTtcbiAgICAgIGNvbnN0IHNjb3BlVGV4dCA9IHNjb3BlID8gYCBpbiAke3Njb3BlfWAgOiAnJztcbiAgICAgIHRocm93IGBDb25maWd1cmF0aW9uUHJvY2Vzc29yICR7ZXhlY3V0YWJsZS5hcGlOYW1lfSR7c2NvcGVUZXh0fSBub3QgZm91bmRgO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVQcm9jZXNzb3JTY3JpcHQocmVxdWVzdCwgY29uZmlndXJhdGlvblByb2Nlc3NvciwgZXhlY3V0YWJsZS5pbnB1dERhdGEpIGFzIEZsb3dTdGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZVNlbGVjdG9yU2NyaXB0KHJlcXVlc3Q6IEZsb3dTdGF0ZSwgZXhlY3V0YWJsZTogRmxvd1N0YXRlRXhlY3V0YWJsZURUTyk6IHVua25vd24ge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb25Qcm9jZXNzb3IgPSB0aGlzLnByb2Nlc3NvcnNbZXhlY3V0YWJsZS5vd25lcklkXT8uW2V4ZWN1dGFibGUuYXBpTmFtZV07XG5cbiAgICBpZiAoIWNvbmZpZ3VyYXRpb25Qcm9jZXNzb3I/LnNjcmlwdCkge1xuICAgICAgY29uc3Qgc2NvcGUgPSB0aGlzLmdldFNjb3BlQnlPd25lcklkKGV4ZWN1dGFibGUub3duZXJJZCk7XG4gICAgICBjb25zdCBzY29wZVRleHQgPSBzY29wZSA/IGAgaW4gJHtzY29wZX1gIDogJyc7XG4gICAgICB0aHJvdyBgQ29uZmlndXJhdGlvblByb2Nlc3NvciAke2V4ZWN1dGFibGUuYXBpTmFtZX0ke3Njb3BlVGV4dH0gbm90IGZvdW5kYDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUHJvY2Vzc29yU2NyaXB0KHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25Qcm9jZXNzb3IsIGV4ZWN1dGFibGUuaW5wdXREYXRhKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZVByb2Nlc3NvclNjcmlwdChcbiAgICByZXF1ZXN0OiBGbG93U3RhdGUsXG4gICAgY29uZmlndXJhdGlvblByb2Nlc3NvcjogQ29uZmlndXJhdGlvblByb2Nlc3NvcixcbiAgICBpbnB1dERhdGE6IHVua25vd24sXG4gICk6IHVua25vd24ge1xuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5nZXRTY29wZUJ5T3duZXJJZChjb25maWd1cmF0aW9uUHJvY2Vzc29yLm93bmVySWQgPz8gJycpO1xuICAgIGxldCBmdW5jdGlvblRvRXhlY3V0ZSA9IHRoaXMuZXhlY3V0ZWRGdW5jdGlvbnNbc2NvcGUgKyBjb25maWd1cmF0aW9uUHJvY2Vzc29yLmFwaU5hbWVdO1xuXG4gICAgaWYgKCFmdW5jdGlvblRvRXhlY3V0ZSkge1xuICAgICAgY29uc3Qgc2NyaXB0ID0gYCR7Y29uZmlndXJhdGlvblByb2Nlc3Nvci5zY3JpcHR9XFxucmV0dXJuIHRyYW5zZm9ybTtgO1xuICAgICAgY29uc3Qgc291cmNlTWFwID0gYFxcbi8vIyBzb3VyY2VVUkw9JHtzY29wZSA/IHNjb3BlICsgJy8nIDogJyd9JHtjb25maWd1cmF0aW9uUHJvY2Vzc29yLmFwaU5hbWV9LmpzYDtcbiAgICAgIGZ1bmN0aW9uVG9FeGVjdXRlID0gbmV3IEZ1bmN0aW9uKHNjcmlwdCArIHNvdXJjZU1hcCkoKSBhcyBDb25maWd1cmF0aW9uUHJvY2Vzc29yU2NyaXB0Rm47XG4gICAgICB0aGlzLmV4ZWN1dGVkRnVuY3Rpb25zW3Njb3BlICsgY29uZmlndXJhdGlvblByb2Nlc3Nvci5hcGlOYW1lXSA9IGZ1bmN0aW9uVG9FeGVjdXRlO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvblRvRXhlY3V0ZSh7XG4gICAgICByZXF1ZXN0LFxuICAgICAgaW5wdXREYXRhLFxuICAgICAgZmxvd1N0b3JlOiB0aGlzLmZsb3dTdG9yZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVSZXF1ZXN0SWQoc2NvcGU6IFVJVGVtcGxhdGVUeXBlLCBzZWxlY3Rvck5hbWU6IHN0cmluZywgaW5wdXREYXRhPzogdW5rbm93bik6IHN0cmluZyB7XG4gICAgY29uc3QgaW5wdXREYXRhSGFzaCA9IFVVSUQuaGV4KEpTT04uc3RyaW5naWZ5KGlucHV0RGF0YSkgfHwgJycpLnNsaWNlKDAsIDgpO1xuICAgIHJldHVybiBgJHtzY29wZX0vJHtzZWxlY3Rvck5hbWV9LyR7aW5wdXREYXRhSGFzaH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWZhdWx0RXhlY3V0aW9uUmVxdWVzdERUTygpOiBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0RFRPIHtcbiAgICBjb25zdCByZXF1ZXN0OiBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0RFRPID0ge1xuICAgICAgYWN0aW9uczogW10sXG4gICAgICBzZWxlY3RvcnM6IHt9LFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5nZXRGbG93U2FmZSgpLnByb3BlcnRpZXMuc3RhbmRhbG9uZSkge1xuICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgfVxuXG4gICAgY29uc3QgZmxvd0VuZ2luZVRlbXBsYXRlSWQgPSB0aGlzLmdldE93bmVySWRCeVNjb3BlKFVJVGVtcGxhdGVUeXBlLkZMT1dfRU5HSU5FKTtcblxuICAgIHJlcXVlc3QuYWN0aW9ucz8ucHVzaCh7XG4gICAgICBhcGlOYW1lOiAnVVBEQVRFX0NPTlRFWFRfUFJPUEVSVElFUycsXG4gICAgICBvd25lcklkOiBmbG93RW5naW5lVGVtcGxhdGVJZCxcbiAgICAgIGlucHV0RGF0YTogdGhpcy5jb250ZXh0U2VydmljZS5yZXNvbHZlKCkucHJvcGVydGllcyxcbiAgICB9KTtcblxuICAgIHJldHVybiByZXF1ZXN0O1xuICB9XG59XG4iXX0=
|
@@ -1,6 +1,9 @@
|
|
1
1
|
export * from './context.service';
|
2
|
-
export * from './
|
2
|
+
export * from './flow-info.service';
|
3
|
+
export * from './flow-state.service';
|
4
|
+
export * from './flow-state-configuration.service';
|
5
|
+
export * from './integration.state';
|
3
6
|
export * from './product-images.service';
|
4
7
|
export * from './quote-draft.service';
|
5
8
|
export * from './runtime-settings.service';
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3Nkay9jb3JlL3NlcnZpY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsb0NBQW9DLENBQUM7QUFDbkQsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyw0QkFBNEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY29udGV4dC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vZmxvdy1pbmZvLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9mbG93LXN0YXRlLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9mbG93LXN0YXRlLWNvbmZpZ3VyYXRpb24uc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVncmF0aW9uLnN0YXRlJztcbmV4cG9ydCAqIGZyb20gJy4vcHJvZHVjdC1pbWFnZXMuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3F1b3RlLWRyYWZ0LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9ydW50aW1lLXNldHRpbmdzLnNlcnZpY2UnO1xuIl19
|