@gravitee/ui-policy-studio-angular 9.6.0 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{esm2020 → esm2022}/lib/components/filter-pipe/gio-flter-connectors-by-mode.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components/flow-details/gio-ps-flow-details.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/components/flow-details-info-bar/gio-ps-flow-details-info-bar.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/components/flow-details-phase/gio-ps-flow-details-phase.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/components/flow-details-phase-step/gio-ps-flow-details-phase-step.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components/flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components/flows-menu/gio-ps-flows-menu.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/components/policies-catalog-dialog/gio-ps-policies-catalog-dialog.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/components/step-edit-dialog/gio-ps-step-edit-dialog.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/components/step-form/gio-ps-step-form.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/gio-policy-studio.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/gio-policy-studio.module.mjs +53 -53
- package/{esm2020 → esm2022}/lib/gio-policy-studio.service.mjs +4 -4
- package/esm2022/testing/lib/components/flow-details/gio-ps-flow-details.harness.mjs +41 -0
- package/esm2022/testing/lib/components/flow-details-info-bar/gio-ps-flow-details-info-bar.harness.mjs +35 -0
- package/esm2022/testing/lib/components/flow-details-phase/gio-ps-flow-details-phase.harness.mjs +126 -0
- package/esm2022/testing/lib/components/flow-details-phase-step/gio-ps-flow-details-phase-step.harness.mjs +50 -0
- package/esm2022/testing/lib/components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.harness.mjs +60 -0
- package/esm2022/testing/lib/components/flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.harness.mjs +128 -0
- package/esm2022/testing/lib/components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.harness.mjs +98 -0
- package/esm2022/testing/lib/components/flows-menu/gio-ps-flows-menu.harness.mjs +71 -0
- package/esm2022/testing/lib/components/policies-catalog-dialog/gio-ps-policies-catalog-dialog.harness.mjs +87 -0
- package/{esm2020 → esm2022}/testing/lib/components/step-edit-dialog/gio-ps-step-edit-dialog.harness.mjs +2 -2
- package/esm2022/testing/lib/components/step-form/gio-ps-step-form.harness.mjs +49 -0
- package/esm2022/testing/lib/gio-policy-studio.harness.mjs +161 -0
- package/{fesm2020 → fesm2022}/gravitee-ui-policy-studio-angular-testing.mjs +12 -12
- package/{fesm2020 → fesm2022}/gravitee-ui-policy-studio-angular-testing.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/gravitee-ui-policy-studio-angular.mjs +103 -103
- package/{fesm2020 → fesm2022}/gravitee-ui-policy-studio-angular.mjs.map +1 -1
- package/lib/components/flow-details/gio-ps-flow-details.component.d.ts +1 -1
- package/lib/components/flow-details-info-bar/gio-ps-flow-details-info-bar.component.d.ts +1 -1
- package/lib/components/flow-details-phase/gio-ps-flow-details-phase.component.d.ts +1 -1
- package/lib/components/flow-details-phase-step/gio-ps-flow-details-phase-step.component.d.ts +1 -1
- package/lib/components/flows-menu/gio-ps-flows-menu.component.d.ts +1 -1
- package/lib/components/step-form/gio-ps-step-form.component.d.ts +1 -1
- package/lib/gio-policy-studio.component.d.ts +1 -1
- package/package.json +14 -22
- package/esm2020/testing/lib/components/flow-details/gio-ps-flow-details.harness.mjs +0 -41
- package/esm2020/testing/lib/components/flow-details-info-bar/gio-ps-flow-details-info-bar.harness.mjs +0 -35
- package/esm2020/testing/lib/components/flow-details-phase/gio-ps-flow-details-phase.harness.mjs +0 -126
- package/esm2020/testing/lib/components/flow-details-phase-step/gio-ps-flow-details-phase-step.harness.mjs +0 -50
- package/esm2020/testing/lib/components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.harness.mjs +0 -60
- package/esm2020/testing/lib/components/flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.harness.mjs +0 -128
- package/esm2020/testing/lib/components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.harness.mjs +0 -98
- package/esm2020/testing/lib/components/flows-menu/gio-ps-flows-menu.harness.mjs +0 -71
- package/esm2020/testing/lib/components/policies-catalog-dialog/gio-ps-policies-catalog-dialog.harness.mjs +0 -87
- package/esm2020/testing/lib/components/step-form/gio-ps-step-form.harness.mjs +0 -49
- package/esm2020/testing/lib/gio-policy-studio.harness.mjs +0 -161
- package/fesm2015/gravitee-ui-policy-studio-angular-testing.mjs +0 -1443
- package/fesm2015/gravitee-ui-policy-studio-angular-testing.mjs.map +0 -1
- package/fesm2015/gravitee-ui-policy-studio-angular.mjs +0 -1645
- package/fesm2015/gravitee-ui-policy-studio-angular.mjs.map +0 -1
- /package/{esm2020 → esm2022}/gravitee-ui-policy-studio-angular.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/flow-form-dialog/gio-ps-flow-form-dialog-result.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/gio-policy-studio.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/ConnectorsInfo.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/PolicySchemaFetcher.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/SaveOutput.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/flow/ApiType.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/flow/Flow.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/flow/FlowExecution.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/flow/HttpMethod.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/flow/Selector.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/flow/Step.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/flow/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/plan/Plan.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/plan/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/policy/Policy.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/policy/index.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/gravitee-ui-policy-studio-angular-testing.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/ConnectorsInfo.fixture.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/ConnectorsInfo.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/PolicySchemaFetcher.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/SaveOutput.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/flow/ApiType.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/flow/Flow.fixture.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/flow/Flow.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/flow/FlowExecution.fixture.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/flow/FlowExecution.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/flow/HttpMethod.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/flow/Selector.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/flow/Step.fixture.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/flow/Step.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/flow/index-testing.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/flow/index.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/index-testing.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/index.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/plan/Plan.fixture.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/plan/Plan.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/plan/index-testing.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/plan/index.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/policy/Policy.fixture.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/policy/Policy.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/policy/index-testing.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lib/models/policy/index.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/public-testing-api.mjs +0 -0
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (C) 2022 The Gravitee team (http://gravitee.io)
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
import { ComponentHarness } from '@angular/cdk/testing';
|
|
17
|
-
import { MatButtonHarness } from '@angular/material/button/testing';
|
|
18
|
-
import { MatTabGroupHarness } from '@angular/material/tabs/testing';
|
|
19
|
-
import { GioPolicyStudioFlowsMenuHarness } from './components/flows-menu/gio-ps-flows-menu.harness';
|
|
20
|
-
import { GioPolicyStudioDetailsHarness } from './components/flow-details/gio-ps-flow-details.harness';
|
|
21
|
-
import { GioPolicyStudioFlowProxyFormDialogHarness } from './components/flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.harness';
|
|
22
|
-
import { GioPolicyStudioFlowMessageFormDialogHarness } from './components/flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.harness';
|
|
23
|
-
import { GioPolicyStudioFlowExecutionFormDialogHarness } from './components/flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.harness';
|
|
24
|
-
import { GioPolicyStudioDetailsPhaseHarness } from './components/flow-details-phase/gio-ps-flow-details-phase.harness';
|
|
25
|
-
export class GioPolicyStudioHarness extends ComponentHarness {
|
|
26
|
-
constructor() {
|
|
27
|
-
super(...arguments);
|
|
28
|
-
this.menuHarness = this.locatorFor(GioPolicyStudioFlowsMenuHarness);
|
|
29
|
-
this.detailsHarness = this.locatorFor(GioPolicyStudioDetailsHarness);
|
|
30
|
-
this.phaseHarness = (phaseType) => this.locatorFor(GioPolicyStudioDetailsPhaseHarness.with({ type: phaseType }))();
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Add a flow to a plan or to "Common flows"
|
|
34
|
-
*
|
|
35
|
-
* @param groupName Plan name where to add the flow. You also can define "Common flows" to add a flow to this group.
|
|
36
|
-
* @param flow Flow to add
|
|
37
|
-
*/
|
|
38
|
-
async addFlow(groupName, flow) {
|
|
39
|
-
await (await this.menuHarness()).addFlow(new RegExp(groupName, 'i'));
|
|
40
|
-
await this.setFlowFormDialog(flow);
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Edit a flow configuration
|
|
44
|
-
*
|
|
45
|
-
* @param flowName Flow name to edit
|
|
46
|
-
* @param flow
|
|
47
|
-
*/
|
|
48
|
-
async editFlowConfig(flowName, flow) {
|
|
49
|
-
(await this.menuHarness()).selectFlow(new RegExp(flowName, 'i'));
|
|
50
|
-
await (await this.detailsHarness()).clickEditFlowBtn();
|
|
51
|
-
await this.setFlowFormDialog(flow);
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Delete a flow
|
|
55
|
-
*
|
|
56
|
-
* @param flowName Flow name to delete
|
|
57
|
-
*/
|
|
58
|
-
async deleteFlow(flowName) {
|
|
59
|
-
(await this.menuHarness()).selectFlow(new RegExp(flowName, 'i'));
|
|
60
|
-
await (await this.detailsHarness()).clickDeleteFlowBtn();
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Select a flow in the menu
|
|
64
|
-
*
|
|
65
|
-
* @param flowName Flow name to select
|
|
66
|
-
*/
|
|
67
|
-
async selectFlowInMenu(flowName) {
|
|
68
|
-
await (await this.menuHarness()).selectFlow(new RegExp(flowName, 'i'));
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Get the list of flows in the menu
|
|
72
|
-
*/
|
|
73
|
-
async getFlowsMenu() {
|
|
74
|
-
return (await this.menuHarness()).getAllFlowsGroups();
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Get selected flow infos
|
|
78
|
-
*/
|
|
79
|
-
async getSelectedFlowInfos() {
|
|
80
|
-
return await (await this.detailsHarness()).getFlowInfos();
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Get selected flow phase harness
|
|
84
|
-
* @param phaseType Phase type to get
|
|
85
|
-
*/
|
|
86
|
-
async getSelectedFlowPhase(phaseType) {
|
|
87
|
-
if (phaseType === 'PUBLISH' || phaseType === 'SUBSCRIBE') {
|
|
88
|
-
const matTabsHarness = await this.locatorFor(MatTabGroupHarness.with({ selector: '.content__tabs' }))();
|
|
89
|
-
await matTabsHarness.selectTab({ label: 'Event messages' });
|
|
90
|
-
}
|
|
91
|
-
const steps = await this.phaseHarness(phaseType);
|
|
92
|
-
return steps ? steps : undefined;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Get Save button state
|
|
96
|
-
*/
|
|
97
|
-
async getSaveButtonState() {
|
|
98
|
-
const saveButton = await this.locatorFor(MatButtonHarness.with({ ancestor: '.header__btn' }))();
|
|
99
|
-
const disabled = await saveButton.isDisabled();
|
|
100
|
-
const text = await saveButton.getText();
|
|
101
|
-
if (text === 'Saving...') {
|
|
102
|
-
return 'SAVING';
|
|
103
|
-
}
|
|
104
|
-
if (disabled) {
|
|
105
|
-
return 'DISABLED';
|
|
106
|
-
}
|
|
107
|
-
return 'VISIBLE';
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Click on the "Save" button
|
|
111
|
-
*/
|
|
112
|
-
async save() {
|
|
113
|
-
await (await this.locatorFor(MatButtonHarness.with({ text: /Save/ }))()).click();
|
|
114
|
-
}
|
|
115
|
-
async setFlowFormDialog(flow) {
|
|
116
|
-
const channelSelector = flow.selectors?.find(s => s.type === 'CHANNEL');
|
|
117
|
-
const httpSelector = flow.selectors?.find(s => s.type === 'HTTP');
|
|
118
|
-
const conditionSelector = flow.selectors?.find(s => s.type === 'CONDITION');
|
|
119
|
-
if (!!channelSelector && !!httpSelector) {
|
|
120
|
-
throw new Error('Channel and HTTP selectors are not be used together.');
|
|
121
|
-
}
|
|
122
|
-
if (channelSelector) {
|
|
123
|
-
const flowFormNewDialog = await this.documentRootLocatorFactory().locatorFor(GioPolicyStudioFlowMessageFormDialogHarness)();
|
|
124
|
-
const toChannelOperator = {
|
|
125
|
-
STARTS_WITH: 'Starts with',
|
|
126
|
-
EQUALS: 'Equals',
|
|
127
|
-
};
|
|
128
|
-
await flowFormNewDialog.setFlowFormValues({
|
|
129
|
-
name: flow.name,
|
|
130
|
-
channel: channelSelector?.channel,
|
|
131
|
-
channelOperator: toChannelOperator[channelSelector.channelOperator],
|
|
132
|
-
entrypoints: channelSelector?.entrypoints,
|
|
133
|
-
operations: channelSelector?.operations,
|
|
134
|
-
condition: conditionSelector?.condition,
|
|
135
|
-
});
|
|
136
|
-
await flowFormNewDialog.save();
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
if (httpSelector) {
|
|
140
|
-
const flowFormNewDialog = await this.documentRootLocatorFactory().locatorFor(GioPolicyStudioFlowProxyFormDialogHarness)();
|
|
141
|
-
await flowFormNewDialog.setFlowFormValues({
|
|
142
|
-
name: flow.name,
|
|
143
|
-
path: httpSelector?.path,
|
|
144
|
-
pathOperator: httpSelector?.pathOperator,
|
|
145
|
-
methods: httpSelector?.methods,
|
|
146
|
-
condition: conditionSelector?.condition,
|
|
147
|
-
});
|
|
148
|
-
await flowFormNewDialog.save();
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
throw new Error('No selector found for this flow. Needed to select Message or Proxy flow form dialog.');
|
|
152
|
-
}
|
|
153
|
-
async setFlowExecutionConfig(flowExecution) {
|
|
154
|
-
await (await this.menuHarness()).openFlowExecutionConfig();
|
|
155
|
-
const flowExecutionDialog = await this.documentRootLocatorFactory().locatorFor(GioPolicyStudioFlowExecutionFormDialogHarness)();
|
|
156
|
-
await flowExecutionDialog.setFlowFormValues(flowExecution);
|
|
157
|
-
await flowExecutionDialog.save();
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
GioPolicyStudioHarness.hostSelector = 'gio-policy-studio';
|
|
161
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2lvLXBvbGljeS1zdHVkaW8uaGFybmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLXBvbGljeS1zdHVkaW8tYW5ndWxhci9zcmMvbGliL2dpby1wb2xpY3ktc3R1ZGlvLmhhcm5lc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUdwRSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUNwRyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUN0RyxPQUFPLEVBQUUseUNBQXlDLEVBQUUsTUFBTSw0RkFBNEYsQ0FBQztBQUN2SixPQUFPLEVBQUUsMkNBQTJDLEVBQUUsTUFBTSxnR0FBZ0csQ0FBQztBQUM3SixPQUFPLEVBQUUsNkNBQTZDLEVBQUUsTUFBTSxtRkFBbUYsQ0FBQztBQUNsSixPQUFPLEVBQUUsa0NBQWtDLEVBQWEsTUFBTSxtRUFBbUUsQ0FBQztBQUVsSSxNQUFNLE9BQU8sc0JBQXVCLFNBQVEsZ0JBQWdCO0lBQTVEOztRQUdVLGdCQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBRS9ELG1CQUFjLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBRWhFLGlCQUFZLEdBQUcsQ0FBQyxTQUFvQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGtDQUFrQyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQXFL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TSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxVQUFVLENBQUMsNkNBQTZDLENBQUMsRUFBRSxDQUFDO1FBQ2hJLE1BQU0sbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDM0QsTUFBTSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNuQyxDQUFDOztBQTFLYSxtQ0FBWSxHQUFHLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgR3Jhdml0ZWUgdGVhbSAoaHR0cDovL2dyYXZpdGVlLmlvKVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50SGFybmVzcyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay90ZXN0aW5nJztcbmltcG9ydCB7IE1hdEJ1dHRvbkhhcm5lc3MgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24vdGVzdGluZyc7XG5pbXBvcnQgeyBNYXRUYWJHcm91cEhhcm5lc3MgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzL3Rlc3RpbmcnO1xuXG5pbXBvcnQgeyBDaGFubmVsU2VsZWN0b3IsIENvbmRpdGlvblNlbGVjdG9yLCBGbG93LCBGbG93RXhlY3V0aW9uLCBIdHRwU2VsZWN0b3IgfSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQgeyBHaW9Qb2xpY3lTdHVkaW9GbG93c01lbnVIYXJuZXNzIH0gZnJvbSAnLi9jb21wb25lbnRzL2Zsb3dzLW1lbnUvZ2lvLXBzLWZsb3dzLW1lbnUuaGFybmVzcyc7XG5pbXBvcnQgeyBHaW9Qb2xpY3lTdHVkaW9EZXRhaWxzSGFybmVzcyB9IGZyb20gJy4vY29tcG9uZW50cy9mbG93LWRldGFpbHMvZ2lvLXBzLWZsb3ctZGV0YWlscy5oYXJuZXNzJztcbmltcG9ydCB7IEdpb1BvbGljeVN0dWRpb0Zsb3dQcm94eUZvcm1EaWFsb2dIYXJuZXNzIH0gZnJvbSAnLi9jb21wb25lbnRzL2Zsb3ctZm9ybS1kaWFsb2cvZmxvdy1wcm94eS1mb3JtLWRpYWxvZy9naW8tcHMtZmxvdy1wcm94eS1mb3JtLWRpYWxvZy5oYXJuZXNzJztcbmltcG9ydCB7IEdpb1BvbGljeVN0dWRpb0Zsb3dNZXNzYWdlRm9ybURpYWxvZ0hhcm5lc3MgfSBmcm9tICcuL2NvbXBvbmVudHMvZmxvdy1mb3JtLWRpYWxvZy9mbG93LW1lc3NhZ2UtZm9ybS1kaWFsb2cvZ2lvLXBzLWZsb3ctbWVzc2FnZS1mb3JtLWRpYWxvZy5oYXJuZXNzJztcbmltcG9ydCB7IEdpb1BvbGljeVN0dWRpb0Zsb3dFeGVjdXRpb25Gb3JtRGlhbG9nSGFybmVzcyB9IGZyb20gJy4vY29tcG9uZW50cy9mbG93LWV4ZWN1dGlvbi1mb3JtLWRpYWxvZy9naW8tcHMtZmxvdy1leGVjdXRpb24tZm9ybS1kaWFsb2cuaGFybmVzcyc7XG5pbXBvcnQgeyBHaW9Qb2xpY3lTdHVkaW9EZXRhaWxzUGhhc2VIYXJuZXNzLCBQaGFzZVR5cGUgfSBmcm9tICcuL2NvbXBvbmVudHMvZmxvdy1kZXRhaWxzLXBoYXNlL2dpby1wcy1mbG93LWRldGFpbHMtcGhhc2UuaGFybmVzcyc7XG5cbmV4cG9ydCBjbGFzcyBHaW9Qb2xpY3lTdHVkaW9IYXJuZXNzIGV4dGVuZHMgQ29tcG9uZW50SGFybmVzcyB7XG4gIHB1YmxpYyBzdGF0aWMgaG9zdFNlbGVjdG9yID0gJ2dpby1wb2xpY3ktc3R1ZGlvJztcblxuICBwcml2YXRlIG1lbnVIYXJuZXNzID0gdGhpcy5sb2NhdG9yRm9yKEdpb1BvbGljeVN0dWRpb0Zsb3dzTWVudUhhcm5lc3MpO1xuXG4gIHByaXZhdGUgZGV0YWlsc0hhcm5lc3MgPSB0aGlzLmxvY2F0b3JGb3IoR2lvUG9saWN5U3R1ZGlvRGV0YWlsc0hhcm5lc3MpO1xuXG4gIHByaXZhdGUgcGhhc2VIYXJuZXNzID0gKHBoYXNlVHlwZTogUGhhc2VUeXBlKSA9PiB0aGlzLmxvY2F0b3JGb3IoR2lvUG9saWN5U3R1ZGlvRGV0YWlsc1BoYXNlSGFybmVzcy53aXRoKHsgdHlwZTogcGhhc2VUeXBlIH0pKSgpO1xuXG4gIC8qKlxuICAgKiBBZGQgYSBmbG93IHRvIGEgcGxhbiBvciB0byBcIkNvbW1vbiBmbG93c1wiXG4gICAqXG4gICAqIEBwYXJhbSBncm91cE5hbWUgUGxhbiBuYW1lIHdoZXJlIHRvIGFkZCB0aGUgZmxvdy4gWW91IGFsc28gY2FuIGRlZmluZSBcIkNvbW1vbiBmbG93c1wiIHRvIGFkZCBhIGZsb3cgdG8gdGhpcyBncm91cC5cbiAgICogQHBhcmFtIGZsb3cgRmxvdyB0byBhZGRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhZGRGbG93KGdyb3VwTmFtZTogc3RyaW5nLCBmbG93OiBGbG93KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgKGF3YWl0IHRoaXMubWVudUhhcm5lc3MoKSkuYWRkRmxvdyhuZXcgUmVnRXhwKGdyb3VwTmFtZSwgJ2knKSk7XG5cbiAgICBhd2FpdCB0aGlzLnNldEZsb3dGb3JtRGlhbG9nKGZsb3cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVkaXQgYSBmbG93IGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQHBhcmFtIGZsb3dOYW1lIEZsb3cgbmFtZSB0byBlZGl0XG4gICAqIEBwYXJhbSBmbG93XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZWRpdEZsb3dDb25maWcoZmxvd05hbWU6IHN0cmluZywgZmxvdzogUGFydGlhbDxGbG93Pik6IFByb21pc2U8dm9pZD4ge1xuICAgIChhd2FpdCB0aGlzLm1lbnVIYXJuZXNzKCkpLnNlbGVjdEZsb3cobmV3IFJlZ0V4cChmbG93TmFtZSwgJ2knKSk7XG4gICAgYXdhaXQgKGF3YWl0IHRoaXMuZGV0YWlsc0hhcm5lc3MoKSkuY2xpY2tFZGl0Rmxvd0J0bigpO1xuXG4gICAgYXdhaXQgdGhpcy5zZXRGbG93Rm9ybURpYWxvZyhmbG93KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBmbG93XG4gICAqXG4gICAqIEBwYXJhbSBmbG93TmFtZSBGbG93IG5hbWUgdG8gZGVsZXRlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVsZXRlRmxvdyhmbG93TmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgKGF3YWl0IHRoaXMubWVudUhhcm5lc3MoKSkuc2VsZWN0RmxvdyhuZXcgUmVnRXhwKGZsb3dOYW1lLCAnaScpKTtcbiAgICBhd2FpdCAoYXdhaXQgdGhpcy5kZXRhaWxzSGFybmVzcygpKS5jbGlja0RlbGV0ZUZsb3dCdG4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgYSBmbG93IGluIHRoZSBtZW51XG4gICAqXG4gICAqIEBwYXJhbSBmbG93TmFtZSBGbG93IG5hbWUgdG8gc2VsZWN0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VsZWN0Rmxvd0luTWVudShmbG93TmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgKGF3YWl0IHRoaXMubWVudUhhcm5lc3MoKSkuc2VsZWN0RmxvdyhuZXcgUmVnRXhwKGZsb3dOYW1lLCAnaScpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxpc3Qgb2YgZmxvd3MgaW4gdGhlIG1lbnVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRGbG93c01lbnUoKTogUHJvbWlzZTxcbiAgICB7XG4gICAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgICAgZmxvd3M6IHtcbiAgICAgICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgaXNTZWxlY3RlZDogYm9vbGVhbjtcbiAgICAgICAgaW5mb3M6IHN0cmluZyB8IG51bGw7XG4gICAgICB9W107XG4gICAgfVtdXG4gID4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5tZW51SGFybmVzcygpKS5nZXRBbGxGbG93c0dyb3VwcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3RlZCBmbG93IGluZm9zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0U2VsZWN0ZWRGbG93SW5mb3MoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCAoc3RyaW5nIHwgbnVsbClbXT4+IHtcbiAgICByZXR1cm4gYXdhaXQgKGF3YWl0IHRoaXMuZGV0YWlsc0hhcm5lc3MoKSkuZ2V0Rmxvd0luZm9zKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlbGVjdGVkIGZsb3cgcGhhc2UgaGFybmVzc1xuICAgKiBAcGFyYW0gcGhhc2VUeXBlIFBoYXNlIHR5cGUgdG8gZ2V0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0U2VsZWN0ZWRGbG93UGhhc2UocGhhc2VUeXBlOiBQaGFzZVR5cGUpOiBQcm9taXNlPEdpb1BvbGljeVN0dWRpb0RldGFpbHNQaGFzZUhhcm5lc3MgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAocGhhc2VUeXBlID09PSAnUFVCTElTSCcgfHwgcGhhc2VUeXBlID09PSAnU1VCU0NSSUJFJykge1xuICAgICAgY29uc3QgbWF0VGFic0hhcm5lc3MgPSBhd2FpdCB0aGlzLmxvY2F0b3JGb3IoTWF0VGFiR3JvdXBIYXJuZXNzLndpdGgoeyBzZWxlY3RvcjogJy5jb250ZW50X190YWJzJyB9KSkoKTtcbiAgICAgIGF3YWl0IG1hdFRhYnNIYXJuZXNzLnNlbGVjdFRhYih7IGxhYmVsOiAnRXZlbnQgbWVzc2FnZXMnIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHN0ZXBzID0gYXdhaXQgdGhpcy5waGFzZUhhcm5lc3MocGhhc2VUeXBlKTtcblxuICAgIHJldHVybiBzdGVwcyA/IHN0ZXBzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBTYXZlIGJ1dHRvbiBzdGF0ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFNhdmVCdXR0b25TdGF0ZSgpOiBQcm9taXNlPCdWSVNJQkxFJyB8ICdESVNBQkxFRCcgfCAnU0FWSU5HJz4ge1xuICAgIGNvbnN0IHNhdmVCdXR0b24gPSBhd2FpdCB0aGlzLmxvY2F0b3JGb3IoTWF0QnV0dG9uSGFybmVzcy53aXRoKHsgYW5jZXN0b3I6ICcuaGVhZGVyX19idG4nIH0pKSgpO1xuICAgIGNvbnN0IGRpc2FibGVkID0gYXdhaXQgc2F2ZUJ1dHRvbi5pc0Rpc2FibGVkKCk7XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IHNhdmVCdXR0b24uZ2V0VGV4dCgpO1xuXG4gICAgaWYgKHRleHQgPT09ICdTYXZpbmcuLi4nKSB7XG4gICAgICByZXR1cm4gJ1NBVklORyc7XG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gJ0RJU0FCTEVEJztcbiAgICB9XG5cbiAgICByZXR1cm4gJ1ZJU0lCTEUnO1xuICB9XG5cbiAgLyoqXG4gICAqIENsaWNrIG9uIHRoZSBcIlNhdmVcIiBidXR0b25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzYXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IChhd2FpdCB0aGlzLmxvY2F0b3JGb3IoTWF0QnV0dG9uSGFybmVzcy53aXRoKHsgdGV4dDogL1NhdmUvIH0pKSgpKS5jbGljaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXRGbG93Rm9ybURpYWxvZyhmbG93OiBQYXJ0aWFsPEZsb3c+KSB7XG4gICAgY29uc3QgY2hhbm5lbFNlbGVjdG9yID0gZmxvdy5zZWxlY3RvcnM/LmZpbmQocyA9PiBzLnR5cGUgPT09ICdDSEFOTkVMJykgYXMgQ2hhbm5lbFNlbGVjdG9yIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGh0dHBTZWxlY3RvciA9IGZsb3cuc2VsZWN0b3JzPy5maW5kKHMgPT4gcy50eXBlID09PSAnSFRUUCcpIGFzIEh0dHBTZWxlY3RvciB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb25kaXRpb25TZWxlY3RvciA9IGZsb3cuc2VsZWN0b3JzPy5maW5kKHMgPT4gcy50eXBlID09PSAnQ09ORElUSU9OJykgYXMgQ29uZGl0aW9uU2VsZWN0b3IgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoISFjaGFubmVsU2VsZWN0b3IgJiYgISFodHRwU2VsZWN0b3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2hhbm5lbCBhbmQgSFRUUCBzZWxlY3RvcnMgYXJlIG5vdCBiZSB1c2VkIHRvZ2V0aGVyLicpO1xuICAgIH1cblxuICAgIGlmIChjaGFubmVsU2VsZWN0b3IpIHtcbiAgICAgIGNvbnN0IGZsb3dGb3JtTmV3RGlhbG9nID0gYXdhaXQgdGhpcy5kb2N1bWVudFJvb3RMb2NhdG9yRmFjdG9yeSgpLmxvY2F0b3JGb3IoR2lvUG9saWN5U3R1ZGlvRmxvd01lc3NhZ2VGb3JtRGlhbG9nSGFybmVzcykoKTtcblxuICAgICAgY29uc3QgdG9DaGFubmVsT3BlcmF0b3IgPSB7XG4gICAgICAgIFNUQVJUU19XSVRIOiAnU3RhcnRzIHdpdGgnLFxuICAgICAgICBFUVVBTFM6ICdFcXVhbHMnLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgZmxvd0Zvcm1OZXdEaWFsb2cuc2V0Rmxvd0Zvcm1WYWx1ZXMoe1xuICAgICAgICBuYW1lOiBmbG93Lm5hbWUsXG4gICAgICAgIGNoYW5uZWw6IGNoYW5uZWxTZWxlY3Rvcj8uY2hhbm5lbCxcbiAgICAgICAgY2hhbm5lbE9wZXJhdG9yOiB0b0NoYW5uZWxPcGVyYXRvcltjaGFubmVsU2VsZWN0b3IuY2hhbm5lbE9wZXJhdG9yXSxcbiAgICAgICAgZW50cnlwb2ludHM6IGNoYW5uZWxTZWxlY3Rvcj8uZW50cnlwb2ludHMsXG4gICAgICAgIG9wZXJhdGlvbnM6IGNoYW5uZWxTZWxlY3Rvcj8ub3BlcmF0aW9ucyxcbiAgICAgICAgY29uZGl0aW9uOiBjb25kaXRpb25TZWxlY3Rvcj8uY29uZGl0aW9uLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IGZsb3dGb3JtTmV3RGlhbG9nLnNhdmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaHR0cFNlbGVjdG9yKSB7XG4gICAgICBjb25zdCBmbG93Rm9ybU5ld0RpYWxvZyA9IGF3YWl0IHRoaXMuZG9jdW1lbnRSb290TG9jYXRvckZhY3RvcnkoKS5sb2NhdG9yRm9yKEdpb1BvbGljeVN0dWRpb0Zsb3dQcm94eUZvcm1EaWFsb2dIYXJuZXNzKSgpO1xuXG4gICAgICBhd2FpdCBmbG93Rm9ybU5ld0RpYWxvZy5zZXRGbG93Rm9ybVZhbHVlcyh7XG4gICAgICAgIG5hbWU6IGZsb3cubmFtZSxcbiAgICAgICAgcGF0aDogaHR0cFNlbGVjdG9yPy5wYXRoLFxuICAgICAgICBwYXRoT3BlcmF0b3I6IGh0dHBTZWxlY3Rvcj8ucGF0aE9wZXJhdG9yLFxuICAgICAgICBtZXRob2RzOiBodHRwU2VsZWN0b3I/Lm1ldGhvZHMsXG4gICAgICAgIGNvbmRpdGlvbjogY29uZGl0aW9uU2VsZWN0b3I/LmNvbmRpdGlvbixcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBmbG93Rm9ybU5ld0RpYWxvZy5zYXZlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBzZWxlY3RvciBmb3VuZCBmb3IgdGhpcyBmbG93LiBOZWVkZWQgdG8gc2VsZWN0IE1lc3NhZ2Ugb3IgUHJveHkgZmxvdyBmb3JtIGRpYWxvZy4nKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzZXRGbG93RXhlY3V0aW9uQ29uZmlnKGZsb3dFeGVjdXRpb246IEZsb3dFeGVjdXRpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCAoYXdhaXQgdGhpcy5tZW51SGFybmVzcygpKS5vcGVuRmxvd0V4ZWN1dGlvbkNvbmZpZygpO1xuXG4gICAgY29uc3QgZmxvd0V4ZWN1dGlvbkRpYWxvZyA9IGF3YWl0IHRoaXMuZG9jdW1lbnRSb290TG9jYXRvckZhY3RvcnkoKS5sb2NhdG9yRm9yKEdpb1BvbGljeVN0dWRpb0Zsb3dFeGVjdXRpb25Gb3JtRGlhbG9nSGFybmVzcykoKTtcbiAgICBhd2FpdCBmbG93RXhlY3V0aW9uRGlhbG9nLnNldEZsb3dGb3JtVmFsdWVzKGZsb3dFeGVjdXRpb24pO1xuICAgIGF3YWl0IGZsb3dFeGVjdXRpb25EaWFsb2cuc2F2ZSgpO1xuICB9XG59XG4iXX0=
|