@ashishpandeyone/cdk-lambda-web-function 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,22 @@
1
+ import * as iam from 'aws-cdk-lib/aws-iam';
1
2
  import { Construct } from 'constructs';
2
3
  import { WebFunctionAuthType, WebFunctionEndpointType } from './enums';
4
+ import type { IWebFunction } from './web-function';
5
+ import type { WebFunctionDeployment } from './web-function-deployment';
6
+ import { WebFunctionGrants } from './web-function-grants';
7
+ import type { IWebFunctionRevision } from './web-function-revision';
8
+ /**
9
+ * A revision and the share of an endpoint's traffic it receives.
10
+ */
11
+ export interface WebFunctionRevisionWeight {
12
+ /** The revision. */
13
+ readonly revision: IWebFunctionRevision;
14
+ /**
15
+ * The revision's share of the endpoint's traffic, as a fraction (like `lambda.Alias` `additionalVersions`).
16
+ * Must be a whole percentage from 0.01 to 0.99.
17
+ */
18
+ readonly weight: number;
19
+ }
3
20
  /**
4
21
  * Options for a Web Function's endpoint.
5
22
  */
@@ -21,37 +38,95 @@ export interface WebFunctionEndpointOptions {
21
38
  readonly regions?: string[];
22
39
  /**
23
40
  * The endpoint's name, shown in logs (`endpointName`) and in the `lambda-web-endpoint-name` header.
41
+ * Names are unique per function.
24
42
  *
25
- * When omitted, the name is `default-<hash>`, with the hash covering the endpoint type and regions,
26
- * so changing either deploys a new endpoint cleanly. When set, changing the endpoint type or
27
- * regions also requires a new name: two endpoints of one function can't share a name, and
28
- * CloudFormation creates the replacement before deleting the old one.
43
+ * When omitted, the name ends in a hash of the endpoint type and regions, so changing either deploys
44
+ * a new endpoint cleanly. When set, changing the endpoint type or regions also requires a new name:
45
+ * two endpoints of one function can't share a name, and CloudFormation creates the replacement
46
+ * before deleting the old one.
29
47
  *
30
- * @default - `default-<hash of type and regions>`
48
+ * @default - `default-<hash>` for the function's default endpoint, `<id>-<hash>` for endpoints added with `addEndpoint`
31
49
  */
32
50
  readonly endpointName?: string;
51
+ /**
52
+ * A description of the endpoint.
53
+ *
54
+ * @default - no description
55
+ */
56
+ readonly description?: string;
57
+ /**
58
+ * The most requests per second the endpoint accepts; excess requests get HTTP 429.
59
+ * Allowed: 0 (blocks all traffic), 100–1,000 in steps of 100, or 2,000–10,000 in steps of 1,000.
60
+ *
61
+ * Enforced separately in each region the endpoint serves from, so a multi-region endpoint
62
+ * can accept this many requests per second in every region.
63
+ *
64
+ * @default - no limit beyond the service quota of 10,000 requests per second per endpoint (per region)
65
+ */
66
+ readonly rateLimit?: number;
67
+ /**
68
+ * The most execution environments the endpoint may use (2–10,000). Each one uses 2 vCPUs of the account's quota.
69
+ *
70
+ * Enforced separately in each region the endpoint serves from.
71
+ *
72
+ * @default - scales within the account's vCPU quota
73
+ */
74
+ readonly maxEnvironments?: number;
75
+ /**
76
+ * How the endpoint moves its traffic to a new revision: all at once, or in steps
77
+ * (`WebFunctionDeployment.canary()` or `linear()`) that watch CloudWatch alarms and move
78
+ * the traffic back when one goes into ALARM.
79
+ *
80
+ * A deployment in steps can't be combined with `revision`, `additionalRevisions` or `routeTraffic()`.
81
+ *
82
+ * @default WebFunctionDeployment.allAtOnce()
83
+ */
84
+ readonly deployment?: WebFunctionDeployment;
33
85
  }
34
86
  /**
35
- * Internal: how `WebFunction` creates its endpoint. Not part of the public API.
87
+ * Options for `WebFunction.addEndpoint`.
36
88
  */
37
- interface WebFunctionEndpointProps extends WebFunctionEndpointOptions {
38
- /** Literal name of the Web Function (the provider's IAM must not reference resource attributes). */
39
- readonly functionName: string;
40
- /** The Web Function's ARN. */
41
- readonly functionArn: string;
42
- /** ID of the revision the endpoint serves. */
43
- readonly revisionId: string;
44
- /** How callers are authenticated. */
89
+ export interface AddWebFunctionEndpointOptions extends WebFunctionEndpointOptions {
90
+ /**
91
+ * How callers of this endpoint are authenticated.
92
+ */
45
93
  readonly authType: WebFunctionAuthType;
94
+ /**
95
+ * The revision the endpoint serves, e.g. an earlier one from `WebFunctionRevision.fromRevisionAttributes`
96
+ * to keep this endpoint on it while others move on. Same as calling `routeTraffic`.
97
+ *
98
+ * @default - the function's current revision (`currentRevision`)
99
+ */
100
+ readonly revision?: IWebFunctionRevision;
101
+ /**
102
+ * A second revision and its share of the endpoint's traffic; `revision` gets the rest.
103
+ * An endpoint routes to at most two revisions.
104
+ *
105
+ * @default - all traffic goes to `revision`
106
+ */
107
+ readonly additionalRevisions?: WebFunctionRevisionWeight[];
108
+ }
109
+ /**
110
+ * Internal: how `WebFunction` creates its endpoints. Not part of the public API.
111
+ */
112
+ interface WebFunctionEndpointProps extends AddWebFunctionEndpointOptions {
113
+ /** The function that owns the endpoint. */
114
+ readonly webFunction: IWebFunction;
115
+ /** The function's current revision, served unless `revision` is given. */
116
+ readonly currentRevision: IWebFunctionRevision;
117
+ /** Prefix of the generated endpoint name. */
118
+ readonly namePrefix: string;
119
+ /** Extra input to the generated name's hash (the construct ID of an added endpoint). */
120
+ readonly nameSeed?: string;
46
121
  }
47
122
  /**
48
- * The HTTPS endpoint of a Web Function. Created by `WebFunction`; access it as `fn.endpoint`.
123
+ * An HTTPS endpoint of a Web Function: `fn.endpoint` (the default one) or the result of `fn.addEndpoint()`.
49
124
  *
50
- * Only `WebFunction` creates endpoints in this version (one per function), so the constructor is private.
125
+ * Endpoints are created only through `WebFunction`, which owns their log groups in every region, so the constructor is private.
51
126
  */
52
127
  export declare class WebFunctionEndpoint extends Construct {
53
128
  /**
54
- * Creates the endpoint of a Web Function. Used by `WebFunction`.
129
+ * Creates an endpoint of a Web Function. Used by `WebFunction`.
55
130
  *
56
131
  * @internal
57
132
  */
@@ -62,6 +137,8 @@ export declare class WebFunctionEndpoint extends Construct {
62
137
  readonly endpointArn: string;
63
138
  /** Where the endpoint serves traffic from. */
64
139
  readonly endpointType: WebFunctionEndpointType;
140
+ /** How callers of the endpoint are authenticated. */
141
+ readonly authType: WebFunctionAuthType;
65
142
  /** Every region the endpoint serves from: the home region first, then the others in alphabetical order. */
66
143
  readonly regions: string[];
67
144
  /**
@@ -72,9 +149,14 @@ export declare class WebFunctionEndpoint extends Construct {
72
149
  * The endpoint's URL: the global URL for `MULTI_REGION`, otherwise the home region's.
73
150
  */
74
151
  readonly url: string;
152
+ /** Grants on this endpoint (e.g. `grants.invoke(principal)`). */
153
+ readonly grants: WebFunctionGrants;
75
154
  private readonly homeRegion;
76
- private readonly functionName;
77
- private readonly functionArn;
155
+ private readonly webFunction;
156
+ private readonly resource;
157
+ private weights;
158
+ private routed;
159
+ private readonly gradual;
78
160
  private lookup?;
79
161
  private constructor();
80
162
  /**
@@ -83,5 +165,26 @@ export declare class WebFunctionEndpoint extends Construct {
83
165
  * @param region one of `regions`
84
166
  */
85
167
  regionalUrl(region: string): string;
168
+ /**
169
+ * Routes the endpoint to `revision` instead of the function's current revision, optionally sharing
170
+ * traffic with one more revision (`additionalRevisions`, which gets its weight; `revision` gets the rest).
171
+ *
172
+ * Use it to keep an endpoint on an earlier revision (`WebFunctionRevision.fromRevisionAttributes`),
173
+ * or to send part of the traffic to the current revision:
174
+ * `fn.endpoint.routeTraffic(previous, [{ revision: fn.currentRevision, weight: 0.1 }])`.
175
+ * Can be called once per endpoint, and not on one created with `revision` or `additionalRevisions`.
176
+ */
177
+ routeTraffic(revision: IWebFunctionRevision, additionalRevisions?: WebFunctionRevisionWeight[]): void;
178
+ /**
179
+ * The IDs of the revisions this endpoint routes to.
180
+ *
181
+ * @internal
182
+ */
183
+ _revisionIds(): string[];
184
+ /**
185
+ * Allows `grantee` to call this endpoint. Shortcut for `grants.invoke(grantee)`.
186
+ * [disable-awslint:no-grants]
187
+ */
188
+ grantInvoke(grantee: iam.IGrantable): iam.Grant;
86
189
  }
87
190
  export {};
@@ -41,16 +41,18 @@ const lambda = __importStar(require("aws-cdk-lib/aws-lambda"));
41
41
  const constructs_1 = require("constructs");
42
42
  const enums_1 = require("./enums");
43
43
  const endpoint_lookup_1 = require("./private/endpoint-lookup");
44
+ const traffic_shift_1 = require("./private/traffic-shift");
44
45
  const validation_1 = require("./private/validation");
46
+ const web_function_grants_1 = require("./web-function-grants");
45
47
  /**
46
- * The HTTPS endpoint of a Web Function. Created by `WebFunction`; access it as `fn.endpoint`.
48
+ * An HTTPS endpoint of a Web Function: `fn.endpoint` (the default one) or the result of `fn.addEndpoint()`.
47
49
  *
48
- * Only `WebFunction` creates endpoints in this version (one per function), so the constructor is private.
50
+ * Endpoints are created only through `WebFunction`, which owns their log groups in every region, so the constructor is private.
49
51
  */
50
52
  class WebFunctionEndpoint extends constructs_1.Construct {
51
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionEndpoint", version: "0.1.0" };
53
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionEndpoint", version: "0.1.2" };
52
54
  /**
53
- * Creates the endpoint of a Web Function. Used by `WebFunction`.
55
+ * Creates an endpoint of a Web Function. Used by `WebFunction`.
54
56
  *
55
57
  * @internal
56
58
  */
@@ -63,6 +65,8 @@ class WebFunctionEndpoint extends constructs_1.Construct {
63
65
  endpointArn;
64
66
  /** Where the endpoint serves traffic from. */
65
67
  endpointType;
68
+ /** How callers of the endpoint are authenticated. */
69
+ authType;
66
70
  /** Every region the endpoint serves from: the home region first, then the others in alphabetical order. */
67
71
  regions;
68
72
  /**
@@ -73,15 +77,22 @@ class WebFunctionEndpoint extends constructs_1.Construct {
73
77
  * The endpoint's URL: the global URL for `MULTI_REGION`, otherwise the home region's.
74
78
  */
75
79
  url;
80
+ /** Grants on this endpoint (e.g. `grants.invoke(principal)`). */
81
+ grants;
76
82
  homeRegion;
77
- functionName;
78
- functionArn;
83
+ webFunction;
84
+ resource;
85
+ weights;
86
+ routed = false;
87
+ gradual;
79
88
  lookup;
80
89
  constructor(scope, id, props) {
81
90
  super(scope, id);
82
91
  const homeRegion = aws_cdk_lib_1.Stack.of(this).region;
83
92
  const endpointType = props.endpointType ?? enums_1.WebFunctionEndpointType.HOME_REGION;
84
93
  const extraRegions = normaliseRegions(this, endpointType, homeRegion, props.regions ?? []);
94
+ validateRateLimit(this, props.rateLimit);
95
+ validateMaxEnvironments(this, props.maxEnvironments);
85
96
  if (props.endpointName !== undefined) {
86
97
  (0, validation_1.assertResourceName)(this, 'endpointName', props.endpointName);
87
98
  aws_cdk_lib_1.Annotations.of(this).addWarningV2('@cdk-lambda-web:explicitEndpointName', `endpointName '${props.endpointName}' is set explicitly: changing endpointType or regions later also requires a new endpointName, otherwise the deployment fails with "already exists" (the stack rolls back safely). Omit endpointName to get a name that changes automatically.`);
@@ -90,23 +101,55 @@ class WebFunctionEndpoint extends constructs_1.Construct {
90
101
  aws_cdk_lib_1.Annotations.of(this).addWarningV2('@cdk-lambda-web:authTypeNone', 'authType NONE makes the endpoint public: Lambda does no authentication, so your application must authenticate requests itself.');
91
102
  }
92
103
  this.endpointType = endpointType;
93
- this.endpointName = props.endpointName ?? defaultEndpointName(endpointType, extraRegions);
104
+ this.authType = props.authType;
105
+ this.endpointName = props.endpointName ?? defaultEndpointName(props.namePrefix, props.nameSeed, endpointType, extraRegions);
94
106
  this.regions = [homeRegion, ...extraRegions];
95
107
  this.homeRegion = homeRegion;
96
- this.functionName = props.functionName;
97
- this.functionArn = props.functionArn;
108
+ this.webFunction = props.webFunction;
109
+ this.weights = [{ revisionId: props.currentRevision.revisionId, weight: 100 }];
98
110
  const resource = new lambda.CfnWebFunctionEndpoint(this, 'Resource', {
99
- functionName: props.functionArn,
111
+ functionName: props.webFunction.webFunctionArn,
100
112
  endpointName: this.endpointName,
101
113
  endpointType,
102
114
  authType: props.authType,
115
+ description: props.description,
103
116
  regions: extraRegions.length > 0 ? extraRegions : undefined,
104
- revisionWeights: [{ revisionId: props.revisionId, weight: 100 }],
117
+ revisionWeights: this.weights,
118
+ throttleConfig: props.rateLimit !== undefined ? { rateLimit: props.rateLimit } : undefined,
119
+ scalingConfig: props.maxEnvironments !== undefined ? { maxEnvironments: props.maxEnvironments } : undefined,
105
120
  });
106
121
  aws_cdk_lib_1.Validations.of(resource).acknowledge(validation_1.CFN_VALIDATE_UNKNOWN_TYPE);
122
+ this.resource = resource;
123
+ this.gradual = props.deployment?._gradual ?? false;
124
+ if (props.deployment?._gradual) {
125
+ if (props.revision !== undefined || props.additionalRevisions !== undefined) {
126
+ throw new Error(`${this.node.path}: an endpoint with a ${props.deployment._kind} deployment always moves to the current revision; it can't also set revision or additionalRevisions`);
127
+ }
128
+ // Moves the traffic in steps before CloudFormation writes the endpoint, which then finds it already done.
129
+ const shift = new traffic_shift_1.TrafficShift(this, 'Deployment', {
130
+ functionName: props.webFunction.webFunctionName,
131
+ functionArn: props.webFunction.webFunctionArn,
132
+ endpointName: this.endpointName,
133
+ revisionId: props.currentRevision.revisionId,
134
+ deployment: props.deployment,
135
+ endpointConfig: {
136
+ endpointType,
137
+ authType: props.authType,
138
+ description: props.description,
139
+ regions: extraRegions,
140
+ rateLimit: props.rateLimit,
141
+ maxEnvironments: props.maxEnvironments,
142
+ },
143
+ });
144
+ resource.node.addDependency(shift);
145
+ }
146
+ if (props.revision !== undefined || props.additionalRevisions !== undefined) {
147
+ this.routeTraffic(props.revision ?? props.currentRevision, props.additionalRevisions);
148
+ }
107
149
  this.endpointArn = resource.attrEndpointArn;
108
150
  this.domainName = resource.attrDomainName;
109
151
  this.url = `https://${resource.attrDomainName}`;
152
+ this.grants = web_function_grants_1.WebFunctionGrants._forEndpoint(this);
110
153
  }
111
154
  /**
112
155
  * The URL of this endpoint in one region. Only for `PER_REGION` endpoints.
@@ -124,13 +167,48 @@ class WebFunctionEndpoint extends constructs_1.Construct {
124
167
  return this.url;
125
168
  }
126
169
  this.lookup ??= new endpoint_lookup_1.EndpointLookup(this, 'Lookup', {
127
- functionName: this.functionName,
128
- functionArn: this.functionArn,
170
+ functionName: this.webFunction.webFunctionName,
171
+ functionArn: this.webFunction.webFunctionArn,
129
172
  endpointName: this.endpointName,
130
173
  endpointArn: this.endpointArn,
131
174
  });
132
175
  return `https://${this.lookup.regionalDomain(region)}`;
133
176
  }
177
+ /**
178
+ * Routes the endpoint to `revision` instead of the function's current revision, optionally sharing
179
+ * traffic with one more revision (`additionalRevisions`, which gets its weight; `revision` gets the rest).
180
+ *
181
+ * Use it to keep an endpoint on an earlier revision (`WebFunctionRevision.fromRevisionAttributes`),
182
+ * or to send part of the traffic to the current revision:
183
+ * `fn.endpoint.routeTraffic(previous, [{ revision: fn.currentRevision, weight: 0.1 }])`.
184
+ * Can be called once per endpoint, and not on one created with `revision` or `additionalRevisions`.
185
+ */
186
+ routeTraffic(revision, additionalRevisions) {
187
+ if (this.gradual) {
188
+ throw new Error(`${this.node.path}: the endpoint has a deployment in steps, which always moves it to the current revision; routeTraffic() can't be used with it`);
189
+ }
190
+ if (this.routed) {
191
+ throw new Error(`${this.node.path}: the endpoint's revisions are already set (revision, additionalRevisions or routeTraffic)`);
192
+ }
193
+ this.weights = revisionWeights(this, this.webFunction, revision, additionalRevisions ?? []);
194
+ this.resource.revisionWeights = this.weights;
195
+ this.routed = true;
196
+ }
197
+ /**
198
+ * The IDs of the revisions this endpoint routes to.
199
+ *
200
+ * @internal
201
+ */
202
+ _revisionIds() {
203
+ return this.weights.map((w) => w.revisionId);
204
+ }
205
+ /**
206
+ * Allows `grantee` to call this endpoint. Shortcut for `grants.invoke(grantee)`.
207
+ * [disable-awslint:no-grants]
208
+ */
209
+ grantInvoke(grantee) {
210
+ return this.grants.invoke(grantee);
211
+ }
134
212
  }
135
213
  exports.WebFunctionEndpoint = WebFunctionEndpoint;
136
214
  function normaliseRegions(scope, endpointType, homeRegion, regions) {
@@ -156,9 +234,52 @@ function normaliseRegions(scope, endpointType, homeRegion, regions) {
156
234
  }
157
235
  return extra;
158
236
  }
159
- /** `default-<hash>`: a type or region change produces a new name, so the replacement doesn't collide. */
160
- function defaultEndpointName(endpointType, extraRegions) {
161
- const hash = (0, node_crypto_1.createHash)('sha256').update([endpointType, ...extraRegions].join(',')).digest('hex').slice(0, 8);
162
- return `default-${hash}`;
237
+ function validateRateLimit(scope, rateLimit) {
238
+ if (rateLimit === undefined || aws_cdk_lib_1.Token.isUnresolved(rateLimit))
239
+ return;
240
+ const allowed = rateLimit === 0
241
+ || (rateLimit >= 100 && rateLimit <= 1000 && rateLimit % 100 === 0)
242
+ || (rateLimit >= 2000 && rateLimit <= 10000 && rateLimit % 1000 === 0);
243
+ if (!allowed) {
244
+ throw new Error(`${scope.node.path}: rateLimit must be 0, 100-1,000 in steps of 100, or 2,000-10,000 in steps of 1,000, got ${rateLimit}`);
245
+ }
246
+ }
247
+ function validateMaxEnvironments(scope, maxEnvironments) {
248
+ if (maxEnvironments === undefined || aws_cdk_lib_1.Token.isUnresolved(maxEnvironments))
249
+ return;
250
+ if (!Number.isInteger(maxEnvironments) || maxEnvironments < 2 || maxEnvironments > 10000) {
251
+ throw new Error(`${scope.node.path}: maxEnvironments must be an integer from 2 to 10,000, got ${maxEnvironments}`);
252
+ }
253
+ }
254
+ /** `primary` gets what `additional` leaves; weights are whole percentages summing to 100. */
255
+ function revisionWeights(scope, webFunction, primary, additional) {
256
+ for (const r of [primary, ...additional.map((a) => a.revision)]) {
257
+ if (r.webFunction !== webFunction) {
258
+ throw new Error(`${scope.node.path}: revision ${r.revisionId} belongs to another function`);
259
+ }
260
+ }
261
+ if (additional.length === 0) {
262
+ return [{ revisionId: primary.revisionId, weight: 100 }];
263
+ }
264
+ if (additional.length > 1) {
265
+ throw new Error(`${scope.node.path}: an endpoint routes to at most two revisions, so additionalRevisions takes one`);
266
+ }
267
+ const [{ revision, weight }] = additional;
268
+ const percent = Math.round(weight * 100);
269
+ if (aws_cdk_lib_1.Token.isUnresolved(weight) || Math.abs(weight * 100 - percent) > 1e-9 || percent < 1 || percent > 99) {
270
+ throw new Error(`${scope.node.path}: an additional revision's weight must be a whole percentage from 0.01 to 0.99, got ${weight}`);
271
+ }
272
+ if (revision === primary || (!aws_cdk_lib_1.Token.isUnresolved(revision.revisionId) && revision.revisionId === primary.revisionId)) {
273
+ throw new Error(`${scope.node.path}: the additional revision is the same as the endpoint's revision`);
274
+ }
275
+ return [{ revisionId: primary.revisionId, weight: 100 - percent }, { revisionId: revision.revisionId, weight: percent }];
276
+ }
277
+ /**
278
+ * `<prefix>-<hash>`, with the hash covering the endpoint type and regions: a type or region change produces
279
+ * a new name, so the replacement doesn't collide with the endpoint it replaces.
280
+ */
281
+ function defaultEndpointName(prefix, seed, endpointType, extraRegions) {
282
+ const hash = (0, node_crypto_1.createHash)('sha256').update([...(seed !== undefined ? [seed] : []), endpointType, ...extraRegions].join(',')).digest('hex').slice(0, 8);
283
+ return `${prefix}-${hash}`;
163
284
  }
164
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLWVuZHBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dlYi1mdW5jdGlvbi1lbmRwb2ludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXlDO0FBQ3pDLDZDQUFxRTtBQUNyRSwrREFBaUQ7QUFDakQsMkNBQXVDO0FBQ3ZDLG1DQUF1RTtBQUN2RSwrREFBMkQ7QUFDM0QscURBQXFGO0FBcURyRjs7OztHQUlHO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSxzQkFBUzs7SUFDaEQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBK0I7UUFDakYsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELDJCQUEyQjtJQUNYLFlBQVksQ0FBUztJQUVyQywwQkFBMEI7SUFDVixXQUFXLENBQVM7SUFFcEMsOENBQThDO0lBQzlCLFlBQVksQ0FBMEI7SUFFdEQsMkdBQTJHO0lBQzNGLE9BQU8sQ0FBVztJQUVsQzs7T0FFRztJQUNhLFVBQVUsQ0FBUztJQUVuQzs7T0FFRztJQUNhLEdBQUcsQ0FBUztJQUVYLFVBQVUsQ0FBUztJQUNuQixZQUFZLENBQVM7SUFDckIsV0FBVyxDQUFTO0lBQzdCLE1BQU0sQ0FBa0I7SUFFaEMsWUFBb0IsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBK0I7UUFDL0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLFVBQVUsR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDekMsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksSUFBSSwrQkFBdUIsQ0FBQyxXQUFXLENBQUM7UUFDL0UsTUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztRQUUzRixJQUFJLEtBQUssQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDckMsSUFBQSwrQkFBa0IsRUFBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUM3RCx5QkFBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsc0NBQXNDLEVBQ3RFLGlCQUFpQixLQUFLLENBQUMsWUFBWSwrT0FBK08sQ0FBQyxDQUFDO1FBQ3hSLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssMkJBQW1CLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDaEQseUJBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLDhCQUE4QixFQUM5RCxnSUFBZ0ksQ0FBQyxDQUFDO1FBQ3RJLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLElBQUksbUJBQW1CLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzFGLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFDdkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBRXJDLE1BQU0sUUFBUSxHQUFHLElBQUksTUFBTSxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDbkUsWUFBWSxFQUFFLEtBQUssQ0FBQyxXQUFXO1lBQy9CLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtZQUMvQixZQUFZO1lBQ1osUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ3hCLE9BQU8sRUFBRSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQzNELGVBQWUsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO1NBQ2pFLENBQUMsQ0FBQztRQUNILHlCQUFXLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxzQ0FBeUIsQ0FBQyxDQUFDO1FBRWhFLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztRQUM1QyxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUM7UUFDMUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxXQUFXLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFdBQVcsQ0FBQyxNQUFjO1FBQy9CLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSywrQkFBdUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUM3RCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLDJFQUEyRSxJQUFJLENBQUMsWUFBWSxZQUFZLENBQUMsQ0FBQztRQUM3SSxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxZQUFZLE1BQU0sMENBQTBDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzSCxDQUFDO1FBQ0QsSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQy9CLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNsQixDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLGdDQUFjLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtZQUNqRCxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDL0IsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtZQUMvQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7U0FDOUIsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxXQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7SUFDekQsQ0FBQzs7QUFsR0gsa0RBbUdDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFnQixFQUFFLFlBQXFDLEVBQUUsVUFBa0IsRUFBRSxPQUFpQjtJQUN0SCxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxVQUFVLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMzRSxLQUFLLE1BQU0sQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLElBQUksbUJBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLHFEQUFxRCxDQUFDLENBQUM7UUFDM0YsQ0FBQztRQUNELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQzNFLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxZQUFZLEtBQUssK0JBQXVCLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDN0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSx5REFBeUQsVUFBVSw0Q0FBNEMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdkssQ0FBQztJQUNELElBQUksWUFBWSxLQUFLLCtCQUF1QixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3pELElBQUksbUJBQUssQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSw4REFBOEQsQ0FBQyxDQUFDO1FBQ3JILENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxPQUFPLFlBQVksZ0VBQWdFLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDdEksQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCx5R0FBeUc7QUFDekcsU0FBUyxtQkFBbUIsQ0FBQyxZQUFxQyxFQUFFLFlBQXNCO0lBQ3hGLE1BQU0sSUFBSSxHQUFHLElBQUEsd0JBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5RyxPQUFPLFdBQVcsSUFBSSxFQUFFLENBQUM7QUFDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBBbm5vdGF0aW9ucywgU3RhY2ssIFRva2VuLCBWYWxpZGF0aW9ucyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgV2ViRnVuY3Rpb25BdXRoVHlwZSwgV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUgfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB7IEVuZHBvaW50TG9va3VwIH0gZnJvbSAnLi9wcml2YXRlL2VuZHBvaW50LWxvb2t1cCc7XG5pbXBvcnQgeyBDRk5fVkFMSURBVEVfVU5LTk9XTl9UWVBFLCBhc3NlcnRSZXNvdXJjZU5hbWUgfSBmcm9tICcuL3ByaXZhdGUvdmFsaWRhdGlvbic7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYSBXZWIgRnVuY3Rpb24ncyBlbmRwb2ludC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgZW5kcG9pbnQgc2VydmVzIHRyYWZmaWMgZnJvbS5cbiAgICpcbiAgICogQGRlZmF1bHQgV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUuSE9NRV9SRUdJT05cbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50VHlwZT86IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlO1xuXG4gIC8qKlxuICAgKiBSZWdpb25zIHRvIHNlcnZlIGZyb20gaW4gYWRkaXRpb24gdG8gdGhlIGhvbWUgcmVnaW9uICh0aGUgc3RhY2sncyByZWdpb24pLlxuICAgKiBSZXF1aXJlZCAoYXQgbGVhc3Qgb25lKSBmb3IgYE1VTFRJX1JFR0lPTmAgYW5kIGBQRVJfUkVHSU9OYDsgbXVzdCBiZSBlbXB0eSBmb3IgYEhPTUVfUkVHSU9OYC5cbiAgICpcbiAgICogQ2hhbmdpbmcgdGhpcyBjcmVhdGVzIGEgbmV3IGVuZHBvaW50IHdpdGggYSBuZXcgVVJMLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGV4dHJhIHJlZ2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50J3MgbmFtZSwgc2hvd24gaW4gbG9ncyAoYGVuZHBvaW50TmFtZWApIGFuZCBpbiB0aGUgYGxhbWJkYS13ZWItZW5kcG9pbnQtbmFtZWAgaGVhZGVyLlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIHRoZSBuYW1lIGlzIGBkZWZhdWx0LTxoYXNoPmAsIHdpdGggdGhlIGhhc2ggY292ZXJpbmcgdGhlIGVuZHBvaW50IHR5cGUgYW5kIHJlZ2lvbnMsXG4gICAqIHNvIGNoYW5naW5nIGVpdGhlciBkZXBsb3lzIGEgbmV3IGVuZHBvaW50IGNsZWFubHkuIFdoZW4gc2V0LCBjaGFuZ2luZyB0aGUgZW5kcG9pbnQgdHlwZSBvclxuICAgKiByZWdpb25zIGFsc28gcmVxdWlyZXMgYSBuZXcgbmFtZTogdHdvIGVuZHBvaW50cyBvZiBvbmUgZnVuY3Rpb24gY2FuJ3Qgc2hhcmUgYSBuYW1lLCBhbmRcbiAgICogQ2xvdWRGb3JtYXRpb24gY3JlYXRlcyB0aGUgcmVwbGFjZW1lbnQgYmVmb3JlIGRlbGV0aW5nIHRoZSBvbGQgb25lLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGBkZWZhdWx0LTxoYXNoIG9mIHR5cGUgYW5kIHJlZ2lvbnM+YFxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnROYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEludGVybmFsOiBob3cgYFdlYkZ1bmN0aW9uYCBjcmVhdGVzIGl0cyBlbmRwb2ludC4gTm90IHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuXG4gKi9cbmludGVyZmFjZSBXZWJGdW5jdGlvbkVuZHBvaW50UHJvcHMgZXh0ZW5kcyBXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKiBMaXRlcmFsIG5hbWUgb2YgdGhlIFdlYiBGdW5jdGlvbiAodGhlIHByb3ZpZGVyJ3MgSUFNIG11c3Qgbm90IHJlZmVyZW5jZSByZXNvdXJjZSBhdHRyaWJ1dGVzKS4gKi9cbiAgcmVhZG9ubHkgZnVuY3Rpb25OYW1lOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBXZWIgRnVuY3Rpb24ncyBBUk4uICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uQXJuOiBzdHJpbmc7XG5cbiAgLyoqIElEIG9mIHRoZSByZXZpc2lvbiB0aGUgZW5kcG9pbnQgc2VydmVzLiAqL1xuICByZWFkb25seSByZXZpc2lvbklkOiBzdHJpbmc7XG5cbiAgLyoqIEhvdyBjYWxsZXJzIGFyZSBhdXRoZW50aWNhdGVkLiAqL1xuICByZWFkb25seSBhdXRoVHlwZTogV2ViRnVuY3Rpb25BdXRoVHlwZTtcbn1cblxuLyoqXG4gKiBUaGUgSFRUUFMgZW5kcG9pbnQgb2YgYSBXZWIgRnVuY3Rpb24uIENyZWF0ZWQgYnkgYFdlYkZ1bmN0aW9uYDsgYWNjZXNzIGl0IGFzIGBmbi5lbmRwb2ludGAuXG4gKlxuICogT25seSBgV2ViRnVuY3Rpb25gIGNyZWF0ZXMgZW5kcG9pbnRzIGluIHRoaXMgdmVyc2lvbiAob25lIHBlciBmdW5jdGlvbiksIHNvIHRoZSBjb25zdHJ1Y3RvciBpcyBwcml2YXRlLlxuICovXG5leHBvcnQgY2xhc3MgV2ViRnVuY3Rpb25FbmRwb2ludCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBlbmRwb2ludCBvZiBhIFdlYiBGdW5jdGlvbi4gVXNlZCBieSBgV2ViRnVuY3Rpb25gLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgX2NyZWF0ZShzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogV2ViRnVuY3Rpb25FbmRwb2ludFByb3BzKTogV2ViRnVuY3Rpb25FbmRwb2ludCB7XG4gICAgcmV0dXJuIG5ldyBXZWJGdW5jdGlvbkVuZHBvaW50KHNjb3BlLCBpZCwgcHJvcHMpO1xuICB9XG5cbiAgLyoqIFRoZSBlbmRwb2ludCdzIG5hbWUuICovXG4gIHB1YmxpYyByZWFkb25seSBlbmRwb2ludE5hbWU6IHN0cmluZztcblxuICAvKiogVGhlIGVuZHBvaW50J3MgQVJOLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW5kcG9pbnRBcm46IHN0cmluZztcblxuICAvKiogV2hlcmUgdGhlIGVuZHBvaW50IHNlcnZlcyB0cmFmZmljIGZyb20uICovXG4gIHB1YmxpYyByZWFkb25seSBlbmRwb2ludFR5cGU6IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlO1xuXG4gIC8qKiBFdmVyeSByZWdpb24gdGhlIGVuZHBvaW50IHNlcnZlcyBmcm9tOiB0aGUgaG9tZSByZWdpb24gZmlyc3QsIHRoZW4gdGhlIG90aGVycyBpbiBhbHBoYWJldGljYWwgb3JkZXIuICovXG4gIHB1YmxpYyByZWFkb25seSByZWdpb25zOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50J3MgZG9tYWluIG5hbWU6IHRoZSBnbG9iYWwgZG9tYWluIGZvciBgTVVMVElfUkVHSU9OYCwgb3RoZXJ3aXNlIHRoZSBob21lIHJlZ2lvbidzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50J3MgVVJMOiB0aGUgZ2xvYmFsIFVSTCBmb3IgYE1VTFRJX1JFR0lPTmAsIG90aGVyd2lzZSB0aGUgaG9tZSByZWdpb24ncy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGhvbWVSZWdpb246IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBmdW5jdGlvbkFybjogc3RyaW5nO1xuICBwcml2YXRlIGxvb2t1cD86IEVuZHBvaW50TG9va3VwO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFdlYkZ1bmN0aW9uRW5kcG9pbnRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBob21lUmVnaW9uID0gU3RhY2sub2YodGhpcykucmVnaW9uO1xuICAgIGNvbnN0IGVuZHBvaW50VHlwZSA9IHByb3BzLmVuZHBvaW50VHlwZSA/PyBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5IT01FX1JFR0lPTjtcbiAgICBjb25zdCBleHRyYVJlZ2lvbnMgPSBub3JtYWxpc2VSZWdpb25zKHRoaXMsIGVuZHBvaW50VHlwZSwgaG9tZVJlZ2lvbiwgcHJvcHMucmVnaW9ucyA/PyBbXSk7XG5cbiAgICBpZiAocHJvcHMuZW5kcG9pbnROYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFzc2VydFJlc291cmNlTmFtZSh0aGlzLCAnZW5kcG9pbnROYW1lJywgcHJvcHMuZW5kcG9pbnROYW1lKTtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmdWMignQGNkay1sYW1iZGEtd2ViOmV4cGxpY2l0RW5kcG9pbnROYW1lJyxcbiAgICAgICAgYGVuZHBvaW50TmFtZSAnJHtwcm9wcy5lbmRwb2ludE5hbWV9JyBpcyBzZXQgZXhwbGljaXRseTogY2hhbmdpbmcgZW5kcG9pbnRUeXBlIG9yIHJlZ2lvbnMgbGF0ZXIgYWxzbyByZXF1aXJlcyBhIG5ldyBlbmRwb2ludE5hbWUsIG90aGVyd2lzZSB0aGUgZGVwbG95bWVudCBmYWlscyB3aXRoIFwiYWxyZWFkeSBleGlzdHNcIiAodGhlIHN0YWNrIHJvbGxzIGJhY2sgc2FmZWx5KS4gT21pdCBlbmRwb2ludE5hbWUgdG8gZ2V0IGEgbmFtZSB0aGF0IGNoYW5nZXMgYXV0b21hdGljYWxseS5gKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmF1dGhUeXBlID09PSBXZWJGdW5jdGlvbkF1dGhUeXBlLk5PTkUpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmdWMignQGNkay1sYW1iZGEtd2ViOmF1dGhUeXBlTm9uZScsXG4gICAgICAgICdhdXRoVHlwZSBOT05FIG1ha2VzIHRoZSBlbmRwb2ludCBwdWJsaWM6IExhbWJkYSBkb2VzIG5vIGF1dGhlbnRpY2F0aW9uLCBzbyB5b3VyIGFwcGxpY2F0aW9uIG11c3QgYXV0aGVudGljYXRlIHJlcXVlc3RzIGl0c2VsZi4nKTtcbiAgICB9XG5cbiAgICB0aGlzLmVuZHBvaW50VHlwZSA9IGVuZHBvaW50VHlwZTtcbiAgICB0aGlzLmVuZHBvaW50TmFtZSA9IHByb3BzLmVuZHBvaW50TmFtZSA/PyBkZWZhdWx0RW5kcG9pbnROYW1lKGVuZHBvaW50VHlwZSwgZXh0cmFSZWdpb25zKTtcbiAgICB0aGlzLnJlZ2lvbnMgPSBbaG9tZVJlZ2lvbiwgLi4uZXh0cmFSZWdpb25zXTtcbiAgICB0aGlzLmhvbWVSZWdpb24gPSBob21lUmVnaW9uO1xuICAgIHRoaXMuZnVuY3Rpb25OYW1lID0gcHJvcHMuZnVuY3Rpb25OYW1lO1xuICAgIHRoaXMuZnVuY3Rpb25Bcm4gPSBwcm9wcy5mdW5jdGlvbkFybjtcblxuICAgIGNvbnN0IHJlc291cmNlID0gbmV3IGxhbWJkYS5DZm5XZWJGdW5jdGlvbkVuZHBvaW50KHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogcHJvcHMuZnVuY3Rpb25Bcm4sXG4gICAgICBlbmRwb2ludE5hbWU6IHRoaXMuZW5kcG9pbnROYW1lLFxuICAgICAgZW5kcG9pbnRUeXBlLFxuICAgICAgYXV0aFR5cGU6IHByb3BzLmF1dGhUeXBlLFxuICAgICAgcmVnaW9uczogZXh0cmFSZWdpb25zLmxlbmd0aCA+IDAgPyBleHRyYVJlZ2lvbnMgOiB1bmRlZmluZWQsXG4gICAgICByZXZpc2lvbldlaWdodHM6IFt7IHJldmlzaW9uSWQ6IHByb3BzLnJldmlzaW9uSWQsIHdlaWdodDogMTAwIH1dLFxuICAgIH0pO1xuICAgIFZhbGlkYXRpb25zLm9mKHJlc291cmNlKS5hY2tub3dsZWRnZShDRk5fVkFMSURBVEVfVU5LTk9XTl9UWVBFKTtcblxuICAgIHRoaXMuZW5kcG9pbnRBcm4gPSByZXNvdXJjZS5hdHRyRW5kcG9pbnRBcm47XG4gICAgdGhpcy5kb21haW5OYW1lID0gcmVzb3VyY2UuYXR0ckRvbWFpbk5hbWU7XG4gICAgdGhpcy51cmwgPSBgaHR0cHM6Ly8ke3Jlc291cmNlLmF0dHJEb21haW5OYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogVGhlIFVSTCBvZiB0aGlzIGVuZHBvaW50IGluIG9uZSByZWdpb24uIE9ubHkgZm9yIGBQRVJfUkVHSU9OYCBlbmRwb2ludHMuXG4gICAqXG4gICAqIEBwYXJhbSByZWdpb24gb25lIG9mIGByZWdpb25zYFxuICAgKi9cbiAgcHVibGljIHJlZ2lvbmFsVXJsKHJlZ2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5lbmRwb2ludFR5cGUgIT09IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLlBFUl9SRUdJT04pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHJlZ2lvbmFsVXJsKCkgaXMgb25seSBhdmFpbGFibGUgZm9yIFBFUl9SRUdJT04gZW5kcG9pbnRzICh0aGlzIG9uZSBpcyAke3RoaXMuZW5kcG9pbnRUeXBlfSk7IHVzZSB1cmxgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnJlZ2lvbnMuaW5jbHVkZXMocmVnaW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogcmVnaW9uICR7cmVnaW9ufSBpcyBub3Qgb25lIG9mIHRoZSBlbmRwb2ludCdzIHJlZ2lvbnMgKCR7dGhpcy5yZWdpb25zLmpvaW4oJywgJyl9KWApO1xuICAgIH1cbiAgICBpZiAocmVnaW9uID09PSB0aGlzLmhvbWVSZWdpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnVybDtcbiAgICB9XG4gICAgdGhpcy5sb29rdXAgPz89IG5ldyBFbmRwb2ludExvb2t1cCh0aGlzLCAnTG9va3VwJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiB0aGlzLmZ1bmN0aW9uTmFtZSxcbiAgICAgIGZ1bmN0aW9uQXJuOiB0aGlzLmZ1bmN0aW9uQXJuLFxuICAgICAgZW5kcG9pbnROYW1lOiB0aGlzLmVuZHBvaW50TmFtZSxcbiAgICAgIGVuZHBvaW50QXJuOiB0aGlzLmVuZHBvaW50QXJuLFxuICAgIH0pO1xuICAgIHJldHVybiBgaHR0cHM6Ly8ke3RoaXMubG9va3VwLnJlZ2lvbmFsRG9tYWluKHJlZ2lvbil9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpc2VSZWdpb25zKHNjb3BlOiBDb25zdHJ1Y3QsIGVuZHBvaW50VHlwZTogV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUsIGhvbWVSZWdpb246IHN0cmluZywgcmVnaW9uczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGV4dHJhID0gWy4uLm5ldyBTZXQocmVnaW9ucyldLmZpbHRlcigocikgPT4gciAhPT0gaG9tZVJlZ2lvbikuc29ydCgpO1xuICBmb3IgKGNvbnN0IHIgb2YgcmVnaW9ucykge1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQocikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiByZWdpb25zIG11c3QgYmUgbGl0ZXJhbCByZWdpb24gbmFtZXMsIGdvdCBhIHRva2VuYCk7XG4gICAgfVxuICAgIGlmICghL15bYS16XXsyfSgtW2Etel0rKSstXFxkJC8udGVzdChyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06ICcke3J9JyBpcyBub3QgYSB2YWxpZCByZWdpb24gbmFtZWApO1xuICAgIH1cbiAgfVxuICBpZiAoZW5kcG9pbnRUeXBlID09PSBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5IT01FX1JFR0lPTiAmJiBleHRyYS5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IGEgSE9NRV9SRUdJT04gZW5kcG9pbnQgc2VydmVzIG9ubHkgdGhlIGhvbWUgcmVnaW9uICgke2hvbWVSZWdpb259KTsgdXNlIE1VTFRJX1JFR0lPTiBvciBQRVJfUkVHSU9OIHRvIGFkZCAke2V4dHJhLmpvaW4oJywgJyl9YCk7XG4gIH1cbiAgaWYgKGVuZHBvaW50VHlwZSAhPT0gV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUuSE9NRV9SRUdJT04pIHtcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKGhvbWVSZWdpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogJHtlbmRwb2ludFR5cGV9IGVuZHBvaW50cyBuZWVkIGEgc3RhY2sgd2l0aCBhbiBleHBsaWNpdCByZWdpb24gKGVudi5yZWdpb24pYCk7XG4gICAgfVxuICAgIGlmIChleHRyYS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiBhICR7ZW5kcG9pbnRUeXBlfSBlbmRwb2ludCBuZWVkcyBhdCBsZWFzdCBvbmUgcmVnaW9uIGJlc2lkZXMgdGhlIGhvbWUgcmVnaW9uICgke2hvbWVSZWdpb259KWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXh0cmE7XG59XG5cbi8qKiBgZGVmYXVsdC08aGFzaD5gOiBhIHR5cGUgb3IgcmVnaW9uIGNoYW5nZSBwcm9kdWNlcyBhIG5ldyBuYW1lLCBzbyB0aGUgcmVwbGFjZW1lbnQgZG9lc24ndCBjb2xsaWRlLiAqL1xuZnVuY3Rpb24gZGVmYXVsdEVuZHBvaW50TmFtZShlbmRwb2ludFR5cGU6IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLCBleHRyYVJlZ2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShbZW5kcG9pbnRUeXBlLCAuLi5leHRyYVJlZ2lvbnNdLmpvaW4oJywnKSkuZGlnZXN0KCdoZXgnKS5zbGljZSgwLCA4KTtcbiAgcmV0dXJuIGBkZWZhdWx0LSR7aGFzaH1gO1xufVxuIl19
285
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLWVuZHBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dlYi1mdW5jdGlvbi1lbmRwb2ludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXlDO0FBQ3pDLDZDQUFxRTtBQUVyRSwrREFBaUQ7QUFDakQsMkNBQXVDO0FBQ3ZDLG1DQUF1RTtBQUN2RSwrREFBMkQ7QUFDM0QsMkRBQXVEO0FBQ3ZELHFEQUFxRjtBQUdyRiwrREFBMEQ7QUFxSTFEOzs7O0dBSUc7QUFDSCxNQUFhLG1CQUFvQixTQUFRLHNCQUFTOztJQUNoRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUNqRixPQUFPLElBQUksbUJBQW1CLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsMkJBQTJCO0lBQ1gsWUFBWSxDQUFTO0lBRXJDLDBCQUEwQjtJQUNWLFdBQVcsQ0FBUztJQUVwQyw4Q0FBOEM7SUFDOUIsWUFBWSxDQUEwQjtJQUV0RCxxREFBcUQ7SUFDckMsUUFBUSxDQUFzQjtJQUU5QywyR0FBMkc7SUFDM0YsT0FBTyxDQUFXO0lBRWxDOztPQUVHO0lBQ2EsVUFBVSxDQUFTO0lBRW5DOztPQUVHO0lBQ2EsR0FBRyxDQUFTO0lBRTVCLGlFQUFpRTtJQUNqRCxNQUFNLENBQW9CO0lBRXpCLFVBQVUsQ0FBUztJQUNuQixXQUFXLENBQWU7SUFDMUIsUUFBUSxDQUFnQztJQUNqRCxPQUFPLENBQXlEO0lBQ2hFLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDTixPQUFPLENBQVU7SUFDMUIsTUFBTSxDQUFrQjtJQUVoQyxZQUFvQixLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUMvRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFD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LENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckosT0FBTyxHQUFHLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IEFubm90YXRpb25zLCBTdGFjaywgVG9rZW4sIFZhbGlkYXRpb25zIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBXZWJGdW5jdGlvbkF1dGhUeXBlLCBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZSB9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHsgRW5kcG9pbnRMb29rdXAgfSBmcm9tICcuL3ByaXZhdGUvZW5kcG9pbnQtbG9va3VwJztcbmltcG9ydCB7IFRyYWZmaWNTaGlmdCB9IGZyb20gJy4vcHJpdmF0ZS90cmFmZmljLXNoaWZ0JztcbmltcG9ydCB7IENGTl9WQUxJREFURV9VTktOT1dOX1RZUEUsIGFzc2VydFJlc291cmNlTmFtZSB9IGZyb20gJy4vcHJpdmF0ZS92YWxpZGF0aW9uJztcbmltcG9ydCB0eXBlIHsgSVdlYkZ1bmN0aW9uIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBXZWJGdW5jdGlvbkRlcGxveW1lbnQgfSBmcm9tICcuL3dlYi1mdW5jdGlvbi1kZXBsb3ltZW50JztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uR3JhbnRzIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24tZ3JhbnRzJztcbmltcG9ydCB0eXBlIHsgSVdlYkZ1bmN0aW9uUmV2aXNpb24gfSBmcm9tICcuL3dlYi1mdW5jdGlvbi1yZXZpc2lvbic7XG5cbi8qKlxuICogQSByZXZpc2lvbiBhbmQgdGhlIHNoYXJlIG9mIGFuIGVuZHBvaW50J3MgdHJhZmZpYyBpdCByZWNlaXZlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvblJldmlzaW9uV2VpZ2h0IHtcbiAgLyoqIFRoZSByZXZpc2lvbi4gKi9cbiAgcmVhZG9ubHkgcmV2aXNpb246IElXZWJGdW5jdGlvblJldmlzaW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgcmV2aXNpb24ncyBzaGFyZSBvZiB0aGUgZW5kcG9pbnQncyB0cmFmZmljLCBhcyBhIGZyYWN0aW9uIChsaWtlIGBsYW1iZGEuQWxpYXNgIGBhZGRpdGlvbmFsVmVyc2lvbnNgKS5cbiAgICogTXVzdCBiZSBhIHdob2xlIHBlcmNlbnRhZ2UgZnJvbSAwLjAxIHRvIDAuOTkuXG4gICAqL1xuICByZWFkb25seSB3ZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhIFdlYiBGdW5jdGlvbidzIGVuZHBvaW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkZ1bmN0aW9uRW5kcG9pbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBlbmRwb2ludCBzZXJ2ZXMgdHJhZmZpYyBmcm9tLlxuICAgKlxuICAgKiBAZGVmYXVsdCBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5IT01FX1JFR0lPTlxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnRUeXBlPzogV2ViRnVuY3Rpb25FbmRwb2ludFR5cGU7XG5cbiAgLyoqXG4gICAqIFJlZ2lvbnMgdG8gc2VydmUgZnJvbSBpbiBhZGRpdGlvbiB0byB0aGUgaG9tZSByZWdpb24gKHRoZSBzdGFjaydzIHJlZ2lvbikuXG4gICAqIFJlcXVpcmVkIChhdCBsZWFzdCBvbmUpIGZvciBgTVVMVElfUkVHSU9OYCBhbmQgYFBFUl9SRUdJT05gOyBtdXN0IGJlIGVtcHR5IGZvciBgSE9NRV9SRUdJT05gLlxuICAgKlxuICAgKiBDaGFuZ2luZyB0aGlzIGNyZWF0ZXMgYSBuZXcgZW5kcG9pbnQgd2l0aCBhIG5ldyBVUkwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZXh0cmEgcmVnaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9ucz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZW5kcG9pbnQncyBuYW1lLCBzaG93biBpbiBsb2dzIChgZW5kcG9pbnROYW1lYCkgYW5kIGluIHRoZSBgbGFtYmRhLXdlYi1lbmRwb2ludC1uYW1lYCBoZWFkZXIuXG4gICAqIE5hbWVzIGFyZSB1bmlxdWUgcGVyIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIHRoZSBuYW1lIGVuZHMgaW4gYSBoYXNoIG9mIHRoZSBlbmRwb2ludCB0eXBlIGFuZCByZWdpb25zLCBzbyBjaGFuZ2luZyBlaXRoZXIgZGVwbG95c1xuICAgKiBhIG5ldyBlbmRwb2ludCBjbGVhbmx5LiBXaGVuIHNldCwgY2hhbmdpbmcgdGhlIGVuZHBvaW50IHR5cGUgb3IgcmVnaW9ucyBhbHNvIHJlcXVpcmVzIGEgbmV3IG5hbWU6XG4gICAqIHR3byBlbmRwb2ludHMgb2Ygb25lIGZ1bmN0aW9uIGNhbid0IHNoYXJlIGEgbmFtZSwgYW5kIENsb3VkRm9ybWF0aW9uIGNyZWF0ZXMgdGhlIHJlcGxhY2VtZW50XG4gICAqIGJlZm9yZSBkZWxldGluZyB0aGUgb2xkIG9uZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBgZGVmYXVsdC08aGFzaD5gIGZvciB0aGUgZnVuY3Rpb24ncyBkZWZhdWx0IGVuZHBvaW50LCBgPGlkPi08aGFzaD5gIGZvciBlbmRwb2ludHMgYWRkZWQgd2l0aCBgYWRkRW5kcG9pbnRgXG4gICAqL1xuICByZWFkb25seSBlbmRwb2ludE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIGVuZHBvaW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGRlc2NyaXB0aW9uXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vc3QgcmVxdWVzdHMgcGVyIHNlY29uZCB0aGUgZW5kcG9pbnQgYWNjZXB0czsgZXhjZXNzIHJlcXVlc3RzIGdldCBIVFRQIDQyOS5cbiAgICogQWxsb3dlZDogMCAoYmxvY2tzIGFsbCB0cmFmZmljKSwgMTAw4oCTMSwwMDAgaW4gc3RlcHMgb2YgMTAwLCBvciAyLDAwMOKAkzEwLDAwMCBpbiBzdGVwcyBvZiAxLDAwMC5cbiAgICpcbiAgICogRW5mb3JjZWQgc2VwYXJhdGVseSBpbiBlYWNoIHJlZ2lvbiB0aGUgZW5kcG9pbnQgc2VydmVzIGZyb20sIHNvIGEgbXVsdGktcmVnaW9uIGVuZHBvaW50XG4gICAqIGNhbiBhY2NlcHQgdGhpcyBtYW55IHJlcXVlc3RzIHBlciBzZWNvbmQgaW4gZXZlcnkgcmVnaW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGxpbWl0IGJleW9uZCB0aGUgc2VydmljZSBxdW90YSBvZiAxMCwwMDAgcmVxdWVzdHMgcGVyIHNlY29uZCBwZXIgZW5kcG9pbnQgKHBlciByZWdpb24pXG4gICAqL1xuICByZWFkb25seSByYXRlTGltaXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtb3N0IGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgdGhlIGVuZHBvaW50IG1heSB1c2UgKDLigJMxMCwwMDApLiBFYWNoIG9uZSB1c2VzIDIgdkNQVXMgb2YgdGhlIGFjY291bnQncyBxdW90YS5cbiAgICpcbiAgICogRW5mb3JjZWQgc2VwYXJhdGVseSBpbiBlYWNoIHJlZ2lvbiB0aGUgZW5kcG9pbnQgc2VydmVzIGZyb20uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc2NhbGVzIHdpdGhpbiB0aGUgYWNjb3VudCdzIHZDUFUgcXVvdGFcbiAgICovXG4gIHJlYWRvbmx5IG1heEVudmlyb25tZW50cz86IG51bWJlcjtcblxuICAvKipcbiAgICogSG93IHRoZSBlbmRwb2ludCBtb3ZlcyBpdHMgdHJhZmZpYyB0byBhIG5ldyByZXZpc2lvbjogYWxsIGF0IG9uY2UsIG9yIGluIHN0ZXBzXG4gICAqIChgV2ViRnVuY3Rpb25EZXBsb3ltZW50LmNhbmFyeSgpYCBvciBgbGluZWFyKClgKSB0aGF0IHdhdGNoIENsb3VkV2F0Y2ggYWxhcm1zIGFuZCBtb3ZlXG4gICAqIHRoZSB0cmFmZmljIGJhY2sgd2hlbiBvbmUgZ29lcyBpbnRvIEFMQVJNLlxuICAgKlxuICAgKiBBIGRlcGxveW1lbnQgaW4gc3RlcHMgY2FuJ3QgYmUgY29tYmluZWQgd2l0aCBgcmV2aXNpb25gLCBgYWRkaXRpb25hbFJldmlzaW9uc2Agb3IgYHJvdXRlVHJhZmZpYygpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgV2ViRnVuY3Rpb25EZXBsb3ltZW50LmFsbEF0T25jZSgpXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50PzogV2ViRnVuY3Rpb25EZXBsb3ltZW50O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGBXZWJGdW5jdGlvbi5hZGRFbmRwb2ludGAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkV2ViRnVuY3Rpb25FbmRwb2ludE9wdGlvbnMgZXh0ZW5kcyBXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIb3cgY2FsbGVycyBvZiB0aGlzIGVuZHBvaW50IGFyZSBhdXRoZW50aWNhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aFR5cGU6IFdlYkZ1bmN0aW9uQXV0aFR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSByZXZpc2lvbiB0aGUgZW5kcG9pbnQgc2VydmVzLCBlLmcuIGFuIGVhcmxpZXIgb25lIGZyb20gYFdlYkZ1bmN0aW9uUmV2aXNpb24uZnJvbVJldmlzaW9uQXR0cmlidXRlc2BcbiAgICogdG8ga2VlcCB0aGlzIGVuZHBvaW50IG9uIGl0IHdoaWxlIG90aGVycyBtb3ZlIG9uLiBTYW1lIGFzIGNhbGxpbmcgYHJvdXRlVHJhZmZpY2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGZ1bmN0aW9uJ3MgY3VycmVudCByZXZpc2lvbiAoYGN1cnJlbnRSZXZpc2lvbmApXG4gICAqL1xuICByZWFkb25seSByZXZpc2lvbj86IElXZWJGdW5jdGlvblJldmlzaW9uO1xuXG4gIC8qKlxuICAgKiBBIHNlY29uZCByZXZpc2lvbiBhbmQgaXRzIHNoYXJlIG9mIHRoZSBlbmRwb2ludCdzIHRyYWZmaWM7IGByZXZpc2lvbmAgZ2V0cyB0aGUgcmVzdC5cbiAgICogQW4gZW5kcG9pbnQgcm91dGVzIHRvIGF0IG1vc3QgdHdvIHJldmlzaW9ucy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhbGwgdHJhZmZpYyBnb2VzIHRvIGByZXZpc2lvbmBcbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxSZXZpc2lvbnM/OiBXZWJGdW5jdGlvblJldmlzaW9uV2VpZ2h0W107XG59XG5cbi8qKlxuICogSW50ZXJuYWw6IGhvdyBgV2ViRnVuY3Rpb25gIGNyZWF0ZXMgaXRzIGVuZHBvaW50cy4gTm90IHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuXG4gKi9cbmludGVyZmFjZSBXZWJGdW5jdGlvbkVuZHBvaW50UHJvcHMgZXh0ZW5kcyBBZGRXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKiBUaGUgZnVuY3Rpb24gdGhhdCBvd25zIHRoZSBlbmRwb2ludC4gKi9cbiAgcmVhZG9ubHkgd2ViRnVuY3Rpb246IElXZWJGdW5jdGlvbjtcblxuICAvKiogVGhlIGZ1bmN0aW9uJ3MgY3VycmVudCByZXZpc2lvbiwgc2VydmVkIHVubGVzcyBgcmV2aXNpb25gIGlzIGdpdmVuLiAqL1xuICByZWFkb25seSBjdXJyZW50UmV2aXNpb246IElXZWJGdW5jdGlvblJldmlzaW9uO1xuXG4gIC8qKiBQcmVmaXggb2YgdGhlIGdlbmVyYXRlZCBlbmRwb2ludCBuYW1lLiAqL1xuICByZWFkb25seSBuYW1lUHJlZml4OiBzdHJpbmc7XG5cbiAgLyoqIEV4dHJhIGlucHV0IHRvIHRoZSBnZW5lcmF0ZWQgbmFtZSdzIGhhc2ggKHRoZSBjb25zdHJ1Y3QgSUQgb2YgYW4gYWRkZWQgZW5kcG9pbnQpLiAqL1xuICByZWFkb25seSBuYW1lU2VlZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBbiBIVFRQUyBlbmRwb2ludCBvZiBhIFdlYiBGdW5jdGlvbjogYGZuLmVuZHBvaW50YCAodGhlIGRlZmF1bHQgb25lKSBvciB0aGUgcmVzdWx0IG9mIGBmbi5hZGRFbmRwb2ludCgpYC5cbiAqXG4gKiBFbmRwb2ludHMgYXJlIGNyZWF0ZWQgb25seSB0aHJvdWdoIGBXZWJGdW5jdGlvbmAsIHdoaWNoIG93bnMgdGhlaXIgbG9nIGdyb3VwcyBpbiBldmVyeSByZWdpb24sIHNvIHRoZSBjb25zdHJ1Y3RvciBpcyBwcml2YXRlLlxuICovXG5leHBvcnQgY2xhc3MgV2ViRnVuY3Rpb25FbmRwb2ludCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGVuZHBvaW50IG9mIGEgV2ViIEZ1bmN0aW9uLiBVc2VkIGJ5IGBXZWJGdW5jdGlvbmAuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBfY3JlYXRlKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXZWJGdW5jdGlvbkVuZHBvaW50UHJvcHMpOiBXZWJGdW5jdGlvbkVuZHBvaW50IHtcbiAgICByZXR1cm4gbmV3IFdlYkZ1bmN0aW9uRW5kcG9pbnQoc2NvcGUsIGlkLCBwcm9wcyk7XG4gIH1cblxuICAvKiogVGhlIGVuZHBvaW50J3MgbmFtZS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuZHBvaW50TmFtZTogc3RyaW5nO1xuXG4gIC8qKiBUaGUgZW5kcG9pbnQncyBBUk4uICovXG4gIHB1YmxpYyByZWFkb25seSBlbmRwb2ludEFybjogc3RyaW5nO1xuXG4gIC8qKiBXaGVyZSB0aGUgZW5kcG9pbnQgc2VydmVzIHRyYWZmaWMgZnJvbS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuZHBvaW50VHlwZTogV2ViRnVuY3Rpb25FbmRwb2ludFR5cGU7XG5cbiAgLyoqIEhvdyBjYWxsZXJzIG9mIHRoZSBlbmRwb2ludCBhcmUgYXV0aGVudGljYXRlZC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGF1dGhUeXBlOiBXZWJGdW5jdGlvbkF1dGhUeXBlO1xuXG4gIC8qKiBFdmVyeSByZWdpb24gdGhlIGVuZHBvaW50IHNlcnZlcyBmcm9tOiB0aGUgaG9tZSByZWdpb24gZmlyc3QsIHRoZW4gdGhlIG90aGVycyBpbiBhbHBoYWJldGljYWwgb3JkZXIuICovXG4gIHB1YmxpYyByZWFkb25seSByZWdpb25zOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50J3MgZG9tYWluIG5hbWU6IHRoZSBnbG9iYWwgZG9tYWluIGZvciBgTVVMVElfUkVHSU9OYCwgb3RoZXJ3aXNlIHRoZSBob21lIHJlZ2lvbidzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50J3MgVVJMOiB0aGUgZ2xvYmFsIFVSTCBmb3IgYE1VTFRJX1JFR0lPTmAsIG90aGVyd2lzZSB0aGUgaG9tZSByZWdpb24ncy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZztcblxuICAvKiogR3JhbnRzIG9uIHRoaXMgZW5kcG9pbnQgKGUuZy4gYGdyYW50cy5pbnZva2UocHJpbmNpcGFsKWApLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRzOiBXZWJGdW5jdGlvbkdyYW50cztcblxuICBwcml2YXRlIHJlYWRvbmx5IGhvbWVSZWdpb246IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWJGdW5jdGlvbjogSVdlYkZ1bmN0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlOiBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb25FbmRwb2ludDtcbiAgcHJpdmF0ZSB3ZWlnaHRzOiBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb25FbmRwb2ludC5SZXZpc2lvbldlaWdodFByb3BlcnR5W107XG4gIHByaXZhdGUgcm91dGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JhZHVhbDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBsb29rdXA/OiBFbmRwb2ludExvb2t1cDtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXZWJGdW5jdGlvbkVuZHBvaW50UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgaG9tZVJlZ2lvbiA9IFN0YWNrLm9mKHRoaXMpLnJlZ2lvbjtcbiAgICBjb25zdCBlbmRwb2ludFR5cGUgPSBwcm9wcy5lbmRwb2ludFR5cGUgPz8gV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUuSE9NRV9SRUdJT047XG4gICAgY29uc3QgZXh0cmFSZWdpb25zID0gbm9ybWFsaXNlUmVnaW9ucyh0aGlzLCBlbmRwb2ludFR5cGUsIGhvbWVSZWdpb24sIHByb3BzLnJlZ2lvbnMgPz8gW10pO1xuICAgIHZhbGlkYXRlUmF0ZUxpbWl0KHRoaXMsIHByb3BzLnJhdGVMaW1pdCk7XG4gICAgdmFsaWRhdGVNYXhFbnZpcm9ubWVudHModGhpcywgcHJvcHMubWF4RW52aXJvbm1lbnRzKTtcblxuICAgIGlmIChwcm9wcy5lbmRwb2ludE5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXNzZXJ0UmVzb3VyY2VOYW1lKHRoaXMsICdlbmRwb2ludE5hbWUnLCBwcm9wcy5lbmRwb2ludE5hbWUpO1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKCdAY2RrLWxhbWJkYS13ZWI6ZXhwbGljaXRFbmRwb2ludE5hbWUnLFxuICAgICAgICBgZW5kcG9pbnROYW1lICcke3Byb3BzLmVuZHBvaW50TmFtZX0nIGlzIHNldCBleHBsaWNpdGx5OiBjaGFuZ2luZyBlbmRwb2ludFR5cGUgb3IgcmVnaW9ucyBsYXRlciBhbHNvIHJlcXVpcmVzIGEgbmV3IGVuZHBvaW50TmFtZSwgb3RoZXJ3aXNlIHRoZSBkZXBsb3ltZW50IGZhaWxzIHdpdGggXCJhbHJlYWR5IGV4aXN0c1wiICh0aGUgc3RhY2sgcm9sbHMgYmFjayBzYWZlbHkpLiBPbWl0IGVuZHBvaW50TmFtZSB0byBnZXQgYSBuYW1lIHRoYXQgY2hhbmdlcyBhdXRvbWF0aWNhbGx5LmApO1xuICAgIH1cbiAgICBpZiAocHJvcHMuYXV0aFR5cGUgPT09IFdlYkZ1bmN0aW9uQXV0aFR5cGUuTk9ORSkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKCdAY2RrLWxhbWJkYS13ZWI6YXV0aFR5cGVOb25lJyxcbiAgICAgICAgJ2F1dGhUeXBlIE5PTkUgbWFrZXMgdGhlIGVuZHBvaW50IHB1YmxpYzogTGFtYmRhIGRvZXMgbm8gYXV0aGVudGljYXRpb24sIHNvIHlvdXIgYXBwbGljYXRpb24gbXVzdCBhdXRoZW50aWNhdGUgcmVxdWVzdHMgaXRzZWxmLicpO1xuICAgIH1cblxuICAgIHRoaXMuZW5kcG9pbnRUeXBlID0gZW5kcG9pbnRUeXBlO1xuICAgIHRoaXMuYXV0aFR5cGUgPSBwcm9wcy5hdXRoVHlwZTtcbiAgICB0aGlzLmVuZHBvaW50TmFtZSA9IHByb3BzLmVuZHBvaW50TmFtZSA/PyBkZWZhdWx0RW5kcG9pbnROYW1lKHByb3BzLm5hbWVQcmVmaXgsIHByb3BzLm5hbWVTZWVkLCBlbmRwb2ludFR5cGUsIGV4dHJhUmVnaW9ucyk7XG4gICAgdGhpcy5yZWdpb25zID0gW2hvbWVSZWdpb24sIC4uLmV4dHJhUmVnaW9uc107XG4gICAgdGhpcy5ob21lUmVnaW9uID0gaG9tZVJlZ2lvbjtcbiAgICB0aGlzLndlYkZ1bmN0aW9uID0gcHJvcHMud2ViRnVuY3Rpb247XG4gICAgdGhpcy53ZWlnaHRzID0gW3sgcmV2aXNpb25JZDogcHJvcHMuY3VycmVudFJldmlzaW9uLnJldmlzaW9uSWQsIHdlaWdodDogMTAwIH1dO1xuXG4gICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgbGFtYmRhLkNmbldlYkZ1bmN0aW9uRW5kcG9pbnQodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiBwcm9wcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbkFybixcbiAgICAgIGVuZHBvaW50TmFtZTogdGhpcy5lbmRwb2ludE5hbWUsXG4gICAgICBlbmRwb2ludFR5cGUsXG4gICAgICBhdXRoVHlwZTogcHJvcHMuYXV0aFR5cGUsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICByZWdpb25zOiBleHRyYVJlZ2lvbnMubGVuZ3RoID4gMCA/IGV4dHJhUmVnaW9ucyA6IHVuZGVmaW5lZCxcbiAgICAgIHJldmlzaW9uV2VpZ2h0czogdGhpcy53ZWlnaHRzLFxuICAgICAgdGhyb3R0bGVDb25maWc6IHByb3BzLnJhdGVMaW1pdCAhPT0gdW5kZWZpbmVkID8geyByYXRlTGltaXQ6IHByb3BzLnJhdGVMaW1pdCB9IDogdW5kZWZpbmVkLFxuICAgICAgc2NhbGluZ0NvbmZpZzogcHJvcHMubWF4RW52aXJvbm1lbnRzICE9PSB1bmRlZmluZWQgPyB7IG1heEVudmlyb25tZW50czogcHJvcHMubWF4RW52aXJvbm1lbnRzIH0gOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgVmFsaWRhdGlvbnMub2YocmVzb3VyY2UpLmFja25vd2xlZGdlKENGTl9WQUxJREFURV9VTktOT1dOX1RZUEUpO1xuICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTtcblxuICAgIHRoaXMuZ3JhZHVhbCA9IHByb3BzLmRlcGxveW1lbnQ/Ll9ncmFkdWFsID8/IGZhbHNlO1xuICAgIGlmIChwcm9wcy5kZXBsb3ltZW50Py5fZ3JhZHVhbCkge1xuICAgICAgaWYgKHByb3BzLnJldmlzaW9uICE9PSB1bmRlZmluZWQgfHwgcHJvcHMuYWRkaXRpb25hbFJldmlzaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IGFuIGVuZHBvaW50IHdpdGggYSAke3Byb3BzLmRlcGxveW1lbnQuX2tpbmR9IGRlcGxveW1lbnQgYWx3YXlzIG1vdmVzIHRvIHRoZSBjdXJyZW50IHJldmlzaW9uOyBpdCBjYW4ndCBhbHNvIHNldCByZXZpc2lvbiBvciBhZGRpdGlvbmFsUmV2aXNpb25zYCk7XG4gICAgICB9XG4gICAgICAvLyBNb3ZlcyB0aGUgdHJhZmZpYyBpbiBzdGVwcyBiZWZvcmUgQ2xvdWRGb3JtYXRpb24gd3JpdGVzIHRoZSBlbmRwb2ludCwgd2hpY2ggdGhlbiBmaW5kcyBpdCBhbHJlYWR5IGRvbmUuXG4gICAgICBjb25zdCBzaGlmdCA9IG5ldyBUcmFmZmljU2hpZnQodGhpcywgJ0RlcGxveW1lbnQnLCB7XG4gICAgICAgIGZ1bmN0aW9uTmFtZTogcHJvcHMud2ViRnVuY3Rpb24ud2ViRnVuY3Rpb25OYW1lLFxuICAgICAgICBmdW5jdGlvbkFybjogcHJvcHMud2ViRnVuY3Rpb24ud2ViRnVuY3Rpb25Bcm4sXG4gICAgICAgIGVuZHBvaW50TmFtZTogdGhpcy5lbmRwb2ludE5hbWUsXG4gICAgICAgIHJldmlzaW9uSWQ6IHByb3BzLmN1cnJlbnRSZXZpc2lvbi5yZXZpc2lvbklkLFxuICAgICAgICBkZXBsb3ltZW50OiBwcm9wcy5kZXBsb3ltZW50LFxuICAgICAgICBlbmRwb2ludENvbmZpZzoge1xuICAgICAgICAgIGVuZHBvaW50VHlwZSxcbiAgICAgICAgICBhdXRoVHlwZTogcHJvcHMuYXV0aFR5cGUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIHJlZ2lvbnM6IGV4dHJhUmVnaW9ucyxcbiAgICAgICAgICByYXRlTGltaXQ6IHByb3BzLnJhdGVMaW1pdCxcbiAgICAgICAgICBtYXhFbnZpcm9ubWVudHM6IHByb3BzLm1heEVudmlyb25tZW50cyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcmVzb3VyY2Uubm9kZS5hZGREZXBlbmRlbmN5KHNoaWZ0KTtcbiAgICB9XG4gICAgaWYgKHByb3BzLnJldmlzaW9uICE9PSB1bmRlZmluZWQgfHwgcHJvcHMuYWRkaXRpb25hbFJldmlzaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJvdXRlVHJhZmZpYyhwcm9wcy5yZXZpc2lvbiA/PyBwcm9wcy5jdXJyZW50UmV2aXNpb24sIHByb3BzLmFkZGl0aW9uYWxSZXZpc2lvbnMpO1xuICAgIH1cblxuICAgIHRoaXMuZW5kcG9pbnRBcm4gPSByZXNvdXJjZS5hdHRyRW5kcG9pbnRBcm47XG4gICAgdGhpcy5kb21haW5OYW1lID0gcmVzb3VyY2UuYXR0ckRvbWFpbk5hbWU7XG4gICAgdGhpcy51cmwgPSBgaHR0cHM6Ly8ke3Jlc291cmNlLmF0dHJEb21haW5OYW1lfWA7XG4gICAgdGhpcy5ncmFudHMgPSBXZWJGdW5jdGlvbkdyYW50cy5fZm9yRW5kcG9pbnQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIFVSTCBvZiB0aGlzIGVuZHBvaW50IGluIG9uZSByZWdpb24uIE9ubHkgZm9yIGBQRVJfUkVHSU9OYCBlbmRwb2ludHMuXG4gICAqXG4gICAqIEBwYXJhbSByZWdpb24gb25lIG9mIGByZWdpb25zYFxuICAgKi9cbiAgcHVibGljIHJlZ2lvbmFsVXJsKHJlZ2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5lbmRwb2ludFR5cGUgIT09IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLlBFUl9SRUdJT04pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHJlZ2lvbmFsVXJsKCkgaXMgb25seSBhdmFpbGFibGUgZm9yIFBFUl9SRUdJT04gZW5kcG9pbnRzICh0aGlzIG9uZSBpcyAke3RoaXMuZW5kcG9pbnRUeXBlfSk7IHVzZSB1cmxgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnJlZ2lvbnMuaW5jbHVkZXMocmVnaW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogcmVnaW9uICR7cmVnaW9ufSBpcyBub3Qgb25lIG9mIHRoZSBlbmRwb2ludCdzIHJlZ2lvbnMgKCR7dGhpcy5yZWdpb25zLmpvaW4oJywgJyl9KWApO1xuICAgIH1cbiAgICBpZiAocmVnaW9uID09PSB0aGlzLmhvbWVSZWdpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnVybDtcbiAgICB9XG4gICAgdGhpcy5sb29rdXAgPz89IG5ldyBFbmRwb2ludExvb2t1cCh0aGlzLCAnTG9va3VwJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiB0aGlzLndlYkZ1bmN0aW9uLndlYkZ1bmN0aW9uTmFtZSxcbiAgICAgIGZ1bmN0aW9uQXJuOiB0aGlzLndlYkZ1bmN0aW9uLndlYkZ1bmN0aW9uQXJuLFxuICAgICAgZW5kcG9pbnROYW1lOiB0aGlzLmVuZHBvaW50TmFtZSxcbiAgICAgIGVuZHBvaW50QXJuOiB0aGlzLmVuZHBvaW50QXJuLFxuICAgIH0pO1xuICAgIHJldHVybiBgaHR0cHM6Ly8ke3RoaXMubG9va3VwLnJlZ2lvbmFsRG9tYWluKHJlZ2lvbil9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3V0ZXMgdGhlIGVuZHBvaW50IHRvIGByZXZpc2lvbmAgaW5zdGVhZCBvZiB0aGUgZnVuY3Rpb24ncyBjdXJyZW50IHJldmlzaW9uLCBvcHRpb25hbGx5IHNoYXJpbmdcbiAgICogdHJhZmZpYyB3aXRoIG9uZSBtb3JlIHJldmlzaW9uIChgYWRkaXRpb25hbFJldmlzaW9uc2AsIHdoaWNoIGdldHMgaXRzIHdlaWdodDsgYHJldmlzaW9uYCBnZXRzIHRoZSByZXN0KS5cbiAgICpcbiAgICogVXNlIGl0IHRvIGtlZXAgYW4gZW5kcG9pbnQgb24gYW4gZWFybGllciByZXZpc2lvbiAoYFdlYkZ1bmN0aW9uUmV2aXNpb24uZnJvbVJldmlzaW9uQXR0cmlidXRlc2ApLFxuICAgKiBvciB0byBzZW5kIHBhcnQgb2YgdGhlIHRyYWZmaWMgdG8gdGhlIGN1cnJlbnQgcmV2aXNpb246XG4gICAqIGBmbi5lbmRwb2ludC5yb3V0ZVRyYWZmaWMocHJldmlvdXMsIFt7IHJldmlzaW9uOiBmbi5jdXJyZW50UmV2aXNpb24sIHdlaWdodDogMC4xIH1dKWAuXG4gICAqIENhbiBiZSBjYWxsZWQgb25jZSBwZXIgZW5kcG9pbnQsIGFuZCBub3Qgb24gb25lIGNyZWF0ZWQgd2l0aCBgcmV2aXNpb25gIG9yIGBhZGRpdGlvbmFsUmV2aXNpb25zYC5cbiAgICovXG4gIHB1YmxpYyByb3V0ZVRyYWZmaWMocmV2aXNpb246IElXZWJGdW5jdGlvblJldmlzaW9uLCBhZGRpdGlvbmFsUmV2aXNpb25zPzogV2ViRnVuY3Rpb25SZXZpc2lvbldlaWdodFtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZ3JhZHVhbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogdGhlIGVuZHBvaW50IGhhcyBhIGRlcGxveW1lbnQgaW4gc3RlcHMsIHdoaWNoIGFsd2F5cyBtb3ZlcyBpdCB0byB0aGUgY3VycmVudCByZXZpc2lvbjsgcm91dGVUcmFmZmljKCkgY2FuJ3QgYmUgdXNlZCB3aXRoIGl0YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJvdXRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogdGhlIGVuZHBvaW50J3MgcmV2aXNpb25zIGFyZSBhbHJlYWR5IHNldCAocmV2aXNpb24sIGFkZGl0aW9uYWxSZXZpc2lvbnMgb3Igcm91dGVUcmFmZmljKWApO1xuICAgIH1cbiAgICB0aGlzLndlaWdodHMgPSByZXZpc2lvbldlaWdodHModGhpcywgdGhpcy53ZWJGdW5jdGlvbiwgcmV2aXNpb24sIGFkZGl0aW9uYWxSZXZpc2lvbnMgPz8gW10pO1xuICAgIHRoaXMucmVzb3VyY2UucmV2aXNpb25XZWlnaHRzID0gdGhpcy53ZWlnaHRzO1xuICAgIHRoaXMucm91dGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgSURzIG9mIHRoZSByZXZpc2lvbnMgdGhpcyBlbmRwb2ludCByb3V0ZXMgdG8uXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9yZXZpc2lvbklkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMud2VpZ2h0cy5tYXAoKHcpID0+IHcucmV2aXNpb25JZCk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIGBncmFudGVlYCB0byBjYWxsIHRoaXMgZW5kcG9pbnQuIFNob3J0Y3V0IGZvciBgZ3JhbnRzLmludm9rZShncmFudGVlKWAuXG4gICAqIFtkaXNhYmxlLWF3c2xpbnQ6bm8tZ3JhbnRzXVxuICAgKi9cbiAgcHVibGljIGdyYW50SW52b2tlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5ncmFudHMuaW52b2tlKGdyYW50ZWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGlzZVJlZ2lvbnMoc2NvcGU6IENvbnN0cnVjdCwgZW5kcG9pbnRUeXBlOiBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZSwgaG9tZVJlZ2lvbjogc3RyaW5nLCByZWdpb25zOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZXh0cmEgPSBbLi4ubmV3IFNldChyZWdpb25zKV0uZmlsdGVyKChyKSA9PiByICE9PSBob21lUmVnaW9uKS5zb3J0KCk7XG4gIGZvciAoY29uc3QgciBvZiByZWdpb25zKSB7XG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IHJlZ2lvbnMgbXVzdCBiZSBsaXRlcmFsIHJlZ2lvbiBuYW1lcywgZ290IGEgdG9rZW5gKTtcbiAgICB9XG4gICAgaWYgKCEvXlthLXpdezJ9KC1bYS16XSspKy1cXGQkLy50ZXN0KHIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogJyR7cn0nIGlzIG5vdCBhIHZhbGlkIHJlZ2lvbiBuYW1lYCk7XG4gICAgfVxuICB9XG4gIGlmIChlbmRwb2ludFR5cGUgPT09IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLkhPTUVfUkVHSU9OICYmIGV4dHJhLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogYSBIT01FX1JFR0lPTiBlbmRwb2ludCBzZXJ2ZXMgb25seSB0aGUgaG9tZSByZWdpb24gKCR7aG9tZVJlZ2lvbn0pOyB1c2UgTVVMVElfUkVHSU9OIG9yIFBFUl9SRUdJT04gdG8gYWRkICR7ZXh0cmEuam9pbignLCAnKX1gKTtcbiAgfVxuICBpZiAoZW5kcG9pbnRUeXBlICE9PSBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5IT01FX1JFR0lPTikge1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoaG9tZVJlZ2lvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiAke2VuZHBvaW50VHlwZX0gZW5kcG9pbnRzIG5lZWQgYSBzdGFjayB3aXRoIGFuIGV4cGxpY2l0IHJlZ2lvbiAoZW52LnJlZ2lvbilgKTtcbiAgICB9XG4gICAgaWYgKGV4dHJhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IGEgJHtlbmRwb2ludFR5cGV9IGVuZHBvaW50IG5lZWRzIGF0IGxlYXN0IG9uZSByZWdpb24gYmVzaWRlcyB0aGUgaG9tZSByZWdpb24gKCR7aG9tZVJlZ2lvbn0pYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBleHRyYTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVSYXRlTGltaXQoc2NvcGU6IENvbnN0cnVjdCwgcmF0ZUxpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKHJhdGVMaW1pdCA9PT0gdW5kZWZpbmVkIHx8IFRva2VuLmlzVW5yZXNvbHZlZChyYXRlTGltaXQpKSByZXR1cm47XG4gIGNvbnN0IGFsbG93ZWQgPSByYXRlTGltaXQgPT09IDBcbiAgICB8fCAocmF0ZUxpbWl0ID49IDEwMCAmJiByYXRlTGltaXQgPD0gMTAwMCAmJiByYXRlTGltaXQgJSAxMDAgPT09IDApXG4gICAgfHwgKHJhdGVMaW1pdCA+PSAyMDAwICYmIHJhdGVMaW1pdCA8PSAxMDAwMCAmJiByYXRlTGltaXQgJSAxMDAwID09PSAwKTtcbiAgaWYgKCFhbGxvd2VkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IHJhdGVMaW1pdCBtdXN0IGJlIDAsIDEwMC0xLDAwMCBpbiBzdGVwcyBvZiAxMDAsIG9yIDIsMDAwLTEwLDAwMCBpbiBzdGVwcyBvZiAxLDAwMCwgZ290ICR7cmF0ZUxpbWl0fWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlTWF4RW52aXJvbm1lbnRzKHNjb3BlOiBDb25zdHJ1Y3QsIG1heEVudmlyb25tZW50czogbnVtYmVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmIChtYXhFbnZpcm9ubWVudHMgPT09IHVuZGVmaW5lZCB8fCBUb2tlbi5pc1VucmVzb2x2ZWQobWF4RW52aXJvbm1lbnRzKSkgcmV0dXJuO1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIobWF4RW52aXJvbm1lbnRzKSB8fCBtYXhFbnZpcm9ubWVudHMgPCAyIHx8IG1heEVudmlyb25tZW50cyA+IDEwMDAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IG1heEVudmlyb25tZW50cyBtdXN0IGJlIGFuIGludGVnZXIgZnJvbSAyIHRvIDEwLDAwMCwgZ290ICR7bWF4RW52aXJvbm1lbnRzfWApO1xuICB9XG59XG5cbi8qKiBgcHJpbWFyeWAgZ2V0cyB3aGF0IGBhZGRpdGlvbmFsYCBsZWF2ZXM7IHdlaWdodHMgYXJlIHdob2xlIHBlcmNlbnRhZ2VzIHN1bW1pbmcgdG8gMTAwLiAqL1xuZnVuY3Rpb24gcmV2aXNpb25XZWlnaHRzKFxuICBzY29wZTogQ29uc3RydWN0LFxuICB3ZWJGdW5jdGlvbjogSVdlYkZ1bmN0aW9uLFxuICBwcmltYXJ5OiBJV2ViRnVuY3Rpb25SZXZpc2lvbixcbiAgYWRkaXRpb25hbDogV2ViRnVuY3Rpb25SZXZpc2lvbldlaWdodFtdLFxuKTogbGFtYmRhLkNmbldlYkZ1bmN0aW9uRW5kcG9pbnQuUmV2aXNpb25XZWlnaHRQcm9wZXJ0eVtdIHtcbiAgZm9yIChjb25zdCByIG9mIFtwcmltYXJ5LCAuLi5hZGRpdGlvbmFsLm1hcCgoYSkgPT4gYS5yZXZpc2lvbildKSB7XG4gICAgaWYgKHIud2ViRnVuY3Rpb24gIT09IHdlYkZ1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogcmV2aXNpb24gJHtyLnJldmlzaW9uSWR9IGJlbG9uZ3MgdG8gYW5vdGhlciBmdW5jdGlvbmApO1xuICAgIH1cbiAgfVxuICBpZiAoYWRkaXRpb25hbC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW3sgcmV2aXNpb25JZDogcHJpbWFyeS5yZXZpc2lvbklkLCB3ZWlnaHQ6IDEwMCB9XTtcbiAgfVxuICBpZiAoYWRkaXRpb25hbC5sZW5ndGggPiAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IGFuIGVuZHBvaW50IHJvdXRlcyB0byBhdCBtb3N0IHR3byByZXZpc2lvbnMsIHNvIGFkZGl0aW9uYWxSZXZpc2lvbnMgdGFrZXMgb25lYCk7XG4gIH1cbiAgY29uc3QgW3sgcmV2aXNpb24sIHdlaWdodCB9XSA9IGFkZGl0aW9uYWw7XG4gIGNvbnN0IHBlcmNlbnQgPSBNYXRoLnJvdW5kKHdlaWdodCAqIDEwMCk7XG4gIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQod2VpZ2h0KSB8fCBNYXRoLmFicyh3ZWlnaHQgKiAxMDAgLSBwZXJjZW50KSA+IDFlLTkgfHwgcGVyY2VudCA8IDEgfHwgcGVyY2VudCA+IDk5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IGFuIGFkZGl0aW9uYWwgcmV2aXNpb24ncyB3ZWlnaHQgbXVzdCBiZSBhIHdob2xlIHBlcmNlbnRhZ2UgZnJvbSAwLjAxIHRvIDAuOTksIGdvdCAke3dlaWdodH1gKTtcbiAgfVxuICBpZiAocmV2aXNpb24gPT09IHByaW1hcnkgfHwgKCFUb2tlbi5pc1VucmVzb2x2ZWQocmV2aXNpb24ucmV2aXNpb25JZCkgJiYgcmV2aXNpb24ucmV2aXNpb25JZCA9PT0gcHJpbWFyeS5yZXZpc2lvbklkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiB0aGUgYWRkaXRpb25hbCByZXZpc2lvbiBpcyB0aGUgc2FtZSBhcyB0aGUgZW5kcG9pbnQncyByZXZpc2lvbmApO1xuICB9XG4gIHJldHVybiBbeyByZXZpc2lvbklkOiBwcmltYXJ5LnJldmlzaW9uSWQsIHdlaWdodDogMTAwIC0gcGVyY2VudCB9LCB7IHJldmlzaW9uSWQ6IHJldmlzaW9uLnJldmlzaW9uSWQsIHdlaWdodDogcGVyY2VudCB9XTtcbn1cblxuLyoqXG4gKiBgPHByZWZpeD4tPGhhc2g+YCwgd2l0aCB0aGUgaGFzaCBjb3ZlcmluZyB0aGUgZW5kcG9pbnQgdHlwZSBhbmQgcmVnaW9uczogYSB0eXBlIG9yIHJlZ2lvbiBjaGFuZ2UgcHJvZHVjZXNcbiAqIGEgbmV3IG5hbWUsIHNvIHRoZSByZXBsYWNlbWVudCBkb2Vzbid0IGNvbGxpZGUgd2l0aCB0aGUgZW5kcG9pbnQgaXQgcmVwbGFjZXMuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRFbmRwb2ludE5hbWUocHJlZml4OiBzdHJpbmcsIHNlZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgZW5kcG9pbnRUeXBlOiBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZSwgZXh0cmFSZWdpb25zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoWy4uLihzZWVkICE9PSB1bmRlZmluZWQgPyBbc2VlZF0gOiBbXSksIGVuZHBvaW50VHlwZSwgLi4uZXh0cmFSZWdpb25zXS5qb2luKCcsJykpLmRpZ2VzdCgnaGV4Jykuc2xpY2UoMCwgOCk7XG4gIHJldHVybiBgJHtwcmVmaXh9LSR7aGFzaH1gO1xufVxuIl19
@@ -1,7 +1,7 @@
1
1
  import * as iam from 'aws-cdk-lib/aws-iam';
2
2
  import type { WebFunctionEndpoint } from './web-function-endpoint';
3
3
  /**
4
- * Grants on a Web Function. Access it as `fn.grants`.
4
+ * Grants on a Web Function endpoint. Access them as `fn.grants` (the default endpoint) or `endpoint.grants`.
5
5
  */
6
6
  export declare class WebFunctionGrants {
7
7
  private readonly endpoint;
@@ -11,7 +11,7 @@ export declare class WebFunctionGrants {
11
11
  static _forEndpoint(endpoint: WebFunctionEndpoint): WebFunctionGrants;
12
12
  private constructor();
13
13
  /**
14
- * Allows `grantee` to call the function's endpoint (`lambda:InvokeWebFunctionEndpoint`).
14
+ * Allows `grantee` to call the endpoint (`lambda:InvokeWebFunctionEndpoint`).
15
15
  *
16
16
  * The grant is on the endpoint's home-region ARN, which IAM evaluates for every region the
17
17
  * endpoint serves from, including a MULTI_REGION global URL.
@@ -37,11 +37,11 @@ exports.WebFunctionGrants = void 0;
37
37
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
38
38
  const iam = __importStar(require("aws-cdk-lib/aws-iam"));
39
39
  /**
40
- * Grants on a Web Function. Access it as `fn.grants`.
40
+ * Grants on a Web Function endpoint. Access them as `fn.grants` (the default endpoint) or `endpoint.grants`.
41
41
  */
42
42
  class WebFunctionGrants {
43
43
  endpoint;
44
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionGrants", version: "0.1.0" };
44
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionGrants", version: "0.1.2" };
45
45
  /**
46
46
  * @internal
47
47
  */
@@ -52,7 +52,7 @@ class WebFunctionGrants {
52
52
  this.endpoint = endpoint;
53
53
  }
54
54
  /**
55
- * Allows `grantee` to call the function's endpoint (`lambda:InvokeWebFunctionEndpoint`).
55
+ * Allows `grantee` to call the endpoint (`lambda:InvokeWebFunctionEndpoint`).
56
56
  *
57
57
  * The grant is on the endpoint's home-region ARN, which IAM evaluates for every region the
58
58
  * endpoint serves from, including a MULTI_REGION global URL.
@@ -66,4 +66,4 @@ class WebFunctionGrants {
66
66
  }
67
67
  }
68
68
  exports.WebFunctionGrants = WebFunctionGrants;
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLWdyYW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWItZnVuY3Rpb24tZ3JhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5REFBMkM7QUFHM0M7O0dBRUc7QUFDSCxNQUFhLGlCQUFpQjtJQVFTOztJQVByQzs7T0FFRztJQUNJLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBNkI7UUFDdEQsT0FBTyxJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxZQUFxQyxRQUE2QjtRQUE3QixhQUFRLEdBQVIsUUFBUSxDQUFxQjtJQUFHLENBQUM7SUFFdEU7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsT0FBdUI7UUFDbkMsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUM5QixPQUFPO1lBQ1AsT0FBTyxFQUFFLENBQUMsa0NBQWtDLENBQUM7WUFDN0MsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7U0FDMUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUF0QkgsOENBdUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHR5cGUgeyBXZWJGdW5jdGlvbkVuZHBvaW50IH0gZnJvbSAnLi93ZWItZnVuY3Rpb24tZW5kcG9pbnQnO1xuXG4vKipcbiAqIEdyYW50cyBvbiBhIFdlYiBGdW5jdGlvbi4gQWNjZXNzIGl0IGFzIGBmbi5ncmFudHNgLlxuICovXG5leHBvcnQgY2xhc3MgV2ViRnVuY3Rpb25HcmFudHMge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIF9mb3JFbmRwb2ludChlbmRwb2ludDogV2ViRnVuY3Rpb25FbmRwb2ludCk6IFdlYkZ1bmN0aW9uR3JhbnRzIHtcbiAgICByZXR1cm4gbmV3IFdlYkZ1bmN0aW9uR3JhbnRzKGVuZHBvaW50KTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBlbmRwb2ludDogV2ViRnVuY3Rpb25FbmRwb2ludCkge31cblxuICAvKipcbiAgICogQWxsb3dzIGBncmFudGVlYCB0byBjYWxsIHRoZSBmdW5jdGlvbidzIGVuZHBvaW50IChgbGFtYmRhOkludm9rZVdlYkZ1bmN0aW9uRW5kcG9pbnRgKS5cbiAgICpcbiAgICogVGhlIGdyYW50IGlzIG9uIHRoZSBlbmRwb2ludCdzIGhvbWUtcmVnaW9uIEFSTiwgd2hpY2ggSUFNIGV2YWx1YXRlcyBmb3IgZXZlcnkgcmVnaW9uIHRoZVxuICAgKiBlbmRwb2ludCBzZXJ2ZXMgZnJvbSwgaW5jbHVkaW5nIGEgTVVMVElfUkVHSU9OIGdsb2JhbCBVUkwuXG4gICAqL1xuICBwdWJsaWMgaW52b2tlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgIGdyYW50ZWUsXG4gICAgICBhY3Rpb25zOiBbJ2xhbWJkYTpJbnZva2VXZWJGdW5jdGlvbkVuZHBvaW50J10sXG4gICAgICByZXNvdXJjZUFybnM6IFt0aGlzLmVuZHBvaW50LmVuZHBvaW50QXJuXSxcbiAgICB9KTtcbiAgfVxufVxuIl19
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLWdyYW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWItZnVuY3Rpb24tZ3JhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5REFBMkM7QUFHM0M7O0dBRUc7QUFDSCxNQUFhLGlCQUFpQjtJQVFTOztJQVByQzs7T0FFRztJQUNJLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBNkI7UUFDdEQsT0FBTyxJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxZQUFxQyxRQUE2QjtRQUE3QixhQUFRLEdBQVIsUUFBUSxDQUFxQjtJQUFHLENBQUM7SUFFdEU7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsT0FBdUI7UUFDbkMsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUM5QixPQUFPO1lBQ1AsT0FBTyxFQUFFLENBQUMsa0NBQWtDLENBQUM7WUFDN0MsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7U0FDMUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUF0QkgsOENBdUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHR5cGUgeyBXZWJGdW5jdGlvbkVuZHBvaW50IH0gZnJvbSAnLi93ZWItZnVuY3Rpb24tZW5kcG9pbnQnO1xuXG4vKipcbiAqIEdyYW50cyBvbiBhIFdlYiBGdW5jdGlvbiBlbmRwb2ludC4gQWNjZXNzIHRoZW0gYXMgYGZuLmdyYW50c2AgKHRoZSBkZWZhdWx0IGVuZHBvaW50KSBvciBgZW5kcG9pbnQuZ3JhbnRzYC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkZ1bmN0aW9uR3JhbnRzIHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBfZm9yRW5kcG9pbnQoZW5kcG9pbnQ6IFdlYkZ1bmN0aW9uRW5kcG9pbnQpOiBXZWJGdW5jdGlvbkdyYW50cyB7XG4gICAgcmV0dXJuIG5ldyBXZWJGdW5jdGlvbkdyYW50cyhlbmRwb2ludCk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZW5kcG9pbnQ6IFdlYkZ1bmN0aW9uRW5kcG9pbnQpIHt9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBgZ3JhbnRlZWAgdG8gY2FsbCB0aGUgZW5kcG9pbnQgKGBsYW1iZGE6SW52b2tlV2ViRnVuY3Rpb25FbmRwb2ludGApLlxuICAgKlxuICAgKiBUaGUgZ3JhbnQgaXMgb24gdGhlIGVuZHBvaW50J3MgaG9tZS1yZWdpb24gQVJOLCB3aGljaCBJQU0gZXZhbHVhdGVzIGZvciBldmVyeSByZWdpb24gdGhlXG4gICAqIGVuZHBvaW50IHNlcnZlcyBmcm9tLCBpbmNsdWRpbmcgYSBNVUxUSV9SRUdJT04gZ2xvYmFsIFVSTC5cbiAgICovXG4gIHB1YmxpYyBpbnZva2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZSxcbiAgICAgIGFjdGlvbnM6IFsnbGFtYmRhOkludm9rZVdlYkZ1bmN0aW9uRW5kcG9pbnQnXSxcbiAgICAgIHJlc291cmNlQXJuczogW3RoaXMuZW5kcG9pbnQuZW5kcG9pbnRBcm5dLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,45 @@
1
+ import type * as lambda from 'aws-cdk-lib/aws-lambda';
2
+ import { Construct, type IConstruct } from 'constructs';
3
+ /**
4
+ * A revision of a Web Function: an immutable snapshot of its code and configuration.
5
+ */
6
+ export interface IWebFunctionRevision extends IConstruct {
7
+ /** The revision's ID, e.g. `rev-a1b2c`. */
8
+ readonly revisionId: string;
9
+ /** The revision's ARN. */
10
+ readonly revisionArn: string;
11
+ /** The function the revision belongs to. */
12
+ readonly webFunction: lambda.IWebFunctionRef;
13
+ }
14
+ /**
15
+ * Attributes of an existing revision.
16
+ */
17
+ export interface WebFunctionRevisionAttributes {
18
+ /** The function the revision belongs to. */
19
+ readonly webFunction: lambda.IWebFunctionRef;
20
+ /** The revision's ID, e.g. `rev-a1b2c` (the `revisionId` of an earlier deployment). */
21
+ readonly revisionId: string;
22
+ }
23
+ /**
24
+ * A revision of a Web Function.
25
+ *
26
+ * `WebFunction` creates its current revision (`fn.currentRevision`) from its code and configuration.
27
+ * Use `fromRevisionAttributes` to route an endpoint to an earlier one, which must still exist:
28
+ * only revisions within `revisionRetention`, or that an endpoint routes to, are kept.
29
+ */
30
+ export declare class WebFunctionRevision extends Construct implements IWebFunctionRevision {
31
+ /**
32
+ * References an existing revision of `webFunction`, e.g. to pin an endpoint to it or split traffic with it.
33
+ */
34
+ static fromRevisionAttributes(scope: Construct, id: string, attrs: WebFunctionRevisionAttributes): IWebFunctionRevision;
35
+ /**
36
+ * The revision `WebFunction` creates.
37
+ *
38
+ * @internal
39
+ */
40
+ static _current(scope: Construct, id: string, webFunction: lambda.IWebFunctionRef, revisionId: string, revisionArn: string): WebFunctionRevision;
41
+ readonly webFunction: lambda.IWebFunctionRef;
42
+ readonly revisionId: string;
43
+ readonly revisionArn: string;
44
+ private constructor();
45
+ }