@openziti/ziti-console-lib 0.4.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/styles/global.scss +8 -1
- package/esm2022/lib/features/card/card.component.mjs +9 -3
- package/esm2022/lib/features/card-list/card-list.component.mjs +16 -13
- package/esm2022/lib/features/data-table/cells/table-cell-name/table-cell-name.component.mjs +33 -0
- package/esm2022/lib/features/projectable-forms/configuration/configuration-form.component.mjs +31 -19
- package/esm2022/lib/features/projectable-forms/edge-router/edge-router-form.component.mjs +69 -34
- package/esm2022/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.mjs +69 -54
- package/esm2022/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.service.mjs +37 -1
- package/esm2022/lib/features/projectable-forms/identity/identity-form.component.mjs +70 -37
- package/esm2022/lib/features/projectable-forms/projectable-form.class.mjs +90 -8
- package/esm2022/lib/features/projectable-forms/service/service-form.component.mjs +46 -30
- package/esm2022/lib/features/projectable-forms/service/service-form.service.mjs +2 -1
- package/esm2022/lib/features/projectable-forms/service/simple-service/simple-service.component.mjs +22 -17
- package/esm2022/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.component.mjs +273 -0
- package/esm2022/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.service.mjs +197 -0
- package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.component.mjs +61 -70
- package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.service.mjs +49 -1
- package/esm2022/lib/models/service-edge-router-policy.mjs +10 -0
- package/esm2022/lib/pages/configurations/configurations-page.component.mjs +9 -15
- package/esm2022/lib/pages/configurations/configurations-page.service.mjs +13 -9
- package/esm2022/lib/pages/edge-router-policies/edge-router-policies-page.component.mjs +10 -12
- package/esm2022/lib/pages/edge-router-policies/edge-router-policies-page.service.mjs +19 -15
- package/esm2022/lib/pages/edge-routers/edge-routers-page.component.mjs +9 -11
- package/esm2022/lib/pages/edge-routers/edge-routers-page.service.mjs +16 -12
- package/esm2022/lib/pages/identities/identities-page.component.mjs +11 -12
- package/esm2022/lib/pages/identities/identities-page.service.mjs +24 -42
- package/esm2022/lib/pages/service-edge-router-policies/service-edge-router-policies-page.component.mjs +129 -0
- package/esm2022/lib/pages/service-edge-router-policies/service-edge-router-policies-page.service.mjs +382 -0
- package/esm2022/lib/pages/service-policies/service-policies-page.component.mjs +10 -12
- package/esm2022/lib/pages/service-policies/service-policies-page.service.mjs +21 -17
- package/esm2022/lib/pages/services/services-page.component.mjs +10 -16
- package/esm2022/lib/pages/services/services-page.service.mjs +23 -13
- package/esm2022/lib/shared/list-page-component.class.mjs +1 -1
- package/esm2022/lib/shared/list-page-service.class.mjs +20 -2
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/lib/ziti-console-lib.module.mjs +12 -3
- package/esm2022/public-api.mjs +7 -1
- package/fesm2022/openziti-ziti-console-lib.mjs +12540 -11306
- package/fesm2022/openziti-ziti-console-lib.mjs.map +1 -1
- package/lib/features/card/card.component.d.ts +3 -1
- package/lib/features/card/card.component.d.ts.map +1 -1
- package/lib/features/card-list/card-list.component.d.ts +5 -2
- package/lib/features/card-list/card-list.component.d.ts.map +1 -1
- package/lib/features/data-table/cells/table-cell-name/table-cell-name.component.d.ts +19 -0
- package/lib/features/data-table/cells/table-cell-name/table-cell-name.component.d.ts.map +1 -0
- package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts +10 -4
- package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/edge-router/edge-router-form.component.d.ts +10 -5
- package/lib/features/projectable-forms/edge-router/edge-router-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.d.ts +10 -12
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.service.d.ts +8 -0
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.service.d.ts.map +1 -1
- package/lib/features/projectable-forms/identity/identity-form.component.d.ts +9 -3
- package/lib/features/projectable-forms/identity/identity-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/projectable-form.class.d.ts +25 -4
- package/lib/features/projectable-forms/projectable-form.class.d.ts.map +1 -1
- package/lib/features/projectable-forms/service/service-form.component.d.ts +10 -5
- package/lib/features/projectable-forms/service/service-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/service/service-form.service.d.ts.map +1 -1
- package/lib/features/projectable-forms/service/simple-service/simple-service.component.d.ts +5 -2
- package/lib/features/projectable-forms/service/simple-service/simple-service.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.component.d.ts +53 -0
- package/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.component.d.ts.map +1 -0
- package/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.service.d.ts +38 -0
- package/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.service.d.ts.map +1 -0
- package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts +9 -15
- package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/service-policy/service-policy-form.service.d.ts +11 -0
- package/lib/features/projectable-forms/service-policy/service-policy-form.service.d.ts.map +1 -1
- package/lib/models/service-edge-router-policy.d.ts +7 -0
- package/lib/models/service-edge-router-policy.d.ts.map +1 -0
- package/lib/pages/configurations/configurations-page.component.d.ts.map +1 -1
- package/lib/pages/configurations/configurations-page.service.d.ts +3 -1
- package/lib/pages/configurations/configurations-page.service.d.ts.map +1 -1
- package/lib/pages/edge-router-policies/edge-router-policies-page.service.d.ts +3 -1
- package/lib/pages/edge-router-policies/edge-router-policies-page.service.d.ts.map +1 -1
- package/lib/pages/edge-routers/edge-routers-page.component.d.ts +1 -1
- package/lib/pages/edge-routers/edge-routers-page.service.d.ts +3 -1
- package/lib/pages/edge-routers/edge-routers-page.service.d.ts.map +1 -1
- package/lib/pages/identities/identities-page.component.d.ts.map +1 -1
- package/lib/pages/identities/identities-page.service.d.ts +4 -2
- package/lib/pages/identities/identities-page.service.d.ts.map +1 -1
- package/lib/pages/service-edge-router-policies/service-edge-router-policies-page.component.d.ts +35 -0
- package/lib/pages/service-edge-router-policies/service-edge-router-policies-page.component.d.ts.map +1 -0
- package/lib/pages/service-edge-router-policies/service-edge-router-policies-page.service.d.ts +59 -0
- package/lib/pages/service-edge-router-policies/service-edge-router-policies-page.service.d.ts.map +1 -0
- package/lib/pages/service-policies/service-policies-page.service.d.ts +3 -1
- package/lib/pages/service-policies/service-policies-page.service.d.ts.map +1 -1
- package/lib/pages/services/services-page.component.d.ts.map +1 -1
- package/lib/pages/services/services-page.service.d.ts +5 -1
- package/lib/pages/services/services-page.service.d.ts.map +1 -1
- package/lib/shared/list-page-component.class.d.ts.map +1 -1
- package/lib/shared/list-page-service.class.d.ts +7 -1
- package/lib/shared/list-page-service.class.d.ts.map +1 -1
- package/lib/ziti-console-lib.module.d.ts +20 -17
- package/lib/ziti-console-lib.module.d.ts.map +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +6 -0
- package/public-api.d.ts.map +1 -1
package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.component.mjs
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Component, EventEmitter, Input, Output, Inject } from '@angular/core';
|
|
2
|
-
import { Subscription } from 'rxjs';
|
|
3
2
|
import { ProjectableForm } from "../projectable-form.class";
|
|
4
3
|
import { SETTINGS_SERVICE } from "../../../services/settings.service";
|
|
5
4
|
import { isEmpty, cloneDeep, invert } from 'lodash';
|
|
@@ -11,32 +10,26 @@ import { GrowlerModel } from "../../messaging/growler.model";
|
|
|
11
10
|
import * as i0 from "@angular/core";
|
|
12
11
|
import * as i1 from "./service-policy-form.service";
|
|
13
12
|
import * as i2 from "../../messaging/growler.service";
|
|
14
|
-
import * as i3 from "@angular/
|
|
15
|
-
import * as i4 from "@angular/
|
|
16
|
-
import * as i5 from "
|
|
17
|
-
import * as i6 from "../form-
|
|
18
|
-
import * as i7 from "
|
|
19
|
-
import * as i8 from "../../
|
|
20
|
-
import * as i9 from "../../
|
|
21
|
-
import * as i10 from "../../
|
|
22
|
-
import * as i11 from "
|
|
23
|
-
import * as i12 from "../../../services/
|
|
13
|
+
import * as i3 from "@angular/router";
|
|
14
|
+
import * as i4 from "@angular/common";
|
|
15
|
+
import * as i5 from "@angular/forms";
|
|
16
|
+
import * as i6 from "../form-header/form-header.component";
|
|
17
|
+
import * as i7 from "../form-field-container/form-field-container.component";
|
|
18
|
+
import * as i8 from "../../preview-list/preview-list.component";
|
|
19
|
+
import * as i9 from "../../loading-indicator/loading-indicator.component";
|
|
20
|
+
import * as i10 from "../../json-view/json-view.component";
|
|
21
|
+
import * as i11 from "../../tag-selector/tag-selector.component";
|
|
22
|
+
import * as i12 from "../../../services/settings.service";
|
|
23
|
+
import * as i13 from "../../../services/ziti-data.service";
|
|
24
24
|
class ServicePolicyFormComponent extends ProjectableForm {
|
|
25
|
-
constructor(settingsService, svc, zitiService, growlerService, extService) {
|
|
26
|
-
super(growlerService, extService);
|
|
25
|
+
constructor(settingsService, svc, zitiService, growlerService, extService, router, route) {
|
|
26
|
+
super(growlerService, extService, zitiService, router, route);
|
|
27
27
|
this.settingsService = settingsService;
|
|
28
28
|
this.svc = svc;
|
|
29
29
|
this.zitiService = zitiService;
|
|
30
|
+
this.router = router;
|
|
31
|
+
this.route = route;
|
|
30
32
|
this.formData = {};
|
|
31
|
-
this.serviceRoleAttributes = [];
|
|
32
|
-
this.serviceNamedAttributes = [];
|
|
33
|
-
this.serviceNamedAttributesMap = {};
|
|
34
|
-
this.identityRoleAttributes = [];
|
|
35
|
-
this.identityNamedAttributes = [];
|
|
36
|
-
this.identityNamedAttributesMap = {};
|
|
37
|
-
this.postureRoleAttributes = [];
|
|
38
|
-
this.postureNamedAttributes = [];
|
|
39
|
-
this.postureNamedAttributesMap = {};
|
|
40
33
|
this.close = new EventEmitter();
|
|
41
34
|
this.selectedServiceRoleAttributes = [];
|
|
42
35
|
this.selectedServiceNamedAttributes = [];
|
|
@@ -46,24 +39,35 @@ class ServicePolicyFormComponent extends ProjectableForm {
|
|
|
46
39
|
this.selectedPostureNamedAttributes = [];
|
|
47
40
|
this.formView = 'simple';
|
|
48
41
|
this.isEditing = false;
|
|
49
|
-
this.isLoading = false;
|
|
50
42
|
this.servicesLoading = false;
|
|
51
43
|
this.identitiesLoading = false;
|
|
52
44
|
this.postureChecksLoading = false;
|
|
53
45
|
this.showMore = false;
|
|
54
46
|
this.settings = {};
|
|
55
|
-
this.
|
|
47
|
+
this.entityType = 'service-policies';
|
|
48
|
+
this.entityClass = ServicePolicy;
|
|
56
49
|
this._apiData = {};
|
|
57
50
|
}
|
|
58
51
|
ngOnInit() {
|
|
52
|
+
super.ngOnInit();
|
|
59
53
|
this.subscription.add(this.settingsService.settingsChange.subscribe((results) => {
|
|
60
54
|
this.settings = results;
|
|
61
55
|
}));
|
|
56
|
+
}
|
|
57
|
+
entityUpdated() {
|
|
58
|
+
const promises = [];
|
|
59
|
+
promises.push(this.svc.getServiceRoleAttributes());
|
|
60
|
+
promises.push(this.svc.getIdentityRoleAttributes());
|
|
61
|
+
promises.push(this.svc.getServiceNamedAttributes());
|
|
62
|
+
promises.push(this.svc.getIdentityNamedAttributes());
|
|
63
|
+
promises.push(this.svc.getPostureNamedAttributes());
|
|
64
|
+
Promise.all(promises).then(() => {
|
|
65
|
+
this.initSelectedAttributes();
|
|
66
|
+
});
|
|
62
67
|
if (isEmpty(this.formData.id)) {
|
|
63
68
|
this.formData = new ServicePolicy();
|
|
64
69
|
}
|
|
65
70
|
this.initData = cloneDeep(this.formData);
|
|
66
|
-
this.initSelectedAttributes();
|
|
67
71
|
this.extService.updateFormData(this.formData);
|
|
68
72
|
this.subscription.add(this.extService.formDataChanged.subscribe((data) => {
|
|
69
73
|
if (data.isEmpty) {
|
|
@@ -71,8 +75,6 @@ class ServicePolicyFormComponent extends ProjectableForm {
|
|
|
71
75
|
}
|
|
72
76
|
this.formData = data;
|
|
73
77
|
}));
|
|
74
|
-
this.svc.serviceNamedAttributesMap = this.serviceNamedAttributesMap;
|
|
75
|
-
this.svc.identityNamedAttributesMap = this.identityNamedAttributesMap;
|
|
76
78
|
this.initData = cloneDeep(this.formData);
|
|
77
79
|
}
|
|
78
80
|
ngOnDestroy() {
|
|
@@ -92,9 +94,9 @@ class ServicePolicyFormComponent extends ProjectableForm {
|
|
|
92
94
|
this.svc.associatedPostureCheckNames = [];
|
|
93
95
|
return;
|
|
94
96
|
}
|
|
95
|
-
const serviceIdAttributesMap = invert(this.serviceNamedAttributesMap);
|
|
96
|
-
const identityIdAttributesMap = invert(this.identityNamedAttributesMap);
|
|
97
|
-
const postureIdAttributesMap = invert(this.postureNamedAttributesMap);
|
|
97
|
+
const serviceIdAttributesMap = invert(this.svc.serviceNamedAttributesMap);
|
|
98
|
+
const identityIdAttributesMap = invert(this.svc.identityNamedAttributesMap);
|
|
99
|
+
const postureIdAttributesMap = invert(this.svc.postureNamedAttributesMap);
|
|
98
100
|
this.selectedServiceRoleAttributes = [];
|
|
99
101
|
this.selectedServiceNamedAttributes = [];
|
|
100
102
|
this.selectedIdentityRoleAttributes = [];
|
|
@@ -135,7 +137,7 @@ class ServicePolicyFormComponent extends ProjectableForm {
|
|
|
135
137
|
this.save();
|
|
136
138
|
break;
|
|
137
139
|
case 'close':
|
|
138
|
-
this.
|
|
140
|
+
this.returnToListPage();
|
|
139
141
|
break;
|
|
140
142
|
case 'toggle-view':
|
|
141
143
|
this.formView = action.data;
|
|
@@ -143,6 +145,7 @@ class ServicePolicyFormComponent extends ProjectableForm {
|
|
|
143
145
|
}
|
|
144
146
|
}
|
|
145
147
|
async save(event) {
|
|
148
|
+
this.formData.name = this.formData.name.trim();
|
|
146
149
|
const isValid = this.validate();
|
|
147
150
|
const isExtValid = await this.extService.validateData();
|
|
148
151
|
if (!isValid || !isExtValid) {
|
|
@@ -164,14 +167,15 @@ class ServicePolicyFormComponent extends ProjectableForm {
|
|
|
164
167
|
else {
|
|
165
168
|
this.initData = this.formData;
|
|
166
169
|
}
|
|
170
|
+
this.returnToListPage();
|
|
167
171
|
}).finally(() => {
|
|
168
172
|
this.isLoading = false;
|
|
169
173
|
});
|
|
170
174
|
}
|
|
171
175
|
applySelectedAttributes() {
|
|
172
|
-
this.formData.serviceRoles = this.svc.getSelectedRoles(this.selectedServiceRoleAttributes, this.selectedServiceNamedAttributes, this.serviceNamedAttributesMap);
|
|
173
|
-
this.formData.identityRoles = this.svc.getSelectedRoles(this.selectedIdentityRoleAttributes, this.selectedIdentityNamedAttributes, this.identityNamedAttributesMap);
|
|
174
|
-
this.formData.postureCheckRoles = this.svc.getSelectedRoles(this.selectedPostureRoleAttributes, this.selectedPostureNamedAttributes, this.postureNamedAttributesMap);
|
|
176
|
+
this.formData.serviceRoles = this.svc.getSelectedRoles(this.selectedServiceRoleAttributes, this.selectedServiceNamedAttributes, this.svc.serviceNamedAttributesMap);
|
|
177
|
+
this.formData.identityRoles = this.svc.getSelectedRoles(this.selectedIdentityRoleAttributes, this.selectedIdentityNamedAttributes, this.svc.identityNamedAttributesMap);
|
|
178
|
+
this.formData.postureCheckRoles = this.svc.getSelectedRoles(this.selectedPostureRoleAttributes, this.selectedPostureNamedAttributes, this.svc.postureNamedAttributesMap);
|
|
175
179
|
}
|
|
176
180
|
validate() {
|
|
177
181
|
this.errors = {};
|
|
@@ -191,11 +195,11 @@ class ServicePolicyFormComponent extends ProjectableForm {
|
|
|
191
195
|
}
|
|
192
196
|
}
|
|
193
197
|
copyCLICommand() {
|
|
194
|
-
const serviceRoles = this.svc.getSelectedRoles(this.selectedServiceRoleAttributes, this.selectedServiceNamedAttributes, this.serviceNamedAttributesMap);
|
|
198
|
+
const serviceRoles = this.svc.getSelectedRoles(this.selectedServiceRoleAttributes, this.selectedServiceNamedAttributes, this.svc.serviceNamedAttributesMap);
|
|
195
199
|
const serviceRolesVar = this.getRolesCLIVariable(serviceRoles);
|
|
196
|
-
const identityRoles = this.svc.getSelectedRoles(this.selectedIdentityRoleAttributes, this.selectedIdentityNamedAttributes, this.identityNamedAttributesMap);
|
|
200
|
+
const identityRoles = this.svc.getSelectedRoles(this.selectedIdentityRoleAttributes, this.selectedIdentityNamedAttributes, this.svc.identityNamedAttributesMap);
|
|
197
201
|
const identityRolesVar = this.getRolesCLIVariable(identityRoles);
|
|
198
|
-
const pcRoles = this.svc.getSelectedRoles(this.selectedPostureRoleAttributes, this.selectedPostureNamedAttributes, this.postureNamedAttributesMap);
|
|
202
|
+
const pcRoles = this.svc.getSelectedRoles(this.selectedPostureRoleAttributes, this.selectedPostureNamedAttributes, this.svc.postureNamedAttributesMap);
|
|
199
203
|
const pcRolesVar = this.getRolesCLIVariable(pcRoles);
|
|
200
204
|
const command = `ziti edge ${this.formData.id ? 'update' : 'create'} service-policy ${this.formData.id ? `'${this.formData.id}'` : ''} ${this.formData.id ? '--name' : ''} '${this.formData.name}' ${this.formData.id ? '' : this.formData.type}${this.formData.id ? '' : ` --semantic '${this.formData.semantic}'`} --service-roles '${serviceRolesVar}' --identity-roles '${identityRolesVar}' --posture-check-roles '${pcRolesVar}'`;
|
|
201
205
|
navigator.clipboard.writeText(command);
|
|
@@ -203,13 +207,18 @@ class ServicePolicyFormComponent extends ProjectableForm {
|
|
|
203
207
|
this.growlerService.show(growlerData);
|
|
204
208
|
}
|
|
205
209
|
copyCURLCommand() {
|
|
206
|
-
const serviceRoles = this.svc.getSelectedRoles(this.selectedServiceRoleAttributes, this.selectedServiceNamedAttributes, this.serviceNamedAttributesMap);
|
|
210
|
+
const serviceRoles = this.svc.getSelectedRoles(this.selectedServiceRoleAttributes, this.selectedServiceNamedAttributes, this.svc.serviceNamedAttributesMap);
|
|
207
211
|
const serviceRolesVar = this.getRolesCURLVariable(serviceRoles);
|
|
208
|
-
const identityRoles = this.svc.getSelectedRoles(this.selectedIdentityRoleAttributes, this.selectedIdentityNamedAttributes, this.identityNamedAttributesMap);
|
|
212
|
+
const identityRoles = this.svc.getSelectedRoles(this.selectedIdentityRoleAttributes, this.selectedIdentityNamedAttributes, this.svc.identityNamedAttributesMap);
|
|
209
213
|
const identityRolesVar = this.getRolesCURLVariable(identityRoles);
|
|
210
|
-
const pcRoles = this.svc.getSelectedRoles(this.selectedPostureRoleAttributes, this.selectedPostureNamedAttributes, this.postureNamedAttributesMap);
|
|
214
|
+
const pcRoles = this.svc.getSelectedRoles(this.selectedPostureRoleAttributes, this.selectedPostureNamedAttributes, this.svc.postureNamedAttributesMap);
|
|
211
215
|
const pcRolesVar = this.getRolesCURLVariable(pcRoles);
|
|
212
|
-
const command = `curl '${this.apiCallURL}' \\
|
|
216
|
+
const command = `curl '${this.apiCallURL}' \\
|
|
217
|
+
${this.formData.id ? '--request PATCH \\' : '\\'}
|
|
218
|
+
-H 'accept: application/json' \\
|
|
219
|
+
-H 'content-type: application/json' \\
|
|
220
|
+
-H 'zt-session: ${this.settings.session.id}' \\
|
|
221
|
+
--data-raw '{"name":"${this.formData.name}","serviceRoles":${serviceRolesVar},"identityRoles":${identityRolesVar},"postureCheckRoles":${pcRolesVar},"semantic":"${this.formData.semantic}","type":"${this.formData.type}"}'`;
|
|
213
222
|
navigator.clipboard.writeText(command);
|
|
214
223
|
const growlerData = new GrowlerModel('success', 'Success', `Text Copied`, `CURL command copied to clipboard`);
|
|
215
224
|
this.growlerService.show(growlerData);
|
|
@@ -221,9 +230,9 @@ class ServicePolicyFormComponent extends ProjectableForm {
|
|
|
221
230
|
const data = {
|
|
222
231
|
name: this.formData?.name || '',
|
|
223
232
|
appData: this.formData?.appData || '',
|
|
224
|
-
serviceRoles: this.svc.getSelectedRoles(this.selectedServiceRoleAttributes, this.selectedServiceNamedAttributes, this.serviceNamedAttributesMap),
|
|
225
|
-
identityRoles: this.svc.getSelectedRoles(this.selectedIdentityRoleAttributes, this.selectedIdentityNamedAttributes, this.identityNamedAttributesMap),
|
|
226
|
-
postureCheckRoles: this.svc.getSelectedRoles(this.selectedPostureRoleAttributes, this.selectedPostureNamedAttributes, this.postureNamedAttributesMap),
|
|
233
|
+
serviceRoles: this.svc.getSelectedRoles(this.selectedServiceRoleAttributes, this.selectedServiceNamedAttributes, this.svc.serviceNamedAttributesMap),
|
|
234
|
+
identityRoles: this.svc.getSelectedRoles(this.selectedIdentityRoleAttributes, this.selectedIdentityNamedAttributes, this.svc.identityNamedAttributesMap),
|
|
235
|
+
postureCheckRoles: this.svc.getSelectedRoles(this.selectedPostureRoleAttributes, this.selectedPostureNamedAttributes, this.svc.postureNamedAttributesMap),
|
|
227
236
|
semantic: this.formData.semantic,
|
|
228
237
|
type: this.formData.type
|
|
229
238
|
};
|
|
@@ -234,13 +243,13 @@ class ServicePolicyFormComponent extends ProjectableForm {
|
|
|
234
243
|
}
|
|
235
244
|
clear() {
|
|
236
245
|
}
|
|
237
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ServicePolicyFormComponent, deps: [{ token: SETTINGS_SERVICE }, { token: i1.ServicePolicyFormService }, { token: ZITI_DATA_SERVICE }, { token: i2.GrowlerService }, { token: SERVICE_POLICY_EXTENSION_SERVICE }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
238
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ServicePolicyFormComponent, selector: "lib-service-policy-form", inputs: { formData: "formData"
|
|
246
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ServicePolicyFormComponent, deps: [{ token: SETTINGS_SERVICE }, { token: i1.ServicePolicyFormService }, { token: ZITI_DATA_SERVICE }, { token: i2.GrowlerService }, { token: SERVICE_POLICY_EXTENSION_SERVICE }, { token: i3.Router }, { token: i3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
247
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ServicePolicyFormComponent, selector: "lib-service-policy-form", inputs: { formData: "formData" }, outputs: { close: "close" }, providers: [
|
|
239
248
|
{
|
|
240
249
|
provide: MatDialogRef,
|
|
241
250
|
useValue: {}
|
|
242
251
|
}
|
|
243
|
-
], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"formData.id ? 'Edit Service Policy: ' : 'Create New Service Policy'\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n ></lib-form-header>\n <div class=\"service-policy-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" *ngIf=\"formView === 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [title]=\"'Service Policy Name'\" [label]=\"'REQUIRED'\">\n <input\n class=\"form-field-input\"\n placeholder=\"Name this edge service policy\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n autofocus\n #nameFieldInput\n />\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Service Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100003'\"\n [helpText]=\"'Choose which services to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedServiceRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedServiceNamedAttributes\"\n [availableRoleAttributes]=\"serviceRoleAttributes\"\n [availableNamedAttributes]=\"serviceNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedServicesByAttribute(selectedServiceRoleAttributes, selectedServiceNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedServicesByAttribute(selectedServiceRoleAttributes, selectedServiceNamedAttributes)\"\n [placeholder]=\"'Select service attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Identity Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100002'\"\n [helpText]=\"'Choose which identities to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedIdentityRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedIdentityNamedAttributes\"\n [availableRoleAttributes]=\"identityRoleAttributes\"\n [availableNamedAttributes]=\"identityNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedIdentitiesByAttribute(selectedIdentityRoleAttributes, selectedIdentityNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedIdentitiesByAttribute(selectedIdentityRoleAttributes, selectedIdentityNamedAttributes)\"\n [placeholder]=\"'Select identity attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Posture Check Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100001'\"\n [helpText]=\"'Choose which posture checks to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedPostureRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedPostureNamedAttributes\"\n [(selectedRoleAttributes)]=\"postureRoleAttributes\"\n [availableNamedAttributes]=\"postureNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedPostureChecksByAttribute(selectedPostureRoleAttributes, selectedPostureNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedPostureChecksByAttribute(selectedPostureRoleAttributes, selectedPostureNamedAttributes)\"\n [placeholder]=\"'Select posture check attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Type'\"\n [title2]=\"'Semantic'\"\n [layout]=\"'row'\"\n >\n <select\n [(ngModel)]=\"formData.type\"\n id=\"PolicyType\"\n class=\"form-field-dropdown\"\n >\n <option value=\"Bind\">Bind</option>\n <option value=\"Dial\">Dial</option>\n </select>\n <select\n [(ngModel)]=\"formData.semantic\"\n id=\"PolicySemantic\"\n class=\"form-field-dropdown\"\n >\n <option value=\"AnyOf\">AnyOf</option>\n <option value=\"AllOf\">AllOf</option>\n </select>\n </lib-form-field-container>\n </div>\n <div class=\"form-group-column two-fifths\">\n <lib-form-field-container\n [title]=\"'Associated Services'\"\n [count]=\"svc.associatedServiceNames.length\"\n [class]=\"'hide-overflow'\"\n [helpText]=\"'Preview list of all services that this Service Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"servicesLoading\"\n [allNames]=\"svc.associatedServiceNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Associated Identities'\"\n [count]=\"svc.associatedIdentityNames.length\"\n [helpText]=\"'Preview list of all Identities that this Service Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"identitiesLoading\"\n [allNames]=\"svc.associatedIdentityNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Associated Posture Checks'\"\n [count]=\"svc.associatedPostureCheckNames.length\"\n [helpText]=\"'Preview list of all Posture Checks that this Service Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"postureChecksLoading\"\n [allNames]=\"svc.associatedPostureCheckNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [headerActions]=\"apiOptions\"\n (actionRequested)=\"apiActionRequested($event)\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"icon-copy copy\" (click)=\"copyToClipboard(apiCallURL)\"></div>\n </div>\n <lib-json-view *ngIf=\"formData\" [(data)]=\"apiData\" [readOnly]=\"true\" [showCopy]=\"true\"></lib-json-view>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column\" *ngIf=\"formView === 'raw'\">\n <lib-json-view *ngIf=\"formData\" [(data)]=\"formData\"></lib-json-view>\n </div>\n </div>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>", styles: [""], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText"], outputs: ["formViewChange", "actionRequested"] }, { kind: "component", type: i6.FormFieldContainerComponent, selector: "lib-form-field-container", inputs: ["title", "title2", "layout", "helpText", "helpText2", "label", "count", "action", "actionLabel", "class", "contentStyle", "showHeader", "headerActions"], outputs: ["actionRequested"] }, { kind: "component", type: i7.PreviewListComponent, selector: "lib-preview-list", inputs: ["hideOption", "label", "clickable", "isLoading", "allNames", "allowRemove", "tooltip"], outputs: ["itemSelected", "itemRemoved"] }, { kind: "component", type: i8.LoadingIndicatorComponent, selector: "lib-loading-indicator", inputs: ["isLoading"] }, { kind: "component", type: i9.JsonViewComponent, selector: "lib-json-view", inputs: ["data", "schema", "readOnly", "jsonInvalid", "showCopy"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }, { kind: "component", type: i10.TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }] }); }
|
|
252
|
+
], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"formData.id ? 'Edit Service Policy: ' : 'Create New Service Policy'\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n ></lib-form-header>\n <div class=\"service-policy-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" *ngIf=\"formView === 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [title]=\"'Service Policy Name'\" [label]=\"'REQUIRED'\">\n <input\n class=\"form-field-input\"\n placeholder=\"Name this edge service policy\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n autofocus\n #nameFieldInput\n />\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Service Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100003'\"\n [helpText]=\"'Choose which services to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedServiceRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedServiceNamedAttributes\"\n [availableRoleAttributes]=\"svc.serviceRoleAttributes\"\n [availableNamedAttributes]=\"svc.serviceNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedServicesByAttribute(selectedServiceRoleAttributes, selectedServiceNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedServicesByAttribute(selectedServiceRoleAttributes, selectedServiceNamedAttributes)\"\n [placeholder]=\"'Select service attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Identity Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100002'\"\n [helpText]=\"'Choose which identities to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedIdentityRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedIdentityNamedAttributes\"\n [availableRoleAttributes]=\"svc.identityRoleAttributes\"\n [availableNamedAttributes]=\"svc.identityNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedIdentitiesByAttribute(selectedIdentityRoleAttributes, selectedIdentityNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedIdentitiesByAttribute(selectedIdentityRoleAttributes, selectedIdentityNamedAttributes)\"\n [placeholder]=\"'Select identity attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Posture Check Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100001'\"\n [helpText]=\"'Choose which posture checks to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedPostureRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedPostureNamedAttributes\"\n [(selectedRoleAttributes)]=\"svc.postureRoleAttributes\"\n [availableNamedAttributes]=\"svc.postureNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedPostureChecksByAttribute(selectedPostureRoleAttributes, selectedPostureNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedPostureChecksByAttribute(selectedPostureRoleAttributes, selectedPostureNamedAttributes)\"\n [placeholder]=\"'Select posture check attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Type'\"\n [title2]=\"'Semantic'\"\n [layout]=\"'row'\"\n >\n <select\n [(ngModel)]=\"formData.type\"\n id=\"PolicyType\"\n class=\"form-field-dropdown\"\n >\n <option value=\"Bind\">Bind</option>\n <option value=\"Dial\">Dial</option>\n </select>\n <select\n [(ngModel)]=\"formData.semantic\"\n id=\"PolicySemantic\"\n class=\"form-field-dropdown\"\n >\n <option value=\"AnyOf\">AnyOf</option>\n <option value=\"AllOf\">AllOf</option>\n </select>\n </lib-form-field-container>\n </div>\n <div class=\"form-group-column two-fifths\">\n <lib-form-field-container\n [title]=\"'Associated Services'\"\n [count]=\"svc.associatedServiceNames.length\"\n [class]=\"'hide-overflow'\"\n [helpText]=\"'Preview list of all services that this Service Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"servicesLoading\"\n [allNames]=\"svc.associatedServiceNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Associated Identities'\"\n [count]=\"svc.associatedIdentityNames.length\"\n [helpText]=\"'Preview list of all Identities that this Service Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"identitiesLoading\"\n [allNames]=\"svc.associatedIdentityNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Associated Posture Checks'\"\n [count]=\"svc.associatedPostureCheckNames.length\"\n [helpText]=\"'Preview list of all Posture Checks that this Service Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"postureChecksLoading\"\n [allNames]=\"svc.associatedPostureCheckNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [headerActions]=\"apiOptions\"\n (actionRequested)=\"apiActionRequested($event)\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"icon-copy copy\" (click)=\"copyToClipboard(apiCallURL)\"></div>\n </div>\n <lib-json-view *ngIf=\"formData\" [(data)]=\"apiData\" [readOnly]=\"true\" [showCopy]=\"true\"></lib-json-view>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column\" *ngIf=\"formView === 'raw'\">\n <lib-json-view *ngIf=\"formData\" [(data)]=\"formData\"></lib-json-view>\n </div>\n </div>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>", styles: [""], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText"], outputs: ["formViewChange", "actionRequested"] }, { kind: "component", type: i7.FormFieldContainerComponent, selector: "lib-form-field-container", inputs: ["title", "title2", "layout", "helpText", "helpText2", "label", "count", "action", "actionLabel", "class", "contentStyle", "showHeader", "headerActions"], outputs: ["actionRequested"] }, { kind: "component", type: i8.PreviewListComponent, selector: "lib-preview-list", inputs: ["hideOption", "label", "clickable", "isLoading", "allNames", "allowRemove", "tooltip"], outputs: ["itemSelected", "itemRemoved"] }, { kind: "component", type: i9.LoadingIndicatorComponent, selector: "lib-loading-indicator", inputs: ["isLoading"] }, { kind: "component", type: i10.JsonViewComponent, selector: "lib-json-view", inputs: ["data", "schema", "readOnly", "jsonInvalid", "showCopy"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }, { kind: "component", type: i11.TagSelectorComponent, selector: "lib-tag-selector", inputs: ["placeholder", "disableField", "disableCreate", "hideOption", "isLoading", "errorMessage", "focusOnInit", "selectedRoleAttributes", "selectedNamedAttributes", "hasError", "availableRoleAttributes", "availableNamedAttributes"], outputs: ["addRoleAttribute", "addNamedAttribute", "roleAttributeRemoved", "namedAttributeRemoved", "selectedRoleAttributesChange", "selectedNamedAttributesChange", "filterChange"] }] }); }
|
|
244
253
|
}
|
|
245
254
|
export { ServicePolicyFormComponent };
|
|
246
255
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ServicePolicyFormComponent, decorators: [{
|
|
@@ -250,37 +259,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
250
259
|
provide: MatDialogRef,
|
|
251
260
|
useValue: {}
|
|
252
261
|
}
|
|
253
|
-
], template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"formData.id ? 'Edit Service Policy: ' : 'Create New Service Policy'\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n ></lib-form-header>\n <div class=\"service-policy-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" *ngIf=\"formView === 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [title]=\"'Service Policy Name'\" [label]=\"'REQUIRED'\">\n <input\n class=\"form-field-input\"\n placeholder=\"Name this edge service policy\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n autofocus\n #nameFieldInput\n />\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Service Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100003'\"\n [helpText]=\"'Choose which services to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedServiceRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedServiceNamedAttributes\"\n [availableRoleAttributes]=\"serviceRoleAttributes\"\n [availableNamedAttributes]=\"serviceNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedServicesByAttribute(selectedServiceRoleAttributes, selectedServiceNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedServicesByAttribute(selectedServiceRoleAttributes, selectedServiceNamedAttributes)\"\n [placeholder]=\"'Select service attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Identity Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100002'\"\n [helpText]=\"'Choose which identities to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedIdentityRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedIdentityNamedAttributes\"\n [availableRoleAttributes]=\"identityRoleAttributes\"\n [availableNamedAttributes]=\"identityNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedIdentitiesByAttribute(selectedIdentityRoleAttributes, selectedIdentityNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedIdentitiesByAttribute(selectedIdentityRoleAttributes, selectedIdentityNamedAttributes)\"\n [placeholder]=\"'Select identity attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Posture Check Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100001'\"\n [helpText]=\"'Choose which posture checks to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedPostureRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedPostureNamedAttributes\"\n [(selectedRoleAttributes)]=\"postureRoleAttributes\"\n [availableNamedAttributes]=\"postureNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedPostureChecksByAttribute(selectedPostureRoleAttributes, selectedPostureNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedPostureChecksByAttribute(selectedPostureRoleAttributes, selectedPostureNamedAttributes)\"\n [placeholder]=\"'Select posture check attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Type'\"\n [title2]=\"'Semantic'\"\n [layout]=\"'row'\"\n >\n <select\n [(ngModel)]=\"formData.type\"\n id=\"PolicyType\"\n class=\"form-field-dropdown\"\n >\n <option value=\"Bind\">Bind</option>\n <option value=\"Dial\">Dial</option>\n </select>\n <select\n [(ngModel)]=\"formData.semantic\"\n id=\"PolicySemantic\"\n class=\"form-field-dropdown\"\n >\n <option value=\"AnyOf\">AnyOf</option>\n <option value=\"AllOf\">AllOf</option>\n </select>\n </lib-form-field-container>\n </div>\n <div class=\"form-group-column two-fifths\">\n <lib-form-field-container\n [title]=\"'Associated Services'\"\n [count]=\"svc.associatedServiceNames.length\"\n [class]=\"'hide-overflow'\"\n [helpText]=\"'Preview list of all services that this Service Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"servicesLoading\"\n [allNames]=\"svc.associatedServiceNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Associated Identities'\"\n [count]=\"svc.associatedIdentityNames.length\"\n [helpText]=\"'Preview list of all Identities that this Service Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"identitiesLoading\"\n [allNames]=\"svc.associatedIdentityNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Associated Posture Checks'\"\n [count]=\"svc.associatedPostureCheckNames.length\"\n [helpText]=\"'Preview list of all Posture Checks that this Service Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"postureChecksLoading\"\n [allNames]=\"svc.associatedPostureCheckNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [headerActions]=\"apiOptions\"\n (actionRequested)=\"apiActionRequested($event)\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"icon-copy copy\" (click)=\"copyToClipboard(apiCallURL)\"></div>\n </div>\n <lib-json-view *ngIf=\"formData\" [(data)]=\"apiData\" [readOnly]=\"true\" [showCopy]=\"true\"></lib-json-view>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column\" *ngIf=\"formView === 'raw'\">\n <lib-json-view *ngIf=\"formData\" [(data)]=\"formData\"></lib-json-view>\n </div>\n </div>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>" }]
|
|
254
|
-
}], ctorParameters: function () { return [{ type:
|
|
262
|
+
], template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"formData.id ? 'Edit Service Policy: ' : 'Create New Service Policy'\"\n [moreActions]=\"moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n ></lib-form-header>\n <div class=\"service-policy-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" *ngIf=\"formView === 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [title]=\"'Service Policy Name'\" [label]=\"'REQUIRED'\">\n <input\n class=\"form-field-input\"\n placeholder=\"Name this edge service policy\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n autofocus\n #nameFieldInput\n />\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Service Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100003'\"\n [helpText]=\"'Choose which services to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedServiceRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedServiceNamedAttributes\"\n [availableRoleAttributes]=\"svc.serviceRoleAttributes\"\n [availableNamedAttributes]=\"svc.serviceNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedServicesByAttribute(selectedServiceRoleAttributes, selectedServiceNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedServicesByAttribute(selectedServiceRoleAttributes, selectedServiceNamedAttributes)\"\n [placeholder]=\"'Select service attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Identity Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100002'\"\n [helpText]=\"'Choose which identities to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedIdentityRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedIdentityNamedAttributes\"\n [availableRoleAttributes]=\"svc.identityRoleAttributes\"\n [availableNamedAttributes]=\"svc.identityNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedIdentitiesByAttribute(selectedIdentityRoleAttributes, selectedIdentityNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedIdentitiesByAttribute(selectedIdentityRoleAttributes, selectedIdentityNamedAttributes)\"\n [placeholder]=\"'Select identity attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Select Posture Check Attributes'\"\n [label]=\"'OPTIONAL'\"\n [contentStyle]=\"'z-index: 100001'\"\n [helpText]=\"'Choose which posture checks to associate to this policy by picking from the list of available attributes'\"\n >\n <lib-tag-selector\n [(selectedRoleAttributes)]=\"selectedPostureRoleAttributes\"\n [(selectedNamedAttributes)]=\"selectedPostureNamedAttributes\"\n [(selectedRoleAttributes)]=\"svc.postureRoleAttributes\"\n [availableNamedAttributes]=\"svc.postureNamedAttributes\"\n (selectedNamedAttributesChange)=\"svc.getAssociatedPostureChecksByAttribute(selectedPostureRoleAttributes, selectedPostureNamedAttributes)\"\n (selectedRoleAttributesChange)=\"svc.getAssociatedPostureChecksByAttribute(selectedPostureRoleAttributes, selectedPostureNamedAttributes)\"\n [placeholder]=\"'Select posture check attributes'\"\n ></lib-tag-selector>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Type'\"\n [title2]=\"'Semantic'\"\n [layout]=\"'row'\"\n >\n <select\n [(ngModel)]=\"formData.type\"\n id=\"PolicyType\"\n class=\"form-field-dropdown\"\n >\n <option value=\"Bind\">Bind</option>\n <option value=\"Dial\">Dial</option>\n </select>\n <select\n [(ngModel)]=\"formData.semantic\"\n id=\"PolicySemantic\"\n class=\"form-field-dropdown\"\n >\n <option value=\"AnyOf\">AnyOf</option>\n <option value=\"AllOf\">AllOf</option>\n </select>\n </lib-form-field-container>\n </div>\n <div class=\"form-group-column two-fifths\">\n <lib-form-field-container\n [title]=\"'Associated Services'\"\n [count]=\"svc.associatedServiceNames.length\"\n [class]=\"'hide-overflow'\"\n [helpText]=\"'Preview list of all services that this Service Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"servicesLoading\"\n [allNames]=\"svc.associatedServiceNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Associated Identities'\"\n [count]=\"svc.associatedIdentityNames.length\"\n [helpText]=\"'Preview list of all Identities that this Service Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"identitiesLoading\"\n [allNames]=\"svc.associatedIdentityNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Associated Posture Checks'\"\n [count]=\"svc.associatedPostureCheckNames.length\"\n [helpText]=\"'Preview list of all Posture Checks that this Service Policy is associated with.'\"\n >\n <lib-preview-list\n [clickable]=\"false\"\n [isLoading]=\"postureChecksLoading\"\n [allNames]=\"svc.associatedPostureCheckNames\"\n ></lib-preview-list>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [headerActions]=\"apiOptions\"\n (actionRequested)=\"apiActionRequested($event)\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"icon-copy copy\" (click)=\"copyToClipboard(apiCallURL)\"></div>\n </div>\n <lib-json-view *ngIf=\"formData\" [(data)]=\"apiData\" [readOnly]=\"true\" [showCopy]=\"true\"></lib-json-view>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column\" *ngIf=\"formView === 'raw'\">\n <lib-json-view *ngIf=\"formData\" [(data)]=\"formData\"></lib-json-view>\n </div>\n </div>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>" }]
|
|
263
|
+
}], ctorParameters: function () { return [{ type: i12.SettingsService, decorators: [{
|
|
255
264
|
type: Inject,
|
|
256
265
|
args: [SETTINGS_SERVICE]
|
|
257
|
-
}] }, { type: i1.ServicePolicyFormService }, { type:
|
|
266
|
+
}] }, { type: i1.ServicePolicyFormService }, { type: i13.ZitiDataService, decorators: [{
|
|
258
267
|
type: Inject,
|
|
259
268
|
args: [ZITI_DATA_SERVICE]
|
|
260
269
|
}] }, { type: i2.GrowlerService }, { type: undefined, decorators: [{
|
|
261
270
|
type: Inject,
|
|
262
271
|
args: [SERVICE_POLICY_EXTENSION_SERVICE]
|
|
263
|
-
}] }]; }, propDecorators: { formData: [{
|
|
264
|
-
type: Input
|
|
265
|
-
}], serviceRoleAttributes: [{
|
|
266
|
-
type: Input
|
|
267
|
-
}], serviceNamedAttributes: [{
|
|
268
|
-
type: Input
|
|
269
|
-
}], serviceNamedAttributesMap: [{
|
|
270
|
-
type: Input
|
|
271
|
-
}], identityRoleAttributes: [{
|
|
272
|
-
type: Input
|
|
273
|
-
}], identityNamedAttributes: [{
|
|
274
|
-
type: Input
|
|
275
|
-
}], identityNamedAttributesMap: [{
|
|
276
|
-
type: Input
|
|
277
|
-
}], postureRoleAttributes: [{
|
|
278
|
-
type: Input
|
|
279
|
-
}], postureNamedAttributes: [{
|
|
280
|
-
type: Input
|
|
281
|
-
}], postureNamedAttributesMap: [{
|
|
272
|
+
}] }, { type: i3.Router }, { type: i3.ActivatedRoute }]; }, propDecorators: { formData: [{
|
|
282
273
|
type: Input
|
|
283
274
|
}], close: [{
|
|
284
275
|
type: Output
|
|
285
276
|
}] } });
|
|
286
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1wb2xpY3ktZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy96aXRpLWNvbnNvbGUtbGliL3NyYy9saWIvZmVhdHVyZXMvcHJvamVjdGFibGUtZm9ybXMvc2VydmljZS1wb2xpY3kvc2VydmljZS1wb2xpY3ktZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy96aXRpLWNvbnNvbGUtbGliL3NyYy9saWIvZmVhdHVyZXMvcHJvamVjdGFibGUtZm9ybXMvc2VydmljZS1wb2xpY3kvc2VydmljZS1wb2xpY3ktZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUlOLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQWtCLE1BQU0sb0NBQW9DLENBQUM7QUFFckYsT0FBTyxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ2xELE9BQU8sRUFBQyxpQkFBaUIsRUFBa0IsTUFBTSxxQ0FBcUMsQ0FBQztBQUV2RixPQUFPLEVBQTJCLGdDQUFnQyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDekcsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRXRELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sK0JBQStCLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBRTNELE1BV2EsMEJBQTJCLFNBQVEs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LDBCQUEwQjtzQkFBbEMsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUNHLHlCQUF5QjtzQkFBakMsS0FBSztnQkFDSSxLQUFLO3NCQUFkLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgSW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtQcm9qZWN0YWJsZUZvcm19IGZyb20gXCIuLi9wcm9qZWN0YWJsZS1mb3JtLmNsYXNzXCI7XG5pbXBvcnQge1NFVFRJTkdTX1NFUlZJQ0UsIFNldHRpbmdzU2VydmljZX0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL3NldHRpbmdzLnNlcnZpY2VcIjtcblxuaW1wb3J0IHtpc0VtcHR5LCBjbG9uZURlZXAsIGludmVydH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7WklUSV9EQVRBX1NFUlZJQ0UsIFppdGlEYXRhU2VydmljZX0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL3ppdGktZGF0YS5zZXJ2aWNlXCI7XG5pbXBvcnQge0dyb3dsZXJTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vbWVzc2FnaW5nL2dyb3dsZXIuc2VydmljZVwiO1xuaW1wb3J0IHtTZXJ2aWNlUG9saWN5Rm9ybVNlcnZpY2UsIFNFUlZJQ0VfUE9MSUNZX0VYVEVOU0lPTl9TRVJWSUNFfSBmcm9tICcuL3NlcnZpY2UtcG9saWN5LWZvcm0uc2VydmljZSc7XG5pbXBvcnQge01hdERpYWxvZ1JlZn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RpYWxvZ1wiO1xuaW1wb3J0IHtFeHRlbnNpb25TZXJ2aWNlfSBmcm9tIFwiLi4vLi4vZXh0ZW5kYWJsZS9leHRlbnNpb25zLW5vb3Auc2VydmljZVwiO1xuaW1wb3J0IHtTZXJ2aWNlUG9saWN5fSBmcm9tIFwiLi4vLi4vLi4vbW9kZWxzL3NlcnZpY2UtcG9saWN5XCI7XG5pbXBvcnQge0dyb3dsZXJNb2RlbH0gZnJvbSBcIi4uLy4uL21lc3NhZ2luZy9ncm93bGVyLm1vZGVsXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1zZXJ2aWNlLXBvbGljeS1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlcnZpY2UtcG9saWN5LWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zZXJ2aWNlLXBvbGljeS1mb3JtLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE1hdERpYWxvZ1JlZixcbiAgICAgIHVzZVZhbHVlOiB7fVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlUG9saWN5Rm9ybUNvbXBvbmVudCBleHRlbmRzIFByb2plY3RhYmxlRm9ybSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xuICBASW5wdXQoKSBmb3JtRGF0YTogU2VydmljZVBvbGljeSB8IGFueSA9IHt9O1xuICBASW5wdXQoKSBzZXJ2aWNlUm9sZUF0dHJpYnV0ZXM6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIHNlcnZpY2VOYW1lZEF0dHJpYnV0ZXM6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIHNlcnZpY2VOYW1lZEF0dHJpYnV0ZXNNYXAgPSB7fTtcbiAgQElucHV0KCkgaWRlbnRpdHlSb2xlQXR0cmlidXRlczogYW55W10gPSBbXTtcbiAgQElucHV0KCkgaWRlbnRpdHlOYW1lZEF0dHJpYnV0ZXM6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIGlkZW50aXR5TmFtZWRBdHRyaWJ1dGVzTWFwID0ge307XG4gIEBJbnB1dCgpIHBvc3R1cmVSb2xlQXR0cmlidXRlczogYW55W10gPSBbXTtcbiAgQElucHV0KCkgcG9zdHVyZU5hbWVkQXR0cmlidXRlczogYW55W10gPSBbXTtcbiAgQElucHV0KCkgcG9zdHVyZU5hbWVkQXR0cmlidXRlc01hcCA9IHt9O1xuICBAT3V0cHV0KCkgY2xvc2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgc2VsZWN0ZWRTZXJ2aWNlUm9sZUF0dHJpYnV0ZXMgPSBbXTtcbiAgc2VsZWN0ZWRTZXJ2aWNlTmFtZWRBdHRyaWJ1dGVzID0gW107XG4gIHNlbGVjdGVkSWRlbnRpdHlSb2xlQXR0cmlidXRlcyA9IFtdO1xuICBzZWxlY3RlZElkZW50aXR5TmFtZWRBdHRyaWJ1dGVzID0gW107XG4gIHNlbGVjdGVkUG9zdHVyZVJvbGVBdHRyaWJ1dGVzID0gW107XG4gIHNlbGVjdGVkUG9zdHVyZU5hbWVkQXR0cmlidXRlcyA9IFtdO1xuXG4gIGZvcm1WaWV3ID0gJ3NpbXBsZSc7XG4gIGlzRWRpdGluZyA9IGZhbHNlO1xuICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgc2VydmljZXNMb2FkaW5nID0gZmFsc2U7XG4gIGlkZW50aXRpZXNMb2FkaW5nID0gZmFsc2U7XG4gIHBvc3R1cmVDaGVja3NMb2FkaW5nID0gZmFsc2U7XG5cbiAgc2hvd01vcmUgPSBmYWxzZTtcbiAgc2V0dGluZ3M6IGFueSA9IHt9O1xuICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIEBJbmplY3QoU0VUVElOR1NfU0VSVklDRSkgcHVibGljIHNldHRpbmdzU2VydmljZTogU2V0dGluZ3NTZXJ2aWNlLFxuICAgICAgcHVibGljIHN2YzogU2VydmljZVBvbGljeUZvcm1TZXJ2aWNlLFxuICAgICAgQEluamVjdChaSVRJX0RBVEFfU0VSVklDRSkgcHJpdmF0ZSB6aXRpU2VydmljZTogWml0aURhdGFTZXJ2aWNlLFxuICAgICAgZ3Jvd2xlclNlcnZpY2U6IEdyb3dsZXJTZXJ2aWNlLFxuICAgICAgQEluamVjdChTRVJWSUNFX1BPTElDWV9FWFRFTlNJT05fU0VSVklDRSkgZXh0U2VydmljZTogRXh0ZW5zaW9uU2VydmljZVxuICApIHtcbiAgICBzdXBlcihncm93bGVyU2VydmljZSwgZXh0U2VydmljZSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICAgIHRoaXMuc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzQ2hhbmdlLnN1YnNjcmliZSgocmVzdWx0czphbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnNldHRpbmdzID0gcmVzdWx0cztcbiAgICAgICAgfSlcbiAgICApO1xuICAgIGlmIChpc0VtcHR5KHRoaXMuZm9ybURhdGEuaWQpKSB7XG4gICAgICB0aGlzLmZvcm1EYXRhID0gbmV3IFNlcnZpY2VQb2xpY3koKTtcbiAgICB9XG4gICAgdGhpcy5pbml0RGF0YSA9IGNsb25lRGVlcCh0aGlzLmZvcm1EYXRhKTtcbiAgICB0aGlzLmluaXRTZWxlY3RlZEF0dHJpYnV0ZXMoKTtcbiAgICB0aGlzLmV4dFNlcnZpY2UudXBkYXRlRm9ybURhdGEodGhpcy5mb3JtRGF0YSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICB0aGlzLmV4dFNlcnZpY2UuZm9ybURhdGFDaGFuZ2VkLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhLmlzRW1wdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5mb3JtRGF0YSA9IGRhdGE7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN2Yy5zZXJ2aWNlTmFtZWRBdHRyaWJ1dGVzTWFwID0gdGhpcy5zZXJ2aWNlTmFtZWRBdHRyaWJ1dGVzTWFwO1xuICAgIHRoaXMuc3ZjLmlkZW50aXR5TmFtZWRBdHRyaWJ1dGVzTWFwID0gdGhpcy5pZGVudGl0eU5hbWVkQXR0cmlidXRlc01hcDtcbiAgICB0aGlzLmluaXREYXRhID0gY2xvbmVEZWVwKHRoaXMuZm9ybURhdGEpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5leHRTZXJ2aWNlLmNsb3NlZC5lbWl0KHt9KTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIHRoaXMuaXNFZGl0aW5nID0gIWlzRW1wdHkodGhpcy5mb3JtRGF0YS5pZCk7XG4gIH1cblxuICBpbml0U2VsZWN0ZWRBdHRyaWJ1dGVzKCkge1xuICAgIGlmIChpc0VtcHR5KHRoaXMuZm9ybURhdGEuaWQpKSB7XG4gICAgICB0aGlzLnN2Yy5hc3NvY2lhdGVkU2VydmljZXMgPSBbXTtcbiAgICAgIHRoaXMuc3ZjLmFzc29jaWF0ZWRTZXJ2aWNlTmFtZXMgPSBbXTtcbiAgICAgIHRoaXMuc3ZjLmFzc29jaWF0ZWRJZGVudGl0aWVzID0gW107XG4gICAgICB0aGlzLnN2Yy5hc3NvY2lhdGVkSWRlbnRpdHlOYW1lcyA9IFtdO1xuICAgICAgdGhpcy5zdmMuYXNzb2NpYXRlZFBvc3R1cmVDaGVja3MgPSBbXTtcbiAgICAgIHRoaXMuc3ZjLmFzc29jaWF0ZWRQb3N0dXJlQ2hlY2tOYW1lcyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZXJ2aWNlSWRBdHRyaWJ1dGVzTWFwID0gaW52ZXJ0KHRoaXMuc2VydmljZU5hbWVkQXR0cmlidXRlc01hcCk7XG4gICAgY29uc3QgaWRlbnRpdHlJZEF0dHJpYnV0ZXNNYXAgPSBpbnZlcnQodGhpcy5pZGVudGl0eU5hbWVkQXR0cmlidXRlc01hcCk7XG4gICAgY29uc3QgcG9zdHVyZUlkQXR0cmlidXRlc01hcCA9IGludmVydCh0aGlzLnBvc3R1cmVOYW1lZEF0dHJpYnV0ZXNNYXApO1xuICAgIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlUm9sZUF0dHJpYnV0ZXMgPSBbXTtcbiAgICB0aGlzLnNlbGVjdGVkU2VydmljZU5hbWVkQXR0cmlidXRlcyA9IFtdO1xuICAgIHRoaXMuc2VsZWN0ZWRJZGVudGl0eVJvbGVBdHRyaWJ1dGVzID0gW107XG4gICAgdGhpcy5zZWxlY3RlZElkZW50aXR5TmFtZWRBdHRyaWJ1dGVzID0gW107XG4gICAgdGhpcy5zZWxlY3RlZFBvc3R1cmVSb2xlQXR0cmlidXRlcyA9IFtdO1xuICAgIHRoaXMuc2VsZWN0ZWRQb3N0dXJlTmFtZWRBdHRyaWJ1dGVzID0gW107XG4gICAgdGhpcy5mb3JtRGF0YS5zZXJ2aWNlUm9sZXM/LmZvckVhY2goYXR0ciA9PiB7XG4gICAgICBpZiAoYXR0ci5pbmRleE9mKCdAJykgPT09IDApIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFNlcnZpY2VOYW1lZEF0dHJpYnV0ZXMucHVzaChzZXJ2aWNlSWRBdHRyaWJ1dGVzTWFwW2F0dHIuc3Vic3RyaW5nKDEpXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdGVkU2VydmljZVJvbGVBdHRyaWJ1dGVzLnB1c2goYXR0ci5zdWJzdHJpbmcoMSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZm9ybURhdGEuaWRlbnRpdHlSb2xlcz8uZm9yRWFjaChhdHRyID0+IHtcbiAgICAgIGlmIChhdHRyLmluZGV4T2YoJ0AnKSA9PT0gMCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkSWRlbnRpdHlOYW1lZEF0dHJpYnV0ZXMucHVzaChpZGVudGl0eUlkQXR0cmlidXRlc01hcFthdHRyLnN1YnN0cmluZygxKV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZElkZW50aXR5Um9sZUF0dHJpYnV0ZXMucHVzaChhdHRyLnN1YnN0cmluZygxKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5mb3JtRGF0YS5wb3N0dXJlQ2hlY2tSb2xlcz8uZm9yRWFjaChhdHRyID0+IHtcbiAgICAgIGlmIChhdHRyLmluZGV4T2YoJ0AnKSA9PT0gMCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUG9zdHVyZU5hbWVkQXR0cmlidXRlcy5wdXNoKHBvc3R1cmVJZEF0dHJpYnV0ZXNNYXBbYXR0ci5zdWJzdHJpbmcoMSldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQb3N0dXJlUm9sZUF0dHJpYnV0ZXMucHVzaChhdHRyLnN1YnN0cmluZygxKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5zdmMuZ2V0QXNzb2NpYXRlZFNlcnZpY2VzQnlBdHRyaWJ1dGUodGhpcy5zZWxlY3RlZFNlcnZpY2VSb2xlQXR0cmlidXRlcywgdGhpcy5zZWxlY3RlZFNlcnZpY2VOYW1lZEF0dHJpYnV0ZXMpO1xuICAgIHRoaXMuc3ZjLmdldEFzc29jaWF0ZWRJZGVudGl0aWVzQnlBdHRyaWJ1dGUodGhpcy5zZWxlY3RlZElkZW50aXR5Um9sZUF0dHJpYnV0ZXMsIHRoaXMuc2VsZWN0ZWRJZGVudGl0eU5hbWVkQXR0cmlidXRlcyk7XG4gICAgdGhpcy5zdmMuZ2V0QXNzb2NpYXRlZFBvc3R1cmVDaGVja3NCeUF0dHJpYnV0ZSh0aGlzLnNlbGVjdGVkUG9zdHVyZVJvbGVBdHRyaWJ1dGVzLCB0aGlzLnNlbGVjdGVkUG9zdHVyZU5hbWVkQXR0cmlidXRlcyk7XG4gIH1cblxuICBoZWFkZXJBY3Rpb25SZXF1ZXN0ZWQoYWN0aW9uKSB7XG4gICAgc3dpdGNoKGFjdGlvbi5uYW1lKSB7XG4gICAgICBjYXNlICdzYXZlJzpcbiAgICAgICAgdGhpcy5zYXZlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY2xvc2UnOlxuICAgICAgICB0aGlzLmNsb3NlTW9kYWwodHJ1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9nZ2xlLXZpZXcnOlxuICAgICAgICB0aGlzLmZvcm1WaWV3ID0gYWN0aW9uLmRhdGE7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNhdmUoZXZlbnQ/KSB7XG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICBjb25zdCBpc0V4dFZhbGlkID0gYXdhaXQgdGhpcy5leHRTZXJ2aWNlLnZhbGlkYXRlRGF0YSgpO1xuICAgIGlmKCFpc1ZhbGlkIHx8ICFpc0V4dFZhbGlkKSB7XG4gICAgICBjb25zdCBncm93bGVyRGF0YSA9IG5ldyBHcm93bGVyTW9kZWwoXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICAnRXJyb3InLFxuICAgICAgICAgIGBEYXRhIEludmFsaWRgLFxuICAgICAgICAgIGBTZXJ2aWNlIFBvbGljeSBkYXRhIGlzIGludmFsaWQuIFBsZWFzZSB1cGRhdGUgdGhlIGhpZ2hsaWdodGVkIGZpZWxkcyBhbmQgdHJ5IGFnYWluLmAsXG4gICAgICApO1xuICAgICAgdGhpcy5ncm93bGVyU2VydmljZS5zaG93KGdyb3dsZXJEYXRhKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5hcHBseVNlbGVjdGVkQXR0cmlidXRlcygpO1xuICAgIHRoaXMuc3ZjLnNhdmUodGhpcy5mb3JtRGF0YSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0Py5jbG9zZSkge1xuICAgICAgICB0aGlzLmNsb3NlTW9kYWwodHJ1ZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhID0gcmVzdWx0Py5kYXRhPy5pZCA/IHJlc3VsdC5kYXRhIDogcmVzdWx0O1xuICAgICAgaWYgKCFpc0VtcHR5KGRhdGEuaWQpKSB7XG4gICAgICAgIHRoaXMuZm9ybURhdGEgPSBkYXRhIHx8IHRoaXMuZm9ybURhdGE7XG4gICAgICAgIHRoaXMuaW5pdERhdGEgPSB0aGlzLmZvcm1EYXRhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbml0RGF0YSA9IHRoaXMuZm9ybURhdGE7XG4gICAgICB9XG4gICAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgYXBwbHlTZWxlY3RlZEF0dHJpYnV0ZXMoKSB7XG4gICAgdGhpcy5mb3JtRGF0YS5zZXJ2aWNlUm9sZXMgPSB0aGlzLnN2Yy5nZXRTZWxlY3RlZFJvbGVzKHRoaXMuc2VsZWN0ZWRTZXJ2aWNlUm9sZUF0dHJpYnV0ZXMsIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlTmFtZWRBdHRyaWJ1dGVzLCB0aGlzLnNlcnZpY2VOYW1lZEF0dHJpYnV0ZXNNYXApO1xuICAgIHRoaXMuZm9ybURhdGEuaWRlbnRpdHlSb2xlcyA9IHRoaXMuc3ZjLmdldFNlbGVjdGVkUm9sZXModGhpcy5zZWxlY3RlZElkZW50aXR5Um9sZUF0dHJpYnV0ZXMsIHRoaXMuc2VsZWN0ZWRJZGVudGl0eU5hbWVkQXR0cmlidXRlcywgdGhpcy5pZGVudGl0eU5hbWVkQXR0cmlidXRlc01hcCk7XG4gICAgdGhpcy5mb3JtRGF0YS5wb3N0dXJlQ2hlY2tSb2xlcyA9IHRoaXMuc3ZjLmdldFNlbGVjdGVkUm9sZXModGhpcy5zZWxlY3RlZFBvc3R1cmVSb2xlQXR0cmlidXRlcywgdGhpcy5zZWxlY3RlZFBvc3R1cmVOYW1lZEF0dHJpYnV0ZXMsIHRoaXMucG9zdHVyZU5hbWVkQXR0cmlidXRlc01hcCk7XG4gIH1cblxuICB2YWxpZGF0ZSgpIHtcbiAgICB0aGlzLmVycm9ycyA9IHt9O1xuICAgIGlmIChpc0VtcHR5KHRoaXMuZm9ybURhdGEubmFtZSkpIHtcbiAgICAgIHRoaXMuZXJyb3JzWyduYW1lJ10gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaXNFbXB0eSh0aGlzLmVycm9ycyk7XG4gIH1cblxuICBhcGlBY3Rpb25SZXF1ZXN0ZWQoYWN0aW9uKSB7XG4gICAgc3dpdGNoIChhY3Rpb24uaWQpIHtcbiAgICAgIGNhc2UgJ2NsaSc6XG4gICAgICAgIHRoaXMuY29weUNMSUNvbW1hbmQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjdXJsJzpcbiAgICAgICAgdGhpcy5jb3B5Q1VSTENvbW1hbmQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgY29weUNMSUNvbW1hbmQoKSB7XG4gICAgY29uc3Qgc2VydmljZVJvbGVzID0gdGhpcy5zdmMuZ2V0U2VsZWN0ZWRSb2xlcyh0aGlzLnNlbGVjdGVkU2VydmljZVJvbGVBdHRyaWJ1dGVzLCB0aGlzLnNlbGVjdGVkU2VydmljZU5hbWVkQXR0cmlidXRlcywgdGhpcy5zZXJ2aWNlTmFtZWRBdHRyaWJ1dGVzTWFwKTtcbiAgICBjb25zdCBzZXJ2aWNlUm9sZXNWYXIgPSB0aGlzLmdldFJvbGVzQ0xJVmFyaWFibGUoc2VydmljZVJvbGVzKTtcblxuICAgIGNvbnN0IGlkZW50aXR5Um9sZXMgPSB0aGlzLnN2Yy5nZXRTZWxlY3RlZFJvbGVzKHRoaXMuc2VsZWN0ZWRJZGVudGl0eVJvbGVBdHRyaWJ1dGVzLCB0aGlzLnNlbGVjdGVkSWRlbnRpdHlOYW1lZEF0dHJpYnV0ZXMsIHRoaXMuaWRlbnRpdHlOYW1lZEF0dHJpYnV0ZXNNYXApO1xuICAgIGNvbnN0IGlkZW50aXR5Um9sZXNWYXIgPSB0aGlzLmdldFJvbGVzQ0xJVmFyaWFibGUoaWRlbnRpdHlSb2xlcyk7XG5cbiAgICBjb25zdCBwY1JvbGVzID0gdGhpcy5zdmMuZ2V0U2VsZWN0ZWRSb2xlcyh0aGlzLnNlbGVjdGVkUG9zdHVyZVJvbGVBdHRyaWJ1dGVzLCB0aGlzLnNlbGVjdGVkUG9zdHVyZU5hbWVkQXR0cmlidXRlcywgdGhpcy5wb3N0dXJlTmFtZWRBdHRyaWJ1dGVzTWFwKTtcbiAgICBjb25zdCBwY1JvbGVzVmFyID0gdGhpcy5nZXRSb2xlc0NMSVZhcmlhYmxlKHBjUm9sZXMpO1xuXG4gICAgY29uc3QgY29tbWFuZCA9IGB6aXRpIGVkZ2UgJHt0aGlzLmZvcm1EYXRhLmlkID8gJ3VwZGF0ZScgOiAnY3JlYXRlJ30gc2VydmljZS1wb2xpY3kgJHt0aGlzLmZvcm1EYXRhLmlkID8gYCcke3RoaXMuZm9ybURhdGEuaWR9J2AgOiAnJ30gJHt0aGlzLmZvcm1EYXRhLmlkID8gJy0tbmFtZScgOiAnJ30gJyR7dGhpcy5mb3JtRGF0YS5uYW1lfScgJHt0aGlzLmZvcm1EYXRhLmlkID8gJycgOiB0aGlzLmZvcm1EYXRhLnR5cGV9JHt0aGlzLmZvcm1EYXRhLmlkID8gJycgOiBgIC0tc2VtYW50aWMgJyR7dGhpcy5mb3JtRGF0YS5zZW1hbnRpY30nYH0gLS1zZXJ2aWNlLXJvbGVzICcke3NlcnZpY2VSb2xlc1Zhcn0nIC0taWRlbnRpdHktcm9sZXMgJyR7aWRlbnRpdHlSb2xlc1Zhcn0nIC0tcG9zdHVyZS1jaGVjay1yb2xlcyAnJHtwY1JvbGVzVmFyfSdgO1xuXG4gICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoY29tbWFuZCk7XG4gICAgY29uc3QgZ3Jvd2xlckRhdGEgPSBuZXcgR3Jvd2xlck1vZGVsKFxuICAgICAgICAnc3VjY2VzcycsXG4gICAgICAgICdTdWNjZXNzJyxcbiAgICAgICAgYFRleHQgQ29waWVkYCxcbiAgICAgICAgYENMSSBjb21tYW5kIGNvcGllZCB0byBjbGlwYm9hcmRgLFxuICAgICk7XG4gICAgdGhpcy5ncm93bGVyU2VydmljZS5zaG93KGdyb3dsZXJEYXRhKTtcbiAgfVxuXG4gIGNvcHlDVVJMQ29tbWFuZCgpIHtcbiAgICBjb25zdCBzZXJ2aWNlUm9sZXMgPSB0aGlzLnN2Yy5nZXRTZWxlY3RlZFJvbGVzKHRoaXMuc2VsZWN0ZWRTZXJ2aWNlUm9sZUF0dHJpYnV0ZXMsIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlTmFtZWRBdHRyaWJ1dGVzLCB0aGlzLnNlcnZpY2VOYW1lZEF0dHJpYnV0ZXNNYXApO1xuICAgIGNvbnN0IHNlcnZpY2VSb2xlc1ZhciA9IHRoaXMuZ2V0Um9sZXNDVVJMVmFyaWFibGUoc2VydmljZVJvbGVzKTtcblxuICAgIGNvbnN0IGlkZW50aXR5Um9sZXMgPSB0aGlzLnN2Yy5nZXRTZWxlY3RlZFJvbGVzKHRoaXMuc2VsZWN0ZWRJZGVudGl0eVJvbGVBdHRyaWJ1dGVzLCB0aGlzLnNlbGVjdGVkSWRlbnRpdHlOYW1lZEF0dHJpYnV0ZXMsIHRoaXMuaWRlbnRpdHlOYW1lZEF0dHJpYnV0ZXNNYXApO1xuICAgIGNvbnN0IGlkZW50aXR5Um9sZXNWYXIgPSB0aGlzLmdldFJvbGVzQ1VSTFZhcmlhYmxlKGlkZW50aXR5Um9sZXMpO1xuXG4gICAgY29uc3QgcGNSb2xlcyA9IHRoaXMuc3ZjLmdldFNlbGVjdGVkUm9sZXModGhpcy5zZWxlY3RlZFBvc3R1cmVSb2xlQXR0cmlidXRlcywgdGhpcy5zZWxlY3RlZFBvc3R1cmVOYW1lZEF0dHJpYnV0ZXMsIHRoaXMucG9zdHVyZU5hbWVkQXR0cmlidXRlc01hcCk7XG4gICAgY29uc3QgcGNSb2xlc1ZhciA9IHRoaXMuZ2V0Um9sZXNDVVJMVmFyaWFibGUocGNSb2xlcyk7XG5cbiAgICBjb25zdCBjb21tYW5kID0gYGN1cmwgJyR7dGhpcy5hcGlDYWxsVVJMfScgXFxcXCAke3RoaXMuZm9ybURhdGEuaWQgPyAnLS1yZXF1ZXN0IFBBVENIIFxcXFwnIDogJ1xcXFwnfSAtSCAnYWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uJyBcXFxcIC1IICdjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb24nIFxcXFwgLUggJ3p0LXNlc3Npb246ICR7dGhpcy5zZXR0aW5ncy5zZXNzaW9uLmlkfScgXFxcXCAtLWRhdGEtcmF3ICd7XCJuYW1lXCI6XCIke3RoaXMuZm9ybURhdGEubmFtZX1cIixcInNlcnZpY2VSb2xlc1wiOiR7c2VydmljZVJvbGVzVmFyfSxcImlkZW50aXR5Um9sZXNcIjoke2lkZW50aXR5Um9sZXNWYXJ9LFwicG9zdHVyZUNoZWNrUm9sZXNcIjoke3BjUm9sZXNWYXJ9LFwic2VtYW50aWNcIjpcIiR7dGhpcy5mb3JtRGF0YS5zZW1hbnRpY31cIixcInR5cGVcIjpcIiR7dGhpcy5mb3JtRGF0YS50eXBlfVwifSdgO1xuXG4gICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoY29tbWFuZCk7XG4gICAgY29uc3QgZ3Jvd2xlckRhdGEgPSBuZXcgR3Jvd2xlck1vZGVsKFxuICAgICAgICAnc3VjY2VzcycsXG4gICAgICAgICdTdWNjZXNzJyxcbiAgICAgICAgYFRleHQgQ29waWVkYCxcbiAgICAgICAgYENVUkwgY29tbWFuZCBjb3BpZWQgdG8gY2xpcGJvYXJkYCxcbiAgICApO1xuICAgIHRoaXMuZ3Jvd2xlclNlcnZpY2Uuc2hvdyhncm93bGVyRGF0YSk7XG4gIH1cblxuICBnZXQgYXBpQ2FsbFVSTCgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5zZWxlY3RlZEVkZ2VDb250cm9sbGVyICsgJy9lZGdlL21hbmFnZW1lbnQvdjEvc2VydmljZS1wb2xpY2llcycgKyAodGhpcy5mb3JtRGF0YS5pZCA/IGAvJHt0aGlzLmZvcm1EYXRhLmlkfWAgOiAnJyk7XG4gIH1cblxuICBnZXQgYXBpRGF0YSgpIHtcbiAgICBjb25zdCBkYXRhOiBhbnkgPSB7XG4gICAgICBuYW1lOiB0aGlzLmZvcm1EYXRhPy5uYW1lIHx8ICcnLFxuICAgICAgYXBwRGF0YTogdGhpcy5mb3JtRGF0YT8uYXBwRGF0YSB8fCAnJyxcbiAgICAgIHNlcnZpY2VSb2xlczogdGhpcy5zdmMuZ2V0U2VsZWN0ZWRSb2xlcyh0aGlzLnNlbGVjdGVkU2VydmljZVJvbGVBdHRyaWJ1dGVzLCB0aGlzLnNlbGVjdGVkU2VydmljZU5hbWVkQXR0cmlidXRlcywgdGhpcy5zZXJ2aWNlTmFtZWRBdHRyaWJ1dGVzTWFwKSxcbiAgICAgIGlkZW50aXR5Um9sZXM6IHRoaXMuc3ZjLmdldFNlbGVjdGVkUm9sZXModGhpcy5zZWxlY3RlZElkZW50aXR5Um9sZUF0dHJpYnV0ZXMsIHRoaXMuc2VsZWN0ZWRJZGVudGl0eU5hbWVkQXR0cmlidXRlcywgdGhpcy5pZGVudGl0eU5hbWVkQXR0cmlidXRlc01hcCksXG4gICAgICBwb3N0dXJlQ2hlY2tSb2xlczogdGhpcy5zdmMuZ2V0U2VsZWN0ZWRSb2xlcyh0aGlzLnNlbGVjdGVkUG9zdHVyZVJvbGVBdHRyaWJ1dGVzLCB0aGlzLnNlbGVjdGVkUG9zdHVyZU5hbWVkQXR0cmlidXRlcywgdGhpcy5wb3N0dXJlTmFtZWRBdHRyaWJ1dGVzTWFwKSxcbiAgICAgIHNlbWFudGljOiB0aGlzLmZvcm1EYXRhLnNlbWFudGljLFxuICAgICAgdHlwZTogdGhpcy5mb3JtRGF0YS50eXBlXG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgX2FwaURhdGEgPSB7fTtcbiAgc2V0IGFwaURhdGEoZGF0YSkge1xuICAgIHRoaXMuX2FwaURhdGEgPSBkYXRhO1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJwcm9qZWN0YWJsZS1mb3JtLXdyYXBwZXJcIlxuICAgICAoa2V5dXAuZW50ZXIpPVwic2F2ZSgkZXZlbnQpXCJcbiAgICAgKGtleXVwLmVzY2FwZSk9XCJjbG9zZU1vZGFsKGZhbHNlKVwiXG4+XG4gICAgPGxpYi1mb3JtLWhlYWRlclxuICAgICAgICAgICAgW2RhdGFdPVwiZm9ybURhdGFcIlxuICAgICAgICAgICAgW3RpdGxlXT1cImZvcm1EYXRhLmlkID8gJ0VkaXQgU2VydmljZSBQb2xpY3k6ICcgOiAnQ3JlYXRlIE5ldyBTZXJ2aWNlIFBvbGljeSdcIlxuICAgICAgICAgICAgW21vcmVBY3Rpb25zXT1cIm1vcmVBY3Rpb25zXCJcbiAgICAgICAgICAgIChhY3Rpb25SZXF1ZXN0ZWQpPVwiaGVhZGVyQWN0aW9uUmVxdWVzdGVkKCRldmVudClcIlxuICAgICAgICAgICAgWyhmb3JtVmlldyldPVwiZm9ybVZpZXdcIlxuICAgID48L2xpYi1mb3JtLWhlYWRlcj5cbiAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1wb2xpY3ktZm9ybS1jb250YWluZXIgcHJvamVjdGFibGUtZm9ybS1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb2plY3RhYmxlLWZvcm0tbWFpbi1jb2x1bW4gZm9ybS1ncm91cC1yb3dcIiAqbmdJZj1cImZvcm1WaWV3ID09PSAnc2ltcGxlJ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAtY29sdW1uIHRocmVlLWZpZnRoc1wiPlxuICAgICAgICAgICAgICAgIDxsaWItZm9ybS1maWVsZC1jb250YWluZXIgW3RpdGxlXT1cIidTZXJ2aWNlIFBvbGljeSBOYW1lJ1wiIFtsYWJlbF09XCInUkVRVUlSRUQnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1maWVsZC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJOYW1lIHRoaXMgZWRnZSBzZXJ2aWNlIHBvbGljeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie2Vycm9yOiBlcnJvcnNbJ25hbWUnXX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZm9ybURhdGEubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2ZvY3VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgI25hbWVGaWVsZElucHV0XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9saWItZm9ybS1maWVsZC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGxpYi1mb3JtLWZpZWxkLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidTZWxlY3QgU2VydmljZSBBdHRyaWJ1dGVzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ09QVElPTkFMJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29udGVudFN0eWxlXT1cIid6LWluZGV4OiAxMDAwMDMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtoZWxwVGV4dF09XCInQ2hvb3NlIHdoaWNoIHNlcnZpY2VzIHRvIGFzc29jaWF0ZSB0byB0aGlzIHBvbGljeSBieSBwaWNraW5nIGZyb20gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGF0dHJpYnV0ZXMnXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItdGFnLXNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZWxlY3RlZFJvbGVBdHRyaWJ1dGVzKV09XCJzZWxlY3RlZFNlcnZpY2VSb2xlQXR0cmlidXRlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZWxlY3RlZE5hbWVkQXR0cmlidXRlcyldPVwic2VsZWN0ZWRTZXJ2aWNlTmFtZWRBdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXZhaWxhYmxlUm9sZUF0dHJpYnV0ZXNdPVwic2VydmljZVJvbGVBdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXZhaWxhYmxlTmFtZWRBdHRyaWJ1dGVzXT1cInNlcnZpY2VOYW1lZEF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZE5hbWVkQXR0cmlidXRlc0NoYW5nZSk9XCJzdmMuZ2V0QXNzb2NpYXRlZFNlcnZpY2VzQnlBdHRyaWJ1dGUoc2VsZWN0ZWRTZXJ2aWNlUm9sZUF0dHJpYnV0ZXMsIHNlbGVjdGVkU2VydmljZU5hbWVkQXR0cmlidXRlcylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZFJvbGVBdHRyaWJ1dGVzQ2hhbmdlKT1cInN2Yy5nZXRBc3NvY2lhdGVkU2VydmljZXNCeUF0dHJpYnV0ZShzZWxlY3RlZFNlcnZpY2VSb2xlQXR0cmlidXRlcywgc2VsZWN0ZWRTZXJ2aWNlTmFtZWRBdHRyaWJ1dGVzKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3Qgc2VydmljZSBhdHRyaWJ1dGVzJ1wiXG4gICAgICAgICAgICAgICAgICAgID48L2xpYi10YWctc2VsZWN0b3I+XG4gICAgICAgICAgICAgICAgPC9saWItZm9ybS1maWVsZC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGxpYi1mb3JtLWZpZWxkLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidTZWxlY3QgSWRlbnRpdHkgQXR0cmlidXRlcydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidPUFRJT05BTCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRlbnRTdHlsZV09XCInei1pbmRleDogMTAwMDAyJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaGVscFRleHRdPVwiJ0Nob29zZSB3aGljaCBpZGVudGl0aWVzIHRvIGFzc29jaWF0ZSB0byB0aGlzIHBvbGljeSBieSBwaWNraW5nIGZyb20gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGF0dHJpYnV0ZXMnXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItdGFnLXNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZWxlY3RlZFJvbGVBdHRyaWJ1dGVzKV09XCJzZWxlY3RlZElkZW50aXR5Um9sZUF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2VsZWN0ZWROYW1lZEF0dHJpYnV0ZXMpXT1cInNlbGVjdGVkSWRlbnRpdHlOYW1lZEF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdmFpbGFibGVSb2xlQXR0cmlidXRlc109XCJpZGVudGl0eVJvbGVBdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXZhaWxhYmxlTmFtZWRBdHRyaWJ1dGVzXT1cImlkZW50aXR5TmFtZWRBdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWROYW1lZEF0dHJpYnV0ZXNDaGFuZ2UpPVwic3ZjLmdldEFzc29jaWF0ZWRJZGVudGl0aWVzQnlBdHRyaWJ1dGUoc2VsZWN0ZWRJZGVudGl0eVJvbGVBdHRyaWJ1dGVzLCBzZWxlY3RlZElkZW50aXR5TmFtZWRBdHRyaWJ1dGVzKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkUm9sZUF0dHJpYnV0ZXNDaGFuZ2UpPVwic3ZjLmdldEFzc29jaWF0ZWRJZGVudGl0aWVzQnlBdHRyaWJ1dGUoc2VsZWN0ZWRJZGVudGl0eVJvbGVBdHRyaWJ1dGVzLCBzZWxlY3RlZElkZW50aXR5TmFtZWRBdHRyaWJ1dGVzKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3QgaWRlbnRpdHkgYXR0cmlidXRlcydcIlxuICAgICAgICAgICAgICAgICAgICA+PC9saWItdGFnLXNlbGVjdG9yPlxuICAgICAgICAgICAgICAgIDwvbGliLWZvcm0tZmllbGQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxsaWItZm9ybS1maWVsZC1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInU2VsZWN0IFBvc3R1cmUgQ2hlY2sgQXR0cmlidXRlcydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidPUFRJT05BTCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRlbnRTdHlsZV09XCInei1pbmRleDogMTAwMDAxJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaGVscFRleHRdPVwiJ0Nob29zZSB3aGljaCBwb3N0dXJlIGNoZWNrcyB0byBhc3NvY2lhdGUgdG8gdGhpcyBwb2xpY3kgYnkgcGlja2luZyBmcm9tIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBhdHRyaWJ1dGVzJ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bGliLXRhZy1zZWxlY3RvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2VsZWN0ZWRSb2xlQXR0cmlidXRlcyldPVwic2VsZWN0ZWRQb3N0dXJlUm9sZUF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2VsZWN0ZWROYW1lZEF0dHJpYnV0ZXMpXT1cInNlbGVjdGVkUG9zdHVyZU5hbWVkQXR0cmlidXRlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZWxlY3RlZFJvbGVBdHRyaWJ1dGVzKV09XCJwb3N0dXJlUm9sZUF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdmFpbGFibGVOYW1lZEF0dHJpYnV0ZXNdPVwicG9zdHVyZU5hbWVkQXR0cmlidXRlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkTmFtZWRBdHRyaWJ1dGVzQ2hhbmdlKT1cInN2Yy5nZXRBc3NvY2lhdGVkUG9zdHVyZUNoZWNrc0J5QXR0cmlidXRlKHNlbGVjdGVkUG9zdHVyZVJvbGVBdHRyaWJ1dGVzLCBzZWxlY3RlZFBvc3R1cmVOYW1lZEF0dHJpYnV0ZXMpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRSb2xlQXR0cmlidXRlc0NoYW5nZSk9XCJzdmMuZ2V0QXNzb2NpYXRlZFBvc3R1cmVDaGVja3NCeUF0dHJpYnV0ZShzZWxlY3RlZFBvc3R1cmVSb2xlQXR0cmlidXRlcywgc2VsZWN0ZWRQb3N0dXJlTmFtZWRBdHRyaWJ1dGVzKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3QgcG9zdHVyZSBjaGVjayBhdHRyaWJ1dGVzJ1wiXG4gICAgICAgICAgICAgICAgICAgID48L2xpYi10YWctc2VsZWN0b3I+XG4gICAgICAgICAgICAgICAgPC9saWItZm9ybS1maWVsZC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGxpYi1mb3JtLWZpZWxkLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidUeXBlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGUyXT1cIidTZW1hbnRpYydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xheW91dF09XCIncm93J1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb3JtRGF0YS50eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIlBvbGljeVR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1maWVsZC1kcm9wZG93blwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJCaW5kXCI+QmluZDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkRpYWxcIj5EaWFsPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb3JtRGF0YS5zZW1hbnRpY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJQb2xpY3lTZW1hbnRpY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWZpZWxkLWRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkFueU9mXCI+QW55T2Y8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJBbGxPZlwiPkFsbE9mPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvbGliLWZvcm0tZmllbGQtY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cC1jb2x1bW4gdHdvLWZpZnRoc1wiPlxuICAgICAgICAgICAgICAgIDxsaWItZm9ybS1maWVsZC1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInQXNzb2NpYXRlZCBTZXJ2aWNlcydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvdW50XT1cInN2Yy5hc3NvY2lhdGVkU2VydmljZU5hbWVzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiJ2hpZGUtb3ZlcmZsb3cnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtoZWxwVGV4dF09XCInUHJldmlldyBsaXN0IG9mIGFsbCBzZXJ2aWNlcyB0aGF0IHRoaXMgU2VydmljZSBQb2xpY3kgaXMgYXNzb2NpYXRlZCB3aXRoLidcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1wcmV2aWV3LWxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xpY2thYmxlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNMb2FkaW5nXT1cInNlcnZpY2VzTG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FsbE5hbWVzXT1cInN2Yy5hc3NvY2lhdGVkU2VydmljZU5hbWVzXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbGliLXByZXZpZXctbGlzdD5cbiAgICAgICAgICAgICAgICA8L2xpYi1mb3JtLWZpZWxkLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bGliLWZvcm0tZmllbGQtY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0Fzc29jaWF0ZWQgSWRlbnRpdGllcydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvdW50XT1cInN2Yy5hc3NvY2lhdGVkSWRlbnRpdHlOYW1lcy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hlbHBUZXh0XT1cIidQcmV2aWV3IGxpc3Qgb2YgYWxsIElkZW50aXRpZXMgdGhhdCB0aGlzIFNlcnZpY2UgUG9saWN5IGlzIGFzc29jaWF0ZWQgd2l0aC4nXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItcHJldmlldy1saXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsaWNrYWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzTG9hZGluZ109XCJpZGVudGl0aWVzTG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FsbE5hbWVzXT1cInN2Yy5hc3NvY2lhdGVkSWRlbnRpdHlOYW1lc1wiXG4gICAgICAgICAgICAgICAgICAgID48L2xpYi1wcmV2aWV3LWxpc3Q+XG4gICAgICAgICAgICAgICAgPC9saWItZm9ybS1maWVsZC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGxpYi1mb3JtLWZpZWxkLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidBc3NvY2lhdGVkIFBvc3R1cmUgQ2hlY2tzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY291bnRdPVwic3ZjLmFzc29jaWF0ZWRQb3N0dXJlQ2hlY2tOYW1lcy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hlbHBUZXh0XT1cIidQcmV2aWV3IGxpc3Qgb2YgYWxsIFBvc3R1cmUgQ2hlY2tzIHRoYXQgdGhpcyBTZXJ2aWNlIFBvbGljeSBpcyBhc3NvY2lhdGVkIHdpdGguJ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bGliLXByZXZpZXctbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGlja2FibGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc0xvYWRpbmddPVwicG9zdHVyZUNoZWNrc0xvYWRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbGxOYW1lc109XCJzdmMuYXNzb2NpYXRlZFBvc3R1cmVDaGVja05hbWVzXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbGliLXByZXZpZXctbGlzdD5cbiAgICAgICAgICAgICAgICA8L2xpYi1mb3JtLWZpZWxkLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bGliLWZvcm0tZmllbGQtY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0FQSSBDYWxscydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hlYWRlckFjdGlvbnNdPVwiYXBpT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoYWN0aW9uUmVxdWVzdGVkKT1cImFwaUFjdGlvblJlcXVlc3RlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1maWVsZC1pbnB1dFwiIFt2YWx1ZV09XCJhcGlDYWxsVVJMXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tY29weSBjb3B5XCIgKGNsaWNrKT1cImNvcHlUb0NsaXBib2FyZChhcGlDYWxsVVJMKVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1qc29uLXZpZXcgKm5nSWY9XCJmb3JtRGF0YVwiIFsoZGF0YSldPVwiYXBpRGF0YVwiIFtyZWFkT25seV09XCJ0cnVlXCIgW3Nob3dDb3B5XT1cInRydWVcIj48L2xpYi1qc29uLXZpZXc+XG4gICAgICAgICAgICAgICAgPC9saWItZm9ybS1maWVsZC1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwLWNvbHVtblwiICpuZ0lmPVwiZm9ybVZpZXcgPT09ICdyYXcnXCI+XG4gICAgICAgICAgICA8bGliLWpzb24tdmlldyAqbmdJZj1cImZvcm1EYXRhXCIgWyhkYXRhKV09XCJmb3JtRGF0YVwiPjwvbGliLWpzb24tdmlldz5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxsaWItbG9hZGluZy1pbmRpY2F0b3IgKm5nSWY9XCJpc0xvYWRpbmdcIiBbaXNMb2FkaW5nXT1cImlzTG9hZGluZ1wiPjwvbGliLWxvYWRpbmctaW5kaWNhdG9yPiJdfQ==
|
|
277
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1wb2xpY3ktZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy96aXRpLWNvbnNvbGUtbGliL3NyYy9saWIvZmVhdHVyZXMvcHJvamVjdGFibGUtZm9ybXMvc2VydmljZS1wb2xpY3kvc2VydmljZS1wb2xpY3ktZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy96aXRpLWNvbnNvbGUtbGliL3NyYy9saWIvZmVhdHVyZXMvcHJvamVjdGFibGUtZm9ybXMvc2VydmljZS1wb2xpY3kvc2VydmljZS1wb2xpY3ktZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUlOLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFDLGdCQUFnQixFQUFrQixNQUFNLG9DQUFvQyxDQUFDO0FBRXJGLE9BQU8sRUFBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUNsRCxPQUFPLEVBQUMsaUJBQWlCLEVBQWtCLE1BQU0scUNBQXFDLENBQUM7QUFFdkYsT0FBTyxFQUEyQixnQ0FBZ0MsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQ3pHLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUV0RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDN0QsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLCtCQUErQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFHM0QsTUFXYSwwQkFBMkIsU0FBUSxlQUFlO0lBdUI3RCxZQUNxQyxlQUFnQyxFQUMxRCxHQUE2QixFQUNB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akMsMEJBQTBCLGlIQVAxQjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxZQUFZO2dCQUNyQixRQUFRLEVBQUUsRUFBRTthQUNiO1NBQ0Ysc0VDbkNILGszUkFvSnlGOztTRC9HNUUsMEJBQTBCOzRGQUExQiwwQkFBMEI7a0JBWHRDLFNBQVM7K0JBQ0UseUJBQXlCLGFBR3hCO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxZQUFZOzRCQUNyQixRQUFRLEVBQUUsRUFBRTt5QkFDYjtxQkFDRjs7MEJBMEJJLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFFdkIsTUFBTTsyQkFBQyxpQkFBaUI7OzBCQUV4QixNQUFNOzJCQUFDLGdDQUFnQzs4RkEzQm5DLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0ksS0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIEFmdGVyVmlld0luaXQsXG4gIEluamVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7UHJvamVjdGFibGVGb3JtfSBmcm9tIFwiLi4vcHJvamVjdGFibGUtZm9ybS5jbGFzc1wiO1xuaW1wb3J0IHtTRVRUSU5HU19TRVJWSUNFLCBTZXR0aW5nc1NlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9zZXR0aW5ncy5zZXJ2aWNlXCI7XG5cbmltcG9ydCB7aXNFbXB0eSwgY2xvbmVEZWVwLCBpbnZlcnR9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1pJVElfREFUQV9TRVJWSUNFLCBaaXRpRGF0YVNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy96aXRpLWRhdGEuc2VydmljZVwiO1xuaW1wb3J0IHtHcm93bGVyU2VydmljZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2luZy9ncm93bGVyLnNlcnZpY2VcIjtcbmltcG9ydCB7U2VydmljZVBvbGljeUZvcm1TZXJ2aWNlLCBTRVJWSUNFX1BPTElDWV9FWFRFTlNJT05fU0VSVklDRX0gZnJvbSAnLi9zZXJ2aWNlLXBvbGljeS1mb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHtNYXREaWFsb2dSZWZ9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2dcIjtcbmltcG9ydCB7RXh0ZW5zaW9uU2VydmljZX0gZnJvbSBcIi4uLy4uL2V4dGVuZGFibGUvZXh0ZW5zaW9ucy1ub29wLnNlcnZpY2VcIjtcbmltcG9ydCB7U2VydmljZVBvbGljeX0gZnJvbSBcIi4uLy4uLy4uL21vZGVscy9zZXJ2aWNlLXBvbGljeVwiO1xuaW1wb3J0IHtHcm93bGVyTW9kZWx9IGZyb20gXCIuLi8uLi9tZXNzYWdpbmcvZ3Jvd2xlci5tb2RlbFwiO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1zZXJ2aWNlLXBvbGljeS1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlcnZpY2UtcG9saWN5LWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zZXJ2aWNlLXBvbGljeS1mb3JtLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE1hdERpYWxvZ1JlZixcbiAgICAgIHVzZVZhbHVlOiB7fVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlUG9saWN5Rm9ybUNvbXBvbmVudCBleHRlbmRzIFByb2plY3RhYmxlRm9ybSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xuICBASW5wdXQoKSBmb3JtRGF0YTogU2VydmljZVBvbGljeSB8IGFueSA9IHt9O1xuICBAT3V0cHV0KCkgY2xvc2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgc2VsZWN0ZWRTZXJ2aWNlUm9sZUF0dHJpYnV0ZXMgPSBbXTtcbiAgc2VsZWN0ZWRTZXJ2aWNlTmFtZWRBdHRyaWJ1dGVzID0gW107XG4gIHNlbGVjdGVkSWRlbnRpdHlSb2xlQXR0cmlidXRlcyA9IFtdO1xuICBzZWxlY3RlZElkZW50aXR5TmFtZWRBdHRyaWJ1dGVzID0gW107XG4gIHNlbGVjdGVkUG9zdHVyZVJvbGVBdHRyaWJ1dGVzID0gW107XG4gIHNlbGVjdGVkUG9zdHVyZU5hbWVkQXR0cmlidXRlcyA9IFtdO1xuXG4gIGZvcm1WaWV3ID0gJ3NpbXBsZSc7XG4gIGlzRWRpdGluZyA9IGZhbHNlO1xuICBzZXJ2aWNlc0xvYWRpbmcgPSBmYWxzZTtcbiAgaWRlbnRpdGllc0xvYWRpbmcgPSBmYWxzZTtcbiAgcG9zdHVyZUNoZWNrc0xvYWRpbmcgPSBmYWxzZTtcblxuICBzaG93TW9yZSA9IGZhbHNlO1xuICBzZXR0aW5nczogYW55ID0ge307XG5cbiAgb3ZlcnJpZGUgZW50aXR5VHlwZSA9ICdzZXJ2aWNlLXBvbGljaWVzJztcbiAgb3ZlcnJpZGUgZW50aXR5Q2xhc3MgPSBTZXJ2aWNlUG9saWN5O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgQEluamVjdChTRVRUSU5HU19TRVJWSUNFKSBwdWJsaWMgc2V0dGluZ3NTZXJ2aWNlOiBTZXR0aW5nc1NlcnZpY2UsXG4gICAgICBwdWJsaWMgc3ZjOiBTZXJ2aWNlUG9saWN5Rm9ybVNlcnZpY2UsXG4gICAgICBASW5qZWN0KFpJVElfREFUQV9TRVJWSUNFKSBvdmVycmlkZSB6aXRpU2VydmljZTogWml0aURhdGFTZXJ2aWNlLFxuICAgICAgZ3Jvd2xlclNlcnZpY2U6IEdyb3dsZXJTZXJ2aWNlLFxuICAgICAgQEluamVjdChTRVJWSUNFX1BPTElDWV9FWFRFTlNJT05fU0VSVklDRSkgZXh0U2VydmljZTogRXh0ZW5zaW9uU2VydmljZSxcbiAgICAgIHByb3RlY3RlZCBvdmVycmlkZSByb3V0ZXI6IFJvdXRlcixcbiAgICAgIHByb3RlY3RlZCBvdmVycmlkZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICkge1xuICAgIHN1cGVyKGdyb3dsZXJTZXJ2aWNlLCBleHRTZXJ2aWNlLCB6aXRpU2VydmljZSwgcm91dGVyLCByb3V0ZSk7XG4gIH1cblxuICBvdmVycmlkZSBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgdGhpcy5zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3NDaGFuZ2Uuc3Vic2NyaWJlKChyZXN1bHRzOmFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ3MgPSByZXN1bHRzO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBlbnRpdHlVcGRhdGVkKCkge1xuICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgcHJvbWlzZXMucHVzaCh0aGlzLnN2Yy5nZXRTZXJ2aWNlUm9sZUF0dHJpYnV0ZXMoKSk7XG4gICAgcHJvbWlzZXMucHVzaCh0aGlzLnN2Yy5nZXRJZGVudGl0eVJvbGVBdHRyaWJ1dGVzKCkpO1xuICAgIHByb21pc2VzLnB1c2godGhpcy5zdmMuZ2V0U2VydmljZU5hbWVkQXR0cmlidXRlcygpKTtcbiAgICBwcm9taXNlcy5wdXNoKHRoaXMuc3ZjLmdldElkZW50aXR5TmFtZWRBdHRyaWJ1dGVzKCkpO1xuICAgIHByb21pc2VzLnB1c2godGhpcy5zdmMuZ2V0UG9zdHVyZU5hbWVkQXR0cmlidXRlcygpKTtcbiAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmluaXRTZWxlY3RlZEF0dHJpYnV0ZXMoKTtcbiAgICB9KTtcbiAgICBpZiAoaXNFbXB0eSh0aGlzLmZvcm1EYXRhLmlkKSkge1xuICAgICAgdGhpcy5mb3JtRGF0YSA9IG5ldyBTZXJ2aWNlUG9saWN5KCk7XG4gICAgfVxuICAgIHRoaXMuaW5pdERhdGEgPSBjbG9uZURlZXAodGhpcy5mb3JtRGF0YSk7XG4gICAgdGhpcy5leHRTZXJ2aWNlLnVwZGF0ZUZvcm1EYXRhKHRoaXMuZm9ybURhdGEpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgdGhpcy5leHRTZXJ2aWNlLmZvcm1EYXRhQ2hhbmdlZC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgICAgICBpZiAoZGF0YS5pc0VtcHR5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZm9ybURhdGEgPSBkYXRhO1xuICAgICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5pbml0RGF0YSA9IGNsb25lRGVlcCh0aGlzLmZvcm1EYXRhKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZXh0U2VydmljZS5jbG9zZWQuZW1pdCh7fSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLmlzRWRpdGluZyA9ICFpc0VtcHR5KHRoaXMuZm9ybURhdGEuaWQpO1xuICB9XG5cbiAgaW5pdFNlbGVjdGVkQXR0cmlidXRlcygpIHtcbiAgICBpZiAoaXNFbXB0eSh0aGlzLmZvcm1EYXRhLmlkKSkge1xuICAgICAgdGhpcy5zdmMuYXNzb2NpYXRlZFNlcnZpY2VzID0gW107XG4gICAgICB0aGlzLnN2Yy5hc3NvY2lhdGVkU2VydmljZU5hbWVzID0gW107XG4gICAgICB0aGlzLnN2Yy5hc3NvY2lhdGVkSWRlbnRpdGllcyA9IFtdO1xuICAgICAgdGhpcy5zdmMuYXNzb2NpYXRlZElkZW50aXR5TmFtZXMgPSBbXTtcbiAgICAgIHRoaXMuc3ZjLmFzc29jaWF0ZWRQb3N0dXJlQ2hlY2tzID0gW107XG4gICAgICB0aGlzLnN2Yy5hc3NvY2lhdGVkUG9zdHVyZUNoZWNrTmFtZXMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2VydmljZUlkQXR0cmlidXRlc01hcCA9IGludmVydCh0aGlzLnN2Yy5zZXJ2aWNlTmFtZWRBdHRyaWJ1dGVzTWFwKTtcbiAgICBjb25zdCBpZGVudGl0eUlkQXR0cmlidXRlc01hcCA9IGludmVydCh0aGlzLnN2Yy5pZGVudGl0eU5hbWVkQXR0cmlidXRlc01hcCk7XG4gICAgY29uc3QgcG9zdHVyZUlkQXR0cmlidXRlc01hcCA9IGludmVydCh0aGlzLnN2Yy5wb3N0dXJlTmFtZWRBdHRyaWJ1dGVzTWFwKTtcbiAgICB0aGlzLnNlbGVjdGVkU2VydmljZVJvbGVBdHRyaWJ1dGVzID0gW107XG4gICAgdGhpcy5zZWxlY3RlZFNlcnZpY2VOYW1lZEF0dHJpYnV0ZXMgPSBbXTtcbiAgICB0aGlzLnNlbGVjdGVkSWRlbnRpdHlSb2xlQXR0cmlidXRlcyA9IFtdO1xuICAgIHRoaXMuc2VsZWN0ZWRJZGVudGl0eU5hbWVkQXR0cmlidXRlcyA9IFtdO1xuICAgIHRoaXMuc2VsZWN0ZWRQb3N0dXJlUm9sZUF0dHJpYnV0ZXMgPSBbXTtcbiAgICB0aGlzLnNlbGVjdGVkUG9zdHVyZU5hbWVkQXR0cmlidXRlcyA9IFtdO1xuICAgIHRoaXMuZm9ybURhdGEuc2VydmljZVJvbGVzPy5mb3JFYWNoKGF0dHIgPT4ge1xuICAgICAgaWYgKGF0dHIuaW5kZXhPZignQCcpID09PSAwKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlTmFtZWRBdHRyaWJ1dGVzLnB1c2goc2VydmljZUlkQXR0cmlidXRlc01hcFthdHRyLnN1YnN0cmluZygxKV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFNlcnZpY2VSb2xlQXR0cmlidXRlcy5wdXNoKGF0dHIuc3Vic3RyaW5nKDEpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmZvcm1EYXRhLmlkZW50aXR5Um9sZXM/LmZvckVhY2goYXR0ciA9PiB7XG4gICAgICBpZiAoYXR0ci5pbmRleE9mKCdAJykgPT09IDApIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZElkZW50aXR5TmFtZWRBdHRyaWJ1dGVzLnB1c2goaWRlbnRpdHlJZEF0dHJpYnV0ZXNNYXBbYXR0ci5zdWJzdHJpbmcoMSldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJZGVudGl0eVJvbGVBdHRyaWJ1dGVzLnB1c2goYXR0ci5zdWJzdHJpbmcoMSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZm9ybURhdGEucG9zdHVyZUNoZWNrUm9sZXM/LmZvckVhY2goYXR0ciA9PiB7XG4gICAgICBpZiAoYXR0ci5pbmRleE9mKCdAJykgPT09IDApIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFBvc3R1cmVOYW1lZEF0dHJpYnV0ZXMucHVzaChwb3N0dXJlSWRBdHRyaWJ1dGVzTWFwW2F0dHIuc3Vic3RyaW5nKDEpXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUG9zdHVyZVJvbGVBdHRyaWJ1dGVzLnB1c2goYXR0ci5zdWJzdHJpbmcoMSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuc3ZjLmdldEFzc29jaWF0ZWRTZXJ2aWNlc0J5QXR0cmlidXRlKHRoaXMuc2VsZWN0ZWRTZXJ2aWNlUm9sZUF0dHJpYnV0ZXMsIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlTmFtZWRBdHRyaWJ1dGVzKTtcbiAgICB0aGlzLnN2Yy5nZXRBc3NvY2lhdGVkSWRlbnRpdGllc0J5QXR0cmlidXRlKHRoaXMuc2VsZWN0ZWRJZGVudGl0eVJvbGVBdHRyaWJ1dGVzLCB0aGlzLnNlbGVjdGVkSWRlbnRpdHlOYW1lZEF0dHJpYnV0ZXMpO1xuICAgIHRoaXMuc3ZjLmdldEFzc29jaWF0ZWRQb3N0dXJlQ2hlY2tzQnlBdHRyaWJ1dGUodGhpcy5zZWxlY3RlZFBvc3R1cmVSb2xlQXR0cmlidXRlcywgdGhpcy5zZWxlY3RlZFBvc3R1cmVOYW1lZEF0dHJpYnV0ZXMpO1xuICB9XG5cbiAgaGVhZGVyQWN0aW9uUmVxdWVzdGVkKGFjdGlvbikge1xuICAgIHN3aXRjaChhY3Rpb24ubmFtZSkge1xuICAgICAgY2FzZSAnc2F2ZSc6XG4gICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Nsb3NlJzpcbiAgICAgICAgdGhpcy5yZXR1cm5Ub0xpc3RQYWdlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9nZ2xlLXZpZXcnOlxuICAgICAgICB0aGlzLmZvcm1WaWV3ID0gYWN0aW9uLmRhdGE7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNhdmUoZXZlbnQ/KSB7XG4gICAgdGhpcy5mb3JtRGF0YS5uYW1lID0gdGhpcy5mb3JtRGF0YS5uYW1lLnRyaW0oKTtcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgIGNvbnN0IGlzRXh0VmFsaWQgPSBhd2FpdCB0aGlzLmV4dFNlcnZpY2UudmFsaWRhdGVEYXRhKCk7XG4gICAgaWYoIWlzVmFsaWQgfHwgIWlzRXh0VmFsaWQpIHtcbiAgICAgIGNvbnN0IGdyb3dsZXJEYXRhID0gbmV3IEdyb3dsZXJNb2RlbChcbiAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICdFcnJvcicsXG4gICAgICAgICAgYERhdGEgSW52YWxpZGAsXG4gICAgICAgICAgYFNlcnZpY2UgUG9saWN5IGRhdGEgaXMgaW52YWxpZC4gUGxlYXNlIHVwZGF0ZSB0aGUgaGlnaGxpZ2h0ZWQgZmllbGRzIGFuZCB0cnkgYWdhaW4uYCxcbiAgICAgICk7XG4gICAgICB0aGlzLmdyb3dsZXJTZXJ2aWNlLnNob3coZ3Jvd2xlckRhdGEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmFwcGx5U2VsZWN0ZWRBdHRyaWJ1dGVzKCk7XG4gICAgdGhpcy5zdmMuc2F2ZSh0aGlzLmZvcm1EYXRhKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQ/LmNsb3NlKSB7XG4gICAgICAgIHRoaXMuY2xvc2VNb2RhbCh0cnVlLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGEgPSByZXN1bHQ/LmRhdGE/LmlkID8gcmVzdWx0LmRhdGEgOiByZXN1bHQ7XG4gICAgICBpZiAoIWlzRW1wdHkoZGF0YS5pZCkpIHtcbiAgICAgICAgdGhpcy5mb3JtRGF0YSA9IGRhdGEgfHwgdGhpcy5mb3JtRGF0YTtcbiAgICAgICAgdGhpcy5pbml0RGF0YSA9IHRoaXMuZm9ybURhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmluaXREYXRhID0gdGhpcy5mb3JtRGF0YTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmV0dXJuVG9MaXN0UGFnZSgpO1xuICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIGFwcGx5U2VsZWN0ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHRoaXMuZm9ybURhdGEuc2VydmljZVJvbGVzID0gdGhpcy5zdmMuZ2V0U2VsZWN0ZWRSb2xlcyh0aGlzLnNlbGVjdGVkU2VydmljZVJvbGVBdHRyaWJ1dGVzLCB0aGlzLnNlbGVjdGVkU2VydmljZU5hbWVkQXR0cmlidXRlcywgdGhpcy5zdmMuc2VydmljZU5hbWVkQXR0cmlidXRlc01hcCk7XG4gICAgdGhpcy5mb3JtRGF0YS5pZGVudGl0eVJvbGVzID0gdGhpcy5zdmMuZ2V0U2VsZWN0ZWRSb2xlcyh0aGlzLnNlbGVjdGVkSWRlbnRpdHlSb2xlQXR0cmlidXRlcywgdGhpcy5zZWxlY3RlZElkZW50aXR5TmFtZWRBdHRyaWJ1dGVzLCB0aGlzLnN2Yy5pZGVudGl0eU5hbWVkQXR0cmlidXRlc01hcCk7XG4gICAgdGhpcy5mb3JtRGF0YS5wb3N0dXJlQ2hlY2tSb2xlcyA9IHRoaXMuc3ZjLmdldFNlbGVjdGVkUm9sZXModGhpcy5zZWxlY3RlZFBvc3R1cmVSb2xlQXR0cmlidXRlcywgdGhpcy5zZWxlY3RlZFBvc3R1cmVOYW1lZEF0dHJpYnV0ZXMsIHRoaXMuc3ZjLnBvc3R1cmVOYW1lZEF0dHJpYnV0ZXNNYXApO1xuICB9XG5cbiAgdmFsaWRhdGUoKSB7XG4gICAgdGhpcy5lcnJvcnMgPSB7fTtcbiAgICBpZiAoaXNFbXB0eSh0aGlzLmZvcm1EYXRhLm5hbWUpKSB7XG4gICAgICB0aGlzLmVycm9yc1snbmFtZSddID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGlzRW1wdHkodGhpcy5lcnJvcnMpO1xuICB9XG5cbiAgYXBpQWN0aW9uUmVxdWVzdGVkKGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uLmlkKSB7XG4gICAgICBjYXNlICdjbGknOlxuICAgICAgICB0aGlzLmNvcHlDTElDb21tYW5kKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY3VybCc6XG4gICAgICAgIHRoaXMuY29weUNVUkxDb21tYW5kKCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGNvcHlDTElDb21tYW5kKCkge1xuICAgIGNvbnN0IHNlcnZpY2VSb2xlcyA9IHRoaXMuc3ZjLmdldFNlbGVjdGVkUm9sZXModGhpcy5zZWxlY3RlZFNlcnZpY2VSb2xlQXR0cmlidXRlcywgdGhpcy5zZWxlY3RlZFNlcnZpY2VOYW1lZEF0dHJpYnV0ZXMsIHRoaXMuc3ZjLnNlcnZpY2VOYW1lZEF0dHJpYnV0ZXNNYXApO1xuICAgIGNvbnN0IHNlcnZpY2VSb2xlc1ZhciA9IHRoaXMuZ2V0Um9sZXNDTElWYXJpYWJsZShzZXJ2aWNlUm9sZXMpO1xuXG4gICAgY29uc3QgaWRlbnRpdHlSb2xlcyA9IHRoaXMuc3ZjLmdldFNlbGVjdGVkUm9sZXModGhpcy5zZWxlY3RlZElkZW50aXR5Um9sZUF0dHJpYnV0ZXMsIHRoaXMuc2VsZWN0ZWRJZGVudGl0eU5hbWVkQXR0cmlidXRlcywgdGhpcy5zdmMuaWRlbnRpdHlOYW1lZEF0dHJpYnV0ZXNNYXApO1xuICAgIGNvbnN0IGlkZW50aXR5Um9sZXNWYXIgPSB0aGlzLmdldFJvbGVzQ0xJVmFyaWFibGUoaWRlbnRpdHlSb2xlcyk7XG5cbiAgICBjb25zdCBwY1JvbGVzID0gdGhpcy5zdmMuZ2V0U2VsZWN0ZWRSb2xlcyh0aGlzLnNlbGVjdGVkUG9zdHVyZVJvbGVBdHRyaWJ1dGVzLCB0aGlzLnNlbGVjdGVkUG9zdHVyZU5hbWVkQXR0cmlidXRlcywgdGhpcy5zdmMucG9zdHVyZU5hbWVkQXR0cmlidXRlc01hcCk7XG4gICAgY29uc3QgcGNSb2xlc1ZhciA9IHRoaXMuZ2V0Um9sZXNDTElWYXJpYWJsZShwY1JvbGVzKTtcblxuICAgIGNvbnN0IGNvbW1hbmQgPSBgeml0aSBlZGdlICR7dGhpcy5mb3JtRGF0YS5pZCA/ICd1cGRhdGUnIDogJ2NyZWF0ZSd9IHNlcnZpY2UtcG9saWN5ICR7dGhpcy5mb3JtRGF0YS5pZCA/IGAnJHt0aGlzLmZvcm1EYXRhLmlkfSdgIDogJyd9ICR7dGhpcy5mb3JtRGF0YS5pZCA/ICctLW5hbWUnIDogJyd9ICcke3RoaXMuZm9ybURhdGEubmFtZX0nICR7dGhpcy5mb3JtRGF0YS5pZCA/ICcnIDogdGhpcy5mb3JtRGF0YS50eXBlfSR7dGhpcy5mb3JtRGF0YS5pZCA/ICcnIDogYCAtLXNlbWFudGljICcke3RoaXMuZm9ybURhdGEuc2VtYW50aWN9J2B9IC0tc2VydmljZS1yb2xlcyAnJHtzZXJ2aWNlUm9sZXNWYXJ9JyAtLWlkZW50aXR5LXJvbGVzICcke2lkZW50aXR5Um9sZXNWYXJ9JyAtLXBvc3R1cmUtY2hlY2stcm9sZXMgJyR7cGNSb2xlc1Zhcn0nYDtcblxuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGNvbW1hbmQpO1xuICAgIGNvbnN0IGdyb3dsZXJEYXRhID0gbmV3IEdyb3dsZXJNb2RlbChcbiAgICAgICAgJ3N1Y2Nlc3MnLFxuICAgICAgICAnU3VjY2VzcycsXG4gICAgICAgIGBUZXh0IENvcGllZGAsXG4gICAgICAgIGBDTEkgY29tbWFuZCBjb3BpZWQgdG8gY2xpcGJvYXJkYCxcbiAgICApO1xuICAgIHRoaXMuZ3Jvd2xlclNlcnZpY2Uuc2hvdyhncm93bGVyRGF0YSk7XG4gIH1cblxuICBjb3B5Q1VSTENvbW1hbmQoKSB7XG4gICAgY29uc3Qgc2VydmljZVJvbGVzID0gdGhpcy5zdmMuZ2V0U2VsZWN0ZWRSb2xlcyh0aGlzLnNlbGVjdGVkU2VydmljZVJvbGVBdHRyaWJ1dGVzLCB0aGlzLnNlbGVjdGVkU2VydmljZU5hbWVkQXR0cmlidXRlcywgdGhpcy5zdmMuc2VydmljZU5hbWVkQXR0cmlidXRlc01hcCk7XG4gICAgY29uc3Qgc2VydmljZVJvbGVzVmFyID0gdGhpcy5nZXRSb2xlc0NVUkxWYXJpYWJsZShzZXJ2aWNlUm9sZXMpO1xuXG4gICAgY29uc3QgaWRlbnRpdHlSb2xlcyA9IHRoaXMuc3ZjLmdldFNlbGVjdGVkUm9sZXModGhpcy5zZWxlY3RlZElkZW50aXR5Um9sZUF0dHJpYnV0ZXMsIHRoaXMuc2VsZWN0ZWRJZGVudGl0eU5hbWVkQXR0cmlidXRlcywgdGhpcy5zdmMuaWRlbnRpdHlOYW1lZEF0dHJpYnV0ZXNNYXApO1xuICAgIGNvbnN0IGlkZW50aXR5Um9sZXNWYXIgPSB0aGlzLmdldFJvbGVzQ1VSTFZhcmlhYmxlKGlkZW50aXR5Um9sZXMpO1xuXG4gICAgY29uc3QgcGNSb2xlcyA9IHRoaXMuc3ZjLmdldFNlbGVjdGVkUm9sZXModGhpcy5zZWxlY3RlZFBvc3R1cmVSb2xlQXR0cmlidXRlcywgdGhpcy5zZWxlY3RlZFBvc3R1cmVOYW1lZEF0dHJpYnV0ZXMsIHRoaXMuc3ZjLnBvc3R1cmVOYW1lZEF0dHJpYnV0ZXNNYXApO1xuICAgIGNvbnN0IHBjUm9sZXNWYXIgPSB0aGlzLmdldFJvbGVzQ1VSTFZhcmlhYmxlKHBjUm9sZXMpO1xuXG4gICAgY29uc3QgY29tbWFuZCA9IGBjdXJsICcke3RoaXMuYXBpQ2FsbFVSTH0nIFxcXFxcbiAgICAke3RoaXMuZm9ybURhdGEuaWQgPyAnLS1yZXF1ZXN0IFBBVENIIFxcXFwnIDogJ1xcXFwnfVxuICAgIC1IICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nIFxcXFxcbiAgICAtSCAnY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uJyBcXFxcXG4gICAgLUggJ3p0LXNlc3Npb246ICR7dGhpcy5zZXR0aW5ncy5zZXNzaW9uLmlkfScgXFxcXFxuICAgIC0tZGF0YS1yYXcgJ3tcIm5hbWVcIjpcIiR7dGhpcy5mb3JtRGF0YS5uYW1lfVwiLFwic2VydmljZVJvbGVzXCI6JHtzZXJ2aWNlUm9sZXNWYXJ9LFwiaWRlbnRpdHlSb2xlc1wiOiR7aWRlbnRpdHlSb2xlc1Zhcn0sXCJwb3N0dXJlQ2hlY2tSb2xlc1wiOiR7cGNSb2xlc1Zhcn0sXCJzZW1hbnRpY1wiOlwiJHt0aGlzLmZvcm1EYXRhLnNlbWFudGljfVwiLFwidHlwZVwiOlwiJHt0aGlzLmZvcm1EYXRhLnR5cGV9XCJ9J2A7XG5cbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChjb21tYW5kKTtcbiAgICBjb25zdCBncm93bGVyRGF0YSA9IG5ldyBHcm93bGVyTW9kZWwoXG4gICAgICAgICdzdWNjZXNzJyxcbiAgICAgICAgJ1N1Y2Nlc3MnLFxuICAgICAgICBgVGV4dCBDb3BpZWRgLFxuICAgICAgICBgQ1VSTCBjb21tYW5kIGNvcGllZCB0byBjbGlwYm9hcmRgLFxuICAgICk7XG4gICAgdGhpcy5ncm93bGVyU2VydmljZS5zaG93KGdyb3dsZXJEYXRhKTtcbiAgfVxuXG4gIGdldCBhcGlDYWxsVVJMKCkge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnNlbGVjdGVkRWRnZUNvbnRyb2xsZXIgKyAnL2VkZ2UvbWFuYWdlbWVudC92MS9zZXJ2aWNlLXBvbGljaWVzJyArICh0aGlzLmZvcm1EYXRhLmlkID8gYC8ke3RoaXMuZm9ybURhdGEuaWR9YCA6ICcnKTtcbiAgfVxuXG4gIGdldCBhcGlEYXRhKCkge1xuICAgIGNvbnN0IGRhdGE6IGFueSA9IHtcbiAgICAgIG5hbWU6IHRoaXMuZm9ybURhdGE/Lm5hbWUgfHwgJycsXG4gICAgICBhcHBEYXRhOiB0aGlzLmZvcm1EYXRhPy5hcHBEYXRhIHx8ICcnLFxuICAgICAgc2VydmljZVJvbGVzOiB0aGlzLnN2Yy5nZXRTZWxlY3RlZFJvbGVzKHRoaXMuc2VsZWN0ZWRTZXJ2aWNlUm9sZUF0dHJpYnV0ZXMsIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlTmFtZWRBdHRyaWJ1dGVzLCB0aGlzLnN2Yy5zZXJ2aWNlTmFtZWRBdHRyaWJ1dGVzTWFwKSxcbiAgICAgIGlkZW50aXR5Um9sZXM6IHRoaXMuc3ZjLmdldFNlbGVjdGVkUm9sZXModGhpcy5zZWxlY3RlZElkZW50aXR5Um9sZUF0dHJpYnV0ZXMsIHRoaXMuc2VsZWN0ZWRJZGVudGl0eU5hbWVkQXR0cmlidXRlcywgdGhpcy5zdmMuaWRlbnRpdHlOYW1lZEF0dHJpYnV0ZXNNYXApLFxuICAgICAgcG9zdHVyZUNoZWNrUm9sZXM6IHRoaXMuc3ZjLmdldFNlbGVjdGVkUm9sZXModGhpcy5zZWxlY3RlZFBvc3R1cmVSb2xlQXR0cmlidXRlcywgdGhpcy5zZWxlY3RlZFBvc3R1cmVOYW1lZEF0dHJpYnV0ZXMsIHRoaXMuc3ZjLnBvc3R1cmVOYW1lZEF0dHJpYnV0ZXNNYXApLFxuICAgICAgc2VtYW50aWM6IHRoaXMuZm9ybURhdGEuc2VtYW50aWMsXG4gICAgICB0eXBlOiB0aGlzLmZvcm1EYXRhLnR5cGVcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBfYXBpRGF0YSA9IHt9O1xuICBzZXQgYXBpRGF0YShkYXRhKSB7XG4gICAgdGhpcy5fYXBpRGF0YSA9IGRhdGE7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInByb2plY3RhYmxlLWZvcm0td3JhcHBlclwiXG4gICAgIChrZXl1cC5lbnRlcik9XCJzYXZlKCRldmVudClcIlxuICAgICAoa2V5dXAuZXNjYXBlKT1cImNsb3NlTW9kYWwoZmFsc2UpXCJcbj5cbiAgICA8bGliLWZvcm0taGVhZGVyXG4gICAgICAgICAgICBbZGF0YV09XCJmb3JtRGF0YVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiZm9ybURhdGEuaWQgPyAnRWRpdCBTZXJ2aWNlIFBvbGljeTogJyA6ICdDcmVhdGUgTmV3IFNlcnZpY2UgUG9saWN5J1wiXG4gICAgICAgICAgICBbbW9yZUFjdGlvbnNdPVwibW9yZUFjdGlvbnNcIlxuICAgICAgICAgICAgKGFjdGlvblJlcXVlc3RlZCk9XCJoZWFkZXJBY3Rpb25SZXF1ZXN0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICBbKGZvcm1WaWV3KV09XCJmb3JtVmlld1wiXG4gICAgPjwvbGliLWZvcm0taGVhZGVyPlxuICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLXBvbGljeS1mb3JtLWNvbnRhaW5lciBwcm9qZWN0YWJsZS1mb3JtLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvamVjdGFibGUtZm9ybS1tYWluLWNvbHVtbiBmb3JtLWdyb3VwLXJvd1wiICpuZ0lmPVwiZm9ybVZpZXcgPT09ICdzaW1wbGUnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cC1jb2x1bW4gdGhyZWUtZmlmdGhzXCI+XG4gICAgICAgICAgICAgICAgPGxpYi1mb3JtLWZpZWxkLWNvbnRhaW5lciBbdGl0bGVdPVwiJ1NlcnZpY2UgUG9saWN5IE5hbWUnXCIgW2xhYmVsXT1cIidSRVFVSVJFRCdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWZpZWxkLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk5hbWUgdGhpcyBlZGdlIHNlcnZpY2UgcG9saWN5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ZXJyb3I6IGVycm9yc1snbmFtZSddfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb3JtRGF0YS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvZm9jdXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjbmFtZUZpZWxkSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2xpYi1mb3JtLWZpZWxkLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bGliLWZvcm0tZmllbGQtY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1NlbGVjdCBTZXJ2aWNlIEF0dHJpYnV0ZXMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInT1BUSU9OQUwnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb250ZW50U3R5bGVdPVwiJ3otaW5kZXg6IDEwMDAwMydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hlbHBUZXh0XT1cIidDaG9vc2Ugd2hpY2ggc2VydmljZXMgdG8gYXNzb2NpYXRlIHRvIHRoaXMgcG9saWN5IGJ5IHBpY2tpbmcgZnJvbSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgYXR0cmlidXRlcydcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi10YWctc2VsZWN0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNlbGVjdGVkUm9sZUF0dHJpYnV0ZXMpXT1cInNlbGVjdGVkU2VydmljZVJvbGVBdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNlbGVjdGVkTmFtZWRBdHRyaWJ1dGVzKV09XCJzZWxlY3RlZFNlcnZpY2VOYW1lZEF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdmFpbGFibGVSb2xlQXR0cmlidXRlc109XCJzdmMuc2VydmljZVJvbGVBdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXZhaWxhYmxlTmFtZWRBdHRyaWJ1dGVzXT1cInN2Yy5zZXJ2aWNlTmFtZWRBdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWROYW1lZEF0dHJpYnV0ZXNDaGFuZ2UpPVwic3ZjLmdldEFzc29jaWF0ZWRTZXJ2aWNlc0J5QXR0cmlidXRlKHNlbGVjdGVkU2VydmljZVJvbGVBdHRyaWJ1dGVzLCBzZWxlY3RlZFNlcnZpY2VOYW1lZEF0dHJpYnV0ZXMpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRSb2xlQXR0cmlidXRlc0NoYW5nZSk9XCJzdmMuZ2V0QXNzb2NpYXRlZFNlcnZpY2VzQnlBdHRyaWJ1dGUoc2VsZWN0ZWRTZXJ2aWNlUm9sZUF0dHJpYnV0ZXMsIHNlbGVjdGVkU2VydmljZU5hbWVkQXR0cmlidXRlcylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU2VsZWN0IHNlcnZpY2UgYXR0cmlidXRlcydcIlxuICAgICAgICAgICAgICAgICAgICA+PC9saWItdGFnLXNlbGVjdG9yPlxuICAgICAgICAgICAgICAgIDwvbGliLWZvcm0tZmllbGQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxsaWItZm9ybS1maWVsZC1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInU2VsZWN0IElkZW50aXR5IEF0dHJpYnV0ZXMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInT1BUSU9OQUwnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb250ZW50U3R5bGVdPVwiJ3otaW5kZXg6IDEwMDAwMidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hlbHBUZXh0XT1cIidDaG9vc2Ugd2hpY2ggaWRlbnRpdGllcyB0byBhc3NvY2lhdGUgdG8gdGhpcyBwb2xpY3kgYnkgcGlja2luZyBmcm9tIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBhdHRyaWJ1dGVzJ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bGliLXRhZy1zZWxlY3RvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2VsZWN0ZWRSb2xlQXR0cmlidXRlcyldPVwic2VsZWN0ZWRJZGVudGl0eVJvbGVBdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHNlbGVjdGVkTmFtZWRBdHRyaWJ1dGVzKV09XCJzZWxlY3RlZElkZW50aXR5TmFtZWRBdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXZhaWxhYmxlUm9sZUF0dHJpYnV0ZXNdPVwic3ZjLmlkZW50aXR5Um9sZUF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdmFpbGFibGVOYW1lZEF0dHJpYnV0ZXNdPVwic3ZjLmlkZW50aXR5TmFtZWRBdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWROYW1lZEF0dHJpYnV0ZXNDaGFuZ2UpPVwic3ZjLmdldEFzc29jaWF0ZWRJZGVudGl0aWVzQnlBdHRyaWJ1dGUoc2VsZWN0ZWRJZGVudGl0eVJvbGVBdHRyaWJ1dGVzLCBzZWxlY3RlZElkZW50aXR5TmFtZWRBdHRyaWJ1dGVzKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkUm9sZUF0dHJpYnV0ZXNDaGFuZ2UpPVwic3ZjLmdldEFzc29jaWF0ZWRJZGVudGl0aWVzQnlBdHRyaWJ1dGUoc2VsZWN0ZWRJZGVudGl0eVJvbGVBdHRyaWJ1dGVzLCBzZWxlY3RlZElkZW50aXR5TmFtZWRBdHRyaWJ1dGVzKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3QgaWRlbnRpdHkgYXR0cmlidXRlcydcIlxuICAgICAgICAgICAgICAgICAgICA+PC9saWItdGFnLXNlbGVjdG9yPlxuICAgICAgICAgICAgICAgIDwvbGliLWZvcm0tZmllbGQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxsaWItZm9ybS1maWVsZC1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInU2VsZWN0IFBvc3R1cmUgQ2hlY2sgQXR0cmlidXRlcydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidPUFRJT05BTCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRlbnRTdHlsZV09XCInei1pbmRleDogMTAwMDAxJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaGVscFRleHRdPVwiJ0Nob29zZSB3aGljaCBwb3N0dXJlIGNoZWNrcyB0byBhc3NvY2lhdGUgdG8gdGhpcyBwb2xpY3kgYnkgcGlja2luZyBmcm9tIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBhdHRyaWJ1dGVzJ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bGliLXRhZy1zZWxlY3RvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2VsZWN0ZWRSb2xlQXR0cmlidXRlcyldPVwic2VsZWN0ZWRQb3N0dXJlUm9sZUF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2VsZWN0ZWROYW1lZEF0dHJpYnV0ZXMpXT1cInNlbGVjdGVkUG9zdHVyZU5hbWVkQXR0cmlidXRlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZWxlY3RlZFJvbGVBdHRyaWJ1dGVzKV09XCJzdmMucG9zdHVyZVJvbGVBdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXZhaWxhYmxlTmFtZWRBdHRyaWJ1dGVzXT1cInN2Yy5wb3N0dXJlTmFtZWRBdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWROYW1lZEF0dHJpYnV0ZXNDaGFuZ2UpPVwic3ZjLmdldEFzc29jaWF0ZWRQb3N0dXJlQ2hlY2tzQnlBdHRyaWJ1dGUoc2VsZWN0ZWRQb3N0dXJlUm9sZUF0dHJpYnV0ZXMsIHNlbGVjdGVkUG9zdHVyZU5hbWVkQXR0cmlidXRlcylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZFJvbGVBdHRyaWJ1dGVzQ2hhbmdlKT1cInN2Yy5nZXRBc3NvY2lhdGVkUG9zdHVyZUNoZWNrc0J5QXR0cmlidXRlKHNlbGVjdGVkUG9zdHVyZVJvbGVBdHRyaWJ1dGVzLCBzZWxlY3RlZFBvc3R1cmVOYW1lZEF0dHJpYnV0ZXMpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NlbGVjdCBwb3N0dXJlIGNoZWNrIGF0dHJpYnV0ZXMnXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbGliLXRhZy1zZWxlY3Rvcj5cbiAgICAgICAgICAgICAgICA8L2xpYi1mb3JtLWZpZWxkLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bGliLWZvcm0tZmllbGQtY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1R5cGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZTJdPVwiJ1NlbWFudGljJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGF5b3V0XT1cIidyb3cnXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm1EYXRhLnR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiUG9saWN5VHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWZpZWxkLWRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkJpbmRcIj5CaW5kPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiRGlhbFwiPkRpYWw8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm1EYXRhLnNlbWFudGljXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIlBvbGljeVNlbWFudGljXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tZmllbGQtZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiQW55T2ZcIj5BbnlPZjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkFsbE9mXCI+QWxsT2Y8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9saWItZm9ybS1maWVsZC1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwLWNvbHVtbiB0d28tZmlmdGhzXCI+XG4gICAgICAgICAgICAgICAgPGxpYi1mb3JtLWZpZWxkLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidBc3NvY2lhdGVkIFNlcnZpY2VzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY291bnRdPVwic3ZjLmFzc29jaWF0ZWRTZXJ2aWNlTmFtZXMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCInaGlkZS1vdmVyZmxvdydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hlbHBUZXh0XT1cIidQcmV2aWV3IGxpc3Qgb2YgYWxsIHNlcnZpY2VzIHRoYXQgdGhpcyBTZXJ2aWNlIFBvbGljeSBpcyBhc3NvY2lhdGVkIHdpdGguJ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bGliLXByZXZpZXctbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGlja2FibGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc0xvYWRpbmddPVwic2VydmljZXNMb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWxsTmFtZXNdPVwic3ZjLmFzc29jaWF0ZWRTZXJ2aWNlTmFtZXNcIlxuICAgICAgICAgICAgICAgICAgICA+PC9saWItcHJldmlldy1saXN0PlxuICAgICAgICAgICAgICAgIDwvbGliLWZvcm0tZmllbGQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxsaWItZm9ybS1maWVsZC1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInQXNzb2NpYXRlZCBJZGVudGl0aWVzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY291bnRdPVwic3ZjLmFzc29jaWF0ZWRJZGVudGl0eU5hbWVzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaGVscFRleHRdPVwiJ1ByZXZpZXcgbGlzdCBvZiBhbGwgSWRlbnRpdGllcyB0aGF0IHRoaXMgU2VydmljZSBQb2xpY3kgaXMgYXNzb2NpYXRlZCB3aXRoLidcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1wcmV2aWV3LWxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xpY2thYmxlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNMb2FkaW5nXT1cImlkZW50aXRpZXNMb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWxsTmFtZXNdPVwic3ZjLmFzc29jaWF0ZWRJZGVudGl0eU5hbWVzXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbGliLXByZXZpZXctbGlzdD5cbiAgICAgICAgICAgICAgICA8L2xpYi1mb3JtLWZpZWxkLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bGliLWZvcm0tZmllbGQtY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0Fzc29jaWF0ZWQgUG9zdHVyZSBDaGVja3MnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb3VudF09XCJzdmMuYXNzb2NpYXRlZFBvc3R1cmVDaGVja05hbWVzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaGVscFRleHRdPVwiJ1ByZXZpZXcgbGlzdCBvZiBhbGwgUG9zdHVyZSBDaGVja3MgdGhhdCB0aGlzIFNlcnZpY2UgUG9saWN5IGlzIGFzc29jaWF0ZWQgd2l0aC4nXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItcHJldmlldy1saXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsaWNrYWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzTG9hZGluZ109XCJwb3N0dXJlQ2hlY2tzTG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FsbE5hbWVzXT1cInN2Yy5hc3NvY2lhdGVkUG9zdHVyZUNoZWNrTmFtZXNcIlxuICAgICAgICAgICAgICAgICAgICA+PC9saWItcHJldmlldy1saXN0PlxuICAgICAgICAgICAgICAgIDwvbGliLWZvcm0tZmllbGQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxsaWItZm9ybS1maWVsZC1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInQVBJIENhbGxzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaGVhZGVyQWN0aW9uc109XCJhcGlPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChhY3Rpb25SZXF1ZXN0ZWQpPVwiYXBpQWN0aW9uUmVxdWVzdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWZpZWxkLWlucHV0XCIgW3ZhbHVlXT1cImFwaUNhbGxVUkxcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jb3B5IGNvcHlcIiAoY2xpY2spPVwiY29weVRvQ2xpcGJvYXJkKGFwaUNhbGxVUkwpXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGliLWpzb24tdmlldyAqbmdJZj1cImZvcm1EYXRhXCIgWyhkYXRhKV09XCJhcGlEYXRhXCIgW3JlYWRPbmx5XT1cInRydWVcIiBbc2hvd0NvcHldPVwidHJ1ZVwiPjwvbGliLWpzb24tdmlldz5cbiAgICAgICAgICAgICAgICA8L2xpYi1mb3JtLWZpZWxkLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAtY29sdW1uXCIgKm5nSWY9XCJmb3JtVmlldyA9PT0gJ3JhdydcIj5cbiAgICAgICAgICAgIDxsaWItanNvbi12aWV3ICpuZ0lmPVwiZm9ybURhdGFcIiBbKGRhdGEpXT1cImZvcm1EYXRhXCI+PC9saWItanNvbi12aWV3PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPGxpYi1sb2FkaW5nLWluZGljYXRvciAqbmdJZj1cImlzTG9hZGluZ1wiIFtpc0xvYWRpbmddPVwiaXNMb2FkaW5nXCI+PC9saWItbG9hZGluZy1pbmRpY2F0b3I+Il19
|