@mavogel/cdk-vscode-server 0.0.15 → 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.
@@ -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 ?? 'participant';
40
- const instanceName = props?.instanceName ?? 'VSCodeServer';
57
+ const vsCodeUser = props?.vscodeUser ?? "participant";
58
+ const instanceName = props?.instanceName ?? "VSCodeServer";
41
59
  const instanceVolumeSize = props?.instanceVolumeSize ?? 40;
42
- const homeFolder = props?.homeFolder ?? '/Workshop';
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 ((vscodePassword == '')) {
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, 'password-secret', {
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: 'password',
79
+ generateStringKey: "password",
62
80
  },
63
81
  });
64
- cdk_nag_1.NagSuppressions.addResourceSuppressions([
65
- secret,
66
- ], [
67
- { id: 'AwsSolutions-SMG4', reason: 'For this tmp vc code server we do not need password rotation' },
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, 'vpc', {
95
+ const vpc = new ec2.Vpc(this, "vpc", {
77
96
  maxAzs: 2,
78
97
  createInternetGateway: true,
79
98
  subnetConfiguration: [
80
99
  {
81
- name: 'public',
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
- vpc,
90
- ], [
91
- { id: 'AwsSolutions-VPC7', reason: 'For this tmp vpc we do not need flow logs' },
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, 'cf-to-server-sg', {
114
+ const secGroup = new ec2.SecurityGroup(this, "cf-to-server-sg", {
95
115
  vpc,
96
- description: 'SG for VSCodeServer - only allow CloudFront ingress',
97
- securityGroupName: 'cloudfront-to-vscode-server',
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, 'cf-prefixlistId', {
100
- name: 'com.amazonaws.global.cloudfront.origin-facing',
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
- awsManagedPrefixList,
104
- ], [
105
- { id: 'AwsSolutions-IAM5', reason: 'For this provider wildcards are fine' },
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), 'Allow HTTP from com.amazonaws.global.cloudfront.origin-facing');
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, 'server-instance-role', {
110
- assumedBy: new iam.CompositePrincipal(new iam.ServicePrincipal('ec2.amazonaws.com'), new iam.ServicePrincipal('ssm.amazonaws.com')),
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: 'StsAccess',
136
+ sid: "StsAccess",
116
137
  effect: iam.Effect.ALLOW,
117
138
  actions: [
118
- 'sts:AssumeRole',
119
- 'iam:AddRoleToInstanceProfile',
120
- 'iam:AttachRolePolicy',
121
- 'iam:CreateRole',
122
- 'iam:CreateServiceLinkedRole',
123
- 'iam:DeleteRole',
124
- 'iam:DeleteRolePermissionsBoundary',
125
- 'iam:DeleteRolePolicy',
126
- 'iam:DeleteServiceLinkedRole',
127
- 'iam:DetachRolePolicy',
128
- 'iam:GetRole',
129
- 'iam:GetRolePolicy',
130
- 'iam:GetServiceLinkedRoleDeletionStatus',
131
- 'iam:ListAttachedRolePolicies',
132
- 'iam:ListInstanceProfilesForRole',
133
- 'iam:ListRolePolicies',
134
- 'iam:ListRoles',
135
- 'iam:ListRoleTags',
136
- 'iam:PutRolePermissionsBoundary',
137
- 'iam:PutRolePolicy',
138
- 'iam:RemoveRoleFromInstanceProfile',
139
- 'iam:TagRole',
140
- 'iam:UntagRole',
141
- 'iam:UpdateAssumeRolePolicy',
142
- 'iam:UpdateRole',
143
- 'iam:UpdateRoleDescription',
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
- 'iam:PassRole',
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
- 'iam:PassedToService': 'cloudformation.amazonaws.com',
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
- 'cloudformation:CreateChangeSet',
176
- 'cloudformation:ExecuteChangeSet',
177
- 'cloudformation:DeleteChangeSet',
188
+ "cloudformation:CreateChangeSet",
189
+ "cloudformation:ExecuteChangeSet",
190
+ "cloudformation:DeleteChangeSet",
178
191
  ],
179
- resources: ['*'],
192
+ resources: ["*"],
180
193
  }),
181
194
  new iam.PolicyStatement({
182
- sid: 'S3Access',
183
- actions: [
184
- 's3:*',
185
- ],
186
- resources: ['*'],
195
+ sid: "S3Access",
196
+ actions: ["s3:*"],
197
+ resources: ["*"],
187
198
  }),
188
199
  new iam.PolicyStatement({
189
- sid: 'ECRAccess',
200
+ sid: "ECRAccess",
190
201
  effect: iam.Effect.ALLOW,
191
202
  actions: [
192
- 'ecr:SetRepositoryPolicy',
193
- 'ecr:GetLifecyclePolicy',
194
- 'ecr:PutLifecyclePolicy',
195
- 'ecr:PutImageScanningConfiguration',
196
- 'ecr:DescribeRepositories',
197
- 'ecr:CreateRepository',
198
- 'ecr:DeleteRepository',
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
- 'ssm:GetParameter*',
208
- 'ssm:PutParameter*',
209
- 'ssm:DeleteParameter*',
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
- 'ec2:DescribeInstances',
219
- 'ec2:ModifyVolume',
220
- 'ec2:DescribeVolumesModifications*',
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
- 'codepipeline:EnableStageTransition',
228
- 'codepipeline:DisableStageTransition',
229
- 'codepipeline:StartPipelineExecution',
230
- 'codepipeline:StopPipelineExecution',
231
- 'codepipeline:UpdatePipeline',
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
- 'kms:Decrypt',
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('AmazonSSMManagedInstanceCore'),
252
- iam.ManagedPolicy.fromAwsManagedPolicyName('CloudWatchAgentServerPolicy'),
253
- iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonQDeveloperAccess'),
254
- iam.ManagedPolicy.fromAwsManagedPolicyName('ReadOnlyAccess'),
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
- instanceRole,
259
- ], [
260
- { id: 'AwsSolutions-IAM4', reason: 'For this tmp role we do not need to restrict managed policies' },
261
- { id: 'AwsSolutions-IAM5', reason: 'For this tmp role the wildcards are fine' },
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, 'server-instance', {
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: '/dev/sda1',
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
- instance,
297
- ], [
298
- { id: 'AwsSolutions-EC29', reason: 'For this tmp instance we do not need an asg' },
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, 'cf-cache-policy', {
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: 'Cache policy for VSCodeServer',
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: 'whitelist',
322
+ behavior: "whitelist",
311
323
  headers: [
312
- 'Accept-Charset',
313
- 'Authorization',
314
- 'Origin',
315
- 'Accept',
316
- 'Referer',
317
- 'Host',
318
- 'Accept-Language',
319
- 'Accept-Encoding',
320
- 'Accept-Datetime',
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, 'cf-distribution', {
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: 'Distribution for VSCodeServer',
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: '216adef6-5c7f-47e4-b989-5492eafa07d3',
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
- '/proxy/*': {
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: '216adef6-5c7f-47e4-b989-5492eafa07d3',
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
- distribution,
365
- ], [
366
- { id: 'AwsSolutions-CFR1', reason: 'For this tmp distribution we do not need geo restrictions' },
367
- { id: 'AwsSolutions-CFR2', reason: 'For this tmp distribution we do not need waf integration' },
368
- { id: 'AwsSolutions-CFR3', reason: 'For this tmp distribution we do not need access logging enabled' },
369
- { id: 'AwsSolutions-CFR4', reason: 'For this tmp distribution we do not need limit SSL protocols as we use the default viewer cert' },
370
- { id: 'AwsSolutions-CFR5', reason: 'For this tmp distribution we do not need limit SSL protocols as we use the default viewer cert' },
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, 'domainName', {
404
- description: 'The domain name of the distribution',
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, 'password', {
409
- description: 'The password for the VSCode server',
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.15" };
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=