@veloceapps/sdk 8.0.0-132 → 8.0.0-134
Sign up to get free protection for your applications and to get access to all the features.
- package/cms/components/preview/preview.component.d.ts +2 -2
- package/cms/vendor-map.d.ts +2 -2
- package/core/modules/configuration/configuration.module.d.ts +2 -1
- package/core/modules/configuration/index.d.ts +1 -1
- package/core/modules/configuration/services/configuration-state.service.d.ts +48 -0
- package/core/modules/configuration/services/configuration.service.d.ts +2 -1
- package/core/modules/flow-configuration/flow-configuration.module.d.ts +2 -1
- package/core/services/flow-info.service.d.ts +1 -0
- package/core/services/flow-state-configuration.service.d.ts +5 -6
- package/esm2020/cms/components/preview/preview.component.mjs +4 -4
- package/esm2020/cms/vendor-map.mjs +3 -3
- package/esm2020/core/core.module.mjs +16 -2
- package/esm2020/core/modules/configuration/configuration.module.mjs +7 -23
- package/esm2020/core/modules/configuration/helpers.mjs +1 -1
- package/esm2020/core/modules/configuration/index.mjs +2 -2
- package/esm2020/core/modules/configuration/services/configuration-state.service.mjs +267 -0
- package/esm2020/core/modules/configuration/services/configuration.service.mjs +21 -15
- package/esm2020/core/modules/flow-configuration/flow-configuration.module.mjs +6 -6
- package/esm2020/core/modules/flow-configuration/services/flow-configuration.service.mjs +3 -4
- package/esm2020/core/services/context.service.mjs +3 -4
- package/esm2020/core/services/flow-info.service.mjs +6 -4
- package/esm2020/core/services/flow-state-configuration.service.mjs +27 -26
- package/esm2020/core/services/flow-state.service.mjs +15 -7
- package/esm2020/core/services/integration.state.mjs +3 -4
- package/esm2020/core/services/metric-calculation/metric-calculation.service.mjs +3 -4
- package/esm2020/core/services/product-images.service.mjs +3 -4
- package/esm2020/core/services/quote-draft.service.mjs +3 -4
- package/esm2020/core/services/runtime-settings.service.mjs +4 -5
- package/esm2020/src/guards/context.guard.mjs +1 -2
- package/esm2020/src/pages/product/product.component.mjs +21 -8
- package/esm2020/src/pages/remote/remote.component.mjs +4 -4
- package/esm2020/src/services/flow-router.service.mjs +30 -13
- package/esm2020/src/services/flow.service.mjs +48 -27
- package/fesm2015/veloceapps-sdk-cms.mjs +4 -4
- package/fesm2015/veloceapps-sdk-cms.mjs.map +1 -1
- package/fesm2015/veloceapps-sdk-core.mjs +292 -152
- package/fesm2015/veloceapps-sdk-core.mjs.map +1 -1
- package/fesm2015/veloceapps-sdk.mjs +94 -45
- package/fesm2015/veloceapps-sdk.mjs.map +1 -1
- package/fesm2020/veloceapps-sdk-cms.mjs +4 -4
- package/fesm2020/veloceapps-sdk-cms.mjs.map +1 -1
- package/fesm2020/veloceapps-sdk-core.mjs +281 -151
- package/fesm2020/veloceapps-sdk-core.mjs.map +1 -1
- package/fesm2020/veloceapps-sdk.mjs +93 -44
- package/fesm2020/veloceapps-sdk.mjs.map +1 -1
- package/package.json +1 -1
- package/src/pages/product/product.component.d.ts +6 -4
- package/src/pages/remote/remote.component.d.ts +2 -2
- package/src/services/flow-router.service.d.ts +4 -2
- package/src/services/flow.service.d.ts +7 -3
- package/core/modules/configuration/services/configuration.state.d.ts +0 -30
- package/esm2020/core/modules/configuration/services/configuration.state.mjs +0 -142
package/package.json
CHANGED
@@ -1,22 +1,24 @@
|
|
1
1
|
import { UIDefinition } from '@veloceapps/core';
|
2
2
|
import { CMSPreviewConfig } from '@veloceapps/sdk/cms';
|
3
|
-
import { ConfigurationRuntimeService, ConfigurationService,
|
3
|
+
import { ConfigurationRuntimeService, ConfigurationService, ConfigurationStateService, ContextService, FlowCustomization, FlowInfoService, FlowStateService, IntegrationState, QuoteDraftService } from '@veloceapps/sdk/core';
|
4
4
|
import { BehaviorSubject } from 'rxjs';
|
5
5
|
import * as i0 from "@angular/core";
|
6
6
|
export declare class ProductComponent {
|
7
7
|
private contextService;
|
8
8
|
private configurationRuntimeService;
|
9
9
|
private configurationService;
|
10
|
-
private
|
10
|
+
private configurationStateService;
|
11
11
|
private quoteDraftService;
|
12
|
+
private flowInfoService;
|
13
|
+
private flowStateService;
|
12
14
|
private integrationState;
|
13
15
|
private customizationService?;
|
14
16
|
config: CMSPreviewConfig;
|
15
17
|
uiDefinition$: BehaviorSubject<UIDefinition | undefined>;
|
16
|
-
constructor(contextService: ContextService, configurationRuntimeService: ConfigurationRuntimeService, configurationService: ConfigurationService,
|
18
|
+
constructor(contextService: ContextService, configurationRuntimeService: ConfigurationRuntimeService, configurationService: ConfigurationService, configurationStateService: ConfigurationStateService, quoteDraftService: QuoteDraftService, flowInfoService: FlowInfoService, flowStateService: FlowStateService, integrationState: IntegrationState, customizationService?: FlowCustomization | undefined);
|
17
19
|
private customizeUI$;
|
18
20
|
private init$;
|
19
21
|
private getLineItemId;
|
20
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<ProductComponent, [null, null, null, null, null, null, { optional: true; }]>;
|
22
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ProductComponent, [null, null, null, null, null, null, null, null, { optional: true; }]>;
|
21
23
|
static ɵcmp: i0.ɵɵComponentDeclaration<ProductComponent, "vl-flow-product", never, {}, {}, never, never, false, never>;
|
22
24
|
}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { Location } from '@angular/common';
|
2
2
|
import { OnDestroy } from '@angular/core';
|
3
3
|
import { UIDefinition } from '@veloceapps/core';
|
4
|
-
import { ConfigurationRuntimeService, ConfigurationService,
|
4
|
+
import { ConfigurationRuntimeService, ConfigurationService, ConfigurationStateService, ContextService, IntegrationState, QuoteDraftService } from '@veloceapps/sdk/core';
|
5
5
|
import { MessageService } from 'primeng/api';
|
6
6
|
import { BehaviorSubject } from 'rxjs';
|
7
7
|
import * as i0 from "@angular/core";
|
@@ -23,7 +23,7 @@ export declare class RemoteComponent implements OnDestroy {
|
|
23
23
|
private readonly DYNAMIC_OPTION_PRODUCTS_KEY;
|
24
24
|
private rpcMessage;
|
25
25
|
private destroyed$;
|
26
|
-
constructor(contextService: ContextService, quoteDraftService: QuoteDraftService, runtimeService: ConfigurationRuntimeService, configurationService: ConfigurationService, configurationState:
|
26
|
+
constructor(contextService: ContextService, quoteDraftService: QuoteDraftService, runtimeService: ConfigurationRuntimeService, configurationService: ConfigurationService, configurationState: ConfigurationStateService, messageService: MessageService, integrationState: IntegrationState, location: Location);
|
27
27
|
ngOnDestroy(): void;
|
28
28
|
private initConfiguration;
|
29
29
|
private throwIfNoUIDefinition;
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { ActivatedRoute, ActivatedRouteSnapshot, Params, Router } from '@angular/router';
|
2
|
-
import { ContextService, IntegrationState } from '@veloceapps/sdk/core';
|
2
|
+
import { ContextService, FlowInfoService, FlowStateService, IntegrationState } from '@veloceapps/sdk/core';
|
3
3
|
import { Observable } from 'rxjs';
|
4
4
|
import * as i0 from "@angular/core";
|
5
5
|
export declare class FlowRouterService {
|
@@ -7,12 +7,14 @@ export declare class FlowRouterService {
|
|
7
7
|
private route;
|
8
8
|
private contextService;
|
9
9
|
private integrationState;
|
10
|
+
private flowInfoService;
|
11
|
+
private flowStateService;
|
10
12
|
private routeChange$;
|
11
13
|
private lastChildParams$;
|
12
14
|
private lastChildRoute$;
|
13
15
|
private urlHistory;
|
14
16
|
loading$: Observable<boolean>;
|
15
|
-
constructor(router: Router, route: ActivatedRoute, contextService: ContextService, integrationState: IntegrationState);
|
17
|
+
constructor(router: Router, route: ActivatedRoute, contextService: ContextService, integrationState: IntegrationState, flowInfoService: FlowInfoService, flowStateService: FlowStateService);
|
16
18
|
getFlowRootRoute(route: ActivatedRouteSnapshot): ActivatedRouteSnapshot | undefined;
|
17
19
|
getFlowRootPath(route: ActivatedRouteSnapshot): string;
|
18
20
|
get route$(): Observable<ActivatedRouteSnapshot>;
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { IntegrationState } from '@veloceapps/sdk/cms';
|
2
|
-
import { ConfigurationService, FlowConfigurationService, QuoteDraftService } from '@veloceapps/sdk/core';
|
2
|
+
import { ConfigurationService, ConfigurationStateService, FlowConfigurationService, FlowInfoService, FlowStateService, QuoteDraftService } from '@veloceapps/sdk/core';
|
3
3
|
import { FlowDialogService } from './flow-dialog.service';
|
4
4
|
import { FlowRouterService } from './flow-router.service';
|
5
5
|
import * as i0 from "@angular/core";
|
@@ -8,13 +8,17 @@ export declare class FlowService {
|
|
8
8
|
private flowRouterService;
|
9
9
|
private quoteDraftService;
|
10
10
|
private configurationService;
|
11
|
-
private
|
11
|
+
private configurationStateService;
|
12
12
|
private flowDialogService;
|
13
|
+
private flowConfigurationService;
|
14
|
+
private flowInfoService;
|
15
|
+
private flowStateService;
|
13
16
|
private cleanup$;
|
14
|
-
constructor(integrationState: IntegrationState, flowRouterService: FlowRouterService, quoteDraftService: QuoteDraftService, configurationService: ConfigurationService, flowConfigurationService: FlowConfigurationService,
|
17
|
+
constructor(integrationState: IntegrationState, flowRouterService: FlowRouterService, quoteDraftService: QuoteDraftService, configurationService: ConfigurationService, configurationStateService: ConfigurationStateService, flowDialogService: FlowDialogService, flowConfigurationService: FlowConfigurationService, flowInfoService: FlowInfoService, flowStateService: FlowStateService);
|
15
18
|
cleanup(): void;
|
16
19
|
initSubscriptions(): void;
|
17
20
|
private updateFlowPath;
|
21
|
+
private legacyApplyConfiguration;
|
18
22
|
static ɵfac: i0.ɵɵFactoryDeclaration<FlowService, never>;
|
19
23
|
static ɵprov: i0.ɵɵInjectableDeclaration<FlowService>;
|
20
24
|
}
|
@@ -1,30 +0,0 @@
|
|
1
|
-
import { StatefulConfigurationApiService } from '@veloceapps/api';
|
2
|
-
import { ToastService } from '@veloceapps/components';
|
3
|
-
import { ConfigurationExecuteRequest } from '@veloceapps/core';
|
4
|
-
import { Observable } from 'rxjs';
|
5
|
-
import { ConfigurationRuntimeService } from './configuration-runtime.service';
|
6
|
-
import { ConfigurationService } from './configuration.service';
|
7
|
-
import * as i0 from "@angular/core";
|
8
|
-
export declare class ConfigurationState {
|
9
|
-
private statefulConfigurationApiService;
|
10
|
-
private runtimeService;
|
11
|
-
private configurationService;
|
12
|
-
private toastService;
|
13
|
-
private readonly stateSubj$;
|
14
|
-
state$: Observable<Record<string, unknown>>;
|
15
|
-
private stateId;
|
16
|
-
constructor(statefulConfigurationApiService: StatefulConfigurationApiService, runtimeService: ConfigurationRuntimeService, configurationService: ConfigurationService, toastService: ToastService);
|
17
|
-
init$(): Observable<void>;
|
18
|
-
cleanup(): void;
|
19
|
-
execute$(req: ConfigurationExecuteRequest): Observable<void>;
|
20
|
-
dispatch$(actionName: string, inputData: unknown): Observable<void>;
|
21
|
-
select$(selectorName: string, inputData: unknown): Observable<unknown>;
|
22
|
-
private get isStatefulConfiguration();
|
23
|
-
private executeStateless$;
|
24
|
-
private executeStateful$;
|
25
|
-
private executeActionScript;
|
26
|
-
private executeSelectorScript;
|
27
|
-
private executeProcessorScript;
|
28
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<ConfigurationState, never>;
|
29
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<ConfigurationState>;
|
30
|
-
}
|
@@ -1,142 +0,0 @@
|
|
1
|
-
import { Injectable } from '@angular/core';
|
2
|
-
import { StatefulConfigurationApiService } from '@veloceapps/api';
|
3
|
-
import { ToastService, ToastType } from '@veloceapps/components';
|
4
|
-
import { EntityUtil, UUID, } from '@veloceapps/core';
|
5
|
-
import { omit } from 'lodash';
|
6
|
-
import { BehaviorSubject, map, of, switchMap, tap } from 'rxjs';
|
7
|
-
import { ConfigurationRuntimeService } from './configuration-runtime.service';
|
8
|
-
import { ConfigurationService } from './configuration.service';
|
9
|
-
import * as i0 from "@angular/core";
|
10
|
-
import * as i1 from "@veloceapps/api";
|
11
|
-
import * as i2 from "./configuration-runtime.service";
|
12
|
-
import * as i3 from "./configuration.service";
|
13
|
-
import * as i4 from "@veloceapps/components";
|
14
|
-
export class ConfigurationState {
|
15
|
-
constructor(statefulConfigurationApiService, runtimeService, configurationService, toastService) {
|
16
|
-
this.statefulConfigurationApiService = statefulConfigurationApiService;
|
17
|
-
this.runtimeService = runtimeService;
|
18
|
-
this.configurationService = configurationService;
|
19
|
-
this.toastService = toastService;
|
20
|
-
this.stateSubj$ = new BehaviorSubject({});
|
21
|
-
this.state$ = this.stateSubj$.asObservable();
|
22
|
-
this.stateId = null;
|
23
|
-
}
|
24
|
-
init$() {
|
25
|
-
return this.configurationService.configure().pipe(switchMap(() => {
|
26
|
-
if (!this.isStatefulConfiguration) {
|
27
|
-
return of(undefined);
|
28
|
-
}
|
29
|
-
const { actions, selectors } = this.runtimeService.runtimeContext?.uiDefinitionContainer ?? {};
|
30
|
-
return this.statefulConfigurationApiService.init({
|
31
|
-
item: this.configurationService.generateRequest(),
|
32
|
-
actions: actions?.map(action => ({ name: action.apiName, script: action.script })),
|
33
|
-
selectors: selectors?.map(selector => ({ name: selector.apiName, script: selector.script })),
|
34
|
-
});
|
35
|
-
}), tap(stateId => (this.stateId = stateId || null)), map(() => undefined));
|
36
|
-
}
|
37
|
-
cleanup() {
|
38
|
-
this.stateId = null;
|
39
|
-
this.configurationService.reset();
|
40
|
-
this.stateSubj$.next({});
|
41
|
-
}
|
42
|
-
execute$(req) {
|
43
|
-
if (this.isStatefulConfiguration) {
|
44
|
-
return this.executeStateful$(req);
|
45
|
-
}
|
46
|
-
else {
|
47
|
-
return this.executeStateless$(req);
|
48
|
-
}
|
49
|
-
}
|
50
|
-
dispatch$(actionName, inputData) {
|
51
|
-
return this.execute$({ actions: [{ name: actionName, inputData }] });
|
52
|
-
}
|
53
|
-
select$(selectorName, inputData) {
|
54
|
-
const requestId = UUID.UUID();
|
55
|
-
return this.execute$({
|
56
|
-
selectors: {
|
57
|
-
[requestId]: {
|
58
|
-
name: selectorName,
|
59
|
-
inputData,
|
60
|
-
},
|
61
|
-
},
|
62
|
-
}).pipe(map(() => this.stateSubj$.value[requestId]), tap(() => this.stateSubj$.next(omit(this.stateSubj$.value, requestId))));
|
63
|
-
}
|
64
|
-
get isStatefulConfiguration() {
|
65
|
-
return this.runtimeService.uiDefinitionProperties.statefulConfigurationEnabled ?? false;
|
66
|
-
}
|
67
|
-
executeStateless$(request) {
|
68
|
-
return of(undefined).pipe(switchMap(() => {
|
69
|
-
// Apply actions and execute configuration/price call
|
70
|
-
// No need to run configuration if no actions in the request
|
71
|
-
if (!request.actions?.length) {
|
72
|
-
return of(undefined);
|
73
|
-
}
|
74
|
-
let configurationRequest = this.configurationService.generateRequest();
|
75
|
-
request.actions.forEach(action => {
|
76
|
-
configurationRequest = this.executeActionScript(configurationRequest, action) ?? configurationRequest;
|
77
|
-
});
|
78
|
-
return this.configurationService.configureRequest$(configurationRequest);
|
79
|
-
}), tap(() => {
|
80
|
-
if (!request.selectors) {
|
81
|
-
return;
|
82
|
-
}
|
83
|
-
// Run selectors and apply them to the state
|
84
|
-
const finalConfigurationRequest = this.configurationService.generateRequest();
|
85
|
-
const selectorsResult = EntityUtil.entries(request.selectors).reduce((trunk, [key, selector]) => {
|
86
|
-
trunk[key] = this.executeSelectorScript(finalConfigurationRequest, selector);
|
87
|
-
return trunk;
|
88
|
-
}, {});
|
89
|
-
this.stateSubj$.next({
|
90
|
-
...this.stateSubj$.value,
|
91
|
-
...selectorsResult,
|
92
|
-
});
|
93
|
-
}), map(() => undefined));
|
94
|
-
}
|
95
|
-
executeStateful$(request) {
|
96
|
-
if (!this.stateId) {
|
97
|
-
return of(undefined);
|
98
|
-
}
|
99
|
-
return this.statefulConfigurationApiService.execute(this.stateId, request).pipe(tap(response => {
|
100
|
-
this.stateId = response.stateId;
|
101
|
-
const updatedState = this.stateSubj$.value;
|
102
|
-
EntityUtil.entries(response.selectors).forEach(([key, value]) => {
|
103
|
-
if (!value.success) {
|
104
|
-
if (!this.runtimeService.uiDefinitionProperties.suppressToastMessages) {
|
105
|
-
this.toastService.add({ summary: value.errorMessage, severity: ToastType.error });
|
106
|
-
}
|
107
|
-
return;
|
108
|
-
}
|
109
|
-
updatedState[key] = value.result;
|
110
|
-
});
|
111
|
-
this.stateSubj$.next(updatedState);
|
112
|
-
}), map(() => undefined));
|
113
|
-
}
|
114
|
-
executeActionScript(request, processor) {
|
115
|
-
const { actions } = this.runtimeService.runtimeContext?.uiDefinitionContainer ?? {};
|
116
|
-
const script = actions?.find(action => action.apiName === processor.name)?.script;
|
117
|
-
if (!script) {
|
118
|
-
return null;
|
119
|
-
}
|
120
|
-
return this.executeProcessorScript(request, script, processor.inputData);
|
121
|
-
}
|
122
|
-
executeSelectorScript(request, processor) {
|
123
|
-
const { selectors } = this.runtimeService.runtimeContext?.uiDefinitionContainer ?? {};
|
124
|
-
const script = selectors?.find(selector => selector.apiName === processor.name)?.script;
|
125
|
-
if (!script) {
|
126
|
-
return null;
|
127
|
-
}
|
128
|
-
return this.executeProcessorScript(request, script, processor.inputData);
|
129
|
-
}
|
130
|
-
executeProcessorScript(request, script, inputData) {
|
131
|
-
return new Function(`${script}\nreturn transform;`)()({
|
132
|
-
request,
|
133
|
-
inputData: inputData,
|
134
|
-
});
|
135
|
-
}
|
136
|
-
}
|
137
|
-
ConfigurationState.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationState, deps: [{ token: i1.StatefulConfigurationApiService }, { token: i2.ConfigurationRuntimeService }, { token: i3.ConfigurationService }, { token: i4.ToastService }], target: i0.ɵɵFactoryTarget.Injectable });
|
138
|
-
ConfigurationState.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationState });
|
139
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationState, decorators: [{
|
140
|
-
type: Injectable
|
141
|
-
}], ctorParameters: function () { return [{ type: i1.StatefulConfigurationApiService }, { type: i2.ConfigurationRuntimeService }, { type: i3.ConfigurationService }, { type: i4.ToastService }]; } });
|
142
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc2RrL2NvcmUvbW9kdWxlcy9jb25maWd1cmF0aW9uL3NlcnZpY2VzL2NvbmZpZ3VyYXRpb24uc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pFLE9BQU8sRUFLTCxVQUFVLEVBQ1YsSUFBSSxHQUNMLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM5QixPQUFPLEVBQUUsZUFBZSxFQUFjLEdBQUcsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7O0FBRy9ELE1BQU0sT0FBTyxrQkFBa0I7SUFPN0IsWUFDVSwrQkFBZ0UsRUFDaEUsY0FBMkMsRUFDM0Msb0JBQTBDLEVBQzFDLFlBQTBCO1FBSDFCLG9DQUErQixHQUEvQiwrQkFBK0IsQ0FBaUM7UUFDaEUsbUJBQWMsR0FBZCxjQUFjLENBQTZCO1FBQzNDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFWbkIsZUFBVSxHQUFHLElBQUksZUFBZSxDQUEwQixFQUFFLENBQUMsQ0FBQztRQUV4RSxXQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUV2QyxZ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QzNFLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxPQUE2QixFQUFFLE1BQWMsRUFBRSxTQUFrQjtRQUM5RixPQUFPLElBQUksUUFBUSxDQUFDLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQyxFQUFFLENBQUM7WUFDcEQsT0FBTztZQUNQLFNBQVMsRUFBRSxTQUFTO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUM7OytHQXhLVSxrQkFBa0I7bUhBQWxCLGtCQUFrQjsyRkFBbEIsa0JBQWtCO2tCQUQ5QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3RhdGVmdWxDb25maWd1cmF0aW9uQXBpU2VydmljZSB9IGZyb20gJ0B2ZWxvY2VhcHBzL2FwaSc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UsIFRvYXN0VHlwZSB9IGZyb20gJ0B2ZWxvY2VhcHBzL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtcbiAgQ29uZmlndXJhdGlvbkV4ZWN1dGVSZXF1ZXN0LFxuICBDb25maWd1cmF0aW9uUmVxdWVzdCxcbiAgQ29uZmlndXJhdGlvblJlcXVlc3RBY3Rpb24sXG4gIENvbmZpZ3VyYXRpb25SZXF1ZXN0U2VsZWN0b3IsXG4gIEVudGl0eVV0aWwsXG4gIFVVSUQsXG59IGZyb20gJ0B2ZWxvY2VhcHBzL2NvcmUnO1xuaW1wb3J0IHsgb21pdCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIG1hcCwgb2YsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uUnVudGltZVNlcnZpY2UgfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24tcnVudGltZS5zZXJ2aWNlJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvblN0YXRlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZVN1YmokID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oe30pO1xuXG4gIHB1YmxpYyBzdGF0ZSQgPSB0aGlzLnN0YXRlU3ViaiQuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSBzdGF0ZUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHN0YXRlZnVsQ29uZmlndXJhdGlvbkFwaVNlcnZpY2U6IFN0YXRlZnVsQ29uZmlndXJhdGlvbkFwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBydW50aW1lU2VydmljZTogQ29uZmlndXJhdGlvblJ1bnRpbWVTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlndXJhdGlvblNlcnZpY2U6IENvbmZpZ3VyYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXG4gICkge31cblxuICBwdWJsaWMgaW5pdCQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UuY29uZmlndXJlKCkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5pc1N0YXRlZnVsQ29uZmlndXJhdGlvbikge1xuICAgICAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBhY3Rpb25zLCBzZWxlY3RvcnMgfSA9IHRoaXMucnVudGltZVNlcnZpY2UucnVudGltZUNvbnRleHQ/LnVpRGVmaW5pdGlvbkNvbnRhaW5lciA/PyB7fTtcblxuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZWZ1bENvbmZpZ3VyYXRpb25BcGlTZXJ2aWNlLmluaXQoe1xuICAgICAgICAgIGl0ZW06IHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UuZ2VuZXJhdGVSZXF1ZXN0KCksXG4gICAgICAgICAgYWN0aW9uczogYWN0aW9ucz8ubWFwKGFjdGlvbiA9PiAoeyBuYW1lOiBhY3Rpb24uYXBpTmFtZSwgc2NyaXB0OiBhY3Rpb24uc2NyaXB0IH0pKSxcbiAgICAgICAgICBzZWxlY3RvcnM6IHNlbGVjdG9ycz8ubWFwKHNlbGVjdG9yID0+ICh7IG5hbWU6IHNlbGVjdG9yLmFwaU5hbWUsIHNjcmlwdDogc2VsZWN0b3Iuc2NyaXB0IH0pKSxcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIHRhcChzdGF0ZUlkID0+ICh0aGlzLnN0YXRlSWQgPSBzdGF0ZUlkIHx8IG51bGwpKSxcbiAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY2xlYW51cCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlSWQgPSBudWxsO1xuICAgIHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UucmVzZXQoKTtcbiAgICB0aGlzLnN0YXRlU3ViaiQubmV4dCh7fSk7XG4gIH1cblxuICBwdWJsaWMgZXhlY3V0ZSQocmVxOiBDb25maWd1cmF0aW9uRXhlY3V0ZVJlcXVlc3QpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc1N0YXRlZnVsQ29uZmlndXJhdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN0YXRlZnVsJChyZXEpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlU3RhdGVsZXNzJChyZXEpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkaXNwYXRjaCQoYWN0aW9uTmFtZTogc3RyaW5nLCBpbnB1dERhdGE6IHVua25vd24pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlJCh7IGFjdGlvbnM6IFt7IG5hbWU6IGFjdGlvbk5hbWUsIGlucHV0RGF0YSB9XSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3QkKHNlbGVjdG9yTmFtZTogc3RyaW5nLCBpbnB1dERhdGE6IHVua25vd24pOiBPYnNlcnZhYmxlPHVua25vd24+IHtcbiAgICBjb25zdCByZXF1ZXN0SWQgPSBVVUlELlVVSUQoKTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUkKHtcbiAgICAgIHNlbGVjdG9yczoge1xuICAgICAgICBbcmVxdWVzdElkXToge1xuICAgICAgICAgIG5hbWU6IHNlbGVjdG9yTmFtZSxcbiAgICAgICAgICBpbnB1dERhdGEsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pLnBpcGUoXG4gICAgICBtYXAoKCkgPT4gdGhpcy5zdGF0ZVN1YmokLnZhbHVlW3JlcXVlc3RJZF0pLFxuICAgICAgdGFwKCgpID0+IHRoaXMuc3RhdGVTdWJqJC5uZXh0KG9taXQodGhpcy5zdGF0ZVN1YmokLnZhbHVlLCByZXF1ZXN0SWQpKSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGlzU3RhdGVmdWxDb25maWd1cmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJ1bnRpbWVTZXJ2aWNlLnVpRGVmaW5pdGlvblByb3BlcnRpZXMuc3RhdGVmdWxDb25maWd1cmF0aW9uRW5hYmxlZCA/PyBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZVN0YXRlbGVzcyQocmVxdWVzdDogQ29uZmlndXJhdGlvbkV4ZWN1dGVSZXF1ZXN0KTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIG9mKHVuZGVmaW5lZCkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgIC8vIEFwcGx5IGFjdGlvbnMgYW5kIGV4ZWN1dGUgY29uZmlndXJhdGlvbi9wcmljZSBjYWxsXG4gICAgICAgIC8vIE5vIG5lZWQgdG8gcnVuIGNvbmZpZ3VyYXRpb24gaWYgbm8gYWN0aW9ucyBpbiB0aGUgcmVxdWVzdFxuICAgICAgICBpZiAoIXJlcXVlc3QuYWN0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29uZmlndXJhdGlvblJlcXVlc3QgPSB0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdlbmVyYXRlUmVxdWVzdCgpO1xuICAgICAgICByZXF1ZXN0LmFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgICAgIGNvbmZpZ3VyYXRpb25SZXF1ZXN0ID0gdGhpcy5leGVjdXRlQWN0aW9uU2NyaXB0KGNvbmZpZ3VyYXRpb25SZXF1ZXN0LCBhY3Rpb24pID8/IGNvbmZpZ3VyYXRpb25SZXF1ZXN0O1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5jb25maWd1cmVSZXF1ZXN0JChjb25maWd1cmF0aW9uUmVxdWVzdCk7XG4gICAgICB9KSxcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIGlmICghcmVxdWVzdC5zZWxlY3RvcnMpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSdW4gc2VsZWN0b3JzIGFuZCBhcHBseSB0aGVtIHRvIHRoZSBzdGF0ZVxuICAgICAgICBjb25zdCBmaW5hbENvbmZpZ3VyYXRpb25SZXF1ZXN0ID0gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5nZW5lcmF0ZVJlcXVlc3QoKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3JzUmVzdWx0ID0gRW50aXR5VXRpbC5lbnRyaWVzKHJlcXVlc3Quc2VsZWN0b3JzKS5yZWR1Y2UoXG4gICAgICAgICAgKHRydW5rOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgW2tleSwgc2VsZWN0b3JdKSA9PiB7XG4gICAgICAgICAgICB0cnVua1trZXldID0gdGhpcy5leGVjdXRlU2VsZWN0b3JTY3JpcHQoZmluYWxDb25maWd1cmF0aW9uUmVxdWVzdCwgc2VsZWN0b3IpO1xuICAgICAgICAgICAgcmV0dXJuIHRydW5rO1xuICAgICAgICAgIH0sXG4gICAgICAgICAge30sXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZVN1YmokLm5leHQoe1xuICAgICAgICAgIC4uLnRoaXMuc3RhdGVTdWJqJC52YWx1ZSxcbiAgICAgICAgICAuLi5zZWxlY3RvcnNSZXN1bHQsXG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBtYXAoKCkgPT4gdW5kZWZpbmVkKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBleGVjdXRlU3RhdGVmdWwkKHJlcXVlc3Q6IENvbmZpZ3VyYXRpb25FeGVjdXRlUmVxdWVzdCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGlmICghdGhpcy5zdGF0ZUlkKSB7XG4gICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdGF0ZWZ1bENvbmZpZ3VyYXRpb25BcGlTZXJ2aWNlLmV4ZWN1dGUodGhpcy5zdGF0ZUlkLCByZXF1ZXN0KS5waXBlKFxuICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZUlkID0gcmVzcG9uc2Uuc3RhdGVJZDtcbiAgICAgICAgY29uc3QgdXBkYXRlZFN0YXRlID0gdGhpcy5zdGF0ZVN1YmokLnZhbHVlO1xuXG4gICAgICAgIEVudGl0eVV0aWwuZW50cmllcyhyZXNwb25zZS5zZWxlY3RvcnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIGlmICghdmFsdWUuc3VjY2Vzcykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnJ1bnRpbWVTZXJ2aWNlLnVpRGVmaW5pdGlvblByb3BlcnRpZXMuc3VwcHJlc3NUb2FzdE1lc3NhZ2VzKSB7XG4gICAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmFkZCh7IHN1bW1hcnk6IHZhbHVlLmVycm9yTWVzc2FnZSwgc2V2ZXJpdHk6IFRvYXN0VHlwZS5lcnJvciB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZWRTdGF0ZVtrZXldID0gdmFsdWUucmVzdWx0O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnN0YXRlU3ViaiQubmV4dCh1cGRhdGVkU3RhdGUpO1xuICAgICAgfSksXG4gICAgICBtYXAoKCkgPT4gdW5kZWZpbmVkKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBleGVjdXRlQWN0aW9uU2NyaXB0KFxuICAgIHJlcXVlc3Q6IENvbmZpZ3VyYXRpb25SZXF1ZXN0LFxuICAgIHByb2Nlc3NvcjogQ29uZmlndXJhdGlvblJlcXVlc3RBY3Rpb24sXG4gICk6IENvbmZpZ3VyYXRpb25SZXF1ZXN0IHwgbnVsbCB7XG4gICAgY29uc3QgeyBhY3Rpb25zIH0gPSB0aGlzLnJ1bnRpbWVTZXJ2aWNlLnJ1bnRpbWVDb250ZXh0Py51aURlZmluaXRpb25Db250YWluZXIgPz8ge307XG4gICAgY29uc3Qgc2NyaXB0ID0gYWN0aW9ucz8uZmluZChhY3Rpb24gPT4gYWN0aW9uLmFwaU5hbWUgPT09IHByb2Nlc3Nvci5uYW1lKT8uc2NyaXB0O1xuICAgIGlmICghc2NyaXB0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUHJvY2Vzc29yU2NyaXB0KHJlcXVlc3QsIHNjcmlwdCwgcHJvY2Vzc29yLmlucHV0RGF0YSkgYXMgQ29uZmlndXJhdGlvblJlcXVlc3Q7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVTZWxlY3RvclNjcmlwdChyZXF1ZXN0OiBDb25maWd1cmF0aW9uUmVxdWVzdCwgcHJvY2Vzc29yOiBDb25maWd1cmF0aW9uUmVxdWVzdFNlbGVjdG9yKTogdW5rbm93biB7XG4gICAgY29uc3QgeyBzZWxlY3RvcnMgfSA9IHRoaXMucnVudGltZVNlcnZpY2UucnVudGltZUNvbnRleHQ/LnVpRGVmaW5pdGlvbkNvbnRhaW5lciA/PyB7fTtcbiAgICBjb25zdCBzY3JpcHQgPSBzZWxlY3RvcnM/LmZpbmQoc2VsZWN0b3IgPT4gc2VsZWN0b3IuYXBpTmFtZSA9PT0gcHJvY2Vzc29yLm5hbWUpPy5zY3JpcHQ7XG4gICAgaWYgKCFzY3JpcHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVQcm9jZXNzb3JTY3JpcHQocmVxdWVzdCwgc2NyaXB0LCBwcm9jZXNzb3IuaW5wdXREYXRhKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZVByb2Nlc3NvclNjcmlwdChyZXF1ZXN0OiBDb25maWd1cmF0aW9uUmVxdWVzdCwgc2NyaXB0OiBzdHJpbmcsIGlucHV0RGF0YTogdW5rbm93bik6IHVua25vd24ge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb24oYCR7c2NyaXB0fVxcbnJldHVybiB0cmFuc2Zvcm07YCkoKSh7XG4gICAgICByZXF1ZXN0LFxuICAgICAgaW5wdXREYXRhOiBpbnB1dERhdGEsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|