@ashishpandeyone/cdk-lambda-web-function 0.1.3 → 0.1.5

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.
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.WebFunction = void 0;
36
+ exports.WebFunction = exports.WebFunctionBase = void 0;
37
37
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
38
38
  const aws_cdk_lib_1 = require("aws-cdk-lib");
39
39
  const cloudwatch = __importStar(require("aws-cdk-lib/aws-cloudwatch"));
@@ -43,12 +43,76 @@ const logs = __importStar(require("aws-cdk-lib/aws-logs"));
43
43
  const code_1 = require("./private/code");
44
44
  const log_group_1 = require("./private/log-group");
45
45
  const metrics_1 = require("./private/metrics");
46
+ const resource_policy_1 = require("./private/resource-policy");
46
47
  const revision_cleanup_1 = require("./private/revision-cleanup");
47
48
  const validation_1 = require("./private/validation");
48
49
  const web_function_endpoint_1 = require("./web-function-endpoint");
50
+ const web_function_grants_1 = require("./web-function-grants");
49
51
  const web_function_revision_1 = require("./web-function-revision");
50
52
  /** Endpoints per function (service quota, not adjustable). */
51
53
  const MAX_ENDPOINTS = 10;
54
+ /**
55
+ * What `WebFunction` and imported functions have in common.
56
+ */
57
+ class WebFunctionBase extends aws_cdk_lib_1.Resource {
58
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionBase", version: "0.1.5" };
59
+ /** A reference to this function, for APIs that accept `lambda.IWebFunctionRef`. */
60
+ get webFunctionRef() {
61
+ return { functionArn: this.webFunctionArn };
62
+ }
63
+ /**
64
+ * A metric of this function's execution environments in `AWS/Lambda/Web` (dimension `FunctionName`), across all endpoints.
65
+ * For request and error counts, use the endpoint's metrics (`fn.endpoint.metricRequests()`).
66
+ *
67
+ * Metrics are published in the region that served the request: pass `region` for another serving region.
68
+ * An alarm can only use metrics from its own stack's region.
69
+ *
70
+ * @default - sum over 1 minute, in the function's home region
71
+ */
72
+ metric(metricName, props) {
73
+ // An imported function in another region publishes its metrics there.
74
+ const region = !aws_cdk_lib_1.Token.isUnresolved(this.env.region) && this.env.region !== aws_cdk_lib_1.Stack.of(this).region ? this.env.region : undefined;
75
+ return new cloudwatch.Metric({
76
+ namespace: metrics_1.WEB_NAMESPACE,
77
+ metricName,
78
+ dimensionsMap: { FunctionName: this.webFunctionName },
79
+ statistic: cloudwatch.Stats.SUM,
80
+ period: metrics_1.DEFAULT_PERIOD,
81
+ region,
82
+ ...props,
83
+ });
84
+ }
85
+ /** Time the execution environments were active (`EnvironmentActiveTime`). */
86
+ metricActiveTime(props) {
87
+ return this.metric('EnvironmentActiveTime', props);
88
+ }
89
+ /** CPU time the execution environments used (`EnvironmentCPUTime`). */
90
+ metricCpuTime(props) {
91
+ return this.metric('EnvironmentCPUTime', props);
92
+ }
93
+ /**
94
+ * Requests an execution environment handled at once (`EnvironmentConcurrentRequests`), to compare with
95
+ * `maxConcurrencyPerEnvironment`.
96
+ *
97
+ * @default - maximum over 1 minute
98
+ */
99
+ metricConcurrentRequests(props) {
100
+ return this.metric('EnvironmentConcurrentRequests', { statistic: cloudwatch.Stats.MAXIMUM, ...props });
101
+ }
102
+ /**
103
+ * Peak memory an execution environment used (`EnvironmentMaxMemoryUsage`); each environment has 2 GB.
104
+ *
105
+ * @default - maximum over 1 minute
106
+ */
107
+ metricMaxMemoryUsage(props) {
108
+ return this.metric('EnvironmentMaxMemoryUsage', { statistic: cloudwatch.Stats.MAXIMUM, ...props });
109
+ }
110
+ /** Bytes sent in responses (`ResponseBytes`). */
111
+ metricResponseBytes(props) {
112
+ return this.metric('ResponseBytes', props);
113
+ }
114
+ }
115
+ exports.WebFunctionBase = WebFunctionBase;
52
116
  /**
53
117
  * A Node.js HTTP server running as an AWS Lambda Web Function, served from one or more regions.
54
118
  *
@@ -56,12 +120,30 @@ const MAX_ENDPOINTS = 10;
56
120
  * and the newest `revisionRetention` are kept), a default HTTPS endpoint, an execution role, and owns
57
121
  * the function's log groups in every region its endpoints serve from.
58
122
  *
59
- * Importing existing functions (`fromXxx` methods) is planned after 0.1.
123
+ * Use `fromWebFunctionArn`, `fromWebFunctionName` or `fromWebFunctionAttributes` for a function defined elsewhere.
60
124
  *
61
125
  * @resource AWS::Lambda::WebFunction
62
126
  */
63
- class WebFunction extends aws_cdk_lib_1.Resource {
64
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunction", version: "0.1.3" };
127
+ class WebFunction extends WebFunctionBase {
128
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunction", version: "0.1.5" };
129
+ /**
130
+ * Imports an existing Web Function by its ARN (in any region or account).
131
+ */
132
+ static fromWebFunctionArn(scope, id, webFunctionArn) {
133
+ return WebFunction.fromWebFunctionAttributes(scope, id, { webFunctionArn });
134
+ }
135
+ /**
136
+ * Imports an existing Web Function in this stack's account and region by its name.
137
+ */
138
+ static fromWebFunctionName(scope, id, webFunctionName) {
139
+ return WebFunction.fromWebFunctionAttributes(scope, id, { webFunctionName });
140
+ }
141
+ /**
142
+ * Imports an existing Web Function: give its ARN or its name, and optionally the endpoint `grantInvoke` allows.
143
+ */
144
+ static fromWebFunctionAttributes(scope, id, attrs) {
145
+ return new ImportedWebFunction(scope, id, attrs);
146
+ }
65
147
  webFunctionName;
66
148
  webFunctionArn;
67
149
  /** The ID of the current revision. Same as `currentRevision.revisionId`. */
@@ -88,10 +170,8 @@ class WebFunction extends aws_cdk_lib_1.Resource {
88
170
  logOptions;
89
171
  resource;
90
172
  revisionCleanup;
91
- /** A reference to this function, for APIs that accept `lambda.IWebFunctionRef`. */
92
- get webFunctionRef() {
93
- return { functionArn: this.webFunctionArn };
94
- }
173
+ permissionIds = new Set();
174
+ resourcePolicy;
95
175
  constructor(scope, id, props) {
96
176
  super(scope, id);
97
177
  if (props.runtime.family !== lambda.RuntimeFamily.NODEJS) {
@@ -212,52 +292,67 @@ class WebFunction extends aws_cdk_lib_1.Resource {
212
292
  return this.grants.invoke(grantee);
213
293
  }
214
294
  /**
215
- * A metric of this function's execution environments in `AWS/Lambda/Web` (dimension `FunctionName`), across all endpoints.
216
- * For request and error counts, use the endpoint's metrics (`fn.endpoint.metricRequests()`).
295
+ * Allows a principal in another account, an AWS service or an organization to call the function's endpoints,
296
+ * through the function's resource policy. For a role in this account, use `grantInvoke`.
217
297
  *
218
- * Metrics are published in the region that served the request: pass `region` for another serving region.
219
- * An alarm can only use metrics from its own stack's region.
220
- *
221
- * @default - sum over 1 minute, in the home region
298
+ * @param id the statement ID (`Sid`): letters and digits, unique within the function
222
299
  */
223
- metric(metricName, props) {
224
- return new cloudwatch.Metric({
225
- namespace: metrics_1.WEB_NAMESPACE,
226
- metricName,
227
- dimensionsMap: { FunctionName: this.webFunctionName },
228
- statistic: cloudwatch.Stats.SUM,
229
- period: metrics_1.DEFAULT_PERIOD,
230
- ...props,
300
+ addPermission(id, permission) {
301
+ if (!aws_cdk_lib_1.Token.isUnresolved(id) && !/^[A-Za-z0-9]+$/.test(id)) {
302
+ throw new Error(`${this.node.path}: permission id '${id}' must be letters and digits only (it is the statement's Sid)`);
303
+ }
304
+ if (this.permissionIds.has(id)) {
305
+ throw new Error(`${this.node.path}: there is already a permission with id '${id}'`);
306
+ }
307
+ const endpoint = permission.endpoint;
308
+ if (endpoint !== undefined && !this.endpoints.includes(endpoint)) {
309
+ throw new Error(`${this.node.path}: the endpoint ${endpoint.node.path} belongs to another function`);
310
+ }
311
+ this.permissionIds.add(id);
312
+ const statement = new iam.PolicyStatement({
313
+ sid: id,
314
+ principals: [permission.principal],
315
+ actions: ['lambda:InvokeWebFunctionEndpoint'],
316
+ resources: [endpoint?.endpointArn ?? `${this.webFunctionArn}/endpoint/*`],
231
317
  });
232
- }
233
- /** Time the execution environments were active (`EnvironmentActiveTime`). */
234
- metricActiveTime(props) {
235
- return this.metric('EnvironmentActiveTime', props);
236
- }
237
- /** CPU time the execution environments used (`EnvironmentCPUTime`). */
238
- metricCpuTime(props) {
239
- return this.metric('EnvironmentCPUTime', props);
240
- }
241
- /**
242
- * Requests an execution environment handled at once (`EnvironmentConcurrentRequests`), to compare with
243
- * `maxConcurrencyPerEnvironment`.
244
- *
245
- * @default - maximum over 1 minute
246
- */
247
- metricConcurrentRequests(props) {
248
- return this.metric('EnvironmentConcurrentRequests', { statistic: cloudwatch.Stats.MAXIMUM, ...props });
318
+ if (permission.sourceArn !== undefined)
319
+ statement.addCondition('ArnLike', { 'aws:SourceArn': permission.sourceArn });
320
+ if (permission.sourceAccount !== undefined)
321
+ statement.addCondition('StringEquals', { 'aws:SourceAccount': permission.sourceAccount });
322
+ this.addToResourcePolicy(statement);
249
323
  }
250
324
  /**
251
- * Peak memory an execution environment used (`EnvironmentMaxMemoryUsage`); each environment has 2 GB.
325
+ * Adds a statement to the function's resource policy, e.g. to let another account manage the function.
326
+ * For invoking, prefer `addPermission` or `grantInvoke`.
252
327
  *
253
- * @default - maximum over 1 minute
328
+ * The function has one resource policy (`AWS::Lambda::ResourcePolicy`), created on the first statement. This stack
329
+ * is its only writer: another stack or template can't also attach one, and changes made outside CloudFormation
330
+ * are overwritten by the next update of the policy.
254
331
  */
255
- metricMaxMemoryUsage(props) {
256
- return this.metric('EnvironmentMaxMemoryUsage', { statistic: cloudwatch.Stats.MAXIMUM, ...props });
332
+ addToResourcePolicy(statement) {
333
+ const policy = this.resourcePolicy ?? this.createResourcePolicy();
334
+ policy.document.addStatements(statement);
335
+ return { statementAdded: true, policyDependable: policy.resource };
257
336
  }
258
- /** Bytes sent in responses (`ResponseBytes`). */
259
- metricResponseBytes(props) {
260
- return this.metric('ResponseBytes', props);
337
+ createResourcePolicy() {
338
+ const document = new iam.PolicyDocument();
339
+ // One policy per function at a fixed ID: CloudFormation can't create a second one, even to replace the first.
340
+ const resource = new lambda.CfnResourcePolicy(this, 'ResourcePolicy', {
341
+ resourceArn: this.webFunctionArn,
342
+ policyDocument: document,
343
+ });
344
+ this.node.addValidation({
345
+ validate: () => {
346
+ const json = aws_cdk_lib_1.Stack.of(this).resolve(document.toJSON());
347
+ const { errors, unscopedServices } = (0, resource_policy_1.inspectResourcePolicy)(json);
348
+ if (unscopedServices.length > 0) {
349
+ aws_cdk_lib_1.Annotations.of(this).addWarningV2('@cdk-lambda-web:servicePrincipalWithoutSource', `The resource policy lets ${[...new Set(unscopedServices)].join(', ')} call the function from any account. Restrict it with sourceArn or sourceAccount (addPermission), or a principal with conditions.`);
350
+ }
351
+ return [...document.validateForResourcePolicy(), ...errors.map((e) => `resource policy: ${e}`)];
352
+ },
353
+ });
354
+ this.resourcePolicy = { document, resource };
355
+ return this.resourcePolicy;
261
356
  }
262
357
  createEndpoint(id, options, namePrefix, nameSeed) {
263
358
  if (this.endpoints.length >= MAX_ENDPOINTS) {
@@ -304,4 +399,46 @@ class WebFunction extends aws_cdk_lib_1.Resource {
304
399
  }
305
400
  }
306
401
  exports.WebFunction = WebFunction;
307
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dlYi1mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXdIO0FBQ3hILHVFQUF5RDtBQUN6RCx5REFBMkM7QUFDM0MsK0RBQWlEO0FBQ2pELDJEQUE2QztBQUc3Qyx5Q0FBaUQ7QUFDakQsbURBQTBEO0FBQzFELCtDQUFrRTtBQUNsRSxpRUFBNkQ7QUFDN0QscURBQXFGO0FBQ3JGLG1FQUFtSTtBQUVuSSxtRUFBeUY7QUFFekYsOERBQThEO0FBQzlELE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztBQXlKekI7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQWEsV0FBWSxTQUFRLHNCQUFROztJQUN2QixlQUFlLENBQVM7SUFDeEIsY0FBYyxDQUFTO0lBRXZDLDRFQUE0RTtJQUM1RCxVQUFVLENBQVM7SUFFbkMsa0VBQWtFO0lBQ2xELGVBQWUsQ0FBdUI7SUFFdEQseURBQXlEO0lBQ3pDLFFBQVEsQ0FBc0I7SUFFOUMsaUhBQWlIO0lBQ2pHLE1BQU0sQ0FBb0I7SUFFMUMsMEJBQTBCO0lBQ1YsSUFBSSxDQUFZO0lBRWhDLGtFQUFrRTtJQUNsRCxjQUFjLENBQWlCO0lBRS9DOzs7T0FHRztJQUNhLFFBQVEsQ0FBaUI7SUFFeEIsV0FBVyxHQUE4QixFQUFFLENBQUM7SUFDNUMsU0FBUyxHQUEwQixFQUFFLENBQUM7SUFDdEMsZUFBZSxHQUFHLElBQUksR0FBRyxFQUErQixDQUFDO0lBQ3pELFlBQVksQ0FBUztJQUNyQixVQUFVLENBQThEO0lBQ3hFLFFBQVEsQ0FBd0I7SUFDaEMsZUFBZSxDQUFrQjtJQUVsRCxtRkFBbUY7SUFDbkYsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRCxZQUFZLEtBQWdC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QUksK0JBQW1CLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRTtZQUN2QyxNQUFNO1lBQ04sWUFBWSxFQUFFLElBQUk7WUFDbEIsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUztZQUN2RSxhQUFhLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsSUFBSSwyQkFBYSxDQUFDLE1BQU07U0FDeEUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUEvUUgsa0NBZ1JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHVyYXRpb24sIHR5cGUgSVJlc291cmNlLCBMYXp5LCBOYW1lcywgUmVtb3ZhbFBvbGljeSwgUmVzb3VyY2UsIFN0YWNrLCBUb2tlbiwgVmFsaWRhdGlvbnMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBjbG91ZHdhdGNoIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBXZWJGdW5jdGlvbkF1dGhUeXBlIH0gZnJvbSAnLi9lbnVtcyc7XG5pbXBvcnQgeyBXZWJGdW5jdGlvbkNvZGUgfSBmcm9tICcuL3ByaXZhdGUvY29kZSc7XG5pbXBvcnQgeyBXZWJGdW5jdGlvbkxvZ0dyb3VwIH0gZnJvbSAnLi9wcml2YXRlL2xvZy1ncm91cCc7XG5pbXBvcnQgeyBERUZBVUxUX1BFUklPRCwgV0VCX05BTUVTUEFDRSB9IGZyb20gJy4vcHJpdmF0ZS9tZXRyaWNzJztcbmltcG9ydCB7IFJldmlzaW9uQ2xlYW51cCB9IGZyb20gJy4vcHJpdmF0ZS9yZXZpc2lvbi1jbGVhbnVwJztcbmltcG9ydCB7IENGTl9WQUxJREFURV9VTktOT1dOX1RZUEUsIGFzc2VydFJlc291cmNlTmFtZSB9IGZyb20gJy4vcHJpdmF0ZS92YWxpZGF0aW9uJztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uRW5kcG9pbnQsIHR5cGUgQWRkV2ViRnVuY3Rpb25FbmRwb2ludE9wdGlvbnMsIHR5cGUgV2ViRnVuY3Rpb25FbmRwb2ludE9wdGlvbnMgfSBmcm9tICcuL3dlYi1mdW5jdGlvbi1lbmRwb2ludCc7XG5pbXBvcnQgeyBXZWJGdW5jdGlvbkdyYW50cyB9IGZyb20gJy4vd2ViLWZ1bmN0aW9uLWdyYW50cyc7XG5pbXBvcnQgeyBXZWJGdW5jdGlvblJldmlzaW9uLCB0eXBlIElXZWJGdW5jdGlvblJldmlzaW9uIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24tcmV2aXNpb24nO1xuXG4vKiogRW5kcG9pbnRzIHBlciBmdW5jdGlvbiAoc2VydmljZSBxdW90YSwgbm90IGFkanVzdGFibGUpLiAqL1xuY29uc3QgTUFYX0VORFBPSU5UUyA9IDEwO1xuXG4vKipcbiAqIE9wdGlvbnMgc2hhcmVkIGJ5IGBXZWJGdW5jdGlvbmAgYW5kIGBOb2RlanNXZWJGdW5jdGlvbmA6IGV2ZXJ5dGhpbmcgZXhjZXB0IGhvdyB0aGUgY29kZSBpcyBzdXBwbGllZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogSG93IGNhbGxlcnMgb2YgdGhlIGVuZHBvaW50IGFyZSBhdXRoZW50aWNhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aFR5cGU6IFdlYkZ1bmN0aW9uQXV0aFR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGVuZHBvaW50IChgZm4uZW5kcG9pbnRgKTogd2hlcmUgaXQgc2VydmVzIGZyb20sIGl0cyBuYW1lIGFuZCBsaW1pdHMuXG4gICAqIEl0IHNlcnZlcyB0aGUgY3VycmVudCByZXZpc2lvbjsgcm91dGUgaXQgZWxzZXdoZXJlIHdpdGggYGZuLmVuZHBvaW50LnJvdXRlVHJhZmZpYygpYC5cbiAgICogQWRkIG1vcmUgZW5kcG9pbnRzIHdpdGggYGFkZEVuZHBvaW50YC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIEhPTUVfUkVHSU9OIGVuZHBvaW50IHNlcnZpbmcgdGhlIGN1cnJlbnQgcmV2aXNpb25cbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50PzogV2ViRnVuY3Rpb25FbmRwb2ludE9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IG9mIHRoZSBuZXdlc3QgcmV2aXNpb25zIHRvIGtlZXAgKDEtNTApLiBFYWNoIGRlcGxveW1lbnQgdGhhdCBjaGFuZ2VzIHRoZSBjb2RlIG9yXG4gICAqIGNvbmZpZ3VyYXRpb24gY3JlYXRlcyBhIHJldmlzaW9uOyBvbGRlciBvbmVzIHN0YXkgYXZhaWxhYmxlIHRvIHJvbGwgYmFjayB0byBvciByb3V0ZSB0cmFmZmljIHRvLFxuICAgKiBhbmQgdGhlIG9sZGVzdCBiZXlvbmQgdGhpcyBjb3VudCBhcmUgZGVsZXRlZCBhZnRlciBlYWNoIGRlcGxveW1lbnQuXG4gICAqXG4gICAqIFJldmlzaW9ucyB0aGF0IGFuIGVuZHBvaW50IHJvdXRlcyB0byBhcmUgbmV2ZXIgZGVsZXRlZCwgYW5kIG5laXRoZXIgYXJlIHRob3NlIHRoZSBwcmV2aW91c1xuICAgKiBkZXBsb3ltZW50IHVzZWQgKGEgcm9sbGJhY2sgcmV0dXJucyB0byB0aGVtKS5cbiAgICpcbiAgICogQGRlZmF1bHQgMjBcbiAgICovXG4gIHJlYWRvbmx5IHJldmlzaW9uUmV0ZW50aW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24ncyBuYW1lLiBSZW5hbWluZyBhIGZ1bmN0aW9uIHJlcGxhY2VzIGl0LCBhbmQgaXRzIGVuZHBvaW50IGdldHMgYSBuZXcgVVJMLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgdW5pcXVlIG5hbWUgZ2VuZXJhdGVkIGZyb20gdGhlIGNvbnN0cnVjdCBwYXRoIChtb3ZpbmcgdGhlIGNvbnN0cnVjdCBjaGFuZ2VzIGl0KVxuICAgKi9cbiAgcmVhZG9ubHkgd2ViRnVuY3Rpb25OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBmdW5jdGlvbidzIGNvZGUgYW5kIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZGVzY3JpcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhlY3V0aW9uIHJvbGUuXG4gICAqXG4gICAqIEFuIGBpYW0uSVJvbGVgIChub3QgYElSb2xlUmVmYCkgYmVjYXVzZSB0aGUgZnVuY3Rpb24gYWRkcyBzdGF0ZW1lbnRzIHRvIGl0IGFuZCBncmFudHMgdGhyb3VnaCBpdC5cbiAgICogW2Rpc2FibGUtYXdzbGludDpwcmVmZXItcmVmLWludGVyZmFjZV1cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIHJvbGUgdHJ1c3RpbmcgYGxhbWJkYS5hbWF6b25hd3MuY29tYCB3aXRoIGBBV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGVgXG4gICAqL1xuICByZWFkb25seSByb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMuIE5hbWVzIHN0YXJ0aW5nIHdpdGggYEFXU19gIGFyZSByZXNlcnZlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudD86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIGEgc2luZ2xlIHJlcXVlc3QgbWF5IHJ1bi5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uc2Vjb25kcygzMClcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogSG93IG1hbnkgcmVxdWVzdHMgb25lIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBoYW5kbGVzIGF0IHRoZSBzYW1lIHRpbWUgKDEtMTI4KS5cbiAgICogUmVxdWVzdHMgc2hhcmUgbW9kdWxlLWxldmVsIHN0YXRlLCBzbyBoYW5kbGVycyBtdXN0IGJlIGNvbmN1cnJlbmN5LXNhZmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IDY0XG4gICAqL1xuICByZWFkb25seSBtYXhDb25jdXJyZW5jeVBlckVudmlyb25tZW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBSZXRlbnRpb24gZm9yIGV2ZXJ5IGxvZyBncm91cCBvZiB0aGUgZnVuY3Rpb24sIGluIGV2ZXJ5IHJlZ2lvbiBpdCBzZXJ2ZXMgZnJvbS5cbiAgICpcbiAgICogQGRlZmF1bHQgbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USFxuICAgKi9cbiAgcmVhZG9ubHkgbG9nUmV0ZW50aW9uPzogbG9ncy5SZXRlbnRpb25EYXlzO1xuXG4gIC8qKlxuICAgKiBXaGF0IGhhcHBlbnMgdG8gdGhlIGxvZyBncm91cHMgd2hlbiB0aGUgZnVuY3Rpb24gaXMgcmVtb3ZlZDogUkVUQUlOIG9yIERFU1RST1kuXG4gICAqIFdpdGggREVTVFJPWSwgZGVsZXRpb24gd2FpdHMgYWJvdXQgYSBtaW51dGUgZm9yIGVudmlyb25tZW50cyB0byBmbHVzaCB0aGVpciBsYXN0IGxpbmVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBSZW1vdmFsUG9saWN5LlJFVEFJTlxuICAgKi9cbiAgcmVhZG9ubHkgbG9nUmVtb3ZhbFBvbGljeT86IFJlbW92YWxQb2xpY3k7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIGxldmVsIG9mIGFwcGxpY2F0aW9uIGxvZ3MgdG8ga2VlcC5cbiAgICpcbiAgICogQGRlZmF1bHQgbGFtYmRhLkFwcGxpY2F0aW9uTG9nTGV2ZWwuSU5GT1xuICAgKi9cbiAgcmVhZG9ubHkgYXBwbGljYXRpb25Mb2dMZXZlbFYyPzogbGFtYmRhLkFwcGxpY2F0aW9uTG9nTGV2ZWw7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIGxldmVsIG9mIHBsYXRmb3JtIGxvZ3MgdG8ga2VlcCAoREVCVUcsIElORk8gb3IgV0FSTikuXG4gICAqXG4gICAqIEBkZWZhdWx0IGxhbWJkYS5TeXN0ZW1Mb2dMZXZlbC5JTkZPXG4gICAqL1xuICByZWFkb25seSBzeXN0ZW1Mb2dMZXZlbFYyPzogbGFtYmRhLlN5c3RlbUxvZ0xldmVsO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGEgYFdlYkZ1bmN0aW9uYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvblByb3BzIGV4dGVuZHMgV2ViRnVuY3Rpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBOb2RlLmpzIHJ1bnRpbWUsIGUuZy4gYGxhbWJkYS5SdW50aW1lLk5PREVKU18yNF9YYC5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgY29kZTogYSB6aXAgaW4gUzMgKGBDb2RlLmZyb21Bc3NldGAsIGBDb2RlLmZyb21CdWNrZXRgLCBgQ29kZS5mcm9tQ3VzdG9tQ29tbWFuZGAsIGBDb2RlLmZyb21Eb2NrZXJCdWlsZGApLlxuICAgKiBJbmxpbmUgY29kZSBhbmQgY29udGFpbmVyIGltYWdlcyBhcmVuJ3Qgc3VwcG9ydGVkLlxuICAgKlxuICAgKiBUaGUgY29kZSBpcyBjb3BpZWQgaW50byB0aGUgc3RhY2sncyBjb2RlIGJ1Y2tldCwgd2hpY2ggTGFtYmRhIFdlYiBGdW5jdGlvbnMgY2FuIHJlYWQuXG4gICAqL1xuICByZWFkb25seSBjb2RlOiBsYW1iZGEuQ29kZTtcblxuICAvKipcbiAgICogVGhlIGZpbGUgdGhhdCBzdGFydHMgeW91ciBzZXJ2ZXIsIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBjb2RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnaW5kZXguanMnXG4gICAqL1xuICByZWFkb25seSBlbnRyeXBvaW50Pzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQSBMYW1iZGEgV2ViIEZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElXZWJGdW5jdGlvbiBleHRlbmRzIElSZXNvdXJjZSwgbGFtYmRhLklXZWJGdW5jdGlvblJlZiB7XG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24ncyBuYW1lLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSB3ZWJGdW5jdGlvbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uJ3MgQVJOLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSB3ZWJGdW5jdGlvbkFybjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgTm9kZS5qcyBIVFRQIHNlcnZlciBydW5uaW5nIGFzIGFuIEFXUyBMYW1iZGEgV2ViIEZ1bmN0aW9uLCBzZXJ2ZWQgZnJvbSBvbmUgb3IgbW9yZSByZWdpb25zLlxuICpcbiAqIENyZWF0ZXMgdGhlIGZ1bmN0aW9uLCBpdHMgY3VycmVudCByZXZpc2lvbiAoY29kZSBhbmQgY29uZmlndXJhdGlvbjsgYW55IGNoYW5nZSBjcmVhdGVzIGEgbmV3IG9uZSxcbiAqIGFuZCB0aGUgbmV3ZXN0IGByZXZpc2lvblJldGVudGlvbmAgYXJlIGtlcHQpLCBhIGRlZmF1bHQgSFRUUFMgZW5kcG9pbnQsIGFuIGV4ZWN1dGlvbiByb2xlLCBhbmQgb3duc1xuICogdGhlIGZ1bmN0aW9uJ3MgbG9nIGdyb3VwcyBpbiBldmVyeSByZWdpb24gaXRzIGVuZHBvaW50cyBzZXJ2ZSBmcm9tLlxuICpcbiAqIEltcG9ydGluZyBleGlzdGluZyBmdW5jdGlvbnMgKGBmcm9tWHh4YCBtZXRob2RzKSBpcyBwbGFubmVkIGFmdGVyIDAuMS5cbiAqXG4gKiBAcmVzb3VyY2UgQVdTOjpMYW1iZGE6OldlYkZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJGdW5jdGlvbiBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSVdlYkZ1bmN0aW9uLCBpYW0uSUdyYW50YWJsZSB7XG4gIHB1YmxpYyByZWFkb25seSB3ZWJGdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHdlYkZ1bmN0aW9uQXJuOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBJRCBvZiB0aGUgY3VycmVudCByZXZpc2lvbi4gU2FtZSBhcyBgY3VycmVudFJldmlzaW9uLnJldmlzaW9uSWRgLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmV2aXNpb25JZDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgcmV2aXNpb24gYnVpbHQgZnJvbSB0aGUgY3VycmVudCBjb2RlIGFuZCBjb25maWd1cmF0aW9uLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY3VycmVudFJldmlzaW9uOiBJV2ViRnVuY3Rpb25SZXZpc2lvbjtcblxuICAvKiogVGhlIGRlZmF1bHQgZW5kcG9pbnQuIEFkZCBtb3JlIHdpdGggYGFkZEVuZHBvaW50YC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuZHBvaW50OiBXZWJGdW5jdGlvbkVuZHBvaW50O1xuXG4gIC8qKiBHcmFudHMgb24gdGhlIGRlZmF1bHQgZW5kcG9pbnQgKGUuZy4gYGdyYW50cy5pbnZva2UocHJpbmNpcGFsKWApLiBPdGhlciBlbmRwb2ludHMgaGF2ZSB0aGVpciBvd24gYGdyYW50c2AuICovXG4gIHB1YmxpYyByZWFkb25seSBncmFudHM6IFdlYkZ1bmN0aW9uR3JhbnRzO1xuXG4gIC8qKiBUaGUgZXhlY3V0aW9uIHJvbGUuICovXG4gIHB1YmxpYyByZWFkb25seSByb2xlOiBpYW0uSVJvbGU7XG5cbiAgLyoqIFRoZSBwcmluY2lwYWwgdG8gZ3JhbnQgcGVybWlzc2lvbnMgdG8gKHRoZSBleGVjdXRpb24gcm9sZSkuICovXG4gIHB1YmxpYyByZWFkb25seSBncmFudFByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBob21lLXJlZ2lvbiBsb2cgZ3JvdXAgdGhhdCByZWNlaXZlcyB0aGUgbG9ncyBvZiBldmVyeSByZWdpb24gdGhlIGZ1bmN0aW9uIHNlcnZlcyBmcm9tLlxuICAgKiBTdWJzY3JpYmUgdG8gdGhpcyBvbmUgb25seTogZWFjaCByZWdpb24ncyBgLmxvY2FsYCBncm91cCBob2xkcyBhIGNvcHkgb2YgdGhlIHNhbWUgZXZlbnRzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ0dyb3VwOiBsb2dzLklMb2dHcm91cDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGVudmlyb25tZW50OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgZW5kcG9pbnRzOiBXZWJGdW5jdGlvbkVuZHBvaW50W10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSByZW1vdGVMb2dHcm91cHMgPSBuZXcgTWFwPHN0cmluZywgV2ViRnVuY3Rpb25Mb2dHcm91cD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dHcm91cE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dPcHRpb25zOiBQaWNrPFdlYkZ1bmN0aW9uUHJvcHMsICdsb2dSZXRlbnRpb24nIHwgJ2xvZ1JlbW92YWxQb2xpY3knPjtcbiAgcHJpdmF0ZSByZWFkb25seSByZXNvdXJjZTogbGFtYmRhLkNmbldlYkZ1bmN0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IHJldmlzaW9uQ2xlYW51cDogUmV2aXNpb25DbGVhbnVwO1xuXG4gIC8qKiBBIHJlZmVyZW5jZSB0byB0aGlzIGZ1bmN0aW9uLCBmb3IgQVBJcyB0aGF0IGFjY2VwdCBgbGFtYmRhLklXZWJGdW5jdGlvblJlZmAuICovXG4gIHB1YmxpYyBnZXQgd2ViRnVuY3Rpb25SZWYoKTogbGFtYmRhLldlYkZ1bmN0aW9uUmVmZXJlbmNlIHtcbiAgICByZXR1cm4geyBmdW5jdGlvbkFybjogdGhpcy53ZWJGdW5jdGlvbkFybiB9O1xuICB9XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFdlYkZ1bmN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgaWYgKHByb3BzLnJ1bnRpbWUuZmFtaWx5ICE9PSBsYW1iZGEuUnVudGltZUZhbWlseS5OT0RFSlMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IExhbWJkYSBXZWIgRnVuY3Rpb25zIHJ1biBOb2RlLmpzIG9ubHksIGdvdCAke3Byb3BzLnJ1bnRpbWUubmFtZX1gKTtcbiAgICB9XG4gICAgY29uc3QgdGltZW91dCA9IHByb3BzLnRpbWVvdXQ/LnRvU2Vjb25kcygpID8/IDMwO1xuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHRpbWVvdXQpICYmICh0aW1lb3V0IDwgMyB8fCB0aW1lb3V0ID4gOTAwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogdGltZW91dCBtdXN0IGJlIGJldHdlZW4gMyBzZWNvbmRzIGFuZCAxNSBtaW51dGVzLCBnb3QgJHt0aW1lb3V0fXNgKTtcbiAgICB9XG4gICAgY29uc3QgbWF4Q29uY3VycmVuY3kgPSBwcm9wcy5tYXhDb25jdXJyZW5jeVBlckVudmlyb25tZW50O1xuICAgIGNvbnN0IHZhbGlkQ29uY3VycmVuY3kgPSAobjogbnVtYmVyKSA9PiBOdW1iZXIuaXNJbnRlZ2VyKG4pICYmIG4gPj0gMSAmJiBuIDw9IDEyODtcbiAgICBpZiAobWF4Q29uY3VycmVuY3kgIT09IHVuZGVmaW5lZCAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKG1heENvbmN1cnJlbmN5KSAmJiAhdmFsaWRDb25jdXJyZW5jeShtYXhDb25jdXJyZW5jeSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IG1heENvbmN1cnJlbmN5UGVyRW52aXJvbm1lbnQgbXVzdCBiZSBhbiBpbnRlZ2VyIGZyb20gMSB0byAxMjgsIGdvdCAke21heENvbmN1cnJlbmN5fWApO1xuICAgIH1cbiAgICBjb25zdCByZXZpc2lvblJldGVudGlvbiA9IHByb3BzLnJldmlzaW9uUmV0ZW50aW9uID8/IDIwO1xuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHJldmlzaW9uUmV0ZW50aW9uKSAmJiAoIU51bWJlci5pc0ludGVnZXIocmV2aXNpb25SZXRlbnRpb24pIHx8IHJldmlzaW9uUmV0ZW50aW9uIDwgMSB8fCByZXZpc2lvblJldGVudGlvbiA+IDUwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogcmV2aXNpb25SZXRlbnRpb24gbXVzdCBiZSBhbiBpbnRlZ2VyIGZyb20gMSB0byA1MCwgZ290ICR7cmV2aXNpb25SZXRlbnRpb259YCk7XG4gICAgfVxuICAgIGNvbnN0IHN5c3RlbUxvZ0xldmVscyA9IFtsYW1iZGEuU3lzdGVtTG9nTGV2ZWwuREVCVUcsIGxhbWJkYS5TeXN0ZW1Mb2dMZXZlbC5JTkZPLCBsYW1iZGEuU3lzdGVtTG9nTGV2ZWwuV0FSTl07XG4gICAgaWYgKHByb3BzLnN5c3RlbUxvZ0xldmVsVjIgIT09IHVuZGVmaW5lZCAmJiAhc3lzdGVtTG9nTGV2ZWxzLmluY2x1ZGVzKHByb3BzLnN5c3RlbUxvZ0xldmVsVjIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiBzeXN0ZW1Mb2dMZXZlbFYyIG11c3QgYmUgREVCVUcsIElORk8gb3IgV0FSTiBmb3IgTGFtYmRhIFdlYiBGdW5jdGlvbnNgKTtcbiAgICB9XG5cbiAgICB0aGlzLndlYkZ1bmN0aW9uTmFtZSA9IHByb3BzLndlYkZ1bmN0aW9uTmFtZSA/PyBOYW1lcy51bmlxdWVSZXNvdXJjZU5hbWUodGhpcywgeyBtYXhMZW5ndGg6IDY0LCBzZXBhcmF0b3I6ICctJyB9KTtcbiAgICBhc3NlcnRSZXNvdXJjZU5hbWUodGhpcywgJ3dlYkZ1bmN0aW9uTmFtZScsIHRoaXMud2ViRnVuY3Rpb25OYW1lKTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BzLmVudmlyb25tZW50ID8/IHt9KSkge1xuICAgICAgdGhpcy5hZGRFbnZpcm9ubWVudChrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmVudHJ5cG9pbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lbnZpcm9ubWVudC5BV1NfTEFNQkRBX05PREVKU19FTlRSWVBPSU5UID0gcHJvcHMuZW50cnlwb2ludDtcbiAgICB9XG5cbiAgICB0aGlzLnJvbGUgPSBwcm9wcy5yb2xlID8/IG5ldyBpYW0uUm9sZSh0aGlzLCAnU2VydmljZVJvbGUnLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnbGFtYmRhLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIG1hbmFnZWRQb2xpY2llczogW2lhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnc2VydmljZS1yb2xlL0FXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZScpXSxcbiAgICB9KTtcbiAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gdGhpcy5yb2xlO1xuXG4gICAgLy8gTG9nIGdyb3VwcyBmaXJzdDogdGhlIHNlcnZpY2Ugd291bGQgb3RoZXJ3aXNlIGNyZWF0ZSB0aGVtIHdpdGhvdXQgcmV0ZW50aW9uLlxuICAgIGNvbnN0IGxvZ0dyb3VwTmFtZSA9IGAvYXdzL2xhbWJkYS93ZWIvJHt0aGlzLndlYkZ1bmN0aW9uTmFtZX1gO1xuICAgIHRoaXMubG9nR3JvdXBOYW1lID0gbG9nR3JvdXBOYW1lO1xuICAgIHRoaXMubG9nT3B0aW9ucyA9IHsgbG9nUmV0ZW50aW9uOiBwcm9wcy5sb2dSZXRlbnRpb24sIGxvZ1JlbW92YWxQb2xpY3k6IHByb3BzLmxvZ1JlbW92YWxQb2xpY3kgfTtcbiAgICBjb25zdCBsb2dHcm91cHMgPSB0aGlzLmNyZWF0ZUxvZ0dyb3Vwcyhsb2dHcm91cE5hbWUpO1xuICAgIHRoaXMubG9nR3JvdXAgPSBsb2dzLkxvZ0dyb3VwLmZyb21Mb2dHcm91cE5hbWUodGhpcywgJ0xvZ0dyb3VwJywgbG9nR3JvdXBOYW1lKTtcblxuICAgIGNvbnN0IGNvZGUgPSBuZXcgV2ViRnVuY3Rpb25Db2RlKHRoaXMsICdDb2RlJywgcHJvcHMuY29kZSkubG9jYXRpb247XG5cbiAgICBjb25zdCBmbiA9IG5ldyBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb24odGhpcywgJ1Jlc291cmNlJywgeyBmdW5jdGlvbk5hbWU6IHRoaXMud2ViRnVuY3Rpb25OYW1lIH0pO1xuICAgIC8vIFRoZSBmdW5jdGlvbiBpcyBkZWxldGVkIGJlZm9yZSBpdHMgbG9nIGdyb3Vwcywgd2hpY2ggdGhlbiB3YWl0IGZvciBsYXRlIGZsdXNoZXMuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiBsb2dHcm91cHMpIGZuLm5vZGUuYWRkRGVwZW5kZW5jeShncm91cC5yZXNvdXJjZSk7XG4gICAgVmFsaWRhdGlvbnMub2YoZm4pLmFja25vd2xlZGdlKENGTl9WQUxJREFURV9VTktOT1dOX1RZUEUpO1xuICAgIHRoaXMucmVzb3VyY2UgPSBmbjtcbiAgICB0aGlzLndlYkZ1bmN0aW9uQXJuID0gZm4uYXR0ckZ1bmN0aW9uQXJuO1xuXG4gICAgY29uc3QgcmV2aXNpb24gPSBuZXcgbGFtYmRhLkNmbldlYkZ1bmN0aW9uUmV2aXNpb24odGhpcywgJ1JldmlzaW9uJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiBmbi5hdHRyRnVuY3Rpb25Bcm4sXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICBidWlsZENvbmZpZzoge1xuICAgICAgICBjb2RlQ29uZmlnOiB7IHMzT2JqZWN0OiB7IGJ1Y2tldDogY29kZS5idWNrZXROYW1lLCBrZXk6IGNvZGUub2JqZWN0S2V5LCB2ZXJzaW9uSWQ6IGNvZGUub2JqZWN0VmVyc2lvbiB9IH0sXG4gICAgICAgIHJ1bnRpbWVDb25maWc6IHsgcnVudGltZTogcHJvcHMucnVudGltZS5uYW1lIH0sXG4gICAgICB9LFxuICAgICAgc2VydmljZUNvbmZpZzoge1xuICAgICAgICBleGVjdXRpb25Sb2xlQXJuOiB0aGlzLnJvbGUucm9sZUFybixcbiAgICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IExhenkuYW55KHsgcHJvZHVjZTogKCkgPT4gKE9iamVjdC5rZXlzKHRoaXMuZW52aXJvbm1lbnQpLmxlbmd0aCA+IDAgPyB7IC4uLnRoaXMuZW52aXJvbm1lbnQgfSA6IHVuZGVmaW5lZCkgfSksXG4gICAgICAgIHRpbWVvdXRTZWNvbmRzOiB0aW1lb3V0LFxuICAgICAgICBtYXhDb25jdXJyZW5jeVBlckVudmlyb25tZW50OiBtYXhDb25jdXJyZW5jeSxcbiAgICAgICAgdGVsZW1ldHJ5Q29uZmlnOiB7XG4gICAgICAgICAgbG9nZ2luZ0NvbmZpZzoge1xuICAgICAgICAgICAgbG9nR3JvdXA6IGxvZ0dyb3VwTmFtZSxcbiAgICAgICAgICAgIGFwcGxpY2F0aW9uTG9nTGV2ZWw6IHByb3BzLmFwcGxpY2F0aW9uTG9nTGV2ZWxWMixcbiAgICAgICAgICAgIHN5c3RlbUxvZ0xldmVsOiBwcm9wcy5zeXN0ZW1Mb2dMZXZlbFYyLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIC8vIFdhaXQgZm9yIHRoZSByb2xlJ3MgcG9saWNpZXMsIHNvIHRoZSBmaXJzdCBlbnZpcm9ubWVudCBzdGFydHMgd2l0aCBpdHMgcGVybWlzc2lvbnMuXG4gICAgcmV2aXNpb24ubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMucm9sZSk7XG4gICAgVmFsaWRhdGlvbnMub2YocmV2aXNpb24pLmFja25vd2xlZGdlKENGTl9WQUxJREFURV9VTktOT1dOX1RZUEUpO1xuICAgIC8vIFJlcGxhY2VkIHJldmlzaW9ucyBzdGF5IGFzIHJvbGxiYWNrIHRhcmdldHM7IFJldmlzaW9uQ2xlYW51cCBkZWxldGVzIHRoZSBvbGRlc3QuIERlbGV0aW5nIHRoZSBmdW5jdGlvbiBkZWxldGVzIHRoZW0gYWxsLlxuICAgIHJldmlzaW9uLmFwcGx5UmVtb3ZhbFBvbGljeShSZW1vdmFsUG9saWN5LlJFVEFJTik7XG4gICAgdGhpcy5yZXZpc2lvbklkID0gcmV2aXNpb24uYXR0clJldmlzaW9uSWQ7XG4gICAgdGhpcy5jdXJyZW50UmV2aXNpb24gPSBXZWJGdW5jdGlvblJldmlzaW9uLl9jdXJyZW50KHRoaXMsICdDdXJyZW50UmV2aXNpb24nLCB0aGlzLCByZXZpc2lvbi5hdHRyUmV2aXNpb25JZCwgcmV2aXNpb24uYXR0clJldmlzaW9uQXJuKTtcblxuICAgIHRoaXMucmV2aXNpb25DbGVhbnVwID0gbmV3IFJldmlzaW9uQ2xlYW51cCh0aGlzLCAnUmV2aXNpb25DbGVhbnVwJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiB0aGlzLndlYkZ1bmN0aW9uTmFtZSxcbiAgICAgIGZ1bmN0aW9uQXJuOiBmbi5hdHRyRnVuY3Rpb25Bcm4sXG4gICAgICBrZWVwOiByZXZpc2lvblJldGVudGlvbixcbiAgICAgIHJldmlzaW9uSWRzOiAoKSA9PiBbdGhpcy5jdXJyZW50UmV2aXNpb24ucmV2aXNpb25JZCwgLi4udGhpcy5lbmRwb2ludHMuZmxhdE1hcCgoZSkgPT4gZS5fcmV2aXNpb25JZHMoKSldLFxuICAgIH0pO1xuXG4gICAgdGhpcy5lbmRwb2ludCA9IHRoaXMuY3JlYXRlRW5kcG9pbnQoJ0VuZHBvaW50JywgeyAuLi5wcm9wcy5lbmRwb2ludCwgYXV0aFR5cGU6IHByb3BzLmF1dGhUeXBlIH0sICdkZWZhdWx0Jyk7XG4gICAgdGhpcy5ncmFudHMgPSB0aGlzLmVuZHBvaW50LmdyYW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGVuZHBvaW50ICh1cCB0byAxMCBwZXIgZnVuY3Rpb24pLCBlLmcuIGEgcHVibGljIG9uZSBuZXh0IHRvIGFuIElBTS1vbmx5IG9uZSwgb3Igb25lIHBpbm5lZCB0byBhblxuICAgKiBlYXJsaWVyIHJldmlzaW9uLiBFYWNoIGVuZHBvaW50IGhhcyBpdHMgb3duIFVSTCwgYXV0aGVudGljYXRpb24sIHJlZ2lvbnMgYW5kIGxpbWl0cy5cbiAgICpcbiAgICogQHBhcmFtIGlkIHRoZSBlbmRwb2ludCdzIGNvbnN0cnVjdCBJRCwgYWxzbyB1c2VkIGluIGl0cyBnZW5lcmF0ZWQgbmFtZSAoYDxpZD4tPGhhc2g+YClcbiAgICovXG4gIHB1YmxpYyBhZGRFbmRwb2ludChpZDogc3RyaW5nLCBvcHRpb25zOiBBZGRXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyk6IFdlYkZ1bmN0aW9uRW5kcG9pbnQge1xuICAgIGNvbnN0IHByZWZpeCA9IGlkLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTldKy9nLCAnLScpLnJlcGxhY2UoL14tKy8sICcnKS5zbGljZSgwLCA1NSkucmVwbGFjZSgvLSskLywgJycpIHx8ICdlbmRwb2ludCc7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlRW5kcG9pbnQoaWQsIG9wdGlvbnMsIHByZWZpeCwgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuIE5hbWVzIHN0YXJ0aW5nIHdpdGggYEFXU19gIGFyZSByZXNlcnZlZC5cbiAgICovXG4gIHB1YmxpYyBhZGRFbnZpcm9ubWVudChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFdlYkZ1bmN0aW9uIHtcbiAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoJ0FXU18nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogZW52aXJvbm1lbnQgdmFyaWFibGUgJHtrZXl9IGlzIHJlc2VydmVkIChuYW1lcyBzdGFydGluZyB3aXRoIEFXU18gYXJlIHNldCBieSB0aGUgcnVudGltZSkke2tleSA9PT0gJ0FXU19MQU1CREFfTk9ERUpTX0VOVFJZUE9JTlQnID8gJzsgdXNlIHRoZSBlbnRyeXBvaW50IHByb3BlcnR5JyA6ICcnfWApO1xuICAgIH1cbiAgICB0aGlzLmVudmlyb25tZW50W2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgc3RhdGVtZW50IHRvIHRoZSBleGVjdXRpb24gcm9sZSdzIHBvbGljeS5cbiAgICovXG4gIHB1YmxpYyBhZGRUb1JvbGVQb2xpY3koc3RhdGVtZW50OiBpYW0uUG9saWN5U3RhdGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5yb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KHN0YXRlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIGBncmFudGVlYCB0byBjYWxsIHRoZSBlbmRwb2ludC4gU2hvcnRjdXQgZm9yIGBncmFudHMuaW52b2tlKGdyYW50ZWUpYCwgYXMgb24gYGxhbWJkYS5GdW5jdGlvbmAuXG4gICAqIFtkaXNhYmxlLWF3c2xpbnQ6bm8tZ3JhbnRzXVxuICAgKi9cbiAgcHVibGljIGdyYW50SW52b2tlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5ncmFudHMuaW52b2tlKGdyYW50ZWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgbWV0cmljIG9mIHRoaXMgZnVuY3Rpb24ncyBleGVjdXRpb24gZW52aXJvbm1lbnRzIGluIGBBV1MvTGFtYmRhL1dlYmAgKGRpbWVuc2lvbiBgRnVuY3Rpb25OYW1lYCksIGFjcm9zcyBhbGwgZW5kcG9pbnRzLlxuICAgKiBGb3IgcmVxdWVzdCBhbmQgZXJyb3IgY291bnRzLCB1c2UgdGhlIGVuZHBvaW50J3MgbWV0cmljcyAoYGZuLmVuZHBvaW50Lm1ldHJpY1JlcXVlc3RzKClgKS5cbiAgICpcbiAgICogTWV0cmljcyBhcmUgcHVibGlzaGVkIGluIHRoZSByZWdpb24gdGhhdCBzZXJ2ZWQgdGhlIHJlcXVlc3Q6IHBhc3MgYHJlZ2lvbmAgZm9yIGFub3RoZXIgc2VydmluZyByZWdpb24uXG4gICAqIEFuIGFsYXJtIGNhbiBvbmx5IHVzZSBtZXRyaWNzIGZyb20gaXRzIG93biBzdGFjaydzIHJlZ2lvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciAxIG1pbnV0ZSwgaW4gdGhlIGhvbWUgcmVnaW9uXG4gICAqL1xuICBwdWJsaWMgbWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgICBuYW1lc3BhY2U6IFdFQl9OQU1FU1BBQ0UsXG4gICAgICBtZXRyaWNOYW1lLFxuICAgICAgZGltZW5zaW9uc01hcDogeyBGdW5jdGlvbk5hbWU6IHRoaXMud2ViRnVuY3Rpb25OYW1lIH0sXG4gICAgICBzdGF0aXN0aWM6IGNsb3Vkd2F0Y2guU3RhdHMuU1VNLFxuICAgICAgcGVyaW9kOiBERUZBVUxUX1BFUklPRCxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFRpbWUgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgd2VyZSBhY3RpdmUgKGBFbnZpcm9ubWVudEFjdGl2ZVRpbWVgKS4gKi9cbiAgcHVibGljIG1ldHJpY0FjdGl2ZVRpbWUocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdFbnZpcm9ubWVudEFjdGl2ZVRpbWUnLCBwcm9wcyk7XG4gIH1cblxuICAvKiogQ1BVIHRpbWUgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgdXNlZCAoYEVudmlyb25tZW50Q1BVVGltZWApLiAqL1xuICBwdWJsaWMgbWV0cmljQ3B1VGltZShwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ0Vudmlyb25tZW50Q1BVVGltZScsIHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyBhbiBleGVjdXRpb24gZW52aXJvbm1lbnQgaGFuZGxlZCBhdCBvbmNlIChgRW52aXJvbm1lbnRDb25jdXJyZW50UmVxdWVzdHNgKSwgdG8gY29tcGFyZSB3aXRoXG4gICAqIGBtYXhDb25jdXJyZW5jeVBlckVudmlyb25tZW50YC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBtYXhpbXVtIG92ZXIgMSBtaW51dGVcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNDb25jdXJyZW50UmVxdWVzdHMocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdFbnZpcm9ubWVudENvbmN1cnJlbnRSZXF1ZXN0cycsIHsgc3RhdGlzdGljOiBjbG91ZHdhdGNoLlN0YXRzLk1BWElNVU0sIC4uLnByb3BzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlYWsgbWVtb3J5IGFuIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCB1c2VkIChgRW52aXJvbm1lbnRNYXhNZW1vcnlVc2FnZWApOyBlYWNoIGVudmlyb25tZW50IGhhcyAyIEdCLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG1heGltdW0gb3ZlciAxIG1pbnV0ZVxuICAgKi9cbiAgcHVibGljIG1ldHJpY01heE1lbW9yeVVzYWdlKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnRW52aXJvbm1lbnRNYXhNZW1vcnlVc2FnZScsIHsgc3RhdGlzdGljOiBjbG91ZHdhdGNoLlN0YXRzLk1BWElNVU0sIC4uLnByb3BzIH0pO1xuICB9XG5cbiAgLyoqIEJ5dGVzIHNlbnQgaW4gcmVzcG9uc2VzIChgUmVzcG9uc2VCeXRlc2ApLiAqL1xuICBwdWJsaWMgbWV0cmljUmVzcG9uc2VCeXRlcyhwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ1Jlc3BvbnNlQnl0ZXMnLCBwcm9wcyk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVuZHBvaW50KGlkOiBzdHJpbmcsIG9wdGlvbnM6IEFkZFdlYkZ1bmN0aW9uRW5kcG9pbnRPcHRpb25zLCBuYW1lUHJlZml4OiBzdHJpbmcsIG5hbWVTZWVkPzogc3RyaW5nKTogV2ViRnVuY3Rpb25FbmRwb2ludCB7XG4gICAgaWYgKHRoaXMuZW5kcG9pbnRzLmxlbmd0aCA+PSBNQVhfRU5EUE9JTlRTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiBhIFdlYiBGdW5jdGlvbiBjYW4gaGF2ZSBhdCBtb3N0ICR7TUFYX0VORFBPSU5UU30gZW5kcG9pbnRzYCk7XG4gICAgfVxuICAgIGNvbnN0IGVuZHBvaW50ID0gV2ViRnVuY3Rpb25FbmRwb2ludC5fY3JlYXRlKHRoaXMsIGlkLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgd2ViRnVuY3Rpb246IHRoaXMsXG4gICAgICBjdXJyZW50UmV2aXNpb246IHRoaXMuY3VycmVudFJldmlzaW9uLFxuICAgICAgbmFtZVByZWZpeCxcbiAgICAgIG5hbWVTZWVkLFxuICAgIH0pO1xuICAgIGNvbnN0IGNsYXNoID0gdGhpcy5lbmRwb2ludHMuZmluZCgoZSkgPT4gIVRva2VuLmlzVW5yZXNvbHZlZChlLmVuZHBvaW50TmFtZSkgJiYgZS5lbmRwb2ludE5hbWUgPT09IGVuZHBvaW50LmVuZHBvaW50TmFtZSk7XG4gICAgaWYgKGNsYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW5kcG9pbnQubm9kZS5wYXRofTogZW5kcG9pbnROYW1lICcke2VuZHBvaW50LmVuZHBvaW50TmFtZX0nIGlzIGFscmVhZHkgdXNlZCBieSAke2NsYXNoLm5vZGUucGF0aH1gKTtcbiAgICB9XG4gICAgdGhpcy5lbmRwb2ludHMucHVzaChlbmRwb2ludCk7XG4gICAgLy8gUmV2aXNpb25zIGFuIGVuZHBvaW50IHN0b3BzIHJvdXRpbmcgdG8gb25seSBiZWNvbWUgZGVsZXRhYmxlIG9uY2UgaXQncyB1cGRhdGVkLlxuICAgIHRoaXMucmV2aXNpb25DbGVhbnVwLm5vZGUuYWRkRGVwZW5kZW5jeShlbmRwb2ludCk7XG4gICAgLy8gRWFjaCBzZXJ2aW5nIHJlZ2lvbidzIC5sb2NhbCBncm91cCBtdXN0IGV4aXN0IGJlZm9yZSB0cmFmZmljLCBhbmQgb3V0bGl2ZSB0aGUgZnVuY3Rpb24uXG4gICAgZm9yIChjb25zdCByZWdpb24gb2YgZW5kcG9pbnQucmVnaW9ucy5zbGljZSgxKSkge1xuICAgICAgaWYgKHRoaXMucmVtb3RlTG9nR3JvdXBzLmhhcyhyZWdpb24pKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5sb2dHcm91cEluKGBMb2NhbExvZ3MtJHtyZWdpb259YCwgcmVnaW9uLCBgJHt0aGlzLmxvZ0dyb3VwTmFtZX0ubG9jYWxgKTtcbiAgICAgIHRoaXMucmVtb3RlTG9nR3JvdXBzLnNldChyZWdpb24sIGdyb3VwKTtcbiAgICAgIHRoaXMucmVzb3VyY2Uubm9kZS5hZGREZXBlbmRlbmN5KGdyb3VwLnJlc291cmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIGVuZHBvaW50O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVMb2dHcm91cHMobG9nR3JvdXBOYW1lOiBzdHJpbmcpOiBXZWJGdW5jdGlvbkxvZ0dyb3VwW10ge1xuICAgIGNvbnN0IGhvbWUgPSBTdGFjay5vZih0aGlzKS5yZWdpb247XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMubG9nR3JvdXBJbignTG9ncycsIGhvbWUsIGxvZ0dyb3VwTmFtZSksXG4gICAgICB0aGlzLmxvZ0dyb3VwSW4oJ0xvY2FsTG9ncycsIGhvbWUsIGAke2xvZ0dyb3VwTmFtZX0ubG9jYWxgKSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dHcm91cEluKGlkOiBzdHJpbmcsIHJlZ2lvbjogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBXZWJGdW5jdGlvbkxvZ0dyb3VwIHtcbiAgICByZXR1cm4gbmV3IFdlYkZ1bmN0aW9uTG9nR3JvdXAodGhpcywgaWQsIHtcbiAgICAgIHJlZ2lvbixcbiAgICAgIGxvZ0dyb3VwTmFtZTogbmFtZSxcbiAgICAgIHJldGVudGlvbjogdGhpcy5sb2dPcHRpb25zLmxvZ1JldGVudGlvbiA/PyBsb2dzLlJldGVudGlvbkRheXMuT05FX01PTlRILFxuICAgICAgcmVtb3ZhbFBvbGljeTogdGhpcy5sb2dPcHRpb25zLmxvZ1JlbW92YWxQb2xpY3kgPz8gUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
402
+ /** A Web Function defined outside this app. */
403
+ class ImportedWebFunction extends WebFunctionBase {
404
+ webFunctionName;
405
+ webFunctionArn;
406
+ endpointName;
407
+ constructor(scope, id, attrs) {
408
+ const arn = importedArn(scope, id, attrs);
409
+ super(scope, id, { environmentFromArn: arn });
410
+ this.webFunctionArn = arn;
411
+ this.webFunctionName = attrs.webFunctionName ?? aws_cdk_lib_1.Arn.split(arn, aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME).resourceName;
412
+ if (attrs.endpointName !== undefined)
413
+ (0, validation_1.assertResourceName)(this, 'endpointName', attrs.endpointName);
414
+ this.endpointName = attrs.endpointName;
415
+ }
416
+ grantInvoke(grantee) {
417
+ return web_function_grants_1.WebFunctionGrants._forEndpointArns([`${this.webFunctionArn}/endpoint/${this.endpointName ?? '*'}`]).invoke(grantee);
418
+ }
419
+ addToResourcePolicy(_statement) {
420
+ aws_cdk_lib_1.Annotations.of(this).addWarningV2('@cdk-lambda-web:importedResourcePolicy', 'Statements are not added to an imported function\'s resource policy: add them in the stack that creates the function (a function has one resource policy, and only one stack can write it).');
421
+ return { statementAdded: false };
422
+ }
423
+ }
424
+ function importedArn(scope, id, attrs) {
425
+ const path = `${scope.node.path}/${id}`;
426
+ if ((attrs.webFunctionArn === undefined) === (attrs.webFunctionName === undefined)) {
427
+ throw new Error(`${path}: give either webFunctionArn or webFunctionName`);
428
+ }
429
+ if (attrs.webFunctionName !== undefined) {
430
+ if (!aws_cdk_lib_1.Token.isUnresolved(attrs.webFunctionName)) {
431
+ // Validated against the scope, before the import exists.
432
+ (0, validation_1.assertResourceName)(scope, 'webFunctionName', attrs.webFunctionName);
433
+ }
434
+ return aws_cdk_lib_1.Stack.of(scope).formatArn({
435
+ service: 'lambda', resource: 'web-function', resourceName: attrs.webFunctionName, arnFormat: aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME,
436
+ });
437
+ }
438
+ const arn = attrs.webFunctionArn;
439
+ if (!aws_cdk_lib_1.Token.isUnresolved(arn) && !/^arn:[^:]+:lambda:[a-z0-9-]+:\d{12}:web-function\/[A-Za-z0-9_-]{1,64}$/.test(arn)) {
440
+ throw new Error(`${path}: '${arn}' is not a Web Function ARN (arn:<partition>:lambda:<region>:<account>:web-function/<name>)`);
441
+ }
442
+ return arn;
443
+ }
444
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dlYi1mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXFKO0FBQ3JKLHVFQUF5RDtBQUN6RCx5REFBMkM7QUFDM0MsK0RBQWlEO0FBQ2pELDJEQUE2QztBQUc3Qyx5Q0FBaUQ7QUFDakQsbURBQTBEO0FBQzFELCtDQUFrRTtBQUNsRSwrREFBa0U7QUFDbEUsaUVBQTZEO0FBQzdELHFEQUFxRjtBQUNyRixtRUFBbUk7QUFDbkksK0RBQTBEO0FBQzFELG1FQUF5RjtBQUV6Riw4REFBOEQ7QUFDOUQsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDO0FBMFB6Qjs7R0FFRztBQUNILE1BQXNCLGVBQWdCLFNBQVEsc0JBQVE7O0lBSXBELG1GQUFtRjtJQUNuRixJQUFXLGNBQWM7UUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQWFEOzs7Ozs7OztPQVFHO0lBQ0ksTUFBTSxDQUFDLFVBQWtCLEVBQUUsS0FBZ0M7UUFDaEUsc0VBQXNFO1FBQ3RFLE1BQU0sTUFBTSxHQUFHLENBQUMsbUJBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDL0gsT0FBTyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUM7WUFDM0IsU0FBUyxFQUFFLHVCQUFhO1lBQ3hCLFVBQVU7WUFDVixhQUFhLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLGVB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QyxLQUFLLENBQUMsZUFBZSxLQUFLLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDbkYsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksaURBQWlELENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsZUFBZSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxtQkFBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUMvQyx5REFBeUQ7WUFDekQsSUFBQSwrQkFBa0IsRUFBQyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFDRCxPQUFPLG1CQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMvQixPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLHVCQUFTLENBQUMsbUJBQW1CO1NBQzNILENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsY0FBZSxDQUFDO0lBQ2xDLElBQUksQ0FBQyxtQkFBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHdFQUF3RSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3BILE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLE1BQU0sR0FBRyw2RkFBNkYsQ0FBQyxDQUFDO0lBQ2pJLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbm5vdGF0aW9ucywgQXJuLCBBcm5Gb3JtYXQsIER1cmF0aW9uLCB0eXBlIElSZXNvdXJjZSwgTGF6eSwgTmFtZXMsIFJlbW92YWxQb2xpY3ksIFJlc291cmNlLCBTdGFjaywgVG9rZW4sIFZhbGlkYXRpb25zIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgY2xvdWR3YXRjaCBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sb2dzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgV2ViRnVuY3Rpb25BdXRoVHlwZSB9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHsgV2ViRnVuY3Rpb25Db2RlIH0gZnJvbSAnLi9wcml2YXRlL2NvZGUnO1xuaW1wb3J0IHsgV2ViRnVuY3Rpb25Mb2dHcm91cCB9IGZyb20gJy4vcHJpdmF0ZS9sb2ctZ3JvdXAnO1xuaW1wb3J0IHsgREVGQVVMVF9QRVJJT0QsIFdFQl9OQU1FU1BBQ0UgfSBmcm9tICcuL3ByaXZhdGUvbWV0cmljcyc7XG5pbXBvcnQgeyBpbnNwZWN0UmVzb3VyY2VQb2xpY3kgfSBmcm9tICcuL3ByaXZhdGUvcmVzb3VyY2UtcG9saWN5JztcbmltcG9ydCB7IFJldmlzaW9uQ2xlYW51cCB9IGZyb20gJy4vcHJpdmF0ZS9yZXZpc2lvbi1jbGVhbnVwJztcbmltcG9ydCB7IENGTl9WQUxJREFURV9VTktOT1dOX1RZUEUsIGFzc2VydFJlc291cmNlTmFtZSB9IGZyb20gJy4vcHJpdmF0ZS92YWxpZGF0aW9uJztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uRW5kcG9pbnQsIHR5cGUgQWRkV2ViRnVuY3Rpb25FbmRwb2ludE9wdGlvbnMsIHR5cGUgV2ViRnVuY3Rpb25FbmRwb2ludE9wdGlvbnMgfSBmcm9tICcuL3dlYi1mdW5jdGlvbi1lbmRwb2ludCc7XG5pbXBvcnQgeyBXZWJGdW5jdGlvbkdyYW50cyB9IGZyb20gJy4vd2ViLWZ1bmN0aW9uLWdyYW50cyc7XG5pbXBvcnQgeyBXZWJGdW5jdGlvblJldmlzaW9uLCB0eXBlIElXZWJGdW5jdGlvblJldmlzaW9uIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24tcmV2aXNpb24nO1xuXG4vKiogRW5kcG9pbnRzIHBlciBmdW5jdGlvbiAoc2VydmljZSBxdW90YSwgbm90IGFkanVzdGFibGUpLiAqL1xuY29uc3QgTUFYX0VORFBPSU5UUyA9IDEwO1xuXG4vKipcbiAqIE9wdGlvbnMgc2hhcmVkIGJ5IGBXZWJGdW5jdGlvbmAgYW5kIGBOb2RlanNXZWJGdW5jdGlvbmA6IGV2ZXJ5dGhpbmcgZXhjZXB0IGhvdyB0aGUgY29kZSBpcyBzdXBwbGllZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogSG93IGNhbGxlcnMgb2YgdGhlIGVuZHBvaW50IGFyZSBhdXRoZW50aWNhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aFR5cGU6IFdlYkZ1bmN0aW9uQXV0aFR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGVuZHBvaW50IChgZm4uZW5kcG9pbnRgKTogd2hlcmUgaXQgc2VydmVzIGZyb20sIGl0cyBuYW1lIGFuZCBsaW1pdHMuXG4gICAqIEl0IHNlcnZlcyB0aGUgY3VycmVudCByZXZpc2lvbjsgcm91dGUgaXQgZWxzZXdoZXJlIHdpdGggYGZuLmVuZHBvaW50LnJvdXRlVHJhZmZpYygpYC5cbiAgICogQWRkIG1vcmUgZW5kcG9pbnRzIHdpdGggYGFkZEVuZHBvaW50YC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIEhPTUVfUkVHSU9OIGVuZHBvaW50IHNlcnZpbmcgdGhlIGN1cnJlbnQgcmV2aXNpb25cbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50PzogV2ViRnVuY3Rpb25FbmRwb2ludE9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IG9mIHRoZSBuZXdlc3QgcmV2aXNpb25zIHRvIGtlZXAgKDEtNTApLiBFYWNoIGRlcGxveW1lbnQgdGhhdCBjaGFuZ2VzIHRoZSBjb2RlIG9yXG4gICAqIGNvbmZpZ3VyYXRpb24gY3JlYXRlcyBhIHJldmlzaW9uOyBvbGRlciBvbmVzIHN0YXkgYXZhaWxhYmxlIHRvIHJvbGwgYmFjayB0byBvciByb3V0ZSB0cmFmZmljIHRvLFxuICAgKiBhbmQgdGhlIG9sZGVzdCBiZXlvbmQgdGhpcyBjb3VudCBhcmUgZGVsZXRlZCBhZnRlciBlYWNoIGRlcGxveW1lbnQuXG4gICAqXG4gICAqIFJldmlzaW9ucyB0aGF0IGFuIGVuZHBvaW50IHJvdXRlcyB0byBhcmUgbmV2ZXIgZGVsZXRlZCwgYW5kIG5laXRoZXIgYXJlIHRob3NlIHRoZSBwcmV2aW91c1xuICAgKiBkZXBsb3ltZW50IHVzZWQgKGEgcm9sbGJhY2sgcmV0dXJucyB0byB0aGVtKS5cbiAgICpcbiAgICogQGRlZmF1bHQgMjBcbiAgICovXG4gIHJlYWRvbmx5IHJldmlzaW9uUmV0ZW50aW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24ncyBuYW1lLiBSZW5hbWluZyBhIGZ1bmN0aW9uIHJlcGxhY2VzIGl0LCBhbmQgaXRzIGVuZHBvaW50IGdldHMgYSBuZXcgVVJMLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgdW5pcXVlIG5hbWUgZ2VuZXJhdGVkIGZyb20gdGhlIGNvbnN0cnVjdCBwYXRoIChtb3ZpbmcgdGhlIGNvbnN0cnVjdCBjaGFuZ2VzIGl0KVxuICAgKi9cbiAgcmVhZG9ubHkgd2ViRnVuY3Rpb25OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBmdW5jdGlvbidzIGNvZGUgYW5kIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZGVzY3JpcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhlY3V0aW9uIHJvbGUuXG4gICAqXG4gICAqIEFuIGBpYW0uSVJvbGVgIChub3QgYElSb2xlUmVmYCkgYmVjYXVzZSB0aGUgZnVuY3Rpb24gYWRkcyBzdGF0ZW1lbnRzIHRvIGl0IGFuZCBncmFudHMgdGhyb3VnaCBpdC5cbiAgICogW2Rpc2FibGUtYXdzbGludDpwcmVmZXItcmVmLWludGVyZmFjZV1cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIHJvbGUgdHJ1c3RpbmcgYGxhbWJkYS5hbWF6b25hd3MuY29tYCB3aXRoIGBBV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGVgXG4gICAqL1xuICByZWFkb25seSByb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMuIE5hbWVzIHN0YXJ0aW5nIHdpdGggYEFXU19gIGFyZSByZXNlcnZlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudD86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIGEgc2luZ2xlIHJlcXVlc3QgbWF5IHJ1bi5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uc2Vjb25kcygzMClcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogSG93IG1hbnkgcmVxdWVzdHMgb25lIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBoYW5kbGVzIGF0IHRoZSBzYW1lIHRpbWUgKDEtMTI4KS5cbiAgICogUmVxdWVzdHMgc2hhcmUgbW9kdWxlLWxldmVsIHN0YXRlLCBzbyBoYW5kbGVycyBtdXN0IGJlIGNvbmN1cnJlbmN5LXNhZmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IDY0XG4gICAqL1xuICByZWFkb25seSBtYXhDb25jdXJyZW5jeVBlckVudmlyb25tZW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBSZXRlbnRpb24gZm9yIGV2ZXJ5IGxvZyBncm91cCBvZiB0aGUgZnVuY3Rpb24sIGluIGV2ZXJ5IHJlZ2lvbiBpdCBzZXJ2ZXMgZnJvbS5cbiAgICpcbiAgICogQGRlZmF1bHQgbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USFxuICAgKi9cbiAgcmVhZG9ubHkgbG9nUmV0ZW50aW9uPzogbG9ncy5SZXRlbnRpb25EYXlzO1xuXG4gIC8qKlxuICAgKiBXaGF0IGhhcHBlbnMgdG8gdGhlIGxvZyBncm91cHMgd2hlbiB0aGUgZnVuY3Rpb24gaXMgcmVtb3ZlZDogUkVUQUlOIG9yIERFU1RST1kuXG4gICAqIFdpdGggREVTVFJPWSwgZGVsZXRpb24gd2FpdHMgYWJvdXQgYSBtaW51dGUgZm9yIGVudmlyb25tZW50cyB0byBmbHVzaCB0aGVpciBsYXN0IGxpbmVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBSZW1vdmFsUG9saWN5LlJFVEFJTlxuICAgKi9cbiAgcmVhZG9ubHkgbG9nUmVtb3ZhbFBvbGljeT86IFJlbW92YWxQb2xpY3k7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIGxldmVsIG9mIGFwcGxpY2F0aW9uIGxvZ3MgdG8ga2VlcC5cbiAgICpcbiAgICogQGRlZmF1bHQgbGFtYmRhLkFwcGxpY2F0aW9uTG9nTGV2ZWwuSU5GT1xuICAgKi9cbiAgcmVhZG9ubHkgYXBwbGljYXRpb25Mb2dMZXZlbFYyPzogbGFtYmRhLkFwcGxpY2F0aW9uTG9nTGV2ZWw7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIGxldmVsIG9mIHBsYXRmb3JtIGxvZ3MgdG8ga2VlcCAoREVCVUcsIElORk8gb3IgV0FSTikuXG4gICAqXG4gICAqIEBkZWZhdWx0IGxhbWJkYS5TeXN0ZW1Mb2dMZXZlbC5JTkZPXG4gICAqL1xuICByZWFkb25seSBzeXN0ZW1Mb2dMZXZlbFYyPzogbGFtYmRhLlN5c3RlbUxvZ0xldmVsO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGEgYFdlYkZ1bmN0aW9uYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvblByb3BzIGV4dGVuZHMgV2ViRnVuY3Rpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBOb2RlLmpzIHJ1bnRpbWUsIGUuZy4gYGxhbWJkYS5SdW50aW1lLk5PREVKU18yNF9YYC5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgY29kZTogYSB6aXAgaW4gUzMgKGBDb2RlLmZyb21Bc3NldGAsIGBDb2RlLmZyb21CdWNrZXRgLCBgQ29kZS5mcm9tQ3VzdG9tQ29tbWFuZGAsIGBDb2RlLmZyb21Eb2NrZXJCdWlsZGApLlxuICAgKiBJbmxpbmUgY29kZSBhbmQgY29udGFpbmVyIGltYWdlcyBhcmVuJ3Qgc3VwcG9ydGVkLlxuICAgKlxuICAgKiBUaGUgY29kZSBpcyBjb3BpZWQgaW50byB0aGUgc3RhY2sncyBjb2RlIGJ1Y2tldCwgd2hpY2ggTGFtYmRhIFdlYiBGdW5jdGlvbnMgY2FuIHJlYWQuXG4gICAqL1xuICByZWFkb25seSBjb2RlOiBsYW1iZGEuQ29kZTtcblxuICAvKipcbiAgICogVGhlIGZpbGUgdGhhdCBzdGFydHMgeW91ciBzZXJ2ZXIsIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBjb2RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnaW5kZXguanMnXG4gICAqL1xuICByZWFkb25seSBlbnRyeXBvaW50Pzogc3RyaW5nO1xuXG59XG5cbi8qKlxuICogQSBMYW1iZGEgV2ViIEZ1bmN0aW9uLCBjcmVhdGVkIGluIHRoaXMgYXBwIChgV2ViRnVuY3Rpb25gKSBvciBpbXBvcnRlZCAoYFdlYkZ1bmN0aW9uLmZyb21XZWJGdW5jdGlvbkFybmApLlxuICpcbiAqIGBhZGRUb1Jlc291cmNlUG9saWN5YCBhZGRzIHRvIHRoZSBmdW5jdGlvbidzIHJlc291cmNlIHBvbGljeSAod2hvIGVsc2UgbWF5IGNhbGwgb3IgbWFuYWdlIGl0KS4gQSBgV2ViRnVuY3Rpb25gIGhhc1xuICogb25lLCBjcmVhdGVkIGJ5IGl0cyBzdGFjayBvbiB0aGUgZmlyc3Qgc3RhdGVtZW50LiBBbiBpbXBvcnRlZCBmdW5jdGlvbidzIHBvbGljeSBiZWxvbmdzIHRvIHRoZSBzdGFjayB0aGF0IGNyZWF0ZWRcbiAqIGl0LCBzbyB0aGUgc3RhdGVtZW50IGlzbid0IGFkZGVkIChgc3RhdGVtZW50QWRkZWQ6IGZhbHNlYCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYkZ1bmN0aW9uIGV4dGVuZHMgSVJlc291cmNlLCBsYW1iZGEuSVdlYkZ1bmN0aW9uUmVmLCBpYW0uSVJlc291cmNlV2l0aFBvbGljeSB7XG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24ncyBuYW1lLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSB3ZWJGdW5jdGlvbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uJ3MgQVJOLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSB3ZWJGdW5jdGlvbkFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbGxvd3MgYGdyYW50ZWVgIHRvIGNhbGwgdGhlIGZ1bmN0aW9uJ3MgZW5kcG9pbnQgKGBsYW1iZGE6SW52b2tlV2ViRnVuY3Rpb25FbmRwb2ludGApOiB0aGUgZGVmYXVsdCBlbmRwb2ludFxuICAgKiBvZiBhIGBXZWJGdW5jdGlvbmA7IGZvciBhbiBpbXBvcnRlZCBmdW5jdGlvbiwgdGhlIGVuZHBvaW50IG5hbWVkIGluIGl0cyBhdHRyaWJ1dGVzLCBvciBldmVyeSBlbmRwb2ludC5cbiAgICpcbiAgICogRm9yIGEgYFdlYkZ1bmN0aW9uYCwgYSBncmFudGVlIGluIHRoaXMgYWNjb3VudCBnZXRzIGFuIElBTSBwb2xpY3kgc3RhdGVtZW50OyBhbm90aGVyIGFjY291bnQgb3IgYW4gQVdTIHNlcnZpY2VcbiAgICogYWxzbyBnZXRzIGEgc3RhdGVtZW50IGluIHRoZSBmdW5jdGlvbidzIHJlc291cmNlIHBvbGljeS4gRm9yIGFuIGltcG9ydGVkIGZ1bmN0aW9uLCBvbmx5IHRoZSBncmFudGVlJ3MgSUFNIHBvbGljeVxuICAgKiBjaGFuZ2VzOiBhY3Jvc3MgYWNjb3VudHMsIHRoZSBmdW5jdGlvbidzIG93biByZXNvdXJjZSBwb2xpY3kgbXVzdCBhbHNvIGFsbG93IHRoZSBncmFudGVlLlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICovXG4gIGdyYW50SW52b2tlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBBIG1ldHJpYyBvZiB0aGUgZnVuY3Rpb24ncyBleGVjdXRpb24gZW52aXJvbm1lbnRzIGluIGBBV1MvTGFtYmRhL1dlYmAgKGRpbWVuc2lvbiBgRnVuY3Rpb25OYW1lYCkuXG4gICAqL1xuICBtZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljO1xuXG4gIC8qKiBUaW1lIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnRzIHdlcmUgYWN0aXZlIChgRW52aXJvbm1lbnRBY3RpdmVUaW1lYCkuICovXG4gIG1ldHJpY0FjdGl2ZVRpbWUocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYztcblxuICAvKiogQ1BVIHRpbWUgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgdXNlZCAoYEVudmlyb25tZW50Q1BVVGltZWApLiAqL1xuICBtZXRyaWNDcHVUaW1lKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG5cbiAgLyoqIFJlcXVlc3RzIGFuIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBoYW5kbGVkIGF0IG9uY2UgKGBFbnZpcm9ubWVudENvbmN1cnJlbnRSZXF1ZXN0c2AsIG1heGltdW0pLiAqL1xuICBtZXRyaWNDb25jdXJyZW50UmVxdWVzdHMocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYztcblxuICAvKiogUGVhayBtZW1vcnkgYW4gZXhlY3V0aW9uIGVudmlyb25tZW50IHVzZWQgKGBFbnZpcm9ubWVudE1heE1lbW9yeVVzYWdlYCwgbWF4aW11bSkuICovXG4gIG1ldHJpY01heE1lbW9yeVVzYWdlKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG5cbiAgLyoqIEJ5dGVzIHNlbnQgaW4gcmVzcG9uc2VzIChgUmVzcG9uc2VCeXRlc2ApLiAqL1xuICBtZXRyaWNSZXNwb25zZUJ5dGVzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWM7XG59XG5cbi8qKlxuICogQXR0cmlidXRlcyBvZiBhbiBleGlzdGluZyBXZWIgRnVuY3Rpb24uIEdpdmUgaXRzIEFSTiBvciBpdHMgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvbkF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uJ3MgQVJOLCBlLmcuIGBhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTExMTIyMjIzMzMzOndlYi1mdW5jdGlvbi9vcmRlcnNgLiBJdCBtYXkgYmUgaW4gYW5vdGhlclxuICAgKiByZWdpb24gb3IgYWNjb3VudDsgYWNyb3NzIGFjY291bnRzLCBgZ3JhbnRJbnZva2VgIGFsc28gbmVlZHMgdGhlIGZ1bmN0aW9uJ3MgcmVzb3VyY2UgcG9saWN5IHRvIGFsbG93IHRoZSBjYWxsZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYnVpbHQgZnJvbSBgd2ViRnVuY3Rpb25OYW1lYCwgaW4gdGhpcyBzdGFjaydzIGFjY291bnQgYW5kIHJlZ2lvblxuICAgKi9cbiAgcmVhZG9ubHkgd2ViRnVuY3Rpb25Bcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbidzIG5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGFrZW4gZnJvbSBgd2ViRnVuY3Rpb25Bcm5gXG4gICAqL1xuICByZWFkb25seSB3ZWJGdW5jdGlvbk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbmRwb2ludCBgZ3JhbnRJbnZva2VgIGFsbG93cyBjYWxsaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGV2ZXJ5IGVuZHBvaW50IG9mIHRoZSBmdW5jdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnROYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBlcm1pc3Npb24gZm9yIGEgcHJpbmNpcGFsIG91dHNpZGUgdGhpcyBhY2NvdW50LCBhbiBBV1Mgc2VydmljZSBvciBhbiBvcmdhbml6YXRpb24gdG8gY2FsbCBhIGZ1bmN0aW9uJ3MgZW5kcG9pbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkZ1bmN0aW9uUGVybWlzc2lvbiB7XG4gIC8qKlxuICAgKiBXaG8gbWF5IGNhbGw6IGFuIGFjY291bnQgKGBpYW0uQWNjb3VudFByaW5jaXBhbGApLCBhIHJvbGUgb3IgdXNlciAoYGlhbS5Bcm5QcmluY2lwYWxgKSwgYW4gQVdTIHNlcnZpY2VcbiAgICogKGBpYW0uU2VydmljZVByaW5jaXBhbGAsIHdpdGggYHNvdXJjZUFybmAgb3IgYHNvdXJjZUFjY291bnRgKSBvciBhbiBvcmdhbml6YXRpb24gKGBpYW0uT3JnYW5pemF0aW9uUHJpbmNpcGFsYCkuXG4gICAqXG4gICAqIEEgcHJpbmNpcGFsIGluIGFub3RoZXIgYWNjb3VudCBhbHNvIG5lZWRzIGBsYW1iZGE6SW52b2tlV2ViRnVuY3Rpb25FbmRwb2ludGAgaW4gaXRzIG93biBJQU0gcG9saWN5LlxuICAgKi9cbiAgcmVhZG9ubHkgcHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50IHRoZSBwcmluY2lwYWwgbWF5IGNhbGwuIEl0IG11c3QgYmVsb25nIHRvIHRoaXMgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZXZlcnkgZW5kcG9pbnQgb2YgdGhlIGZ1bmN0aW9uLCBpbmNsdWRpbmcgb25lcyBhZGRlZCBsYXRlclxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnQ/OiBXZWJGdW5jdGlvbkVuZHBvaW50O1xuXG4gIC8qKlxuICAgKiBGb3IgYW4gQVdTIHNlcnZpY2U6IHRoZSBBUk4gb2YgdGhlIHJlc291cmNlIGNhbGxpbmcgb24gaXRzIGJlaGFsZiAoY29uZGl0aW9uIGBhd3M6U291cmNlQXJuYCwgYEFybkxpa2VgKSxcbiAgICogZS5nLiBhIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uLiBXaXRob3V0IGl0IG9yIGBzb3VyY2VBY2NvdW50YCwgYW55IGFjY291bnQncyB1c2Ugb2YgdGhlIHNlcnZpY2UgY291bGQgY2FsbCB0aGUgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY29uZGl0aW9uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZvciBhbiBBV1Mgc2VydmljZTogdGhlIGFjY291bnQgdGhhdCBvd25zIHRoZSByZXNvdXJjZSBjYWxsaW5nIG9uIGl0cyBiZWhhbGYgKGNvbmRpdGlvbiBgYXdzOlNvdXJjZUFjY291bnRgKS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjb25kaXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUFjY291bnQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hhdCBgV2ViRnVuY3Rpb25gIGFuZCBpbXBvcnRlZCBmdW5jdGlvbnMgaGF2ZSBpbiBjb21tb24uXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBXZWJGdW5jdGlvbkJhc2UgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElXZWJGdW5jdGlvbiB7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB3ZWJGdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHdlYkZ1bmN0aW9uQXJuOiBzdHJpbmc7XG5cbiAgLyoqIEEgcmVmZXJlbmNlIHRvIHRoaXMgZnVuY3Rpb24sIGZvciBBUElzIHRoYXQgYWNjZXB0IGBsYW1iZGEuSVdlYkZ1bmN0aW9uUmVmYC4gKi9cbiAgcHVibGljIGdldCB3ZWJGdW5jdGlvblJlZigpOiBsYW1iZGEuV2ViRnVuY3Rpb25SZWZlcmVuY2Uge1xuICAgIHJldHVybiB7IGZ1bmN0aW9uQXJuOiB0aGlzLndlYkZ1bmN0aW9uQXJuIH07XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIGBncmFudGVlYCB0byBjYWxsIHRoZSBmdW5jdGlvbidzIGVuZHBvaW50LlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBncmFudEludm9rZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogQWRkcyBhIHN0YXRlbWVudCB0byB0aGUgZnVuY3Rpb24ncyByZXNvdXJjZSBwb2xpY3kgKG5vdCBhZGRlZCBmb3IgYW4gaW1wb3J0ZWQgZnVuY3Rpb24pLlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IGFkZFRvUmVzb3VyY2VQb2xpY3koc3RhdGVtZW50OiBpYW0uUG9saWN5U3RhdGVtZW50KTogaWFtLkFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQ7XG5cbiAgLyoqXG4gICAqIEEgbWV0cmljIG9mIHRoaXMgZnVuY3Rpb24ncyBleGVjdXRpb24gZW52aXJvbm1lbnRzIGluIGBBV1MvTGFtYmRhL1dlYmAgKGRpbWVuc2lvbiBgRnVuY3Rpb25OYW1lYCksIGFjcm9zcyBhbGwgZW5kcG9pbnRzLlxuICAgKiBGb3IgcmVxdWVzdCBhbmQgZXJyb3IgY291bnRzLCB1c2UgdGhlIGVuZHBvaW50J3MgbWV0cmljcyAoYGZuLmVuZHBvaW50Lm1ldHJpY1JlcXVlc3RzKClgKS5cbiAgICpcbiAgICogTWV0cmljcyBhcmUgcHVibGlzaGVkIGluIHRoZSByZWdpb24gdGhhdCBzZXJ2ZWQgdGhlIHJlcXVlc3Q6IHBhc3MgYHJlZ2lvbmAgZm9yIGFub3RoZXIgc2VydmluZyByZWdpb24uXG4gICAqIEFuIGFsYXJtIGNhbiBvbmx5IHVzZSBtZXRyaWNzIGZyb20gaXRzIG93biBzdGFjaydzIHJlZ2lvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciAxIG1pbnV0ZSwgaW4gdGhlIGZ1bmN0aW9uJ3MgaG9tZSByZWdpb25cbiAgICovXG4gIHB1YmxpYyBtZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICAvLyBBbiBpbXBvcnRlZCBmdW5jdGlvbiBpbiBhbm90aGVyIHJlZ2lvbiBwdWJsaXNoZXMgaXRzIG1ldHJpY3MgdGhlcmUuXG4gICAgY29uc3QgcmVnaW9uID0gIVRva2VuLmlzVW5yZXNvbHZlZCh0aGlzLmVudi5yZWdpb24pICYmIHRoaXMuZW52LnJlZ2lvbiAhPT0gU3RhY2sub2YodGhpcykucmVnaW9uID8gdGhpcy5lbnYucmVnaW9uIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgbmFtZXNwYWNlOiBXRUJfTkFNRVNQQUNFLFxuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIGRpbWVuc2lvbnNNYXA6IHsgRnVuY3Rpb25OYW1lOiB0aGlzLndlYkZ1bmN0aW9uTmFtZSB9LFxuICAgICAgc3RhdGlzdGljOiBjbG91ZHdhdGNoLlN0YXRzLlNVTSxcbiAgICAgIHBlcmlvZDogREVGQVVMVF9QRVJJT0QsXG4gICAgICByZWdpb24sXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBUaW1lIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnRzIHdlcmUgYWN0aXZlIChgRW52aXJvbm1lbnRBY3RpdmVUaW1lYCkuICovXG4gIHB1YmxpYyBtZXRyaWNBY3RpdmVUaW1lKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnRW52aXJvbm1lbnRBY3RpdmVUaW1lJywgcHJvcHMpO1xuICB9XG5cbiAgLyoqIENQVSB0aW1lIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnRzIHVzZWQgKGBFbnZpcm9ubWVudENQVVRpbWVgKS4gKi9cbiAgcHVibGljIG1ldHJpY0NwdVRpbWUocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdFbnZpcm9ubWVudENQVVRpbWUnLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdHMgYW4gZXhlY3V0aW9uIGVudmlyb25tZW50IGhhbmRsZWQgYXQgb25jZSAoYEVudmlyb25tZW50Q29uY3VycmVudFJlcXVlc3RzYCksIHRvIGNvbXBhcmUgd2l0aFxuICAgKiBgbWF4Q29uY3VycmVuY3lQZXJFbnZpcm9ubWVudGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbWF4aW11bSBvdmVyIDEgbWludXRlXG4gICAqL1xuICBwdWJsaWMgbWV0cmljQ29uY3VycmVudFJlcXVlc3RzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnRW52aXJvbm1lbnRDb25jdXJyZW50UmVxdWVzdHMnLCB7IHN0YXRpc3RpYzogY2xvdWR3YXRjaC5TdGF0cy5NQVhJTVVNLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZWFrIG1lbW9yeSBhbiBleGVjdXRpb24gZW52aXJvbm1lbnQgdXNlZCAoYEVudmlyb25tZW50TWF4TWVtb3J5VXNhZ2VgKTsgZWFjaCBlbnZpcm9ubWVudCBoYXMgMiBHQi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBtYXhpbXVtIG92ZXIgMSBtaW51dGVcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNNYXhNZW1vcnlVc2FnZShwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ0Vudmlyb25tZW50TWF4TWVtb3J5VXNhZ2UnLCB7IHN0YXRpc3RpYzogY2xvdWR3YXRjaC5TdGF0cy5NQVhJTVVNLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIC8qKiBCeXRlcyBzZW50IGluIHJlc3BvbnNlcyAoYFJlc3BvbnNlQnl0ZXNgKS4gKi9cbiAgcHVibGljIG1ldHJpY1Jlc3BvbnNlQnl0ZXMocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdSZXNwb25zZUJ5dGVzJywgcHJvcHMpO1xuICB9XG59XG5cbi8qKlxuICogQSBOb2RlLmpzIEhUVFAgc2VydmVyIHJ1bm5pbmcgYXMgYW4gQVdTIExhbWJkYSBXZWIgRnVuY3Rpb24sIHNlcnZlZCBmcm9tIG9uZSBvciBtb3JlIHJlZ2lvbnMuXG4gKlxuICogQ3JlYXRlcyB0aGUgZnVuY3Rpb24sIGl0cyBjdXJyZW50IHJldmlzaW9uIChjb2RlIGFuZCBjb25maWd1cmF0aW9uOyBhbnkgY2hhbmdlIGNyZWF0ZXMgYSBuZXcgb25lLFxuICogYW5kIHRoZSBuZXdlc3QgYHJldmlzaW9uUmV0ZW50aW9uYCBhcmUga2VwdCksIGEgZGVmYXVsdCBIVFRQUyBlbmRwb2ludCwgYW4gZXhlY3V0aW9uIHJvbGUsIGFuZCBvd25zXG4gKiB0aGUgZnVuY3Rpb24ncyBsb2cgZ3JvdXBzIGluIGV2ZXJ5IHJlZ2lvbiBpdHMgZW5kcG9pbnRzIHNlcnZlIGZyb20uXG4gKlxuICogVXNlIGBmcm9tV2ViRnVuY3Rpb25Bcm5gLCBgZnJvbVdlYkZ1bmN0aW9uTmFtZWAgb3IgYGZyb21XZWJGdW5jdGlvbkF0dHJpYnV0ZXNgIGZvciBhIGZ1bmN0aW9uIGRlZmluZWQgZWxzZXdoZXJlLlxuICpcbiAqIEByZXNvdXJjZSBBV1M6OkxhbWJkYTo6V2ViRnVuY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkZ1bmN0aW9uIGV4dGVuZHMgV2ViRnVuY3Rpb25CYXNlIGltcGxlbWVudHMgaWFtLklHcmFudGFibGUge1xuICAvKipcbiAgICogSW1wb3J0cyBhbiBleGlzdGluZyBXZWIgRnVuY3Rpb24gYnkgaXRzIEFSTiAoaW4gYW55IHJlZ2lvbiBvciBhY2NvdW50KS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVdlYkZ1bmN0aW9uQXJuKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHdlYkZ1bmN0aW9uQXJuOiBzdHJpbmcpOiBJV2ViRnVuY3Rpb24ge1xuICAgIHJldHVybiBXZWJGdW5jdGlvbi5mcm9tV2ViRnVuY3Rpb25BdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyB3ZWJGdW5jdGlvbkFybiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGFuIGV4aXN0aW5nIFdlYiBGdW5jdGlvbiBpbiB0aGlzIHN0YWNrJ3MgYWNjb3VudCBhbmQgcmVnaW9uIGJ5IGl0cyBuYW1lLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tV2ViRnVuY3Rpb25OYW1lKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHdlYkZ1bmN0aW9uTmFtZTogc3RyaW5nKTogSVdlYkZ1bmN0aW9uIHtcbiAgICByZXR1cm4gV2ViRnVuY3Rpb24uZnJvbVdlYkZ1bmN0aW9uQXR0cmlidXRlcyhzY29wZSwgaWQsIHsgd2ViRnVuY3Rpb25OYW1lIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgYW4gZXhpc3RpbmcgV2ViIEZ1bmN0aW9uOiBnaXZlIGl0cyBBUk4gb3IgaXRzIG5hbWUsIGFuZCBvcHRpb25hbGx5IHRoZSBlbmRwb2ludCBgZ3JhbnRJbnZva2VgIGFsbG93cy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVdlYkZ1bmN0aW9uQXR0cmlidXRlcyhzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhdHRyczogV2ViRnVuY3Rpb25BdHRyaWJ1dGVzKTogSVdlYkZ1bmN0aW9uIHtcbiAgICByZXR1cm4gbmV3IEltcG9ydGVkV2ViRnVuY3Rpb24oc2NvcGUsIGlkLCBhdHRycyk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgd2ViRnVuY3Rpb25OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB3ZWJGdW5jdGlvbkFybjogc3RyaW5nO1xuXG4gIC8qKiBUaGUgSUQgb2YgdGhlIGN1cnJlbnQgcmV2aXNpb24uIFNhbWUgYXMgYGN1cnJlbnRSZXZpc2lvbi5yZXZpc2lvbklkYC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHJldmlzaW9uSWQ6IHN0cmluZztcblxuICAvKiogVGhlIHJldmlzaW9uIGJ1aWx0IGZyb20gdGhlIGN1cnJlbnQgY29kZSBhbmQgY29uZmlndXJhdGlvbi4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGN1cnJlbnRSZXZpc2lvbjogSVdlYkZ1bmN0aW9uUmV2aXNpb247XG5cbiAgLyoqIFRoZSBkZWZhdWx0IGVuZHBvaW50LiBBZGQgbW9yZSB3aXRoIGBhZGRFbmRwb2ludGAuICovXG4gIHB1YmxpYyByZWFkb25seSBlbmRwb2ludDogV2ViRnVuY3Rpb25FbmRwb2ludDtcblxuICAvKiogR3JhbnRzIG9uIHRoZSBkZWZhdWx0IGVuZHBvaW50IChlLmcuIGBncmFudHMuaW52b2tlKHByaW5jaXBhbClgKS4gT3RoZXIgZW5kcG9pbnRzIGhhdmUgdGhlaXIgb3duIGBncmFudHNgLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRzOiBXZWJGdW5jdGlvbkdyYW50cztcblxuICAvKiogVGhlIGV4ZWN1dGlvbiByb2xlLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm9sZTogaWFtLklSb2xlO1xuXG4gIC8qKiBUaGUgcHJpbmNpcGFsIHRvIGdyYW50IHBlcm1pc3Npb25zIHRvICh0aGUgZXhlY3V0aW9uIHJvbGUpLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWw6IGlhbS5JUHJpbmNpcGFsO1xuXG4gIC8qKlxuICAgKiBUaGUgaG9tZS1yZWdpb24gbG9nIGdyb3VwIHRoYXQgcmVjZWl2ZXMgdGhlIGxvZ3Mgb2YgZXZlcnkgcmVnaW9uIHRoZSBmdW5jdGlvbiBzZXJ2ZXMgZnJvbS5cbiAgICogU3Vic2NyaWJlIHRvIHRoaXMgb25lIG9ubHk6IGVhY2ggcmVnaW9uJ3MgYC5sb2NhbGAgZ3JvdXAgaG9sZHMgYSBjb3B5IG9mIHRoZSBzYW1lIGV2ZW50cy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dHcm91cDogbG9ncy5JTG9nR3JvdXA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBlbnZpcm9ubWVudDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IGVuZHBvaW50czogV2ViRnVuY3Rpb25FbmRwb2ludFtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVtb3RlTG9nR3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIFdlYkZ1bmN0aW9uTG9nR3JvdXA+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nR3JvdXBOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nT3B0aW9uczogUGljazxXZWJGdW5jdGlvblByb3BzLCAnbG9nUmV0ZW50aW9uJyB8ICdsb2dSZW1vdmFsUG9saWN5Jz47XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2U6IGxhbWJkYS5DZm5XZWJGdW5jdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSByZXZpc2lvbkNsZWFudXA6IFJldmlzaW9uQ2xlYW51cDtcbiAgcHJpdmF0ZSByZWFkb25seSBwZXJtaXNzaW9uSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVzb3VyY2VQb2xpY3k/OiB7IHJlYWRvbmx5IGRvY3VtZW50OiBpYW0uUG9saWN5RG9jdW1lbnQ7IHJlYWRvbmx5IHJlc291cmNlOiBsYW1iZGEuQ2ZuUmVzb3VyY2VQb2xpY3kgfTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogV2ViRnVuY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAocHJvcHMucnVudGltZS5mYW1pbHkgIT09IGxhbWJkYS5SdW50aW1lRmFtaWx5Lk5PREVKUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogTGFtYmRhIFdlYiBGdW5jdGlvbnMgcnVuIE5vZGUuanMgb25seSwgZ290ICR7cHJvcHMucnVudGltZS5uYW1lfWApO1xuICAgIH1cbiAgICBjb25zdCB0aW1lb3V0ID0gcHJvcHMudGltZW91dD8udG9TZWNvbmRzKCkgPz8gMzA7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQodGltZW91dCkgJiYgKHRpbWVvdXQgPCAzIHx8IHRpbWVvdXQgPiA5MDApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiB0aW1lb3V0IG11c3QgYmUgYmV0d2VlbiAzIHNlY29uZHMgYW5kIDE1IG1pbnV0ZXMsIGdvdCAke3RpbWVvdXR9c2ApO1xuICAgIH1cbiAgICBjb25zdCBtYXhDb25jdXJyZW5jeSA9IHByb3BzLm1heENvbmN1cnJlbmN5UGVyRW52aXJvbm1lbnQ7XG4gICAgY29uc3QgdmFsaWRDb25jdXJyZW5jeSA9IChuOiBudW1iZXIpID0+IE51bWJlci5pc0ludGVnZXIobikgJiYgbiA+PSAxICYmIG4gPD0gMTI4O1xuICAgIGlmIChtYXhDb25jdXJyZW5jeSAhPT0gdW5kZWZpbmVkICYmICFUb2tlbi5pc1VucmVzb2x2ZWQobWF4Q29uY3VycmVuY3kpICYmICF2YWxpZENvbmN1cnJlbmN5KG1heENvbmN1cnJlbmN5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogbWF4Q29uY3VycmVuY3lQZXJFbnZpcm9ubWVudCBtdXN0IGJlIGFuIGludGVnZXIgZnJvbSAxIHRvIDEyOCwgZ290ICR7bWF4Q29uY3VycmVuY3l9YCk7XG4gICAgfVxuICAgIGNvbnN0IHJldmlzaW9uUmV0ZW50aW9uID0gcHJvcHMucmV2aXNpb25SZXRlbnRpb24gPz8gMjA7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocmV2aXNpb25SZXRlbnRpb24pICYmICghTnVtYmVyLmlzSW50ZWdlcihyZXZpc2lvblJldGVudGlvbikgfHwgcmV2aXNpb25SZXRlbnRpb24gPCAxIHx8IHJldmlzaW9uUmV0ZW50aW9uID4gNTApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiByZXZpc2lvblJldGVudGlvbiBtdXN0IGJlIGFuIGludGVnZXIgZnJvbSAxIHRvIDUwLCBnb3QgJHtyZXZpc2lvblJldGVudGlvbn1gKTtcbiAgICB9XG4gICAgY29uc3Qgc3lzdGVtTG9nTGV2ZWxzID0gW2xhbWJkYS5TeXN0ZW1Mb2dMZXZlbC5ERUJVRywgbGFtYmRhLlN5c3RlbUxvZ0xldmVsLklORk8sIGxhbWJkYS5TeXN0ZW1Mb2dMZXZlbC5XQVJOXTtcbiAgICBpZiAocHJvcHMuc3lzdGVtTG9nTGV2ZWxWMiAhPT0gdW5kZWZpbmVkICYmICFzeXN0ZW1Mb2dMZXZlbHMuaW5jbHVkZXMocHJvcHMuc3lzdGVtTG9nTGV2ZWxWMikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHN5c3RlbUxvZ0xldmVsVjIgbXVzdCBiZSBERUJVRywgSU5GTyBvciBXQVJOIGZvciBMYW1iZGEgV2ViIEZ1bmN0aW9uc2ApO1xuICAgIH1cblxuICAgIHRoaXMud2ViRnVuY3Rpb25OYW1lID0gcHJvcHMud2ViRnVuY3Rpb25OYW1lID8/IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7IG1heExlbmd0aDogNjQsIHNlcGFyYXRvcjogJy0nIH0pO1xuICAgIGFzc2VydFJlc291cmNlTmFtZSh0aGlzLCAnd2ViRnVuY3Rpb25OYW1lJywgdGhpcy53ZWJGdW5jdGlvbk5hbWUpO1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvcHMuZW52aXJvbm1lbnQgPz8ge30pKSB7XG4gICAgICB0aGlzLmFkZEVudmlyb25tZW50KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZW50cnlwb2ludCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVudmlyb25tZW50LkFXU19MQU1CREFfTk9ERUpTX0VOVFJZUE9JTlQgPSBwcm9wcy5lbnRyeXBvaW50O1xuICAgIH1cblxuICAgIHRoaXMucm9sZSA9IHByb3BzLnJvbGUgPz8gbmV3IGlhbS5Sb2xlKHRoaXMsICdTZXJ2aWNlUm9sZScsIHtcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdsYW1iZGEuYW1hem9uYXdzLmNvbScpLFxuICAgICAgbWFuYWdlZFBvbGljaWVzOiBbaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKCdzZXJ2aWNlLXJvbGUvQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlJyldLFxuICAgIH0pO1xuICAgIHRoaXMuZ3JhbnRQcmluY2lwYWwgPSB0aGlzLnJvbGU7XG5cbiAgICAvLyBMb2cgZ3JvdXBzIGZpcnN0OiB0aGUgc2VydmljZSB3b3VsZCBvdGhlcndpc2UgY3JlYXRlIHRoZW0gd2l0aG91dCByZXRlbnRpb24uXG4gICAgY29uc3QgbG9nR3JvdXBOYW1lID0gYC9hd3MvbGFtYmRhL3dlYi8ke3RoaXMud2ViRnVuY3Rpb25OYW1lfWA7XG4gICAgdGhpcy5sb2dHcm91cE5hbWUgPSBsb2dHcm91cE5hbWU7XG4gICAgdGhpcy5sb2dPcHRpb25zID0geyBsb2dSZXRlbnRpb246IHByb3BzLmxvZ1JldGVudGlvbiwgbG9nUmVtb3ZhbFBvbGljeTogcHJvcHMubG9nUmVtb3ZhbFBvbGljeSB9O1xuICAgIGNvbnN0IGxvZ0dyb3VwcyA9IHRoaXMuY3JlYXRlTG9nR3JvdXBzKGxvZ0dyb3VwTmFtZSk7XG4gICAgdGhpcy5sb2dHcm91cCA9IGxvZ3MuTG9nR3JvdXAuZnJvbUxvZ0dyb3VwTmFtZSh0aGlzLCAnTG9nR3JvdXAnLCBsb2dHcm91cE5hbWUpO1xuXG4gICAgY29uc3QgY29kZSA9IG5ldyBXZWJGdW5jdGlvbkNvZGUodGhpcywgJ0NvZGUnLCBwcm9wcy5jb2RlKS5sb2NhdGlvbjtcblxuICAgIGNvbnN0IGZuID0gbmV3IGxhbWJkYS5DZm5XZWJGdW5jdGlvbih0aGlzLCAnUmVzb3VyY2UnLCB7IGZ1bmN0aW9uTmFtZTogdGhpcy53ZWJGdW5jdGlvbk5hbWUgfSk7XG4gICAgLy8gVGhlIGZ1bmN0aW9uIGlzIGRlbGV0ZWQgYmVmb3JlIGl0cyBsb2cgZ3JvdXBzLCB3aGljaCB0aGVuIHdhaXQgZm9yIGxhdGUgZmx1c2hlcy5cbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIGxvZ0dyb3VwcykgZm4ubm9kZS5hZGREZXBlbmRlbmN5KGdyb3VwLnJlc291cmNlKTtcbiAgICBWYWxpZGF0aW9ucy5vZihmbikuYWNrbm93bGVkZ2UoQ0ZOX1ZBTElEQVRFX1VOS05PV05fVFlQRSk7XG4gICAgdGhpcy5yZXNvdXJjZSA9IGZuO1xuICAgIHRoaXMud2ViRnVuY3Rpb25Bcm4gPSBmbi5hdHRyRnVuY3Rpb25Bcm47XG5cbiAgICBjb25zdCByZXZpc2lvbiA9IG5ldyBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb25SZXZpc2lvbih0aGlzLCAnUmV2aXNpb24nLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IGZuLmF0dHJGdW5jdGlvbkFybixcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIGJ1aWxkQ29uZmlnOiB7XG4gICAgICAgIGNvZGVDb25maWc6IHsgczNPYmplY3Q6IHsgYnVja2V0OiBjb2RlLmJ1Y2tldE5hbWUsIGtleTogY29kZS5vYmplY3RLZXksIHZlcnNpb25JZDogY29kZS5vYmplY3RWZXJzaW9uIH0gfSxcbiAgICAgICAgcnVudGltZUNvbmZpZzogeyBydW50aW1lOiBwcm9wcy5ydW50aW1lLm5hbWUgfSxcbiAgICAgIH0sXG4gICAgICBzZXJ2aWNlQ29uZmlnOiB7XG4gICAgICAgIGV4ZWN1dGlvblJvbGVBcm46IHRoaXMucm9sZS5yb2xlQXJuLFxuICAgICAgICBlbnZpcm9ubWVudFZhcmlhYmxlczogTGF6eS5hbnkoeyBwcm9kdWNlOiAoKSA9PiAoT2JqZWN0LmtleXModGhpcy5lbnZpcm9ubWVudCkubGVuZ3RoID4gMCA/IHsgLi4udGhpcy5lbnZpcm9ubWVudCB9IDogdW5kZWZpbmVkKSB9KSxcbiAgICAgICAgdGltZW91dFNlY29uZHM6IHRpbWVvdXQsXG4gICAgICAgIG1heENvbmN1cnJlbmN5UGVyRW52aXJvbm1lbnQ6IG1heENvbmN1cnJlbmN5LFxuICAgICAgICB0ZWxlbWV0cnlDb25maWc6IHtcbiAgICAgICAgICBsb2dnaW5nQ29uZmlnOiB7XG4gICAgICAgICAgICBsb2dHcm91cDogbG9nR3JvdXBOYW1lLFxuICAgICAgICAgICAgYXBwbGljYXRpb25Mb2dMZXZlbDogcHJvcHMuYXBwbGljYXRpb25Mb2dMZXZlbFYyLFxuICAgICAgICAgICAgc3lzdGVtTG9nTGV2ZWw6IHByb3BzLnN5c3RlbUxvZ0xldmVsVjIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgLy8gV2FpdCBmb3IgdGhlIHJvbGUncyBwb2xpY2llcywgc28gdGhlIGZpcnN0IGVudmlyb25tZW50IHN0YXJ0cyB3aXRoIGl0cyBwZXJtaXNzaW9ucy5cbiAgICByZXZpc2lvbi5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5yb2xlKTtcbiAgICBWYWxpZGF0aW9ucy5vZihyZXZpc2lvbikuYWNrbm93bGVkZ2UoQ0ZOX1ZBTElEQVRFX1VOS05PV05fVFlQRSk7XG4gICAgLy8gUmVwbGFjZWQgcmV2aXNpb25zIHN0YXkgYXMgcm9sbGJhY2sgdGFyZ2V0czsgUmV2aXNpb25DbGVhbnVwIGRlbGV0ZXMgdGhlIG9sZGVzdC4gRGVsZXRpbmcgdGhlIGZ1bmN0aW9uIGRlbGV0ZXMgdGhlbSBhbGwuXG4gICAgcmV2aXNpb24uYXBwbHlSZW1vdmFsUG9saWN5KFJlbW92YWxQb2xpY3kuUkVUQUlOKTtcbiAgICB0aGlzLnJldmlzaW9uSWQgPSByZXZpc2lvbi5hdHRyUmV2aXNpb25JZDtcbiAgICB0aGlzLmN1cnJlbnRSZXZpc2lvbiA9IFdlYkZ1bmN0aW9uUmV2aXNpb24uX2N1cnJlbnQodGhpcywgJ0N1cnJlbnRSZXZpc2lvbicsIHRoaXMsIHJldmlzaW9uLmF0dHJSZXZpc2lvbklkLCByZXZpc2lvbi5hdHRyUmV2aXNpb25Bcm4pO1xuXG4gICAgdGhpcy5yZXZpc2lvbkNsZWFudXAgPSBuZXcgUmV2aXNpb25DbGVhbnVwKHRoaXMsICdSZXZpc2lvbkNsZWFudXAnLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IHRoaXMud2ViRnVuY3Rpb25OYW1lLFxuICAgICAgZnVuY3Rpb25Bcm46IGZuLmF0dHJGdW5jdGlvbkFybixcbiAgICAgIGtlZXA6IHJldmlzaW9uUmV0ZW50aW9uLFxuICAgICAgcmV2aXNpb25JZHM6ICgpID0+IFt0aGlzLmN1cnJlbnRSZXZpc2lvbi5yZXZpc2lvbklkLCAuLi50aGlzLmVuZHBvaW50cy5mbGF0TWFwKChlKSA9PiBlLl9yZXZpc2lvbklkcygpKV0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmVuZHBvaW50ID0gdGhpcy5jcmVhdGVFbmRwb2ludCgnRW5kcG9pbnQnLCB7IC4uLnByb3BzLmVuZHBvaW50LCBhdXRoVHlwZTogcHJvcHMuYXV0aFR5cGUgfSwgJ2RlZmF1bHQnKTtcbiAgICB0aGlzLmdyYW50cyA9IHRoaXMuZW5kcG9pbnQuZ3JhbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZW5kcG9pbnQgKHVwIHRvIDEwIHBlciBmdW5jdGlvbiksIGUuZy4gYSBwdWJsaWMgb25lIG5leHQgdG8gYW4gSUFNLW9ubHkgb25lLCBvciBvbmUgcGlubmVkIHRvIGFuXG4gICAqIGVhcmxpZXIgcmV2aXNpb24uIEVhY2ggZW5kcG9pbnQgaGFzIGl0cyBvd24gVVJMLCBhdXRoZW50aWNhdGlvbiwgcmVnaW9ucyBhbmQgbGltaXRzLlxuICAgKlxuICAgKiBAcGFyYW0gaWQgdGhlIGVuZHBvaW50J3MgY29uc3RydWN0IElELCBhbHNvIHVzZWQgaW4gaXRzIGdlbmVyYXRlZCBuYW1lIChgPGlkPi08aGFzaD5gKVxuICAgKi9cbiAgcHVibGljIGFkZEVuZHBvaW50KGlkOiBzdHJpbmcsIG9wdGlvbnM6IEFkZFdlYkZ1bmN0aW9uRW5kcG9pbnRPcHRpb25zKTogV2ViRnVuY3Rpb25FbmRwb2ludCB7XG4gICAgY29uc3QgcHJlZml4ID0gaWQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJykucmVwbGFjZSgvXi0rLywgJycpLnNsaWNlKDAsIDU1KS5yZXBsYWNlKC8tKyQvLCAnJykgfHwgJ2VuZHBvaW50JztcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVFbmRwb2ludChpZCwgb3B0aW9ucywgcHJlZml4LCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gTmFtZXMgc3RhcnRpbmcgd2l0aCBgQVdTX2AgYXJlIHJlc2VydmVkLlxuICAgKi9cbiAgcHVibGljIGFkZEVudmlyb25tZW50KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogV2ViRnVuY3Rpb24ge1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnQVdTXycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiBlbnZpcm9ubWVudCB2YXJpYWJsZSAke2tleX0gaXMgcmVzZXJ2ZWQgKG5hbWVzIHN0YXJ0aW5nIHdpdGggQVdTXyBhcmUgc2V0IGJ5IHRoZSBydW50aW1lKSR7a2V5ID09PSAnQVdTX0xBTUJEQV9OT0RFSlNfRU5UUllQT0lOVCcgPyAnOyB1c2UgdGhlIGVudHJ5cG9pbnQgcHJvcGVydHknIDogJyd9YCk7XG4gICAgfVxuICAgIHRoaXMuZW52aXJvbm1lbnRba2V5XSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzdGF0ZW1lbnQgdG8gdGhlIGV4ZWN1dGlvbiByb2xlJ3MgcG9saWN5LlxuICAgKi9cbiAgcHVibGljIGFkZFRvUm9sZVBvbGljeShzdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLnJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3koc3RhdGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvd3MgYGdyYW50ZWVgIHRvIGNhbGwgdGhlIGVuZHBvaW50LiBTaG9ydGN1dCBmb3IgYGdyYW50cy5pbnZva2UoZ3JhbnRlZSlgLCBhcyBvbiBgbGFtYmRhLkZ1bmN0aW9uYC5cbiAgICogW2Rpc2FibGUtYXdzbGludDpuby1ncmFudHNdXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRJbnZva2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmdyYW50cy5pbnZva2UoZ3JhbnRlZSk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIGEgcHJpbmNpcGFsIGluIGFub3RoZXIgYWNjb3VudCwgYW4gQVdTIHNlcnZpY2Ugb3IgYW4gb3JnYW5pemF0aW9uIHRvIGNhbGwgdGhlIGZ1bmN0aW9uJ3MgZW5kcG9pbnRzLFxuICAgKiB0aHJvdWdoIHRoZSBmdW5jdGlvbidzIHJlc291cmNlIHBvbGljeS4gRm9yIGEgcm9sZSBpbiB0aGlzIGFjY291bnQsIHVzZSBgZ3JhbnRJbnZva2VgLlxuICAgKlxuICAgKiBAcGFyYW0gaWQgdGhlIHN0YXRlbWVudCBJRCAoYFNpZGApOiBsZXR0ZXJzIGFuZCBkaWdpdHMsIHVuaXF1ZSB3aXRoaW4gdGhlIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgYWRkUGVybWlzc2lvbihpZDogc3RyaW5nLCBwZXJtaXNzaW9uOiBXZWJGdW5jdGlvblBlcm1pc3Npb24pOiB2b2lkIHtcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChpZCkgJiYgIS9eW0EtWmEtejAtOV0rJC8udGVzdChpZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHBlcm1pc3Npb24gaWQgJyR7aWR9JyBtdXN0IGJlIGxldHRlcnMgYW5kIGRpZ2l0cyBvbmx5IChpdCBpcyB0aGUgc3RhdGVtZW50J3MgU2lkKWApO1xuICAgIH1cbiAgICBpZiAodGhpcy5wZXJtaXNzaW9uSWRzLmhhcyhpZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHRoZXJlIGlzIGFscmVhZHkgYSBwZXJtaXNzaW9uIHdpdGggaWQgJyR7aWR9J2ApO1xuICAgIH1cbiAgICBjb25zdCBlbmRwb2ludCA9IHBlcm1pc3Npb24uZW5kcG9pbnQ7XG4gICAgaWYgKGVuZHBvaW50ICE9PSB1bmRlZmluZWQgJiYgIXRoaXMuZW5kcG9pbnRzLmluY2x1ZGVzKGVuZHBvaW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogdGhlIGVuZHBvaW50ICR7ZW5kcG9pbnQubm9kZS5wYXRofSBiZWxvbmdzIHRvIGFub3RoZXIgZnVuY3Rpb25gKTtcbiAgICB9XG4gICAgdGhpcy5wZXJtaXNzaW9uSWRzLmFkZChpZCk7XG4gICAgY29uc3Qgc3RhdGVtZW50ID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgc2lkOiBpZCxcbiAgICAgIHByaW5jaXBhbHM6IFtwZXJtaXNzaW9uLnByaW5jaXBhbF0sXG4gICAgICBhY3Rpb25zOiBbJ2xhbWJkYTpJbnZva2VXZWJGdW5jdGlvbkVuZHBvaW50J10sXG4gICAgICByZXNvdXJjZXM6IFtlbmRwb2ludD8uZW5kcG9pbnRBcm4gPz8gYCR7dGhpcy53ZWJGdW5jdGlvbkFybn0vZW5kcG9pbnQvKmBdLFxuICAgIH0pO1xuICAgIGlmIChwZXJtaXNzaW9uLnNvdXJjZUFybiAhPT0gdW5kZWZpbmVkKSBzdGF0ZW1lbnQuYWRkQ29uZGl0aW9uKCdBcm5MaWtlJywgeyAnYXdzOlNvdXJjZUFybic6IHBlcm1pc3Npb24uc291cmNlQXJuIH0pO1xuICAgIGlmIChwZXJtaXNzaW9uLnNvdXJjZUFjY291bnQgIT09IHVuZGVmaW5lZCkgc3RhdGVtZW50LmFkZENvbmRpdGlvbignU3RyaW5nRXF1YWxzJywgeyAnYXdzOlNvdXJjZUFjY291bnQnOiBwZXJtaXNzaW9uLnNvdXJjZUFjY291bnQgfSk7XG4gICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KHN0YXRlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHN0YXRlbWVudCB0byB0aGUgZnVuY3Rpb24ncyByZXNvdXJjZSBwb2xpY3ksIGUuZy4gdG8gbGV0IGFub3RoZXIgYWNjb3VudCBtYW5hZ2UgdGhlIGZ1bmN0aW9uLlxuICAgKiBGb3IgaW52b2tpbmcsIHByZWZlciBgYWRkUGVybWlzc2lvbmAgb3IgYGdyYW50SW52b2tlYC5cbiAgICpcbiAgICogVGhlIGZ1bmN0aW9uIGhhcyBvbmUgcmVzb3VyY2UgcG9saWN5IChgQVdTOjpMYW1iZGE6OlJlc291cmNlUG9saWN5YCksIGNyZWF0ZWQgb24gdGhlIGZpcnN0IHN0YXRlbWVudC4gVGhpcyBzdGFja1xuICAgKiBpcyBpdHMgb25seSB3cml0ZXI6IGFub3RoZXIgc3RhY2sgb3IgdGVtcGxhdGUgY2FuJ3QgYWxzbyBhdHRhY2ggb25lLCBhbmQgY2hhbmdlcyBtYWRlIG91dHNpZGUgQ2xvdWRGb3JtYXRpb25cbiAgICogYXJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBuZXh0IHVwZGF0ZSBvZiB0aGUgcG9saWN5LlxuICAgKi9cbiAgcHVibGljIGFkZFRvUmVzb3VyY2VQb2xpY3koc3RhdGVtZW50OiBpYW0uUG9saWN5U3RhdGVtZW50KTogaWFtLkFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQge1xuICAgIGNvbnN0IHBvbGljeSA9IHRoaXMucmVzb3VyY2VQb2xpY3kgPz8gdGhpcy5jcmVhdGVSZXNvdXJjZVBvbGljeSgpO1xuICAgIHBvbGljeS5kb2N1bWVudC5hZGRTdGF0ZW1lbnRzKHN0YXRlbWVudCk7XG4gICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IHRydWUsIHBvbGljeURlcGVuZGFibGU6IHBvbGljeS5yZXNvdXJjZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVSZXNvdXJjZVBvbGljeSgpOiBOb25OdWxsYWJsZTxXZWJGdW5jdGlvblsncmVzb3VyY2VQb2xpY3knXT4ge1xuICAgIGNvbnN0IGRvY3VtZW50ID0gbmV3IGlhbS5Qb2xpY3lEb2N1bWVudCgpO1xuICAgIC8vIE9uZSBwb2xpY3kgcGVyIGZ1bmN0aW9uIGF0IGEgZml4ZWQgSUQ6IENsb3VkRm9ybWF0aW9uIGNhbid0IGNyZWF0ZSBhIHNlY29uZCBvbmUsIGV2ZW4gdG8gcmVwbGFjZSB0aGUgZmlyc3QuXG4gICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgbGFtYmRhLkNmblJlc291cmNlUG9saWN5KHRoaXMsICdSZXNvdXJjZVBvbGljeScsIHtcbiAgICAgIHJlc291cmNlQXJuOiB0aGlzLndlYkZ1bmN0aW9uQXJuLFxuICAgICAgcG9saWN5RG9jdW1lbnQ6IGRvY3VtZW50LFxuICAgIH0pO1xuICAgIHRoaXMubm9kZS5hZGRWYWxpZGF0aW9uKHtcbiAgICAgIHZhbGlkYXRlOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGpzb24gPSBTdGFjay5vZih0aGlzKS5yZXNvbHZlKGRvY3VtZW50LnRvSlNPTigpKTtcbiAgICAgICAgY29uc3QgeyBlcnJvcnMsIHVuc2NvcGVkU2VydmljZXMgfSA9IGluc3BlY3RSZXNvdXJjZVBvbGljeShqc29uKTtcbiAgICAgICAgaWYgKHVuc2NvcGVkU2VydmljZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmdWMignQGNkay1sYW1iZGEtd2ViOnNlcnZpY2VQcmluY2lwYWxXaXRob3V0U291cmNlJyxcbiAgICAgICAgICAgIGBUaGUgcmVzb3VyY2UgcG9saWN5IGxldHMgJHtbLi4ubmV3IFNldCh1bnNjb3BlZFNlcnZpY2VzKV0uam9pbignLCAnKX0gY2FsbCB0aGUgZnVuY3Rpb24gZnJvbSBhbnkgYWNjb3VudC4gUmVzdHJpY3QgaXQgd2l0aCBzb3VyY2VBcm4gb3Igc291cmNlQWNjb3VudCAoYWRkUGVybWlzc2lvbiksIG9yIGEgcHJpbmNpcGFsIHdpdGggY29uZGl0aW9ucy5gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gWy4uLmRvY3VtZW50LnZhbGlkYXRlRm9yUmVzb3VyY2VQb2xpY3koKSwgLi4uZXJyb3JzLm1hcCgoZSkgPT4gYHJlc291cmNlIHBvbGljeTogJHtlfWApXTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yZXNvdXJjZVBvbGljeSA9IHsgZG9jdW1lbnQsIHJlc291cmNlIH07XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VQb2xpY3k7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVuZHBvaW50KGlkOiBzdHJpbmcsIG9wdGlvbnM6IEFkZFdlYkZ1bmN0aW9uRW5kcG9pbnRPcHRpb25zLCBuYW1lUHJlZml4OiBzdHJpbmcsIG5hbWVTZWVkPzogc3RyaW5nKTogV2ViRnVuY3Rpb25FbmRwb2ludCB7XG4gICAgaWYgKHRoaXMuZW5kcG9pbnRzLmxlbmd0aCA+PSBNQVhfRU5EUE9JTlRTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiBhIFdlYiBGdW5jdGlvbiBjYW4gaGF2ZSBhdCBtb3N0ICR7TUFYX0VORFBPSU5UU30gZW5kcG9pbnRzYCk7XG4gICAgfVxuICAgIGNvbnN0IGVuZHBvaW50ID0gV2ViRnVuY3Rpb25FbmRwb2ludC5fY3JlYXRlKHRoaXMsIGlkLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgd2ViRnVuY3Rpb246IHRoaXMsXG4gICAgICBjdXJyZW50UmV2aXNpb246IHRoaXMuY3VycmVudFJldmlzaW9uLFxuICAgICAgbmFtZVByZWZpeCxcbiAgICAgIG5hbWVTZWVkLFxuICAgIH0pO1xuICAgIGNvbnN0IGNsYXNoID0gdGhpcy5lbmRwb2ludHMuZmluZCgoZSkgPT4gIVRva2VuLmlzVW5yZXNvbHZlZChlLmVuZHBvaW50TmFtZSkgJiYgZS5lbmRwb2ludE5hbWUgPT09IGVuZHBvaW50LmVuZHBvaW50TmFtZSk7XG4gICAgaWYgKGNsYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW5kcG9pbnQubm9kZS5wYXRofTogZW5kcG9pbnROYW1lICcke2VuZHBvaW50LmVuZHBvaW50TmFtZX0nIGlzIGFscmVhZHkgdXNlZCBieSAke2NsYXNoLm5vZGUucGF0aH1gKTtcbiAgICB9XG4gICAgdGhpcy5lbmRwb2ludHMucHVzaChlbmRwb2ludCk7XG4gICAgLy8gUmV2aXNpb25zIGFuIGVuZHBvaW50IHN0b3BzIHJvdXRpbmcgdG8gb25seSBiZWNvbWUgZGVsZXRhYmxlIG9uY2UgaXQncyB1cGRhdGVkLlxuICAgIHRoaXMucmV2aXNpb25DbGVhbnVwLm5vZGUuYWRkRGVwZW5kZW5jeShlbmRwb2ludCk7XG4gICAgLy8gRWFjaCBzZXJ2aW5nIHJlZ2lvbidzIC5sb2NhbCBncm91cCBtdXN0IGV4aXN0IGJlZm9yZSB0cmFmZmljLCBhbmQgb3V0bGl2ZSB0aGUgZnVuY3Rpb24uXG4gICAgZm9yIChjb25zdCByZWdpb24gb2YgZW5kcG9pbnQucmVnaW9ucy5zbGljZSgxKSkge1xuICAgICAgaWYgKHRoaXMucmVtb3RlTG9nR3JvdXBzLmhhcyhyZWdpb24pKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5sb2dHcm91cEluKGBMb2NhbExvZ3MtJHtyZWdpb259YCwgcmVnaW9uLCBgJHt0aGlzLmxvZ0dyb3VwTmFtZX0ubG9jYWxgKTtcbiAgICAgIHRoaXMucmVtb3RlTG9nR3JvdXBzLnNldChyZWdpb24sIGdyb3VwKTtcbiAgICAgIHRoaXMucmVzb3VyY2Uubm9kZS5hZGREZXBlbmRlbmN5KGdyb3VwLnJlc291cmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIGVuZHBvaW50O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVMb2dHcm91cHMobG9nR3JvdXBOYW1lOiBzdHJpbmcpOiBXZWJGdW5jdGlvbkxvZ0dyb3VwW10ge1xuICAgIGNvbnN0IGhvbWUgPSBTdGFjay5vZih0aGlzKS5yZWdpb247XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMubG9nR3JvdXBJbignTG9ncycsIGhvbWUsIGxvZ0dyb3VwTmFtZSksXG4gICAgICB0aGlzLmxvZ0dyb3VwSW4oJ0xvY2FsTG9ncycsIGhvbWUsIGAke2xvZ0dyb3VwTmFtZX0ubG9jYWxgKSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dHcm91cEluKGlkOiBzdHJpbmcsIHJlZ2lvbjogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBXZWJGdW5jdGlvbkxvZ0dyb3VwIHtcbiAgICByZXR1cm4gbmV3IFdlYkZ1bmN0aW9uTG9nR3JvdXAodGhpcywgaWQsIHtcbiAgICAgIHJlZ2lvbixcbiAgICAgIGxvZ0dyb3VwTmFtZTogbmFtZSxcbiAgICAgIHJldGVudGlvbjogdGhpcy5sb2dPcHRpb25zLmxvZ1JldGVudGlvbiA/PyBsb2dzLlJldGVudGlvbkRheXMuT05FX01PTlRILFxuICAgICAgcmVtb3ZhbFBvbGljeTogdGhpcy5sb2dPcHRpb25zLmxvZ1JlbW92YWxQb2xpY3kgPz8gUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqIEEgV2ViIEZ1bmN0aW9uIGRlZmluZWQgb3V0c2lkZSB0aGlzIGFwcC4gKi9cbmNsYXNzIEltcG9ydGVkV2ViRnVuY3Rpb24gZXh0ZW5kcyBXZWJGdW5jdGlvbkJhc2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgd2ViRnVuY3Rpb25OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB3ZWJGdW5jdGlvbkFybjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGVuZHBvaW50TmFtZT86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhdHRyczogV2ViRnVuY3Rpb25BdHRyaWJ1dGVzKSB7XG4gICAgY29uc3QgYXJuID0gaW1wb3J0ZWRBcm4oc2NvcGUsIGlkLCBhdHRycyk7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7IGVudmlyb25tZW50RnJvbUFybjogYXJuIH0pO1xuICAgIHRoaXMud2ViRnVuY3Rpb25Bcm4gPSBhcm47XG4gICAgdGhpcy53ZWJGdW5jdGlvbk5hbWUgPSBhdHRycy53ZWJGdW5jdGlvbk5hbWUgPz8gQXJuLnNwbGl0KGFybiwgQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUpLnJlc291cmNlTmFtZSE7XG4gICAgaWYgKGF0dHJzLmVuZHBvaW50TmFtZSAhPT0gdW5kZWZpbmVkKSBhc3NlcnRSZXNvdXJjZU5hbWUodGhpcywgJ2VuZHBvaW50TmFtZScsIGF0dHJzLmVuZHBvaW50TmFtZSk7XG4gICAgdGhpcy5lbmRwb2ludE5hbWUgPSBhdHRycy5lbmRwb2ludE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ3JhbnRJbnZva2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiBXZWJGdW5jdGlvbkdyYW50cy5fZm9yRW5kcG9pbnRBcm5zKFtgJHt0aGlzLndlYkZ1bmN0aW9uQXJufS9lbmRwb2ludC8ke3RoaXMuZW5kcG9pbnROYW1lID8/ICcqJ31gXSkuaW52b2tlKGdyYW50ZWUpO1xuICB9XG5cbiAgcHVibGljIGFkZFRvUmVzb3VyY2VQb2xpY3koX3N0YXRlbWVudDogaWFtLlBvbGljeVN0YXRlbWVudCk6IGlhbS5BZGRUb1Jlc291cmNlUG9saWN5UmVzdWx0IHtcbiAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nVjIoJ0BjZGstbGFtYmRhLXdlYjppbXBvcnRlZFJlc291cmNlUG9saWN5JyxcbiAgICAgICdTdGF0ZW1lbnRzIGFyZSBub3QgYWRkZWQgdG8gYW4gaW1wb3J0ZWQgZnVuY3Rpb25cXCdzIHJlc291cmNlIHBvbGljeTogYWRkIHRoZW0gaW4gdGhlIHN0YWNrIHRoYXQgY3JlYXRlcyB0aGUgZnVuY3Rpb24gKGEgZnVuY3Rpb24gaGFzIG9uZSByZXNvdXJjZSBwb2xpY3ksIGFuZCBvbmx5IG9uZSBzdGFjayBjYW4gd3JpdGUgaXQpLicpO1xuICAgIHJldHVybiB7IHN0YXRlbWVudEFkZGVkOiBmYWxzZSB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGltcG9ydGVkQXJuKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGF0dHJzOiBXZWJGdW5jdGlvbkF0dHJpYnV0ZXMpOiBzdHJpbmcge1xuICBjb25zdCBwYXRoID0gYCR7c2NvcGUubm9kZS5wYXRofS8ke2lkfWA7XG4gIGlmICgoYXR0cnMud2ViRnVuY3Rpb25Bcm4gPT09IHVuZGVmaW5lZCkgPT09IChhdHRycy53ZWJGdW5jdGlvbk5hbWUgPT09IHVuZGVmaW5lZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cGF0aH06IGdpdmUgZWl0aGVyIHdlYkZ1bmN0aW9uQXJuIG9yIHdlYkZ1bmN0aW9uTmFtZWApO1xuICB9XG4gIGlmIChhdHRycy53ZWJGdW5jdGlvbk5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKGF0dHJzLndlYkZ1bmN0aW9uTmFtZSkpIHtcbiAgICAgIC8vIFZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBzY29wZSwgYmVmb3JlIHRoZSBpbXBvcnQgZXhpc3RzLlxuICAgICAgYXNzZXJ0UmVzb3VyY2VOYW1lKHNjb3BlLCAnd2ViRnVuY3Rpb25OYW1lJywgYXR0cnMud2ViRnVuY3Rpb25OYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIFN0YWNrLm9mKHNjb3BlKS5mb3JtYXRBcm4oe1xuICAgICAgc2VydmljZTogJ2xhbWJkYScsIHJlc291cmNlOiAnd2ViLWZ1bmN0aW9uJywgcmVzb3VyY2VOYW1lOiBhdHRycy53ZWJGdW5jdGlvbk5hbWUsIGFybkZvcm1hdDogQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgYXJuID0gYXR0cnMud2ViRnVuY3Rpb25Bcm4hO1xuICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChhcm4pICYmICEvXmFybjpbXjpdKzpsYW1iZGE6W2EtejAtOS1dKzpcXGR7MTJ9OndlYi1mdW5jdGlvblxcL1tBLVphLXowLTlfLV17MSw2NH0kLy50ZXN0KGFybikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cGF0aH06ICcke2Fybn0nIGlzIG5vdCBhIFdlYiBGdW5jdGlvbiBBUk4gKGFybjo8cGFydGl0aW9uPjpsYW1iZGE6PHJlZ2lvbj46PGFjY291bnQ+OndlYi1mdW5jdGlvbi88bmFtZT4pYCk7XG4gIH1cbiAgcmV0dXJuIGFybjtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -111,7 +111,7 @@
111
111
  "main": "lib/index.js",
112
112
  "license": "Apache-2.0",
113
113
  "stability": "experimental",
114
- "version": "0.1.3",
114
+ "version": "0.1.5",
115
115
  "jest": {
116
116
  "coverageProvider": "v8",
117
117
  "testMatch": [
@@ -168,7 +168,6 @@
168
168
  "exclude": [
169
169
  "construct-ctor:@ashishpandeyone/cdk-lambda-web-function.WebFunctionEndpoint",
170
170
  "construct-ctor:@ashishpandeyone/cdk-lambda-web-function.WebFunctionRevision",
171
- "from-method:@ashishpandeyone/cdk-lambda-web-function.WebFunction",
172
171
  "resource-interface:@ashishpandeyone/cdk-lambda-web-function.NodejsWebFunction"
173
172
  ]
174
173
  },