@mavogel/cdk-vscode-server 0.0.16 → 0.0.17
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/.jsii +39 -30
- package/.prettierrc +0 -0
- package/API.md +25 -7
- package/CONTRIBUTING.md +2 -0
- package/assets/installer/installer.lambda/index.js +28 -9
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/installer/installer.d.ts +1 -1
- package/lib/installer/installer.js +220 -230
- package/lib/installer/installer.lambda.d.ts +2 -2
- package/lib/installer/installer.lambda.js +16 -16
- package/lib/mappings.d.ts +1 -1
- package/lib/mappings.js +25 -7
- package/lib/prefixlist-retriever/prefixlist-retriever.d.ts +2 -2
- package/lib/prefixlist-retriever/prefixlist-retriever.js +17 -16
- package/lib/secret-retriever/secret-retriever.d.ts +2 -2
- package/lib/secret-retriever/secret-retriever.js +30 -24
- package/lib/secret-retriever/secret-retriever.lambda.d.ts +1 -1
- package/lib/secret-retriever/secret-retriever.lambda.js +6 -6
- package/lib/suppress-nags.d.ts +1 -1
- package/lib/suppress-nags.js +3 -3
- package/lib/vscode-server.d.ts +30 -3
- package/lib/vscode-server.js +175 -150
- package/mavogelcdkvscodeserver/jsii/jsii.go +2 -2
- package/mavogelcdkvscodeserver/version +1 -1
- package/package.json +6 -2
package/lib/vscode-server.js
CHANGED
|
@@ -20,8 +20,17 @@ const secret_retriever_1 = require("./secret-retriever/secret-retriever");
|
|
|
20
20
|
*/
|
|
21
21
|
var LinuxFlavorType;
|
|
22
22
|
(function (LinuxFlavorType) {
|
|
23
|
+
/**
|
|
24
|
+
* Ubuntu 22
|
|
25
|
+
*/
|
|
23
26
|
LinuxFlavorType["UBUNTU_22"] = "ubuntu22";
|
|
27
|
+
/**
|
|
28
|
+
* Ubuntu 24
|
|
29
|
+
*/
|
|
24
30
|
LinuxFlavorType["UBUNTU_24"] = "ubuntu24";
|
|
31
|
+
/**
|
|
32
|
+
* Amazon Linux 2023
|
|
33
|
+
*/
|
|
25
34
|
LinuxFlavorType["AMAZON_LINUX_2023"] = "al2023";
|
|
26
35
|
})(LinuxFlavorType || (exports.LinuxFlavorType = LinuxFlavorType = {}));
|
|
27
36
|
/**
|
|
@@ -29,17 +38,26 @@ var LinuxFlavorType;
|
|
|
29
38
|
*/
|
|
30
39
|
var LinuxArchitectureType;
|
|
31
40
|
(function (LinuxArchitectureType) {
|
|
41
|
+
/**
|
|
42
|
+
* ARM architecture
|
|
43
|
+
*/
|
|
32
44
|
LinuxArchitectureType["ARM"] = "arm";
|
|
45
|
+
/**
|
|
46
|
+
* AMD64 architecture
|
|
47
|
+
*/
|
|
33
48
|
LinuxArchitectureType["AMD64"] = "amd64";
|
|
34
49
|
})(LinuxArchitectureType || (exports.LinuxArchitectureType = LinuxArchitectureType = {}));
|
|
50
|
+
/**
|
|
51
|
+
* VSCodeServer - spin it up in under 10 minutes
|
|
52
|
+
*/
|
|
35
53
|
class VSCodeServer extends constructs_1.Construct {
|
|
36
54
|
constructor(scope, id, props) {
|
|
37
55
|
super(scope, id);
|
|
38
56
|
// defaults
|
|
39
|
-
const vsCodeUser = props?.vscodeUser ??
|
|
40
|
-
const instanceName = props?.instanceName ??
|
|
57
|
+
const vsCodeUser = props?.vscodeUser ?? "participant";
|
|
58
|
+
const instanceName = props?.instanceName ?? "VSCodeServer";
|
|
41
59
|
const instanceVolumeSize = props?.instanceVolumeSize ?? 40;
|
|
42
|
-
const homeFolder = props?.homeFolder ??
|
|
60
|
+
const homeFolder = props?.homeFolder ?? "/Workshop";
|
|
43
61
|
const instanceClass = props?.instanceClass ?? ec2.InstanceClass.M7G;
|
|
44
62
|
const instanceSize = props?.instanceSize ?? ec2.InstanceSize.XLARGE;
|
|
45
63
|
const instanceType = ec2.InstanceType.of(instanceClass, instanceSize);
|
|
@@ -47,10 +65,10 @@ class VSCodeServer extends constructs_1.Construct {
|
|
|
47
65
|
const instanceCpuArchitecture = props?.instanceCpuArchitecture ?? LinuxArchitectureType.ARM;
|
|
48
66
|
const machineImageFromSsmParameter = (0, mappings_1.getAmiSSMParameterForLinuxArchitectureAndFlavor)(instanceCpuArchitecture, instanceOperatingSystem);
|
|
49
67
|
const additionalInstanceRolePolicies = props?.additionalInstanceRolePolicies ?? [];
|
|
50
|
-
let vscodePassword = props?.vscodePassword ??
|
|
51
|
-
if (
|
|
68
|
+
let vscodePassword = props?.vscodePassword ?? "";
|
|
69
|
+
if (vscodePassword == "") {
|
|
52
70
|
// Create a secret which is then inject in the SSM document to install vscode server
|
|
53
|
-
const secret = new secretsmanager.Secret(this,
|
|
71
|
+
const secret = new secretsmanager.Secret(this, "password-secret", {
|
|
54
72
|
generateSecretString: {
|
|
55
73
|
passwordLength: 16,
|
|
56
74
|
secretStringTemplate: JSON.stringify({
|
|
@@ -58,13 +76,14 @@ class VSCodeServer extends constructs_1.Construct {
|
|
|
58
76
|
}),
|
|
59
77
|
excludePunctuation: true,
|
|
60
78
|
includeSpace: false,
|
|
61
|
-
generateStringKey:
|
|
79
|
+
generateStringKey: "password",
|
|
62
80
|
},
|
|
63
81
|
});
|
|
64
|
-
cdk_nag_1.NagSuppressions.addResourceSuppressions([
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
82
|
+
cdk_nag_1.NagSuppressions.addResourceSuppressions([secret], [
|
|
83
|
+
{
|
|
84
|
+
id: "AwsSolutions-SMG4",
|
|
85
|
+
reason: "For this tmp vc code server we do not need password rotation",
|
|
86
|
+
},
|
|
68
87
|
], true);
|
|
69
88
|
// Have a custom resource to pass the secret data on? -> yes because not resolvable on compile time
|
|
70
89
|
const secretRetriever = secret_retriever_1.SecretRetriever.new({
|
|
@@ -73,98 +92,92 @@ class VSCodeServer extends constructs_1.Construct {
|
|
|
73
92
|
vscodePassword = secretRetriever.secretPasswordPlaintext;
|
|
74
93
|
}
|
|
75
94
|
// Create default vpc
|
|
76
|
-
const vpc = new ec2.Vpc(this,
|
|
95
|
+
const vpc = new ec2.Vpc(this, "vpc", {
|
|
77
96
|
maxAzs: 2,
|
|
78
97
|
createInternetGateway: true,
|
|
79
98
|
subnetConfiguration: [
|
|
80
99
|
{
|
|
81
|
-
name:
|
|
100
|
+
name: "public",
|
|
82
101
|
subnetType: ec2.SubnetType.PUBLIC,
|
|
83
102
|
},
|
|
84
103
|
],
|
|
85
104
|
enableDnsHostnames: true,
|
|
86
105
|
enableDnsSupport: true,
|
|
87
106
|
});
|
|
88
|
-
cdk_nag_1.NagSuppressions.addResourceSuppressions([
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
107
|
+
cdk_nag_1.NagSuppressions.addResourceSuppressions([vpc], [
|
|
108
|
+
{
|
|
109
|
+
id: "AwsSolutions-VPC7",
|
|
110
|
+
reason: "For this tmp vpc we do not need flow logs",
|
|
111
|
+
},
|
|
92
112
|
], true);
|
|
93
113
|
// Create a SecGroup associated withe the CF dist pList
|
|
94
|
-
const secGroup = new ec2.SecurityGroup(this,
|
|
114
|
+
const secGroup = new ec2.SecurityGroup(this, "cf-to-server-sg", {
|
|
95
115
|
vpc,
|
|
96
|
-
description:
|
|
97
|
-
securityGroupName:
|
|
116
|
+
description: "SG for VSCodeServer - only allow CloudFront ingress",
|
|
117
|
+
securityGroupName: "cloudfront-to-vscode-server",
|
|
98
118
|
});
|
|
99
|
-
const awsManagedPrefixList = new prefixlist_retriever_1.AwsManagedPrefixList(this,
|
|
100
|
-
name:
|
|
119
|
+
const awsManagedPrefixList = new prefixlist_retriever_1.AwsManagedPrefixList(this, "cf-prefixlistId", {
|
|
120
|
+
name: "com.amazonaws.global.cloudfront.origin-facing",
|
|
101
121
|
});
|
|
102
|
-
cdk_nag_1.NagSuppressions.addResourceSuppressions([
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
122
|
+
cdk_nag_1.NagSuppressions.addResourceSuppressions([awsManagedPrefixList], [
|
|
123
|
+
{
|
|
124
|
+
id: "AwsSolutions-IAM5",
|
|
125
|
+
reason: "For this provider wildcards are fine",
|
|
126
|
+
},
|
|
106
127
|
], true);
|
|
107
|
-
secGroup.addIngressRule(ec2.Peer.prefixList(awsManagedPrefixList.prefixList.prefixListId), ec2.Port.tcp(80),
|
|
128
|
+
secGroup.addIngressRule(ec2.Peer.prefixList(awsManagedPrefixList.prefixList.prefixListId), ec2.Port.tcp(80), "Allow HTTP from com.amazonaws.global.cloudfront.origin-facing");
|
|
108
129
|
// Create an EC2 instance associated with the sec group + instance profile and role
|
|
109
|
-
const instanceRole = new iam.Role(this,
|
|
110
|
-
assumedBy: new iam.CompositePrincipal(new iam.ServicePrincipal(
|
|
130
|
+
const instanceRole = new iam.Role(this, "server-instance-role", {
|
|
131
|
+
assumedBy: new iam.CompositePrincipal(new iam.ServicePrincipal("ec2.amazonaws.com"), new iam.ServicePrincipal("ssm.amazonaws.com")),
|
|
111
132
|
inlinePolicies: {
|
|
112
133
|
VSCodeInstanceInlinePolicy: new iam.PolicyDocument({
|
|
113
134
|
statements: [
|
|
114
135
|
new iam.PolicyStatement({
|
|
115
|
-
sid:
|
|
136
|
+
sid: "StsAccess",
|
|
116
137
|
effect: iam.Effect.ALLOW,
|
|
117
138
|
actions: [
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
],
|
|
145
|
-
resources: [
|
|
146
|
-
`arn:aws:iam::${aws_cdk_lib_1.Stack.of(this).account}:role/cdk-*`,
|
|
139
|
+
"sts:AssumeRole",
|
|
140
|
+
"iam:AddRoleToInstanceProfile",
|
|
141
|
+
"iam:AttachRolePolicy",
|
|
142
|
+
"iam:CreateRole",
|
|
143
|
+
"iam:CreateServiceLinkedRole",
|
|
144
|
+
"iam:DeleteRole",
|
|
145
|
+
"iam:DeleteRolePermissionsBoundary",
|
|
146
|
+
"iam:DeleteRolePolicy",
|
|
147
|
+
"iam:DeleteServiceLinkedRole",
|
|
148
|
+
"iam:DetachRolePolicy",
|
|
149
|
+
"iam:GetRole",
|
|
150
|
+
"iam:GetRolePolicy",
|
|
151
|
+
"iam:GetServiceLinkedRoleDeletionStatus",
|
|
152
|
+
"iam:ListAttachedRolePolicies",
|
|
153
|
+
"iam:ListInstanceProfilesForRole",
|
|
154
|
+
"iam:ListRolePolicies",
|
|
155
|
+
"iam:ListRoles",
|
|
156
|
+
"iam:ListRoleTags",
|
|
157
|
+
"iam:PutRolePermissionsBoundary",
|
|
158
|
+
"iam:PutRolePolicy",
|
|
159
|
+
"iam:RemoveRoleFromInstanceProfile",
|
|
160
|
+
"iam:TagRole",
|
|
161
|
+
"iam:UntagRole",
|
|
162
|
+
"iam:UpdateAssumeRolePolicy",
|
|
163
|
+
"iam:UpdateRole",
|
|
164
|
+
"iam:UpdateRoleDescription",
|
|
147
165
|
],
|
|
166
|
+
resources: [`arn:aws:iam::${aws_cdk_lib_1.Stack.of(this).account}:role/cdk-*`],
|
|
148
167
|
}),
|
|
149
168
|
new iam.PolicyStatement({
|
|
150
169
|
effect: iam.Effect.ALLOW,
|
|
151
|
-
actions: [
|
|
152
|
-
|
|
153
|
-
],
|
|
154
|
-
resources: [
|
|
155
|
-
`arn:aws:iam::${aws_cdk_lib_1.Stack.of(this).account}:role/cdk-*`,
|
|
156
|
-
],
|
|
170
|
+
actions: ["iam:PassRole"],
|
|
171
|
+
resources: [`arn:aws:iam::${aws_cdk_lib_1.Stack.of(this).account}:role/cdk-*`],
|
|
157
172
|
conditions: {
|
|
158
173
|
StringLike: {
|
|
159
|
-
|
|
174
|
+
"iam:PassedToService": "cloudformation.amazonaws.com",
|
|
160
175
|
},
|
|
161
176
|
},
|
|
162
177
|
}),
|
|
163
178
|
new iam.PolicyStatement({
|
|
164
179
|
effect: iam.Effect.ALLOW,
|
|
165
|
-
actions: [
|
|
166
|
-
'cloudformation:*',
|
|
167
|
-
],
|
|
180
|
+
actions: ["cloudformation:*"],
|
|
168
181
|
resources: [
|
|
169
182
|
`arn:aws:cloudformation:*:${aws_cdk_lib_1.Stack.of(this).account}:stack/CDKToolkit/*`,
|
|
170
183
|
],
|
|
@@ -172,30 +185,28 @@ class VSCodeServer extends constructs_1.Construct {
|
|
|
172
185
|
new iam.PolicyStatement({
|
|
173
186
|
effect: iam.Effect.ALLOW,
|
|
174
187
|
actions: [
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
188
|
+
"cloudformation:CreateChangeSet",
|
|
189
|
+
"cloudformation:ExecuteChangeSet",
|
|
190
|
+
"cloudformation:DeleteChangeSet",
|
|
178
191
|
],
|
|
179
|
-
resources: [
|
|
192
|
+
resources: ["*"],
|
|
180
193
|
}),
|
|
181
194
|
new iam.PolicyStatement({
|
|
182
|
-
sid:
|
|
183
|
-
actions: [
|
|
184
|
-
|
|
185
|
-
],
|
|
186
|
-
resources: ['*'],
|
|
195
|
+
sid: "S3Access",
|
|
196
|
+
actions: ["s3:*"],
|
|
197
|
+
resources: ["*"],
|
|
187
198
|
}),
|
|
188
199
|
new iam.PolicyStatement({
|
|
189
|
-
sid:
|
|
200
|
+
sid: "ECRAccess",
|
|
190
201
|
effect: iam.Effect.ALLOW,
|
|
191
202
|
actions: [
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
203
|
+
"ecr:SetRepositoryPolicy",
|
|
204
|
+
"ecr:GetLifecyclePolicy",
|
|
205
|
+
"ecr:PutLifecyclePolicy",
|
|
206
|
+
"ecr:PutImageScanningConfiguration",
|
|
207
|
+
"ecr:DescribeRepositories",
|
|
208
|
+
"ecr:CreateRepository",
|
|
209
|
+
"ecr:DeleteRepository",
|
|
199
210
|
],
|
|
200
211
|
resources: [
|
|
201
212
|
`arn:aws:ecr:*:${aws_cdk_lib_1.Stack.of(this).account}:repository/cdk-*`,
|
|
@@ -204,9 +215,9 @@ class VSCodeServer extends constructs_1.Construct {
|
|
|
204
215
|
new iam.PolicyStatement({
|
|
205
216
|
effect: iam.Effect.ALLOW,
|
|
206
217
|
actions: [
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
218
|
+
"ssm:GetParameter*",
|
|
219
|
+
"ssm:PutParameter*",
|
|
220
|
+
"ssm:DeleteParameter*",
|
|
210
221
|
],
|
|
211
222
|
resources: [
|
|
212
223
|
`arn:aws:ssm:*:${aws_cdk_lib_1.Stack.of(this).account}:parameter/cdk-bootstrap/*`,
|
|
@@ -215,20 +226,20 @@ class VSCodeServer extends constructs_1.Construct {
|
|
|
215
226
|
new iam.PolicyStatement({
|
|
216
227
|
effect: iam.Effect.ALLOW,
|
|
217
228
|
actions: [
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
229
|
+
"ec2:DescribeInstances",
|
|
230
|
+
"ec2:ModifyVolume",
|
|
231
|
+
"ec2:DescribeVolumesModifications*",
|
|
221
232
|
],
|
|
222
|
-
resources: [
|
|
233
|
+
resources: ["*"],
|
|
223
234
|
}),
|
|
224
235
|
new iam.PolicyStatement({
|
|
225
236
|
effect: iam.Effect.ALLOW,
|
|
226
237
|
actions: [
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
238
|
+
"codepipeline:EnableStageTransition",
|
|
239
|
+
"codepipeline:DisableStageTransition",
|
|
240
|
+
"codepipeline:StartPipelineExecution",
|
|
241
|
+
"codepipeline:StopPipelineExecution",
|
|
242
|
+
"codepipeline:UpdatePipeline",
|
|
232
243
|
],
|
|
233
244
|
resources: [
|
|
234
245
|
`arn:aws:codepipeline:*:${aws_cdk_lib_1.Stack.of(this).account}:*/*`,
|
|
@@ -236,31 +247,31 @@ class VSCodeServer extends constructs_1.Construct {
|
|
|
236
247
|
}),
|
|
237
248
|
new iam.PolicyStatement({
|
|
238
249
|
effect: iam.Effect.ALLOW,
|
|
239
|
-
actions: [
|
|
240
|
-
|
|
241
|
-
],
|
|
242
|
-
resources: [
|
|
243
|
-
`arn:aws:kms:*:${aws_cdk_lib_1.Stack.of(this).account}:key/*`,
|
|
244
|
-
],
|
|
250
|
+
actions: ["kms:Decrypt"],
|
|
251
|
+
resources: [`arn:aws:kms:*:${aws_cdk_lib_1.Stack.of(this).account}:key/*`],
|
|
245
252
|
}),
|
|
246
253
|
...additionalInstanceRolePolicies,
|
|
247
254
|
],
|
|
248
255
|
}),
|
|
249
256
|
},
|
|
250
257
|
managedPolicies: [
|
|
251
|
-
iam.ManagedPolicy.fromAwsManagedPolicyName(
|
|
252
|
-
iam.ManagedPolicy.fromAwsManagedPolicyName(
|
|
253
|
-
iam.ManagedPolicy.fromAwsManagedPolicyName(
|
|
254
|
-
iam.ManagedPolicy.fromAwsManagedPolicyName(
|
|
258
|
+
iam.ManagedPolicy.fromAwsManagedPolicyName("AmazonSSMManagedInstanceCore"),
|
|
259
|
+
iam.ManagedPolicy.fromAwsManagedPolicyName("CloudWatchAgentServerPolicy"),
|
|
260
|
+
iam.ManagedPolicy.fromAwsManagedPolicyName("AmazonQDeveloperAccess"),
|
|
261
|
+
iam.ManagedPolicy.fromAwsManagedPolicyName("ReadOnlyAccess"),
|
|
255
262
|
],
|
|
256
263
|
});
|
|
257
|
-
cdk_nag_1.NagSuppressions.addResourceSuppressions([
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
264
|
+
cdk_nag_1.NagSuppressions.addResourceSuppressions([instanceRole], [
|
|
265
|
+
{
|
|
266
|
+
id: "AwsSolutions-IAM4",
|
|
267
|
+
reason: "For this tmp role we do not need to restrict managed policies",
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
id: "AwsSolutions-IAM5",
|
|
271
|
+
reason: "For this tmp role the wildcards are fine",
|
|
272
|
+
},
|
|
262
273
|
], true);
|
|
263
|
-
const instance = new ec2.Instance(this,
|
|
274
|
+
const instance = new ec2.Instance(this, "server-instance", {
|
|
264
275
|
vpc,
|
|
265
276
|
instanceName,
|
|
266
277
|
instanceType,
|
|
@@ -275,7 +286,7 @@ class VSCodeServer extends constructs_1.Construct {
|
|
|
275
286
|
detailedMonitoring: true,
|
|
276
287
|
blockDevices: [
|
|
277
288
|
{
|
|
278
|
-
deviceName:
|
|
289
|
+
deviceName: "/dev/sda1",
|
|
279
290
|
volume: ec2.BlockDeviceVolume.ebs(instanceVolumeSize, {
|
|
280
291
|
volumeType: ec2.EbsDeviceVolumeType.GP3,
|
|
281
292
|
encrypted: true,
|
|
@@ -292,32 +303,33 @@ class VSCodeServer extends constructs_1.Construct {
|
|
|
292
303
|
- mkdir -p ${homeFolder} && chown -R ${vsCodeUser}:${vsCodeUser} ${homeFolder}
|
|
293
304
|
`),
|
|
294
305
|
});
|
|
295
|
-
cdk_nag_1.NagSuppressions.addResourceSuppressions([
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
306
|
+
cdk_nag_1.NagSuppressions.addResourceSuppressions([instance], [
|
|
307
|
+
{
|
|
308
|
+
id: "AwsSolutions-EC29",
|
|
309
|
+
reason: "For this tmp instance we do not need an asg",
|
|
310
|
+
},
|
|
299
311
|
], true);
|
|
300
312
|
// Create a CF distribution (special id) and special CachePolicy to instance
|
|
301
|
-
const cfCachePolicy = new cf.CachePolicy(this,
|
|
313
|
+
const cfCachePolicy = new cf.CachePolicy(this, "cf-cache-policy", {
|
|
302
314
|
cachePolicyName: `cf-cache-policy-vscodeserver-${aws_cdk_lib_1.Stack.of(this).stackName}`,
|
|
303
|
-
comment:
|
|
315
|
+
comment: "Cache policy for VSCodeServer",
|
|
304
316
|
minTtl: aws_cdk_lib_1.Duration.seconds(1),
|
|
305
317
|
maxTtl: aws_cdk_lib_1.Duration.seconds(31536000),
|
|
306
318
|
defaultTtl: aws_cdk_lib_1.Duration.seconds(86400),
|
|
307
319
|
cookieBehavior: cf.CacheCookieBehavior.all(),
|
|
308
320
|
enableAcceptEncodingGzip: false,
|
|
309
321
|
headerBehavior: {
|
|
310
|
-
behavior:
|
|
322
|
+
behavior: "whitelist",
|
|
311
323
|
headers: [
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
324
|
+
"Accept-Charset",
|
|
325
|
+
"Authorization",
|
|
326
|
+
"Origin",
|
|
327
|
+
"Accept",
|
|
328
|
+
"Referer",
|
|
329
|
+
"Host",
|
|
330
|
+
"Accept-Language",
|
|
331
|
+
"Accept-Encoding",
|
|
332
|
+
"Accept-Datetime",
|
|
321
333
|
],
|
|
322
334
|
},
|
|
323
335
|
queryStringBehavior: cf.CacheQueryStringBehavior.all(),
|
|
@@ -326,48 +338,61 @@ class VSCodeServer extends constructs_1.Construct {
|
|
|
326
338
|
protocolPolicy: cf.OriginProtocolPolicy.HTTP_ONLY,
|
|
327
339
|
originId: `Cloudfront-${aws_cdk_lib_1.Stack.of(this).stackName}-${aws_cdk_lib_1.Stack.of(this).stackName}`,
|
|
328
340
|
});
|
|
329
|
-
const distribution = new cf.Distribution(this,
|
|
341
|
+
const distribution = new cf.Distribution(this, "cf-distribution", {
|
|
330
342
|
enabled: true,
|
|
331
343
|
httpVersion: cf.HttpVersion.HTTP2_AND_3,
|
|
332
344
|
// NOTE: 'Distributions that use the default CloudFront viewer certificate or use 'vip' for the 'SslSupportMethod'
|
|
333
345
|
// are non-compliant with this rule, as the minimum security policy is set to TLSv1 regardless
|
|
334
346
|
// of the specified 'MinimumProtocolVersion'
|
|
335
347
|
// minimumProtocolVersion: cf.SecurityPolicyProtocol.TLS_V1_2_2021,
|
|
336
|
-
comment:
|
|
348
|
+
comment: "Distribution for VSCodeServer",
|
|
337
349
|
priceClass: cf.PriceClass.PRICE_CLASS_ALL,
|
|
338
350
|
defaultBehavior: {
|
|
339
351
|
allowedMethods: cf.AllowedMethods.ALLOW_ALL,
|
|
340
352
|
cachePolicy: cfCachePolicy,
|
|
341
353
|
originRequestPolicy: {
|
|
342
354
|
// Managed-AllViewer - see https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-origin-request-policies.html#:~:text=When%20using%20AWS,47e4%2Db989%2D5492eafa07d3
|
|
343
|
-
originRequestPolicyId:
|
|
355
|
+
originRequestPolicyId: "216adef6-5c7f-47e4-b989-5492eafa07d3",
|
|
344
356
|
},
|
|
345
357
|
viewerProtocolPolicy: cf.ViewerProtocolPolicy.ALLOW_ALL,
|
|
346
358
|
origin,
|
|
347
359
|
},
|
|
348
360
|
additionalBehaviors: {
|
|
349
|
-
|
|
361
|
+
"/proxy/*": {
|
|
350
362
|
allowedMethods: cf.AllowedMethods.ALLOW_ALL,
|
|
351
363
|
compress: false,
|
|
352
364
|
// see https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-cache-policies.html#managed-cache-policy-caching-disabled
|
|
353
365
|
cachePolicy: cf.CachePolicy.CACHING_DISABLED,
|
|
354
366
|
originRequestPolicy: {
|
|
355
367
|
// Managed-AllViewer - see https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-origin-request-policies.html#:~:text=When%20using%20AWS,47e4%2Db989%2D5492eafa07d3
|
|
356
|
-
originRequestPolicyId:
|
|
368
|
+
originRequestPolicyId: "216adef6-5c7f-47e4-b989-5492eafa07d3",
|
|
357
369
|
},
|
|
358
370
|
viewerProtocolPolicy: cf.ViewerProtocolPolicy.ALLOW_ALL,
|
|
359
371
|
origin,
|
|
360
372
|
},
|
|
361
373
|
},
|
|
362
374
|
});
|
|
363
|
-
cdk_nag_1.NagSuppressions.addResourceSuppressions([
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
{
|
|
369
|
-
|
|
370
|
-
|
|
375
|
+
cdk_nag_1.NagSuppressions.addResourceSuppressions([distribution], [
|
|
376
|
+
{
|
|
377
|
+
id: "AwsSolutions-CFR1",
|
|
378
|
+
reason: "For this tmp distribution we do not need geo restrictions",
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
id: "AwsSolutions-CFR2",
|
|
382
|
+
reason: "For this tmp distribution we do not need waf integration",
|
|
383
|
+
},
|
|
384
|
+
{
|
|
385
|
+
id: "AwsSolutions-CFR3",
|
|
386
|
+
reason: "For this tmp distribution we do not need access logging enabled",
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
id: "AwsSolutions-CFR4",
|
|
390
|
+
reason: "For this tmp distribution we do not need limit SSL protocols as we use the default viewer cert",
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
id: "AwsSolutions-CFR5",
|
|
394
|
+
reason: "For this tmp distribution we do not need limit SSL protocols as we use the default viewer cert",
|
|
395
|
+
},
|
|
371
396
|
], true);
|
|
372
397
|
// Use a custom resource lambda to run the SSM document on the instance
|
|
373
398
|
switch (instanceOperatingSystem) {
|
|
@@ -400,18 +425,18 @@ class VSCodeServer extends constructs_1.Construct {
|
|
|
400
425
|
// atm this is achieved by the integ tests
|
|
401
426
|
// Outputs
|
|
402
427
|
this.domainName = `https://${distribution.domainName}/?folder=${homeFolder}`;
|
|
403
|
-
new aws_cdk_lib_1.CfnOutput(this,
|
|
404
|
-
description:
|
|
428
|
+
new aws_cdk_lib_1.CfnOutput(this, "domainName", {
|
|
429
|
+
description: "The domain name of the distribution",
|
|
405
430
|
value: this.domainName,
|
|
406
431
|
});
|
|
407
432
|
this.password = vscodePassword;
|
|
408
|
-
new aws_cdk_lib_1.CfnOutput(this,
|
|
409
|
-
description:
|
|
433
|
+
new aws_cdk_lib_1.CfnOutput(this, "password", {
|
|
434
|
+
description: "The password for the VSCode server",
|
|
410
435
|
value: vscodePassword,
|
|
411
436
|
});
|
|
412
437
|
}
|
|
413
438
|
}
|
|
414
439
|
exports.VSCodeServer = VSCodeServer;
|
|
415
440
|
_a = JSII_RTTI_SYMBOL_1;
|
|
416
|
-
VSCodeServer[_a] = { fqn: "@mavogel/cdk-vscode-server.VSCodeServer", version: "0.0.
|
|
417
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnNjb2RlLXNlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92c2NvZGUtc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQXlEO0FBQ3pELGlEQUFpRDtBQUNqRCwwREFBMEQ7QUFDMUQsMkNBQTJDO0FBQzNDLDJDQUEyQztBQUMzQyxpRUFBaUU7QUFDakUscUNBQTBDO0FBQzFDLDJDQUF1QztBQUN2QyxxREFBa0Q7QUFDbEQseUNBQTZFO0FBQzdFLHNGQUFtRjtBQUNuRiwwRUFBc0U7QUF3RnRFOztHQUVHO0FBQ0gsSUFBWSxlQUlYO0FBSkQsV0FBWSxlQUFlO0lBQ3pCLHlDQUFzQixDQUFBO0lBQ3RCLHlDQUFzQixDQUFBO0lBQ3RCLCtDQUE0QixDQUFBO0FBQzlCLENBQUMsRUFKVyxlQUFlLCtCQUFmLGVBQWUsUUFJMUI7QUFFRDs7R0FFRztBQUNILElBQVkscUJBR1g7QUFIRCxXQUFZLHFCQUFxQjtJQUMvQixvQ0FBVyxDQUFBO0lBQ1gsd0NBQWUsQ0FBQTtBQUNqQixDQUFDLEVBSFcscUJBQXFCLHFDQUFyQixxQkFBcUIsUUFHaEM7QUFFRCxNQUFhLFlBQWEsU0FBUSxzQkFBUztJQUl6QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXlCO1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsV0FBVztRQUNYLE1BQU0sVUFBVSxHQUFHLEtBQUssRUFBRSxVQUFVLElBQUksYUFBYSxDQUFDO1FBQ3RELE1BQU0sWUFBWSxHQUFHLEtBQUssRUFBRSxZQUFZLElBQUksY0FBYyxDQUFDO1FBQzNELE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxFQUFFLGtCQUFrQixJQUFJLEVBQUUsQ0FBQztRQUMzRCxNQUFNLFVBQVUsR0FBRyxLQUFLLEVBQUUsVUFBVSxJQUFJLFdBQVcsQ0FBQztRQUNwRCxNQUFNLGFBQWEsR0FBRyxLQUFLLEVBQUUsYUFBYSxJQUFJLEdBQUcs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QyxJQUFJLEVBQUUsWUFBWSxFQUFFO1lBQ2hDLFdBQVcsRUFBRSxxQ0FBcUM7WUFDbEQsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVO1NBQ3ZCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDO1FBQy9CLElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQzlCLFdBQVcsRUFBRSxvQ0FBb0M7WUFDakQsS0FBSyxFQUFFLGNBQWM7U0FDdEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUF4Wkgsb0NBeVpDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuT3V0cHV0LCBEdXJhdGlvbiwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBjZiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udCc7XG5pbXBvcnQgKiBhcyBjZm8gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQtb3JpZ2lucyc7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBzZWNyZXRzbWFuYWdlciBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXInO1xuaW1wb3J0IHsgTmFnU3VwcHJlc3Npb25zIH0gZnJvbSAnY2RrLW5hZyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEluc3RhbGxlciB9IGZyb20gJy4vaW5zdGFsbGVyL2luc3RhbGxlcic7XG5pbXBvcnQgeyBnZXRBbWlTU01QYXJhbWV0ZXJGb3JMaW51eEFyY2hpdGVjdHVyZUFuZEZsYXZvciB9IGZyb20gJy4vbWFwcGluZ3MnO1xuaW1wb3J0IHsgQXdzTWFuYWdlZFByZWZpeExpc3QgfSBmcm9tICcuL3ByZWZpeGxpc3QtcmV0cmlldmVyL3ByZWZpeGxpc3QtcmV0cmlldmVyJztcbmltcG9ydCB7IFNlY3JldFJldHJpZXZlciB9IGZyb20gJy4vc2VjcmV0LXJldHJpZXZlci9zZWNyZXQtcmV0cmlldmVyJztcblxuZXhwb3J0IGludGVyZmFjZSBWU0NvZGVTZXJ2ZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBVc2VyTmFtZSBmb3IgVlNDb2RlIFNlcnZlclxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHBhcnRpY2lwYW50XG4gICAqL1xuICByZWFkb25seSB2c2NvZGVVc2VyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXNzd29yZCBmb3IgVlNDb2RlIFNlcnZlclxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGVtcHR5IGFuZCB3aWxsIHRoZW4gYmUgZ2VuZXJhdGVkXG4gICAqL1xuICByZWFkb25seSB2c2NvZGVQYXNzd29yZD86IHN0cmluZztcblxuICAvKipcbiAgICogVlNDb2RlIFNlcnZlciBFQzIgaW5zdGFuY2UgbmFtZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFZTQ29kZVNlcnZlclxuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFuY2VOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWU0NvZGUgU2VydmVyIEVDMiBpbnN0YW5jZSB2b2x1bWUgc2l6ZSBpbiBHQlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIDQwXG4gICAqL1xuICByZWFkb25seSBpbnN0YW5jZVZvbHVtZVNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFZTQ29kZSBTZXJ2ZXIgRUMyIGluc3RhbmNlIGNsYXNzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbTdnXG4gICAqL1xuICByZWFkb25seSBpbnN0YW5jZUNsYXNzPzogZWMyLkluc3RhbmNlQ2xhc3M7XG5cbiAgLyoqXG4gICAqIFZTQ29kZSBTZXJ2ZXIgRUMyIGluc3RhbmNlIHNpemVcbiAgICpcbiAgICogQGRlZmF1bHQgLSB4bGFyZ2VcbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbmNlU2l6ZT86IGVjMi5JbnN0YW5jZVNpemU7XG5cbiAgLyoqXG4gICAqIFZTQ29kZSBTZXJ2ZXIgRUMyIG9wZXJhdGluZyBzeXN0ZW1cbiAgICpcbiAgICogQGRlZmF1bHQgLSBVYnVudHUtMjJcbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbmNlT3BlcmF0aW5nU3lzdGVtPzogTGludXhGbGF2b3JUeXBlO1xuXG4gIC8qKlxuICAgKiBWU0NvZGUgU2VydmVyIEVDMiBjcHUgYXJjaGl0ZWN0dXJlIGZvciB0aGUgb3BlcmF0aW5nIHN5c3RlbVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFybVxuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFuY2VDcHVBcmNoaXRlY3R1cmU/OiBMaW51eEFyY2hpdGVjdHVyZVR5cGU7XG5cbiAgLyoqXG4gICAqIEZvbGRlciB0byBvcGVuIGluIFZTIENvZGUgc2VydmVyXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gL1dvcmtzaG9wXG4gICAqL1xuICByZWFkb25seSBob21lRm9sZGVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCYXNlIHBhdGggZm9yIHRoZSBhcHBsaWNhdGlvbiB0byBiZSBhZGRlZCB0byBOZ2lueCBzaXRlcy1hdmFpbGFibGUgbGlzdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFwcFxuICAgKi9cbiAgcmVhZG9ubHkgZGV2U2VydmVyQmFzZVBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBvcnQgZm9yIHRoZSBEZXZTZXJ2ZXJcbiAgICpcbiAgICogQGRlZmF1bHQgLSA4MDgxXG4gICAqL1xuICByZWFkb25seSBkZXZTZXJ2ZXJQb3J0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGluc3RhbmNlIHJvbGUgcG9saWNpZXNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBbXVxuICAgKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbEluc3RhbmNlUm9sZVBvbGljaWVzPzogaWFtLlBvbGljeVN0YXRlbWVudFtdO1xufVxuXG4vKipcbiAqIFRoZSBmbGF2b3Igb2YgbGludXggeW91IHdhbnQgdG8gcnVuIHZzY29kZSBzZXJ2ZXIgb25cbiAqL1xuZXhwb3J0IGVudW0gTGludXhGbGF2b3JUeXBlIHtcbiAgVUJVTlRVXzIyID0gJ3VidW50dTIyJyxcbiAgVUJVTlRVXzI0ID0gJ3VidW50dTI0JyxcbiAgQU1BWk9OX0xJTlVYXzIwMjMgPSAnYWwyMDIzJyxcbn1cblxuLyoqXG4gKiBUaGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBjcHUgeW91IHdhbnQgdG8gcnVuIHZzY29kZSBzZXJ2ZXIgb25cbiAqL1xuZXhwb3J0IGVudW0gTGludXhBcmNoaXRlY3R1cmVUeXBlIHtcbiAgQVJNID0gJ2FybScsXG4gIEFNRDY0ID0gJ2FtZDY0Jyxcbn1cblxuZXhwb3J0IGNsYXNzIFZTQ29kZVNlcnZlciBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBkb21haW5OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBwYXNzd29yZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogVlNDb2RlU2VydmVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgLy8gZGVmYXVsdHNcbiAgICBjb25zdCB2c0NvZGVVc2VyID0gcHJvcHM/LnZzY29kZVVzZXIgPz8gJ3BhcnRpY2lwYW50JztcbiAgICBjb25zdCBpbnN0YW5jZU5hbWUgPSBwcm9wcz8uaW5zdGFuY2VOYW1lID8/ICdWU0NvZGVTZXJ2ZXInO1xuICAgIGNvbnN0IGluc3RhbmNlVm9sdW1lU2l6ZSA9IHByb3BzPy5pbnN0YW5jZVZvbHVtZVNpemUgPz8gNDA7XG4gICAgY29uc3QgaG9tZUZvbGRlciA9IHByb3BzPy5ob21lRm9sZGVyID8/ICcvV29ya3Nob3AnO1xuICAgIGNvbnN0IGluc3RhbmNlQ2xhc3MgPSBwcm9wcz8uaW5zdGFuY2VDbGFzcyA/PyBlYzIuSW5zdGFuY2VDbGFzcy5NN0c7XG4gICAgY29uc3QgaW5zdGFuY2VTaXplID0gcHJvcHM/Lmluc3RhbmNlU2l6ZSA/PyBlYzIuSW5zdGFuY2VTaXplLlhMQVJHRTtcbiAgICBjb25zdCBpbnN0YW5jZVR5cGUgPSBlYzIuSW5zdGFuY2VUeXBlLm9mKGluc3RhbmNlQ2xhc3MsIGluc3RhbmNlU2l6ZSk7XG4gICAgY29uc3QgaW5zdGFuY2VPcGVyYXRpbmdTeXN0ZW0gPSBwcm9wcz8uaW5zdGFuY2VPcGVyYXRpbmdTeXN0ZW0gPz8gTGludXhGbGF2b3JUeXBlLlVCVU5UVV8yMjtcbiAgICBjb25zdCBpbnN0YW5jZUNwdUFyY2hpdGVjdHVyZSA9IHByb3BzPy5pbnN0YW5jZUNwdUFyY2hpdGVjdHVyZSA/PyBMaW51eEFyY2hpdGVjdHVyZVR5cGUuQVJNO1xuICAgIGNvbnN0IG1hY2hpbmVJbWFnZUZyb21Tc21QYXJhbWV0ZXIgPSBnZXRBbWlTU01QYXJhbWV0ZXJGb3JMaW51eEFyY2hpdGVjdHVyZUFuZEZsYXZvcihpbnN0YW5jZUNwdUFyY2hpdGVjdHVyZSwgaW5zdGFuY2VPcGVyYXRpbmdTeXN0ZW0pO1xuICAgIGNvbnN0IGFkZGl0aW9uYWxJbnN0YW5jZVJvbGVQb2xpY2llcyA9IHByb3BzPy5hZGRpdGlvbmFsSW5zdGFuY2VSb2xlUG9saWNpZXMgPz8gW107XG5cbiAgICBsZXQgdnNjb2RlUGFzc3dvcmQgPSBwcm9wcz8udnNjb2RlUGFzc3dvcmQgPz8gJyc7XG4gICAgaWYgKCh2c2NvZGVQYXNzd29yZCA9PSAnJykpIHtcbiAgICAgIC8vIENyZWF0ZSBhIHNlY3JldCB3aGljaCBpcyB0aGVuIGluamVjdCBpbiB0aGUgU1NNIGRvY3VtZW50IHRvIGluc3RhbGwgdnNjb2RlIHNlcnZlclxuICAgICAgY29uc3Qgc2VjcmV0ID0gbmV3IHNlY3JldHNtYW5hZ2VyLlNlY3JldCh0aGlzLCAncGFzc3dvcmQtc2VjcmV0Jywge1xuICAgICAgICBnZW5lcmF0ZVNlY3JldFN0cmluZzoge1xuICAgICAgICAgIHBhc3N3b3JkTGVuZ3RoOiAxNixcbiAgICAgICAgICBzZWNyZXRTdHJpbmdUZW1wbGF0ZTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgdXNlcm5hbWU6IHZzQ29kZVVzZXIsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgZXhjbHVkZVB1bmN0dWF0aW9uOiB0cnVlLFxuICAgICAgICAgIGluY2x1ZGVTcGFjZTogZmFsc2UsXG4gICAgICAgICAgZ2VuZXJhdGVTdHJpbmdLZXk6ICdwYXNzd29yZCcsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIE5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhbXG4gICAgICAgIHNlY3JldCxcbiAgICAgIF0sIFtcbiAgICAgICAgeyBpZDogJ0F3c1NvbHV0aW9ucy1TTUc0JywgcmVhc29uOiAnRm9yIHRoaXMgdG1wIHZjIGNvZGUgc2VydmVyIHdlIGRvIG5vdCBuZWVkIHBhc3N3b3JkIHJvdGF0aW9uJyB9LFxuICAgICAgXSwgdHJ1ZSk7XG5cbiAgICAgIC8vIEhhdmUgYSBjdXN0b20gcmVzb3VyY2UgdG8gcGFzcyB0aGUgc2VjcmV0IGRhdGEgb24/IC0+IHllcyBiZWNhdXNlIG5vdCByZXNvbHZhYmxlIG9uIGNvbXBpbGUgdGltZVxuICAgICAgY29uc3Qgc2VjcmV0UmV0cmlldmVyID0gU2VjcmV0UmV0cmlldmVyLm5ldyh7XG4gICAgICAgIHNlY3JldEFybjogc2VjcmV0LnNlY3JldEFybixcbiAgICAgIH0pLl9iaW5kKHRoaXMpO1xuXG4gICAgICB2c2NvZGVQYXNzd29yZCA9IHNlY3JldFJldHJpZXZlci5zZWNyZXRQYXNzd29yZFBsYWludGV4dDtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZGVmYXVsdCB2cGNcbiAgICBjb25zdCB2cGMgPSBuZXcgZWMyLlZwYyh0aGlzLCAndnBjJywge1xuICAgICAgbWF4QXpzOiAyLFxuICAgICAgY3JlYXRlSW50ZXJuZXRHYXRld2F5OiB0cnVlLFxuICAgICAgc3VibmV0Q29uZmlndXJhdGlvbjogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3B1YmxpYycsXG4gICAgICAgICAgc3VibmV0VHlwZTogZWMyLlN1Ym5ldFR5cGUuUFVCTElDLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGVuYWJsZURuc0hvc3RuYW1lczogdHJ1ZSxcbiAgICAgIGVuYWJsZURuc1N1cHBvcnQ6IHRydWUsXG4gICAgfSk7XG4gICAgTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFtcbiAgICAgIHZwYyxcbiAgICBdLCBbXG4gICAgICB7IGlkOiAnQXdzU29sdXRpb25zLVZQQzcnLCByZWFzb246ICdGb3IgdGhpcyB0bXAgdnBjIHdlIGRvIG5vdCBuZWVkIGZsb3cgbG9ncycgfSxcbiAgICBdLCB0cnVlKTtcblxuXG4gICAgLy8gQ3JlYXRlIGEgU2VjR3JvdXAgYXNzb2NpYXRlZCB3aXRoZSB0aGUgQ0YgZGlzdCBwTGlzdFxuICAgIGNvbnN0IHNlY0dyb3VwID0gbmV3IGVjMi5TZWN1cml0eUdyb3VwKHRoaXMsICdjZi10by1zZXJ2ZXItc2cnLCB7XG4gICAgICB2cGMsXG4gICAgICBkZXNjcmlwdGlvbjogJ1NHIGZvciBWU0NvZGVTZXJ2ZXIgLSBvbmx5IGFsbG93IENsb3VkRnJvbnQgaW5ncmVzcycsXG4gICAgICBzZWN1cml0eUdyb3VwTmFtZTogJ2Nsb3VkZnJvbnQtdG8tdnNjb2RlLXNlcnZlcicsXG4gICAgfSk7XG5cbiAgICBjb25zdCBhd3NNYW5hZ2VkUHJlZml4TGlzdCA9IG5ldyBBd3NNYW5hZ2VkUHJlZml4TGlzdCh0aGlzLCAnY2YtcHJlZml4bGlzdElkJywge1xuICAgICAgbmFtZTogJ2NvbS5hbWF6b25hd3MuZ2xvYmFsLmNsb3VkZnJvbnQub3JpZ2luLWZhY2luZycsXG4gICAgfSk7XG4gICAgTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFtcbiAgICAgIGF3c01hbmFnZWRQcmVmaXhMaXN0LFxuICAgIF0sIFtcbiAgICAgIHsgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsIHJlYXNvbjogJ0ZvciB0aGlzIHByb3ZpZGVyIHdpbGRjYXJkcyBhcmUgZmluZScgfSxcbiAgICBdLCB0cnVlKTtcblxuICAgIHNlY0dyb3VwLmFkZEluZ3Jlc3NSdWxlKFxuICAgICAgZWMyLlBlZXIucHJlZml4TGlzdChhd3NNYW5hZ2VkUHJlZml4TGlzdC5wcmVmaXhMaXN0LnByZWZpeExpc3RJZCksXG4gICAgICBlYzIuUG9ydC50Y3AoODApLFxuICAgICAgJ0FsbG93IEhUVFAgZnJvbSBjb20uYW1hem9uYXdzLmdsb2JhbC5jbG91ZGZyb250Lm9yaWdpbi1mYWNpbmcnLFxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgYW4gRUMyIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VjIGdyb3VwICsgaW5zdGFuY2UgcHJvZmlsZSBhbmQgcm9sZVxuICAgIGNvbnN0IGluc3RhbmNlUm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCAnc2VydmVyLWluc3RhbmNlLXJvbGUnLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uQ29tcG9zaXRlUHJpbmNpcGFsKFxuICAgICAgICBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2VjMi5hbWF6b25hd3MuY29tJyksXG4gICAgICAgIG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnc3NtLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgICksXG4gICAgICBpbmxpbmVQb2xpY2llczoge1xuICAgICAgICBWU0NvZGVJbnN0YW5jZUlubGluZVBvbGljeTogbmV3IGlhbS5Qb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBzaWQ6ICdTdHNBY2Nlc3MnLFxuICAgICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAnc3RzOkFzc3VtZVJvbGUnLFxuICAgICAgICAgICAgICAgICdpYW06QWRkUm9sZVRvSW5zdGFuY2VQcm9maWxlJyxcbiAgICAgICAgICAgICAgICAnaWFtOkF0dGFjaFJvbGVQb2xpY3knLFxuICAgICAgICAgICAgICAgICdpYW06Q3JlYXRlUm9sZScsXG4gICAgICAgICAgICAgICAgJ2lhbTpDcmVhdGVTZXJ2aWNlTGlua2VkUm9sZScsXG4gICAgICAgICAgICAgICAgJ2lhbTpEZWxldGVSb2xlJyxcbiAgICAgICAgICAgICAgICAnaWFtOkRlbGV0ZVJvbGVQZXJtaXNzaW9uc0JvdW5kYXJ5JyxcbiAgICAgICAgICAgICAgICAnaWFtOkRlbGV0ZVJvbGVQb2xpY3knLFxuICAgICAgICAgICAgICAgICdpYW06RGVsZXRlU2VydmljZUxpbmtlZFJvbGUnLFxuICAgICAgICAgICAgICAgICdpYW06RGV0YWNoUm9sZVBvbGljeScsXG4gICAgICAgICAgICAgICAgJ2lhbTpHZXRSb2xlJyxcbiAgICAgICAgICAgICAgICAnaWFtOkdldFJvbGVQb2xpY3knLFxuICAgICAgICAgICAgICAgICdpYW06R2V0U2VydmljZUxpbmtlZFJvbGVEZWxldGlvblN0YXR1cycsXG4gICAgICAgICAgICAgICAgJ2lhbTpMaXN0QXR0YWNoZWRSb2xlUG9saWNpZXMnLFxuICAgICAgICAgICAgICAgICdpYW06TGlzdEluc3RhbmNlUHJvZmlsZXNGb3JSb2xlJyxcbiAgICAgICAgICAgICAgICAnaWFtOkxpc3RSb2xlUG9saWNpZXMnLFxuICAgICAgICAgICAgICAgICdpYW06TGlzdFJvbGVzJyxcbiAgICAgICAgICAgICAgICAnaWFtOkxpc3RSb2xlVGFncycsXG4gICAgICAgICAgICAgICAgJ2lhbTpQdXRSb2xlUGVybWlzc2lvbnNCb3VuZGFyeScsXG4gICAgICAgICAgICAgICAgJ2lhbTpQdXRSb2xlUG9saWN5JyxcbiAgICAgICAgICAgICAgICAnaWFtOlJlbW92ZVJvbGVGcm9tSW5zdGFuY2VQcm9maWxlJyxcbiAgICAgICAgICAgICAgICAnaWFtOlRhZ1JvbGUnLFxuICAgICAgICAgICAgICAgICdpYW06VW50YWdSb2xlJyxcbiAgICAgICAgICAgICAgICAnaWFtOlVwZGF0ZUFzc3VtZVJvbGVQb2xpY3knLFxuICAgICAgICAgICAgICAgICdpYW06VXBkYXRlUm9sZScsXG4gICAgICAgICAgICAgICAgJ2lhbTpVcGRhdGVSb2xlRGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICAgICAgICBgYXJuOmF3czppYW06OiR7U3RhY2sub2YodGhpcykuYWNjb3VudH06cm9sZS9jZGstKmAsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgJ2lhbTpQYXNzUm9sZScsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgICAgICAgIGBhcm46YXdzOmlhbTo6JHtTdGFjay5vZih0aGlzKS5hY2NvdW50fTpyb2xlL2Nkay0qYCxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICAgICAgICAgIFN0cmluZ0xpa2U6IHtcbiAgICAgICAgICAgICAgICAgICdpYW06UGFzc2VkVG9TZXJ2aWNlJzogJ2Nsb3VkZm9ybWF0aW9uLmFtYXpvbmF3cy5jb20nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgJ2Nsb3VkZm9ybWF0aW9uOionLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICAgICAgICBgYXJuOmF3czpjbG91ZGZvcm1hdGlvbjoqOiR7U3RhY2sub2YodGhpcykuYWNjb3VudH06c3RhY2svQ0RLVG9vbGtpdC8qYCxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAnY2xvdWRmb3JtYXRpb246Q3JlYXRlQ2hhbmdlU2V0JyxcbiAgICAgICAgICAgICAgICAnY2xvdWRmb3JtYXRpb246RXhlY3V0ZUNoYW5nZVNldCcsXG4gICAgICAgICAgICAgICAgJ2Nsb3VkZm9ybWF0aW9uOkRlbGV0ZUNoYW5nZVNldCcsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgc2lkOiAnUzNBY2Nlc3MnLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgJ3MzOionLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIHNpZDogJ0VDUkFjY2VzcycsXG4gICAgICAgICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICdlY3I6U2V0UmVwb3NpdG9yeVBvbGljeScsXG4gICAgICAgICAgICAgICAgJ2VjcjpHZXRMaWZlY3ljbGVQb2xpY3knLFxuICAgICAgICAgICAgICAgICdlY3I6UHV0TGlmZWN5Y2xlUG9saWN5JyxcbiAgICAgICAgICAgICAgICAnZWNyOlB1dEltYWdlU2Nhbm5pbmdDb25maWd1cmF0aW9uJyxcbiAgICAgICAgICAgICAgICAnZWNyOkRlc2NyaWJlUmVwb3NpdG9yaWVzJyxcbiAgICAgICAgICAgICAgICAnZWNyOkNyZWF0ZVJlcG9zaXRvcnknLFxuICAgICAgICAgICAgICAgICdlY3I6RGVsZXRlUmVwb3NpdG9yeScsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgICAgICAgIGBhcm46YXdzOmVjcjoqOiR7U3RhY2sub2YodGhpcykuYWNjb3VudH06cmVwb3NpdG9yeS9jZGstKmAsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgJ3NzbTpHZXRQYXJhbWV0ZXIqJyxcbiAgICAgICAgICAgICAgICAnc3NtOlB1dFBhcmFtZXRlcionLFxuICAgICAgICAgICAgICAgICdzc206RGVsZXRlUGFyYW1ldGVyKicsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgICAgICAgIGBhcm46YXdzOnNzbToqOiR7U3RhY2sub2YodGhpcykuYWNjb3VudH06cGFyYW1ldGVyL2Nkay1ib290c3RyYXAvKmAsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgJ2VjMjpEZXNjcmliZUluc3RhbmNlcycsXG4gICAgICAgICAgICAgICAgJ2VjMjpNb2RpZnlWb2x1bWUnLFxuICAgICAgICAgICAgICAgICdlYzI6RGVzY3JpYmVWb2x1bWVzTW9kaWZpY2F0aW9ucyonLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICdjb2RlcGlwZWxpbmU6RW5hYmxlU3RhZ2VUcmFuc2l0aW9uJyxcbiAgICAgICAgICAgICAgICAnY29kZXBpcGVsaW5lOkRpc2FibGVTdGFnZVRyYW5zaXRpb24nLFxuICAgICAgICAgICAgICAgICdjb2RlcGlwZWxpbmU6U3RhcnRQaXBlbGluZUV4ZWN1dGlvbicsXG4gICAgICAgICAgICAgICAgJ2NvZGVwaXBlbGluZTpTdG9wUGlwZWxpbmVFeGVjdXRpb24nLFxuICAgICAgICAgICAgICAgICdjb2RlcGlwZWxpbmU6VXBkYXRlUGlwZWxpbmUnLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICAgICAgICBgYXJuOmF3czpjb2RlcGlwZWxpbmU6Kjoke1N0YWNrLm9mKHRoaXMpLmFjY291bnR9OiovKmAsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgJ2ttczpEZWNyeXB0JyxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgICAgICAgYGFybjphd3M6a21zOio6JHtTdGFjay5vZih0aGlzKS5hY2NvdW50fTprZXkvKmAsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC4uLmFkZGl0aW9uYWxJbnN0YW5jZVJvbGVQb2xpY2llcyxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgICBtYW5hZ2VkUG9saWNpZXM6IFtcbiAgICAgICAgaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKCdBbWF6b25TU01NYW5hZ2VkSW5zdGFuY2VDb3JlJyksXG4gICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnQ2xvdWRXYXRjaEFnZW50U2VydmVyUG9saWN5JyksXG4gICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnQW1hem9uUURldmVsb3BlckFjY2VzcycpLFxuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ1JlYWRPbmx5QWNjZXNzJyksXG4gICAgICBdLFxuICAgIH0pO1xuICAgIE5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhbXG4gICAgICBpbnN0YW5jZVJvbGUsXG4gICAgXSwgW1xuICAgICAgeyBpZDogJ0F3c1NvbHV0aW9ucy1JQU00JywgcmVhc29uOiAnRm9yIHRoaXMgdG1wIHJvbGUgd2UgZG8gbm90IG5lZWQgdG8gcmVzdHJpY3QgbWFuYWdlZCBwb2xpY2llcycgfSxcbiAgICAgIHsgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsIHJlYXNvbjogJ0ZvciB0aGlzIHRtcCByb2xlIHRoZSB3aWxkY2FyZHMgYXJlIGZpbmUnIH0sXG4gICAgXSwgdHJ1ZSk7XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBlYzIuSW5zdGFuY2UodGhpcywgJ3NlcnZlci1pbnN0YW5jZScsIHtcbiAgICAgIHZwYyxcbiAgICAgIGluc3RhbmNlTmFtZSxcbiAgICAgIGluc3RhbmNlVHlwZSxcbiAgICAgIG1hY2hpbmVJbWFnZTogZWMyLk1hY2hpbmVJbWFnZS5mcm9tU3NtUGFyYW1ldGVyKFxuICAgICAgICBtYWNoaW5lSW1hZ2VGcm9tU3NtUGFyYW1ldGVyLFxuICAgICAgICB7XG4gICAgICAgICAgb3M6IGVjMi5PcGVyYXRpbmdTeXN0ZW1UeXBlLkxJTlVYLFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICAgIHJlcXVpcmVJbWRzdjI6IHRydWUsXG4gICAgICB2cGNTdWJuZXRzOiB7XG4gICAgICAgIHN1Ym5ldFR5cGU6IGVjMi5TdWJuZXRUeXBlLlBVQkxJQyxcbiAgICAgIH0sXG4gICAgICBhc3NvY2lhdGVQdWJsaWNJcEFkZHJlc3M6IHRydWUsXG4gICAgICBkZXRhaWxlZE1vbml0b3Jpbmc6IHRydWUsXG4gICAgICBibG9ja0RldmljZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGRldmljZU5hbWU6ICcvZGV2L3NkYTEnLFxuICAgICAgICAgIHZvbHVtZTogZWMyLkJsb2NrRGV2aWNlVm9sdW1lLmVicyhpbnN0YW5jZVZvbHVtZVNpemUsIHtcbiAgICAgICAgICAgIHZvbHVtZVR5cGU6IGVjMi5FYnNEZXZpY2VWb2x1bWVUeXBlLkdQMyxcbiAgICAgICAgICAgIGVuY3J5cHRlZDogdHJ1ZSxcbiAgICAgICAgICAgIGRlbGV0ZU9uVGVybWluYXRpb246IHRydWUsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgcm9sZTogaW5zdGFuY2VSb2xlLFxuICAgICAgc2VjdXJpdHlHcm91cDogc2VjR3JvdXAsXG4gICAgICB1c2VyRGF0YTogZWMyLlVzZXJEYXRhLmN1c3RvbShgXG4gICAgICAgICNjbG91ZC1jb25maWdcbiAgICAgICAgICBob3N0bmFtZTogJHtpbnN0YW5jZU5hbWV9XG4gICAgICAgICAgcnVuY21kOlxuICAgICAgICAgICAgLSBta2RpciAtcCAke2hvbWVGb2xkZXJ9ICYmIGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAke2hvbWVGb2xkZXJ9XG4gICAgICBgKSxcbiAgICB9KTtcbiAgICBOYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoW1xuICAgICAgaW5zdGFuY2UsXG4gICAgXSwgW1xuICAgICAgeyBpZDogJ0F3c1NvbHV0aW9ucy1FQzI5JywgcmVhc29uOiAnRm9yIHRoaXMgdG1wIGluc3RhbmNlIHdlIGRvIG5vdCBuZWVkIGFuIGFzZycgfSxcbiAgICBdLCB0cnVlKTtcblxuICAgIC8vIENyZWF0ZSBhIENGIGRpc3RyaWJ1dGlvbiAoc3BlY2lhbCBpZCkgYW5kIHNwZWNpYWwgQ2FjaGVQb2xpY3kgdG8gaW5zdGFuY2VcbiAgICBjb25zdCBjZkNhY2hlUG9saWN5ID0gbmV3IGNmLkNhY2hlUG9saWN5KHRoaXMsICdjZi1jYWNoZS1wb2xpY3knLCB7XG4gICAgICBjYWNoZVBvbGljeU5hbWU6IGBjZi1jYWNoZS1wb2xpY3ktdnNjb2Rlc2VydmVyLSR7U3RhY2sub2YodGhpcykuc3RhY2tOYW1lfWAsXG4gICAgICBjb21tZW50OiAnQ2FjaGUgcG9saWN5IGZvciBWU0NvZGVTZXJ2ZXInLFxuICAgICAgbWluVHRsOiBEdXJhdGlvbi5zZWNvbmRzKDEpLFxuICAgICAgbWF4VHRsOiBEdXJhdGlvbi5zZWNvbmRzKDMxNTM2MDAwKSxcbiAgICAgIGRlZmF1bHRUdGw6IER1cmF0aW9uLnNlY29uZHMoODY0MDApLFxuICAgICAgY29va2llQmVoYXZpb3I6IGNmLkNhY2hlQ29va2llQmVoYXZpb3IuYWxsKCksXG4gICAgICBlbmFibGVBY2NlcHRFbmNvZGluZ0d6aXA6IGZhbHNlLFxuICAgICAgaGVhZGVyQmVoYXZpb3I6IHtcbiAgICAgICAgYmVoYXZpb3I6ICd3aGl0ZWxpc3QnLFxuICAgICAgICBoZWFkZXJzOiBbXG4gICAgICAgICAgJ0FjY2VwdC1DaGFyc2V0JyxcbiAgICAgICAgICAnQXV0aG9yaXphdGlvbicsXG4gICAgICAgICAgJ09yaWdpbicsXG4gICAgICAgICAgJ0FjY2VwdCcsXG4gICAgICAgICAgJ1JlZmVyZXInLFxuICAgICAgICAgICdIb3N0JyxcbiAgICAgICAgICAnQWNjZXB0LUxhbmd1YWdlJyxcbiAgICAgICAgICAnQWNjZXB0LUVuY29kaW5nJyxcbiAgICAgICAgICAnQWNjZXB0LURhdGV0aW1lJyxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBxdWVyeVN0cmluZ0JlaGF2aW9yOiBjZi5DYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsKCksXG4gICAgfSk7XG5cbiAgICBjb25zdCBvcmlnaW4gPSBuZXcgY2ZvLkh0dHBPcmlnaW4oaW5zdGFuY2UuaW5zdGFuY2VQdWJsaWNEbnNOYW1lLCB7XG4gICAgICBwcm90b2NvbFBvbGljeTogY2YuT3JpZ2luUHJvdG9jb2xQb2xpY3kuSFRUUF9PTkxZLFxuICAgICAgb3JpZ2luSWQ6IGBDbG91ZGZyb250LSR7U3RhY2sub2YodGhpcykuc3RhY2tOYW1lfS0ke1N0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZX1gLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZGlzdHJpYnV0aW9uID0gbmV3IGNmLkRpc3RyaWJ1dGlvbih0aGlzLCAnY2YtZGlzdHJpYnV0aW9uJywge1xuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIGh0dHBWZXJzaW9uOiBjZi5IdHRwVmVyc2lvbi5IVFRQMl9BTkRfMyxcbiAgICAgIC8vIE5PVEU6ICdEaXN0cmlidXRpb25zIHRoYXQgdXNlIHRoZSBkZWZhdWx0IENsb3VkRnJvbnQgdmlld2VyIGNlcnRpZmljYXRlIG9yIHVzZSAndmlwJyBmb3IgdGhlICdTc2xTdXBwb3J0TWV0aG9kJ1xuICAgICAgLy8gYXJlIG5vbi1jb21wbGlhbnQgd2l0aCB0aGlzIHJ1bGUsIGFzIHRoZSBtaW5pbXVtIHNlY3VyaXR5IHBvbGljeSBpcyBzZXQgdG8gVExTdjEgcmVnYXJkbGVzc1xuICAgICAgLy8gb2YgdGhlIHNwZWNpZmllZCAnTWluaW11bVByb3RvY29sVmVyc2lvbidcbiAgICAgIC8vIG1pbmltdW1Qcm90b2NvbFZlcnNpb246IGNmLlNlY3VyaXR5UG9saWN5UHJvdG9jb2wuVExTX1YxXzJfMjAyMSxcbiAgICAgIGNvbW1lbnQ6ICdEaXN0cmlidXRpb24gZm9yIFZTQ29kZVNlcnZlcicsXG4gICAgICBwcmljZUNsYXNzOiBjZi5QcmljZUNsYXNzLlBSSUNFX0NMQVNTX0FMTCxcbiAgICAgIGRlZmF1bHRCZWhhdmlvcjoge1xuICAgICAgICBhbGxvd2VkTWV0aG9kczogY2YuQWxsb3dlZE1ldGhvZHMuQUxMT1dfQUxMLFxuICAgICAgICBjYWNoZVBvbGljeTogY2ZDYWNoZVBvbGljeSxcbiAgICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeToge1xuICAgICAgICAgIC8vIE1hbmFnZWQtQWxsVmlld2VyIC0gc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS91c2luZy1tYW5hZ2VkLW9yaWdpbi1yZXF1ZXN0LXBvbGljaWVzLmh0bWwjOn46dGV4dD1XaGVuJTIwdXNpbmclMjBBV1MsNDdlNCUyRGI5ODklMkQ1NDkyZWFmYTA3ZDNcbiAgICAgICAgICBvcmlnaW5SZXF1ZXN0UG9saWN5SWQ6ICcyMTZhZGVmNi01YzdmLTQ3ZTQtYjk4OS01NDkyZWFmYTA3ZDMnLFxuICAgICAgICB9LFxuICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogY2YuVmlld2VyUHJvdG9jb2xQb2xpY3kuQUxMT1dfQUxMLFxuICAgICAgICBvcmlnaW4sXG4gICAgICB9LFxuICAgICAgYWRkaXRpb25hbEJlaGF2aW9yczoge1xuICAgICAgICAnL3Byb3h5LyonOiB7XG4gICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IGNmLkFsbG93ZWRNZXRob2RzLkFMTE9XX0FMTCxcbiAgICAgICAgICBjb21wcmVzczogZmFsc2UsXG4gICAgICAgICAgLy8gc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS91c2luZy1tYW5hZ2VkLWNhY2hlLXBvbGljaWVzLmh0bWwjbWFuYWdlZC1jYWNoZS1wb2xpY3ktY2FjaGluZy1kaXNhYmxlZFxuICAgICAgICAgIGNhY2hlUG9saWN5OiBjZi5DYWNoZVBvbGljeS5DQUNISU5HX0RJU0FCTEVELFxuICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3k6IHtcbiAgICAgICAgICAgIC8vIE1hbmFnZWQtQWxsVmlld2VyIC0gc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS91c2luZy1tYW5hZ2VkLW9yaWdpbi1yZXF1ZXN0LXBvbGljaWVzLmh0bWwjOn46dGV4dD1XaGVuJTIwdXNpbmclMjBBV1MsNDdlNCUyRGI5ODklMkQ1NDkyZWFmYTA3ZDNcbiAgICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3lJZDogJzIxNmFkZWY2LTVjN2YtNDdlNC1iOTg5LTU0OTJlYWZhMDdkMycsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogY2YuVmlld2VyUHJvdG9jb2xQb2xpY3kuQUxMT1dfQUxMLFxuICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFtcbiAgICAgIGRpc3RyaWJ1dGlvbixcbiAgICBdLCBbXG4gICAgICB7IGlkOiAnQXdzU29sdXRpb25zLUNGUjEnLCByZWFzb246ICdGb3IgdGhpcyB0bXAgZGlzdHJpYnV0aW9uIHdlIGRvIG5vdCBuZWVkIGdlbyByZXN0cmljdGlvbnMnIH0sXG4gICAgICB7IGlkOiAnQXdzU29sdXRpb25zLUNGUjInLCByZWFzb246ICdGb3IgdGhpcyB0bXAgZGlzdHJpYnV0aW9uIHdlIGRvIG5vdCBuZWVkIHdhZiBpbnRlZ3JhdGlvbicgfSxcbiAgICAgIHsgaWQ6ICdBd3NTb2x1dGlvbnMtQ0ZSMycsIHJlYXNvbjogJ0ZvciB0aGlzIHRtcCBkaXN0cmlidXRpb24gd2UgZG8gbm90IG5lZWQgYWNjZXNzIGxvZ2dpbmcgZW5hYmxlZCcgfSxcbiAgICAgIHsgaWQ6ICdBd3NTb2x1dGlvbnMtQ0ZSNCcsIHJlYXNvbjogJ0ZvciB0aGlzIHRtcCBkaXN0cmlidXRpb24gd2UgZG8gbm90IG5lZWQgbGltaXQgU1NMIHByb3RvY29scyBhcyB3ZSB1c2UgdGhlIGRlZmF1bHQgdmlld2VyIGNlcnQnIH0sXG4gICAgICB7IGlkOiAnQXdzU29sdXRpb25zLUNGUjUnLCByZWFzb246ICdGb3IgdGhpcyB0bXAgZGlzdHJpYnV0aW9uIHdlIGRvIG5vdCBuZWVkIGxpbWl0IFNTTCBwcm90b2NvbHMgYXMgd2UgdXNlIHRoZSBkZWZhdWx0IHZpZXdlciBjZXJ0JyB9LFxuICAgIF0sIHRydWUpO1xuXG4gICAgLy8gVXNlIGEgY3VzdG9tIHJlc291cmNlIGxhbWJkYSB0byBydW4gdGhlIFNTTSBkb2N1bWVudCBvbiB0aGUgaW5zdGFuY2VcbiAgICBzd2l0Y2ggKGluc3RhbmNlT3BlcmF0aW5nU3lzdGVtKSB7XG4gICAgICBjYXNlIExpbnV4Rmxhdm9yVHlwZS5VQlVOVFVfMjI6XG4gICAgICBjYXNlIExpbnV4Rmxhdm9yVHlwZS5VQlVOVFVfMjQ6XG4gICAgICAgIEluc3RhbGxlci51YnVudHUoe1xuICAgICAgICAgIGluc3RhbmNlSWQ6IGluc3RhbmNlLmluc3RhbmNlSWQsXG4gICAgICAgICAgdnNDb2RlVXNlcjogdnNDb2RlVXNlcixcbiAgICAgICAgICB2c0NvZGVQYXNzd29yZDogdnNjb2RlUGFzc3dvcmQsXG4gICAgICAgICAgZGV2U2VydmVyQmFzZVBhdGg6IHByb3BzPy5kZXZTZXJ2ZXJCYXNlUGF0aCxcbiAgICAgICAgICBkZXZTZXJ2ZXJQb3J0OiBwcm9wcz8uZGV2U2VydmVyUG9ydCxcbiAgICAgICAgICBob21lRm9sZGVyOiBob21lRm9sZGVyLFxuICAgICAgICB9KS5fYmluZCh0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExpbnV4Rmxhdm9yVHlwZS5BTUFaT05fTElOVVhfMjAyMzpcbiAgICAgICAgSW5zdGFsbGVyLmFtYXpvbkxpbnV4MjAyMyh7XG4gICAgICAgICAgaW5zdGFuY2VJZDogaW5zdGFuY2UuaW5zdGFuY2VJZCxcbiAgICAgICAgICB2c0NvZGVVc2VyOiB2c0NvZGVVc2VyLFxuICAgICAgICAgIHZzQ29kZVBhc3N3b3JkOiB2c2NvZGVQYXNzd29yZCxcbiAgICAgICAgICBkZXZTZXJ2ZXJCYXNlUGF0aDogcHJvcHM/LmRldlNlcnZlckJhc2VQYXRoLFxuICAgICAgICAgIGRldlNlcnZlclBvcnQ6IHByb3BzPy5kZXZTZXJ2ZXJQb3J0LFxuICAgICAgICAgIGhvbWVGb2xkZXI6IGhvbWVGb2xkZXIsXG4gICAgICAgIH0pLl9iaW5kKHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgTGludXggZmxhdm9yOiAke2luc3RhbmNlT3BlcmF0aW5nU3lzdGVtfWApO1xuICAgIH1cbiAgICAvLyBzbyB3ZSBwYXNzIHRoZSBvdXRlciBzY29wZSBvZiB0aGlzIGNvbnN0cnVjdCB0aHJvdWdoIHRoZSBpbnN0YWxsZXJcblxuICAgIC8vIE5PVEU6IG1heWJlIGhhdmUgYSBoZWFsaGNoZWNrIENGTiBjdXN0b20gcmVzb3VyY2UgdG8gc2VlIGlmIHRoZSB2c2NvZGUgc2VydmVyIGlzIGhlYWx0aHlcbiAgICAvLyBhdG0gdGhpcyBpcyBhY2hpZXZlZCBieSB0aGUgaW50ZWcgdGVzdHNcblxuICAgIC8vIE91dHB1dHNcbiAgICB0aGlzLmRvbWFpbk5hbWUgPSBgaHR0cHM6Ly8ke2Rpc3RyaWJ1dGlvbi5kb21haW5OYW1lfS8/Zm9sZGVyPSR7aG9tZUZvbGRlcn1gO1xuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgJ2RvbWFpbk5hbWUnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSBkb21haW4gbmFtZSBvZiB0aGUgZGlzdHJpYnV0aW9uJyxcbiAgICAgIHZhbHVlOiB0aGlzLmRvbWFpbk5hbWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnBhc3N3b3JkID0gdnNjb2RlUGFzc3dvcmQ7XG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCAncGFzc3dvcmQnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwYXNzd29yZCBmb3IgdGhlIFZTQ29kZSBzZXJ2ZXInLFxuICAgICAgdmFsdWU6IHZzY29kZVBhc3N3b3JkLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
441
|
+
VSCodeServer[_a] = { fqn: "@mavogel/cdk-vscode-server.VSCodeServer", version: "0.0.17" };
|
|
442
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnNjb2RlLXNlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92c2NvZGUtc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQXlEO0FBQ3pELGlEQUFpRDtBQUNqRCwwREFBMEQ7QUFDMUQsMkNBQTJDO0FBQzNDLDJDQUEyQztBQUMzQyxpRUFBaUU7QUFDakUscUNBQTBDO0FBQzFDLDJDQUF1QztBQUN2QyxxREFBa0Q7QUFDbEQseUNBQTZFO0FBQzdFLHNGQUFtRjtBQUNuRiwwRUFBc0U7QUEyRnRFOztHQUVHO0FBQ0gsSUFBWSxlQWVYO0FBZkQsV0FBWSxlQUFlO0lBQ3pCOztPQUVHO0lBQ0gseUNBQXNCLENBQUE7SUFFdEI7O09BRUc7SUFDSCx5Q0FBc0IsQ0FBQTtJQUV0Qjs7T0FFRztJQUNILCtDQUE0QixDQUFBO0FBQzlCLENBQUMsRUFmVyxlQUFlLCtCQUFmLGVBQWUsUUFlMUI7QUFFRDs7R0FFRztBQUNILElBQVkscUJBVVg7QUFWRCxXQUFZLHFCQUFxQjtJQUMvQjs7T0FFRztJQUNILG9DQUFXLENBQUE7SUFFWDs7T0FFRztJQUNILHdDQUFlLENBQUE7QUFDakIsQ0FBQyxFQVZXLHFCQUFxQixxQ0FBckIscUJBQXFCLFFBVWhDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLFlBQWEsU0FBUSxzQkFBUztJQVd6QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXlCO1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsV0FBVztRQUNYLE1BQU0sVUFBVSxHQUFHLEtBQUssRUFBRSxVQUFVLElBQUksYUFBYSxDQUFDO1FBQ3RELE1BQU0sWUFBWSxHQUFHLEtBQUssRUFBRSxZQUFZLElBQUksY0FBYyxDQUFDO1FBQzNELE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxFQUFFLGtCQUFrQixJQUFJLEVBQUUsQ0FBQztRQUMzRCxNQUFNLFVBQVUsR0FBRyxLQUFLLEVBQUUs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VTtRQUNWLElBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxZQUFZLENBQUMsVUFBVSxZQUFZLFVBQVUsRUFBRSxDQUFDO1FBQzdFLElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFO1lBQ2hDLFdBQVcsRUFBRSxxQ0FBcUM7WUFDbEQsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVO1NBQ3ZCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDO1FBQy9CLElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQzlCLFdBQVcsRUFBRSxvQ0FBb0M7WUFDakQsS0FBSyxFQUFFLGNBQWM7U0FDdEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFqZEgsb0NBa2RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuT3V0cHV0LCBEdXJhdGlvbiwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGNmIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udFwiO1xuaW1wb3J0ICogYXMgY2ZvIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zXCI7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0ICogYXMgc2VjcmV0c21hbmFnZXIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiO1xuaW1wb3J0IHsgTmFnU3VwcHJlc3Npb25zIH0gZnJvbSBcImNkay1uYWdcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBJbnN0YWxsZXIgfSBmcm9tIFwiLi9pbnN0YWxsZXIvaW5zdGFsbGVyXCI7XG5pbXBvcnQgeyBnZXRBbWlTU01QYXJhbWV0ZXJGb3JMaW51eEFyY2hpdGVjdHVyZUFuZEZsYXZvciB9IGZyb20gXCIuL21hcHBpbmdzXCI7XG5pbXBvcnQgeyBBd3NNYW5hZ2VkUHJlZml4TGlzdCB9IGZyb20gXCIuL3ByZWZpeGxpc3QtcmV0cmlldmVyL3ByZWZpeGxpc3QtcmV0cmlldmVyXCI7XG5pbXBvcnQgeyBTZWNyZXRSZXRyaWV2ZXIgfSBmcm9tIFwiLi9zZWNyZXQtcmV0cmlldmVyL3NlY3JldC1yZXRyaWV2ZXJcIjtcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciB0aGUgVlNDb2RlU2VydmVyIGNvbnN0cnVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZTQ29kZVNlcnZlclByb3BzIHtcbiAgLyoqXG4gICAqIFVzZXJOYW1lIGZvciBWU0NvZGUgU2VydmVyXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcGFydGljaXBhbnRcbiAgICovXG4gIHJlYWRvbmx5IHZzY29kZVVzZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhc3N3b3JkIGZvciBWU0NvZGUgU2VydmVyXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZW1wdHkgYW5kIHdpbGwgdGhlbiBiZSBnZW5lcmF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IHZzY29kZVBhc3N3b3JkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWU0NvZGUgU2VydmVyIEVDMiBpbnN0YW5jZSBuYW1lXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVlNDb2RlU2VydmVyXG4gICAqL1xuICByZWFkb25seSBpbnN0YW5jZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZTQ29kZSBTZXJ2ZXIgRUMyIGluc3RhbmNlIHZvbHVtZSBzaXplIGluIEdCXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gNDBcbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbmNlVm9sdW1lU2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogVlNDb2RlIFNlcnZlciBFQzIgaW5zdGFuY2UgY2xhc3NcbiAgICpcbiAgICogQGRlZmF1bHQgLSBtN2dcbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbmNlQ2xhc3M/OiBlYzIuSW5zdGFuY2VDbGFzcztcblxuICAvKipcbiAgICogVlNDb2RlIFNlcnZlciBFQzIgaW5zdGFuY2Ugc2l6ZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHhsYXJnZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFuY2VTaXplPzogZWMyLkluc3RhbmNlU2l6ZTtcblxuICAvKipcbiAgICogVlNDb2RlIFNlcnZlciBFQzIgb3BlcmF0aW5nIHN5c3RlbVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFVidW50dS0yMlxuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFuY2VPcGVyYXRpbmdTeXN0ZW0/OiBMaW51eEZsYXZvclR5cGU7XG5cbiAgLyoqXG4gICAqIFZTQ29kZSBTZXJ2ZXIgRUMyIGNwdSBhcmNoaXRlY3R1cmUgZm9yIHRoZSBvcGVyYXRpbmcgc3lzdGVtXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXJtXG4gICAqL1xuICByZWFkb25seSBpbnN0YW5jZUNwdUFyY2hpdGVjdHVyZT86IExpbnV4QXJjaGl0ZWN0dXJlVHlwZTtcblxuICAvKipcbiAgICogRm9sZGVyIHRvIG9wZW4gaW4gVlMgQ29kZSBzZXJ2ZXJcbiAgICpcbiAgICogQGRlZmF1bHQgLSAvV29ya3Nob3BcbiAgICovXG4gIHJlYWRvbmx5IGhvbWVGb2xkZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEJhc2UgcGF0aCBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIGFkZGVkIHRvIE5naW54IHNpdGVzLWF2YWlsYWJsZSBsaXN0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXBwXG4gICAqL1xuICByZWFkb25seSBkZXZTZXJ2ZXJCYXNlUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogUG9ydCBmb3IgdGhlIERldlNlcnZlclxuICAgKlxuICAgKiBAZGVmYXVsdCAtIDgwODFcbiAgICovXG4gIHJlYWRvbmx5IGRldlNlcnZlclBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgaW5zdGFuY2Ugcm9sZSBwb2xpY2llc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIFtdXG4gICAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsSW5zdGFuY2VSb2xlUG9saWNpZXM/OiBpYW0uUG9saWN5U3RhdGVtZW50W107XG59XG5cbi8qKlxuICogVGhlIGZsYXZvciBvZiBsaW51eCB5b3Ugd2FudCB0byBydW4gdnNjb2RlIHNlcnZlciBvblxuICovXG5leHBvcnQgZW51bSBMaW51eEZsYXZvclR5cGUge1xuICAvKipcbiAgICogVWJ1bnR1IDIyXG4gICAqL1xuICBVQlVOVFVfMjIgPSBcInVidW50dTIyXCIsXG5cbiAgLyoqXG4gICAqIFVidW50dSAyNFxuICAgKi9cbiAgVUJVTlRVXzI0ID0gXCJ1YnVudHUyNFwiLFxuXG4gIC8qKlxuICAgKiBBbWF6b24gTGludXggMjAyM1xuICAgKi9cbiAgQU1BWk9OX0xJTlVYXzIwMjMgPSBcImFsMjAyM1wiLFxufVxuXG4vKipcbiAqIFRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIGNwdSB5b3Ugd2FudCB0byBydW4gdnNjb2RlIHNlcnZlciBvblxuICovXG5leHBvcnQgZW51bSBMaW51eEFyY2hpdGVjdHVyZVR5cGUge1xuICAvKipcbiAgICogQVJNIGFyY2hpdGVjdHVyZVxuICAgKi9cbiAgQVJNID0gXCJhcm1cIixcblxuICAvKipcbiAgICogQU1ENjQgYXJjaGl0ZWN0dXJlXG4gICAqL1xuICBBTUQ2NCA9IFwiYW1kNjRcIixcbn1cblxuLyoqXG4gKiBWU0NvZGVTZXJ2ZXIgLSBzcGluIGl0IHVwIGluIHVuZGVyIDEwIG1pbnV0ZXNcbiAqL1xuZXhwb3J0IGNsYXNzIFZTQ29kZVNlcnZlciBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZG9tYWluIHRoZSBzZXJ2ZXIgaXMgcmVhY2hhYmxlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZG9tYWluTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFzc3dvcmQgdG8gbG9naW4gdG8gdGhlIHNlcnZlclxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhc3N3b3JkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBWU0NvZGVTZXJ2ZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAvLyBkZWZhdWx0c1xuICAgIGNvbnN0IHZzQ29kZVVzZXIgPSBwcm9wcz8udnNjb2RlVXNlciA/PyBcInBhcnRpY2lwYW50XCI7XG4gICAgY29uc3QgaW5zdGFuY2VOYW1lID0gcHJvcHM/Lmluc3RhbmNlTmFtZSA/PyBcIlZTQ29kZVNlcnZlclwiO1xuICAgIGNvbnN0IGluc3RhbmNlVm9sdW1lU2l6ZSA9IHByb3BzPy5pbnN0YW5jZVZvbHVtZVNpemUgPz8gNDA7XG4gICAgY29uc3QgaG9tZUZvbGRlciA9IHByb3BzPy5ob21lRm9sZGVyID8/IFwiL1dvcmtzaG9wXCI7XG4gICAgY29uc3QgaW5zdGFuY2VDbGFzcyA9IHByb3BzPy5pbnN0YW5jZUNsYXNzID8/IGVjMi5JbnN0YW5jZUNsYXNzLk03RztcbiAgICBjb25zdCBpbnN0YW5jZVNpemUgPSBwcm9wcz8uaW5zdGFuY2VTaXplID8/IGVjMi5JbnN0YW5jZVNpemUuWExBUkdFO1xuICAgIGNvbnN0IGluc3RhbmNlVHlwZSA9IGVjMi5JbnN0YW5jZVR5cGUub2YoaW5zdGFuY2VDbGFzcywgaW5zdGFuY2VTaXplKTtcbiAgICBjb25zdCBpbnN0YW5jZU9wZXJhdGluZ1N5c3RlbSA9XG4gICAgICBwcm9wcz8uaW5zdGFuY2VPcGVyYXRpbmdTeXN0ZW0gPz8gTGludXhGbGF2b3JUeXBlLlVCVU5UVV8yMjtcbiAgICBjb25zdCBpbnN0YW5jZUNwdUFyY2hpdGVjdHVyZSA9XG4gICAgICBwcm9wcz8uaW5zdGFuY2VDcHVBcmNoaXRlY3R1cmUgPz8gTGludXhBcmNoaXRlY3R1cmVUeXBlLkFSTTtcbiAgICBjb25zdCBtYWNoaW5lSW1hZ2VGcm9tU3NtUGFyYW1ldGVyID1cbiAgICAgIGdldEFtaVNTTVBhcmFtZXRlckZvckxpbnV4QXJjaGl0ZWN0dXJlQW5kRmxhdm9yKFxuICAgICAgICBpbnN0YW5jZUNwdUFyY2hpdGVjdHVyZSxcbiAgICAgICAgaW5zdGFuY2VPcGVyYXRpbmdTeXN0ZW0sXG4gICAgICApO1xuICAgIGNvbnN0IGFkZGl0aW9uYWxJbnN0YW5jZVJvbGVQb2xpY2llcyA9XG4gICAgICBwcm9wcz8uYWRkaXRpb25hbEluc3RhbmNlUm9sZVBvbGljaWVzID8/IFtdO1xuXG4gICAgbGV0IHZzY29kZVBhc3N3b3JkID0gcHJvcHM/LnZzY29kZVBhc3N3b3JkID8/IFwiXCI7XG4gICAgaWYgKHZzY29kZVBhc3N3b3JkID09IFwiXCIpIHtcbiAgICAgIC8vIENyZWF0ZSBhIHNlY3JldCB3aGljaCBpcyB0aGVuIGluamVjdCBpbiB0aGUgU1NNIGRvY3VtZW50IHRvIGluc3RhbGwgdnNjb2RlIHNlcnZlclxuICAgICAgY29uc3Qgc2VjcmV0ID0gbmV3IHNlY3JldHNtYW5hZ2VyLlNlY3JldCh0aGlzLCBcInBhc3N3b3JkLXNlY3JldFwiLCB7XG4gICAgICAgIGdlbmVyYXRlU2VjcmV0U3RyaW5nOiB7XG4gICAgICAgICAgcGFzc3dvcmRMZW5ndGg6IDE2LFxuICAgICAgICAgIHNlY3JldFN0cmluZ1RlbXBsYXRlOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICB1c2VybmFtZTogdnNDb2RlVXNlcixcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBleGNsdWRlUHVuY3R1YXRpb246IHRydWUsXG4gICAgICAgICAgaW5jbHVkZVNwYWNlOiBmYWxzZSxcbiAgICAgICAgICBnZW5lcmF0ZVN0cmluZ0tleTogXCJwYXNzd29yZFwiLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBOYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gICAgICAgIFtzZWNyZXRdLFxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6IFwiQXdzU29sdXRpb25zLVNNRzRcIixcbiAgICAgICAgICAgIHJlYXNvbjpcbiAgICAgICAgICAgICAgXCJGb3IgdGhpcyB0bXAgdmMgY29kZSBzZXJ2ZXIgd2UgZG8gbm90IG5lZWQgcGFzc3dvcmQgcm90YXRpb25cIixcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICB0cnVlLFxuICAgICAgKTtcblxuICAgICAgLy8gSGF2ZSBhIGN1c3RvbSByZXNvdXJjZSB0byBwYXNzIHRoZSBzZWNyZXQgZGF0YSBvbj8gLT4geWVzIGJlY2F1c2Ugbm90IHJlc29sdmFibGUgb24gY29tcGlsZSB0aW1lXG4gICAgICBjb25zdCBzZWNyZXRSZXRyaWV2ZXIgPSBTZWNyZXRSZXRyaWV2ZXIubmV3KHtcbiAgICAgICAgc2VjcmV0QXJuOiBzZWNyZXQuc2VjcmV0QXJuLFxuICAgICAgfSkuX2JpbmQodGhpcyk7XG5cbiAgICAgIHZzY29kZVBhc3N3b3JkID0gc2VjcmV0UmV0cmlldmVyLnNlY3JldFBhc3N3b3JkUGxhaW50ZXh0O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBkZWZhdWx0IHZwY1xuICAgIGNvbnN0IHZwYyA9IG5ldyBlYzIuVnBjKHRoaXMsIFwidnBjXCIsIHtcbiAgICAgIG1heEF6czogMixcbiAgICAgIGNyZWF0ZUludGVybmV0R2F0ZXdheTogdHJ1ZSxcbiAgICAgIHN1Ym5ldENvbmZpZ3VyYXRpb246IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwicHVibGljXCIsXG4gICAgICAgICAgc3VibmV0VHlwZTogZWMyLlN1Ym5ldFR5cGUuUFVCTElDLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGVuYWJsZURuc0hvc3RuYW1lczogdHJ1ZSxcbiAgICAgIGVuYWJsZURuc1N1cHBvcnQ6IHRydWUsXG4gICAgfSk7XG4gICAgTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICAgICAgW3ZwY10sXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogXCJBd3NTb2x1dGlvbnMtVlBDN1wiLFxuICAgICAgICAgIHJlYXNvbjogXCJGb3IgdGhpcyB0bXAgdnBjIHdlIGRvIG5vdCBuZWVkIGZsb3cgbG9nc1wiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHRydWUsXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBhIFNlY0dyb3VwIGFzc29jaWF0ZWQgd2l0aGUgdGhlIENGIGRpc3QgcExpc3RcbiAgICBjb25zdCBzZWNHcm91cCA9IG5ldyBlYzIuU2VjdXJpdHlHcm91cCh0aGlzLCBcImNmLXRvLXNlcnZlci1zZ1wiLCB7XG4gICAgICB2cGMsXG4gICAgICBkZXNjcmlwdGlvbjogXCJTRyBmb3IgVlNDb2RlU2VydmVyIC0gb25seSBhbGxvdyBDbG91ZEZyb250IGluZ3Jlc3NcIixcbiAgICAgIHNlY3VyaXR5R3JvdXBOYW1lOiBcImNsb3VkZnJvbnQtdG8tdnNjb2RlLXNlcnZlclwiLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYXdzTWFuYWdlZFByZWZpeExpc3QgPSBuZXcgQXdzTWFuYWdlZFByZWZpeExpc3QoXG4gICAgICB0aGlzLFxuICAgICAgXCJjZi1wcmVmaXhsaXN0SWRcIixcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJjb20uYW1hem9uYXdzLmdsb2JhbC5jbG91ZGZyb250Lm9yaWdpbi1mYWNpbmdcIixcbiAgICAgIH0sXG4gICAgKTtcbiAgICBOYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gICAgICBbYXdzTWFuYWdlZFByZWZpeExpc3RdLFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFwiQXdzU29sdXRpb25zLUlBTTVcIixcbiAgICAgICAgICByZWFzb246IFwiRm9yIHRoaXMgcHJvdmlkZXIgd2lsZGNhcmRzIGFyZSBmaW5lXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuXG4gICAgc2VjR3JvdXAuYWRkSW5ncmVzc1J1bGUoXG4gICAgICBlYzIuUGVlci5wcmVmaXhMaXN0KGF3c01hbmFnZWRQcmVmaXhMaXN0LnByZWZpeExpc3QucHJlZml4TGlzdElkKSxcbiAgICAgIGVjMi5Qb3J0LnRjcCg4MCksXG4gICAgICBcIkFsbG93IEhUVFAgZnJvbSBjb20uYW1hem9uYXdzLmdsb2JhbC5jbG91ZGZyb250Lm9yaWdpbi1mYWNpbmdcIixcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIGFuIEVDMiBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlYyBncm91cCArIGluc3RhbmNlIHByb2ZpbGUgYW5kIHJvbGVcbiAgICBjb25zdCBpbnN0YW5jZVJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgXCJzZXJ2ZXItaW5zdGFuY2Utcm9sZVwiLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uQ29tcG9zaXRlUHJpbmNpcGFsKFxuICAgICAgICBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJlYzIuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgICAgbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKFwic3NtLmFtYXpvbmF3cy5jb21cIiksXG4gICAgICApLFxuICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgVlNDb2RlSW5zdGFuY2VJbmxpbmVQb2xpY3k6IG5ldyBpYW0uUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgc2lkOiBcIlN0c0FjY2Vzc1wiLFxuICAgICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICBcInN0czpBc3N1bWVSb2xlXCIsXG4gICAgICAgICAgICAgICAgXCJpYW06QWRkUm9sZVRvSW5zdGFuY2VQcm9maWxlXCIsXG4gICAgICAgICAgICAgICAgXCJpYW06QXR0YWNoUm9sZVBvbGljeVwiLFxuICAgICAgICAgICAgICAgIFwiaWFtOkNyZWF0ZVJvbGVcIixcbiAgICAgICAgICAgICAgICBcImlhbTpDcmVhdGVTZXJ2aWNlTGlua2VkUm9sZVwiLFxuICAgICAgICAgICAgICAgIFwiaWFtOkRlbGV0ZVJvbGVcIixcbiAgICAgICAgICAgICAgICBcImlhbTpEZWxldGVSb2xlUGVybWlzc2lvbnNCb3VuZGFyeVwiLFxuICAgICAgICAgICAgICAgIFwiaWFtOkRlbGV0ZVJvbGVQb2xpY3lcIixcbiAgICAgICAgICAgICAgICBcImlhbTpEZWxldGVTZXJ2aWNlTGlua2VkUm9sZVwiLFxuICAgICAgICAgICAgICAgIFwiaWFtOkRldGFjaFJvbGVQb2xpY3lcIixcbiAgICAgICAgICAgICAgICBcImlhbTpHZXRSb2xlXCIsXG4gICAgICAgICAgICAgICAgXCJpYW06R2V0Um9sZVBvbGljeVwiLFxuICAgICAgICAgICAgICAgIFwiaWFtOkdldFNlcnZpY2VMaW5rZWRSb2xlRGVsZXRpb25TdGF0dXNcIixcbiAgICAgICAgICAgICAgICBcImlhbTpMaXN0QXR0YWNoZWRSb2xlUG9saWNpZXNcIixcbiAgICAgICAgICAgICAgICBcImlhbTpMaXN0SW5zdGFuY2VQcm9maWxlc0ZvclJvbGVcIixcbiAgICAgICAgICAgICAgICBcImlhbTpMaXN0Um9sZVBvbGljaWVzXCIsXG4gICAgICAgICAgICAgICAgXCJpYW06TGlzdFJvbGVzXCIsXG4gICAgICAgICAgICAgICAgXCJpYW06TGlzdFJvbGVUYWdzXCIsXG4gICAgICAgICAgICAgICAgXCJpYW06UHV0Um9sZVBlcm1pc3Npb25zQm91bmRhcnlcIixcbiAgICAgICAgICAgICAgICBcImlhbTpQdXRSb2xlUG9saWN5XCIsXG4gICAgICAgICAgICAgICAgXCJpYW06UmVtb3ZlUm9sZUZyb21JbnN0YW5jZVByb2ZpbGVcIixcbiAgICAgICAgICAgICAgICBcImlhbTpUYWdSb2xlXCIsXG4gICAgICAgICAgICAgICAgXCJpYW06VW50YWdSb2xlXCIsXG4gICAgICAgICAgICAgICAgXCJpYW06VXBkYXRlQXNzdW1lUm9sZVBvbGljeVwiLFxuICAgICAgICAgICAgICAgIFwiaWFtOlVwZGF0ZVJvbGVcIixcbiAgICAgICAgICAgICAgICBcImlhbTpVcGRhdGVSb2xlRGVzY3JpcHRpb25cIixcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbYGFybjphd3M6aWFtOjoke1N0YWNrLm9mKHRoaXMpLmFjY291bnR9OnJvbGUvY2RrLSpgXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcImlhbTpQYXNzUm9sZVwiXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbYGFybjphd3M6aWFtOjoke1N0YWNrLm9mKHRoaXMpLmFjY291bnR9OnJvbGUvY2RrLSpgXSxcbiAgICAgICAgICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICAgICAgICAgIFN0cmluZ0xpa2U6IHtcbiAgICAgICAgICAgICAgICAgIFwiaWFtOlBhc3NlZFRvU2VydmljZVwiOiBcImNsb3VkZm9ybWF0aW9uLmFtYXpvbmF3cy5jb21cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgYWN0aW9uczogW1wiY2xvdWRmb3JtYXRpb246KlwiXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgICAgICAgYGFybjphd3M6Y2xvdWRmb3JtYXRpb246Kjoke1N0YWNrLm9mKHRoaXMpLmFjY291bnR9OnN0YWNrL0NES1Rvb2xraXQvKmAsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgXCJjbG91ZGZvcm1hdGlvbjpDcmVhdGVDaGFuZ2VTZXRcIixcbiAgICAgICAgICAgICAgICBcImNsb3VkZm9ybWF0aW9uOkV4ZWN1dGVDaGFuZ2VTZXRcIixcbiAgICAgICAgICAgICAgICBcImNsb3VkZm9ybWF0aW9uOkRlbGV0ZUNoYW5nZVNldFwiLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgc2lkOiBcIlMzQWNjZXNzXCIsXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcInMzOipcIl0sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW1wiKlwiXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBzaWQ6IFwiRUNSQWNjZXNzXCIsXG4gICAgICAgICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgIFwiZWNyOlNldFJlcG9zaXRvcnlQb2xpY3lcIixcbiAgICAgICAgICAgICAgICBcImVjcjpHZXRMaWZlY3ljbGVQb2xpY3lcIixcbiAgICAgICAgICAgICAgICBcImVjcjpQdXRMaWZlY3ljbGVQb2xpY3lcIixcbiAgICAgICAgICAgICAgICBcImVjcjpQdXRJbWFnZVNjYW5uaW5nQ29uZmlndXJhdGlvblwiLFxuICAgICAgICAgICAgICAgIFwiZWNyOkRlc2NyaWJlUmVwb3NpdG9yaWVzXCIsXG4gICAgICAgICAgICAgICAgXCJlY3I6Q3JlYXRlUmVwb3NpdG9yeVwiLFxuICAgICAgICAgICAgICAgIFwiZWNyOkRlbGV0ZVJlcG9zaXRvcnlcIixcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgICAgICAgYGFybjphd3M6ZWNyOio6JHtTdGFjay5vZih0aGlzKS5hY2NvdW50fTpyZXBvc2l0b3J5L2Nkay0qYCxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICBcInNzbTpHZXRQYXJhbWV0ZXIqXCIsXG4gICAgICAgICAgICAgICAgXCJzc206UHV0UGFyYW1ldGVyKlwiLFxuICAgICAgICAgICAgICAgIFwic3NtOkRlbGV0ZVBhcmFtZXRlcipcIixcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgICAgICAgYGFybjphd3M6c3NtOio6JHtTdGFjay5vZih0aGlzKS5hY2NvdW50fTpwYXJhbWV0ZXIvY2RrLWJvb3RzdHJhcC8qYCxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICBcImVjMjpEZXNjcmliZUluc3RhbmNlc1wiLFxuICAgICAgICAgICAgICAgIFwiZWMyOk1vZGlmeVZvbHVtZVwiLFxuICAgICAgICAgICAgICAgIFwiZWMyOkRlc2NyaWJlVm9sdW1lc01vZGlmaWNhdGlvbnMqXCIsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW1wiKlwiXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICBcImNvZGVwaXBlbGluZTpFbmFibGVTdGFnZVRyYW5zaXRpb25cIixcbiAgICAgICAgICAgICAgICBcImNvZGVwaXBlbGluZTpEaXNhYmxlU3RhZ2VUcmFuc2l0aW9uXCIsXG4gICAgICAgICAgICAgICAgXCJjb2RlcGlwZWxpbmU6U3RhcnRQaXBlbGluZUV4ZWN1dGlvblwiLFxuICAgICAgICAgICAgICAgIFwiY29kZXBpcGVsaW5lOlN0b3BQaXBlbGluZUV4ZWN1dGlvblwiLFxuICAgICAgICAgICAgICAgIFwiY29kZXBpcGVsaW5lOlVwZGF0ZVBpcGVsaW5lXCIsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgICAgICAgIGBhcm46YXdzOmNvZGVwaXBlbGluZToqOiR7U3RhY2sub2YodGhpcykuYWNjb3VudH06Ki8qYCxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcImttczpEZWNyeXB0XCJdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtgYXJuOmF3czprbXM6Kjoke1N0YWNrLm9mKHRoaXMpLmFjY291bnR9OmtleS8qYF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC4uLmFkZGl0aW9uYWxJbnN0YW5jZVJvbGVQb2xpY2llcyxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgICBtYW5hZ2VkUG9saWNpZXM6IFtcbiAgICAgICAgaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKFxuICAgICAgICAgIFwiQW1hem9uU1NNTWFuYWdlZEluc3RhbmNlQ29yZVwiLFxuICAgICAgICApLFxuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgICAgXCJDbG91ZFdhdGNoQWdlbnRTZXJ2ZXJQb2xpY3lcIixcbiAgICAgICAgKSxcbiAgICAgICAgaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKFwiQW1hem9uUURldmVsb3BlckFjY2Vzc1wiKSxcbiAgICAgICAgaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKFwiUmVhZE9ubHlBY2Nlc3NcIiksXG4gICAgICBdLFxuICAgIH0pO1xuICAgIE5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgICAgIFtpbnN0YW5jZVJvbGVdLFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFwiQXdzU29sdXRpb25zLUlBTTRcIixcbiAgICAgICAgICByZWFzb246XG4gICAgICAgICAgICBcIkZvciB0aGlzIHRtcCByb2xlIHdlIGRvIG5vdCBuZWVkIHRvIHJlc3RyaWN0IG1hbmFnZWQgcG9saWNpZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBcIkF3c1NvbHV0aW9ucy1JQU01XCIsXG4gICAgICAgICAgcmVhc29uOiBcIkZvciB0aGlzIHRtcCByb2xlIHRoZSB3aWxkY2FyZHMgYXJlIGZpbmVcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB0cnVlLFxuICAgICk7XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBlYzIuSW5zdGFuY2UodGhpcywgXCJzZXJ2ZXItaW5zdGFuY2VcIiwge1xuICAgICAgdnBjLFxuICAgICAgaW5zdGFuY2VOYW1lLFxuICAgICAgaW5zdGFuY2VUeXBlLFxuICAgICAgbWFjaGluZUltYWdlOiBlYzIuTWFjaGluZUltYWdlLmZyb21Tc21QYXJhbWV0ZXIoXG4gICAgICAgIG1hY2hpbmVJbWFnZUZyb21Tc21QYXJhbWV0ZXIsXG4gICAgICAgIHtcbiAgICAgICAgICBvczogZWMyLk9wZXJhdGluZ1N5c3RlbVR5cGUuTElOVVgsXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgICAgcmVxdWlyZUltZHN2MjogdHJ1ZSxcbiAgICAgIHZwY1N1Ym5ldHM6IHtcbiAgICAgICAgc3VibmV0VHlwZTogZWMyLlN1Ym5ldFR5cGUuUFVCTElDLFxuICAgICAgfSxcbiAgICAgIGFzc29jaWF0ZVB1YmxpY0lwQWRkcmVzczogdHJ1ZSxcbiAgICAgIGRldGFpbGVkTW9uaXRvcmluZzogdHJ1ZSxcbiAgICAgIGJsb2NrRGV2aWNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgZGV2aWNlTmFtZTogXCIvZGV2L3NkYTFcIixcbiAgICAgICAgICB2b2x1bWU6IGVjMi5CbG9ja0RldmljZVZvbHVtZS5lYnMoaW5zdGFuY2VWb2x1bWVTaXplLCB7XG4gICAgICAgICAgICB2b2x1bWVUeXBlOiBlYzIuRWJzRGV2aWNlVm9sdW1lVHlwZS5HUDMsXG4gICAgICAgICAgICBlbmNyeXB0ZWQ6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVPblRlcm1pbmF0aW9uOiB0cnVlLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHJvbGU6IGluc3RhbmNlUm9sZSxcbiAgICAgIHNlY3VyaXR5R3JvdXA6IHNlY0dyb3VwLFxuICAgICAgdXNlckRhdGE6IGVjMi5Vc2VyRGF0YS5jdXN0b20oYFxuICAgICAgICAjY2xvdWQtY29uZmlnXG4gICAgICAgICAgaG9zdG5hbWU6ICR7aW5zdGFuY2VOYW1lfVxuICAgICAgICAgIHJ1bmNtZDpcbiAgICAgICAgICAgIC0gbWtkaXIgLXAgJHtob21lRm9sZGVyfSAmJiBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gJHtob21lRm9sZGVyfVxuICAgICAgYCksXG4gICAgfSk7XG4gICAgTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICAgICAgW2luc3RhbmNlXSxcbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBcIkF3c1NvbHV0aW9ucy1FQzI5XCIsXG4gICAgICAgICAgcmVhc29uOiBcIkZvciB0aGlzIHRtcCBpbnN0YW5jZSB3ZSBkbyBub3QgbmVlZCBhbiBhc2dcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB0cnVlLFxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgYSBDRiBkaXN0cmlidXRpb24gKHNwZWNpYWwgaWQpIGFuZCBzcGVjaWFsIENhY2hlUG9saWN5IHRvIGluc3RhbmNlXG4gICAgY29uc3QgY2ZDYWNoZVBvbGljeSA9IG5ldyBjZi5DYWNoZVBvbGljeSh0aGlzLCBcImNmLWNhY2hlLXBvbGljeVwiLCB7XG4gICAgICBjYWNoZVBvbGljeU5hbWU6IGBjZi1jYWNoZS1wb2xpY3ktdnNjb2Rlc2VydmVyLSR7U3RhY2sub2YodGhpcykuc3RhY2tOYW1lfWAsXG4gICAgICBjb21tZW50OiBcIkNhY2hlIHBvbGljeSBmb3IgVlNDb2RlU2VydmVyXCIsXG4gICAgICBtaW5UdGw6IER1cmF0aW9uLnNlY29uZHMoMSksXG4gICAgICBtYXhUdGw6IER1cmF0aW9uLnNlY29uZHMoMzE1MzYwMDApLFxuICAgICAgZGVmYXVsdFR0bDogRHVyYXRpb24uc2Vjb25kcyg4NjQwMCksXG4gICAgICBjb29raWVCZWhhdmlvcjogY2YuQ2FjaGVDb29raWVCZWhhdmlvci5hbGwoKSxcbiAgICAgIGVuYWJsZUFjY2VwdEVuY29kaW5nR3ppcDogZmFsc2UsXG4gICAgICBoZWFkZXJCZWhhdmlvcjoge1xuICAgICAgICBiZWhhdmlvcjogXCJ3aGl0ZWxpc3RcIixcbiAgICAgICAgaGVhZGVyczogW1xuICAgICAgICAgIFwiQWNjZXB0LUNoYXJzZXRcIixcbiAgICAgICAgICBcIkF1dGhvcml6YXRpb25cIixcbiAgICAgICAgICBcIk9yaWdpblwiLFxuICAgICAgICAgIFwiQWNjZXB0XCIsXG4gICAgICAgICAgXCJSZWZlcmVyXCIsXG4gICAgICAgICAgXCJIb3N0XCIsXG4gICAgICAgICAgXCJBY2NlcHQtTGFuZ3VhZ2VcIixcbiAgICAgICAgICBcIkFjY2VwdC1FbmNvZGluZ1wiLFxuICAgICAgICAgIFwiQWNjZXB0LURhdGV0aW1lXCIsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgcXVlcnlTdHJpbmdCZWhhdmlvcjogY2YuQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbCgpLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgb3JpZ2luID0gbmV3IGNmby5IdHRwT3JpZ2luKGluc3RhbmNlLmluc3RhbmNlUHVibGljRG5zTmFtZSwge1xuICAgICAgcHJvdG9jb2xQb2xpY3k6IGNmLk9yaWdpblByb3RvY29sUG9saWN5LkhUVFBfT05MWSxcbiAgICAgIG9yaWdpbklkOiBgQ2xvdWRmcm9udC0ke1N0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZX0tJHtTdGFjay5vZih0aGlzKS5zdGFja05hbWV9YCxcbiAgICB9KTtcblxuICAgIGNvbnN0IGRpc3RyaWJ1dGlvbiA9IG5ldyBjZi5EaXN0cmlidXRpb24odGhpcywgXCJjZi1kaXN0cmlidXRpb25cIiwge1xuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIGh0dHBWZXJzaW9uOiBjZi5IdHRwVmVyc2lvbi5IVFRQMl9BTkRfMyxcbiAgICAgIC8vIE5PVEU6ICdEaXN0cmlidXRpb25zIHRoYXQgdXNlIHRoZSBkZWZhdWx0IENsb3VkRnJvbnQgdmlld2VyIGNlcnRpZmljYXRlIG9yIHVzZSAndmlwJyBmb3IgdGhlICdTc2xTdXBwb3J0TWV0aG9kJ1xuICAgICAgLy8gYXJlIG5vbi1jb21wbGlhbnQgd2l0aCB0aGlzIHJ1bGUsIGFzIHRoZSBtaW5pbXVtIHNlY3VyaXR5IHBvbGljeSBpcyBzZXQgdG8gVExTdjEgcmVnYXJkbGVzc1xuICAgICAgLy8gb2YgdGhlIHNwZWNpZmllZCAnTWluaW11bVByb3RvY29sVmVyc2lvbidcbiAgICAgIC8vIG1pbmltdW1Qcm90b2NvbFZlcnNpb246IGNmLlNlY3VyaXR5UG9saWN5UHJvdG9jb2wuVExTX1YxXzJfMjAyMSxcbiAgICAgIGNvbW1lbnQ6IFwiRGlzdHJpYnV0aW9uIGZvciBWU0NvZGVTZXJ2ZXJcIixcbiAgICAgIHByaWNlQ2xhc3M6IGNmLlByaWNlQ2xhc3MuUFJJQ0VfQ0xBU1NfQUxMLFxuICAgICAgZGVmYXVsdEJlaGF2aW9yOiB7XG4gICAgICAgIGFsbG93ZWRNZXRob2RzOiBjZi5BbGxvd2VkTWV0aG9kcy5BTExPV19BTEwsXG4gICAgICAgIGNhY2hlUG9saWN5OiBjZkNhY2hlUG9saWN5LFxuICAgICAgICBvcmlnaW5SZXF1ZXN0UG9saWN5OiB7XG4gICAgICAgICAgLy8gTWFuYWdlZC1BbGxWaWV3ZXIgLSBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3VzaW5nLW1hbmFnZWQtb3JpZ2luLXJlcXVlc3QtcG9saWNpZXMuaHRtbCM6fjp0ZXh0PVdoZW4lMjB1c2luZyUyMEFXUyw0N2U0JTJEYjk4OSUyRDU0OTJlYWZhMDdkM1xuICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3lJZDogXCIyMTZhZGVmNi01YzdmLTQ3ZTQtYjk4OS01NDkyZWFmYTA3ZDNcIixcbiAgICAgICAgfSxcbiAgICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IGNmLlZpZXdlclByb3RvY29sUG9saWN5LkFMTE9XX0FMTCxcbiAgICAgICAgb3JpZ2luLFxuICAgICAgfSxcbiAgICAgIGFkZGl0aW9uYWxCZWhhdmlvcnM6IHtcbiAgICAgICAgXCIvcHJveHkvKlwiOiB7XG4gICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IGNmLkFsbG93ZWRNZXRob2RzLkFMTE9XX0FMTCxcbiAgICAgICAgICBjb21wcmVzczogZmFsc2UsXG4gICAgICAgICAgLy8gc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS91c2luZy1tYW5hZ2VkLWNhY2hlLXBvbGljaWVzLmh0bWwjbWFuYWdlZC1jYWNoZS1wb2xpY3ktY2FjaGluZy1kaXNhYmxlZFxuICAgICAgICAgIGNhY2hlUG9saWN5OiBjZi5DYWNoZVBvbGljeS5DQUNISU5HX0RJU0FCTEVELFxuICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3k6IHtcbiAgICAgICAgICAgIC8vIE1hbmFnZWQtQWxsVmlld2VyIC0gc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS91c2luZy1tYW5hZ2VkLW9yaWdpbi1yZXF1ZXN0LXBvbGljaWVzLmh0bWwjOn46dGV4dD1XaGVuJTIwdXNpbmclMjBBV1MsNDdlNCUyRGI5ODklMkQ1NDkyZWFmYTA3ZDNcbiAgICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3lJZDogXCIyMTZhZGVmNi01YzdmLTQ3ZTQtYjk4OS01NDkyZWFmYTA3ZDNcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBjZi5WaWV3ZXJQcm90b2NvbFBvbGljeS5BTExPV19BTEwsXG4gICAgICAgICAgb3JpZ2luLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBOYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gICAgICBbZGlzdHJpYnV0aW9uXSxcbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBcIkF3c1NvbHV0aW9ucy1DRlIxXCIsXG4gICAgICAgICAgcmVhc29uOiBcIkZvciB0aGlzIHRtcCBkaXN0cmlidXRpb24gd2UgZG8gbm90IG5lZWQgZ2VvIHJlc3RyaWN0aW9uc1wiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFwiQXdzU29sdXRpb25zLUNGUjJcIixcbiAgICAgICAgICByZWFzb246IFwiRm9yIHRoaXMgdG1wIGRpc3RyaWJ1dGlvbiB3ZSBkbyBub3QgbmVlZCB3YWYgaW50ZWdyYXRpb25cIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBcIkF3c1NvbHV0aW9ucy1DRlIzXCIsXG4gICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgXCJGb3IgdGhpcyB0bXAgZGlzdHJpYnV0aW9uIHdlIGRvIG5vdCBuZWVkIGFjY2VzcyBsb2dnaW5nIGVuYWJsZWRcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBcIkF3c1NvbHV0aW9ucy1DRlI0XCIsXG4gICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgXCJGb3IgdGhpcyB0bXAgZGlzdHJpYnV0aW9uIHdlIGRvIG5vdCBuZWVkIGxpbWl0IFNTTCBwcm90b2NvbHMgYXMgd2UgdXNlIHRoZSBkZWZhdWx0IHZpZXdlciBjZXJ0XCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogXCJBd3NTb2x1dGlvbnMtQ0ZSNVwiLFxuICAgICAgICAgIHJlYXNvbjpcbiAgICAgICAgICAgIFwiRm9yIHRoaXMgdG1wIGRpc3RyaWJ1dGlvbiB3ZSBkbyBub3QgbmVlZCBsaW1pdCBTU0wgcHJvdG9jb2xzIGFzIHdlIHVzZSB0aGUgZGVmYXVsdCB2aWV3ZXIgY2VydFwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHRydWUsXG4gICAgKTtcblxuICAgIC8vIFVzZSBhIGN1c3RvbSByZXNvdXJjZSBsYW1iZGEgdG8gcnVuIHRoZSBTU00gZG9jdW1lbnQgb24gdGhlIGluc3RhbmNlXG4gICAgc3dpdGNoIChpbnN0YW5jZU9wZXJhdGluZ1N5c3RlbSkge1xuICAgICAgY2FzZSBMaW51eEZsYXZvclR5cGUuVUJVTlRVXzIyOlxuICAgICAgY2FzZSBMaW51eEZsYXZvclR5cGUuVUJVTlRVXzI0OlxuICAgICAgICBJbnN0YWxsZXIudWJ1bnR1KHtcbiAgICAgICAgICBpbnN0YW5jZUlkOiBpbnN0YW5jZS5pbnN0YW5jZUlkLFxuICAgICAgICAgIHZzQ29kZVVzZXI6IHZzQ29kZVVzZXIsXG4gICAgICAgICAgdnNDb2RlUGFzc3dvcmQ6IHZzY29kZVBhc3N3b3JkLFxuICAgICAgICAgIGRldlNlcnZlckJhc2VQYXRoOiBwcm9wcz8uZGV2U2VydmVyQmFzZVBhdGgsXG4gICAgICAgICAgZGV2U2VydmVyUG9ydDogcHJvcHM/LmRldlNlcnZlclBvcnQsXG4gICAgICAgICAgaG9tZUZvbGRlcjogaG9tZUZvbGRlcixcbiAgICAgICAgfSkuX2JpbmQodGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMaW51eEZsYXZvclR5cGUuQU1BWk9OX0xJTlVYXzIwMjM6XG4gICAgICAgIEluc3RhbGxlci5hbWF6b25MaW51eDIwMjMoe1xuICAgICAgICAgIGluc3RhbmNlSWQ6IGluc3RhbmNlLmluc3RhbmNlSWQsXG4gICAgICAgICAgdnNDb2RlVXNlcjogdnNDb2RlVXNlcixcbiAgICAgICAgICB2c0NvZGVQYXNzd29yZDogdnNjb2RlUGFzc3dvcmQsXG4gICAgICAgICAgZGV2U2VydmVyQmFzZVBhdGg6IHByb3BzPy5kZXZTZXJ2ZXJCYXNlUGF0aCxcbiAgICAgICAgICBkZXZTZXJ2ZXJQb3J0OiBwcm9wcz8uZGV2U2VydmVyUG9ydCxcbiAgICAgICAgICBob21lRm9sZGVyOiBob21lRm9sZGVyLFxuICAgICAgICB9KS5fYmluZCh0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIExpbnV4IGZsYXZvcjogJHtpbnN0YW5jZU9wZXJhdGluZ1N5c3RlbX1gKTtcbiAgICB9XG4gICAgLy8gc28gd2UgcGFzcyB0aGUgb3V0ZXIgc2NvcGUgb2YgdGhpcyBjb25zdHJ1Y3QgdGhyb3VnaCB0aGUgaW5zdGFsbGVyXG5cbiAgICAvLyBOT1RFOiBtYXliZSBoYXZlIGEgaGVhbGhjaGVjayBDRk4gY3VzdG9tIHJlc291cmNlIHRvIHNlZSBpZiB0aGUgdnNjb2RlIHNlcnZlciBpcyBoZWFsdGh5XG4gICAgLy8gYXRtIHRoaXMgaXMgYWNoaWV2ZWQgYnkgdGhlIGludGVnIHRlc3RzXG5cbiAgICAvLyBPdXRwdXRzXG4gICAgdGhpcy5kb21haW5OYW1lID0gYGh0dHBzOi8vJHtkaXN0cmlidXRpb24uZG9tYWluTmFtZX0vP2ZvbGRlcj0ke2hvbWVGb2xkZXJ9YDtcbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIFwiZG9tYWluTmFtZVwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgZG9tYWluIG5hbWUgb2YgdGhlIGRpc3RyaWJ1dGlvblwiLFxuICAgICAgdmFsdWU6IHRoaXMuZG9tYWluTmFtZSxcbiAgICB9KTtcblxuICAgIHRoaXMucGFzc3dvcmQgPSB2c2NvZGVQYXNzd29yZDtcbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIFwicGFzc3dvcmRcIiwge1xuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIHBhc3N3b3JkIGZvciB0aGUgVlNDb2RlIHNlcnZlclwiLFxuICAgICAgdmFsdWU6IHZzY29kZVBhc3N3b3JkLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|