@aws-cdk/aws-ec2-alpha 2.218.0-alpha.0 → 2.220.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/vpc-v2.js CHANGED
@@ -1,11 +1,38 @@
1
1
  "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
2
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
3
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
4
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
5
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
6
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
7
+ var _, done = false;
8
+ for (var i = decorators.length - 1; i >= 0; i--) {
9
+ var context = {};
10
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
11
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
12
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
13
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
14
+ if (kind === "accessor") {
15
+ if (result === void 0) continue;
16
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
17
+ if (_ = accept(result.get)) descriptor.get = _;
18
+ if (_ = accept(result.set)) descriptor.set = _;
19
+ if (_ = accept(result.init)) initializers.unshift(_);
20
+ }
21
+ else if (_ = accept(result)) {
22
+ if (kind === "field") initializers.unshift(_);
23
+ else descriptor[key] = _;
24
+ }
25
+ }
26
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
27
+ done = true;
28
+ };
29
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
30
+ var useValue = arguments.length > 2;
31
+ for (var i = 0; i < initializers.length; i++) {
32
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
33
+ }
34
+ return useValue ? value : void 0;
7
35
  };
8
- var _a, _b;
9
36
  Object.defineProperty(exports, "__esModule", { value: true });
10
37
  exports.VpcV2 = exports.IpAddresses = void 0;
11
38
  const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
@@ -22,6 +49,7 @@ const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
22
49
  * IpAddress options to define VPC V2
23
50
  */
24
51
  class IpAddresses {
52
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-ec2-alpha.IpAddresses", version: "2.220.0-alpha.0" };
25
53
  /**
26
54
  * An IPv4 CIDR Range
27
55
  */
@@ -99,8 +127,6 @@ class IpAddresses {
99
127
  }
100
128
  }
101
129
  exports.IpAddresses = IpAddresses;
102
- _a = JSII_RTTI_SYMBOL_1;
103
- IpAddresses[_a] = { fqn: "@aws-cdk/aws-ec2-alpha.IpAddresses", version: "2.218.0-alpha.0" };
104
130
  /**
105
131
  * Name tag constant
106
132
  */
@@ -112,90 +138,180 @@ const NAME_TAG = 'Name';
112
138
  *
113
139
  * @resource AWS::EC2::VPC
114
140
  */
115
- let VpcV2 = class VpcV2 extends vpc_v2_base_1.VpcV2Base {
116
- /**
117
- * Create a VPC from existing attributes
118
- */
119
- static fromVpcV2Attributes(scope, id, attrs) {
120
- try {
121
- jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_VpcV2Attributes(attrs);
122
- }
123
- catch (error) {
124
- if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
125
- Error.captureStackTrace(error, this.fromVpcV2Attributes);
126
- }
127
- throw error;
141
+ let VpcV2 = (() => {
142
+ let _classDecorators = [prop_injectable_1.propertyInjectable];
143
+ let _classDescriptor;
144
+ let _classExtraInitializers = [];
145
+ let _classThis;
146
+ let _classSuper = vpc_v2_base_1.VpcV2Base;
147
+ var VpcV2 = class extends _classSuper {
148
+ static { _classThis = this; }
149
+ static {
150
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
151
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
152
+ VpcV2 = _classThis = _classDescriptor.value;
153
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
128
154
  }
155
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-ec2-alpha.VpcV2", version: "2.220.0-alpha.0" };
156
+ /** Uniquely identifies this class. */
157
+ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-ec2-alpha.VpcV2';
129
158
  /**
130
- * Internal class to allow users to import VPC
131
- * @internal
159
+ * Create a VPC from existing attributes
132
160
  */
133
- class ImportedVpcV2 extends vpc_v2_base_1.VpcV2Base {
134
- constructor(construct, constructId, props) {
135
- super(construct, constructId);
136
- this.publicSubnets = [];
137
- this.privateSubnets = [];
138
- this.isolatedSubnets = [];
139
- this.internetConnectivityEstablished = new constructs_1.DependencyGroup();
161
+ static fromVpcV2Attributes(scope, id, attrs) {
162
+ try {
163
+ jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_VpcV2Attributes(attrs);
164
+ }
165
+ catch (error) {
166
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
167
+ Error.captureStackTrace(error, this.fromVpcV2Attributes);
168
+ }
169
+ throw error;
170
+ }
171
+ /**
172
+ * Internal class to allow users to import VPC
173
+ * @internal
174
+ */
175
+ class ImportedVpcV2 extends vpc_v2_base_1.VpcV2Base {
176
+ vpcId;
177
+ vpcArn;
178
+ publicSubnets = [];
179
+ privateSubnets = [];
180
+ isolatedSubnets = [];
181
+ internetConnectivityEstablished = new constructs_1.DependencyGroup();
182
+ ipv4CidrBlock;
183
+ region;
184
+ ownerAccountId;
185
+ vpcName;
186
+ _partition;
187
+ /*
188
+ * Reference to all secondary blocks attached
189
+ */
190
+ secondaryCidrBlock;
191
+ /**
192
+ * Refers to actual VPC Resource attribute in non-imported VPC
193
+ * Required to implement here due to extension from Base class
194
+ */
195
+ vpcCidrBlock;
140
196
  // Required to do CIDR range test on imported VPCs to create new subnets
141
- this.ipv4IpamProvisionedCidrs = [];
142
- this.vpcId = props.vpcId,
143
- this.region = props.region ?? this.stack.region,
144
- this.ownerAccountId = props.ownerAccountId ?? this.stack.account,
145
- this._partition = aws_cdk_lib_1.region_info.RegionInfo.get(this.region).partition,
146
- this.vpcArn = core_1.Arn.format({
147
- service: 'ec2',
148
- resource: 'vpc',
149
- resourceName: this.vpcId,
150
- region: this.region,
151
- account: this.ownerAccountId,
152
- partition: this._partition,
153
- }, this.stack);
154
- // Populate region and account fields that can be used to set up peering connection
155
- // sample vpc Arn - arn:aws:ec2:us-west-2:123456789012:vpc/vpc-0123456789abcdef0
156
- this.region = this.vpcArn.split(':')[3];
157
- this.ownerAccountId = this.vpcArn.split(':')[4];
158
- // Refers to actual VPC Resource attribute in non-imported VPC
159
- this.vpcCidrBlock = props.vpcCidrBlock;
160
- // Required for subnet range related checks
161
- this.ipv4CidrBlock = props.vpcCidrBlock;
162
- this._vpnGatewayId = props.vpnGatewayId;
163
- if (props.subnets) {
164
- for (const subnet of props.subnets) {
165
- if (subnet.subnetType === aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS || subnet.subnetType === aws_ec2_1.SubnetType.PRIVATE_WITH_NAT ||
166
- subnet.subnetType === 'Deprecated_Private') {
167
- this.privateSubnets.push(subnet_v2_1.SubnetV2.fromSubnetV2Attributes(scope, subnet.subnetName ?? 'ImportedPrivateSubnet', subnet));
168
- }
169
- else if (subnet.subnetType === aws_ec2_1.SubnetType.PUBLIC) {
170
- this.publicSubnets.push(subnet_v2_1.SubnetV2.fromSubnetV2Attributes(scope, subnet.subnetName ?? 'ImportedPublicSubnet', subnet));
171
- }
172
- else if (subnet.subnetType === 'Deprecated_Isolated' || subnet.subnetType === aws_ec2_1.SubnetType.PRIVATE_ISOLATED) {
173
- this.isolatedSubnets.push(subnet_v2_1.SubnetV2.fromSubnetV2Attributes(scope, subnet.subnetName ?? 'ImportedIsolatedSubnet', subnet));
197
+ ipv4IpamProvisionedCidrs = [];
198
+ constructor(construct, constructId, props) {
199
+ super(construct, constructId);
200
+ this.vpcId = props.vpcId,
201
+ this.region = props.region ?? this.stack.region,
202
+ this.ownerAccountId = props.ownerAccountId ?? this.stack.account,
203
+ this._partition = aws_cdk_lib_1.region_info.RegionInfo.get(this.region).partition,
204
+ this.vpcArn = core_1.Arn.format({
205
+ service: 'ec2',
206
+ resource: 'vpc',
207
+ resourceName: this.vpcId,
208
+ region: this.region,
209
+ account: this.ownerAccountId,
210
+ partition: this._partition,
211
+ }, this.stack);
212
+ // Populate region and account fields that can be used to set up peering connection
213
+ // sample vpc Arn - arn:aws:ec2:us-west-2:123456789012:vpc/vpc-0123456789abcdef0
214
+ this.region = this.vpcArn.split(':')[3];
215
+ this.ownerAccountId = this.vpcArn.split(':')[4];
216
+ // Refers to actual VPC Resource attribute in non-imported VPC
217
+ this.vpcCidrBlock = props.vpcCidrBlock;
218
+ // Required for subnet range related checks
219
+ this.ipv4CidrBlock = props.vpcCidrBlock;
220
+ this._vpnGatewayId = props.vpnGatewayId;
221
+ if (props.subnets) {
222
+ for (const subnet of props.subnets) {
223
+ if (subnet.subnetType === aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS || subnet.subnetType === aws_ec2_1.SubnetType.PRIVATE_WITH_NAT ||
224
+ subnet.subnetType === 'Deprecated_Private') {
225
+ this.privateSubnets.push(subnet_v2_1.SubnetV2.fromSubnetV2Attributes(scope, subnet.subnetName ?? 'ImportedPrivateSubnet', subnet));
226
+ }
227
+ else if (subnet.subnetType === aws_ec2_1.SubnetType.PUBLIC) {
228
+ this.publicSubnets.push(subnet_v2_1.SubnetV2.fromSubnetV2Attributes(scope, subnet.subnetName ?? 'ImportedPublicSubnet', subnet));
229
+ }
230
+ else if (subnet.subnetType === 'Deprecated_Isolated' || subnet.subnetType === aws_ec2_1.SubnetType.PRIVATE_ISOLATED) {
231
+ this.isolatedSubnets.push(subnet_v2_1.SubnetV2.fromSubnetV2Attributes(scope, subnet.subnetName ?? 'ImportedIsolatedSubnet', subnet));
232
+ }
174
233
  }
175
234
  }
176
- }
177
- this.secondaryCidrBlock = props.secondaryCidrBlocks?.map(cidrBlock => VPCCidrBlock.fromVPCCidrBlockattributes(scope, cidrBlock.cidrBlockName ?? 'ImportedSecondaryCidrBlock', { ...cidrBlock }));
178
- if (props.secondaryCidrBlocks) {
179
- for (const cidrBlock of props.secondaryCidrBlocks) {
180
- if (cidrBlock.ipv4IpamProvisionedCidrs) {
181
- this.ipv4IpamProvisionedCidrs.push(...cidrBlock.ipv4IpamProvisionedCidrs);
235
+ this.secondaryCidrBlock = props.secondaryCidrBlocks?.map(cidrBlock => VPCCidrBlock.fromVPCCidrBlockattributes(scope, cidrBlock.cidrBlockName ?? 'ImportedSecondaryCidrBlock', { ...cidrBlock }));
236
+ if (props.secondaryCidrBlocks) {
237
+ for (const cidrBlock of props.secondaryCidrBlocks) {
238
+ if (cidrBlock.ipv4IpamProvisionedCidrs) {
239
+ this.ipv4IpamProvisionedCidrs.push(...cidrBlock.ipv4IpamProvisionedCidrs);
240
+ }
182
241
  }
183
242
  }
184
243
  }
185
244
  }
245
+ return new ImportedVpcV2(scope, id, attrs);
186
246
  }
187
- return new ImportedVpcV2(scope, id, attrs);
188
- }
189
- constructor(scope, id, props = {}) {
190
- super(scope, id, {
191
- physicalName: props.vpcName ?? core_1.Lazy.string({
192
- produce: () => core_1.Names.uniqueResourceName(this, { maxLength: 128, allowedSpecialCharacters: '_' }),
193
- }),
194
- });
247
+ /**
248
+ * Identifier for this VPC
249
+ */
250
+ vpcId;
251
+ /**
252
+ * @attribute
253
+ */
254
+ vpcArn;
255
+ /**
256
+ * @attribute
257
+ */
258
+ vpcCidrBlock;
259
+ /**
260
+ * The IPv6 CIDR blocks for the VPC.
261
+ *
262
+ * See https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html#aws-resource-ec2-vpc-return-values
263
+ */
264
+ ipv6CidrBlocks;
265
+ /**
266
+ * The provider of ipv4 addresses
267
+ */
268
+ ipAddresses;
269
+ /**
270
+ * The AWS CloudFormation resource representing the VPC.
271
+ */
272
+ resource;
273
+ /**
274
+ * Indicates if instances launched in this VPC will have public DNS hostnames.
275
+ */
276
+ dnsHostnamesEnabled;
277
+ /**
278
+ * Indicates if DNS support is enabled for this VPC.
279
+ */
280
+ dnsSupportEnabled;
281
+ /**
282
+ * Isolated Subnets that are part of this VPC.
283
+ */
284
+ isolatedSubnets;
285
+ /**
286
+ * Public Subnets that are part of this VPC.
287
+ */
288
+ publicSubnets;
289
+ /**
290
+ * Public Subnets that are part of this VPC.
291
+ */
292
+ privateSubnets;
293
+ /**
294
+ * To define dependency on internet connectivity
295
+ */
296
+ internetConnectivityEstablished;
195
297
  /**
196
298
  * reference to all secondary blocks attached
197
299
  */
198
- this.secondaryCidrBlock = new Array;
300
+ secondaryCidrBlock = new Array;
301
+ /**
302
+ * IPv4 CIDR provisioned using IPAM pool
303
+ * Required to check for overlapping CIDRs after provisioning
304
+ * is complete under IPAM
305
+ */
306
+ ipv4IpamProvisionedCidrs;
307
+ /**
308
+ * Region for this VPC
309
+ */
310
+ region;
311
+ /**
312
+ * Identifier of the owner for this VPC
313
+ */
314
+ ownerAccountId;
199
315
  /**
200
316
  * For validation to define IPv6 subnets, set to true in case of
201
317
  * Amazon Provided IPv6 cidr range
@@ -203,123 +319,134 @@ let VpcV2 = class VpcV2 extends vpc_v2_base_1.VpcV2Base {
203
319
  *
204
320
  * @default false
205
321
  */
206
- this.useIpv6 = false;
207
- this.ipv4CidrBlock = '';
208
- try {
209
- jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_VpcV2Props(props);
210
- }
211
- catch (error) {
212
- if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
213
- Error.captureStackTrace(error, VpcV2);
322
+ useIpv6 = false;
323
+ /**
324
+ * VpcName to be used for tagging its components
325
+ * @attribute
326
+ */
327
+ vpcName;
328
+ ipv4CidrBlock = '';
329
+ constructor(scope, id, props = {}) {
330
+ super(scope, id, {
331
+ physicalName: props.vpcName ?? core_1.Lazy.string({
332
+ produce: () => core_1.Names.uniqueResourceName(this, { maxLength: 128, allowedSpecialCharacters: '_' }),
333
+ }),
334
+ });
335
+ try {
336
+ jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_VpcV2Props(props);
214
337
  }
215
- throw error;
216
- }
217
- // Enhanced CDK Analytics Telemetry
218
- (0, metadata_resource_1.addConstructMetadata)(this, props);
219
- this.vpcName = props.vpcName;
220
- this.ipAddresses = props.primaryAddressBlock ?? IpAddresses.ipv4('10.0.0.0/16');
221
- const vpcOptions = this.ipAddresses.allocateVpcCidr();
222
- this.dnsHostnamesEnabled = props.enableDnsHostnames == null ? true : props.enableDnsHostnames;
223
- this.dnsSupportEnabled = props.enableDnsSupport == null ? true : props.enableDnsSupport;
224
- const instanceTenancy = props.defaultInstanceTenancy || 'default';
225
- this.resource = new aws_ec2_1.CfnVPC(this, 'Resource', {
226
- cidrBlock: vpcOptions.ipv4CidrBlock, // for Ipv4 addresses CIDR block
227
- enableDnsHostnames: this.dnsHostnamesEnabled,
228
- enableDnsSupport: this.dnsSupportEnabled,
229
- ipv4IpamPoolId: vpcOptions.ipv4IpamPool?.ipamPoolId, // for Ipv4 ipam option
230
- ipv4NetmaskLength: vpcOptions.ipv4NetmaskLength, // for Ipv4 ipam option
231
- instanceTenancy: instanceTenancy,
232
- });
233
- this.node.defaultChild = this.resource;
234
- this.vpcCidrBlock = this.resource.attrCidrBlock;
235
- if (vpcOptions.ipv4CidrBlock) {
236
- this.ipv4CidrBlock = vpcOptions.ipv4CidrBlock;
237
- }
238
- this.ipv6CidrBlocks = this.resource.attrIpv6CidrBlocks;
239
- this.vpcId = core_1.FeatureFlags.of(this).isEnabled(aws_cdk_lib_1.cx_api.USE_RESOURCEID_FOR_VPCV2_MIGRATION) ?
240
- this.resource.ref : this.resource.attrVpcId;
241
- this.vpcArn = core_1.Arn.format({
242
- service: 'ec2',
243
- resource: 'vpc',
244
- resourceName: this.vpcId,
245
- }, this.stack);
246
- this.region = this.stack.region;
247
- this.ownerAccountId = this.stack.account;
248
- // Add tag to the VPC with the name provided in properties
249
- core_1.Tags.of(this).add(NAME_TAG, props.vpcName || this.node.path);
250
- if (props.secondaryAddressBlocks) {
251
- const secondaryAddressBlocks = props.secondaryAddressBlocks;
252
- for (const secondaryAddressBlock of secondaryAddressBlocks) {
253
- const secondaryVpcOptions = secondaryAddressBlock.allocateVpcCidr();
254
- if (!secondaryVpcOptions.cidrBlockName) {
255
- throw new Error('Cidr Block Name is required to create secondary IP address');
256
- }
257
- if (secondaryVpcOptions.amazonProvided || secondaryVpcOptions.ipv6IpamPool || secondaryVpcOptions.ipv6PoolId) {
258
- this.useIpv6 = true;
338
+ catch (error) {
339
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
340
+ Error.captureStackTrace(error, VpcV2);
259
341
  }
260
- // validate CIDR ranges per RFC 1918
261
- if (secondaryVpcOptions.ipv4CidrBlock) {
262
- const ret = validateIpv4address(secondaryVpcOptions.ipv4CidrBlock, this.resource.cidrBlock);
263
- if (ret === false) {
264
- throw new Error('CIDR block should be in the same RFC 1918 range in the VPC');
342
+ throw error;
343
+ }
344
+ // Enhanced CDK Analytics Telemetry
345
+ (0, metadata_resource_1.addConstructMetadata)(this, props);
346
+ this.vpcName = props.vpcName;
347
+ this.ipAddresses = props.primaryAddressBlock ?? IpAddresses.ipv4('10.0.0.0/16');
348
+ const vpcOptions = this.ipAddresses.allocateVpcCidr();
349
+ this.dnsHostnamesEnabled = props.enableDnsHostnames == null ? true : props.enableDnsHostnames;
350
+ this.dnsSupportEnabled = props.enableDnsSupport == null ? true : props.enableDnsSupport;
351
+ const instanceTenancy = props.defaultInstanceTenancy || 'default';
352
+ this.resource = new aws_ec2_1.CfnVPC(this, 'Resource', {
353
+ cidrBlock: vpcOptions.ipv4CidrBlock, // for Ipv4 addresses CIDR block
354
+ enableDnsHostnames: this.dnsHostnamesEnabled,
355
+ enableDnsSupport: this.dnsSupportEnabled,
356
+ ipv4IpamPoolId: vpcOptions.ipv4IpamPool?.ipamPoolId, // for Ipv4 ipam option
357
+ ipv4NetmaskLength: vpcOptions.ipv4NetmaskLength, // for Ipv4 ipam option
358
+ instanceTenancy: instanceTenancy,
359
+ });
360
+ this.node.defaultChild = this.resource;
361
+ this.vpcCidrBlock = this.resource.attrCidrBlock;
362
+ if (vpcOptions.ipv4CidrBlock) {
363
+ this.ipv4CidrBlock = vpcOptions.ipv4CidrBlock;
364
+ }
365
+ this.ipv6CidrBlocks = this.resource.attrIpv6CidrBlocks;
366
+ this.vpcId = core_1.FeatureFlags.of(this).isEnabled(aws_cdk_lib_1.cx_api.USE_RESOURCEID_FOR_VPCV2_MIGRATION) ?
367
+ this.resource.ref : this.resource.attrVpcId;
368
+ this.vpcArn = core_1.Arn.format({
369
+ service: 'ec2',
370
+ resource: 'vpc',
371
+ resourceName: this.vpcId,
372
+ }, this.stack);
373
+ this.region = this.stack.region;
374
+ this.ownerAccountId = this.stack.account;
375
+ // Add tag to the VPC with the name provided in properties
376
+ core_1.Tags.of(this).add(NAME_TAG, props.vpcName || this.node.path);
377
+ if (props.secondaryAddressBlocks) {
378
+ const secondaryAddressBlocks = props.secondaryAddressBlocks;
379
+ for (const secondaryAddressBlock of secondaryAddressBlocks) {
380
+ const secondaryVpcOptions = secondaryAddressBlock.allocateVpcCidr();
381
+ if (!secondaryVpcOptions.cidrBlockName) {
382
+ throw new Error('Cidr Block Name is required to create secondary IP address');
265
383
  }
266
- }
267
- if (secondaryVpcOptions.ipv4IpamProvisionedCidrs) {
268
- this.ipv4IpamProvisionedCidrs?.push(...secondaryVpcOptions.ipv4IpamProvisionedCidrs);
269
- }
270
- const vpcCidrBlock = new VPCCidrBlock(this, secondaryVpcOptions.cidrBlockName, {
271
- vpcId: this.vpcId,
272
- cidrBlock: secondaryVpcOptions.ipv4CidrBlock,
273
- ipv4IpamPoolId: secondaryVpcOptions.ipv4IpamPool?.ipamPoolId,
274
- ipv4NetmaskLength: secondaryVpcOptions.ipv4NetmaskLength,
275
- ipv6NetmaskLength: secondaryVpcOptions.ipv6NetmaskLength,
276
- ipv6IpamPoolId: secondaryVpcOptions.ipv6IpamPool?.ipamPoolId,
277
- amazonProvidedIpv6CidrBlock: secondaryVpcOptions.amazonProvided,
278
- // BYOIP IPv6 Address
279
- ipv6CidrBlock: secondaryVpcOptions?.ipv6CidrBlock,
280
- // BYOIP Pool for IPv6 address
281
- ipv6Pool: secondaryVpcOptions?.ipv6PoolId,
282
- });
283
- if (secondaryVpcOptions.dependencies) {
284
- for (const dep of secondaryVpcOptions.dependencies) {
285
- vpcCidrBlock.node.addDependency(dep);
384
+ if (secondaryVpcOptions.amazonProvided || secondaryVpcOptions.ipv6IpamPool || secondaryVpcOptions.ipv6PoolId) {
385
+ this.useIpv6 = true;
386
+ }
387
+ // validate CIDR ranges per RFC 1918
388
+ if (secondaryVpcOptions.ipv4CidrBlock) {
389
+ const ret = validateIpv4address(secondaryVpcOptions.ipv4CidrBlock, this.resource.cidrBlock);
390
+ if (ret === false) {
391
+ throw new Error('CIDR block should be in the same RFC 1918 range in the VPC');
392
+ }
393
+ }
394
+ if (secondaryVpcOptions.ipv4IpamProvisionedCidrs) {
395
+ this.ipv4IpamProvisionedCidrs?.push(...secondaryVpcOptions.ipv4IpamProvisionedCidrs);
396
+ }
397
+ const vpcCidrBlock = new VPCCidrBlock(this, secondaryVpcOptions.cidrBlockName, {
398
+ vpcId: this.vpcId,
399
+ cidrBlock: secondaryVpcOptions.ipv4CidrBlock,
400
+ ipv4IpamPoolId: secondaryVpcOptions.ipv4IpamPool?.ipamPoolId,
401
+ ipv4NetmaskLength: secondaryVpcOptions.ipv4NetmaskLength,
402
+ ipv6NetmaskLength: secondaryVpcOptions.ipv6NetmaskLength,
403
+ ipv6IpamPoolId: secondaryVpcOptions.ipv6IpamPool?.ipamPoolId,
404
+ amazonProvidedIpv6CidrBlock: secondaryVpcOptions.amazonProvided,
405
+ // BYOIP IPv6 Address
406
+ ipv6CidrBlock: secondaryVpcOptions?.ipv6CidrBlock,
407
+ // BYOIP Pool for IPv6 address
408
+ ipv6Pool: secondaryVpcOptions?.ipv6PoolId,
409
+ });
410
+ if (secondaryVpcOptions.dependencies) {
411
+ for (const dep of secondaryVpcOptions.dependencies) {
412
+ vpcCidrBlock.node.addDependency(dep);
413
+ }
286
414
  }
415
+ // Create secondary blocks for Ipv4 and Ipv6
416
+ this.secondaryCidrBlock?.push(vpcCidrBlock);
287
417
  }
288
- // Create secondary blocks for Ipv4 and Ipv6
289
- this.secondaryCidrBlock?.push(vpcCidrBlock);
290
418
  }
419
+ /**
420
+ * Empty array for isolated subnets
421
+ */
422
+ this.isolatedSubnets = new Array;
423
+ /**
424
+ * Empty array for public subnets
425
+ */
426
+ this.publicSubnets = new Array;
427
+ /**
428
+ * Empty array for private subnets
429
+ */
430
+ this.privateSubnets = new Array;
431
+ /**
432
+ * Dependable that can be depended upon to force internet connectivity established on the VPC
433
+ * Add igw to this if its a public subnet
434
+ */
435
+ this.internetConnectivityEstablished = this._internetConnectivityEstablished;
291
436
  }
292
- /**
293
- * Empty array for isolated subnets
294
- */
295
- this.isolatedSubnets = new Array;
296
- /**
297
- * Empty array for public subnets
298
- */
299
- this.publicSubnets = new Array;
300
- /**
301
- * Empty array for private subnets
302
- */
303
- this.privateSubnets = new Array;
304
- /**
305
- * Dependable that can be depended upon to force internet connectivity established on the VPC
306
- * Add igw to this if its a public subnet
307
- */
308
- this.internetConnectivityEstablished = this._internetConnectivityEstablished;
309
- }
310
- };
437
+ static {
438
+ __runInitializers(_classThis, _classExtraInitializers);
439
+ }
440
+ };
441
+ return VpcV2 = _classThis;
442
+ })();
311
443
  exports.VpcV2 = VpcV2;
312
- _b = JSII_RTTI_SYMBOL_1;
313
- VpcV2[_b] = { fqn: "@aws-cdk/aws-ec2-alpha.VpcV2", version: "2.218.0-alpha.0" };
314
- /** Uniquely identifies this class. */
315
- VpcV2.PROPERTY_INJECTION_ID = '@aws-cdk.aws-ec2-alpha.VpcV2';
316
- exports.VpcV2 = VpcV2 = __decorate([
317
- prop_injectable_1.propertyInjectable
318
- ], VpcV2);
319
444
  /**
320
445
  * Supports assigning IPv4 address to VPC
321
446
  */
322
447
  class ipv4CidrAllocation {
448
+ cidrBlock;
449
+ props;
323
450
  constructor(cidrBlock, props) {
324
451
  this.cidrBlock = cidrBlock;
325
452
  this.props = props;
@@ -338,6 +465,7 @@ class ipv4CidrAllocation {
338
465
  * Supports Amazon Provided Ipv6 ranges
339
466
  */
340
467
  class AmazonProvided {
468
+ props;
341
469
  /**
342
470
  * Represents an Amazon-provided IPv6 CIDR range for a VPC.
343
471
  *
@@ -360,6 +488,7 @@ class AmazonProvided {
360
488
  * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipam.html
361
489
  */
362
490
  class IpamIpv6 {
491
+ props;
363
492
  constructor(props) {
364
493
  this.props = props;
365
494
  }
@@ -377,6 +506,7 @@ class IpamIpv6 {
377
506
  * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipam.html
378
507
  */
379
508
  class IpamIpv4 {
509
+ props;
380
510
  constructor(props) {
381
511
  this.props = props;
382
512
  }
@@ -393,6 +523,7 @@ class IpamIpv4 {
393
523
  * Supports assigning IPv6 address to VPC in an address pool
394
524
  */
395
525
  class Ipv6Pool {
526
+ props;
396
527
  constructor(props) {
397
528
  this.props = props;
398
529
  }
@@ -408,45 +539,64 @@ class Ipv6Pool {
408
539
  * Internal L2 to define a new VPC CIDR Block
409
540
  * @internal
410
541
  */
411
- let VPCCidrBlock = class VPCCidrBlock extends core_1.Resource {
412
- /**
413
- * Import an existing VPC CIDR Block
414
- */
415
- static fromVPCCidrBlockattributes(scope, id, props) {
416
- class Import extends core_1.Resource {
417
- constructor() {
418
- super(...arguments);
419
- this.cidrBlock = props.cidrBlock;
420
- this.amazonProvidedIpv6CidrBlock = props.amazonProvidedIpv6CidrBlock;
421
- this.ipv6IpamPoolId = props.ipv6IpamPoolId;
422
- this.ipv4IpamPoolId = props.ipv4IpamPoolId;
542
+ let VPCCidrBlock = (() => {
543
+ let _classDecorators = [prop_injectable_1.propertyInjectable];
544
+ let _classDescriptor;
545
+ let _classExtraInitializers = [];
546
+ let _classThis;
547
+ let _classSuper = core_1.Resource;
548
+ var VPCCidrBlock = class extends _classSuper {
549
+ static { _classThis = this; }
550
+ static {
551
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
552
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
553
+ VPCCidrBlock = _classThis = _classDescriptor.value;
554
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
555
+ }
556
+ /** Uniquely identifies this class. */
557
+ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-ec2-alpha.VPCCidrBlock';
558
+ /**
559
+ * Import an existing VPC CIDR Block
560
+ */
561
+ static fromVPCCidrBlockattributes(scope, id, props) {
562
+ class Import extends core_1.Resource {
563
+ cidrBlock = props.cidrBlock;
564
+ amazonProvidedIpv6CidrBlock = props.amazonProvidedIpv6CidrBlock;
565
+ ipv6IpamPoolId = props.ipv6IpamPoolId;
566
+ ipv4IpamPoolId = props.ipv4IpamPoolId;
423
567
  // BYOIP Pool Attributes
424
- this.ipv6Pool = props.ipv6Pool;
425
- this.ipv6CidrBlock = props.ipv6CidrBlock;
568
+ ipv6Pool = props.ipv6Pool;
569
+ ipv6CidrBlock = props.ipv6CidrBlock;
426
570
  }
571
+ return new Import(scope, id);
427
572
  }
428
- return new Import(scope, id);
429
- }
430
- constructor(scope, id, props) {
431
- super(scope, id);
432
- // Enhanced CDK Analytics Telemetry
433
- (0, metadata_resource_1.addConstructMetadata)(this, props);
434
- this.resource = new aws_ec2_1.CfnVPCCidrBlock(this, id, props);
435
- this.node.defaultChild = this.resource;
436
- this.cidrBlock = props.cidrBlock;
437
- this.ipv6IpamPoolId = props.ipv6IpamPoolId;
438
- this.ipv4IpamPoolId = props.ipv4IpamPoolId;
439
- this.amazonProvidedIpv6CidrBlock = props.amazonProvidedIpv6CidrBlock;
440
- // BYOIP Pool and CIDR Block
441
- this.ipv6CidrBlock = props.ipv6CidrBlock;
442
- this.ipv6Pool = props.ipv6Pool;
443
- }
444
- };
445
- /** Uniquely identifies this class. */
446
- VPCCidrBlock.PROPERTY_INJECTION_ID = '@aws-cdk.aws-ec2-alpha.VPCCidrBlock';
447
- VPCCidrBlock = __decorate([
448
- prop_injectable_1.propertyInjectable
449
- ], VPCCidrBlock);
573
+ resource;
574
+ cidrBlock;
575
+ amazonProvidedIpv6CidrBlock;
576
+ ipv6IpamPoolId;
577
+ ipv4IpamPoolId;
578
+ ipv6CidrBlock;
579
+ ipv6Pool;
580
+ constructor(scope, id, props) {
581
+ super(scope, id);
582
+ // Enhanced CDK Analytics Telemetry
583
+ (0, metadata_resource_1.addConstructMetadata)(this, props);
584
+ this.resource = new aws_ec2_1.CfnVPCCidrBlock(this, id, props);
585
+ this.node.defaultChild = this.resource;
586
+ this.cidrBlock = props.cidrBlock;
587
+ this.ipv6IpamPoolId = props.ipv6IpamPoolId;
588
+ this.ipv4IpamPoolId = props.ipv4IpamPoolId;
589
+ this.amazonProvidedIpv6CidrBlock = props.amazonProvidedIpv6CidrBlock;
590
+ // BYOIP Pool and CIDR Block
591
+ this.ipv6CidrBlock = props.ipv6CidrBlock;
592
+ this.ipv6Pool = props.ipv6Pool;
593
+ }
594
+ static {
595
+ __runInitializers(_classThis, _classExtraInitializers);
596
+ }
597
+ };
598
+ return VPCCidrBlock = _classThis;
599
+ })();
450
600
  /**
451
601
  * Validates whether a secondary IPv4 address is within the same private IP address range as the primary IPv4 address.
452
602
  *
@@ -477,4 +627,4 @@ function validateIpv4address(cidr1, cidr2) {
477
627
  (ip1.octet1 === 192 && ip1.octet2 === 168 && ip2.octet1 === 192 && ip2.octet2 === 168) ||
478
628
  (ip1.octet1 === 172 && ip1.octet2 === 16 && ip2.octet1 === 172 && ip2.octet2 === 16); // CIDR ranges belong to same private IP address ranges
479
629
  }
480
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnBjLXYyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidnBjLXYyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLGlEQUEyRztBQUMzRywyQ0FBK0Y7QUFDL0YsMkNBQXFFO0FBRXJFLCtDQUFrRDtBQUNsRCwyQ0FBc0U7QUFDdEUsNkNBQWtEO0FBQ2xELDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFrQzFFOztHQUVHO0FBQ0gsTUFBYSxXQUFXO0lBQ3RCOztPQUVHO0lBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFnQixFQUFFLEtBQTZCOzs7Ozs7Ozs7O1FBQ2hFLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDaEQ7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsZUFBNEI7Ozs7Ozs7Ozs7UUFDakQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztLQUN0QztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FBQyxlQUE0Qjs7Ozs7Ozs7OztRQUNqRCxPQUFPLElBQUksUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0tBQ3RDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsa0JBQWtCLENBQUMsS0FBNEI7Ozs7Ozs7Ozs7UUFDM0QsT0FBTyxJQUFJLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUNsQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFvQzs7Ozs7Ozs7OztRQUM5RCxPQUFPLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzVCOztBQWxDSCxrQ0FtQ0M7OztBQXFHRDs7R0FFRztBQUNILE1BQU0sUUFBUSxHQUFXLE1BQU0sQ0FBQztBQXFIaEM7Ozs7OztHQU1HO0FBRUksSUFBTSxLQUFLLEdBQVgsTUFBTSxLQUFNLFNBQVEsdUJBQVM7SUFJbEM7O09BRUc7SUFDSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBc0I7Ozs7Ozs7Ozs7UUFDcEY7OztXQUdHO1FBQ0gsTUFBTSxhQUFjLFNBQVEsdUJBQVM7WUEyQm5DLFlBQVksU0FBb0IsRUFBRSxXQUFtQixFQUFFLEtBQXNCO2dCQUMzRSxLQUFLLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQXpCaEIsa0JBQWEsR0FBZ0IsRUFBRSxDQUFDO2dCQUNoQyxtQkFBYyxHQUFnQixFQUFFLENBQUM7Z0JBQ2pDLG9CQUFlLEdBQWdCLEVBQUUsQ0FBQztnQkFDbEMsb0NBQStCLEdBQWdCLElBQUksNEJBQWUsRUFBRSxDQUFDO2dCQWtCckYsd0VBQXdFO2dCQUN4RCw2QkFBd0IsR0FBYSxFQUFFLENBQUM7Z0JBSXRELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUs7b0JBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07b0JBQy9DLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87b0JBQ2hFLElBQUksQ0FBQyxVQUFVLEdBQUcseUJBQVcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTO29CQUNuRSxJQUFJLENBQUMsTUFBTSxHQUFHLFVBQUcsQ0FBQyxNQUFNLENBQUM7d0JBQ3ZCLE9BQU8sRUFBRSxLQUFLO3dCQUNkLFFBQVEsRUFBRSxLQUFLO3dCQUNmLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSzt3QkFDeEIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO3dCQUNuQixPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWM7d0JBQzVCLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVTtxQkFDM0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRWYsbUZBQW1GO2dCQUNuRixnRkFBZ0Y7Z0JBQ2hGLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hELDhEQUE4RDtnQkFDOUQsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO2dCQUN2QywyQ0FBMkM7Z0JBQzNDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztnQkFDeEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO2dCQUV4QyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDbEIsS0FBSyxNQUFNLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ25DLElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxvQkFBVSxDQUFDLG1CQUFtQixJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssb0JBQVUsQ0FBQyxnQkFBZ0I7NEJBQzNHLE1BQU0sQ0FBQyxVQUFvQixLQUFLLG9CQUFvQixFQUFFLENBQUM7NEJBQ3ZELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLG9CQUFRLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxVQUFVLElBQUcsdUJBQXVCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQzt3QkFDeEgsQ0FBQzs2QkFBTSxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssb0JBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQzs0QkFDbkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsb0JBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLFVBQVUsSUFBRyxzQkFBc0IsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO3dCQUN0SCxDQUFDOzZCQUFNLElBQUksTUFBTSxDQUFDLFVBQW9CLEtBQUsscUJBQXFCLElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxvQkFBVSxDQUFDLGdCQUFnQixFQUFFLENBQUM7NEJBQ3RILElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLG9CQUFRLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxVQUFVLElBQUcsd0JBQXdCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQzt3QkFDMUgsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxhQUFhLElBQUksNEJBQTRCLEVBQUUsRUFBRSxHQUFHLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDak0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztvQkFDOUIsS0FBSyxNQUFNLFNBQVMsSUFBSSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzt3QkFDbEQsSUFBSSxTQUFTLENBQUMsd0JBQXdCLEVBQUUsQ0FBQzs0QkFDdkMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO3dCQUM1RSxDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7U0FDRjtRQUNELE9BQU8sSUFBSSxhQUFhLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztLQUM1QztJQXNHRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLFFBQW9CLEVBQUU7UUFDOUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixZQUFZLEVBQUUsS0FBSyxDQUFDLE9BQU8sSUFBSSxXQUFJLENBQUMsTUFBTSxDQUFDO2dCQUN6QyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsWUFBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsd0JBQXdCLEVBQUUsR0FBRyxFQUFFLENBQUM7YUFDakcsQ0FBQztTQUNILENBQUMsQ0FBQztRQTVDTDs7V0FFRztRQUNhLHVCQUFrQixHQUFxQixJQUFJLEtBQW9CLENBQUM7UUFtQmhGOzs7Ozs7V0FNRztRQUNhLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFRekIsa0JBQWEsR0FBVyxFQUFFLENBQUM7Ozs7OzsrQ0EzTGhDLEtBQUs7Ozs7UUFtTWQsbUNBQW1DO1FBQ25DLElBQUEsd0NBQW9CLEVBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUM3QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFdEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDO1FBQzlGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztRQUN4RixNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsc0JBQXNCLElBQUksU0FBUyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxnQkFBTSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDM0MsU0FBUyxFQUFFLFVBQVUsQ0FBQyxhQUFhLEVBQUUsZ0NBQWdDO1lBQ3JFLGtCQUFrQixFQUFFLElBQUksQ0FBQyxtQkFBbUI7WUFDNUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtZQUN4QyxjQUFjLEVBQUUsVUFBVSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsdUJBQXVCO1lBQzVFLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSx1QkFBdUI7WUFDeEUsZUFBZSxFQUFFLGVBQWU7U0FDakMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO1FBQ2hELElBQUksVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDO1FBQ3ZELElBQUksQ0FBQyxLQUFLLEdBQUcsbUJBQVksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLG9CQUFNLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZGLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUM5QyxJQUFJLENBQUMsTUFBTSxHQUFHLFVBQUcsQ0FBQyxNQUFNLENBQUM7WUFDdkIsT0FBTyxFQUFFLEtBQUs7WUFDZCxRQUFRLEVBQUUsS0FBSztZQUNmLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSztTQUN6QixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDaEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUN6QywwREFBMEQ7UUFDMUQsV0FBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3RCxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sc0JBQXNCLEdBQW1CLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQztZQUU1RSxLQUFLLE1BQU0scUJBQXFCLElBQUksc0JBQXNCLEVBQUUsQ0FBQztnQkFDM0QsTUFBTSxtQkFBbUIsR0FBbUIscUJBQXFCLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3BGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO2dCQUNoRixDQUFDO2dCQUVELElBQUksbUJBQW1CLENBQUMsY0FBYyxJQUFJLG1CQUFtQixDQUFDLFlBQVksSUFBSSxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDN0csSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLENBQUM7Z0JBQ0Qsb0NBQW9DO2dCQUNwQyxJQUFJLG1CQUFtQixDQUFDLGFBQWMsRUFBRSxDQUFDO29CQUN2QyxNQUFNLEdBQUcsR0FBRyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDNUYsSUFBSSxHQUFHLEtBQUssS0FBSyxFQUFFLENBQUM7d0JBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsNERBQTRELENBQUMsQ0FBQztvQkFDaEYsQ0FBQztnQkFDSCxDQUFDO2dCQUNELElBQUksbUJBQW1CLENBQUMsd0JBQXlCLEVBQUUsQ0FBQztvQkFDbEQsSUFBSSxDQUFDLHdCQUF3QixFQUFFLElBQUksQ0FBQyxHQUFHLG1CQUFtQixDQUFDLHdCQUF3QixDQUFDLENBQUM7Z0JBQ3ZGLENBQUM7Z0JBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLG1CQUFtQixDQUFDLGFBQWEsRUFBRTtvQkFDN0UsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO29CQUNqQixTQUFTLEVBQUUsbUJBQW1CLENBQUMsYUFBYTtvQkFDNUMsY0FBYyxFQUFFLG1CQUFtQixDQUFDLFlBQVksRUFBRSxVQUFVO29CQUM1RCxpQkFBaUIsRUFBRSxtQkFBbUIsQ0FBQyxpQkFBaUI7b0JBQ3hELGlCQUFpQixFQUFFLG1CQUFtQixDQUFDLGlCQUFpQjtvQkFDeEQsY0FBYyxFQUFFLG1CQUFtQixDQUFDLFlBQVksRUFBRSxVQUFVO29CQUM1RCwyQkFBMkIsRUFBRSxtQkFBbUIsQ0FBQyxjQUFjO29CQUMvRCxxQkFBcUI7b0JBQ3JCLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxhQUFhO29CQUNqRCw4QkFBOEI7b0JBQzlCLFFBQVEsRUFBRSxtQkFBbUIsRUFBRSxVQUFVO2lCQUMxQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDckMsS0FBSyxNQUFNLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQzt3QkFDbkQsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3ZDLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCw0Q0FBNEM7Z0JBQzVDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDOUMsQ0FBQztRQUNILENBQUM7UUFFRDs7V0FFRztRQUNILElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxLQUFjLENBQUM7UUFFMUM7O1dBRUc7UUFDSCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksS0FBYyxDQUFDO1FBRXhDOztXQUVHO1FBQ0gsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLEtBQWMsQ0FBQztRQUV6Qzs7O1dBR0c7UUFDSCxJQUFJLENBQUMsK0JBQStCLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxDQUFDO0tBQzlFOztBQXZTVSxzQkFBSzs7O0FBQ2hCLHNDQUFzQztBQUNmLDJCQUFxQixHQUFXLDhCQUE4QixBQUF6QyxDQUEwQztnQkFGM0UsS0FBSztJQURqQixvQ0FBa0I7R0FDTixLQUFLLENBd1NqQjtBQUNEOztHQUVHO0FBQ0gsTUFBTSxrQkFBa0I7SUFDdEIsWUFBNkIsU0FBaUIsRUFBbUIsS0FBZ0M7UUFBcEUsY0FBUyxHQUFULFNBQVMsQ0FBUTtRQUFtQixVQUFLLEdBQUwsS0FBSyxDQUEyQjtLQUNoRztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNiLE9BQU87WUFDTCxhQUFhLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDN0IsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsYUFBYTtTQUN6QyxDQUFDO0tBQ0g7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxjQUFjO0lBQ2xCOzs7Ozs7T0FNRztJQUVILFlBQTZCLEtBQStCO1FBQS9CLFVBQUssR0FBTCxLQUFLLENBQTBCO0tBQUk7SUFFaEUsZUFBZTtRQUNiLE9BQU87WUFDTCxjQUFjLEVBQUUsSUFBSTtZQUNwQixhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhO1NBQ3hDLENBQUM7S0FDSDtDQUNGO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxRQUFRO0lBQ1osWUFBNkIsS0FBa0I7UUFBbEIsVUFBSyxHQUFMLEtBQUssQ0FBYTtLQUM5QztJQUVELGVBQWU7UUFDYixPQUFPO1lBQ0wsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhO1lBQzNDLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVE7WUFDakMsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFnQixDQUFDO1lBQ3ZFLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWE7U0FDeEMsQ0FBQztLQUNIO0NBQ0Y7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFFBQVE7SUFDWixZQUE2QixLQUFrQjtRQUFsQixVQUFLLEdBQUwsS0FBSyxDQUFhO0tBQzlDO0lBQ0QsZUFBZTtRQUNiLE9BQU87WUFDTCxpQkFBaUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWE7WUFDM0MsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUTtZQUNqQyxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxhQUFhO1lBQ3hDLHdCQUF3QixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLGFBQWE7U0FDN0QsQ0FBQztLQUNIO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sUUFBUTtJQUNaLFlBQTZCLEtBQW9DO1FBQXBDLFVBQUssR0FBTCxLQUFLLENBQStCO0tBQ2hFO0lBQ0QsZUFBZTtRQUNiLE9BQU87WUFDTCxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhO1lBQ3ZDLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVU7WUFDakMsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsYUFBYTtTQUN6QyxDQUFDO0tBQ0g7Q0FDRjtBQStIRDs7O0dBR0c7QUFFSCxJQUFNLFlBQVksR0FBbEIsTUFBTSxZQUFhLFNBQVEsZUFBUTtJQUlqQzs7T0FFRztJQUNJLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE2QjtRQUNsRyxNQUFNLE1BQU8sU0FBUSxlQUFRO1lBQTdCOztnQkFDa0IsY0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7Z0JBQzVCLGdDQUEyQixHQUFjLEtBQUssQ0FBQywyQkFBMkIsQ0FBQztnQkFDM0UsbUJBQWMsR0FBYSxLQUFLLENBQUMsY0FBYyxDQUFDO2dCQUNoRCxtQkFBYyxHQUFhLEtBQUssQ0FBQyxjQUFjLENBQUM7Z0JBQ2hFLHdCQUF3QjtnQkFDUixhQUFRLEdBQVksS0FBSyxDQUFDLFFBQVEsQ0FBQztnQkFDbkMsa0JBQWEsR0FBWSxLQUFLLENBQUMsYUFBYSxDQUFDO1lBQy9ELENBQUM7U0FBQTtRQUNELE9BQU8sSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQzlCO0lBZ0JELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBd0I7UUFDaEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQixtQ0FBbUM7UUFDbkMsSUFBQSx3Q0FBb0IsRUFBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHlCQUFlLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7UUFDM0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQzNDLElBQUksQ0FBQywyQkFBMkIsR0FBRyxLQUFLLENBQUMsMkJBQTJCLENBQUM7UUFDckUsNEJBQTRCO1FBQzVCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQztRQUN6QyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7S0FDaEM7O0FBOUNELHNDQUFzQztBQUNmLGtDQUFxQixHQUFXLHFDQUFxQyxBQUFoRCxDQUFpRDtBQUZ6RixZQUFZO0lBRGpCLG9DQUFrQjtHQUNiLFlBQVksQ0FnRGpCO0FBUUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLEtBQWMsRUFBRSxLQUFjO0lBQ3pELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNyQixPQUFPLEtBQUssQ0FBQyxDQUFDLGtEQUFrRDtJQUNsRSxDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQWEsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDakYsTUFBTSxXQUFXLEdBQWEsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFakYsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pELE9BQU8sS0FBSyxDQUFDLENBQUMsNkJBQTZCO0lBQzdDLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBb0I7UUFDM0IsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7S0FDdkIsQ0FBQztJQUVGLE1BQU0sR0FBRyxHQUFvQjtRQUMzQixNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUN0QixNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztLQUN2QixDQUFDO0lBRUYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDO1FBQzdDLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUM7UUFDdEYsQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsdURBQXVEO0FBQ2pKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5WUEMsIENmblZQQ0NpZHJCbG9jaywgRGVmYXVsdEluc3RhbmNlVGVuYW5jeSwgSVN1Ym5ldCwgU3VibmV0VHlwZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0IHsgQXJuLCBDZm5SZXNvdXJjZSwgRmVhdHVyZUZsYWdzLCBMYXp5LCBOYW1lcywgUmVzb3VyY2UsIFRhZ3MgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IENvbnN0cnVjdCwgRGVwZW5kZW5jeUdyb3VwLCBJRGVwZW5kYWJsZSB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgSXBhbU9wdGlvbnMsIElJcGFtUG9vbCB9IGZyb20gJy4vaXBhbSc7XG5pbXBvcnQgeyBJVnBjVjIsIFZwY1YyQmFzZSB9IGZyb20gJy4vdnBjLXYyLWJhc2UnO1xuaW1wb3J0IHsgSVN1Ym5ldFYyLCBTdWJuZXRWMiwgU3VibmV0VjJBdHRyaWJ1dGVzIH0gZnJvbSAnLi9zdWJuZXQtdjInO1xuaW1wb3J0IHsgY3hfYXBpLCByZWdpb25faW5mbyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcblxuLyoqXG4gKiBBZGRpdGlvbmFsIHByb3BzIG5lZWRlZCBmb3Igc2Vjb25kYXJ5IEFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWNvbmRhcnlBZGRyZXNzUHJvcHMge1xuICAvKipcbiAgICogUmVxdWlyZWQgdG8gc2V0IFNlY29uZGFyeSBjaWRyIGJsb2NrIHJlc291cmNlIG5hbWVcbiAgICogaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdW5pcXVlIGxvZ2ljYWwgaWQgZm9yIHRoZSByZXNvdXJjZS5cbiAgICovXG4gIHJlYWRvbmx5IGNpZHJCbG9ja05hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBZGRpdGlvbmFsIHByb3BzIG5lZWRlZCBmb3IgQllPSVAgSVB2NiBhZGRyZXNzIHByb3BzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXB2NlBvb2xTZWNvbmRhcnlBZGRyZXNzUHJvcHMgZXh0ZW5kcyBTZWNvbmRhcnlBZGRyZXNzUHJvcHMge1xuICAvKipcbiAgICogSUQgb2YgdGhlIElQdjYgYWRkcmVzcyBwb29sIGZyb20gd2hpY2ggdG8gYWxsb2NhdGUgdGhlIElQdjYgQ0lEUiBibG9jay5cbiAgICogTm90ZTogQllPSVAgUG9vbCBJRCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgSVBBTSBQb29sIElELlxuICAgKiBUbyBvbmJvYXJkIHlvdXIgSVB2NiBhZGRyZXNzIHJhbmdlIHRvIHlvdXIgQVdTIGFjY291bnQgcGxlYXNlIHJlZmVyIHRvIHRoZSBiZWxvdyBkb2N1bWVudGF0aW9uXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2J5b2lwLW9uYm9hcmQuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgaXB2NlBvb2xJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHZhbGlkIElQdjYgQ0lEUiBibG9jayBmcm9tIHRoZSBJUHY2IGFkZHJlc3MgcG9vbCBvbmJvYXJkZWQgdG8gQVdTIHVzaW5nIEJZT0lQLlxuICAgKiBUaGUgbW9zdCBzcGVjaWZpYyBJUHY2IGFkZHJlc3MgcmFuZ2UgdGhhdCB5b3UgY2FuIGJyaW5nIGlzIC80OCBmb3IgQ0lEUnMgdGhhdCBhcmUgcHVibGljbHkgYWR2ZXJ0aXNhYmxlXG4gICAqIGFuZCAvNTYgZm9yIENJRFJzIHRoYXQgYXJlIG5vdCBwdWJsaWNseSBhZHZlcnRpc2FibGUuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0VDMi9sYXRlc3QvVXNlckd1aWRlL2VjMi1ieW9pcC5odG1sI2J5b2lwLWRlZmluaXRpb25zXG4gICAqL1xuICByZWFkb25seSBpcHY2Q2lkckJsb2NrOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSXBBZGRyZXNzIG9wdGlvbnMgdG8gZGVmaW5lIFZQQyBWMlxuICovXG5leHBvcnQgY2xhc3MgSXBBZGRyZXNzZXMge1xuICAvKipcbiAgICogQW4gSVB2NCBDSURSIFJhbmdlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlwdjQoaXB2NENpZHI6IHN0cmluZywgcHJvcHM/OiBTZWNvbmRhcnlBZGRyZXNzUHJvcHMpOiBJSXBBZGRyZXNzZXMge1xuICAgIHJldHVybiBuZXcgaXB2NENpZHJBbGxvY2F0aW9uKGlwdjRDaWRyLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogQW4gSXB2NCBJcGFtIFBvb2xcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXB2NElwYW0oaXB2NElwYW1PcHRpb25zOiBJcGFtT3B0aW9ucyk6IElJcEFkZHJlc3NlcyB7XG4gICAgcmV0dXJuIG5ldyBJcGFtSXB2NChpcHY0SXBhbU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIElwdjYgSXBhbSBQb29sXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlwdjZJcGFtKGlwdjZJcGFtT3B0aW9uczogSXBhbU9wdGlvbnMpOiBJSXBBZGRyZXNzZXMge1xuICAgIHJldHVybiBuZXcgSXBhbUlwdjYoaXB2NklwYW1PcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbWF6b24gUHJvdmlkZWQgSXB2NiByYW5nZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhbWF6b25Qcm92aWRlZElwdjYocHJvcHM6IFNlY29uZGFyeUFkZHJlc3NQcm9wcykgOiBJSXBBZGRyZXNzZXMge1xuICAgIHJldHVybiBuZXcgQW1hem9uUHJvdmlkZWQocHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgQllPSVAgSVB2NiBhZGRyZXNzIHBvb2xcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXB2NkJ5b2lwUG9vbChwcm9wczogSXB2NlBvb2xTZWNvbmRhcnlBZGRyZXNzUHJvcHMpOiBJSXBBZGRyZXNzZXMge1xuICAgIHJldHVybiBuZXcgSXB2NlBvb2wocHJvcHMpO1xuICB9XG59XG5cbi8qKlxuICogQ29uc29saWRhdGVkIHJldHVybiBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gVlBDIGNvbnN0cnVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZwY0NpZHJPcHRpb25zIHtcblxuICAvKipcbiAgICogSVB2NCBDSURSIEJsb2NrXG4gICAqXG4gICAqIEBkZWZhdWx0ICcxMC4wLjAuMC8xNidcbiAgICovXG4gIHJlYWRvbmx5IGlwdjRDaWRyQmxvY2s/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENJRFIgTWFzayBmb3IgVnBjXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gT25seSByZXF1aXJlZCB3aGVuIHVzaW5nIElQQU0gSXB2NFxuICAgKi9cbiAgcmVhZG9ubHkgaXB2NE5ldG1hc2tMZW5ndGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIElwdjQgSVBBTSBQb29sXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gT25seSByZXF1aXJlZCB3aGVuIHVzaW5nIElQQU0gSXB2NFxuICAgKi9cbiAgcmVhZG9ubHkgaXB2NElwYW1Qb29sPzogSUlwYW1Qb29sO1xuXG4gIC8qKlxuICAgKiBDSURSIE1hc2sgZm9yIFZwY1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIE9ubHkgcmVxdWlyZWQgd2hlbiB1c2luZyBBV1MgSXBhbVxuICAgKi9cbiAgcmVhZG9ubHkgaXB2Nk5ldG1hc2tMZW5ndGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIElwdjYgSVBBTSBwb29sIGlkIGZvciBWUEMgcmFuZ2UsIGNhbiBvbmx5IGJlIGRlZmluZWRcbiAgICogdW5kZXIgcHVibGljIHNjb3BlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcG9vbCBpZFxuICAgKi9cbiAgcmVhZG9ubHkgaXB2NklwYW1Qb29sPzogSUlwYW1Qb29sO1xuXG4gIC8qKlxuICAgKiBVc2UgYW1hem9uIHByb3ZpZGVkIElQIHJhbmdlXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBhbWF6b25Qcm92aWRlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERlcGVuZGVuY3kgdG8gYXNzb2NpYXRlIElwdjYgQ0lEUiBibG9ja1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGRlcGVuZGVuY3lcbiAgICovXG4gIHJlYWRvbmx5IGRlcGVuZGVuY2llcz86IENmblJlc291cmNlW107XG5cbiAgLyoqXG4gICAqIFJlcXVpcmVkIHRvIHNldCBTZWNvbmRhcnkgY2lkciBibG9jayByZXNvdXJjZSBuYW1lXG4gICAqIGluIG9yZGVyIHRvIGdlbmVyYXRlIHVuaXF1ZSBsb2dpY2FsIGlkIGZvciB0aGUgcmVzb3VyY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gbmFtZSBmb3IgcHJpbWFyeSBhZGRyZXNzZXNcbiAgICovXG4gIHJlYWRvbmx5IGNpZHJCbG9ja05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElQdjQgQ0lEUiBwcm92aXNpb25lZCB1bmRlciBwb29sXG4gICAqIFJlcXVpcmVkIHRvIGNoZWNrIGZvciBvdmVybGFwcGluZyBDSURScyBhZnRlciBwcm92aXNpb25pbmdcbiAgICogaXMgY29tcGxldGUgdW5kZXIgSVBBTSBwb29sXG4gICAqIEBkZWZhdWx0IC0gbm8gSVBBTSBJUHY0IENJRFIgcmFuZ2UgaXMgcHJvdmlzaW9uZWQgdXNpbmcgSVBBTVxuICAgKi9cbiAgcmVhZG9ubHkgaXB2NElwYW1Qcm92aXNpb25lZENpZHJzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIElQdjYgQ0lEUiBibG9jayBmcm9tIHRoZSBCT1lJUCBJUHY2IGFkZHJlc3MgcG9vbC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb25lXG4gICAqL1xuICByZWFkb25seSBpcHY2Q2lkckJsb2NrPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJRCBvZiB0aGUgQllPSVAgSVB2NiBhZGRyZXNzIHBvb2wgZnJvbSB3aGljaCB0byBhbGxvY2F0ZSB0aGUgSVB2NiBDSURSIGJsb2NrLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGlwdjZQb29sSWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBpcCBhZGRyZXNzIGFsbG9jYXRpb24gYWNjb3JkaW5nIHRvIHRoZSBJUEFkcmVzcyB0eXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUlwQWRkcmVzc2VzIHtcblxuICAvKipcbiAgICogTWV0aG9kIHRvIGRlZmluZSB0aGUgaW1wbGVtZW50YXRpb24gbG9naWMgb2ZcbiAgICogSVAgYWRkcmVzcyBhbGxvY2F0aW9uXG4gICAqL1xuICBhbGxvY2F0ZVZwY0NpZHIoKSA6IFZwY0NpZHJPcHRpb25zO1xuXG59XG5cbi8qKlxuICogTmFtZSB0YWcgY29uc3RhbnRcbiAqL1xuY29uc3QgTkFNRV9UQUc6IHN0cmluZyA9ICdOYW1lJztcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHRvIGRlZmluZSBWUENcbiAqIFtkaXNhYmxlLWF3c2xpbnQ6ZnJvbS1tZXRob2RdXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVnBjVjJQcm9wcyB7XG5cbiAgLyoqIEEgbXVzdCBJUHY0IENJRFIgYmxvY2sgZm9yIHRoZSBWUENcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdnBjL2xhdGVzdC91c2VyZ3VpZGUvdnBjLWNpZHItYmxvY2tzLmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgLSBJcHY0IENJRFIgQmxvY2sgKCcxMC4wLjAuMC8xNicpXG4gICAqL1xuICByZWFkb25seSBwcmltYXJ5QWRkcmVzc0Jsb2NrPzogSUlwQWRkcmVzc2VzO1xuXG4gIC8qKlxuICAgKiBUaGUgc2Vjb25kYXJ5IENJRFIgYmxvY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGUgVlBDLlxuICAgKiBDYW4gYmUgIElQdjQgb3IgSVB2NiwgdHdvIElQdjQgcmFuZ2VzIG11c3QgZm9sbG93IFJGQyMxOTE4IGNvbnZlbnRpb25cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZwYy9sYXRlc3QvdXNlcmd1aWRlL3ZwYy1jaWRyLWJsb2Nrcy5odG1sI3ZwYy1yZXNpemV9LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHNlY29uZGFyeSBJUCBhZGRyZXNzXG4gICAqL1xuICByZWFkb25seSBzZWNvbmRhcnlBZGRyZXNzQmxvY2tzPzogSUlwQWRkcmVzc2VzW107XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpbnN0YW5jZXMgbGF1bmNoZWQgaW4gdGhlIFZQQyBnZXQgRE5TIGhvc3RuYW1lcy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlRG5zSG9zdG5hbWVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIEROUyByZXNvbHV0aW9uIGlzIHN1cHBvcnRlZCBmb3IgdGhlIFZQQy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlRG5zU3VwcG9ydD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IHRlbmFuY3kgb2YgaW5zdGFuY2VzIGxhdW5jaGVkIGludG8gdGhlIFZQQy5cbiAgICpcbiAgICogQnkgc2V0dGluZyB0aGlzIHRvIGRlZGljYXRlZCB0ZW5hbmN5LCBpbnN0YW5jZXMgd2lsbCBiZSBsYXVuY2hlZCBvblxuICAgKiBoYXJkd2FyZSBkZWRpY2F0ZWQgdG8gYSBzaW5nbGUgQVdTIGN1c3RvbWVyLCB1bmxlc3Mgc3BlY2lmaWNhbGx5IHNwZWNpZmllZFxuICAgKiBhdCBpbnN0YW5jZSBsYXVuY2ggdGltZS4gUGxlYXNlIG5vdGUsIG5vdCBhbGwgaW5zdGFuY2UgdHlwZXMgYXJlIHVzYWJsZVxuICAgKiB3aXRoIERlZGljYXRlZCB0ZW5hbmN5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBEZWZhdWx0SW5zdGFuY2VUZW5hbmN5LkRlZmF1bHQgKHNoYXJlZCkgdGVuYW5jeVxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdEluc3RhbmNlVGVuYW5jeT86IERlZmF1bHRJbnN0YW5jZVRlbmFuY3k7XG5cbiAgLyoqXG4gICAqIFBoeXNpY2FsIG5hbWUgZm9yIHRoZSBWUENcbiAgICpcbiAgICogQGRlZmF1bHQgLSBhdXRvZ2VuZXJhdGVkIGJ5IENES1xuICAgKi9cbiAgcmVhZG9ubHkgdnBjTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIHRvIGltcG9ydCBhIFZQQyBjcmVhdGVkIG91dHNpZGUgb2YgQ0RLIHN0YWNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVnBjVjJBdHRyaWJ1dGVzIHtcblxuICAvKipcbiAgICogVGhlIFZQQyBJRFxuICAgKiBSZWZlcnMgdG8gcGh5c2ljYWwgSWQgb2YgdGhlIHJlc291cmNlXG4gICAqL1xuICByZWFkb25seSB2cGNJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZWdpb24gaW4gd2hpY2ggaW1wb3J0ZWQgVlBDIGlzIGhvc3RlZFxuICAgKiByZXF1aXJlZCBpbiBjYXNlIG9mIGNyb3NzIHJlZ2lvbiBWUENcbiAgICogYXMgZ2l2ZW4gdmFsdWUgd2lsbCBiZSB1c2VkIHRvIHNldCBmaWVsZCByZWdpb24gZm9yIGltcG9ydGVkIFZQQyxcbiAgICogd2hpY2ggdGhlbiBsYXRlciBjYW4gYmUgdXNlZCBmb3IgZXN0YWJsaXNoaW5nIFZQQyBwZWVyaW5nIGNvbm5lY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gY29uc3RydWN0ZWQgd2l0aCBzdGFjayByZWdpb24gdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBBV1MgYWNjb3VudCB0aGF0IG93bnMgdGhlIGltcG9ydGVkIFZQQ1xuICAgKiByZXF1aXJlZCBpbiBjYXNlIG9mIGNyb3NzIGFjY291bnQgVlBDXG4gICAqIGFzIGdpdmVuIHZhbHVlIHdpbGwgYmUgdXNlZCB0byBzZXQgZmllbGQgYWNjb3VudCBmb3IgaW1wb3J0ZWQgVlBDLFxuICAgKiB3aGljaCB0aGVuIGxhdGVyIGNhbiBiZSB1c2VkIGZvciBlc3RhYmxpc2hpbmcgVlBDIHBlZXJpbmcgY29ubmVjdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBjb25zdHJ1Y3RlZCB3aXRoIHN0YWNrIGFjY291bnQgdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IG93bmVyQWNjb3VudElkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQcmltYXJ5IFZQQyBDSURSIEJsb2NrIG9mIHRoZSBpbXBvcnRlZCBWUENcbiAgICogQ2FuIG9ubHkgYmUgSVB2NFxuICAgKi9cbiAgcmVhZG9ubHkgdnBjQ2lkckJsb2NrOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgVlBOIEdhdGV3YXkgaXMgYXR0YWNoZWQgdG8gdGhlIFZQQ1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIFZQTiBHYXRld2F5XG4gICAqL1xuICByZWFkb25seSB2cG5HYXRld2F5SWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFN1Ym5ldHMgYXNzb2NpYXRlZCB3aXRoIGltcG9ydGVkIFZQQ1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHN1Ym5ldHMgcHJvdmlkZWQgdG8gYmUgaW1wb3J0ZWRcbiAgICovXG4gIHJlYWRvbmx5IHN1Ym5ldHM/OiBTdWJuZXRWMkF0dHJpYnV0ZXNbXTtcblxuICAvKipcbiAgICogSW1wb3J0IFNlY29uZGFyeSBDSURSIGJsb2NrcyBhc3NvY2lhdGVkIHdpdGggVlBDXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gc2Vjb25kYXJ5IElQIGFkZHJlc3NcbiAgICovXG4gIHJlYWRvbmx5IHNlY29uZGFyeUNpZHJCbG9ja3M/OiBWUENDaWRyQmxvY2thdHRyaWJ1dGVzW107XG59XG5cbi8qKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIGZvdW5kYXRpb24gZm9yIGNyZWF0aW5nIGFuZCBjb25maWd1cmluZyBhIFZQQyB3aXRoIGFkdmFuY2VkIGZlYXR1cmVzIHN1Y2ggYXMgSVBBTSAoSVAgQWRkcmVzcyBNYW5hZ2VtZW50KSBhbmQgSVB2NiBzdXBwb3J0LlxuICpcbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2RrL2FwaS92Mi9kb2NzL2F3cy1jZGstbGliLmF3c19lYzIuVnBjLmh0bWx8QVdTIENESyBEb2N1bWVudGF0aW9uIG9uIFZQQ3N9LlxuICpcbiAqIEByZXNvdXJjZSBBV1M6OkVDMjo6VlBDXG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBWcGNWMiBleHRlbmRzIFZwY1YyQmFzZSB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLWVjMi1hbHBoYS5WcGNWMic7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIFZQQyBmcm9tIGV4aXN0aW5nIGF0dHJpYnV0ZXNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVZwY1YyQXR0cmlidXRlcyhzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhdHRyczogVnBjVjJBdHRyaWJ1dGVzKTogSVZwY1YyIHtcbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBjbGFzcyB0byBhbGxvdyB1c2VycyB0byBpbXBvcnQgVlBDXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY2xhc3MgSW1wb3J0ZWRWcGNWMiBleHRlbmRzIFZwY1YyQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdnBjSWQ6IHN0cmluZztcbiAgICAgIHB1YmxpYyByZWFkb25seSB2cGNBcm46IHN0cmluZztcbiAgICAgIHB1YmxpYyByZWFkb25seSBwdWJsaWNTdWJuZXRzOiBJU3VibmV0VjJbXSA9IFtdO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHByaXZhdGVTdWJuZXRzOiBJU3VibmV0VjJbXSA9IFtdO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGlzb2xhdGVkU3VibmV0czogSVN1Ym5ldFYyW10gPSBbXTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBpbnRlcm5ldENvbm5lY3Rpdml0eUVzdGFibGlzaGVkOiBJRGVwZW5kYWJsZSA9IG5ldyBEZXBlbmRlbmN5R3JvdXAoKTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBpcHY0Q2lkckJsb2NrOiBzdHJpbmc7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgb3duZXJBY2NvdW50SWQ6IHN0cmluZztcbiAgICAgIHB1YmxpYyByZWFkb25seSB2cGNOYW1lPzogc3RyaW5nO1xuICAgICAgcHJpdmF0ZSByZWFkb25seSBfcGFydGl0aW9uPzogc3RyaW5nO1xuXG4gICAgICAvKlxuICAgICAgKiBSZWZlcmVuY2UgdG8gYWxsIHNlY29uZGFyeSBibG9ja3MgYXR0YWNoZWRcbiAgICAgICovXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgc2Vjb25kYXJ5Q2lkckJsb2NrPzogSVZQQ0NpZHJCbG9ja1tdO1xuXG4gICAgICAvKipcbiAgICAgICAqIFJlZmVycyB0byBhY3R1YWwgVlBDIFJlc291cmNlIGF0dHJpYnV0ZSBpbiBub24taW1wb3J0ZWQgVlBDXG4gICAgICAgKiBSZXF1aXJlZCB0byBpbXBsZW1lbnQgaGVyZSBkdWUgdG8gZXh0ZW5zaW9uIGZyb20gQmFzZSBjbGFzc1xuICAgICAgICovXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdnBjQ2lkckJsb2NrOiBzdHJpbmc7XG5cbiAgICAgIC8vIFJlcXVpcmVkIHRvIGRvIENJRFIgcmFuZ2UgdGVzdCBvbiBpbXBvcnRlZCBWUENzIHRvIGNyZWF0ZSBuZXcgc3VibmV0c1xuICAgICAgcHVibGljIHJlYWRvbmx5IGlwdjRJcGFtUHJvdmlzaW9uZWRDaWRyczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgY29uc3RydWN0b3IoY29uc3RydWN0OiBDb25zdHJ1Y3QsIGNvbnN0cnVjdElkOiBzdHJpbmcsIHByb3BzOiBWcGNWMkF0dHJpYnV0ZXMpIHtcbiAgICAgICAgc3VwZXIoY29uc3RydWN0LCBjb25zdHJ1Y3RJZCk7XG4gICAgICAgIHRoaXMudnBjSWQgPSBwcm9wcy52cGNJZCxcbiAgICAgICAgdGhpcy5yZWdpb24gPSBwcm9wcy5yZWdpb24gPz8gdGhpcy5zdGFjay5yZWdpb24sXG4gICAgICAgIHRoaXMub3duZXJBY2NvdW50SWQgPSBwcm9wcy5vd25lckFjY291bnRJZCA/PyB0aGlzLnN0YWNrLmFjY291bnQsXG4gICAgICAgIHRoaXMuX3BhcnRpdGlvbiA9IHJlZ2lvbl9pbmZvLlJlZ2lvbkluZm8uZ2V0KHRoaXMucmVnaW9uKS5wYXJ0aXRpb24sXG4gICAgICAgIHRoaXMudnBjQXJuID0gQXJuLmZvcm1hdCh7XG4gICAgICAgICAgc2VydmljZTogJ2VjMicsXG4gICAgICAgICAgcmVzb3VyY2U6ICd2cGMnLFxuICAgICAgICAgIHJlc291cmNlTmFtZTogdGhpcy52cGNJZCxcbiAgICAgICAgICByZWdpb246IHRoaXMucmVnaW9uLFxuICAgICAgICAgIGFjY291bnQ6IHRoaXMub3duZXJBY2NvdW50SWQsXG4gICAgICAgICAgcGFydGl0aW9uOiB0aGlzLl9wYXJ0aXRpb24sXG4gICAgICAgIH0sIHRoaXMuc3RhY2spO1xuXG4gICAgICAgIC8vIFBvcHVsYXRlIHJlZ2lvbiBhbmQgYWNjb3VudCBmaWVsZHMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXQgdXAgcGVlcmluZyBjb25uZWN0aW9uXG4gICAgICAgIC8vIHNhbXBsZSB2cGMgQXJuIC0gYXJuOmF3czplYzI6dXMtd2VzdC0yOjEyMzQ1Njc4OTAxMjp2cGMvdnBjLTAxMjM0NTY3ODlhYmNkZWYwXG4gICAgICAgIHRoaXMucmVnaW9uID0gdGhpcy52cGNBcm4uc3BsaXQoJzonKVszXTtcbiAgICAgICAgdGhpcy5vd25lckFjY291bnRJZCA9IHRoaXMudnBjQXJuLnNwbGl0KCc6JylbNF07XG4gICAgICAgIC8vIFJlZmVycyB0byBhY3R1YWwgVlBDIFJlc291cmNlIGF0dHJpYnV0ZSBpbiBub24taW1wb3J0ZWQgVlBDXG4gICAgICAgIHRoaXMudnBjQ2lkckJsb2NrID0gcHJvcHMudnBjQ2lkckJsb2NrO1xuICAgICAgICAvLyBSZXF1aXJlZCBmb3Igc3VibmV0IHJhbmdlIHJlbGF0ZWQgY2hlY2tzXG4gICAgICAgIHRoaXMuaXB2NENpZHJCbG9jayA9IHByb3BzLnZwY0NpZHJCbG9jaztcbiAgICAgICAgdGhpcy5fdnBuR2F0ZXdheUlkID0gcHJvcHMudnBuR2F0ZXdheUlkO1xuXG4gICAgICAgIGlmIChwcm9wcy5zdWJuZXRzKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBzdWJuZXQgb2YgcHJvcHMuc3VibmV0cykge1xuICAgICAgICAgICAgaWYgKHN1Ym5ldC5zdWJuZXRUeXBlID09PSBTdWJuZXRUeXBlLlBSSVZBVEVfV0lUSF9FR1JFU1MgfHwgc3VibmV0LnN1Ym5ldFR5cGUgPT09IFN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX05BVCB8fFxuICAgICAgICAgICAgICBzdWJuZXQuc3VibmV0VHlwZSBhcyBzdHJpbmcgPT09ICdEZXByZWNhdGVkX1ByaXZhdGUnKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJpdmF0ZVN1Ym5ldHMucHVzaChTdWJuZXRWMi5mcm9tU3VibmV0VjJBdHRyaWJ1dGVzKHNjb3BlLCBzdWJuZXQuc3VibmV0TmFtZT8/ICdJbXBvcnRlZFByaXZhdGVTdWJuZXQnLCBzdWJuZXQpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VibmV0LnN1Ym5ldFR5cGUgPT09IFN1Ym5ldFR5cGUuUFVCTElDKSB7XG4gICAgICAgICAgICAgIHRoaXMucHVibGljU3VibmV0cy5wdXNoKFN1Ym5ldFYyLmZyb21TdWJuZXRWMkF0dHJpYnV0ZXMoc2NvcGUsIHN1Ym5ldC5zdWJuZXROYW1lPz8gJ0ltcG9ydGVkUHVibGljU3VibmV0Jywgc3VibmV0KSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN1Ym5ldC5zdWJuZXRUeXBlIGFzIHN0cmluZyA9PT0gJ0RlcHJlY2F0ZWRfSXNvbGF0ZWQnIHx8IHN1Ym5ldC5zdWJuZXRUeXBlID09PSBTdWJuZXRUeXBlLlBSSVZBVEVfSVNPTEFURUQpIHtcbiAgICAgICAgICAgICAgdGhpcy5pc29sYXRlZFN1Ym5ldHMucHVzaChTdWJuZXRWMi5mcm9tU3VibmV0VjJBdHRyaWJ1dGVzKHNjb3BlLCBzdWJuZXQuc3VibmV0TmFtZT8/ICdJbXBvcnRlZElzb2xhdGVkU3VibmV0Jywgc3VibmV0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2Vjb25kYXJ5Q2lkckJsb2NrID0gcHJvcHMuc2Vjb25kYXJ5Q2lkckJsb2Nrcz8ubWFwKGNpZHJCbG9jayA9PiBWUENDaWRyQmxvY2suZnJvbVZQQ0NpZHJCbG9ja2F0dHJpYnV0ZXMoc2NvcGUsIGNpZHJCbG9jay5jaWRyQmxvY2tOYW1lID8/ICdJbXBvcnRlZFNlY29uZGFyeUNpZHJCbG9jaycsIHsgLi4uY2lkckJsb2NrIH0pKTtcbiAgICAgICAgaWYgKHByb3BzLnNlY29uZGFyeUNpZHJCbG9ja3MpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNpZHJCbG9jayBvZiBwcm9wcy5zZWNvbmRhcnlDaWRyQmxvY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2lkckJsb2NrLmlwdjRJcGFtUHJvdmlzaW9uZWRDaWRycykge1xuICAgICAgICAgICAgICB0aGlzLmlwdjRJcGFtUHJvdmlzaW9uZWRDaWRycy5wdXNoKC4uLmNpZHJCbG9jay5pcHY0SXBhbVByb3Zpc2lvbmVkQ2lkcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IEltcG9ydGVkVnBjVjIoc2NvcGUsIGlkLCBhdHRycyk7XG4gIH1cblxuICAvKipcbiAgICogSWRlbnRpZmllciBmb3IgdGhpcyBWUENcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2cGNJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdnBjQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2cGNDaWRyQmxvY2s6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBJUHY2IENJRFIgYmxvY2tzIGZvciB0aGUgVlBDLlxuICAgKlxuICAgKiBTZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWVjMi12cGMuaHRtbCNhd3MtcmVzb3VyY2UtZWMyLXZwYy1yZXR1cm4tdmFsdWVzXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXB2NkNpZHJCbG9ja3M6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvdmlkZXIgb2YgaXB2NCBhZGRyZXNzZXNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpcEFkZHJlc3NlczogSUlwQWRkcmVzc2VzO1xuXG4gIC8qKlxuICAgKiBUaGUgQVdTIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIHJlcHJlc2VudGluZyB0aGUgVlBDLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlOiBDZm5WUEM7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiBpbnN0YW5jZXMgbGF1bmNoZWQgaW4gdGhpcyBWUEMgd2lsbCBoYXZlIHB1YmxpYyBETlMgaG9zdG5hbWVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRuc0hvc3RuYW1lc0VuYWJsZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiBETlMgc3VwcG9ydCBpcyBlbmFibGVkIGZvciB0aGlzIFZQQy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkbnNTdXBwb3J0RW5hYmxlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogSXNvbGF0ZWQgU3VibmV0cyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgVlBDLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlzb2xhdGVkU3VibmV0czogSVN1Ym5ldFtdO1xuXG4gIC8qKlxuICAgKiBQdWJsaWMgU3VibmV0cyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgVlBDLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHB1YmxpY1N1Ym5ldHM6IElTdWJuZXRbXTtcblxuICAvKipcbiAgICogUHVibGljIFN1Ym5ldHMgdGhhdCBhcmUgcGFydCBvZiB0aGlzIFZQQy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwcml2YXRlU3VibmV0czogSVN1Ym5ldFtdO1xuXG4gIC8qKlxuICAgKiBUbyBkZWZpbmUgZGVwZW5kZW5jeSBvbiBpbnRlcm5ldCBjb25uZWN0aXZpdHlcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpbnRlcm5ldENvbm5lY3Rpdml0eUVzdGFibGlzaGVkOiBJRGVwZW5kYWJsZTtcblxuICAvKipcbiAgICogcmVmZXJlbmNlIHRvIGFsbCBzZWNvbmRhcnkgYmxvY2tzIGF0dGFjaGVkXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2Vjb25kYXJ5Q2lkckJsb2NrPzogSVZQQ0NpZHJCbG9ja1tdID0gbmV3IEFycmF5PElWUENDaWRyQmxvY2s+O1xuXG4gIC8qKlxuICAgKiBJUHY0IENJRFIgcHJvdmlzaW9uZWQgdXNpbmcgSVBBTSBwb29sXG4gICAqIFJlcXVpcmVkIHRvIGNoZWNrIGZvciBvdmVybGFwcGluZyBDSURScyBhZnRlciBwcm92aXNpb25pbmdcbiAgICogaXMgY29tcGxldGUgdW5kZXIgSVBBTVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwdjRJcGFtUHJvdmlzaW9uZWRDaWRycz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBSZWdpb24gZm9yIHRoaXMgVlBDXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElkZW50aWZpZXIgb2YgdGhlIG93bmVyIGZvciB0aGlzIFZQQ1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG93bmVyQWNjb3VudElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZvciB2YWxpZGF0aW9uIHRvIGRlZmluZSBJUHY2IHN1Ym5ldHMsIHNldCB0byB0cnVlIGluIGNhc2Ugb2ZcbiAgICogQW1hem9uIFByb3ZpZGVkIElQdjYgY2lkciByYW5nZVxuICAgKiBpZiB0cnVlLCBJUHY2IGFkZHJlc3NlcyBjYW4gYmUgYXR0YWNoZWQgdG8gdGhlIHN1Ym5ldHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlSXB2NjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBWcGNOYW1lIHRvIGJlIHVzZWQgZm9yIHRhZ2dpbmcgaXRzIGNvbXBvbmVudHNcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZwY05hbWU/OiBzdHJpbmc7XG5cbiAgcHVibGljIHJlYWRvbmx5IGlwdjRDaWRyQmxvY2s6IHN0cmluZyA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBWcGNWMlByb3BzID0ge30pIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHMudnBjTmFtZSA/PyBMYXp5LnN0cmluZyh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7IG1heExlbmd0aDogMTI4LCBhbGxvd2VkU3BlY2lhbENoYXJhY3RlcnM6ICdfJyB9KSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuICAgIHRoaXMudnBjTmFtZSA9IHByb3BzLnZwY05hbWU7XG4gICAgdGhpcy5pcEFkZHJlc3NlcyA9IHByb3BzLnByaW1hcnlBZGRyZXNzQmxvY2sgPz8gSXBBZGRyZXNzZXMuaXB2NCgnMTAuMC4wLjAvMTYnKTtcbiAgICBjb25zdCB2cGNPcHRpb25zID0gdGhpcy5pcEFkZHJlc3Nlcy5hbGxvY2F0ZVZwY0NpZHIoKTtcblxuICAgIHRoaXMuZG5zSG9zdG5hbWVzRW5hYmxlZCA9IHByb3BzLmVuYWJsZURuc0hvc3RuYW1lcyA9PSBudWxsID8gdHJ1ZSA6IHByb3BzLmVuYWJsZURuc0hvc3RuYW1lcztcbiAgICB0aGlzLmRuc1N1cHBvcnRFbmFibGVkID0gcHJvcHMuZW5hYmxlRG5zU3VwcG9ydCA9PSBudWxsID8gdHJ1ZSA6IHByb3BzLmVuYWJsZURuc1N1cHBvcnQ7XG4gICAgY29uc3QgaW5zdGFuY2VUZW5hbmN5ID0gcHJvcHMuZGVmYXVsdEluc3RhbmNlVGVuYW5jeSB8fCAnZGVmYXVsdCc7XG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBDZm5WUEModGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgY2lkckJsb2NrOiB2cGNPcHRpb25zLmlwdjRDaWRyQmxvY2ssIC8vIGZvciBJcHY0IGFkZHJlc3NlcyBDSURSIGJsb2NrXG4gICAgICBlbmFibGVEbnNIb3N0bmFtZXM6IHRoaXMuZG5zSG9zdG5hbWVzRW5hYmxlZCxcbiAgICAgIGVuYWJsZURuc1N1cHBvcnQ6IHRoaXMuZG5zU3VwcG9ydEVuYWJsZWQsXG4gICAgICBpcHY0SXBhbVBvb2xJZDogdnBjT3B0aW9ucy5pcHY0SXBhbVBvb2w/LmlwYW1Qb29sSWQsIC8vIGZvciBJcHY0IGlwYW0gb3B0aW9uXG4gICAgICBpcHY0TmV0bWFza0xlbmd0aDogdnBjT3B0aW9ucy5pcHY0TmV0bWFza0xlbmd0aCwgLy8gZm9yIElwdjQgaXBhbSBvcHRpb25cbiAgICAgIGluc3RhbmNlVGVuYW5jeTogaW5zdGFuY2VUZW5hbmN5LFxuICAgIH0pO1xuXG4gICAgdGhpcy5ub2RlLmRlZmF1bHRDaGlsZCA9IHRoaXMucmVzb3VyY2U7XG4gICAgdGhpcy52cGNDaWRyQmxvY2sgPSB0aGlzLnJlc291cmNlLmF0dHJDaWRyQmxvY2s7XG4gICAgaWYgKHZwY09wdGlvbnMuaXB2NENpZHJCbG9jaykge1xuICAgICAgdGhpcy5pcHY0Q2lkckJsb2NrID0gdnBjT3B0aW9ucy5pcHY0Q2lkckJsb2NrO1xuICAgIH1cbiAgICB0aGlzLmlwdjZDaWRyQmxvY2tzID0gdGhpcy5yZXNvdXJjZS5hdHRySXB2NkNpZHJCbG9ja3M7XG4gICAgdGhpcy52cGNJZCA9IEZlYXR1cmVGbGFncy5vZih0aGlzKS5pc0VuYWJsZWQoY3hfYXBpLlVTRV9SRVNPVVJDRUlEX0ZPUl9WUENWMl9NSUdSQVRJT04pID9cbiAgICAgIHRoaXMucmVzb3VyY2UucmVmIDogdGhpcy5yZXNvdXJjZS5hdHRyVnBjSWQ7XG4gICAgdGhpcy52cGNBcm4gPSBBcm4uZm9ybWF0KHtcbiAgICAgIHNlcnZpY2U6ICdlYzInLFxuICAgICAgcmVzb3VyY2U6ICd2cGMnLFxuICAgICAgcmVzb3VyY2VOYW1lOiB0aGlzLnZwY0lkLFxuICAgIH0sIHRoaXMuc3RhY2spO1xuICAgIHRoaXMucmVnaW9uID0gdGhpcy5zdGFjay5yZWdpb247XG4gICAgdGhpcy5vd25lckFjY291bnRJZCA9IHRoaXMuc3RhY2suYWNjb3VudDtcbiAgICAvLyBBZGQgdGFnIHRvIHRoZSBWUEMgd2l0aCB0aGUgbmFtZSBwcm92aWRlZCBpbiBwcm9wZXJ0aWVzXG4gICAgVGFncy5vZih0aGlzKS5hZGQoTkFNRV9UQUcsIHByb3BzLnZwY05hbWUgfHwgdGhpcy5ub2RlLnBhdGgpO1xuICAgIGlmIChwcm9wcy5zZWNvbmRhcnlBZGRyZXNzQmxvY2tzKSB7XG4gICAgICBjb25zdCBzZWNvbmRhcnlBZGRyZXNzQmxvY2tzOiBJSXBBZGRyZXNzZXNbXSA9IHByb3BzLnNlY29uZGFyeUFkZHJlc3NCbG9ja3M7XG5cbiAgICAgIGZvciAoY29uc3Qgc2Vjb25kYXJ5QWRkcmVzc0Jsb2NrIG9mIHNlY29uZGFyeUFkZHJlc3NCbG9ja3MpIHtcbiAgICAgICAgY29uc3Qgc2Vjb25kYXJ5VnBjT3B0aW9uczogVnBjQ2lkck9wdGlvbnMgPSBzZWNvbmRhcnlBZGRyZXNzQmxvY2suYWxsb2NhdGVWcGNDaWRyKCk7XG4gICAgICAgIGlmICghc2Vjb25kYXJ5VnBjT3B0aW9ucy5jaWRyQmxvY2tOYW1lKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDaWRyIEJsb2NrIE5hbWUgaXMgcmVxdWlyZWQgdG8gY3JlYXRlIHNlY29uZGFyeSBJUCBhZGRyZXNzJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2Vjb25kYXJ5VnBjT3B0aW9ucy5hbWF6b25Qcm92aWRlZCB8fCBzZWNvbmRhcnlWcGNPcHRpb25zLmlwdjZJcGFtUG9vbCB8fCBzZWNvbmRhcnlWcGNPcHRpb25zLmlwdjZQb29sSWQpIHtcbiAgICAgICAgICB0aGlzLnVzZUlwdjYgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIHZhbGlkYXRlIENJRFIgcmFuZ2VzIHBlciBSRkMgMTkxOFxuICAgICAgICBpZiAoc2Vjb25kYXJ5VnBjT3B0aW9ucy5pcHY0Q2lkckJsb2NrISkge1xuICAgICAgICAgIGNvbnN0IHJldCA9IHZhbGlkYXRlSXB2NGFkZHJlc3Moc2Vjb25kYXJ5VnBjT3B0aW9ucy5pcHY0Q2lkckJsb2NrLCB0aGlzLnJlc291cmNlLmNpZHJCbG9jayk7XG4gICAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ0lEUiBibG9jayBzaG91bGQgYmUgaW4gdGhlIHNhbWUgUkZDIDE5MTggcmFuZ2UgaW4gdGhlIFZQQycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2Vjb25kYXJ5VnBjT3B0aW9ucy5pcHY0SXBhbVByb3Zpc2lvbmVkQ2lkcnMhKSB7XG4gICAgICAgICAgdGhpcy5pcHY0SXBhbVByb3Zpc2lvbmVkQ2lkcnM/LnB1c2goLi4uc2Vjb25kYXJ5VnBjT3B0aW9ucy5pcHY0SXBhbVByb3Zpc2lvbmVkQ2lkcnMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZwY0NpZHJCbG9jayA9IG5ldyBWUENDaWRyQmxvY2sodGhpcywgc2Vjb25kYXJ5VnBjT3B0aW9ucy5jaWRyQmxvY2tOYW1lLCB7XG4gICAgICAgICAgdnBjSWQ6IHRoaXMudnBjSWQsXG4gICAgICAgICAgY2lkckJsb2NrOiBzZWNvbmRhcnlWcGNPcHRpb25zLmlwdjRDaWRyQmxvY2ssXG4gICAgICAgICAgaXB2NElwYW1Qb29sSWQ6IHNlY29uZGFyeVZwY09wdGlvbnMuaXB2NElwYW1Qb29sPy5pcGFtUG9vbElkLFxuICAgICAgICAgIGlwdjROZXRtYXNrTGVuZ3RoOiBzZWNvbmRhcnlWcGNPcHRpb25zLmlwdjROZXRtYXNrTGVuZ3RoLFxuICAgICAgICAgIGlwdjZOZXRtYXNrTGVuZ3RoOiBzZWNvbmRhcnlWcGNPcHRpb25zLmlwdjZOZXRtYXNrTGVuZ3RoLFxuICAgICAgICAgIGlwdjZJcGFtUG9vbElkOiBzZWNvbmRhcnlWcGNPcHRpb25zLmlwdjZJcGFtUG9vbD8uaXBhbVBvb2xJZCxcbiAgICAgICAgICBhbWF6b25Qcm92aWRlZElwdjZDaWRyQmxvY2s6IHNlY29uZGFyeVZwY09wdGlvbnMuYW1hem9uUHJvdmlkZWQsXG4gICAgICAgICAgLy8gQllPSVAgSVB2NiBBZGRyZXNzXG4gICAgICAgICAgaXB2NkNpZHJCbG9jazogc2Vjb25kYXJ5VnBjT3B0aW9ucz8uaXB2NkNpZHJCbG9jayxcbiAgICAgICAgICAvLyBCWU9JUCBQb29sIGZvciBJUHY2IGFkZHJlc3NcbiAgICAgICAgICBpcHY2UG9vbDogc2Vjb25kYXJ5VnBjT3B0aW9ucz8uaXB2NlBvb2xJZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChzZWNvbmRhcnlWcGNPcHRpb25zLmRlcGVuZGVuY2llcykge1xuICAgICAgICAgIGZvciAoY29uc3QgZGVwIG9mIHNlY29uZGFyeVZwY09wdGlvbnMuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICB2cGNDaWRyQmxvY2subm9kZS5hZGREZXBlbmRlbmN5KGRlcCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENyZWF0ZSBzZWNvbmRhcnkgYmxvY2tzIGZvciBJcHY0IGFuZCBJcHY2XG4gICAgICAgIHRoaXMuc2Vjb25kYXJ5Q2lkckJsb2NrPy5wdXNoKHZwY0NpZHJCbG9jayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1wdHkgYXJyYXkgZm9yIGlzb2xhdGVkIHN1Ym5ldHNcbiAgICAgKi9cbiAgICB0aGlzLmlzb2xhdGVkU3VibmV0cyA9IG5ldyBBcnJheTxJU3VibmV0PjtcblxuICAgIC8qKlxuICAgICAqIEVtcHR5IGFycmF5IGZvciBwdWJsaWMgc3VibmV0c1xuICAgICAqL1xuICAgIHRoaXMucHVibGljU3VibmV0cyA9IG5ldyBBcnJheTxJU3VibmV0PjtcblxuICAgIC8qKlxuICAgICAqIEVtcHR5IGFycmF5IGZvciBwcml2YXRlIHN1Ym5ldHNcbiAgICAgKi9cbiAgICB0aGlzLnByaXZhdGVTdWJuZXRzID0gbmV3IEFycmF5PElTdWJuZXQ+O1xuXG4gICAgLyoqXG4gICAgICogRGVwZW5kYWJsZSB0aGF0IGNhbiBiZSBkZXBlbmRlZCB1cG9uIHRvIGZvcmNlIGludGVybmV0IGNvbm5lY3Rpdml0eSBlc3RhYmxpc2hlZCBvbiB0aGUgVlBDXG4gICAgICogQWRkIGlndyB0byB0aGlzIGlmIGl0cyBhIHB1YmxpYyBzdWJuZXRcbiAgICAgKi9cbiAgICB0aGlzLmludGVybmV0Q29ubmVjdGl2aXR5RXN0YWJsaXNoZWQgPSB0aGlzLl9pbnRlcm5ldENvbm5lY3Rpdml0eUVzdGFibGlzaGVkO1xuICB9XG59XG4vKipcbiAqIFN1cHBvcnRzIGFzc2lnbmluZyBJUHY0IGFkZHJlc3MgdG8gVlBDXG4gKi9cbmNsYXNzIGlwdjRDaWRyQWxsb2NhdGlvbiBpbXBsZW1lbnRzIElJcEFkZHJlc3NlcyB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY2lkckJsb2NrOiBzdHJpbmcsIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM/OiB7IGNpZHJCbG9ja05hbWU6IHN0cmluZ30pIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBDSURSIGJsb2NrIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIHRvIHNldCBJUHY0XG4gICAqL1xuICBhbGxvY2F0ZVZwY0NpZHIoKTogVnBjQ2lkck9wdGlvbnMge1xuICAgIHJldHVybiB7XG4gICAgICBpcHY0Q2lkckJsb2NrOiB0aGlzLmNpZHJCbG9jayxcbiAgICAgIGNpZHJCbG9ja05hbWU6IHRoaXMucHJvcHM/LmNpZHJCbG9ja05hbWUsXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFN1cHBvcnRzIEFtYXpvbiBQcm92aWRlZCBJcHY2IHJhbmdlc1xuICovXG5jbGFzcyBBbWF6b25Qcm92aWRlZCBpbXBsZW1lbnRzIElJcEFkZHJlc3NlcyB7XG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGFuIEFtYXpvbi1wcm92aWRlZCBJUHY2IENJRFIgcmFuZ2UgZm9yIGEgVlBDLlxuICAgKlxuICAgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIElJcEFkZHJlc3NlcyBpbnRlcmZhY2UgYW5kIGlzIHVzZWQgdG8gYWxsb2NhdGUgYW4gQW1hem9uLXByb3ZpZGVkXG4gICAqIElQdjYgQ0lEUiByYW5nZSBmb3IgYSBWUEMuIFdoZW4gYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyB1c2VkIHRvIGFsbG9jYXRlIHRoZSBWUEMgQ0lEUixcbiAgICogQW1hem9uIHdpbGwgYXV0b21hdGljYWxseSBhc3NpZ24gYW4gSVB2NiBDSURSIHJhbmdlIGZyb20gaXRzIHBvb2wgb2YgYXZhaWxhYmxlIGFkZHJlc3Nlcy5cbiAgICovXG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogeyBjaWRyQmxvY2tOYW1lOiBzdHJpbmd9KSB7fVxuXG4gIGFsbG9jYXRlVnBjQ2lkcigpOiBWcGNDaWRyT3B0aW9ucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFtYXpvblByb3ZpZGVkOiB0cnVlLFxuICAgICAgY2lkckJsb2NrTmFtZTogdGhpcy5wcm9wcy5jaWRyQmxvY2tOYW1lLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIElQdjQgYWRkcmVzcyByYW5nZSBtYW5hZ2VkIGJ5IEFXUyBJUCBBZGRyZXNzIE1hbmFnZXIgKElQQU0pLlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtZWMyLWlwYW0uaHRtbFxuICovXG5jbGFzcyBJcGFtSXB2NiBpbXBsZW1lbnRzIElJcEFkZHJlc3NlcyB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IElwYW1PcHRpb25zKSB7XG4gIH1cblxuICBhbGxvY2F0ZVZwY0NpZHIoKTogVnBjQ2lkck9wdGlvbnMge1xuICAgIHJldHVybiB7XG4gICAgICBpcHY2TmV0bWFza0xlbmd0aDogdGhpcy5wcm9wcy5uZXRtYXNrTGVuZ3RoLFxuICAgICAgaXB2NklwYW1Qb29sOiB0aGlzLnByb3BzLmlwYW1Qb29sLFxuICAgICAgZGVwZW5kZW5jaWVzOiB0aGlzLnByb3BzLmlwYW1Qb29sPy5pcGFtQ2lkcnMubWFwKGMgPT4gYyBhcyBDZm5SZXNvdXJjZSksXG4gICAgICBjaWRyQmxvY2tOYW1lOiB0aGlzLnByb3BzLmNpZHJCbG9ja05hbWUsXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gSVB2NCBhZGRyZXNzIHJhbmdlIG1hbmFnZWQgYnkgQVdTIElQIEFkZHJlc3MgTWFuYWdlciAoSVBBTSkuXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItaXBhbS5odG1sXG4gKi9cbmNsYXNzIElwYW1JcHY0IGltcGxlbWVudHMgSUlwQWRkcmVzc2VzIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogSXBhbU9wdGlvbnMpIHtcbiAgfVxuICBhbGxvY2F0ZVZwY0NpZHIoKTogVnBjQ2lkck9wdGlvbnMge1xuICAgIHJldHVybiB7XG4gICAgICBpcHY0TmV0bWFza0xlbmd0aDogdGhpcy5wcm9wcy5uZXRtYXNrTGVuZ3RoLFxuICAgICAgaXB2NElwYW1Qb29sOiB0aGlzLnByb3BzLmlwYW1Qb29sLFxuICAgICAgY2lkckJsb2NrTmFtZTogdGhpcy5wcm9wcz8uY2lkckJsb2NrTmFtZSxcbiAgICAgIGlwdjRJcGFtUHJvdmlzaW9uZWRDaWRyczogdGhpcy5wcm9wcy5pcGFtUG9vbD8uaXBhbUlwdjRDaWRycyxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogU3VwcG9ydHMgYXNzaWduaW5nIElQdjYgYWRkcmVzcyB0byBWUEMgaW4gYW4gYWRkcmVzcyBwb29sXG4gKi9cbmNsYXNzIElwdjZQb29sIGltcGxlbWVudHMgSUlwQWRkcmVzc2VzIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogSXB2NlBvb2xTZWNvbmRhcnlBZGRyZXNzUHJvcHMpIHtcbiAgfVxuICBhbGxvY2F0ZVZwY0NpZHIoKTogVnBjQ2lkck9wdGlvbnMge1xuICAgIHJldHVybiB7XG4gICAgICBpcHY2Q2lkckJsb2NrOiB0aGlzLnByb3BzLmlwdjZDaWRyQmxvY2ssXG4gICAgICBpcHY2UG9vbElkOiB0aGlzLnByb3BzLmlwdjZQb29sSWQsXG4gICAgICBjaWRyQmxvY2tOYW1lOiB0aGlzLnByb3BzPy5jaWRyQmxvY2tOYW1lLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgdG8gY3JlYXRlIEwyIGZvciBWUEMgQ2lkciBCbG9ja1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElWUENDaWRyQmxvY2sge1xuICAvKipcbiAgICogQW1hem9uIFByb3ZpZGVkIElwdjZcbiAgICovXG4gIHJlYWRvbmx5IGFtYXpvblByb3ZpZGVkSXB2NkNpZHJCbG9jaz8gOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgc2Vjb25kYXJ5IElQdjQgQ0lEUiBCbG9ja1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIENJRFIgYmxvY2sgcHJvdmlkZWRcbiAgICovXG4gIHJlYWRvbmx5IGNpZHJCbG9jaz86IHN0cmluZztcblxuICAvKipcbiAgICogSVBBTSBwb29sIGZvciBJUHY2IGFkZHJlc3MgdHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgaXB2NklwYW1Qb29sSWQgPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJUEFNIHBvb2wgZm9yIElQdjQgYWRkcmVzcyB0eXBlXG4gICAqL1xuICByZWFkb25seSBpcHY0SXBhbVBvb2xJZCA/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJUHY2IENJRFIgYmxvY2sgZnJvbSB0aGUgc3BlY2lmaWVkIElQdjYgYWRkcmVzcyBwb29sLlxuICAgKi9cbiAgcmVhZG9ubHkgaXB2NkNpZHJCbG9jaz86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBJUHY2IGFkZHJlc3MgcG9vbCBmcm9tIHdoaWNoIHRvIGFsbG9jYXRlIHRoZSBJUHY2IENJRFIgYmxvY2suXG4gICAqL1xuICByZWFkb25seSBpcHY2UG9vbD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBdHRyaWJ1dGVzIGZvciBWUENDaWRyQmxvY2sgdXNlZCBmb3IgZGVmaW5pbmcgYSBuZXcgQ0lEUiBCbG9ja1xuICogYW5kIGFsc28gZm9yIGltcG9ydGluZyBhbiBleGlzdGluZyBDSURSXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVlBDQ2lkckJsb2NrYXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBBbWF6b24gUHJvdmlkZWQgSXB2NlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgYW1hem9uUHJvdmlkZWRJcHY2Q2lkckJsb2NrPyA6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBzZWNvbmRhcnkgSVB2NCBDSURSIEJsb2NrXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gQ0lEUiBibG9jayBwcm92aWRlZFxuICAgKi9cbiAgcmVhZG9ubHkgY2lkckJsb2NrPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2Vjb25kYXJ5IElQdjQgQ0lEUiBCbG9ja1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIENJRFIgYmxvY2sgcHJvdmlkZWRcbiAgICovXG4gIHJlYWRvbmx5IGNpZHJCbG9ja05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5ldCBtYXNrIGxlbmd0aCBmb3IgSVB2NiBhZGRyZXNzIHR5cGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBOZXQgbWFzayBsZW5ndGggY29uZmlndXJlZCBmb3IgSVB2NlxuICAgKi9cbiAgcmVhZG9ubHkgaXB2Nk5ldG1hc2tMZW5ndGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE5ldCBtYXNrIGxlbmd0aCBmb3IgSVB2NCBhZGRyZXNzIHR5cGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBOZXQgbWFzayBsZW5ndGggY29uZmlndXJlZCBmb3IgSVB2NFxuICAgKi9cbiAgcmVhZG9ubHkgaXB2NE5ldG1hc2tMZW5ndGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIElQQU0gcG9vbCBmb3IgSVB2NiBhZGRyZXNzIHR5cGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBJUEFNIHBvb2wgSWQgcHJvdmlkZWQgZm9yIElQdjZcbiAgICovXG4gIHJlYWRvbmx5IGlwdjZJcGFtUG9vbElkID86IHN0cmluZztcblxuICAvKipcbiAgICogSVBBTSBwb29sIGZvciBJUHY0IGFkZHJlc3MgdHlwZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIElQQU0gcG9vbCBJZCBwcm92aWRlZCBmb3IgSVB2NFxuICAgKi9cbiAgcmVhZG9ubHkgaXB2NElwYW1Qb29sSWQgPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJUHY0IENJRFIgcHJvdmlzaW9uZWQgdW5kZXIgcG9vbFxuICAgKiBSZXF1aXJlZCB0byBjaGVjayBmb3Igb3ZlcmxhcHBpbmcgQ0lEUnMgYWZ0ZXIgcHJvdmlzaW9uaW5nXG4gICAqIGlzIGNvbXBsZXRlIHVuZGVyIElQQU0gcG9vbFxuICAgKiBAZGVmYXVsdCAtIG5vIElQQU0gSVB2NCBDSURSIHJhbmdlIGlzIHByb3Zpc2lvbmVkIHVzaW5nIElQQU1cbiAgICovXG4gIHJlYWRvbmx5IGlwdjRJcGFtUHJvdmlzaW9uZWRDaWRycz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgSVB2NiBDSURSIGJsb2NrIGZyb20gdGhlIHNwZWNpZmllZCBJUHY2IGFkZHJlc3MgcG9vbC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBJUHY2IENJRFIgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIFZQQy5cbiAgICovXG4gIHJlYWRvbmx5IGlwdjZDaWRyQmxvY2s/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgSVB2NiBhZGRyZXNzIHBvb2wgZnJvbSB3aGljaCB0byBhbGxvY2F0ZSB0aGUgSVB2NiBDSURSIGJsb2NrLlxuICAgKiBOb3RlOiBCWU9JUCBQb29sIElEIGlzIGRpZmZlcmVudCB0aGFuIElQQU0gUG9vbCBJRC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBCWU9JUCBwb29sIGFzc29jaWF0ZWQgd2l0aCBWUEMuXG4gICAqL1xuICByZWFkb25seSBpcHY2UG9vbD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgVlBDQ2lkckJsb2NrXG4gKi9cbmludGVyZmFjZSBWUENDaWRyQmxvY2tQcm9wcyBleHRlbmRzIFZQQ0NpZHJCbG9ja2F0dHJpYnV0ZXMge1xuICAvKipcbiAgICogVGhlIFZQQyBJZCBmb3IgYXNzb2NpYXRpbmcgQ0lEUiBCbG9jayBhcyBhIHNlY29uZGFyeSBhZGRyZXNzXG4gICAqL1xuICByZWFkb25seSB2cGNJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEludGVybmFsIEwyIHRvIGRlZmluZSBhIG5ldyBWUEMgQ0lEUiBCbG9ja1xuICogQGludGVybmFsXG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmNsYXNzIFZQQ0NpZHJCbG9jayBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSVZQQ0NpZHJCbG9jayB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLWVjMi1hbHBoYS5WUENDaWRyQmxvY2snO1xuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZXhpc3RpbmcgVlBDIENJRFIgQmxvY2tcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVZQQ0NpZHJCbG9ja2F0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFZQQ0NpZHJCbG9ja2F0dHJpYnV0ZXMpIDogSVZQQ0NpZHJCbG9jayB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJVlBDQ2lkckJsb2NrIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBjaWRyQmxvY2sgPSBwcm9wcy5jaWRyQmxvY2s7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYW1hem9uUHJvdmlkZWRJcHY2Q2lkckJsb2NrID86IGJvb2xlYW4gPSBwcm9wcy5hbWF6b25Qcm92aWRlZElwdjZDaWRyQmxvY2s7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgaXB2NklwYW1Qb29sSWQgPzogc3RyaW5nID0gcHJvcHMuaXB2NklwYW1Qb29sSWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgaXB2NElwYW1Qb29sSWQgPzogc3RyaW5nID0gcHJvcHMuaXB2NElwYW1Qb29sSWQ7XG4gICAgICAvLyBCWU9JUCBQb29sIEF0dHJpYnV0ZXNcbiAgICAgIHB1YmxpYyByZWFkb25seSBpcHY2UG9vbD86IHN0cmluZyA9IHByb3BzLmlwdjZQb29sO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGlwdjZDaWRyQmxvY2s/OiBzdHJpbmcgPSBwcm9wcy5pcHY2Q2lkckJsb2NrO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEltcG9ydChzY29wZSwgaWQpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlOiBDZm5WUENDaWRyQmxvY2s7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNpZHJCbG9jaz86IHN0cmluZztcblxuICBwdWJsaWMgcmVhZG9ubHkgYW1hem9uUHJvdmlkZWRJcHY2Q2lkckJsb2NrPzogYm9vbGVhbjtcblxuICBwdWJsaWMgcmVhZG9ubHkgaXB2NklwYW1Qb29sSWQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIHJlYWRvbmx5IGlwdjRJcGFtUG9vbElkPzogc3RyaW5nO1xuXG4gIHB1YmxpYyByZWFkb25seSBpcHY2Q2lkckJsb2NrPzogc3RyaW5nO1xuXG4gIHB1YmxpYyByZWFkb25seSBpcHY2UG9vbD86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogVlBDQ2lkckJsb2NrUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgQ2ZuVlBDQ2lkckJsb2NrKHRoaXMsIGlkLCBwcm9wcyk7XG4gICAgdGhpcy5ub2RlLmRlZmF1bHRDaGlsZCA9IHRoaXMucmVzb3VyY2U7XG4gICAgdGhpcy5jaWRyQmxvY2sgPSBwcm9wcy5jaWRyQmxvY2s7XG4gICAgdGhpcy5pcHY2SXBhbVBvb2xJZCA9IHByb3BzLmlwdjZJcGFtUG9vbElkO1xuICAgIHRoaXMuaXB2NElwYW1Qb29sSWQgPSBwcm9wcy5pcHY0SXBhbVBvb2xJZDtcbiAgICB0aGlzLmFtYXpvblByb3ZpZGVkSXB2NkNpZHJCbG9jayA9IHByb3BzLmFtYXpvblByb3ZpZGVkSXB2NkNpZHJCbG9jaztcbiAgICAvLyBCWU9JUCBQb29sIGFuZCBDSURSIEJsb2NrXG4gICAgdGhpcy5pcHY2Q2lkckJsb2NrID0gcHJvcHMuaXB2NkNpZHJCbG9jaztcbiAgICB0aGlzLmlwdjZQb29sID0gcHJvcHMuaXB2NlBvb2w7XG4gIH1cbn1cblxuLy8gQGludGVybmFsIEZpcnN0IHR3byBPY3RldCB0byB2ZXJpZnkgUkZDIDE5MThcbmludGVyZmFjZSBJUGFkZHJlc3NDb25maWcge1xuICBvY3RldDE6IG51bWJlcjtcbiAgb2N0ZXQyOiBudW1iZXI7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHdoZXRoZXIgYSBzZWNvbmRhcnkgSVB2NCBhZGRyZXNzIGlzIHdpdGhpbiB0aGUgc2FtZSBwcml2YXRlIElQIGFkZHJlc3MgcmFuZ2UgYXMgdGhlIHByaW1hcnkgSVB2NCBhZGRyZXNzLlxuICpcbiAqIEBwYXJhbSBjaWRyMSBUaGUgc2Vjb25kYXJ5IElQdjQgQ0lEUiBibG9jayB0byBiZSB2YWxpZGF0ZWQuXG4gKiBAcGFyYW0gY2lkcjIgVGhlIHByaW1hcnkgSVB2NCBDSURSIGJsb2NrIHRvIHZhbGlkYXRlIGFnYWluc3QuXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBzZWNvbmRhcnkgSVB2NCBDSURSIGJsb2NrIGlzIHdpdGhpbiB0aGUgc2FtZSBwcml2YXRlIElQIGFkZHJlc3MgcmFuZ2UgYXMgdGhlIHByaW1hcnkgSVB2NCBDSURSIGJsb2NrLCBmYWxzZSBvdGhlcndpc2UuXG4gKiBAaW50ZXJuYWxcbiAqIFRoZSBwcml2YXRlIElQIGFkZHJlc3MgcmFuZ2VzIGFyZSBkZWZpbmVkIGJ5IFJGQyAxOTE4IGFzIDEwLjAuMC4wLzgsIDE3Mi4xNi4wLjAvMTIsIGFuZCAxOTIuMTY4LjAuMC8xNi5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVJcHY0YWRkcmVzcyhjaWRyMT86IHN0cmluZywgY2lkcjI/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFjaWRyMSB8fCAhY2lkcjIpIHtcbiAgICByZXR1cm4gZmFsc2U7IC8vIEhhbmRsZSBjYXNlcyB3aGVyZSBDSURSIHJhbmdlcyBhcmUgbm90IHByb3ZpZGVkXG4gIH1cblxuICBjb25zdCBvY3RldHNDaWRyMTogbnVtYmVyW10gPSBjaWRyMS5zcGxpdCgnLicpLm1hcChvY3RldCA9PiBwYXJzZUludChvY3RldCwgMTApKTtcbiAgY29uc3Qgb2N0ZXRzQ2lkcjI6IG51bWJlcltdID0gY2lkcjIuc3BsaXQoJy4nKS5tYXAob2N0ZXQgPT4gcGFyc2VJbnQob2N0ZXQsIDEwKSk7XG5cbiAgaWYgKG9jdGV0c0NpZHIxLmxlbmd0aCAhPT0gNCB8fCBvY3RldHNDaWRyMi5sZW5ndGggIT09IDQpIHtcbiAgICByZXR1cm4gZmFsc2U7IC8vIEhhbmRsZSBpbnZhbGlkIENJRFIgcmFuZ2VzXG4gIH1cblxuICBjb25zdCBpcDE6IElQYWRkcmVzc0NvbmZpZyA9IHtcbiAgICBvY3RldDE6IG9jdGV0c0NpZHIxWzBdLFxuICAgIG9jdGV0Mjogb2N0ZXRzQ2lkcjFbMV0sXG4gIH07XG5cbiAgY29uc3QgaXAyOiBJUGFkZHJlc3NDb25maWcgPSB7XG4gICAgb2N0ZXQxOiBvY3RldHNDaWRyMlswXSxcbiAgICBvY3RldDI6IG9jdGV0c0NpZHIyWzFdLFxuICB9O1xuXG4gIHJldHVybiAoaXAxLm9jdGV0MSA9PT0gMTAgJiYgaXAyLm9jdGV0MSA9PT0gMTApIHx8XG4gICAgKGlwMS5vY3RldDEgPT09IDE5MiAmJiBpcDEub2N0ZXQyID09PSAxNjggJiYgaXAyLm9jdGV0MSA9PT0gMTkyICYmIGlwMi5vY3RldDIgPT09IDE2OCkgfHxcbiAgICAoaXAxLm9jdGV0MSA9PT0gMTcyICYmIGlwMS5vY3RldDIgPT09IDE2ICYmIGlwMi5vY3RldDEgPT09IDE3MiAmJiBpcDIub2N0ZXQyID09PSAxNik7IC8vIENJRFIgcmFuZ2VzIGJlbG9uZyB0byBzYW1lIHByaXZhdGUgSVAgYWRkcmVzcyByYW5nZXNcbn1cbiJdfQ==
630
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnBjLXYyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidnBjLXYyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlEQUEyRztBQUMzRywyQ0FBK0Y7QUFDL0YsMkNBQXFFO0FBRXJFLCtDQUFrRDtBQUNsRCwyQ0FBc0U7QUFDdEUsNkNBQWtEO0FBQ2xELDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFrQzFFOztHQUVHO0FBQ0gsTUFBYSxXQUFXOztJQUN0Qjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBZ0IsRUFBRSxLQUE2Qjs7Ozs7Ozs7OztRQUNoRSxPQUFPLElBQUksa0JBQWtCLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ2hEO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQTRCOzs7Ozs7Ozs7O1FBQ2pELE9BQU8sSUFBSSxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7S0FDdEM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsZUFBNEI7Ozs7Ozs7Ozs7UUFDakQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztLQUN0QztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGtCQUFrQixDQUFDLEtBQTRCOzs7Ozs7Ozs7O1FBQzNELE9BQU8sSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDbEM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBb0M7Ozs7Ozs7Ozs7UUFDOUQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM1Qjs7QUFsQ0gsa0NBbUNDO0FBcUdEOztHQUVHO0FBQ0gsTUFBTSxRQUFRLEdBQVcsTUFBTSxDQUFDO0FBcUhoQzs7Ozs7O0dBTUc7SUFFVSxLQUFLOzRCQURqQixvQ0FBa0I7Ozs7c0JBQ1EsdUJBQVM7cUJBQWpC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blZQQywgQ2ZuVlBDQ2lkckJsb2NrLCBEZWZhdWx0SW5zdGFuY2VUZW5hbmN5LCBJU3VibmV0LCBTdWJuZXRUeXBlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgeyBBcm4sIENmblJlc291cmNlLCBGZWF0dXJlRmxhZ3MsIExhenksIE5hbWVzLCBSZXNvdXJjZSwgVGFncyB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBEZXBlbmRlbmN5R3JvdXAsIElEZXBlbmRhYmxlIH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBJcGFtT3B0aW9ucywgSUlwYW1Qb29sIH0gZnJvbSAnLi9pcGFtJztcbmltcG9ydCB7IElWcGNWMiwgVnBjVjJCYXNlIH0gZnJvbSAnLi92cGMtdjItYmFzZSc7XG5pbXBvcnQgeyBJU3VibmV0VjIsIFN1Ym5ldFYyLCBTdWJuZXRWMkF0dHJpYnV0ZXMgfSBmcm9tICcuL3N1Ym5ldC12Mic7XG5pbXBvcnQgeyBjeF9hcGksIHJlZ2lvbl9pbmZvIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuXG4vKipcbiAqIEFkZGl0aW9uYWwgcHJvcHMgbmVlZGVkIGZvciBzZWNvbmRhcnkgQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlY29uZGFyeUFkZHJlc3NQcm9wcyB7XG4gIC8qKlxuICAgKiBSZXF1aXJlZCB0byBzZXQgU2Vjb25kYXJ5IGNpZHIgYmxvY2sgcmVzb3VyY2UgbmFtZVxuICAgKiBpbiBvcmRlciB0byBnZW5lcmF0ZSB1bmlxdWUgbG9naWNhbCBpZCBmb3IgdGhlIHJlc291cmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgY2lkckJsb2NrTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFkZGl0aW9uYWwgcHJvcHMgbmVlZGVkIGZvciBCWU9JUCBJUHY2IGFkZHJlc3MgcHJvcHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJcHY2UG9vbFNlY29uZGFyeUFkZHJlc3NQcm9wcyBleHRlbmRzIFNlY29uZGFyeUFkZHJlc3NQcm9wcyB7XG4gIC8qKlxuICAgKiBJRCBvZiB0aGUgSVB2NiBhZGRyZXNzIHBvb2wgZnJvbSB3aGljaCB0byBhbGxvY2F0ZSB0aGUgSVB2NiBDSURSIGJsb2NrLlxuICAgKiBOb3RlOiBCWU9JUCBQb29sIElEIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBJUEFNIFBvb2wgSUQuXG4gICAqIFRvIG9uYm9hcmQgeW91ciBJUHY2IGFkZHJlc3MgcmFuZ2UgdG8geW91ciBBV1MgYWNjb3VudCBwbGVhc2UgcmVmZXIgdG8gdGhlIGJlbG93IGRvY3VtZW50YXRpb25cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvYnlvaXAtb25ib2FyZC5odG1sXG4gICAqL1xuICByZWFkb25seSBpcHY2UG9vbElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdmFsaWQgSVB2NiBDSURSIGJsb2NrIGZyb20gdGhlIElQdjYgYWRkcmVzcyBwb29sIG9uYm9hcmRlZCB0byBBV1MgdXNpbmcgQllPSVAuXG4gICAqIFRoZSBtb3N0IHNwZWNpZmljIElQdjYgYWRkcmVzcyByYW5nZSB0aGF0IHlvdSBjYW4gYnJpbmcgaXMgLzQ4IGZvciBDSURScyB0aGF0IGFyZSBwdWJsaWNseSBhZHZlcnRpc2FibGVcbiAgICogYW5kIC81NiBmb3IgQ0lEUnMgdGhhdCBhcmUgbm90IHB1YmxpY2x5IGFkdmVydGlzYWJsZS5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvZWMyLWJ5b2lwLmh0bWwjYnlvaXAtZGVmaW5pdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGlwdjZDaWRyQmxvY2s6IHN0cmluZztcbn1cblxuLyoqXG4gKiBJcEFkZHJlc3Mgb3B0aW9ucyB0byBkZWZpbmUgVlBDIFYyXG4gKi9cbmV4cG9ydCBjbGFzcyBJcEFkZHJlc3NlcyB7XG4gIC8qKlxuICAgKiBBbiBJUHY0IENJRFIgUmFuZ2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXB2NChpcHY0Q2lkcjogc3RyaW5nLCBwcm9wcz86IFNlY29uZGFyeUFkZHJlc3NQcm9wcyk6IElJcEFkZHJlc3NlcyB7XG4gICAgcmV0dXJuIG5ldyBpcHY0Q2lkckFsbG9jYXRpb24oaXB2NENpZHIsIHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBJcHY0IElwYW0gUG9vbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpcHY0SXBhbShpcHY0SXBhbU9wdGlvbnM6IElwYW1PcHRpb25zKTogSUlwQWRkcmVzc2VzIHtcbiAgICByZXR1cm4gbmV3IElwYW1JcHY0KGlwdjRJcGFtT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQW4gSXB2NiBJcGFtIFBvb2xcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXB2NklwYW0oaXB2NklwYW1PcHRpb25zOiBJcGFtT3B0aW9ucyk6IElJcEFkZHJlc3NlcyB7XG4gICAgcmV0dXJuIG5ldyBJcGFtSXB2NihpcHY2SXBhbU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFtYXpvbiBQcm92aWRlZCBJcHY2IHJhbmdlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFtYXpvblByb3ZpZGVkSXB2Nihwcm9wczogU2Vjb25kYXJ5QWRkcmVzc1Byb3BzKSA6IElJcEFkZHJlc3NlcyB7XG4gICAgcmV0dXJuIG5ldyBBbWF6b25Qcm92aWRlZChwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogQSBCWU9JUCBJUHY2IGFkZHJlc3MgcG9vbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpcHY2QnlvaXBQb29sKHByb3BzOiBJcHY2UG9vbFNlY29uZGFyeUFkZHJlc3NQcm9wcyk6IElJcEFkZHJlc3NlcyB7XG4gICAgcmV0dXJuIG5ldyBJcHY2UG9vbChwcm9wcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb25zb2xpZGF0ZWQgcmV0dXJuIHBhcmFtZXRlcnMgdG8gcGFzcyB0byBWUEMgY29uc3RydWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVnBjQ2lkck9wdGlvbnMge1xuXG4gIC8qKlxuICAgKiBJUHY0IENJRFIgQmxvY2tcbiAgICpcbiAgICogQGRlZmF1bHQgJzEwLjAuMC4wLzE2J1xuICAgKi9cbiAgcmVhZG9ubHkgaXB2NENpZHJCbG9jaz86IHN0cmluZztcblxuICAvKipcbiAgICogQ0lEUiBNYXNrIGZvciBWcGNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBPbmx5IHJlcXVpcmVkIHdoZW4gdXNpbmcgSVBBTSBJcHY0XG4gICAqL1xuICByZWFkb25seSBpcHY0TmV0bWFza0xlbmd0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogSXB2NCBJUEFNIFBvb2xcbiAgICpcbiAgICogQGRlZmF1bHQgLSBPbmx5IHJlcXVpcmVkIHdoZW4gdXNpbmcgSVBBTSBJcHY0XG4gICAqL1xuICByZWFkb25seSBpcHY0SXBhbVBvb2w/OiBJSXBhbVBvb2w7XG5cbiAgLyoqXG4gICAqIENJRFIgTWFzayBmb3IgVnBjXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gT25seSByZXF1aXJlZCB3aGVuIHVzaW5nIEFXUyBJcGFtXG4gICAqL1xuICByZWFkb25seSBpcHY2TmV0bWFza0xlbmd0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogSXB2NiBJUEFNIHBvb2wgaWQgZm9yIFZQQyByYW5nZSwgY2FuIG9ubHkgYmUgZGVmaW5lZFxuICAgKiB1bmRlciBwdWJsaWMgc2NvcGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBwb29sIGlkXG4gICAqL1xuICByZWFkb25seSBpcHY2SXBhbVBvb2w/OiBJSXBhbVBvb2w7XG5cbiAgLyoqXG4gICAqIFVzZSBhbWF6b24gcHJvdmlkZWQgSVAgcmFuZ2VcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGFtYXpvblByb3ZpZGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGVwZW5kZW5jeSB0byBhc3NvY2lhdGUgSXB2NiBDSURSIGJsb2NrXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZGVwZW5kZW5jeVxuICAgKi9cbiAgcmVhZG9ubHkgZGVwZW5kZW5jaWVzPzogQ2ZuUmVzb3VyY2VbXTtcblxuICAvKipcbiAgICogUmVxdWlyZWQgdG8gc2V0IFNlY29uZGFyeSBjaWRyIGJsb2NrIHJlc291cmNlIG5hbWVcbiAgICogaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdW5pcXVlIGxvZ2ljYWwgaWQgZm9yIHRoZSByZXNvdXJjZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBuYW1lIGZvciBwcmltYXJ5IGFkZHJlc3Nlc1xuICAgKi9cbiAgcmVhZG9ubHkgY2lkckJsb2NrTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogSVB2NCBDSURSIHByb3Zpc2lvbmVkIHVuZGVyIHBvb2xcbiAgICogUmVxdWlyZWQgdG8gY2hlY2sgZm9yIG92ZXJsYXBwaW5nIENJRFJzIGFmdGVyIHByb3Zpc2lvbmluZ1xuICAgKiBpcyBjb21wbGV0ZSB1bmRlciBJUEFNIHBvb2xcbiAgICogQGRlZmF1bHQgLSBubyBJUEFNIElQdjQgQ0lEUiByYW5nZSBpcyBwcm92aXNpb25lZCB1c2luZyBJUEFNXG4gICAqL1xuICByZWFkb25seSBpcHY0SXBhbVByb3Zpc2lvbmVkQ2lkcnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogSVB2NiBDSURSIGJsb2NrIGZyb20gdGhlIEJPWUlQIElQdjYgYWRkcmVzcyBwb29sLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGlwdjZDaWRyQmxvY2s/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElEIG9mIHRoZSBCWU9JUCBJUHY2IGFkZHJlc3MgcG9vbCBmcm9tIHdoaWNoIHRvIGFsbG9jYXRlIHRoZSBJUHY2IENJRFIgYmxvY2suXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgaXB2NlBvb2xJZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIGlwIGFkZHJlc3MgYWxsb2NhdGlvbiBhY2NvcmRpbmcgdG8gdGhlIElQQWRyZXNzIHR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSXBBZGRyZXNzZXMge1xuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gZGVmaW5lIHRoZSBpbXBsZW1lbnRhdGlvbiBsb2dpYyBvZlxuICAgKiBJUCBhZGRyZXNzIGFsbG9jYXRpb25cbiAgICovXG4gIGFsbG9jYXRlVnBjQ2lkcigpIDogVnBjQ2lkck9wdGlvbnM7XG5cbn1cblxuLyoqXG4gKiBOYW1lIHRhZyBjb25zdGFudFxuICovXG5jb25zdCBOQU1FX1RBRzogc3RyaW5nID0gJ05hbWUnO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgdG8gZGVmaW5lIFZQQ1xuICogW2Rpc2FibGUtYXdzbGludDpmcm9tLW1ldGhvZF1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWcGNWMlByb3BzIHtcblxuICAvKiogQSBtdXN0IElQdjQgQ0lEUiBibG9jayBmb3IgdGhlIFZQQ1xuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS92cGMtY2lkci1ibG9ja3MuaHRtbFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElwdjQgQ0lEUiBCbG9jayAoJzEwLjAuMC4wLzE2JylcbiAgICovXG4gIHJlYWRvbmx5IHByaW1hcnlBZGRyZXNzQmxvY2s/OiBJSXBBZGRyZXNzZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBzZWNvbmRhcnkgQ0lEUiBibG9ja3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBWUEMuXG4gICAqIENhbiBiZSAgSVB2NCBvciBJUHY2LCB0d28gSVB2NCByYW5nZXMgbXVzdCBmb2xsb3cgUkZDIzE5MTggY29udmVudGlvblxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdnBjL2xhdGVzdC91c2VyZ3VpZGUvdnBjLWNpZHItYmxvY2tzLmh0bWwjdnBjLXJlc2l6ZX0uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gc2Vjb25kYXJ5IElQIGFkZHJlc3NcbiAgICovXG4gIHJlYWRvbmx5IHNlY29uZGFyeUFkZHJlc3NCbG9ja3M/OiBJSXBBZGRyZXNzZXNbXTtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RhbmNlcyBsYXVuY2hlZCBpbiB0aGUgVlBDIGdldCBETlMgaG9zdG5hbWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVEbnNIb3N0bmFtZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgRE5TIHJlc29sdXRpb24gaXMgc3VwcG9ydGVkIGZvciB0aGUgVlBDLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVEbnNTdXBwb3J0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgdGVuYW5jeSBvZiBpbnN0YW5jZXMgbGF1bmNoZWQgaW50byB0aGUgVlBDLlxuICAgKlxuICAgKiBCeSBzZXR0aW5nIHRoaXMgdG8gZGVkaWNhdGVkIHRlbmFuY3ksIGluc3RhbmNlcyB3aWxsIGJlIGxhdW5jaGVkIG9uXG4gICAqIGhhcmR3YXJlIGRlZGljYXRlZCB0byBhIHNpbmdsZSBBV1MgY3VzdG9tZXIsIHVubGVzcyBzcGVjaWZpY2FsbHkgc3BlY2lmaWVkXG4gICAqIGF0IGluc3RhbmNlIGxhdW5jaCB0aW1lLiBQbGVhc2Ugbm90ZSwgbm90IGFsbCBpbnN0YW5jZSB0eXBlcyBhcmUgdXNhYmxlXG4gICAqIHdpdGggRGVkaWNhdGVkIHRlbmFuY3kuXG4gICAqXG4gICAqIEBkZWZhdWx0IERlZmF1bHRJbnN0YW5jZVRlbmFuY3kuRGVmYXVsdCAoc2hhcmVkKSB0ZW5hbmN5XG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0SW5zdGFuY2VUZW5hbmN5PzogRGVmYXVsdEluc3RhbmNlVGVuYW5jeTtcblxuICAvKipcbiAgICogUGh5c2ljYWwgbmFtZSBmb3IgdGhlIFZQQ1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIGF1dG9nZW5lcmF0ZWQgYnkgQ0RLXG4gICAqL1xuICByZWFkb25seSB2cGNOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgdG8gaW1wb3J0IGEgVlBDIGNyZWF0ZWQgb3V0c2lkZSBvZiBDREsgc3RhY2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWcGNWMkF0dHJpYnV0ZXMge1xuXG4gIC8qKlxuICAgKiBUaGUgVlBDIElEXG4gICAqIFJlZmVycyB0byBwaHlzaWNhbCBJZCBvZiB0aGUgcmVzb3VyY2VcbiAgICovXG4gIHJlYWRvbmx5IHZwY0lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlZ2lvbiBpbiB3aGljaCBpbXBvcnRlZCBWUEMgaXMgaG9zdGVkXG4gICAqIHJlcXVpcmVkIGluIGNhc2Ugb2YgY3Jvc3MgcmVnaW9uIFZQQ1xuICAgKiBhcyBnaXZlbiB2YWx1ZSB3aWxsIGJlIHVzZWQgdG8gc2V0IGZpZWxkIHJlZ2lvbiBmb3IgaW1wb3J0ZWQgVlBDLFxuICAgKiB3aGljaCB0aGVuIGxhdGVyIGNhbiBiZSB1c2VkIGZvciBlc3RhYmxpc2hpbmcgVlBDIHBlZXJpbmcgY29ubmVjdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBjb25zdHJ1Y3RlZCB3aXRoIHN0YWNrIHJlZ2lvbiB2YWx1ZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIEFXUyBhY2NvdW50IHRoYXQgb3ducyB0aGUgaW1wb3J0ZWQgVlBDXG4gICAqIHJlcXVpcmVkIGluIGNhc2Ugb2YgY3Jvc3MgYWNjb3VudCBWUENcbiAgICogYXMgZ2l2ZW4gdmFsdWUgd2lsbCBiZSB1c2VkIHRvIHNldCBmaWVsZCBhY2NvdW50IGZvciBpbXBvcnRlZCBWUEMsXG4gICAqIHdoaWNoIHRoZW4gbGF0ZXIgY2FuIGJlIHVzZWQgZm9yIGVzdGFibGlzaGluZyBWUEMgcGVlcmluZyBjb25uZWN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGNvbnN0cnVjdGVkIHdpdGggc3RhY2sgYWNjb3VudCB2YWx1ZVxuICAgKi9cbiAgcmVhZG9ubHkgb3duZXJBY2NvdW50SWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByaW1hcnkgVlBDIENJRFIgQmxvY2sgb2YgdGhlIGltcG9ydGVkIFZQQ1xuICAgKiBDYW4gb25seSBiZSBJUHY0XG4gICAqL1xuICByZWFkb25seSB2cGNDaWRyQmxvY2s6IHN0cmluZztcblxuICAvKipcbiAgICogQSBWUE4gR2F0ZXdheSBpcyBhdHRhY2hlZCB0byB0aGUgVlBDXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gVlBOIEdhdGV3YXlcbiAgICovXG4gIHJlYWRvbmx5IHZwbkdhdGV3YXlJZD86IHN0cmluZztcblxuICAvKipcbiAgICogU3VibmV0cyBhc3NvY2lhdGVkIHdpdGggaW1wb3J0ZWQgVlBDXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gc3VibmV0cyBwcm92aWRlZCB0byBiZSBpbXBvcnRlZFxuICAgKi9cbiAgcmVhZG9ubHkgc3VibmV0cz86IFN1Ym5ldFYyQXR0cmlidXRlc1tdO1xuXG4gIC8qKlxuICAgKiBJbXBvcnQgU2Vjb25kYXJ5IENJRFIgYmxvY2tzIGFzc29jaWF0ZWQgd2l0aCBWUENcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBzZWNvbmRhcnkgSVAgYWRkcmVzc1xuICAgKi9cbiAgcmVhZG9ubHkgc2Vjb25kYXJ5Q2lkckJsb2Nrcz86IFZQQ0NpZHJCbG9ja2F0dHJpYnV0ZXNbXTtcbn1cblxuLyoqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgZm91bmRhdGlvbiBmb3IgY3JlYXRpbmcgYW5kIGNvbmZpZ3VyaW5nIGEgVlBDIHdpdGggYWR2YW5jZWQgZmVhdHVyZXMgc3VjaCBhcyBJUEFNIChJUCBBZGRyZXNzIE1hbmFnZW1lbnQpIGFuZCBJUHY2IHN1cHBvcnQuXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jZGsvYXBpL3YyL2RvY3MvYXdzLWNkay1saWIuYXdzX2VjMi5WcGMuaHRtbHxBV1MgQ0RLIERvY3VtZW50YXRpb24gb24gVlBDc30uXG4gKlxuICogQHJlc291cmNlIEFXUzo6RUMyOjpWUENcbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIFZwY1YyIGV4dGVuZHMgVnBjVjJCYXNlIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtZWMyLWFscGhhLlZwY1YyJztcblxuICAvKipcbiAgICogQ3JlYXRlIGEgVlBDIGZyb20gZXhpc3RpbmcgYXR0cmlidXRlc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tVnBjVjJBdHRyaWJ1dGVzKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGF0dHJzOiBWcGNWMkF0dHJpYnV0ZXMpOiBJVnBjVjIge1xuICAgIC8qKlxuICAgICAqIEludGVybmFsIGNsYXNzIHRvIGFsbG93IHVzZXJzIHRvIGltcG9ydCBWUENcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjbGFzcyBJbXBvcnRlZFZwY1YyIGV4dGVuZHMgVnBjVjJCYXNlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSB2cGNJZDogc3RyaW5nO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHZwY0Fybjogc3RyaW5nO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHB1YmxpY1N1Ym5ldHM6IElTdWJuZXRWMltdID0gW107XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcHJpdmF0ZVN1Ym5ldHM6IElTdWJuZXRWMltdID0gW107XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgaXNvbGF0ZWRTdWJuZXRzOiBJU3VibmV0VjJbXSA9IFtdO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGludGVybmV0Q29ubmVjdGl2aXR5RXN0YWJsaXNoZWQ6IElEZXBlbmRhYmxlID0gbmV3IERlcGVuZGVuY3lHcm91cCgpO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGlwdjRDaWRyQmxvY2s6IHN0cmluZztcbiAgICAgIHB1YmxpYyByZWFkb25seSByZWdpb246IHN0cmluZztcbiAgICAgIHB1YmxpYyByZWFkb25seSBvd25lckFjY291bnRJZDogc3RyaW5nO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHZwY05hbWU/OiBzdHJpbmc7XG4gICAgICBwcml2YXRlIHJlYWRvbmx5IF9wYXJ0aXRpb24/OiBzdHJpbmc7XG5cbiAgICAgIC8qXG4gICAgICAqIFJlZmVyZW5jZSB0byBhbGwgc2Vjb25kYXJ5IGJsb2NrcyBhdHRhY2hlZFxuICAgICAgKi9cbiAgICAgIHB1YmxpYyByZWFkb25seSBzZWNvbmRhcnlDaWRyQmxvY2s/OiBJVlBDQ2lkckJsb2NrW107XG5cbiAgICAgIC8qKlxuICAgICAgICogUmVmZXJzIHRvIGFjdHVhbCBWUEMgUmVzb3VyY2UgYXR0cmlidXRlIGluIG5vbi1pbXBvcnRlZCBWUENcbiAgICAgICAqIFJlcXVpcmVkIHRvIGltcGxlbWVudCBoZXJlIGR1ZSB0byBleHRlbnNpb24gZnJvbSBCYXNlIGNsYXNzXG4gICAgICAgKi9cbiAgICAgIHB1YmxpYyByZWFkb25seSB2cGNDaWRyQmxvY2s6IHN0cmluZztcblxuICAgICAgLy8gUmVxdWlyZWQgdG8gZG8gQ0lEUiByYW5nZSB0ZXN0IG9uIGltcG9ydGVkIFZQQ3MgdG8gY3JlYXRlIG5ldyBzdWJuZXRzXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgaXB2NElwYW1Qcm92aXNpb25lZENpZHJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBjb25zdHJ1Y3Rvcihjb25zdHJ1Y3Q6IENvbnN0cnVjdCwgY29uc3RydWN0SWQ6IHN0cmluZywgcHJvcHM6IFZwY1YyQXR0cmlidXRlcykge1xuICAgICAgICBzdXBlcihjb25zdHJ1Y3QsIGNvbnN0cnVjdElkKTtcbiAgICAgICAgdGhpcy52cGNJZCA9IHByb3BzLnZwY0lkLFxuICAgICAgICB0aGlzLnJlZ2lvbiA9IHByb3BzLnJlZ2lvbiA/PyB0aGlzLnN0YWNrLnJlZ2lvbixcbiAgICAgICAgdGhpcy5vd25lckFjY291bnRJZCA9IHByb3BzLm93bmVyQWNjb3VudElkID8/IHRoaXMuc3RhY2suYWNjb3VudCxcbiAgICAgICAgdGhpcy5fcGFydGl0aW9uID0gcmVnaW9uX2luZm8uUmVnaW9uSW5mby5nZXQodGhpcy5yZWdpb24pLnBhcnRpdGlvbixcbiAgICAgICAgdGhpcy52cGNBcm4gPSBBcm4uZm9ybWF0KHtcbiAgICAgICAgICBzZXJ2aWNlOiAnZWMyJyxcbiAgICAgICAgICByZXNvdXJjZTogJ3ZwYycsXG4gICAgICAgICAgcmVzb3VyY2VOYW1lOiB0aGlzLnZwY0lkLFxuICAgICAgICAgIHJlZ2lvbjogdGhpcy5yZWdpb24sXG4gICAgICAgICAgYWNjb3VudDogdGhpcy5vd25lckFjY291bnRJZCxcbiAgICAgICAgICBwYXJ0aXRpb246IHRoaXMuX3BhcnRpdGlvbixcbiAgICAgICAgfSwgdGhpcy5zdGFjayk7XG5cbiAgICAgICAgLy8gUG9wdWxhdGUgcmVnaW9uIGFuZCBhY2NvdW50IGZpZWxkcyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldCB1cCBwZWVyaW5nIGNvbm5lY3Rpb25cbiAgICAgICAgLy8gc2FtcGxlIHZwYyBBcm4gLSBhcm46YXdzOmVjMjp1cy13ZXN0LTI6MTIzNDU2Nzg5MDEyOnZwYy92cGMtMDEyMzQ1Njc4OWFiY2RlZjBcbiAgICAgICAgdGhpcy5yZWdpb24gPSB0aGlzLnZwY0Fybi5zcGxpdCgnOicpWzNdO1xuICAgICAgICB0aGlzLm93bmVyQWNjb3VudElkID0gdGhpcy52cGNBcm4uc3BsaXQoJzonKVs0XTtcbiAgICAgICAgLy8gUmVmZXJzIHRvIGFjdHVhbCBWUEMgUmVzb3VyY2UgYXR0cmlidXRlIGluIG5vbi1pbXBvcnRlZCBWUENcbiAgICAgICAgdGhpcy52cGNDaWRyQmxvY2sgPSBwcm9wcy52cGNDaWRyQmxvY2s7XG4gICAgICAgIC8vIFJlcXVpcmVkIGZvciBzdWJuZXQgcmFuZ2UgcmVsYXRlZCBjaGVja3NcbiAgICAgICAgdGhpcy5pcHY0Q2lkckJsb2NrID0gcHJvcHMudnBjQ2lkckJsb2NrO1xuICAgICAgICB0aGlzLl92cG5HYXRld2F5SWQgPSBwcm9wcy52cG5HYXRld2F5SWQ7XG5cbiAgICAgICAgaWYgKHByb3BzLnN1Ym5ldHMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHN1Ym5ldCBvZiBwcm9wcy5zdWJuZXRzKSB7XG4gICAgICAgICAgICBpZiAoc3VibmV0LnN1Ym5ldFR5cGUgPT09IFN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTUyB8fCBzdWJuZXQuc3VibmV0VHlwZSA9PT0gU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfTkFUIHx8XG4gICAgICAgICAgICAgIHN1Ym5ldC5zdWJuZXRUeXBlIGFzIHN0cmluZyA9PT0gJ0RlcHJlY2F0ZWRfUHJpdmF0ZScpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcml2YXRlU3VibmV0cy5wdXNoKFN1Ym5ldFYyLmZyb21TdWJuZXRWMkF0dHJpYnV0ZXMoc2NvcGUsIHN1Ym5ldC5zdWJuZXROYW1lPz8gJ0ltcG9ydGVkUHJpdmF0ZVN1Ym5ldCcsIHN1Ym5ldCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJuZXQuc3VibmV0VHlwZSA9PT0gU3VibmV0VHlwZS5QVUJMSUMpIHtcbiAgICAgICAgICAgICAgdGhpcy5wdWJsaWNTdWJuZXRzLnB1c2goU3VibmV0VjIuZnJvbVN1Ym5ldFYyQXR0cmlidXRlcyhzY29wZSwgc3VibmV0LnN1Ym5ldE5hbWU/PyAnSW1wb3J0ZWRQdWJsaWNTdWJuZXQnLCBzdWJuZXQpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VibmV0LnN1Ym5ldFR5cGUgYXMgc3RyaW5nID09PSAnRGVwcmVjYXRlZF9Jc29sYXRlZCcgfHwgc3VibmV0LnN1Ym5ldFR5cGUgPT09IFN1Ym5ldFR5cGUuUFJJVkFURV9JU09MQVRFRCkge1xuICAgICAgICAgICAgICB0aGlzLmlzb2xhdGVkU3VibmV0cy5wdXNoKFN1Ym5ldFYyLmZyb21TdWJuZXRWMkF0dHJpYnV0ZXMoc2NvcGUsIHN1Ym5ldC5zdWJuZXROYW1lPz8gJ0ltcG9ydGVkSXNvbGF0ZWRTdWJuZXQnLCBzdWJuZXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWNvbmRhcnlDaWRyQmxvY2sgPSBwcm9wcy5zZWNvbmRhcnlDaWRyQmxvY2tzPy5tYXAoY2lkckJsb2NrID0+IFZQQ0NpZHJCbG9jay5mcm9tVlBDQ2lkckJsb2NrYXR0cmlidXRlcyhzY29wZSwgY2lkckJsb2NrLmNpZHJCbG9ja05hbWUgPz8gJ0ltcG9ydGVkU2Vjb25kYXJ5Q2lkckJsb2NrJywgeyAuLi5jaWRyQmxvY2sgfSkpO1xuICAgICAgICBpZiAocHJvcHMuc2Vjb25kYXJ5Q2lkckJsb2Nrcykge1xuICAgICAgICAgIGZvciAoY29uc3QgY2lkckJsb2NrIG9mIHByb3BzLnNlY29uZGFyeUNpZHJCbG9ja3MpIHtcbiAgICAgICAgICAgIGlmIChjaWRyQmxvY2suaXB2NElwYW1Qcm92aXNpb25lZENpZHJzKSB7XG4gICAgICAgICAgICAgIHRoaXMuaXB2NElwYW1Qcm92aXNpb25lZENpZHJzLnB1c2goLi4uY2lkckJsb2NrLmlwdjRJcGFtUHJvdmlzaW9uZWRDaWRycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW1wb3J0ZWRWcGNWMihzY29wZSwgaWQsIGF0dHJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZGVudGlmaWVyIGZvciB0aGlzIFZQQ1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZwY0lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2cGNBcm46IHN0cmluZztcblxuICAvKipcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZwY0NpZHJCbG9jazogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIElQdjYgQ0lEUiBibG9ja3MgZm9yIHRoZSBWUEMuXG4gICAqXG4gICAqIFNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtZWMyLXZwYy5odG1sI2F3cy1yZXNvdXJjZS1lYzItdnBjLXJldHVybi12YWx1ZXNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpcHY2Q2lkckJsb2Nrczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBwcm92aWRlciBvZiBpcHY0IGFkZHJlc3Nlc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwQWRkcmVzc2VzOiBJSXBBZGRyZXNzZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBBV1MgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgcmVwcmVzZW50aW5nIHRoZSBWUEMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2U6IENmblZQQztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIGluc3RhbmNlcyBsYXVuY2hlZCBpbiB0aGlzIFZQQyB3aWxsIGhhdmUgcHVibGljIEROUyBob3N0bmFtZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZG5zSG9zdG5hbWVzRW5hYmxlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIEROUyBzdXBwb3J0IGlzIGVuYWJsZWQgZm9yIHRoaXMgVlBDLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRuc1N1cHBvcnRFbmFibGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJc29sYXRlZCBTdWJuZXRzIHRoYXQgYXJlIHBhcnQgb2YgdGhpcyBWUEMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNvbGF0ZWRTdWJuZXRzOiBJU3VibmV0W107XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBTdWJuZXRzIHRoYXQgYXJlIHBhcnQgb2YgdGhpcyBWUEMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHVibGljU3VibmV0czogSVN1Ym5ldFtdO1xuXG4gIC8qKlxuICAgKiBQdWJsaWMgU3VibmV0cyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgVlBDLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByaXZhdGVTdWJuZXRzOiBJU3VibmV0W107XG5cbiAgLyoqXG4gICAqIFRvIGRlZmluZSBkZXBlbmRlbmN5IG9uIGludGVybmV0IGNvbm5lY3Rpdml0eVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGludGVybmV0Q29ubmVjdGl2aXR5RXN0YWJsaXNoZWQ6IElEZXBlbmRhYmxlO1xuXG4gIC8qKlxuICAgKiByZWZlcmVuY2UgdG8gYWxsIHNlY29uZGFyeSBibG9ja3MgYXR0YWNoZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzZWNvbmRhcnlDaWRyQmxvY2s/OiBJVlBDQ2lkckJsb2NrW10gPSBuZXcgQXJyYXk8SVZQQ0NpZHJCbG9jaz47XG5cbiAgLyoqXG4gICAqIElQdjQgQ0lEUiBwcm92aXNpb25lZCB1c2luZyBJUEFNIHBvb2xcbiAgICogUmVxdWlyZWQgdG8gY2hlY2sgZm9yIG92ZXJsYXBwaW5nIENJRFJzIGFmdGVyIHByb3Zpc2lvbmluZ1xuICAgKiBpcyBjb21wbGV0ZSB1bmRlciBJUEFNXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXB2NElwYW1Qcm92aXNpb25lZENpZHJzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFJlZ2lvbiBmb3IgdGhpcyBWUENcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZWdpb246IHN0cmluZztcblxuICAvKipcbiAgICogSWRlbnRpZmllciBvZiB0aGUgb3duZXIgZm9yIHRoaXMgVlBDXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgb3duZXJBY2NvdW50SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogRm9yIHZhbGlkYXRpb24gdG8gZGVmaW5lIElQdjYgc3VibmV0cywgc2V0IHRvIHRydWUgaW4gY2FzZSBvZlxuICAgKiBBbWF6b24gUHJvdmlkZWQgSVB2NiBjaWRyIHJhbmdlXG4gICAqIGlmIHRydWUsIElQdjYgYWRkcmVzc2VzIGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgc3VibmV0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VJcHY2OiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFZwY05hbWUgdG8gYmUgdXNlZCBmb3IgdGFnZ2luZyBpdHMgY29tcG9uZW50c1xuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdnBjTmFtZT86IHN0cmluZztcblxuICBwdWJsaWMgcmVhZG9ubHkgaXB2NENpZHJCbG9jazogc3RyaW5nID0gJyc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFZwY1YyUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOiBwcm9wcy52cGNOYW1lID8/IExhenkuc3RyaW5nKHtcbiAgICAgICAgcHJvZHVjZTogKCkgPT4gTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHsgbWF4TGVuZ3RoOiAxMjgsIGFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyczogJ18nIH0pLFxuICAgICAgfSksXG4gICAgfSk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG4gICAgdGhpcy52cGNOYW1lID0gcHJvcHMudnBjTmFtZTtcbiAgICB0aGlzLmlwQWRkcmVzc2VzID0gcHJvcHMucHJpbWFyeUFkZHJlc3NCbG9jayA/PyBJcEFkZHJlc3Nlcy5pcHY0KCcxMC4wLjAuMC8xNicpO1xuICAgIGNvbnN0IHZwY09wdGlvbnMgPSB0aGlzLmlwQWRkcmVzc2VzLmFsbG9jYXRlVnBjQ2lkcigpO1xuXG4gICAgdGhpcy5kbnNIb3N0bmFtZXNFbmFibGVkID0gcHJvcHMuZW5hYmxlRG5zSG9zdG5hbWVzID09IG51bGwgPyB0cnVlIDogcHJvcHMuZW5hYmxlRG5zSG9zdG5hbWVzO1xuICAgIHRoaXMuZG5zU3VwcG9ydEVuYWJsZWQgPSBwcm9wcy5lbmFibGVEbnNTdXBwb3J0ID09IG51bGwgPyB0cnVlIDogcHJvcHMuZW5hYmxlRG5zU3VwcG9ydDtcbiAgICBjb25zdCBpbnN0YW5jZVRlbmFuY3kgPSBwcm9wcy5kZWZhdWx0SW5zdGFuY2VUZW5hbmN5IHx8ICdkZWZhdWx0JztcbiAgICB0aGlzLnJlc291cmNlID0gbmV3IENmblZQQyh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBjaWRyQmxvY2s6IHZwY09wdGlvbnMuaXB2NENpZHJCbG9jaywgLy8gZm9yIElwdjQgYWRkcmVzc2VzIENJRFIgYmxvY2tcbiAgICAgIGVuYWJsZURuc0hvc3RuYW1lczogdGhpcy5kbnNIb3N0bmFtZXNFbmFibGVkLFxuICAgICAgZW5hYmxlRG5zU3VwcG9ydDogdGhpcy5kbnNTdXBwb3J0RW5hYmxlZCxcbiAgICAgIGlwdjRJcGFtUG9vbElkOiB2cGNPcHRpb25zLmlwdjRJcGFtUG9vbD8uaXBhbVBvb2xJZCwgLy8gZm9yIElwdjQgaXBhbSBvcHRpb25cbiAgICAgIGlwdjROZXRtYXNrTGVuZ3RoOiB2cGNPcHRpb25zLmlwdjROZXRtYXNrTGVuZ3RoLCAvLyBmb3IgSXB2NCBpcGFtIG9wdGlvblxuICAgICAgaW5zdGFuY2VUZW5hbmN5OiBpbnN0YW5jZVRlbmFuY3ksXG4gICAgfSk7XG5cbiAgICB0aGlzLm5vZGUuZGVmYXVsdENoaWxkID0gdGhpcy5yZXNvdXJjZTtcbiAgICB0aGlzLnZwY0NpZHJCbG9jayA9IHRoaXMucmVzb3VyY2UuYXR0ckNpZHJCbG9jaztcbiAgICBpZiAodnBjT3B0aW9ucy5pcHY0Q2lkckJsb2NrKSB7XG4gICAgICB0aGlzLmlwdjRDaWRyQmxvY2sgPSB2cGNPcHRpb25zLmlwdjRDaWRyQmxvY2s7XG4gICAgfVxuICAgIHRoaXMuaXB2NkNpZHJCbG9ja3MgPSB0aGlzLnJlc291cmNlLmF0dHJJcHY2Q2lkckJsb2NrcztcbiAgICB0aGlzLnZwY0lkID0gRmVhdHVyZUZsYWdzLm9mKHRoaXMpLmlzRW5hYmxlZChjeF9hcGkuVVNFX1JFU09VUkNFSURfRk9SX1ZQQ1YyX01JR1JBVElPTikgP1xuICAgICAgdGhpcy5yZXNvdXJjZS5yZWYgOiB0aGlzLnJlc291cmNlLmF0dHJWcGNJZDtcbiAgICB0aGlzLnZwY0FybiA9IEFybi5mb3JtYXQoe1xuICAgICAgc2VydmljZTogJ2VjMicsXG4gICAgICByZXNvdXJjZTogJ3ZwYycsXG4gICAgICByZXNvdXJjZU5hbWU6IHRoaXMudnBjSWQsXG4gICAgfSwgdGhpcy5zdGFjayk7XG4gICAgdGhpcy5yZWdpb24gPSB0aGlzLnN0YWNrLnJlZ2lvbjtcbiAgICB0aGlzLm93bmVyQWNjb3VudElkID0gdGhpcy5zdGFjay5hY2NvdW50O1xuICAgIC8vIEFkZCB0YWcgdG8gdGhlIFZQQyB3aXRoIHRoZSBuYW1lIHByb3ZpZGVkIGluIHByb3BlcnRpZXNcbiAgICBUYWdzLm9mKHRoaXMpLmFkZChOQU1FX1RBRywgcHJvcHMudnBjTmFtZSB8fCB0aGlzLm5vZGUucGF0aCk7XG4gICAgaWYgKHByb3BzLnNlY29uZGFyeUFkZHJlc3NCbG9ja3MpIHtcbiAgICAgIGNvbnN0IHNlY29uZGFyeUFkZHJlc3NCbG9ja3M6IElJcEFkZHJlc3Nlc1tdID0gcHJvcHMuc2Vjb25kYXJ5QWRkcmVzc0Jsb2NrcztcblxuICAgICAgZm9yIChjb25zdCBzZWNvbmRhcnlBZGRyZXNzQmxvY2sgb2Ygc2Vjb25kYXJ5QWRkcmVzc0Jsb2Nrcykge1xuICAgICAgICBjb25zdCBzZWNvbmRhcnlWcGNPcHRpb25zOiBWcGNDaWRyT3B0aW9ucyA9IHNlY29uZGFyeUFkZHJlc3NCbG9jay5hbGxvY2F0ZVZwY0NpZHIoKTtcbiAgICAgICAgaWYgKCFzZWNvbmRhcnlWcGNPcHRpb25zLmNpZHJCbG9ja05hbWUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NpZHIgQmxvY2sgTmFtZSBpcyByZXF1aXJlZCB0byBjcmVhdGUgc2Vjb25kYXJ5IElQIGFkZHJlc3MnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWNvbmRhcnlWcGNPcHRpb25zLmFtYXpvblByb3ZpZGVkIHx8IHNlY29uZGFyeVZwY09wdGlvbnMuaXB2NklwYW1Qb29sIHx8IHNlY29uZGFyeVZwY09wdGlvbnMuaXB2NlBvb2xJZCkge1xuICAgICAgICAgIHRoaXMudXNlSXB2NiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdmFsaWRhdGUgQ0lEUiByYW5nZXMgcGVyIFJGQyAxOTE4XG4gICAgICAgIGlmIChzZWNvbmRhcnlWcGNPcHRpb25zLmlwdjRDaWRyQmxvY2shKSB7XG4gICAgICAgICAgY29uc3QgcmV0ID0gdmFsaWRhdGVJcHY0YWRkcmVzcyhzZWNvbmRhcnlWcGNPcHRpb25zLmlwdjRDaWRyQmxvY2ssIHRoaXMucmVzb3VyY2UuY2lkckJsb2NrKTtcbiAgICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDSURSIGJsb2NrIHNob3VsZCBiZSBpbiB0aGUgc2FtZSBSRkMgMTkxOCByYW5nZSBpbiB0aGUgVlBDJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzZWNvbmRhcnlWcGNPcHRpb25zLmlwdjRJcGFtUHJvdmlzaW9uZWRDaWRycyEpIHtcbiAgICAgICAgICB0aGlzLmlwdjRJcGFtUHJvdmlzaW9uZWRDaWRycz8ucHVzaCguLi5zZWNvbmRhcnlWcGNPcHRpb25zLmlwdjRJcGFtUHJvdmlzaW9uZWRDaWRycyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdnBjQ2lkckJsb2NrID0gbmV3IFZQQ0NpZHJCbG9jayh0aGlzLCBzZWNvbmRhcnlWcGNPcHRpb25zLmNpZHJCbG9ja05hbWUsIHtcbiAgICAgICAgICB2cGNJZDogdGhpcy52cGNJZCxcbiAgICAgICAgICBjaWRyQmxvY2s6IHNlY29uZGFyeVZwY09wdGlvbnMuaXB2NENpZHJCbG9jayxcbiAgICAgICAgICBpcHY0SXBhbVBvb2xJZDogc2Vjb25kYXJ5VnBjT3B0aW9ucy5pcHY0SXBhbVBvb2w/LmlwYW1Qb29sSWQsXG4gICAgICAgICAgaXB2NE5ldG1hc2tMZW5ndGg6IHNlY29uZGFyeVZwY09wdGlvbnMuaXB2NE5ldG1hc2tMZW5ndGgsXG4gICAgICAgICAgaXB2Nk5ldG1hc2tMZW5ndGg6IHNlY29uZGFyeVZwY09wdGlvbnMuaXB2Nk5ldG1hc2tMZW5ndGgsXG4gICAgICAgICAgaXB2NklwYW1Qb29sSWQ6IHNlY29uZGFyeVZwY09wdGlvbnMuaXB2NklwYW1Qb29sPy5pcGFtUG9vbElkLFxuICAgICAgICAgIGFtYXpvblByb3ZpZGVkSXB2NkNpZHJCbG9jazogc2Vjb25kYXJ5VnBjT3B0aW9ucy5hbWF6b25Qcm92aWRlZCxcbiAgICAgICAgICAvLyBCWU9JUCBJUHY2IEFkZHJlc3NcbiAgICAgICAgICBpcHY2Q2lkckJsb2NrOiBzZWNvbmRhcnlWcGNPcHRpb25zPy5pcHY2Q2lkckJsb2NrLFxuICAgICAgICAgIC8vIEJZT0lQIFBvb2wgZm9yIElQdjYgYWRkcmVzc1xuICAgICAgICAgIGlwdjZQb29sOiBzZWNvbmRhcnlWcGNPcHRpb25zPy5pcHY2UG9vbElkLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHNlY29uZGFyeVZwY09wdGlvbnMuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBkZXAgb2Ygc2Vjb25kYXJ5VnBjT3B0aW9ucy5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgIHZwY0NpZHJCbG9jay5ub2RlLmFkZERlcGVuZGVuY3koZGVwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ3JlYXRlIHNlY29uZGFyeSBibG9ja3MgZm9yIElwdjQgYW5kIElwdjZcbiAgICAgICAgdGhpcy5zZWNvbmRhcnlDaWRyQmxvY2s/LnB1c2godnBjQ2lkckJsb2NrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbXB0eSBhcnJheSBmb3IgaXNvbGF0ZWQgc3VibmV0c1xuICAgICAqL1xuICAgIHRoaXMuaXNvbGF0ZWRTdWJuZXRzID0gbmV3IEFycmF5PElTdWJuZXQ+O1xuXG4gICAgLyoqXG4gICAgICogRW1wdHkgYXJyYXkgZm9yIHB1YmxpYyBzdWJuZXRzXG4gICAgICovXG4gICAgdGhpcy5wdWJsaWNTdWJuZXRzID0gbmV3IEFycmF5PElTdWJuZXQ+O1xuXG4gICAgLyoqXG4gICAgICogRW1wdHkgYXJyYXkgZm9yIHByaXZhdGUgc3VibmV0c1xuICAgICAqL1xuICAgIHRoaXMucHJpdmF0ZVN1Ym5ldHMgPSBuZXcgQXJyYXk8SVN1Ym5ldD47XG5cbiAgICAvKipcbiAgICAgKiBEZXBlbmRhYmxlIHRoYXQgY2FuIGJlIGRlcGVuZGVkIHVwb24gdG8gZm9yY2UgaW50ZXJuZXQgY29ubmVjdGl2aXR5IGVzdGFibGlzaGVkIG9uIHRoZSBWUENcbiAgICAgKiBBZGQgaWd3IHRvIHRoaXMgaWYgaXRzIGEgcHVibGljIHN1Ym5ldFxuICAgICAqL1xuICAgIHRoaXMuaW50ZXJuZXRDb25uZWN0aXZpdHlFc3RhYmxpc2hlZCA9IHRoaXMuX2ludGVybmV0Q29ubmVjdGl2aXR5RXN0YWJsaXNoZWQ7XG4gIH1cbn1cbi8qKlxuICogU3VwcG9ydHMgYXNzaWduaW5nIElQdjQgYWRkcmVzcyB0byBWUENcbiAqL1xuY2xhc3MgaXB2NENpZHJBbGxvY2F0aW9uIGltcGxlbWVudHMgSUlwQWRkcmVzc2VzIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjaWRyQmxvY2s6IHN0cmluZywgcHJpdmF0ZSByZWFkb25seSBwcm9wcz86IHsgY2lkckJsb2NrTmFtZTogc3RyaW5nfSkge1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIENJRFIgYmxvY2sgcHJvdmlkZWQgYnkgdGhlIHVzZXIgdG8gc2V0IElQdjRcbiAgICovXG4gIGFsbG9jYXRlVnBjQ2lkcigpOiBWcGNDaWRyT3B0aW9ucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlwdjRDaWRyQmxvY2s6IHRoaXMuY2lkckJsb2NrLFxuICAgICAgY2lkckJsb2NrTmFtZTogdGhpcy5wcm9wcz8uY2lkckJsb2NrTmFtZSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogU3VwcG9ydHMgQW1hem9uIFByb3ZpZGVkIElwdjYgcmFuZ2VzXG4gKi9cbmNsYXNzIEFtYXpvblByb3ZpZGVkIGltcGxlbWVudHMgSUlwQWRkcmVzc2VzIHtcbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYW4gQW1hem9uLXByb3ZpZGVkIElQdjYgQ0lEUiByYW5nZSBmb3IgYSBWUEMuXG4gICAqXG4gICAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgSUlwQWRkcmVzc2VzIGludGVyZmFjZSBhbmQgaXMgdXNlZCB0byBhbGxvY2F0ZSBhbiBBbWF6b24tcHJvdmlkZWRcbiAgICogSVB2NiBDSURSIHJhbmdlIGZvciBhIFZQQy4gV2hlbiBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIHVzZWQgdG8gYWxsb2NhdGUgdGhlIFZQQyBDSURSLFxuICAgKiBBbWF6b24gd2lsbCBhdXRvbWF0aWNhbGx5IGFzc2lnbiBhbiBJUHY2IENJRFIgcmFuZ2UgZnJvbSBpdHMgcG9vbCBvZiBhdmFpbGFibGUgYWRkcmVzc2VzLlxuICAgKi9cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiB7IGNpZHJCbG9ja05hbWU6IHN0cmluZ30pIHt9XG5cbiAgYWxsb2NhdGVWcGNDaWRyKCk6IFZwY0NpZHJPcHRpb25zIHtcbiAgICByZXR1cm4ge1xuICAgICAgYW1hem9uUHJvdmlkZWQ6IHRydWUsXG4gICAgICBjaWRyQmxvY2tOYW1lOiB0aGlzLnByb3BzLmNpZHJCbG9ja05hbWUsXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gSVB2NCBhZGRyZXNzIHJhbmdlIG1hbmFnZWQgYnkgQVdTIElQIEFkZHJlc3MgTWFuYWdlciAoSVBBTSkuXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItaXBhbS5odG1sXG4gKi9cbmNsYXNzIElwYW1JcHY2IGltcGxlbWVudHMgSUlwQWRkcmVzc2VzIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogSXBhbU9wdGlvbnMpIHtcbiAgfVxuXG4gIGFsbG9jYXRlVnBjQ2lkcigpOiBWcGNDaWRyT3B0aW9ucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlwdjZOZXRtYXNrTGVuZ3RoOiB0aGlzLnByb3BzLm5ldG1hc2tMZW5ndGgsXG4gICAgICBpcHY2SXBhbVBvb2w6IHRoaXMucHJvcHMuaXBhbVBvb2wsXG4gICAgICBkZXBlbmRlbmNpZXM6IHRoaXMucHJvcHMuaXBhbVBvb2w/LmlwYW1DaWRycy5tYXAoYyA9PiBjIGFzIENmblJlc291cmNlKSxcbiAgICAgIGNpZHJCbG9ja05hbWU6IHRoaXMucHJvcHMuY2lkckJsb2NrTmFtZSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBJUHY0IGFkZHJlc3MgcmFuZ2UgbWFuYWdlZCBieSBBV1MgSVAgQWRkcmVzcyBNYW5hZ2VyIChJUEFNKS5cbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWVjMi1pcGFtLmh0bWxcbiAqL1xuY2xhc3MgSXBhbUlwdjQgaW1wbGVtZW50cyBJSXBBZGRyZXNzZXMge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBJcGFtT3B0aW9ucykge1xuICB9XG4gIGFsbG9jYXRlVnBjQ2lkcigpOiBWcGNDaWRyT3B0aW9ucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlwdjROZXRtYXNrTGVuZ3RoOiB0aGlzLnByb3BzLm5ldG1hc2tMZW5ndGgsXG4gICAgICBpcHY0SXBhbVBvb2w6IHRoaXMucHJvcHMuaXBhbVBvb2wsXG4gICAgICBjaWRyQmxvY2tOYW1lOiB0aGlzLnByb3BzPy5jaWRyQmxvY2tOYW1lLFxuICAgICAgaXB2NElwYW1Qcm92aXNpb25lZENpZHJzOiB0aGlzLnByb3BzLmlwYW1Qb29sPy5pcGFtSXB2NENpZHJzLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBTdXBwb3J0cyBhc3NpZ25pbmcgSVB2NiBhZGRyZXNzIHRvIFZQQyBpbiBhbiBhZGRyZXNzIHBvb2xcbiAqL1xuY2xhc3MgSXB2NlBvb2wgaW1wbGVtZW50cyBJSXBBZGRyZXNzZXMge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBJcHY2UG9vbFNlY29uZGFyeUFkZHJlc3NQcm9wcykge1xuICB9XG4gIGFsbG9jYXRlVnBjQ2lkcigpOiBWcGNDaWRyT3B0aW9ucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlwdjZDaWRyQmxvY2s6IHRoaXMucHJvcHMuaXB2NkNpZHJCbG9jayxcbiAgICAgIGlwdjZQb29sSWQ6IHRoaXMucHJvcHMuaXB2NlBvb2xJZCxcbiAgICAgIGNpZHJCbG9ja05hbWU6IHRoaXMucHJvcHM/LmNpZHJCbG9ja05hbWUsXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEludGVyZmFjZSB0byBjcmVhdGUgTDIgZm9yIFZQQyBDaWRyIEJsb2NrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVZQQ0NpZHJCbG9jayB7XG4gIC8qKlxuICAgKiBBbWF6b24gUHJvdmlkZWQgSXB2NlxuICAgKi9cbiAgcmVhZG9ubHkgYW1hem9uUHJvdmlkZWRJcHY2Q2lkckJsb2NrPyA6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBzZWNvbmRhcnkgSVB2NCBDSURSIEJsb2NrXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gQ0lEUiBibG9jayBwcm92aWRlZFxuICAgKi9cbiAgcmVhZG9ubHkgY2lkckJsb2NrPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJUEFNIHBvb2wgZm9yIElQdjYgYWRkcmVzcyB0eXBlXG4gICAqL1xuICByZWFkb25seSBpcHY2SXBhbVBvb2xJZCA/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElQQU0gcG9vbCBmb3IgSVB2NCBhZGRyZXNzIHR5cGVcbiAgICovXG4gIHJlYWRvbmx5IGlwdjRJcGFtUG9vbElkID86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElQdjYgQ0lEUiBibG9jayBmcm9tIHRoZSBzcGVjaWZpZWQgSVB2NiBhZGRyZXNzIHBvb2wuXG4gICAqL1xuICByZWFkb25seSBpcHY2Q2lkckJsb2NrPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIElQdjYgYWRkcmVzcyBwb29sIGZyb20gd2hpY2ggdG8gYWxsb2NhdGUgdGhlIElQdjYgQ0lEUiBibG9jay5cbiAgICovXG4gIHJlYWRvbmx5IGlwdjZQb29sPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEF0dHJpYnV0ZXMgZm9yIFZQQ0NpZHJCbG9jayB1c2VkIGZvciBkZWZpbmluZyBhIG5ldyBDSURSIEJsb2NrXG4gKiBhbmQgYWxzbyBmb3IgaW1wb3J0aW5nIGFuIGV4aXN0aW5nIENJRFJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWUENDaWRyQmxvY2thdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIEFtYXpvbiBQcm92aWRlZCBJcHY2XG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBhbWF6b25Qcm92aWRlZElwdjZDaWRyQmxvY2s/IDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHNlY29uZGFyeSBJUHY0IENJRFIgQmxvY2tcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBDSURSIGJsb2NrIHByb3ZpZGVkXG4gICAqL1xuICByZWFkb25seSBjaWRyQmxvY2s/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzZWNvbmRhcnkgSVB2NCBDSURSIEJsb2NrXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gQ0lEUiBibG9jayBwcm92aWRlZFxuICAgKi9cbiAgcmVhZG9ubHkgY2lkckJsb2NrTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogTmV0IG1hc2sgbGVuZ3RoIGZvciBJUHY2IGFkZHJlc3MgdHlwZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIE5ldCBtYXNrIGxlbmd0aCBjb25maWd1cmVkIGZvciBJUHY2XG4gICAqL1xuICByZWFkb25seSBpcHY2TmV0bWFza0xlbmd0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogTmV0IG1hc2sgbGVuZ3RoIGZvciBJUHY0IGFkZHJlc3MgdHlwZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIE5ldCBtYXNrIGxlbmd0aCBjb25maWd1cmVkIGZvciBJUHY0XG4gICAqL1xuICByZWFkb25seSBpcHY0TmV0bWFza0xlbmd0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogSVBBTSBwb29sIGZvciBJUHY2IGFkZHJlc3MgdHlwZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIElQQU0gcG9vbCBJZCBwcm92aWRlZCBmb3IgSVB2NlxuICAgKi9cbiAgcmVhZG9ubHkgaXB2NklwYW1Qb29sSWQgPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJUEFNIHBvb2wgZm9yIElQdjQgYWRkcmVzcyB0eXBlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gSVBBTSBwb29sIElkIHByb3ZpZGVkIGZvciBJUHY0XG4gICAqL1xuICByZWFkb25seSBpcHY0SXBhbVBvb2xJZCA/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElQdjQgQ0lEUiBwcm92aXNpb25lZCB1bmRlciBwb29sXG4gICAqIFJlcXVpcmVkIHRvIGNoZWNrIGZvciBvdmVybGFwcGluZyBDSURScyBhZnRlciBwcm92aXNpb25pbmdcbiAgICogaXMgY29tcGxldGUgdW5kZXIgSVBBTSBwb29sXG4gICAqIEBkZWZhdWx0IC0gbm8gSVBBTSBJUHY0IENJRFIgcmFuZ2UgaXMgcHJvdmlzaW9uZWQgdXNpbmcgSVBBTVxuICAgKi9cbiAgcmVhZG9ubHkgaXB2NElwYW1Qcm92aXNpb25lZENpZHJzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBJUHY2IENJRFIgYmxvY2sgZnJvbSB0aGUgc3BlY2lmaWVkIElQdjYgYWRkcmVzcyBwb29sLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIElQdjYgQ0lEUiBibG9jayBhc3NvY2lhdGVkIHdpdGggVlBDLlxuICAgKi9cbiAgcmVhZG9ubHkgaXB2NkNpZHJCbG9jaz86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBJUHY2IGFkZHJlc3MgcG9vbCBmcm9tIHdoaWNoIHRvIGFsbG9jYXRlIHRoZSBJUHY2IENJRFIgYmxvY2suXG4gICAqIE5vdGU6IEJZT0lQIFBvb2wgSUQgaXMgZGlmZmVyZW50IHRoYW4gSVBBTSBQb29sIElELlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIEJZT0lQIHBvb2wgYXNzb2NpYXRlZCB3aXRoIFZQQy5cbiAgICovXG4gIHJlYWRvbmx5IGlwdjZQb29sPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBWUENDaWRyQmxvY2tcbiAqL1xuaW50ZXJmYWNlIFZQQ0NpZHJCbG9ja1Byb3BzIGV4dGVuZHMgVlBDQ2lkckJsb2NrYXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgVlBDIElkIGZvciBhc3NvY2lhdGluZyBDSURSIEJsb2NrIGFzIGEgc2Vjb25kYXJ5IGFkZHJlc3NcbiAgICovXG4gIHJlYWRvbmx5IHZwY0lkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSW50ZXJuYWwgTDIgdG8gZGVmaW5lIGEgbmV3IFZQQyBDSURSIEJsb2NrXG4gKiBAaW50ZXJuYWxcbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuY2xhc3MgVlBDQ2lkckJsb2NrIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJVlBDQ2lkckJsb2NrIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtZWMyLWFscGhhLlZQQ0NpZHJCbG9jayc7XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyBWUEMgQ0lEUiBCbG9ja1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tVlBDQ2lkckJsb2NrYXR0cmlidXRlcyhzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogVlBDQ2lkckJsb2NrYXR0cmlidXRlcykgOiBJVlBDQ2lkckJsb2NrIHtcbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElWUENDaWRyQmxvY2sge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNpZHJCbG9jayA9IHByb3BzLmNpZHJCbG9jaztcbiAgICAgIHB1YmxpYyByZWFkb25seSBhbWF6b25Qcm92aWRlZElwdjZDaWRyQmxvY2sgPzogYm9vbGVhbiA9IHByb3BzLmFtYXpvblByb3ZpZGVkSXB2NkNpZHJCbG9jaztcbiAgICAgIHB1YmxpYyByZWFkb25seSBpcHY2SXBhbVBvb2xJZCA/OiBzdHJpbmcgPSBwcm9wcy5pcHY2SXBhbVBvb2xJZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBpcHY0SXBhbVBvb2xJZCA/OiBzdHJpbmcgPSBwcm9wcy5pcHY0SXBhbVBvb2xJZDtcbiAgICAgIC8vIEJZT0lQIFBvb2wgQXR0cmlidXRlc1xuICAgICAgcHVibGljIHJlYWRvbmx5IGlwdjZQb29sPzogc3RyaW5nID0gcHJvcHMuaXB2NlBvb2w7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgaXB2NkNpZHJCbG9jaz86IHN0cmluZyA9IHByb3BzLmlwdjZDaWRyQmxvY2s7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2U6IENmblZQQ0NpZHJCbG9jaztcblxuICBwdWJsaWMgcmVhZG9ubHkgY2lkckJsb2NrPzogc3RyaW5nO1xuXG4gIHB1YmxpYyByZWFkb25seSBhbWF6b25Qcm92aWRlZElwdjZDaWRyQmxvY2s/OiBib29sZWFuO1xuXG4gIHB1YmxpYyByZWFkb25seSBpcHY2SXBhbVBvb2xJZD86IHN0cmluZztcblxuICBwdWJsaWMgcmVhZG9ubHkgaXB2NElwYW1Qb29sSWQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIHJlYWRvbmx5IGlwdjZDaWRyQmxvY2s/OiBzdHJpbmc7XG5cbiAgcHVibGljIHJlYWRvbmx5IGlwdjZQb29sPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBWUENDaWRyQmxvY2tQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBDZm5WUENDaWRyQmxvY2sodGhpcywgaWQsIHByb3BzKTtcbiAgICB0aGlzLm5vZGUuZGVmYXVsdENoaWxkID0gdGhpcy5yZXNvdXJjZTtcbiAgICB0aGlzLmNpZHJCbG9jayA9IHByb3BzLmNpZHJCbG9jaztcbiAgICB0aGlzLmlwdjZJcGFtUG9vbElkID0gcHJvcHMuaXB2NklwYW1Qb29sSWQ7XG4gICAgdGhpcy5pcHY0SXBhbVBvb2xJZCA9IHByb3BzLmlwdjRJcGFtUG9vbElkO1xuICAgIHRoaXMuYW1hem9uUHJvdmlkZWRJcHY2Q2lkckJsb2NrID0gcHJvcHMuYW1hem9uUHJvdmlkZWRJcHY2Q2lkckJsb2NrO1xuICAgIC8vIEJZT0lQIFBvb2wgYW5kIENJRFIgQmxvY2tcbiAgICB0aGlzLmlwdjZDaWRyQmxvY2sgPSBwcm9wcy5pcHY2Q2lkckJsb2NrO1xuICAgIHRoaXMuaXB2NlBvb2wgPSBwcm9wcy5pcHY2UG9vbDtcbiAgfVxufVxuXG4vLyBAaW50ZXJuYWwgRmlyc3QgdHdvIE9jdGV0IHRvIHZlcmlmeSBSRkMgMTkxOFxuaW50ZXJmYWNlIElQYWRkcmVzc0NvbmZpZyB7XG4gIG9jdGV0MTogbnVtYmVyO1xuICBvY3RldDI6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgd2hldGhlciBhIHNlY29uZGFyeSBJUHY0IGFkZHJlc3MgaXMgd2l0aGluIHRoZSBzYW1lIHByaXZhdGUgSVAgYWRkcmVzcyByYW5nZSBhcyB0aGUgcHJpbWFyeSBJUHY0IGFkZHJlc3MuXG4gKlxuICogQHBhcmFtIGNpZHIxIFRoZSBzZWNvbmRhcnkgSVB2NCBDSURSIGJsb2NrIHRvIGJlIHZhbGlkYXRlZC5cbiAqIEBwYXJhbSBjaWRyMiBUaGUgcHJpbWFyeSBJUHY0IENJRFIgYmxvY2sgdG8gdmFsaWRhdGUgYWdhaW5zdC5cbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHNlY29uZGFyeSBJUHY0IENJRFIgYmxvY2sgaXMgd2l0aGluIHRoZSBzYW1lIHByaXZhdGUgSVAgYWRkcmVzcyByYW5nZSBhcyB0aGUgcHJpbWFyeSBJUHY0IENJRFIgYmxvY2ssIGZhbHNlIG90aGVyd2lzZS5cbiAqIEBpbnRlcm5hbFxuICogVGhlIHByaXZhdGUgSVAgYWRkcmVzcyByYW5nZXMgYXJlIGRlZmluZWQgYnkgUkZDIDE5MTggYXMgMTAuMC4wLjAvOCwgMTcyLjE2LjAuMC8xMiwgYW5kIDE5Mi4xNjguMC4wLzE2LlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUlwdjRhZGRyZXNzKGNpZHIxPzogc3RyaW5nLCBjaWRyMj86IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWNpZHIxIHx8ICFjaWRyMikge1xuICAgIHJldHVybiBmYWxzZTsgLy8gSGFuZGxlIGNhc2VzIHdoZXJlIENJRFIgcmFuZ2VzIGFyZSBub3QgcHJvdmlkZWRcbiAgfVxuXG4gIGNvbnN0IG9jdGV0c0NpZHIxOiBudW1iZXJbXSA9IGNpZHIxLnNwbGl0KCcuJykubWFwKG9jdGV0ID0+IHBhcnNlSW50KG9jdGV0LCAxMCkpO1xuICBjb25zdCBvY3RldHNDaWRyMjogbnVtYmVyW10gPSBjaWRyMi5zcGxpdCgnLicpLm1hcChvY3RldCA9PiBwYXJzZUludChvY3RldCwgMTApKTtcblxuICBpZiAob2N0ZXRzQ2lkcjEubGVuZ3RoICE9PSA0IHx8IG9jdGV0c0NpZHIyLmxlbmd0aCAhPT0gNCkge1xuICAgIHJldHVybiBmYWxzZTsgLy8gSGFuZGxlIGludmFsaWQgQ0lEUiByYW5nZXNcbiAgfVxuXG4gIGNvbnN0IGlwMTogSVBhZGRyZXNzQ29uZmlnID0ge1xuICAgIG9jdGV0MTogb2N0ZXRzQ2lkcjFbMF0sXG4gICAgb2N0ZXQyOiBvY3RldHNDaWRyMVsxXSxcbiAgfTtcblxuICBjb25zdCBpcDI6IElQYWRkcmVzc0NvbmZpZyA9IHtcbiAgICBvY3RldDE6IG9jdGV0c0NpZHIyWzBdLFxuICAgIG9jdGV0Mjogb2N0ZXRzQ2lkcjJbMV0sXG4gIH07XG5cbiAgcmV0dXJuIChpcDEub2N0ZXQxID09PSAxMCAmJiBpcDIub2N0ZXQxID09PSAxMCkgfHxcbiAgICAoaXAxLm9jdGV0MSA9PT0gMTkyICYmIGlwMS5vY3RldDIgPT09IDE2OCAmJiBpcDIub2N0ZXQxID09PSAxOTIgJiYgaXAyLm9jdGV0MiA9PT0gMTY4KSB8fFxuICAgIChpcDEub2N0ZXQxID09PSAxNzIgJiYgaXAxLm9jdGV0MiA9PT0gMTYgJiYgaXAyLm9jdGV0MSA9PT0gMTcyICYmIGlwMi5vY3RldDIgPT09IDE2KTsgLy8gQ0lEUiByYW5nZXMgYmVsb25nIHRvIHNhbWUgcHJpdmF0ZSBJUCBhZGRyZXNzIHJhbmdlc1xufVxuIl19