cdk-serverless 3.4.0 → 3.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/constructs/assets/hierarchy.js +1 -1
- package/docs/constructs/assets/navigation.js +1 -1
- package/docs/constructs/assets/search.js +1 -1
- package/docs/constructs/classes/GraphQlApi.html +4 -3
- package/docs/constructs/classes/McpAuth.html +1 -1
- package/docs/constructs/classes/McpCognitoAuth.html +1 -1
- package/docs/constructs/classes/RestApi.html +1 -1
- package/docs/constructs/classes/SingleTableDatastore.html +1 -1
- package/docs/constructs/classes/Workflow.html +1 -1
- package/docs/constructs/hierarchy.html +5 -5
- package/docs/constructs/interfaces/GraphQlApiProps.html +7 -3
- package/docs/constructs/interfaces/LambdaResolverOptions.html +72 -0
- package/docs/constructs/interfaces/RestApiProps.html +1 -1
- package/docs/constructs/modules.html +2 -2
- package/docs/lambda/assets/hierarchy.js +1 -1
- package/docs/lambda/assets/navigation.js +1 -1
- package/docs/lambda/assets/search.js +1 -1
- package/docs/lambda/classes/errors.BadRequestError.html +1 -1
- package/docs/lambda/classes/errors.ForbiddenError.html +1 -1
- package/docs/lambda/classes/errors.HttpError.html +1 -1
- package/docs/lambda/classes/errors.NotFoundError.html +1 -1
- package/docs/lambda/classes/errors.UnauthenticatedError.html +1 -1
- package/docs/lambda/classes/errors.appsync.AppSyncError.html +1 -1
- package/docs/lambda/classes/errors.appsync.ConflictError.html +1 -1
- package/docs/lambda/classes/errors.appsync.ForbiddenError.html +1 -1
- package/docs/lambda/classes/errors.appsync.NotFoundError.html +1 -1
- package/docs/lambda/classes/errors.appsync.ValidationError.html +1 -1
- package/docs/lambda/functions/api.createAppSyncBatchHandler.html +57 -0
- package/docs/lambda/hierarchy.html +14 -10
- package/docs/lambda/interfaces/api.AppSyncBatchHandlerContext.html +89 -0
- package/docs/lambda/interfaces/api.AppSyncHandlerContext.html +6 -0
- package/docs/lambda/modules/api.html +6 -6
- package/docs/lambda/types/api.AppSyncBatchHandler.html +53 -0
- package/lib/constructs/graphql.d.ts +31 -4
- package/lib/constructs/graphql.js +38 -8
- package/lib/lambda/handler.d.ts +28 -0
- package/lib/lambda/handler.js +101 -38
- package/llm.md +13 -1
- package/package.json +1 -1
|
@@ -27,10 +27,15 @@ export interface GraphQlApiProps extends BaseApiProps {
|
|
|
27
27
|
* response handler converts the errors.appsync.* envelope returned by
|
|
28
28
|
* createAppSyncHandler into a typed GraphQL error.
|
|
29
29
|
*
|
|
30
|
+
* Untyped errors still fail the invocation, and the pipeline function raises
|
|
31
|
+
* them as GraphQL errors with AppSync's invoke error type (e.g.
|
|
32
|
+
* `Lambda:Unhandled`), as a UNIT direct-Lambda resolver does.
|
|
33
|
+
*
|
|
30
34
|
* When false (the default), addLambdaResolver synthesizes a plain UNIT
|
|
31
|
-
* direct-Lambda resolver (the pre-#385 behavior) with no response handler.
|
|
32
|
-
*
|
|
33
|
-
*
|
|
35
|
+
* direct-Lambda resolver (the pre-#385 behavior) with no response handler.
|
|
36
|
+
* The Lambda gets no APPSYNC_TYPED_ERRORS flag, so createAppSyncHandler
|
|
37
|
+
* rethrows an AppSyncError and AppSync reports it as `Lambda:Unhandled`
|
|
38
|
+
* without the typed errorType and errorInfo.
|
|
34
39
|
*
|
|
35
40
|
* This flag applies to ALL Lambda resolvers on the API. Enabling it changes
|
|
36
41
|
* the resolver topology from UNIT to PIPELINE, which produces a cdk diff for
|
|
@@ -40,6 +45,28 @@ export interface GraphQlApiProps extends BaseApiProps {
|
|
|
40
45
|
*/
|
|
41
46
|
typedErrors?: boolean;
|
|
42
47
|
}
|
|
48
|
+
export interface LambdaResolverOptions {
|
|
49
|
+
/**
|
|
50
|
+
* If set, addLambdaResolver wires an AppSync BatchInvoke resolver instead of a
|
|
51
|
+
* single invoke. The generated UNIT resolver gets MaxBatchSize set to this
|
|
52
|
+
* value, a BatchInvoke request template
|
|
53
|
+
* (MappingTemplate.lambdaRequest('$utils.toJson($context)', 'BatchInvoke')) and
|
|
54
|
+
* a MappingTemplate.lambdaResult() response template, so AppSync groups up to
|
|
55
|
+
* this many field invocations into one Lambda call. Pair this with
|
|
56
|
+
* createAppSyncBatchHandler, whose handler receives the batched events.
|
|
57
|
+
*
|
|
58
|
+
* When both maxBatchSize and `typedErrors` are set, maxBatchSize wins for this
|
|
59
|
+
* field. The field gets the UNIT BatchInvoke resolver rather than the
|
|
60
|
+
* typedErrors APPSYNC_JS pipeline, because the BatchInvoke mapping templates
|
|
61
|
+
* have no equivalent on that pipeline. Typed errors thrown by a batch handler
|
|
62
|
+
* are not converted to GraphQL errors. They rethrow and fail the invocation,
|
|
63
|
+
* so a batch handler should not rely on the typed-error-to-GraphQL-error
|
|
64
|
+
* conversion.
|
|
65
|
+
*
|
|
66
|
+
* @default - undefined (single invoke, the pre-batch behaviour; no MaxBatchSize and no mapping templates)
|
|
67
|
+
*/
|
|
68
|
+
readonly maxBatchSize?: number;
|
|
69
|
+
}
|
|
43
70
|
export interface VtlResolverOptions {
|
|
44
71
|
/**
|
|
45
72
|
* The datasource the VTL resolver targets
|
|
@@ -139,7 +166,7 @@ export declare class GraphQlApi<RESOLVERS> extends BaseApi {
|
|
|
139
166
|
* getFunctionForOperation
|
|
140
167
|
*/
|
|
141
168
|
getFunctionForOperation<TYPE extends keyof RESOLVERS, FIELDTYPE extends NonNullable<RESOLVERS[TYPE]>>(typeName: TYPE, fieldName: keyof FIELDTYPE): LambdaFunction;
|
|
142
|
-
addLambdaResolver<TYPE extends keyof RESOLVERS, FIELDTYPE extends NonNullable<RESOLVERS[TYPE]>>(typeName: TYPE, fieldName: keyof FIELDTYPE): LambdaFunction;
|
|
169
|
+
addLambdaResolver<TYPE extends keyof RESOLVERS, FIELDTYPE extends NonNullable<RESOLVERS[TYPE]>>(typeName: TYPE, fieldName: keyof FIELDTYPE, options?: LambdaResolverOptions): LambdaFunction;
|
|
143
170
|
addDynamoDbVtlResolver<TYPE extends keyof RESOLVERS, FIELDTYPE extends NonNullable<RESOLVERS[TYPE]>>(typeName: TYPE, fieldName: keyof FIELDTYPE, options?: Omit<VtlResolverOptions, 'dataSource'>): void;
|
|
144
171
|
addDynamoDbJSResolver<TYPE extends keyof RESOLVERS, FIELDTYPE extends NonNullable<RESOLVERS[TYPE]>>(typeName: TYPE, fieldName: keyof FIELDTYPE, options?: JsResolverOptions): void;
|
|
145
172
|
addJSResolver<TYPE extends keyof RESOLVERS, FIELDTYPE extends NonNullable<RESOLVERS[TYPE]>>(typeName: TYPE, fieldName: keyof FIELDTYPE, dataSource: aws_appsync.BaseDataSource, options?: JsResolverOptions): void;
|
|
@@ -218,7 +218,8 @@ class GraphQlApi extends base_api_1.BaseApi {
|
|
|
218
218
|
getFunctionForOperation(typeName, fieldName) {
|
|
219
219
|
return this._functions[`${typeName}.${fieldName}`];
|
|
220
220
|
}
|
|
221
|
-
addLambdaResolver(typeName, fieldName) {
|
|
221
|
+
addLambdaResolver(typeName, fieldName, options) {
|
|
222
|
+
const isBatch = options?.maxBatchSize !== undefined;
|
|
222
223
|
const operationId = `${typeName}.${fieldName}`;
|
|
223
224
|
const description = `Type ${typeName} Field ${fieldName} Resolver`;
|
|
224
225
|
const entryFile = `./src/lambda/${operationId}.ts`;
|
|
@@ -259,6 +260,29 @@ class GraphQlApi extends base_api_1.BaseApi {
|
|
|
259
260
|
name: `Lambda_${typeName}_${fieldName}`,
|
|
260
261
|
lambdaFunction: fn,
|
|
261
262
|
});
|
|
263
|
+
if (isBatch) {
|
|
264
|
+
// A batch field always takes the UNIT BatchInvoke path, even when the API
|
|
265
|
+
// has typedErrors enabled. maxBatchSize wins over typedErrors for this
|
|
266
|
+
// field because the BatchInvoke mapping templates have no equivalent on
|
|
267
|
+
// the APPSYNC_JS pipeline resolver. AppSync batches up to maxBatchSize
|
|
268
|
+
// field invocations into a single Lambda call handled by
|
|
269
|
+
// createAppSyncBatchHandler. The L2 BaseResolverProps.maxBatchSize sets
|
|
270
|
+
// MaxBatchSize directly, so no escape hatch is needed.
|
|
271
|
+
//
|
|
272
|
+
// APPSYNC_TYPED_ERRORS is intentionally not set here. A batch handler that
|
|
273
|
+
// throws a typed error rethrows and fails the invocation loudly instead of
|
|
274
|
+
// having the error envelope returned as field data.
|
|
275
|
+
new aws_cdk_lib_1.aws_appsync.Resolver(scope, `Resolver${operationId}`, {
|
|
276
|
+
api: this.api,
|
|
277
|
+
typeName: typeName,
|
|
278
|
+
fieldName: fieldName,
|
|
279
|
+
dataSource,
|
|
280
|
+
maxBatchSize: options.maxBatchSize,
|
|
281
|
+
requestMappingTemplate: aws_cdk_lib_1.aws_appsync.MappingTemplate.lambdaRequest('$utils.toJson($context)', 'BatchInvoke'),
|
|
282
|
+
responseMappingTemplate: aws_cdk_lib_1.aws_appsync.MappingTemplate.lambdaResult(),
|
|
283
|
+
});
|
|
284
|
+
return fn;
|
|
285
|
+
}
|
|
262
286
|
if (!this.props.typedErrors) {
|
|
263
287
|
// Default (pre-#385) shape: a plain UNIT resolver with the Lambda data
|
|
264
288
|
// source set directly. No response handler, so the error envelope from
|
|
@@ -300,9 +324,16 @@ export function request(ctx) {
|
|
|
300
324
|
};
|
|
301
325
|
}
|
|
302
326
|
|
|
303
|
-
//
|
|
304
|
-
//
|
|
327
|
+
// A failed invoke (an untyped error rethrown by createAppSyncHandler, a timeout,
|
|
328
|
+
// a missing permission) lands in this function's ctx.error. AppSync drops it
|
|
329
|
+
// unless this handler raises it, and the field would resolve to null with no
|
|
330
|
+
// GraphQL error. Raise it with the same message and type a UNIT direct-Lambda
|
|
331
|
+
// resolver reports. Otherwise pass the result through; the resolver response
|
|
332
|
+
// handler converts the typed error envelope into a GraphQL error.
|
|
305
333
|
export function response(ctx) {
|
|
334
|
+
if (ctx.error) {
|
|
335
|
+
util.error(ctx.error.message, ctx.error.type);
|
|
336
|
+
}
|
|
306
337
|
return ctx.result;
|
|
307
338
|
}
|
|
308
339
|
`),
|
|
@@ -328,11 +359,10 @@ export function request(ctx) {
|
|
|
328
359
|
// createAppSyncHandler stamps. Branching on the sentinel (not on a bare
|
|
329
360
|
// errorMessage) means a legitimate result that merely has an errorMessage field
|
|
330
361
|
// is returned unchanged instead of being misread as a typed error.
|
|
362
|
+
//
|
|
363
|
+
// Invoke-level errors are raised by the pipeline function itself: an error left
|
|
364
|
+
// in a function's ctx.error never reaches this handler's ctx.error.
|
|
331
365
|
export function response(ctx) {
|
|
332
|
-
if (ctx.error) {
|
|
333
|
-
util.appendError(ctx.error.message, ctx.error.type, ctx.result);
|
|
334
|
-
return ctx.result;
|
|
335
|
-
}
|
|
336
366
|
const result = ctx.prev.result;
|
|
337
367
|
if (result && result.__appSyncError) {
|
|
338
368
|
util.error(result.errorMessage, result.errorType, null, result.errorInfo);
|
|
@@ -565,4 +595,4 @@ function exec(cmd, args, options) {
|
|
|
565
595
|
}
|
|
566
596
|
return proc;
|
|
567
597
|
}
|
|
568
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhxbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdHJ1Y3RzL2dyYXBocWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNEJBQTRCO0FBQzVCLGlEQUE0RDtBQUM1RCw0Q0FBOEI7QUFDOUIsNENBQThCO0FBQzlCLDZDQUE2TDtBQUc3TCx5Q0FBbUQ7QUFDbkQsaUNBQXdDO0FBQ3hDLCtDQUF5RTtBQWlGekU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQWEsVUFBc0IsU0FBUSxrQkFBTztJQTRCaEQ7Ozs7OztPQU1HO0lBQ0gsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBbUIsS0FBc0I7UUFDL0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFEaUMsVUFBSyxHQUFMLEtBQUssQ0FBaUI7UUF2QmpGOztXQUVHO1FBQ0ssZUFBVSxHQUE4QyxFQUFFLENBQUM7UUFFbkU7OztXQUdHO1FBQ2MsaUJBQVksR0FBd0MsRUFBRSxDQUFDO1FBaUJ0RSxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxjQUF1QyxDQUFDO1FBRWpFLElBQUksZ0JBQXVELENBQUM7UUFDNUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsZ0JBQWdCLEdBQUc7Z0JBQ2pCLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDeEIsV0FBVyxFQUFFLElBQUksb0NBQXNCLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtvQkFDNUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFXO29CQUM1QixNQUFNLEVBQUUsV0FBVztvQkFDbkIsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPO29CQUN4QixVQUFVLEVBQUUsb0NBQXNCLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7aUJBQ2xGLENBQUM7YUFDSCxDQUFDO1lBQ0YsSUFBSSx1QkFBUyxDQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRTtnQkFDMUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsOENBQW9DLEVBQUU7Z0JBQ25FLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTzthQUNwQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLHlCQUFXLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDdEQsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUMsU0FBUyxHQUFHO1lBQzdDLFNBQVMsRUFBRTtnQkFDVCxhQUFhLEVBQUUseUJBQVcsQ0FBQyxhQUFhLENBQUMsR0FBRztnQkFDNUMsU0FBUyxFQUFFLHNCQUFRLENBQUMsYUFBYSxDQUFDLFVBQVU7YUFDN0M7WUFDRCxNQUFNLEVBQUUseUJBQVcsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQztZQUNsRSxVQUFVLEVBQUUsZ0JBQWdCO1lBQzVCLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSTtnQkFDckIsbUJBQW1CLEVBQUU7b0JBQ25CLDRCQUE0QixFQUFFO3dCQUM1Qjs0QkFDRSxpQkFBaUIsRUFBRSx5QkFBVyxDQUFDLGlCQUFpQixDQUFDLFNBQVM7NEJBQzFELGNBQWMsRUFBRTtnQ0FDZCxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRO2dDQUNuQyxhQUFhLEVBQUUseUJBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJOzZCQUN0RDt5QkFDRjt3QkFDRCxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLEVBQUUseUJBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO3FCQUNuRztpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDbkQsSUFBSSx5QkFBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUM3QyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVc7Z0JBQ3RCLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxVQUFVO2dCQUN2QyxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUI7YUFDdkMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELHVEQUF1RDtRQUN2RCwwRUFBMEU7UUFDMUUsZ0NBQWdDO1FBQ2hDLDhCQUE4QjtRQUM5Qix1QkFBdUI7UUFDdkIsc0NBQXNDO1FBQ3RDLFNBQVM7UUFDVCx3QkFBd0I7UUFDeEIsU0FBUztRQUNULDBFQUEwRTtRQUMxRSxnQ0FBZ0M7UUFDaEMsOEJBQThCO1FBQzlCLHVCQUF1QjtRQUN2QixzQ0FBc0M7UUFDdEMsU0FBUztRQUNULHdCQUF3QjtRQUN4QixTQUFTO1FBQ1QsMkVBQTJFO1FBQzNFLGdDQUFnQztRQUNoQyw2QkFBNkI7UUFDN0IsdUJBQXVCO1FBQ3ZCLHNDQUFzQztRQUN0QyxTQUFTO1FBQ1QsNEJBQTRCO1FBQzVCLFNBQVM7UUFDVCwyRUFBMkU7UUFDM0UsZ0NBQWdDO1FBQ2hDLDZCQUE2QjtRQUM3Qix1QkFBdUI7UUFDdkIsc0NBQXNDO1FBQ3RDLFNBQVM7UUFDVCx3QkFBd0I7UUFDeEIsU0FBUztRQUNULCtFQUErRTtRQUMvRSxnQ0FBZ0M7UUFDaEMsNkJBQTZCO1FBQzdCLHVCQUF1QjtRQUN2QixzQ0FBc0M7UUFDdEMsU0FBUztRQUNULHdCQUF3QjtRQUN4QixTQUFTO1FBQ1QsK0VBQStFO1FBQy9FLGdDQUFnQztRQUNoQyw2QkFBNkI7UUFDN0IsdUJBQXVCO1FBQ3ZCLHNDQUFzQztRQUN0QyxTQUFTO1FBQ1Qsd0JBQXdCO1FBQ3hCLFNBQVM7UUFDVCxJQUFJO1FBRUosSUFBSSxLQUFLLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUkseUJBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUU7Z0JBQ25GLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztnQkFDYixLQUFLLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixFQUFFLEtBQUs7YUFDekMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLFdBQVcsQ0FDaEIsT0FBMkIsRUFDM0IsUUFBYyxFQUNkLEdBQUcsVUFBK0I7UUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLHlCQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxRQUFrQixFQUFFLEdBQUcsVUFBc0IsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDNUgsQ0FBQztJQUVEOztPQUVHO0lBQ0ksaUJBQWlCLENBQ3RCLFFBQWMsRUFDZCxHQUFHLFVBQStCO1FBRWxDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztRQUMvRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBRUQ7O09BRUc7SUFDSSxlQUFlLENBQ3BCLFFBQWMsRUFDZCxHQUFHLFVBQStCO1FBRWxDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztRQUMvRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBR0Q7O09BRUc7SUFDSSx1QkFBdUIsQ0FDNUIsUUFBYyxFQUNkLFNBQTBCO1FBRTFCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFFBQWtCLElBQUksU0FBbUIsRUFBRSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVNLGlCQUFpQixDQUN0QixRQUFjLEVBQ2QsU0FBMEI7UUFFMUIsTUFBTSxXQUFXLEdBQUcsR0FBRyxRQUFrQixJQUFJLFNBQW1CLEVBQUUsQ0FBQztRQUNuRSxNQUFNLFdBQVcsR0FBRyxRQUFRLFFBQWtCLFVBQVUsU0FBbUIsV0FBVyxDQUFDO1FBRXZGLE1BQU0sU0FBUyxHQUFHLGdCQUFnQixXQUFXLEtBQUssQ0FBQztRQUNuRCxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzlCLEVBQUUsQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsUUFBa0IsRUFBRSxTQUFtQixDQUFDLENBQUM7UUFDM0UsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFrQixDQUFDLENBQUM7UUFFM0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxxQkFBYyxDQUFDLEtBQUssRUFBRSxLQUFLLFdBQVcsRUFBRSxFQUFFO1lBQ3ZELFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVM7WUFDL0IsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYTtZQUN2QyxLQUFLLEVBQUUsU0FBUztZQUNoQixXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsS0FBSyxXQUFXLEVBQUU7WUFDdkQsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsSUFBSTtnQkFDOUIsUUFBUSxFQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBd0MsQ0FBQyxRQUFRO2FBQ3hFO1lBQ0QsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixJQUFJO2dCQUNwQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLO2dCQUM1QyxXQUFXLEVBQUUsUUFBUSxLQUFLLFVBQVU7YUFDckM7WUFDRCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJO2dCQUN4QixlQUFlLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsZUFBZTtnQkFDcEQsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVc7YUFDN0M7WUFDRCxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhO1lBQ3ZDLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWE7U0FDeEMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDbEMsa0JBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUV4Qyx5QkFBeUI7UUFDekIsOEVBQThFO1FBQzlFLCtFQUErRTtRQUMvRSx5RUFBeUU7UUFDekUsNEVBQTRFO1FBQzVFLElBQUk7UUFFSixNQUFNLFVBQVUsR0FBRyxJQUFJLHlCQUFXLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFdBQVcsV0FBVyxFQUFFLEVBQUU7WUFDbkYsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsSUFBSSxFQUFFLFVBQVUsUUFBa0IsSUFBSSxTQUFtQixFQUFFO1lBQzNELGNBQWMsRUFBRSxFQUFFO1NBQ25CLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzVCLHVFQUF1RTtZQUN2RSx1RUFBdUU7WUFDdkUscUVBQXFFO1lBQ3JFLDJFQUEyRTtZQUMzRSxJQUFJLHlCQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxXQUFXLFdBQVcsRUFBRSxFQUFFO2dCQUN4RCxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7Z0JBQ2IsUUFBUSxFQUFFLFFBQWtCO2dCQUM1QixTQUFTLEVBQUUsU0FBbUI7Z0JBQzlCLFVBQVU7YUFDWCxDQUFDLENBQUM7WUFDSCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFFRCx3RUFBd0U7UUFDeEUseUVBQXlFO1FBQ3pFLHdFQUF3RTtRQUN4RSx3RUFBd0U7UUFDeEUsMEVBQTBFO1FBQzFFLHNFQUFzRTtRQUN0RSxFQUFFLENBQUMsY0FBYyxDQUFDLHNCQUFzQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRWxELCtFQUErRTtRQUMvRSx5RUFBeUU7UUFDekUsNEVBQTRFO1FBQzVFLHlFQUF5RTtRQUN6RSwwRUFBMEU7UUFDMUUsd0VBQXdFO1FBQ3hFLE1BQU0sY0FBYyxHQUFHLElBQUkseUJBQVcsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLFdBQVcsV0FBVyxFQUFFLEVBQUU7WUFDdEYsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsSUFBSSxFQUFFLFVBQVcsUUFBbUIsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxJQUFLLFNBQW9CLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUN6SCxVQUFVO1lBQ1YsT0FBTyxFQUFFLHlCQUFXLENBQUMsZUFBZSxDQUFDLFFBQVE7WUFDN0MsSUFBSSxFQUFFLHlCQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0NBZXZDLENBQUM7U0FDRyxDQUFDLENBQUM7UUFFSCxJQUFJLHlCQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxXQUFXLFdBQVcsRUFBRSxFQUFFO1lBQ3hELEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLFFBQVEsRUFBRSxRQUFrQjtZQUM1QixTQUFTLEVBQUUsU0FBbUI7WUFDOUIsT0FBTyxFQUFFLHlCQUFXLENBQUMsZUFBZSxDQUFDLFFBQVE7WUFDN0MsY0FBYyxFQUFFLENBQUMsY0FBYyxDQUFDO1lBQ2hDLElBQUksRUFBRSx5QkFBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBMEJ2QyxDQUFDO1NBQ0csQ0FBQyxDQUFDO1FBQ0gsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU0sc0JBQXNCLENBQzNCLFFBQWMsRUFDZCxTQUEwQixFQUMxQixPQUFnRDtRQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFO1lBQ3ZDLFVBQVUsRUFBRSxJQUFJLENBQUMsZUFBZTtZQUNoQyxHQUFHLE9BQU87U0FDWCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0scUJBQXFCLENBQzFCLFFBQWMsRUFDZCxTQUEwQixFQUMxQixPQUEyQjtRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDNUQsR0FBRyxPQUFPO1lBQ1YsV0FBVyxFQUFFO2dCQUNYLEdBQUcsT0FBTyxFQUFFLFdBQVcsSUFBSSxFQUFFO2dCQUM3QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBcUIsQ0FBQyxLQUFLLENBQUMsU0FBUzthQUN4RDtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxhQUFhLENBQ2xCLFFBQWMsRUFDZCxTQUEwQixFQUMxQixVQUFzQyxFQUFFLE9BQTJCO1FBQ25FLE1BQU0sV0FBVyxHQUFHLEdBQUcsUUFBa0IsSUFBSSxTQUFtQixFQUFFLENBQUM7UUFDbkUsTUFBTSxXQUFXLEdBQUcsUUFBUSxRQUFrQixVQUFVLFNBQW1CLFdBQVcsQ0FBQztRQUV2RixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBa0IsQ0FBQyxDQUFDO1FBRTNELE1BQU0sV0FBVyxHQUFHLG9CQUFvQixDQUFDO1FBQ3pDLE1BQU0sU0FBUyxHQUF1QixFQUFFLENBQUM7UUFFekMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsSUFBSSxPQUFPLENBQUMsaUJBQWlCLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3BGLFNBQVMsQ0FBQyxJQUFJLENBQUM7Z0JBQ2IsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsU0FBUyxFQUFFLENBQUM7Z0JBQ1osU0FBUyxFQUFFLEdBQUcsV0FBVyxJQUFJLFdBQVcsS0FBSztnQkFDN0MsVUFBVSxFQUFFLGFBQWEsV0FBVyxFQUFFO2FBQ3ZDLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRSxJQUFJO2dCQUNKLEtBQUs7Z0JBQ0wsU0FBUyxFQUFFLE9BQU8sQ0FBQyxpQkFBa0IsQ0FBQyxNQUFNO2dCQUM1QyxTQUFTLEVBQUUsR0FBRyxXQUFXLElBQUksV0FBVyxJQUFJLElBQUksS0FBSztnQkFDckQsVUFBVSxFQUFFLGFBQWEsV0FBVyxHQUFHLElBQUksRUFBRTthQUM5QyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUUxQixLQUFLLE1BQU0sRUFBRSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBRSxFQUFFLFFBQWtCLEVBQUUsU0FBbUIsQ0FBQyxDQUFDO1lBQ3pFLENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLHlCQUFXLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFO2dCQUN2RSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7Z0JBQ2IsSUFBSSxFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDcEMsV0FBVztnQkFDWCxVQUFVO2dCQUNWLElBQUksRUFBRSx5QkFBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO29CQUNwQyxhQUFhLEVBQUUsMkJBQWEsQ0FBQyxNQUFNO29CQUNuQyxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFO3dCQUNSLEtBQUssRUFBRSx5QkFBVyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSwyQ0FBMkM7d0JBQ3JGLFVBQVUsRUFBRSw0QkFBYyxDQUFDLFdBQVc7d0JBQ3RDLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVTt3QkFDekIsS0FBSyxFQUFFOzRCQUNMLFNBQVMsQ0FBQyxTQUFTO2dDQUNqQixNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7Z0NBQ2pDLElBQUksQ0FDRixVQUFVLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFDdkM7b0NBQ0UsVUFBVSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJO29DQUNwQyxtSkFBbUosU0FBUyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUU7aUNBQy9LLEVBQ0Q7b0NBQ0UsR0FBRyxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFO29DQUN2QixLQUFLLEVBQUU7d0NBQ0wsUUFBUSxFQUFFLGVBQWU7d0NBQ3pCLE9BQU8sQ0FBQyxNQUFNLEVBQUUsNEJBQTRCO3dDQUM1QyxTQUFTLEVBQUUsaUJBQWlCO3FDQUM3QjtvQ0FDRCx3QkFBd0IsRUFBRSxVQUFVLEtBQUssT0FBTztpQ0FDakQsQ0FBQyxDQUFDO2dDQUVMLE9BQU8sSUFBSSxDQUFDOzRCQUNkLENBQUM7eUJBQ0Y7cUJBQ2lCO2lCQUNyQixDQUFDO2dCQUNGLE9BQU8sRUFBRSx5QkFBVyxDQUFDLGVBQWUsQ0FBQyxRQUFRO2FBQzlDLENBQUMsQ0FBQztZQUNILGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVELElBQUkseUJBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLFdBQVcsV0FBVyxFQUFFLEVBQUU7WUFDeEQsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsUUFBUSxFQUFFLFFBQWtCO1lBQzVCLFNBQVMsRUFBRSxTQUFtQjtZQUM5QixPQUFPLEVBQUUseUJBQVcsQ0FBQyxlQUFlLENBQUMsUUFBUTtZQUM3QyxjQUFjO1lBQ2QsSUFBSSxFQUFFLHlCQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQzs7OztFQUl0QyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Ozs7Ozs7O0dBUTFHLENBQUM7U0FDQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sY0FBYyxDQUNuQixRQUFjLEVBQ2QsU0FBMEIsRUFDMUIsT0FBMkI7UUFDM0IsTUFBTSxXQUFXLEdBQUcsR0FBRyxRQUFrQixJQUFJLFNBQW1CLEVBQUUsQ0FBQztRQUVuRSxNQUFNLGNBQWMsR0FBRyxhQUFhLFdBQVcsVUFBVSxDQUFDO1FBQzFELElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDbkMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNoRCxFQUFFLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7UUFDRCxNQUFNLGNBQWMsR0FBRyxhQUFhLFdBQVcsVUFBVSxDQUFDO1FBQzFELElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDbkMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNoRCxFQUFFLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSwyQkFBMkIsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZGLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBa0IsQ0FBQyxDQUFDO1FBRTNELElBQUkseUJBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLFdBQVcsV0FBVyxFQUFFLEVBQUU7WUFDeEQsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsUUFBUSxFQUFFLFFBQWtCO1lBQzVCLFNBQVMsRUFBRSxTQUFtQjtZQUM5QixVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7WUFDOUIsc0JBQXNCLEVBQUUseUJBQVcsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3pKLHVCQUF1QixFQUFFLHlCQUFXLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUMzSixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNLLG1CQUFtQixDQUFDLFFBQWdCO1FBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUN4RCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUVuRSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSx5QkFBVyxDQUFDLElBQUksRUFBRSxHQUFHLFFBQVEsV0FBVyxFQUFFO2dCQUMxRSxXQUFXLEVBQUUsb0JBQW9CLFFBQVEsWUFBWTthQUN0RCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTyxjQUFjLENBQUMsSUFBWSxFQUFFLE9BQW1DLEVBQUU7UUFDeEUsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBQ2YsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN4QixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDckQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6QixHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzlELENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU8sZUFBZSxDQUFDLFNBQWlCLEVBQUUsUUFBZ0IsRUFBRSxTQUFpQjtRQUM1RSxNQUFNLE9BQU8sR0FBRyxHQUFHLFFBQVEsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUM5RCxFQUFFLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRTtXQUNyQixRQUFRLEtBQUssT0FBTyxpQ0FBaUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFOztrREFFOUMsT0FBTyxLQUFLLFFBQVEsS0FBSyxTQUFTOzs7SUFHaEYsRUFBRTtZQUNBLFFBQVEsRUFBRSxPQUFPO1NBQ2xCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxFQUFvQixFQUFFLFFBQWdCLEVBQUUsU0FBaUI7UUFDcEYsTUFBTSxPQUFPLEdBQUcsR0FBRyxRQUFRLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFDOUQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBRTVGLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRTtXQUN4QixRQUFRLEtBQUssT0FBTyxpQ0FBaUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFOzs7aUJBRy9FLFFBQVEsSUFBSSxTQUFTLFdBQVcsRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUzs7dUNBRWpELE9BQU87Ozs7OztrQkFNNUIsUUFBUSxJQUFJLFNBQVMsV0FBVyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTOzt3Q0FFakQsT0FBTyxPQUFPLFVBQVU7OztFQUc5RCxFQUFFO1lBQ0UsUUFBUSxFQUFFLE9BQU87U0FDbEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUVGO0FBempCRCxnQ0F5akJDO0FBRUQsU0FBUyxjQUFjLENBQUMsS0FBYTtJQUNuQyxPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsSUFBSSxDQUFDLEdBQVcsRUFBRSxJQUFjLEVBQUUsT0FBMEI7SUFDbkUsTUFBTSxJQUFJLEdBQUcsSUFBQSx5QkFBUyxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFM0MsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxJQUFJLENBQUMsTUFBTSxhQUFhLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLGlCQUFpQixJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0SSxDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsdUJBQXVCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3pJLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5pbXBvcnQgeyBTcGF3blN5bmNPcHRpb25zLCBzcGF3blN5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBBc3NldEhhc2hUeXBlLCBCdW5kbGluZ09wdGlvbnMsIEJ1bmRsaW5nT3V0cHV0LCBDZm5PdXRwdXQsIERvY2tlckltYWdlLCBOZXN0ZWRTdGFjaywgVGFncywgYXdzX2FwcHN5bmMsIGF3c19jZXJ0aWZpY2F0ZW1hbmFnZXIsIGF3c19pYW0sIGF3c19sb2dzLCBhd3Nfcm91dGU1MyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQ29nbml0b0F1dGhlbnRpY2F0aW9uIH0gZnJvbSAnLi9hdXRoZW50aWNhdGlvbic7XG5pbXBvcnQgeyBCYXNlQXBpLCBCYXNlQXBpUHJvcHMgfSBmcm9tICcuL2Jhc2UtYXBpJztcbmltcG9ydCB7IExhbWJkYUZ1bmN0aW9uIH0gZnJvbSAnLi9mdW5jJztcbmltcG9ydCB7IENGTl9PVVRQVVRfU1VGRklYX0dSQVBIUUxfRE9NQUlOTkFNRSB9IGZyb20gJy4uL3NoYXJlZC9vdXRwdXRzJztcblxuZXhwb3J0IGludGVyZmFjZSBHcmFwaFFsQXBpUHJvcHMgZXh0ZW5kcyBCYXNlQXBpUHJvcHMge1xuICBkZWZpbml0aW9uRmlsZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogSWYgdHJ1ZSwgcmVzb2x2ZXJzIGFuZCBMYW1iZGEgZnVuY3Rpb25zIHdpbGwgYmUgY3JlYXRlZCBpbiBuZXN0ZWQgc3RhY2tzXG4gICAqIGdyb3VwZWQgYnkgdHlwZSAoUXVlcnksIE11dGF0aW9uLCBTdWJzY3JpcHRpb24sIEZpZWxkKS5cbiAgICpcbiAgICogV0FSTklORzogT25seSBlbmFibGUgdGhpcyBpZiB5b3UgYXJlIGFwcHJvYWNoaW5nIG9yIGhpdHRpbmcgQ2xvdWRGb3JtYXRpb24nc1xuICAgKiA1MDAgcmVzb3VyY2UgbGltaXQuIE5lc3RlZCBzdGFja3MgaGF2ZSBzaWduaWZpY2FudCBkb3duc2lkZXM6XG4gICAqIC0gU2xvd2VyIGRlcGxveW1lbnRzIGR1ZSB0byBhZGRpdGlvbmFsIHN0YWNrIG9wZXJhdGlvbnNcbiAgICogLSBNb3JlIGNvbXBsZXggZGVidWdnaW5nIGFuZCBlcnJvciB0cmFjaW5nXG4gICAqIC0gSGFyZGVyIHRvIG5hdmlnYXRlIGluIHRoZSBDbG91ZEZvcm1hdGlvbiBjb25zb2xlXG4gICAqIC0gQ3Jvc3Mtc3RhY2sgcmVmZXJlbmNlcyBhZGQgY29tcGxleGl0eVxuICAgKlxuICAgKiBXQVJOSU5HOiBDaGFuZ2luZyB0aGlzIHNldHRpbmcgb24gYW4gZXhpc3Rpbmcgc3RhY2sgcmVxdWlyZXMgbWFudWFsIGludGVydmVudGlvbi5cbiAgICogQ2xvdWRGb3JtYXRpb24gY2Fubm90IGF1dG9tYXRpY2FsbHkgbW92ZSByZXNvdXJjZXMgYmV0d2VlbiBzdGFja3MuIFlvdSBtYXkgbmVlZFxuICAgKiB0byBkZWxldGUgYW5kIHJlY3JlYXRlIHJlc29sdmVycywgb3IgcGVyZm9ybSBhIHR3by1zdGVwIGRlcGxveW1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB1c2VOZXN0ZWRTdGFja3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBhZGRMYW1iZGFSZXNvbHZlciBzeW50aGVzaXplcyBhbiBBUFBTWU5DX0pTIHBpcGVsaW5lIHJlc29sdmVyIHdob3NlXG4gICAqIHJlc3BvbnNlIGhhbmRsZXIgY29udmVydHMgdGhlIGVycm9ycy5hcHBzeW5jLiogZW52ZWxvcGUgcmV0dXJuZWQgYnlcbiAgICogY3JlYXRlQXBwU3luY0hhbmRsZXIgaW50byBhIHR5cGVkIEdyYXBoUUwgZXJyb3IuXG4gICAqXG4gICAqIFdoZW4gZmFsc2UgKHRoZSBkZWZhdWx0KSwgYWRkTGFtYmRhUmVzb2x2ZXIgc3ludGhlc2l6ZXMgYSBwbGFpbiBVTklUXG4gICAqIGRpcmVjdC1MYW1iZGEgcmVzb2x2ZXIgKHRoZSBwcmUtIzM4NSBiZWhhdmlvcikgd2l0aCBubyByZXNwb25zZSBoYW5kbGVyLiBPblxuICAgKiB0aGF0IHBhdGgsIGlmIGEgaGFuZGxlciB0aHJvd3MgYW4gQXBwU3luY0Vycm9yIHRoZSBzZW50aW5lbCBlbnZlbG9wZSBpc1xuICAgKiByZXR1cm5lZCBhcyBmaWVsZCBkYXRhIGluc3RlYWQgb2YgYmVjb21pbmcgYSBHcmFwaFFMIGVycm9yLlxuICAgKlxuICAgKiBUaGlzIGZsYWcgYXBwbGllcyB0byBBTEwgTGFtYmRhIHJlc29sdmVycyBvbiB0aGUgQVBJLiBFbmFibGluZyBpdCBjaGFuZ2VzXG4gICAqIHRoZSByZXNvbHZlciB0b3BvbG9neSBmcm9tIFVOSVQgdG8gUElQRUxJTkUsIHdoaWNoIHByb2R1Y2VzIGEgY2RrIGRpZmYgZm9yXG4gICAqIGV2ZXJ5IExhbWJkYSByZXNvbHZlciwgc28gb3B0IGluIGRlbGliZXJhdGVseS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHR5cGVkRXJyb3JzPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWdGxSZXNvbHZlck9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGRhdGFzb3VyY2UgdGhlIFZUTCByZXNvbHZlciB0YXJnZXRzXG4gICAqL1xuICBkYXRhU291cmNlOiBhd3NfYXBwc3luYy5CYXNlRGF0YVNvdXJjZTtcblxuICAvKipcbiAgICogc3RyaW5nIHJlcGxhY2VtZW50cyB0byBwcm9jZXNzIG9uIHRoZSBWVExcbiAgICpcbiAgICogQGRlZmF1bHQgbm8gdmFyaWFibGUgZXhwYW5zaW9uc1xuICAgKi9cbiAgdmFyaWFibGVzPzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSnNSZXNvbHZlck9wdGlvbnMge1xuICAvKipcbiAgICogVmFyaWFibGVzIHRoYXQgd2lsbCBiZSBwdXQgaW50byB0aGUgXCJzdGFzaFwiIG9mIHRoZSByZXNvbHZlciBwaXBlbGluZVxuICAgKlxuICAgKiBAZGVmYXVsdCBub25lXG4gICAqL1xuICByZWFkb25seSBzdGFzaFZhbHVlcz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIG5hbWUgb2YgdGhlIHBpcGVsaW5lIHN0ZXBzIHRvIGNyZWF0ZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG9ubHkgYSBkZWZhdWx0IHN0ZXAgd2lsbCBiZSBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSBwaXBlbGluZVN0ZXBOYW1lcz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgSnNSZXNvbHZlckNvbmZpZyB7XG4gIG5hbWU6IHN0cmluZztcbiAgaW5kZXg6IG51bWJlcjtcbiAgc3RlcENvdW50OiBudW1iZXI7XG4gIGVudHJ5RmlsZTogc3RyaW5nO1xuICBmdW5jdGlvbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIEdyYXBoUWxBcGkgY29uc3RydWN0IHNldHMgdXAgYW4gQVdTIEFwcFN5bmMgR3JhcGhRTCBBUEkgaW50ZWdyYXRlZCB3aXRoIENvZ25pdG8gZm9yIGF1dGhlbnRpY2F0aW9uIGFuZCBEeW5hbW9EQiBmb3IgZGF0YSBzdG9yYWdlLlxuICogVGhpcyBjb25zdHJ1Y3QgZmFjaWxpdGF0ZXMgdGhlIGNyZWF0aW9uIG9mIGEgR3JhcGhRTCBBUEkgd2l0aCB2YXJpb3VzIGNvbmZpZ3VyYXRpb25zLCBpbmNsdWRpbmcgY3VzdG9tIGRvbWFpbiwgbG9nZ2luZywgc2NoZW1hIGRlZmluaXRpb24sXG4gKiBhbmQgYXV0aG9yaXphdGlvbiB1c2luZyBDb2duaXRvIFVzZXIgUG9vbCBhbmQgSWRlbnRpdHkgUG9vbC4gSXQgYWxzbyBwcm92aWRlcyBtZXRob2RzIHRvIGR5bmFtaWNhbGx5IGFkZCByZXNvbHZlcnMgYW5kIGdyYW50IGFjY2VzcyB0byBzcGVjaWZpYyBmaWVsZHMuXG4gKlxuICogQHRlbXBsYXRlIFJFU09MVkVSUyAtIFRoZSB0eXBlIGRlZmluaXRpb24gZm9yIHRoZSBHcmFwaFFMIHJlc29sdmVycy5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgYXBpID0gbmV3IEdyYXBoUWxBcGkodGhpcywgJ015R3JhcGhRbEFwaScsIHtcbiAqICAgYXBpTmFtZTogJ015QVBJJyxcbiAqICAgc3RhZ2VOYW1lOiAnZGV2JyxcbiAqICAgZGVmaW5pdGlvbkZpbGVOYW1lOiAnc2NoZW1hLmdyYXBocWwnLFxuICogICBhdXRoZW50aWNhdGlvbjogbXlDb2duaXRvQXV0aCxcbiAqICAgc2luZ2xlVGFibGVEYXRhc3RvcmU6IG15RHluYW1vREJUYWJsZSxcbiAqIH0pO1xuICpcbiAqIC8vIEFkZCBhIExhbWJkYSByZXNvbHZlclxuICogYXBpLmFkZExhbWJkYVJlc29sdmVyKCdRdWVyeScsICdnZXRJdGVtJyk7XG4gKlxuICogLy8gR3JhbnQgYWNjZXNzIHRvIHVuYXV0aGVudGljYXRlZCB1c2VycyBmb3IgYSBzcGVjaWZpYyBxdWVyeVxuICogYXBpLmdyYW50QWNjZXNzVW5BdXRoKCdRdWVyeScsICdnZXRJdGVtJyk7XG4gKi9cbmV4cG9ydCBjbGFzcyBHcmFwaFFsQXBpPFJFU09MVkVSUz4gZXh0ZW5kcyBCYXNlQXBpIHtcblxuICAvKipcbiAgICogVGhlIEFXUyBBcHBTeW5jIEdyYXBoUUwgQVBJIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFwaTogYXdzX2FwcHN5bmMuR3JhcGhxbEFwaTtcblxuICAvKipcbiAgICogVGhlIG9wdGlvbmFsIER5bmFtb0RCIGRhdGEgc291cmNlIGZvciB0aGUgR3JhcGhRTCBBUEkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGFibGVEYXRhU291cmNlPzogYXdzX2FwcHN5bmMuRHluYW1vRGJEYXRhU291cmNlO1xuXG4gIC8qKlxuICAgKiBBIGNvbGxlY3Rpb24gb2YgTGFtYmRhIGZ1bmN0aW9ucyB1c2VkIGFzIHJlc29sdmVycyBmb3IgdGhlIEdyYXBoUUwgQVBJLlxuICAgKi9cbiAgcHJpdmF0ZSBfZnVuY3Rpb25zOiB7IFtvcGVyYXRpb25JZDogc3RyaW5nXTogTGFtYmRhRnVuY3Rpb24gfSA9IHt9O1xuXG4gIC8qKlxuICAgKiBOZXN0ZWQgc3RhY2tzIGZvciByZXNvbHZlcnMsIGdyb3VwZWQgYnkgdHlwZSBuYW1lLlxuICAgKiBPbmx5IHVzZWQgd2hlbiB1c2VOZXN0ZWRTdGFja3MgaXMgdHJ1ZS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbmVzdGVkU3RhY2tzOiB7IFt0eXBlTmFtZTogc3RyaW5nXTogTmVzdGVkU3RhY2sgfSA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgQ29nbml0byBhdXRoZW50aWNhdGlvbiBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb2duaXRvQXV0aDogQ29nbml0b0F1dGhlbnRpY2F0aW9uO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEdyYXBoUWxBcGkuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSAtIFRoZSBzY29wZSBpbiB3aGljaCB0aGlzIGNvbnN0cnVjdCBpcyBkZWZpbmVkLlxuICAgKiBAcGFyYW0gaWQgLSBUaGUgc2NvcGVkIGNvbnN0cnVjdCBJRC5cbiAgICogQHBhcmFtIHByb3BzIC0gVGhlIHByb3BlcnRpZXMgb2YgdGhlIEdyYXBoUWxBcGkgY29uc3RydWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJpdmF0ZSByZWFkb25seSBwcm9wczogR3JhcGhRbEFwaVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICB0aGlzLmNvZ25pdG9BdXRoID0gcHJvcHMuYXV0aGVudGljYXRpb24gYXMgQ29nbml0b0F1dGhlbnRpY2F0aW9uO1xuXG4gICAgbGV0IGN1c3RvbURvbWFpbk5hbWU6IGF3c19hcHBzeW5jLkRvbWFpbk9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuYXBpRlFETikge1xuICAgICAgY3VzdG9tRG9tYWluTmFtZSA9IHtcbiAgICAgICAgZG9tYWluTmFtZTogdGhpcy5hcGlGUUROLFxuICAgICAgICBjZXJ0aWZpY2F0ZTogbmV3IGF3c19jZXJ0aWZpY2F0ZW1hbmFnZXIuRG5zVmFsaWRhdGVkQ2VydGlmaWNhdGUodGhpcywgJ0NlcnQnLCB7XG4gICAgICAgICAgaG9zdGVkWm9uZTogdGhpcy5ob3N0ZWRab25lISxcbiAgICAgICAgICByZWdpb246ICd1cy1lYXN0LTEnLFxuICAgICAgICAgIGRvbWFpbk5hbWU6IHRoaXMuYXBpRlFETixcbiAgICAgICAgICB2YWxpZGF0aW9uOiBhd3NfY2VydGlmaWNhdGVtYW5hZ2VyLkNlcnRpZmljYXRlVmFsaWRhdGlvbi5mcm9tRG5zKHRoaXMuaG9zdGVkWm9uZSksXG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICAgIG5ldyBDZm5PdXRwdXQodGhpcywgJ0dyYXBoUWxBcGlEb21haW5OYW1lJywge1xuICAgICAgICBrZXk6IGAke3RoaXMucHJvcHMuYXBpTmFtZX0ke0NGTl9PVVRQVVRfU1VGRklYX0dSQVBIUUxfRE9NQUlOTkFNRX1gLFxuICAgICAgICB2YWx1ZTogdGhpcy5hcGlGUUROLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5hcGkgPSBuZXcgYXdzX2FwcHN5bmMuR3JhcGhxbEFwaSh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBuYW1lOiBgJHtwcm9wcy5hcGlOYW1lfSBbJHtwcm9wcy5zdGFnZU5hbWV9XWAsXG4gICAgICBsb2dDb25maWc6IHtcbiAgICAgICAgZmllbGRMb2dMZXZlbDogYXdzX2FwcHN5bmMuRmllbGRMb2dMZXZlbC5BTEwsXG4gICAgICAgIHJldGVudGlvbjogYXdzX2xvZ3MuUmV0ZW50aW9uRGF5cy5UV09fTU9OVEhTLFxuICAgICAgfSxcbiAgICAgIHNjaGVtYTogYXdzX2FwcHN5bmMuU2NoZW1hRmlsZS5mcm9tQXNzZXQocHJvcHMuZGVmaW5pdGlvbkZpbGVOYW1lKSxcbiAgICAgIGRvbWFpbk5hbWU6IGN1c3RvbURvbWFpbk5hbWUsXG4gICAgICAuLi50aGlzLmNvZ25pdG9BdXRoICYmIHtcbiAgICAgICAgYXV0aG9yaXphdGlvbkNvbmZpZzoge1xuICAgICAgICAgIGFkZGl0aW9uYWxBdXRob3JpemF0aW9uTW9kZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYXV0aG9yaXphdGlvblR5cGU6IGF3c19hcHBzeW5jLkF1dGhvcml6YXRpb25UeXBlLlVTRVJfUE9PTCxcbiAgICAgICAgICAgICAgdXNlclBvb2xDb25maWc6IHtcbiAgICAgICAgICAgICAgICB1c2VyUG9vbDogdGhpcy5jb2duaXRvQXV0aC51c2VycG9vbCxcbiAgICAgICAgICAgICAgICBkZWZhdWx0QWN0aW9uOiBhd3NfYXBwc3luYy5Vc2VyUG9vbERlZmF1bHRBY3Rpb24uREVOWSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi50aGlzLmNvZ25pdG9BdXRoLmlkZW50aXR5UG9vbCA/IFt7IGF1dGhvcml6YXRpb25UeXBlOiBhd3NfYXBwc3luYy5BdXRob3JpemF0aW9uVHlwZS5JQU0gfV0gOiBbXSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBpZiAoY3VzdG9tRG9tYWluTmFtZSAmJiB0aGlzLmFwaS5hcHBTeW5jRG9tYWluTmFtZSkge1xuICAgICAgbmV3IGF3c19yb3V0ZTUzLkNuYW1lUmVjb3JkKHRoaXMsICdEbnNSZWNvcmQnLCB7XG4gICAgICAgIHpvbmU6IHRoaXMuaG9zdGVkWm9uZSEsXG4gICAgICAgIHJlY29yZE5hbWU6IGN1c3RvbURvbWFpbk5hbWUuZG9tYWluTmFtZSxcbiAgICAgICAgZG9tYWluTmFtZTogdGhpcy5hcGkuYXBwU3luY0RvbWFpbk5hbWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBpZiAoKHByb3BzLm1vbml0b3JpbmcgPz8gdHJ1ZSkgJiYgdGhpcy5tb25pdG9yaW5nKSB7XG4gICAgLy8gICB0aGlzLm1vbml0b3JpbmcuYXBpRXJyb3JzV2lkZ2V0LmFkZExlZnRNZXRyaWMobmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAvLyAgICAgbmFtZXNwYWNlOiAnQVdTL0FwcFN5bmMnLFxuICAgIC8vICAgICBtZXRyaWNOYW1lOiAnNVhYRXJyb3InLFxuICAgIC8vICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgLy8gICAgICAgR3JhcGhRTEFQSUlkOiB0aGlzLmFwaS5hcGlJZCxcbiAgICAvLyAgICAgfSxcbiAgICAvLyAgICAgc3RhdGlzdGljOiAnc3VtJyxcbiAgICAvLyAgIH0pKTtcbiAgICAvLyAgIHRoaXMubW9uaXRvcmluZy5hcGlFcnJvcnNXaWRnZXQuYWRkTGVmdE1ldHJpYyhuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgIC8vICAgICBuYW1lc3BhY2U6ICdBV1MvQXBwU3luYycsXG4gICAgLy8gICAgIG1ldHJpY05hbWU6ICc0WFhFcnJvcicsXG4gICAgLy8gICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAvLyAgICAgICBHcmFwaFFMQVBJSWQ6IHRoaXMuYXBpLmFwaUlkLFxuICAgIC8vICAgICB9LFxuICAgIC8vICAgICBzdGF0aXN0aWM6ICdzdW0nLFxuICAgIC8vICAgfSkpO1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmFwaUxhdGVuY3lXaWRnZXQuYWRkTGVmdE1ldHJpYyhuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgIC8vICAgICBuYW1lc3BhY2U6ICdBV1MvQXBwU3luYycsXG4gICAgLy8gICAgIG1ldHJpY05hbWU6ICdMYXRlbmN5JyxcbiAgICAvLyAgICAgZGltZW5zaW9uc01hcDoge1xuICAgIC8vICAgICAgIEdyYXBoUUxBUElJZDogdGhpcy5hcGkuYXBpSWQsXG4gICAgLy8gICAgIH0sXG4gICAgLy8gICAgIHN0YXRpc3RpYzogJ0F2ZXJhZ2UnLFxuICAgIC8vICAgfSkpO1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmFwaUxhdGVuY3lXaWRnZXQuYWRkTGVmdE1ldHJpYyhuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgIC8vICAgICBuYW1lc3BhY2U6ICdBV1MvQXBwU3luYycsXG4gICAgLy8gICAgIG1ldHJpY05hbWU6ICdMYXRlbmN5JyxcbiAgICAvLyAgICAgZGltZW5zaW9uc01hcDoge1xuICAgIC8vICAgICAgIEdyYXBoUUxBUElJZDogdGhpcy5hcGkuYXBpSWQsXG4gICAgLy8gICAgIH0sXG4gICAgLy8gICAgIHN0YXRpc3RpYzogJ3A5MCcsXG4gICAgLy8gICB9KSk7XG4gICAgLy8gICB0aGlzLm1vbml0b3JpbmcuYXBpTGF0ZW5jeVRhaWxXaWRnZXQuYWRkTGVmdE1ldHJpYyhuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgIC8vICAgICBuYW1lc3BhY2U6ICdBV1MvQXBwU3luYycsXG4gICAgLy8gICAgIG1ldHJpY05hbWU6ICdMYXRlbmN5JyxcbiAgICAvLyAgICAgZGltZW5zaW9uc01hcDoge1xuICAgIC8vICAgICAgIEdyYXBoUUxBUElJZDogdGhpcy5hcGkuYXBpSWQsXG4gICAgLy8gICAgIH0sXG4gICAgLy8gICAgIHN0YXRpc3RpYzogJ3A5NScsXG4gICAgLy8gICB9KSk7XG4gICAgLy8gICB0aGlzLm1vbml0b3JpbmcuYXBpTGF0ZW5jeVRhaWxXaWRnZXQuYWRkTGVmdE1ldHJpYyhuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgIC8vICAgICBuYW1lc3BhY2U6ICdBV1MvQXBwU3luYycsXG4gICAgLy8gICAgIG1ldHJpY05hbWU6ICdMYXRlbmN5JyxcbiAgICAvLyAgICAgZGltZW5zaW9uc01hcDoge1xuICAgIC8vICAgICAgIEdyYXBoUUxBUElJZDogdGhpcy5hcGkuYXBpSWQsXG4gICAgLy8gICAgIH0sXG4gICAgLy8gICAgIHN0YXRpc3RpYzogJ3A5OScsXG4gICAgLy8gICB9KSk7XG4gICAgLy8gfVxuXG4gICAgaWYgKHByb3BzLnNpbmdsZVRhYmxlRGF0YXN0b3JlKSB7XG4gICAgICB0aGlzLnRhYmxlRGF0YVNvdXJjZSA9IG5ldyBhd3NfYXBwc3luYy5EeW5hbW9EYkRhdGFTb3VyY2UodGhpcywgJ1NpbmdsZVRhYmxlU291cmNlJywge1xuICAgICAgICBhcGk6IHRoaXMuYXBpLFxuICAgICAgICB0YWJsZTogcHJvcHMuc2luZ2xlVGFibGVEYXRhc3RvcmU/LnRhYmxlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRBY2Nlc3M8VFlQRSBleHRlbmRzIGtleW9mIFJFU09MVkVSUywgRklFTERUWVBFIGV4dGVuZHMgTm9uTnVsbGFibGU8UkVTT0xWRVJTW1RZUEVdPj4oXG4gICAgZ3JhbnRlZTogYXdzX2lhbS5JR3JhbnRhYmxlLFxuICAgIHR5cGVOYW1lOiBUWVBFLFxuICAgIC4uLmZpZWxkTmFtZXM6IChrZXlvZiBGSUVMRFRZUEUpW10pOiB2b2lkIHtcbiAgICB0aGlzLmFwaS5ncmFudChncmFudGVlLCBhd3NfYXBwc3luYy5JYW1SZXNvdXJjZS5vZlR5cGUodHlwZU5hbWUgYXMgc3RyaW5nLCAuLi5maWVsZE5hbWVzIGFzIHN0cmluZ1tdKSwgJ2FwcHN5bmM6R3JhcGhRTCcpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRBY2Nlc3NVbkF1dGg8VFlQRSBleHRlbmRzIGtleW9mIFJFU09MVkVSUywgRklFTERUWVBFIGV4dGVuZHMgTm9uTnVsbGFibGU8UkVTT0xWRVJTW1RZUEVdPj4oXG4gICAgdHlwZU5hbWU6IFRZUEUsXG4gICAgLi4uZmllbGROYW1lczogKGtleW9mIEZJRUxEVFlQRSlbXVxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29nbml0b0F1dGguaWRlbnRpdHlQb29sKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBncmFudCB0byBDb2duaXRvIGlkZW50aXR5IHBvb2wgYXMgbm9uZSBpcyBwcm92aWRlZCcpO1xuICAgIH1cbiAgICB0aGlzLmdyYW50QWNjZXNzKHRoaXMuY29nbml0b0F1dGguaWRlbnRpdHlQb29sLnVuYXV0aGVudGljYXRlZFJvbGUsIHR5cGVOYW1lLCAuLi5maWVsZE5hbWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgcHVibGljIGdyYW50QWNjZXNzQXV0aDxUWVBFIGV4dGVuZHMga2V5b2YgUkVTT0xWRVJTLCBGSUVMRFRZUEUgZXh0ZW5kcyBOb25OdWxsYWJsZTxSRVNPTFZFUlNbVFlQRV0+PihcbiAgICB0eXBlTmFtZTogVFlQRSxcbiAgICAuLi5maWVsZE5hbWVzOiAoa2V5b2YgRklFTERUWVBFKVtdXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb2duaXRvQXV0aC5pZGVudGl0eVBvb2wpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdyYW50IHRvIENvZ25pdG8gaWRlbnRpdHkgcG9vbCBhcyBub25lIGlzIHByb3ZpZGVkJyk7XG4gICAgfVxuICAgIHRoaXMuZ3JhbnRBY2Nlc3ModGhpcy5jb2duaXRvQXV0aC5pZGVudGl0eVBvb2wuYXV0aGVudGljYXRlZFJvbGUsIHR5cGVOYW1lLCAuLi5maWVsZE5hbWVzKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIGdldEZ1bmN0aW9uRm9yT3BlcmF0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0RnVuY3Rpb25Gb3JPcGVyYXRpb248VFlQRSBleHRlbmRzIGtleW9mIFJFU09MVkVSUywgRklFTERUWVBFIGV4dGVuZHMgTm9uTnVsbGFibGU8UkVTT0xWRVJTW1RZUEVdPj4oXG4gICAgdHlwZU5hbWU6IFRZUEUsXG4gICAgZmllbGROYW1lOiBrZXlvZiBGSUVMRFRZUEUsXG4gICk6IExhbWJkYUZ1bmN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fZnVuY3Rpb25zW2Ake3R5cGVOYW1lIGFzIHN0cmluZ30uJHtmaWVsZE5hbWUgYXMgU3RyaW5nfWBdO1xuICB9XG5cbiAgcHVibGljIGFkZExhbWJkYVJlc29sdmVyPFRZUEUgZXh0ZW5kcyBrZXlvZiBSRVNPTFZFUlMsIEZJRUxEVFlQRSBleHRlbmRzIE5vbk51bGxhYmxlPFJFU09MVkVSU1tUWVBFXT4+KFxuICAgIHR5cGVOYW1lOiBUWVBFLFxuICAgIGZpZWxkTmFtZToga2V5b2YgRklFTERUWVBFLFxuICApOiBMYW1iZGFGdW5jdGlvbiB7XG4gICAgY29uc3Qgb3BlcmF0aW9uSWQgPSBgJHt0eXBlTmFtZSBhcyBzdHJpbmd9LiR7ZmllbGROYW1lIGFzIFN0cmluZ31gO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gYFR5cGUgJHt0eXBlTmFtZSBhcyBzdHJpbmd9IEZpZWxkICR7ZmllbGROYW1lIGFzIFN0cmluZ30gUmVzb2x2ZXJgO1xuXG4gICAgY29uc3QgZW50cnlGaWxlID0gYC4vc3JjL2xhbWJkYS8ke29wZXJhdGlvbklkfS50c2A7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGVudHJ5RmlsZSkpIHtcbiAgICAgIGZzLm1rZGlyU3luYygnLi9zcmMvbGFtYmRhLycsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgdGhpcy5jcmVhdGVFbnRyeUZpbGUoZW50cnlGaWxlLCB0eXBlTmFtZSBhcyBzdHJpbmcsIGZpZWxkTmFtZSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5nZXRTY29wZUZvclR5cGVOYW1lKHR5cGVOYW1lIGFzIHN0cmluZyk7XG5cbiAgICBjb25zdCBmbiA9IG5ldyBMYW1iZGFGdW5jdGlvbihzY29wZSwgYEZuJHtvcGVyYXRpb25JZH1gLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMucHJvcHMuc3RhZ2VOYW1lLFxuICAgICAgYWRkaXRpb25hbEVudjogdGhpcy5wcm9wcy5hZGRpdGlvbmFsRW52LFxuICAgICAgZW50cnk6IGVudHJ5RmlsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgWyR7dGhpcy5wcm9wcy5zdGFnZU5hbWV9XSAke2Rlc2NyaXB0aW9ufWAsXG4gICAgICAuLi50aGlzLnByb3BzLmF1dGhlbnRpY2F0aW9uICYmIHtcbiAgICAgICAgdXNlclBvb2w6ICh0aGlzLnByb3BzLmF1dGhlbnRpY2F0aW9uIGFzIENvZ25pdG9BdXRoZW50aWNhdGlvbikudXNlcnBvb2wsXG4gICAgICB9LFxuICAgICAgLi4udGhpcy5wcm9wcy5zaW5nbGVUYWJsZURhdGFzdG9yZSAmJiB7XG4gICAgICAgIHRhYmxlOiB0aGlzLnByb3BzLnNpbmdsZVRhYmxlRGF0YXN0b3JlLnRhYmxlLFxuICAgICAgICB0YWJsZVdyaXRlczogdHlwZU5hbWUgPT09ICdNdXRhdGlvbicsXG4gICAgICB9LFxuICAgICAgLi4udGhpcy5wcm9wcy5hc3NldENkbiAmJiB7XG4gICAgICAgIGFzc2V0RG9tYWluTmFtZTogdGhpcy5wcm9wcy5hc3NldENkbi5hc3NldERvbWFpbk5hbWUsXG4gICAgICAgIGFzc2V0QnVja2V0OiB0aGlzLnByb3BzLmFzc2V0Q2RuLmFzc2V0QnVja2V0LFxuICAgICAgfSxcbiAgICAgIGxhbWJkYU9wdGlvbnM6IHRoaXMucHJvcHMubGFtYmRhT3B0aW9ucyxcbiAgICAgIGxhbWJkYVRyYWNpbmc6IHRoaXMucHJvcHMubGFtYmRhVHJhY2luZyxcbiAgICB9KTtcbiAgICB0aGlzLl9mdW5jdGlvbnNbb3BlcmF0aW9uSWRdID0gZm47XG4gICAgVGFncy5vZihmbikuYWRkKCdHcmFwaFFMJywgZGVzY3JpcHRpb24pO1xuXG4gICAgLy8gaWYgKHRoaXMubW9uaXRvcmluZykge1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmxhbWJkYUR1cmF0aW9uc1dpZGdldC5hZGRMZWZ0TWV0cmljKGZuLm1ldHJpY0R1cmF0aW9uKCkpO1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmxhbWJkYUludm9rZXNXaWRnZXQuYWRkTGVmdE1ldHJpYyhmbi5tZXRyaWNJbnZvY2F0aW9ucygpKTtcbiAgICAvLyAgIHRoaXMubW9uaXRvcmluZy5sYW1iZGFFcnJvcnNXaWRnZXQuYWRkTGVmdE1ldHJpYyhmbi5tZXRyaWNFcnJvcnMoKSk7XG4gICAgLy8gICB0aGlzLm1vbml0b3JpbmcubGFtYmRhRXJyb3JzV2lkZ2V0LmFkZExlZnRNZXRyaWMoZm4ubWV0cmljVGhyb3R0bGVzKCkpO1xuICAgIC8vIH1cblxuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgYXdzX2FwcHN5bmMuTGFtYmRhRGF0YVNvdXJjZShzY29wZSwgYExhbWJkYURTJHtvcGVyYXRpb25JZH1gLCB7XG4gICAgICBhcGk6IHRoaXMuYXBpLFxuICAgICAgbmFtZTogYExhbWJkYV8ke3R5cGVOYW1lIGFzIHN0cmluZ31fJHtmaWVsZE5hbWUgYXMgU3RyaW5nfWAsXG4gICAgICBsYW1iZGFGdW5jdGlvbjogZm4sXG4gICAgfSk7XG5cbiAgICBpZiAoIXRoaXMucHJvcHMudHlwZWRFcnJvcnMpIHtcbiAgICAgIC8vIERlZmF1bHQgKHByZS0jMzg1KSBzaGFwZTogYSBwbGFpbiBVTklUIHJlc29sdmVyIHdpdGggdGhlIExhbWJkYSBkYXRhXG4gICAgICAvLyBzb3VyY2Ugc2V0IGRpcmVjdGx5LiBObyByZXNwb25zZSBoYW5kbGVyLCBzbyB0aGUgZXJyb3IgZW52ZWxvcGUgZnJvbVxuICAgICAgLy8gY3JlYXRlQXBwU3luY0hhbmRsZXIgd291bGQgYmUgc3VyZmFjZWQgYXMgZmllbGQgZGF0YSByYXRoZXIgdGhhbiBhXG4gICAgICAvLyBHcmFwaFFMIGVycm9yLiBPcHQgaW4gdmlhIGB0eXBlZEVycm9yczogdHJ1ZWAgdG8gZ2V0IHRoZSBwaXBlbGluZSBiZWxvdy5cbiAgICAgIG5ldyBhd3NfYXBwc3luYy5SZXNvbHZlcihzY29wZSwgYFJlc29sdmVyJHtvcGVyYXRpb25JZH1gLCB7XG4gICAgICAgIGFwaTogdGhpcy5hcGksXG4gICAgICAgIHR5cGVOYW1lOiB0eXBlTmFtZSBhcyBzdHJpbmcsXG4gICAgICAgIGZpZWxkTmFtZTogZmllbGROYW1lIGFzIHN0cmluZyxcbiAgICAgICAgZGF0YVNvdXJjZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZuO1xuICAgIH1cblxuICAgIC8vIENvdXBsZSB0aGUgaGFuZGxlciB0byB0aGlzIHBpcGVsaW5lLiBjcmVhdGVBcHBTeW5jSGFuZGxlciByZXR1cm5zIHRoZVxuICAgIC8vIGVycm9yIGVudmVsb3BlIG9ubHkgd2hlbiBBUFBTWU5DX1RZUEVEX0VSUk9SUyA9PT0gJ3RydWUnOyBvdGhlcndpc2UgaXRcbiAgICAvLyByZXRocm93cyB0aGUgdHlwZWQgZXJyb3IuIEluamVjdCB0aGUgZmxhZyBoZXJlIChhbmQgb25seSBoZXJlKSBzbyB0aGVcbiAgICAvLyBlbnZlbG9wZSBiZWhhdmlvciBpcyBhY3RpdmUgZXhhY3RseSBvbiB0aGUgcGF0aCB0aGF0IGhhcyB0aGUgcmVzcG9uc2VcbiAgICAvLyBoYW5kbGVyIHRvIGludGVycHJldCBpdC4gVGhlIGRlZmF1bHQgVU5JVCBwYXRoIGFib3ZlIGxlYXZlcyB0aGUgZW52IHZhclxuICAgIC8vIHVuc2V0LCBzbyBhIGhhbmRsZXIgdGhhdCB0aHJvd3MgYW4gQXBwU3luY0Vycm9yIHRoZXJlIGZhaWxzIGxvdWRseS5cbiAgICBmbi5hZGRFbnZpcm9ubWVudCgnQVBQU1lOQ19UWVBFRF9FUlJPUlMnLCAndHJ1ZScpO1xuXG4gICAgLy8gVGhlIExhbWJkYSBpbnZva2UgcnVucyBhcyBhIHBpcGVsaW5lIGZ1bmN0aW9uIChhIHNpbmdsZSBJbnZva2UgcGFzc3Rocm91Z2gpLFxuICAgIC8vIGFuZCB0aGUgcmVzb2x2ZXIncyByZXNwb25zZSBoYW5kbGVyIGludGVycHJldHMgdGhlIGVycm9yIGVudmVsb3BlIHRoYXRcbiAgICAvLyBjcmVhdGVBcHBTeW5jSGFuZGxlciByZXR1cm5zLiBBIGRpcmVjdC1MYW1iZGEgcmVzb2x2ZXIgd2l0aG91dCBhIHJlc3BvbnNlXG4gICAgLy8gaGFuZGxlciB3b3VsZCBzdXJmYWNlIHRoZSB7IGRhdGEsIGVycm9yVHlwZSwgZXJyb3JNZXNzYWdlLCBlcnJvckluZm8gfVxuICAgIC8vIGVudmVsb3BlIGFzIHBsYWluIGZpZWxkIGRhdGEsIHNvIHRoZSB0eXBlZCBlcnJvcnMuYXBwc3luYy4qIGVycm9ycyBvbmx5XG4gICAgLy8gYmVjb21lIEdyYXBoUUwgZXJyb3JzIGJlY2F1c2Ugb2YgdGhlIHJlc3BvbnNlIGhhbmRsZXIgYXR0YWNoZWQgYmVsb3cuXG4gICAgY29uc3QgaW52b2tlRnVuY3Rpb24gPSBuZXcgYXdzX2FwcHN5bmMuQXBwc3luY0Z1bmN0aW9uKHNjb3BlLCBgTGFtYmRhRm4ke29wZXJhdGlvbklkfWAsIHtcbiAgICAgIGFwaTogdGhpcy5hcGksXG4gICAgICBuYW1lOiBgTGFtYmRhXyR7KHR5cGVOYW1lIGFzIHN0cmluZykucmVwbGFjZSgvW15BLVphLXowLTldL2csICcnKX1fJHsoZmllbGROYW1lIGFzIFN0cmluZykucmVwbGFjZSgvW15BLVphLXowLTldL2csICcnKX1gLFxuICAgICAgZGF0YVNvdXJjZSxcbiAgICAgIHJ1bnRpbWU6IGF3c19hcHBzeW5jLkZ1bmN0aW9uUnVudGltZS5KU18xXzBfMCxcbiAgICAgIGNvZGU6IGF3c19hcHBzeW5jLkNvZGUuZnJvbUlubGluZShgaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscyc7XG5cbi8vIEludm9rZSB0aGUgTGFtYmRhIGRhdGEgc291cmNlIHdpdGggdGhlIGZ1bGwgcmVzb2x2ZXIgY29udGV4dCBhcyB0aGUgcGF5bG9hZC5cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0KGN0eCkge1xuICByZXR1cm4ge1xuICAgIG9wZXJhdGlvbjogJ0ludm9rZScsXG4gICAgcGF5bG9hZDogY3R4LFxuICB9O1xufVxuXG4vLyBQYXNzIHRoZSBMYW1iZGEgcmVzdWx0IHRocm91Z2ggdW5jaGFuZ2VkOyB0aGUgcmVzb2x2ZXIgcmVzcG9uc2UgaGFuZGxlclxuLy8gY29udmVydHMgdGhlIGVycm9yIGVudmVsb3BlIGludG8gYSBHcmFwaFFMIGVycm9yLlxuZXhwb3J0IGZ1bmN0aW9uIHJlc3BvbnNlKGN0eCkge1xuICByZXR1cm4gY3R4LnJlc3VsdDtcbn1cbmApLFxuICAgIH0pO1xuXG4gICAgbmV3IGF3c19hcHBzeW5jLlJlc29sdmVyKHNjb3BlLCBgUmVzb2x2ZXIke29wZXJhdGlvbklkfWAsIHtcbiAgICAgIGFwaTogdGhpcy5hcGksXG4gICAgICB0eXBlTmFtZTogdHlwZU5hbWUgYXMgc3RyaW5nLFxuICAgICAgZmllbGROYW1lOiBmaWVsZE5hbWUgYXMgc3RyaW5nLFxuICAgICAgcnVudGltZTogYXdzX2FwcHN5bmMuRnVuY3Rpb25SdW50aW1lLkpTXzFfMF8wLFxuICAgICAgcGlwZWxpbmVDb25maWc6IFtpbnZva2VGdW5jdGlvbl0sXG4gICAgICBjb2RlOiBhd3NfYXBwc3luYy5Db2RlLmZyb21JbmxpbmUoYGltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXdzLWFwcHN5bmMvdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVxdWVzdChjdHgpIHtcbiAgcmV0dXJuIHt9O1xufVxuXG4vLyBDb252ZXJ0IHRoZSBlcnJvciBlbnZlbG9wZSByZXR1cm5lZCBieSBjcmVhdGVBcHBTeW5jSGFuZGxlciBpbnRvIGEgR3JhcGhRTCBlcnJvci5cbi8vIHV0aWwuZXJyb3IgLyB1dGlsLmFwcGVuZEVycm9yIHRha2UgKG1lc3NhZ2UsIGVycm9yVHlwZSwgZGF0YSwgZXJyb3JJbmZvKSwgc29cbi8vIGVycm9yVHlwZSBhbmQgZXJyb3JJbmZvIHJlYWNoIHRoZSBjbGllbnQuIFdpdGhvdXQgdGhpcywgQXBwU3luYyB3b3VsZCBzdXJmYWNlXG4vLyB0aGUgZW52ZWxvcGUgb2JqZWN0IGFzIHRoZSBmaWVsZCByZXN1bHQgaW5zdGVhZCBvZiBhcyBhIEdyYXBoUUwgZXJyb3IuXG4vL1xuLy8gVGhlIGVudmVsb3BlIGlzIHJlY29nbmlzZWQgYnkgaXRzIHJlc2VydmVkIF9fYXBwU3luY0Vycm9yIHNlbnRpbmVsIGtleSwgd2hpY2hcbi8vIGNyZWF0ZUFwcFN5bmNIYW5kbGVyIHN0YW1wcy4gQnJhbmNoaW5nIG9uIHRoZSBzZW50aW5lbCAobm90IG9uIGEgYmFyZVxuLy8gZXJyb3JNZXNzYWdlKSBtZWFucyBhIGxlZ2l0aW1hdGUgcmVzdWx0IHRoYXQgbWVyZWx5IGhhcyBhbiBlcnJvck1lc3NhZ2UgZmllbGRcbi8vIGlzIHJldHVybmVkIHVuY2hhbmdlZCBpbnN0ZWFkIG9mIGJlaW5nIG1pc3JlYWQgYXMgYSB0eXBlZCBlcnJvci5cbmV4cG9ydCBmdW5jdGlvbiByZXNwb25zZShjdHgpIHtcbiAgaWYgKGN0eC5lcnJvcikge1xuICAgIHV0aWwuYXBwZW5kRXJyb3IoY3R4LmVycm9yLm1lc3NhZ2UsIGN0eC5lcnJvci50eXBlLCBjdHgucmVzdWx0KTtcbiAgICByZXR1cm4gY3R4LnJlc3VsdDtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBjdHgucHJldi5yZXN1bHQ7XG4gIGlmIChyZXN1bHQgJiYgcmVzdWx0Ll9fYXBwU3luY0Vycm9yKSB7XG4gICAgdXRpbC5lcnJvcihyZXN1bHQuZXJyb3JNZXNzYWdlLCByZXN1bHQuZXJyb3JUeXBlLCBudWxsLCByZXN1bHQuZXJyb3JJbmZvKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuYCksXG4gICAgfSk7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgcHVibGljIGFkZER5bmFtb0RiVnRsUmVzb2x2ZXI8VFlQRSBleHRlbmRzIGtleW9mIFJFU09MVkVSUywgRklFTERUWVBFIGV4dGVuZHMgTm9uTnVsbGFibGU8UkVTT0xWRVJTW1RZUEVdPj4oXG4gICAgdHlwZU5hbWU6IFRZUEUsXG4gICAgZmllbGROYW1lOiBrZXlvZiBGSUVMRFRZUEUsXG4gICAgb3B0aW9ucz86IE9taXQ8VnRsUmVzb2x2ZXJPcHRpb25zLCAnZGF0YVNvdXJjZSc+KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRhYmxlRGF0YVNvdXJjZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEeW5hbW9EQiBpcyBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgdGhpcy5hZGRWdGxSZXNvbHZlcih0eXBlTmFtZSwgZmllbGROYW1lLCB7XG4gICAgICBkYXRhU291cmNlOiB0aGlzLnRhYmxlRGF0YVNvdXJjZSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYWRkRHluYW1vRGJKU1Jlc29sdmVyPFRZUEUgZXh0ZW5kcyBrZXlvZiBSRVNPTFZFUlMsIEZJRUxEVFlQRSBleHRlbmRzIE5vbk51bGxhYmxlPFJFU09MVkVSU1tUWVBFXT4+KFxuICAgIHR5cGVOYW1lOiBUWVBFLFxuICAgIGZpZWxkTmFtZToga2V5b2YgRklFTERUWVBFLFxuICAgIG9wdGlvbnM/OiBKc1Jlc29sdmVyT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmICghdGhpcy50YWJsZURhdGFTb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRHluYW1vREIgaXMgbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIHRoaXMuYWRkSlNSZXNvbHZlcih0eXBlTmFtZSwgZmllbGROYW1lLCB0aGlzLnRhYmxlRGF0YVNvdXJjZSwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHN0YXNoVmFsdWVzOiB7XG4gICAgICAgIC4uLm9wdGlvbnM/LnN0YXNoVmFsdWVzID8/IHt9LFxuICAgICAgICB0YWJsZTogdGhpcy5wcm9wcy5zaW5nbGVUYWJsZURhdGFzdG9yZSEudGFibGUudGFibGVOYW1lLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRKU1Jlc29sdmVyPFRZUEUgZXh0ZW5kcyBrZXlvZiBSRVNPTFZFUlMsIEZJRUxEVFlQRSBleHRlbmRzIE5vbk51bGxhYmxlPFJFU09MVkVSU1tUWVBFXT4+KFxuICAgIHR5cGVOYW1lOiBUWVBFLFxuICAgIGZpZWxkTmFtZToga2V5b2YgRklFTERUWVBFLFxuICAgIGRhdGFTb3VyY2U6IGF3c19hcHBzeW5jLkJhc2VEYXRhU291cmNlLCBvcHRpb25zPzogSnNSZXNvbHZlck9wdGlvbnMpOiB2b2lkIHtcbiAgICBjb25zdCBvcGVyYXRpb25JZCA9IGAke3R5cGVOYW1lIGFzIHN0cmluZ30uJHtmaWVsZE5hbWUgYXMgU3RyaW5nfWA7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSBgVHlwZSAke3R5cGVOYW1lIGFzIHN0cmluZ30gRmllbGQgJHtmaWVsZE5hbWUgYXMgU3RyaW5nfSBSZXNvbHZlcmA7XG5cbiAgICBjb25zdCBzY29wZSA9IHRoaXMuZ2V0U2NvcGVGb3JUeXBlTmFtZSh0eXBlTmFtZSBhcyBzdHJpbmcpO1xuXG4gICAgY29uc3QgcmVzb2x2ZXJEaXIgPSAnLi9zcmMvanMtcmVzb2x2ZXIvJztcbiAgICBjb25zdCBmdW5jdGlvbnM6IEpzUmVzb2x2ZXJDb25maWdbXSA9IFtdO1xuXG4gICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLnBpcGVsaW5lU3RlcE5hbWVzIHx8IG9wdGlvbnMucGlwZWxpbmVTdGVwTmFtZXMubGVuZ3RoID09IDApIHtcbiAgICAgIGZ1bmN0aW9ucy5wdXNoKHtcbiAgICAgICAgbmFtZTogJ2RlZmF1bHQnLFxuICAgICAgICBpbmRleDogMCxcbiAgICAgICAgc3RlcENvdW50OiAxLFxuICAgICAgICBlbnRyeUZpbGU6IGAke3Jlc29sdmVyRGlyfS8ke29wZXJhdGlvbklkfS50c2AsXG4gICAgICAgIGZ1bmN0aW9uSWQ6IGBKU0Z1bmN0aW9uJHtvcGVyYXRpb25JZH1gLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZ1bmN0aW9ucy5wdXNoKC4uLm9wdGlvbnMucGlwZWxpbmVTdGVwTmFtZXMubWFwKChuYW1lLCBpbmRleCkgPT4gKHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgaW5kZXgsXG4gICAgICAgIHN0ZXBDb3VudDogb3B0aW9ucy5waXBlbGluZVN0ZXBOYW1lcyEubGVuZ3RoLFxuICAgICAgICBlbnRyeUZpbGU6IGAke3Jlc29sdmVyRGlyfS8ke29wZXJhdGlvbklkfS4ke25hbWV9LnRzYCxcbiAgICAgICAgZnVuY3Rpb25JZDogYEpTRnVuY3Rpb24ke29wZXJhdGlvbklkfSR7bmFtZX1gLFxuICAgICAgfSkpKTtcbiAgICB9XG5cbiAgICBjb25zdCBwaXBlbGluZUNvbmZpZyA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBmbiBvZiBmdW5jdGlvbnMpIHtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhmbi5lbnRyeUZpbGUpKSB7XG4gICAgICAgIGZzLm1rZGlyU3luYyhyZXNvbHZlckRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuY3JlYXRlSlNSZXNvbHZlckZpbGUoZm4sIHR5cGVOYW1lIGFzIHN0cmluZywgZmllbGROYW1lIGFzIHN0cmluZyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGpzRnVuY3Rpb24gPSBuZXcgYXdzX2FwcHN5bmMuQXBwc3luY0Z1bmN0aW9uKHNjb3BlLCBmbi5mdW5jdGlvbklkLCB7XG4gICAgICAgIGFwaTogdGhpcy5hcGksXG4gICAgICAgIG5hbWU6IG9wZXJhdGlvbklkLnJlcGxhY2UoL1xcLi9nLCAnJyksXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICBkYXRhU291cmNlLFxuICAgICAgICBjb2RlOiBhd3NfYXBwc3luYy5Db2RlLmZyb21Bc3NldCgnLicsIHtcbiAgICAgICAgICBhc3NldEhhc2hUeXBlOiBBc3NldEhhc2hUeXBlLk9VVFBVVCxcbiAgICAgICAgICBkZXBsb3lUaW1lOiB0cnVlLFxuICAgICAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgICAgICBpbWFnZTogRG9ja2VySW1hZ2UuZnJvbVJlZ2lzdHJ5KCdkdW1teScpLCAvLyBXaWxsIG5ldmVyIGJlIHVzZWQgZHVlIHRvIGxvY2FsIGJ1bmRsaW5nXG4gICAgICAgICAgICBvdXRwdXRUeXBlOiBCdW5kbGluZ091dHB1dC5TSU5HTEVfRklMRSxcbiAgICAgICAgICAgIGZ1bmN0aW9uSWQ6IGZuLmZ1bmN0aW9uSWQsXG4gICAgICAgICAgICBsb2NhbDoge1xuICAgICAgICAgICAgICB0cnlCdW5kbGUob3V0cHV0RGlyKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3NQbGF0Zm9ybSA9IG9zLnBsYXRmb3JtKCk7XG4gICAgICAgICAgICAgICAgZXhlYyhcbiAgICAgICAgICAgICAgICAgIG9zUGxhdGZvcm0gPT09ICd3aW4zMicgPyAnY21kJyA6ICdiYXNoJyxcbiAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgb3NQbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/ICcvYycgOiAnLWMnLFxuICAgICAgICAgICAgICAgICAgICBgZXNidWlsZCAtLWJ1bmRsZSAtLXNvdXJjZW1hcD1pbmxpbmUgLS1zb3VyY2VzLWNvbnRlbnQ9ZmFsc2UgLS10YXJnZXQ9ZXNuZXh0IC0tcGxhdGZvcm09bm9kZSAtLWZvcm1hdD1lc20gLS1leHRlcm5hbDpAYXdzLWFwcHN5bmMvdXRpbHMgLS1vdXRkaXI9JHtvdXRwdXREaXJ9ICR7Zm4uZW50cnlGaWxlfWAsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYgfSxcbiAgICAgICAgICAgICAgICAgICAgc3RkaW86IFsgLy8gc2hvdyBvdXRwdXRcbiAgICAgICAgICAgICAgICAgICAgICAnaWdub3JlJywgLy8gaWdub3JlIHN0ZGlvXG4gICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5zdGRlcnIsIC8vIHJlZGlyZWN0IHN0ZG91dCB0byBzdGRlcnJcbiAgICAgICAgICAgICAgICAgICAgICAnaW5oZXJpdCcsIC8vIGluaGVyaXQgc3RkZXJyXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvd3NWZXJiYXRpbUFyZ3VtZW50czogb3NQbGF0Zm9ybSA9PT0gJ3dpbjMyJyxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0gYXMgQnVuZGxpbmdPcHRpb25zLFxuICAgICAgICB9KSxcbiAgICAgICAgcnVudGltZTogYXdzX2FwcHN5bmMuRnVuY3Rpb25SdW50aW1lLkpTXzFfMF8wLFxuICAgICAgfSk7XG4gICAgICBwaXBlbGluZUNvbmZpZy5wdXNoKGpzRnVuY3Rpb24pO1xuICAgIH1cblxuICAgIG5ldyBhd3NfYXBwc3luYy5SZXNvbHZlcihzY29wZSwgYFJlc29sdmVyJHtvcGVyYXRpb25JZH1gLCB7XG4gICAgICBhcGk6IHRoaXMuYXBpLFxuICAgICAgdHlwZU5hbWU6IHR5cGVOYW1lIGFzIHN0cmluZyxcbiAgICAgIGZpZWxkTmFtZTogZmllbGROYW1lIGFzIHN0cmluZyxcbiAgICAgIHJ1bnRpbWU6IGF3c19hcHBzeW5jLkZ1bmN0aW9uUnVudGltZS5KU18xXzBfMCxcbiAgICAgIHBpcGVsaW5lQ29uZmlnLFxuICAgICAgY29kZTogYXdzX2FwcHN5bmMuQ29kZS5mcm9tSW5saW5lKGBcbiAgICAvLyBUaGUgYmVmb3JlIHN0ZXBcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVxdWVzdChjdHgpIHtcbiAgICAgIGNvbnNvbGUubG9nKGN0eCk7XG4ke09iamVjdC5lbnRyaWVzKG9wdGlvbnM/LnN0YXNoVmFsdWVzID8/IFtdKS5tYXAodmFsID0+IGAgICAgICBjdHguc3Rhc2guJHt2YWxbMF19ID0gJyR7dmFsWzFdfSdgKS5qb2luKCdcXG4nKX1cbiAgICAgIHJldHVybiB7fVxuICAgIH1cblxuICAgIC8vIFRoZSBhZnRlciBzdGVwXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc3BvbnNlKGN0eCkge1xuICAgICAgcmV0dXJuIGN0eC5wcmV2LnJlc3VsdFxuICAgIH1cbiAgYCksXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYWRkVnRsUmVzb2x2ZXI8VFlQRSBleHRlbmRzIGtleW9mIFJFU09MVkVSUywgRklFTERUWVBFIGV4dGVuZHMgTm9uTnVsbGFibGU8UkVTT0xWRVJTW1RZUEVdPj4oXG4gICAgdHlwZU5hbWU6IFRZUEUsXG4gICAgZmllbGROYW1lOiBrZXlvZiBGSUVMRFRZUEUsXG4gICAgb3B0aW9uczogVnRsUmVzb2x2ZXJPcHRpb25zKTogdm9pZCB7XG4gICAgY29uc3Qgb3BlcmF0aW9uSWQgPSBgJHt0eXBlTmFtZSBhcyBzdHJpbmd9LiR7ZmllbGROYW1lIGFzIFN0cmluZ31gO1xuXG4gICAgY29uc3QgbWFwcGluZ1JlcUZpbGUgPSBgLi9zcmMvdnRsLyR7b3BlcmF0aW9uSWR9LnJlcS52dGxgO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhtYXBwaW5nUmVxRmlsZSkpIHtcbiAgICAgIGZzLm1rZGlyU3luYygnLi9zcmMvdnRsLycsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhtYXBwaW5nUmVxRmlsZSwgJyMjIFJlcXVlc3QgbWFwcGluZycsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgfVxuICAgIGNvbnN0IG1hcHBpbmdSZXNGaWxlID0gYC4vc3JjL3Z0bC8ke29wZXJhdGlvbklkfS5yZXMudnRsYDtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMobWFwcGluZ1Jlc0ZpbGUpKSB7XG4gICAgICBmcy5ta2RpclN5bmMoJy4vc3JjL3Z0bC8nLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMobWFwcGluZ1Jlc0ZpbGUsICckdXRpbC50b0pzb24oJGN0eC5yZXN1bHQpJywgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBzY29wZSA9IHRoaXMuZ2V0U2NvcGVGb3JUeXBlTmFtZSh0eXBlTmFtZSBhcyBzdHJpbmcpO1xuXG4gICAgbmV3IGF3c19hcHBzeW5jLlJlc29sdmVyKHNjb3BlLCBgUmVzb2x2ZXIke29wZXJhdGlvbklkfWAsIHtcbiAgICAgIGFwaTogdGhpcy5hcGksXG4gICAgICB0eXBlTmFtZTogdHlwZU5hbWUgYXMgc3RyaW5nLFxuICAgICAgZmllbGROYW1lOiBmaWVsZE5hbWUgYXMgc3RyaW5nLFxuICAgICAgZGF0YVNvdXJjZTogb3B0aW9ucy5kYXRhU291cmNlLFxuICAgICAgcmVxdWVzdE1hcHBpbmdUZW1wbGF0ZTogYXdzX2FwcHN5bmMuTWFwcGluZ1RlbXBsYXRlLmZyb21TdHJpbmcodGhpcy5zdWJzdFZhcmlhYmxlcyhmcy5yZWFkRmlsZVN5bmMobWFwcGluZ1JlcUZpbGUpLnRvU3RyaW5nKCd1dGYtOCcpLCBvcHRpb25zLnZhcmlhYmxlcykpLFxuICAgICAgcmVzcG9uc2VNYXBwaW5nVGVtcGxhdGU6IGF3c19hcHBzeW5jLk1hcHBpbmdUZW1wbGF0ZS5mcm9tU3RyaW5nKHRoaXMuc3Vic3RWYXJpYWJsZXMoZnMucmVhZEZpbGVTeW5jKG1hcHBpbmdSZXNGaWxlKS50b1N0cmluZygndXRmLTgnKSwgb3B0aW9ucy52YXJpYWJsZXMpKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBzY29wZSBmb3IgY3JlYXRpbmcgcmVzb3VyY2VzIGZvciB0aGUgZ2l2ZW4gdHlwZSBuYW1lLlxuICAgKiBJZiB1c2VOZXN0ZWRTdGFja3MgaXMgZW5hYmxlZCwgcmV0dXJucyBhIG5lc3RlZCBzdGFjayBmb3IgdGhlIHR5cGUgbmFtZSxcbiAgICogY3JlYXRpbmcgaXQgaWYgaXQgZG9lc24ndCBleGlzdC4gT3RoZXJ3aXNlLCByZXR1cm5zIHRoaXMgY29uc3RydWN0LlxuICAgKlxuICAgKiBRdWVyeSwgTXV0YXRpb24sIGFuZCBTdWJzY3JpcHRpb24gZWFjaCBnZXQgdGhlaXIgb3duIG5lc3RlZCBzdGFjay5cbiAgICogQWxsIG90aGVyIHR5cGVzIChmaWVsZCByZXNvbHZlcnMpIHNoYXJlIGEgc2luZ2xlIFwiRmllbGRcIiBuZXN0ZWQgc3RhY2suXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlTmFtZSAtIFRoZSBHcmFwaFFMIHR5cGUgbmFtZSAoZS5nLiwgJ1F1ZXJ5JywgJ011dGF0aW9uJywgJ1N1YnNjcmlwdGlvbicsIG9yIGEgY3VzdG9tIHR5cGUpXG4gICAqIEByZXR1cm5zIFRoZSBjb25zdHJ1Y3QgdG8gdXNlIGFzIHNjb3BlIGZvciBjcmVhdGluZyByZXNvdXJjZXNcbiAgICovXG4gIHByaXZhdGUgZ2V0U2NvcGVGb3JUeXBlTmFtZSh0eXBlTmFtZTogc3RyaW5nKTogQ29uc3RydWN0IHtcbiAgICBpZiAoIXRoaXMucHJvcHMudXNlTmVzdGVkU3RhY2tzKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBjb25zdCByb290VHlwZXMgPSBbJ1F1ZXJ5JywgJ011dGF0aW9uJywgJ1N1YnNjcmlwdGlvbiddO1xuICAgIGNvbnN0IHN0YWNrS2V5ID0gcm9vdFR5cGVzLmluY2x1ZGVzKHR5cGVOYW1lKSA/IHR5cGVOYW1lIDogJ0ZpZWxkJztcblxuICAgIGlmICghdGhpcy5uZXN0ZWRTdGFja3Nbc3RhY2tLZXldKSB7XG4gICAgICB0aGlzLm5lc3RlZFN0YWNrc1tzdGFja0tleV0gPSBuZXcgTmVzdGVkU3RhY2sodGhpcywgYCR7c3RhY2tLZXl9UmVzb2x2ZXJzYCwge1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5lc3RlZCBzdGFjayBmb3IgJHtzdGFja0tleX0gcmVzb2x2ZXJzYCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm5lc3RlZFN0YWNrc1tzdGFja0tleV07XG4gIH1cblxuICBwcml2YXRlIHN1YnN0VmFyaWFibGVzKGRhdGE6IHN0cmluZywgdmFyczogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fSk6IHN0cmluZyB7XG4gICAgbGV0IHJlcyA9IGRhdGE7XG4gICAgZm9yIChjb25zdCBuYW1lIGluIHZhcnMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFycywgbmFtZSkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB2YXJzW25hbWVdO1xuICAgICAgICByZXMgPSByZXMucmVwbGFjZShuZXcgUmVnRXhwKGBcXFxcJFxceyR7bmFtZX1cXH1gLCAnZycpLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVudHJ5RmlsZShlbnRyeUZpbGU6IHN0cmluZywgdHlwZU5hbWU6IHN0cmluZywgZmllbGROYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhcmdUeXBlID0gYCR7dHlwZU5hbWV9JHt1cHBlcmNhc2VGaXJzdChmaWVsZE5hbWUpfUFyZ3NgO1xuICAgIGZzLndyaXRlRmlsZVN5bmMoZW50cnlGaWxlLCBgaW1wb3J0IHsgYXBpIH0gZnJvbSAnY2RrLXNlcnZlcmxlc3MvbGliL2xhbWJkYSc7XG5pbXBvcnQgeyAke3R5cGVOYW1lfSwgJHthcmdUeXBlfSB9IGZyb20gJy4uL2dlbmVyYXRlZC9ncmFwaHFsLiR7dGhpcy5wcm9wcy5hcGlOYW1lLnRvTG93ZXJDYXNlKCl9LW1vZGVsLmdlbmVyYXRlZCc7XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVyID0gYXBpLmNyZWF0ZUFwcFN5bmNIYW5kbGVyPCR7YXJnVHlwZX0sICR7dHlwZU5hbWV9Wycke2ZpZWxkTmFtZX0nXT4oYXN5bmMgKGN0eCkgPT4ge1xuICBjdHgubG9nZ2VyLmluZm8oSlNPTi5zdHJpbmdpZnkoY3R4LmV2ZW50KSk7XG4gIHRocm93IG5ldyBFcnJvcignTm90IHlldCBpbXBsZW1lbnRlZCcpO1xufSk7YCwge1xuICAgICAgZW5jb2Rpbmc6ICd1dGYtOCcsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUpTUmVzb2x2ZXJGaWxlKGZuOiBKc1Jlc29sdmVyQ29uZmlnLCB0eXBlTmFtZTogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IGFyZ1R5cGUgPSBgJHt0eXBlTmFtZX0ke3VwcGVyY2FzZUZpcnN0KGZpZWxkTmFtZSl9QXJnc2A7XG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IChmbi5pbmRleCA9PSAoZm4uc3RlcENvdW50IC0gMSkpID8gYCR7dHlwZU5hbWV9Wycke2ZpZWxkTmFtZX0nXWAgOiAnYW55JztcblxuICAgIGZzLndyaXRlRmlsZVN5bmMoZm4uZW50cnlGaWxlLCBgaW1wb3J0IHsgQ29udGV4dCwgdXRpbCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscyc7XG5pbXBvcnQgeyAke3R5cGVOYW1lfSwgJHthcmdUeXBlfSB9IGZyb20gJy4uL2dlbmVyYXRlZC9ncmFwaHFsLiR7dGhpcy5wcm9wcy5hcGlOYW1lLnRvTG93ZXJDYXNlKCl9LW1vZGVsLmdlbmVyYXRlZCc7XG5cbi8qKlxuICogUmVxdWVzdCBmb3IgJHt0eXBlTmFtZX0uJHtmaWVsZE5hbWV9IChTdGVwOiAke2ZuLm5hbWV9ICR7Zm4uaW5kZXggKyAxfS8ke2ZuLnN0ZXBDb3VudH0pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0KGN0eDogQ29udGV4dDwke2FyZ1R5cGV9Pik6IGFueSB7XG4gIGNvbnNvbGUubG9nKGN0eCk7XG4gIHJldHVybiB7fTtcbn1cblxuLyoqXG4gKiBSZXNwb25zZSBmb3IgJHt0eXBlTmFtZX0uJHtmaWVsZE5hbWV9IChTdGVwOiAke2ZuLm5hbWV9ICR7Zm4uaW5kZXggKyAxfS8ke2ZuLnN0ZXBDb3VudH0pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNwb25zZShjdHg6IENvbnRleHQ8JHthcmdUeXBlfT4pOiAke3JldHVyblR5cGV9IHtcbiAgY29uc29sZS5sb2coY3R4KTtcbiAgcmV0dXJuIGN0eC5yZXN1bHQuaXRlbXM7XG59YCwge1xuICAgICAgZW5jb2Rpbmc6ICd1dGYtOCcsXG4gICAgfSk7XG4gIH1cblxufVxuXG5mdW5jdGlvbiB1cHBlcmNhc2VGaXJzdCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc3Vic3RyaW5nKDEpO1xufVxuXG4vKipcbiAqIENvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL21haW4vcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanMvbGliL3V0aWwudHNcbiAqIGFzIGl0IGlzIG5vdCBleHBvcnRlZCBieSBhd3MtY2RrLWxpYlxuICovXG5mdW5jdGlvbiBleGVjKGNtZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgb3B0aW9ucz86IFNwYXduU3luY09wdGlvbnMpIHtcbiAgY29uc3QgcHJvYyA9IHNwYXduU3luYyhjbWQsIGFyZ3MsIG9wdGlvbnMpO1xuXG4gIGlmIChwcm9jLmVycm9yKSB7XG4gICAgdGhyb3cgcHJvYy5lcnJvcjtcbiAgfVxuXG4gIGlmIChwcm9jLnN0YXR1cyAhPT0gMCkge1xuICAgIGlmIChwcm9jLnN0ZG91dCB8fCBwcm9jLnN0ZGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbU3RhdHVzICR7cHJvYy5zdGF0dXN9XSBzdGRvdXQ6ICR7cHJvYy5zdGRvdXQ/LnRvU3RyaW5nKCkudHJpbSgpfVxcblxcblxcbnN0ZGVycjogJHtwcm9jLnN0ZGVycj8udG9TdHJpbmcoKS50cmltKCl9YCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgJHtjbWR9ICR7YXJncy5qb2luKCcgJyl9ICR7b3B0aW9ucz8uY3dkID8gYHJ1biBpbiBkaXJlY3RvcnkgJHtvcHRpb25zLmN3ZH1gIDogJyd9IGV4aXRlZCB3aXRoIHN0YXR1cyAke3Byb2Muc3RhdHVzfWApO1xuICB9XG5cbiAgcmV0dXJuIHByb2M7XG59XG5cbiJdfQ==
|
|
598
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhxbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdHJ1Y3RzL2dyYXBocWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNEJBQTRCO0FBQzVCLGlEQUE0RDtBQUM1RCw0Q0FBOEI7QUFDOUIsNENBQThCO0FBQzlCLDZDQUE2TDtBQUc3TCx5Q0FBbUQ7QUFDbkQsaUNBQXdDO0FBQ3hDLCtDQUF5RTtBQTZHekU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQWEsVUFBc0IsU0FBUSxrQkFBTztJQTRCaEQ7Ozs7OztPQU1HO0lBQ0gsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBbUIsS0FBc0I7UUFDL0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFEaUMsVUFBSyxHQUFMLEtBQUssQ0FBaUI7UUF2QmpGOztXQUVHO1FBQ0ssZUFBVSxHQUE4QyxFQUFFLENBQUM7UUFFbkU7OztXQUdHO1FBQ2MsaUJBQVksR0FBd0MsRUFBRSxDQUFDO1FBaUJ0RSxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxjQUF1QyxDQUFDO1FBRWpFLElBQUksZ0JBQXVELENBQUM7UUFDNUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsZ0JBQWdCLEdBQUc7Z0JBQ2pCLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDeEIsV0FBVyxFQUFFLElBQUksb0NBQXNCLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtvQkFDNUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFXO29CQUM1QixNQUFNLEVBQUUsV0FBVztvQkFDbkIsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPO29CQUN4QixVQUFVLEVBQUUsb0NBQXNCLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7aUJBQ2xGLENBQUM7YUFDSCxDQUFDO1lBQ0YsSUFBSSx1QkFBUyxDQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRTtnQkFDMUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsOENBQW9DLEVBQUU7Z0JBQ25FLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTzthQUNwQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLHlCQUFXLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDdEQsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUMsU0FBUyxHQUFHO1lBQzdDLFNBQVMsRUFBRTtnQkFDVCxhQUFhLEVBQUUseUJBQVcsQ0FBQyxhQUFhLENBQUMsR0FBRztnQkFDNUMsU0FBUyxFQUFFLHNCQUFRLENBQUMsYUFBYSxDQUFDLFVBQVU7YUFDN0M7WUFDRCxNQUFNLEVBQUUseUJBQVcsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQztZQUNsRSxVQUFVLEVBQUUsZ0JBQWdCO1lBQzVCLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSTtnQkFDckIsbUJBQW1CLEVBQUU7b0JBQ25CLDRCQUE0QixFQUFFO3dCQUM1Qjs0QkFDRSxpQkFBaUIsRUFBRSx5QkFBVyxDQUFDLGlCQUFpQixDQUFDLFNBQVM7NEJBQzFELGNBQWMsRUFBRTtnQ0FDZCxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRO2dDQUNuQyxhQUFhLEVBQUUseUJBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJOzZCQUN0RDt5QkFDRjt3QkFDRCxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLEVBQUUseUJBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO3FCQUNuRztpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDbkQsSUFBSSx5QkFBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUM3QyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVc7Z0JBQ3RCLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxVQUFVO2dCQUN2QyxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUI7YUFDdkMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELHVEQUF1RDtRQUN2RCwwRUFBMEU7UUFDMUUsZ0NBQWdDO1FBQ2hDLDhCQUE4QjtRQUM5Qix1QkFBdUI7UUFDdkIsc0NBQXNDO1FBQ3RDLFNBQVM7UUFDVCx3QkFBd0I7UUFDeEIsU0FBUztRQUNULDBFQUEwRTtRQUMxRSxnQ0FBZ0M7UUFDaEMsOEJBQThCO1FBQzlCLHVCQUF1QjtRQUN2QixzQ0FBc0M7UUFDdEMsU0FBUztRQUNULHdCQUF3QjtRQUN4QixTQUFTO1FBQ1QsMkVBQTJFO1FBQzNFLGdDQUFnQztRQUNoQyw2QkFBNkI7UUFDN0IsdUJBQXVCO1FBQ3ZCLHNDQUFzQztRQUN0QyxTQUFTO1FBQ1QsNEJBQTRCO1FBQzVCLFNBQVM7UUFDVCwyRUFBMkU7UUFDM0UsZ0NBQWdDO1FBQ2hDLDZCQUE2QjtRQUM3Qix1QkFBdUI7UUFDdkIsc0NBQXNDO1FBQ3RDLFNBQVM7UUFDVCx3QkFBd0I7UUFDeEIsU0FBUztRQUNULCtFQUErRTtRQUMvRSxnQ0FBZ0M7UUFDaEMsNkJBQTZCO1FBQzdCLHVCQUF1QjtRQUN2QixzQ0FBc0M7UUFDdEMsU0FBUztRQUNULHdCQUF3QjtRQUN4QixTQUFTO1FBQ1QsK0VBQStFO1FBQy9FLGdDQUFnQztRQUNoQyw2QkFBNkI7UUFDN0IsdUJBQXVCO1FBQ3ZCLHNDQUFzQztRQUN0QyxTQUFTO1FBQ1Qsd0JBQXdCO1FBQ3hCLFNBQVM7UUFDVCxJQUFJO1FBRUosSUFBSSxLQUFLLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUkseUJBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUU7Z0JBQ25GLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztnQkFDYixLQUFLLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixFQUFFLEtBQUs7YUFDekMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLFdBQVcsQ0FDaEIsT0FBMkIsRUFDM0IsUUFBYyxFQUNkLEdBQUcsVUFBK0I7UUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLHlCQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxRQUFrQixFQUFFLEdBQUcsVUFBc0IsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDNUgsQ0FBQztJQUVEOztPQUVHO0lBQ0ksaUJBQWlCLENBQ3RCLFFBQWMsRUFDZCxHQUFHLFVBQStCO1FBRWxDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztRQUMvRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBRUQ7O09BRUc7SUFDSSxlQUFlLENBQ3BCLFFBQWMsRUFDZCxHQUFHLFVBQStCO1FBRWxDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztRQUMvRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBR0Q7O09BRUc7SUFDSSx1QkFBdUIsQ0FDNUIsUUFBYyxFQUNkLFNBQTBCO1FBRTFCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFFBQWtCLElBQUksU0FBbUIsRUFBRSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVNLGlCQUFpQixDQUN0QixRQUFjLEVBQ2QsU0FBMEIsRUFDMUIsT0FBK0I7UUFFL0IsTUFBTSxPQUFPLEdBQUcsT0FBTyxFQUFFLFlBQVksS0FBSyxTQUFTLENBQUM7UUFFcEQsTUFBTSxXQUFXLEdBQUcsR0FBRyxRQUFrQixJQUFJLFNBQW1CLEVBQUUsQ0FBQztRQUNuRSxNQUFNLFdBQVcsR0FBRyxRQUFRLFFBQWtCLFVBQVUsU0FBbUIsV0FBVyxDQUFDO1FBRXZGLE1BQU0sU0FBUyxHQUFHLGdCQUFnQixXQUFXLEtBQUssQ0FBQztRQUNuRCxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzlCLEVBQUUsQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsUUFBa0IsRUFBRSxTQUFtQixDQUFDLENBQUM7UUFDM0UsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFrQixDQUFDLENBQUM7UUFFM0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxxQkFBYyxDQUFDLEtBQUssRUFBRSxLQUFLLFdBQVcsRUFBRSxFQUFFO1lBQ3ZELFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVM7WUFDL0IsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYTtZQUN2QyxLQUFLLEVBQUUsU0FBUztZQUNoQixXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsS0FBSyxXQUFXLEVBQUU7WUFDdkQsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsSUFBSTtnQkFDOUIsUUFBUSxFQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBd0MsQ0FBQyxRQUFRO2FBQ3hFO1lBQ0QsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixJQUFJO2dCQUNwQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLO2dCQUM1QyxXQUFXLEVBQUUsUUFBUSxLQUFLLFVBQVU7YUFDckM7WUFDRCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJO2dCQUN4QixlQUFlLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsZUFBZTtnQkFDcEQsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVc7YUFDN0M7WUFDRCxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhO1lBQ3ZDLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWE7U0FDeEMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDbEMsa0JBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUV4Qyx5QkFBeUI7UUFDekIsOEVBQThFO1FBQzlFLCtFQUErRTtRQUMvRSx5RUFBeUU7UUFDekUsNEVBQTRFO1FBQzVFLElBQUk7UUFFSixNQUFNLFVBQVUsR0FBRyxJQUFJLHlCQUFXLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFdBQVcsV0FBVyxFQUFFLEVBQUU7WUFDbkYsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsSUFBSSxFQUFFLFVBQVUsUUFBa0IsSUFBSSxTQUFtQixFQUFFO1lBQzNELGNBQWMsRUFBRSxFQUFFO1NBQ25CLENBQUMsQ0FBQztRQUVILElBQUksT0FBTyxFQUFFLENBQUM7WUFDWiwwRUFBMEU7WUFDMUUsdUVBQXVFO1lBQ3ZFLHdFQUF3RTtZQUN4RSx1RUFBdUU7WUFDdkUseURBQXlEO1lBQ3pELHdFQUF3RTtZQUN4RSx1REFBdUQ7WUFDdkQsRUFBRTtZQUNGLDJFQUEyRTtZQUMzRSwyRUFBMkU7WUFDM0Usb0RBQW9EO1lBQ3BELElBQUkseUJBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLFdBQVcsV0FBVyxFQUFFLEVBQUU7Z0JBQ3hELEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztnQkFDYixRQUFRLEVBQUUsUUFBa0I7Z0JBQzVCLFNBQVMsRUFBRSxTQUFtQjtnQkFDOUIsVUFBVTtnQkFDVixZQUFZLEVBQUUsT0FBUSxDQUFDLFlBQVk7Z0JBQ25DLHNCQUFzQixFQUFFLHlCQUFXLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyx5QkFBeUIsRUFBRSxhQUFhLENBQUM7Z0JBQzNHLHVCQUF1QixFQUFFLHlCQUFXLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRTthQUNwRSxDQUFDLENBQUM7WUFDSCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1Qix1RUFBdUU7WUFDdkUsdUVBQXVFO1lBQ3ZFLHFFQUFxRTtZQUNyRSwyRUFBMkU7WUFDM0UsSUFBSSx5QkFBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsV0FBVyxXQUFXLEVBQUUsRUFBRTtnQkFDeEQsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNiLFFBQVEsRUFBRSxRQUFrQjtnQkFDNUIsU0FBUyxFQUFFLFNBQW1CO2dCQUM5QixVQUFVO2FBQ1gsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsd0VBQXdFO1FBQ3hFLHlFQUF5RTtRQUN6RSx3RUFBd0U7UUFDeEUsd0VBQXdFO1FBQ3hFLDBFQUEwRTtRQUMxRSxzRUFBc0U7UUFDdEUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVsRCwrRUFBK0U7UUFDL0UseUVBQXlFO1FBQ3pFLDRFQUE0RTtRQUM1RSx5RUFBeUU7UUFDekUsMEVBQTBFO1FBQzFFLHdFQUF3RTtRQUN4RSxNQUFNLGNBQWMsR0FBRyxJQUFJLHlCQUFXLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxXQUFXLFdBQVcsRUFBRSxFQUFFO1lBQ3RGLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLElBQUksRUFBRSxVQUFXLFFBQW1CLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsSUFBSyxTQUFvQixDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDekgsVUFBVTtZQUNWLE9BQU8sRUFBRSx5QkFBVyxDQUFDLGVBQWUsQ0FBQyxRQUFRO1lBQzdDLElBQUksRUFBRSx5QkFBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FzQnZDLENBQUM7U0FDRyxDQUFDLENBQUM7UUFFSCxJQUFJLHlCQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxXQUFXLFdBQVcsRUFBRSxFQUFFO1lBQ3hELEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLFFBQVEsRUFBRSxRQUFrQjtZQUM1QixTQUFTLEVBQUUsU0FBbUI7WUFDOUIsT0FBTyxFQUFFLHlCQUFXLENBQUMsZUFBZSxDQUFDLFFBQVE7WUFDN0MsY0FBYyxFQUFFLENBQUMsY0FBYyxDQUFDO1lBQ2hDLElBQUksRUFBRSx5QkFBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0F5QnZDLENBQUM7U0FDRyxDQUFDLENBQUM7UUFDSCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFTSxzQkFBc0IsQ0FDM0IsUUFBYyxFQUNkLFNBQTBCLEVBQzFCLE9BQWdEO1FBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUU7WUFDdkMsVUFBVSxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQ2hDLEdBQUcsT0FBTztTQUNYLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxxQkFBcUIsQ0FDMUIsUUFBYyxFQUNkLFNBQTBCLEVBQzFCLE9BQTJCO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUM1RCxHQUFHLE9BQU87WUFDVixXQUFXLEVBQUU7Z0JBQ1gsR0FBRyxPQUFPLEVBQUUsV0FBVyxJQUFJLEVBQUU7Z0JBQzdCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFxQixDQUFDLEtBQUssQ0FBQyxTQUFTO2FBQ3hEO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLGFBQWEsQ0FDbEIsUUFBYyxFQUNkLFNBQTBCLEVBQzFCLFVBQXNDLEVBQUUsT0FBMkI7UUFDbkUsTUFBTSxXQUFXLEdBQUcsR0FBRyxRQUFrQixJQUFJLFNBQW1CLEVBQUUsQ0FBQztRQUNuRSxNQUFNLFdBQVcsR0FBRyxRQUFRLFFBQWtCLFVBQVUsU0FBbUIsV0FBVyxDQUFDO1FBRXZGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFrQixDQUFDLENBQUM7UUFFM0QsTUFBTSxXQUFXLEdBQUcsb0JBQW9CLENBQUM7UUFDekMsTUFBTSxTQUFTLEdBQXVCLEVBQUUsQ0FBQztRQUV6QyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDcEYsU0FBUyxDQUFDLElBQUksQ0FBQztnQkFDYixJQUFJLEVBQUUsU0FBUztnQkFDZixLQUFLLEVBQUUsQ0FBQztnQkFDUixTQUFTLEVBQUUsQ0FBQztnQkFDWixTQUFTLEVBQUUsR0FBRyxXQUFXLElBQUksV0FBVyxLQUFLO2dCQUM3QyxVQUFVLEVBQUUsYUFBYSxXQUFXLEVBQUU7YUFDdkMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ2hFLElBQUk7Z0JBQ0osS0FBSztnQkFDTCxTQUFTLEVBQUUsT0FBTyxDQUFDLGlCQUFrQixDQUFDLE1BQU07Z0JBQzVDLFNBQVMsRUFBRSxHQUFHLFdBQVcsSUFBSSxXQUFXLElBQUksSUFBSSxLQUFLO2dCQUNyRCxVQUFVLEVBQUUsYUFBYSxXQUFXLEdBQUcsSUFBSSxFQUFFO2FBQzlDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBRTFCLEtBQUssTUFBTSxFQUFFLElBQUksU0FBUyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLEVBQUUsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLEVBQUUsUUFBa0IsRUFBRSxTQUFtQixDQUFDLENBQUM7WUFDekUsQ0FBQztZQUVELE1BQU0sVUFBVSxHQUFHLElBQUkseUJBQVcsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUU7Z0JBQ3ZFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztnQkFDYixJQUFJLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO2dCQUNwQyxXQUFXO2dCQUNYLFVBQVU7Z0JBQ1YsSUFBSSxFQUFFLHlCQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7b0JBQ3BDLGFBQWEsRUFBRSwyQkFBYSxDQUFDLE1BQU07b0JBQ25DLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7d0JBQ1IsS0FBSyxFQUFFLHlCQUFXLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFLDJDQUEyQzt3QkFDckYsVUFBVSxFQUFFLDRCQUFjLENBQUMsV0FBVzt3QkFDdEMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVO3dCQUN6QixLQUFLLEVBQUU7NEJBQ0wsU0FBUyxDQUFDLFNBQVM7Z0NBQ2pCLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQ0FDakMsSUFBSSxDQUNGLFVBQVUsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUN2QztvQ0FDRSxVQUFVLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUk7b0NBQ3BDLG1KQUFtSixTQUFTLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRTtpQ0FDL0ssRUFDRDtvQ0FDRSxHQUFHLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUU7b0NBQ3ZCLEtBQUssRUFBRTt3Q0FDTCxRQUFRLEVBQUUsZUFBZTt3Q0FDekIsT0FBTyxDQUFDLE1BQU0sRUFBRSw0QkFBNEI7d0NBQzVDLFNBQVMsRUFBRSxpQkFBaUI7cUNBQzdCO29DQUNELHdCQUF3QixFQUFFLFVBQVUsS0FBSyxPQUFPO2lDQUNqRCxDQUFDLENBQUM7Z0NBRUwsT0FBTyxJQUFJLENBQUM7NEJBQ2QsQ0FBQzt5QkFDRjtxQkFDaUI7aUJBQ3JCLENBQUM7Z0JBQ0YsT0FBTyxFQUFFLHlCQUFXLENBQUMsZUFBZSxDQUFDLFFBQVE7YUFDOUMsQ0FBQyxDQUFDO1lBQ0gsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBRUQsSUFBSSx5QkFBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsV0FBVyxXQUFXLEVBQUUsRUFBRTtZQUN4RCxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDYixRQUFRLEVBQUUsUUFBa0I7WUFDNUIsU0FBUyxFQUFFLFNBQW1CO1lBQzlCLE9BQU8sRUFBRSx5QkFBVyxDQUFDLGVBQWUsQ0FBQyxRQUFRO1lBQzdDLGNBQWM7WUFDZCxJQUFJLEVBQUUseUJBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDOzs7O0VBSXRDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzs7Ozs7Ozs7R0FRMUcsQ0FBQztTQUNDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxjQUFjLENBQ25CLFFBQWMsRUFDZCxTQUEwQixFQUMxQixPQUEyQjtRQUMzQixNQUFNLFdBQVcsR0FBRyxHQUFHLFFBQWtCLElBQUksU0FBbUIsRUFBRSxDQUFDO1FBRW5FLE1BQU0sY0FBYyxHQUFHLGFBQWEsV0FBVyxVQUFVLENBQUM7UUFDMUQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxFQUFFLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELEVBQUUsQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLG9CQUFvQixFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDaEYsQ0FBQztRQUNELE1BQU0sY0FBYyxHQUFHLGFBQWEsV0FBVyxVQUFVLENBQUM7UUFDMUQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxFQUFFLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELEVBQUUsQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLDJCQUEyQixFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDdkYsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFrQixDQUFDLENBQUM7UUFFM0QsSUFBSSx5QkFBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsV0FBVyxXQUFXLEVBQUUsRUFBRTtZQUN4RCxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDYixRQUFRLEVBQUUsUUFBa0I7WUFDNUIsU0FBUyxFQUFFLFNBQW1CO1lBQzlCLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtZQUM5QixzQkFBc0IsRUFBRSx5QkFBVyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDekosdUJBQXVCLEVBQUUseUJBQVcsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQzNKLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ssbUJBQW1CLENBQUMsUUFBZ0I7UUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDaEMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBRW5FLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLHlCQUFXLENBQUMsSUFBSSxFQUFFLEdBQUcsUUFBUSxXQUFXLEVBQUU7Z0JBQzFFLFdBQVcsRUFBRSxvQkFBb0IsUUFBUSxZQUFZO2FBQ3RELENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVPLGNBQWMsQ0FBQyxJQUFZLEVBQUUsT0FBbUMsRUFBRTtRQUN4RSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDZixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3hCLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNyRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pCLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDOUQsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFTyxlQUFlLENBQUMsU0FBaUIsRUFBRSxRQUFnQixFQUFFLFNBQWlCO1FBQzVFLE1BQU0sT0FBTyxHQUFHLEdBQUcsUUFBUSxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQzlELEVBQUUsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFO1dBQ3JCLFFBQVEsS0FBSyxPQUFPLGlDQUFpQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUU7O2tEQUU5QyxPQUFPLEtBQUssUUFBUSxLQUFLLFNBQVM7OztJQUdoRixFQUFFO1lBQ0EsUUFBUSxFQUFFLE9BQU87U0FDbEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLG9CQUFvQixDQUFDLEVBQW9CLEVBQUUsUUFBZ0IsRUFBRSxTQUFpQjtRQUNwRixNQUFNLE9BQU8sR0FBRyxHQUFHLFFBQVEsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUM5RCxNQUFNLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFFNUYsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFO1dBQ3hCLFFBQVEsS0FBSyxPQUFPLGlDQUFpQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUU7OztpQkFHL0UsUUFBUSxJQUFJLFNBQVMsV0FBVyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTOzt1Q0FFakQsT0FBTzs7Ozs7O2tCQU01QixRQUFRLElBQUksU0FBUyxXQUFXLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVM7O3dDQUVqRCxPQUFPLE9BQU8sVUFBVTs7O0VBRzlELEVBQUU7WUFDRSxRQUFRLEVBQUUsT0FBTztTQUNsQixDQUFDLENBQUM7SUFDTCxDQUFDO0NBRUY7QUExbEJELGdDQTBsQkM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxLQUFhO0lBQ25DLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxJQUFJLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxPQUEwQjtJQUNuRSxNQUFNLElBQUksR0FBRyxJQUFBLHlCQUFTLEVBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUUzQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3RCLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksQ0FBQyxNQUFNLGFBQWEsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RJLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSx1QkFBdUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDekksQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbmltcG9ydCB7IFNwYXduU3luY09wdGlvbnMsIHNwYXduU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IEFzc2V0SGFzaFR5cGUsIEJ1bmRsaW5nT3B0aW9ucywgQnVuZGxpbmdPdXRwdXQsIENmbk91dHB1dCwgRG9ja2VySW1hZ2UsIE5lc3RlZFN0YWNrLCBUYWdzLCBhd3NfYXBwc3luYywgYXdzX2NlcnRpZmljYXRlbWFuYWdlciwgYXdzX2lhbSwgYXdzX2xvZ3MsIGF3c19yb3V0ZTUzIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBDb2duaXRvQXV0aGVudGljYXRpb24gfSBmcm9tICcuL2F1dGhlbnRpY2F0aW9uJztcbmltcG9ydCB7IEJhc2VBcGksIEJhc2VBcGlQcm9wcyB9IGZyb20gJy4vYmFzZS1hcGknO1xuaW1wb3J0IHsgTGFtYmRhRnVuY3Rpb24gfSBmcm9tICcuL2Z1bmMnO1xuaW1wb3J0IHsgQ0ZOX09VVFBVVF9TVUZGSVhfR1JBUEhRTF9ET01BSU5OQU1FIH0gZnJvbSAnLi4vc2hhcmVkL291dHB1dHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdyYXBoUWxBcGlQcm9wcyBleHRlbmRzIEJhc2VBcGlQcm9wcyB7XG4gIGRlZmluaXRpb25GaWxlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCByZXNvbHZlcnMgYW5kIExhbWJkYSBmdW5jdGlvbnMgd2lsbCBiZSBjcmVhdGVkIGluIG5lc3RlZCBzdGFja3NcbiAgICogZ3JvdXBlZCBieSB0eXBlIChRdWVyeSwgTXV0YXRpb24sIFN1YnNjcmlwdGlvbiwgRmllbGQpLlxuICAgKlxuICAgKiBXQVJOSU5HOiBPbmx5IGVuYWJsZSB0aGlzIGlmIHlvdSBhcmUgYXBwcm9hY2hpbmcgb3IgaGl0dGluZyBDbG91ZEZvcm1hdGlvbidzXG4gICAqIDUwMCByZXNvdXJjZSBsaW1pdC4gTmVzdGVkIHN0YWNrcyBoYXZlIHNpZ25pZmljYW50IGRvd25zaWRlczpcbiAgICogLSBTbG93ZXIgZGVwbG95bWVudHMgZHVlIHRvIGFkZGl0aW9uYWwgc3RhY2sgb3BlcmF0aW9uc1xuICAgKiAtIE1vcmUgY29tcGxleCBkZWJ1Z2dpbmcgYW5kIGVycm9yIHRyYWNpbmdcbiAgICogLSBIYXJkZXIgdG8gbmF2aWdhdGUgaW4gdGhlIENsb3VkRm9ybWF0aW9uIGNvbnNvbGVcbiAgICogLSBDcm9zcy1zdGFjayByZWZlcmVuY2VzIGFkZCBjb21wbGV4aXR5XG4gICAqXG4gICAqIFdBUk5JTkc6IENoYW5naW5nIHRoaXMgc2V0dGluZyBvbiBhbiBleGlzdGluZyBzdGFjayByZXF1aXJlcyBtYW51YWwgaW50ZXJ2ZW50aW9uLlxuICAgKiBDbG91ZEZvcm1hdGlvbiBjYW5ub3QgYXV0b21hdGljYWxseSBtb3ZlIHJlc291cmNlcyBiZXR3ZWVuIHN0YWNrcy4gWW91IG1heSBuZWVkXG4gICAqIHRvIGRlbGV0ZSBhbmQgcmVjcmVhdGUgcmVzb2x2ZXJzLCBvciBwZXJmb3JtIGEgdHdvLXN0ZXAgZGVwbG95bWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHVzZU5lc3RlZFN0YWNrcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGFkZExhbWJkYVJlc29sdmVyIHN5bnRoZXNpemVzIGFuIEFQUFNZTkNfSlMgcGlwZWxpbmUgcmVzb2x2ZXIgd2hvc2VcbiAgICogcmVzcG9uc2UgaGFuZGxlciBjb252ZXJ0cyB0aGUgZXJyb3JzLmFwcHN5bmMuKiBlbnZlbG9wZSByZXR1cm5lZCBieVxuICAgKiBjcmVhdGVBcHBTeW5jSGFuZGxlciBpbnRvIGEgdHlwZWQgR3JhcGhRTCBlcnJvci5cbiAgICpcbiAgICogVW50eXBlZCBlcnJvcnMgc3RpbGwgZmFpbCB0aGUgaW52b2NhdGlvbiwgYW5kIHRoZSBwaXBlbGluZSBmdW5jdGlvbiByYWlzZXNcbiAgICogdGhlbSBhcyBHcmFwaFFMIGVycm9ycyB3aXRoIEFwcFN5bmMncyBpbnZva2UgZXJyb3IgdHlwZSAoZS5nLlxuICAgKiBgTGFtYmRhOlVuaGFuZGxlZGApLCBhcyBhIFVOSVQgZGlyZWN0LUxhbWJkYSByZXNvbHZlciBkb2VzLlxuICAgKlxuICAgKiBXaGVuIGZhbHNlICh0aGUgZGVmYXVsdCksIGFkZExhbWJkYVJlc29sdmVyIHN5bnRoZXNpemVzIGEgcGxhaW4gVU5JVFxuICAgKiBkaXJlY3QtTGFtYmRhIHJlc29sdmVyICh0aGUgcHJlLSMzODUgYmVoYXZpb3IpIHdpdGggbm8gcmVzcG9uc2UgaGFuZGxlci5cbiAgICogVGhlIExhbWJkYSBnZXRzIG5vIEFQUFNZTkNfVFlQRURfRVJST1JTIGZsYWcsIHNvIGNyZWF0ZUFwcFN5bmNIYW5kbGVyXG4gICAqIHJldGhyb3dzIGFuIEFwcFN5bmNFcnJvciBhbmQgQXBwU3luYyByZXBvcnRzIGl0IGFzIGBMYW1iZGE6VW5oYW5kbGVkYFxuICAgKiB3aXRob3V0IHRoZSB0eXBlZCBlcnJvclR5cGUgYW5kIGVycm9ySW5mby5cbiAgICpcbiAgICogVGhpcyBmbGFnIGFwcGxpZXMgdG8gQUxMIExhbWJkYSByZXNvbHZlcnMgb24gdGhlIEFQSS4gRW5hYmxpbmcgaXQgY2hhbmdlc1xuICAgKiB0aGUgcmVzb2x2ZXIgdG9wb2xvZ3kgZnJvbSBVTklUIHRvIFBJUEVMSU5FLCB3aGljaCBwcm9kdWNlcyBhIGNkayBkaWZmIGZvclxuICAgKiBldmVyeSBMYW1iZGEgcmVzb2x2ZXIsIHNvIG9wdCBpbiBkZWxpYmVyYXRlbHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB0eXBlZEVycm9ycz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGFtYmRhUmVzb2x2ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHNldCwgYWRkTGFtYmRhUmVzb2x2ZXIgd2lyZXMgYW4gQXBwU3luYyBCYXRjaEludm9rZSByZXNvbHZlciBpbnN0ZWFkIG9mIGFcbiAgICogc2luZ2xlIGludm9rZS4gVGhlIGdlbmVyYXRlZCBVTklUIHJlc29sdmVyIGdldHMgTWF4QmF0Y2hTaXplIHNldCB0byB0aGlzXG4gICAqIHZhbHVlLCBhIEJhdGNoSW52b2tlIHJlcXVlc3QgdGVtcGxhdGVcbiAgICogKE1hcHBpbmdUZW1wbGF0ZS5sYW1iZGFSZXF1ZXN0KCckdXRpbHMudG9Kc29uKCRjb250ZXh0KScsICdCYXRjaEludm9rZScpKSBhbmRcbiAgICogYSBNYXBwaW5nVGVtcGxhdGUubGFtYmRhUmVzdWx0KCkgcmVzcG9uc2UgdGVtcGxhdGUsIHNvIEFwcFN5bmMgZ3JvdXBzIHVwIHRvXG4gICAqIHRoaXMgbWFueSBmaWVsZCBpbnZvY2F0aW9ucyBpbnRvIG9uZSBMYW1iZGEgY2FsbC4gUGFpciB0aGlzIHdpdGhcbiAgICogY3JlYXRlQXBwU3luY0JhdGNoSGFuZGxlciwgd2hvc2UgaGFuZGxlciByZWNlaXZlcyB0aGUgYmF0Y2hlZCBldmVudHMuXG4gICAqXG4gICAqIFdoZW4gYm90aCBtYXhCYXRjaFNpemUgYW5kIGB0eXBlZEVycm9yc2AgYXJlIHNldCwgbWF4QmF0Y2hTaXplIHdpbnMgZm9yIHRoaXNcbiAgICogZmllbGQuIFRoZSBmaWVsZCBnZXRzIHRoZSBVTklUIEJhdGNoSW52b2tlIHJlc29sdmVyIHJhdGhlciB0aGFuIHRoZVxuICAgKiB0eXBlZEVycm9ycyBBUFBTWU5DX0pTIHBpcGVsaW5lLCBiZWNhdXNlIHRoZSBCYXRjaEludm9rZSBtYXBwaW5nIHRlbXBsYXRlc1xuICAgKiBoYXZlIG5vIGVxdWl2YWxlbnQgb24gdGhhdCBwaXBlbGluZS4gVHlwZWQgZXJyb3JzIHRocm93biBieSBhIGJhdGNoIGhhbmRsZXJcbiAgICogYXJlIG5vdCBjb252ZXJ0ZWQgdG8gR3JhcGhRTCBlcnJvcnMuIFRoZXkgcmV0aHJvdyBhbmQgZmFpbCB0aGUgaW52b2NhdGlvbixcbiAgICogc28gYSBiYXRjaCBoYW5kbGVyIHNob3VsZCBub3QgcmVseSBvbiB0aGUgdHlwZWQtZXJyb3ItdG8tR3JhcGhRTC1lcnJvclxuICAgKiBjb252ZXJzaW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZCAoc2luZ2xlIGludm9rZSwgdGhlIHByZS1iYXRjaCBiZWhhdmlvdXI7IG5vIE1heEJhdGNoU2l6ZSBhbmQgbm8gbWFwcGluZyB0ZW1wbGF0ZXMpXG4gICAqL1xuICByZWFkb25seSBtYXhCYXRjaFNpemU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVnRsUmVzb2x2ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBkYXRhc291cmNlIHRoZSBWVEwgcmVzb2x2ZXIgdGFyZ2V0c1xuICAgKi9cbiAgZGF0YVNvdXJjZTogYXdzX2FwcHN5bmMuQmFzZURhdGFTb3VyY2U7XG5cbiAgLyoqXG4gICAqIHN0cmluZyByZXBsYWNlbWVudHMgdG8gcHJvY2VzcyBvbiB0aGUgVlRMXG4gICAqXG4gICAqIEBkZWZhdWx0IG5vIHZhcmlhYmxlIGV4cGFuc2lvbnNcbiAgICovXG4gIHZhcmlhYmxlcz86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEpzUmVzb2x2ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgcHV0IGludG8gdGhlIFwic3Rhc2hcIiBvZiB0aGUgcmVzb2x2ZXIgcGlwZWxpbmVcbiAgICpcbiAgICogQGRlZmF1bHQgbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgc3Rhc2hWYWx1ZXM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBuYW1lIG9mIHRoZSBwaXBlbGluZSBzdGVwcyB0byBjcmVhdGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBvbmx5IGEgZGVmYXVsdCBzdGVwIHdpbGwgYmUgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgcGlwZWxpbmVTdGVwTmFtZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpzUmVzb2x2ZXJDb25maWcge1xuICBuYW1lOiBzdHJpbmc7XG4gIGluZGV4OiBudW1iZXI7XG4gIHN0ZXBDb3VudDogbnVtYmVyO1xuICBlbnRyeUZpbGU6IHN0cmluZztcbiAgZnVuY3Rpb25JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBHcmFwaFFsQXBpIGNvbnN0cnVjdCBzZXRzIHVwIGFuIEFXUyBBcHBTeW5jIEdyYXBoUUwgQVBJIGludGVncmF0ZWQgd2l0aCBDb2duaXRvIGZvciBhdXRoZW50aWNhdGlvbiBhbmQgRHluYW1vREIgZm9yIGRhdGEgc3RvcmFnZS5cbiAqIFRoaXMgY29uc3RydWN0IGZhY2lsaXRhdGVzIHRoZSBjcmVhdGlvbiBvZiBhIEdyYXBoUUwgQVBJIHdpdGggdmFyaW91cyBjb25maWd1cmF0aW9ucywgaW5jbHVkaW5nIGN1c3RvbSBkb21haW4sIGxvZ2dpbmcsIHNjaGVtYSBkZWZpbml0aW9uLFxuICogYW5kIGF1dGhvcml6YXRpb24gdXNpbmcgQ29nbml0byBVc2VyIFBvb2wgYW5kIElkZW50aXR5IFBvb2wuIEl0IGFsc28gcHJvdmlkZXMgbWV0aG9kcyB0byBkeW5hbWljYWxseSBhZGQgcmVzb2x2ZXJzIGFuZCBncmFudCBhY2Nlc3MgdG8gc3BlY2lmaWMgZmllbGRzLlxuICpcbiAqIEB0ZW1wbGF0ZSBSRVNPTFZFUlMgLSBUaGUgdHlwZSBkZWZpbml0aW9uIGZvciB0aGUgR3JhcGhRTCByZXNvbHZlcnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGFwaSA9IG5ldyBHcmFwaFFsQXBpKHRoaXMsICdNeUdyYXBoUWxBcGknLCB7XG4gKiAgIGFwaU5hbWU6ICdNeUFQSScsXG4gKiAgIHN0YWdlTmFtZTogJ2RldicsXG4gKiAgIGRlZmluaXRpb25GaWxlTmFtZTogJ3NjaGVtYS5ncmFwaHFsJyxcbiAqICAgYXV0aGVudGljYXRpb246IG15Q29nbml0b0F1dGgsXG4gKiAgIHNpbmdsZVRhYmxlRGF0YXN0b3JlOiBteUR5bmFtb0RCVGFibGUsXG4gKiB9KTtcbiAqXG4gKiAvLyBBZGQgYSBMYW1iZGEgcmVzb2x2ZXJcbiAqIGFwaS5hZGRMYW1iZGFSZXNvbHZlcignUXVlcnknLCAnZ2V0SXRlbScpO1xuICpcbiAqIC8vIEdyYW50IGFjY2VzcyB0byB1bmF1dGhlbnRpY2F0ZWQgdXNlcnMgZm9yIGEgc3BlY2lmaWMgcXVlcnlcbiAqIGFwaS5ncmFudEFjY2Vzc1VuQXV0aCgnUXVlcnknLCAnZ2V0SXRlbScpO1xuICovXG5leHBvcnQgY2xhc3MgR3JhcGhRbEFwaTxSRVNPTFZFUlM+IGV4dGVuZHMgQmFzZUFwaSB7XG5cbiAgLyoqXG4gICAqIFRoZSBBV1MgQXBwU3luYyBHcmFwaFFMIEFQSSBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhcGk6IGF3c19hcHBzeW5jLkdyYXBocWxBcGk7XG5cbiAgLyoqXG4gICAqIFRoZSBvcHRpb25hbCBEeW5hbW9EQiBkYXRhIHNvdXJjZSBmb3IgdGhlIEdyYXBoUUwgQVBJLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhYmxlRGF0YVNvdXJjZT86IGF3c19hcHBzeW5jLkR5bmFtb0RiRGF0YVNvdXJjZTtcblxuICAvKipcbiAgICogQSBjb2xsZWN0aW9uIG9mIExhbWJkYSBmdW5jdGlvbnMgdXNlZCBhcyByZXNvbHZlcnMgZm9yIHRoZSBHcmFwaFFMIEFQSS5cbiAgICovXG4gIHByaXZhdGUgX2Z1bmN0aW9uczogeyBbb3BlcmF0aW9uSWQ6IHN0cmluZ106IExhbWJkYUZ1bmN0aW9uIH0gPSB7fTtcblxuICAvKipcbiAgICogTmVzdGVkIHN0YWNrcyBmb3IgcmVzb2x2ZXJzLCBncm91cGVkIGJ5IHR5cGUgbmFtZS5cbiAgICogT25seSB1c2VkIHdoZW4gdXNlTmVzdGVkU3RhY2tzIGlzIHRydWUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG5lc3RlZFN0YWNrczogeyBbdHlwZU5hbWU6IHN0cmluZ106IE5lc3RlZFN0YWNrIH0gPSB7fTtcblxuICAvKipcbiAgICogVGhlIENvZ25pdG8gYXV0aGVudGljYXRpb24gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY29nbml0b0F1dGg6IENvZ25pdG9BdXRoZW50aWNhdGlvbjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBHcmFwaFFsQXBpLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBUaGUgc2NvcGUgaW4gd2hpY2ggdGhpcyBjb25zdHJ1Y3QgaXMgZGVmaW5lZC5cbiAgICogQHBhcmFtIGlkIC0gVGhlIHNjb3BlZCBjb25zdHJ1Y3QgSUQuXG4gICAqIEBwYXJhbSBwcm9wcyAtIFRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBHcmFwaFFsQXBpIGNvbnN0cnVjdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IEdyYXBoUWxBcGlQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgdGhpcy5jb2duaXRvQXV0aCA9IHByb3BzLmF1dGhlbnRpY2F0aW9uIGFzIENvZ25pdG9BdXRoZW50aWNhdGlvbjtcblxuICAgIGxldCBjdXN0b21Eb21haW5OYW1lOiBhd3NfYXBwc3luYy5Eb21haW5PcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmFwaUZRRE4pIHtcbiAgICAgIGN1c3RvbURvbWFpbk5hbWUgPSB7XG4gICAgICAgIGRvbWFpbk5hbWU6IHRoaXMuYXBpRlFETixcbiAgICAgICAgY2VydGlmaWNhdGU6IG5ldyBhd3NfY2VydGlmaWNhdGVtYW5hZ2VyLkRuc1ZhbGlkYXRlZENlcnRpZmljYXRlKHRoaXMsICdDZXJ0Jywge1xuICAgICAgICAgIGhvc3RlZFpvbmU6IHRoaXMuaG9zdGVkWm9uZSEsXG4gICAgICAgICAgcmVnaW9uOiAndXMtZWFzdC0xJyxcbiAgICAgICAgICBkb21haW5OYW1lOiB0aGlzLmFwaUZRRE4sXG4gICAgICAgICAgdmFsaWRhdGlvbjogYXdzX2NlcnRpZmljYXRlbWFuYWdlci5DZXJ0aWZpY2F0ZVZhbGlkYXRpb24uZnJvbURucyh0aGlzLmhvc3RlZFpvbmUpLFxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsICdHcmFwaFFsQXBpRG9tYWluTmFtZScsIHtcbiAgICAgICAga2V5OiBgJHt0aGlzLnByb3BzLmFwaU5hbWV9JHtDRk5fT1VUUFVUX1NVRkZJWF9HUkFQSFFMX0RPTUFJTk5BTUV9YCxcbiAgICAgICAgdmFsdWU6IHRoaXMuYXBpRlFETixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuYXBpID0gbmV3IGF3c19hcHBzeW5jLkdyYXBocWxBcGkodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgbmFtZTogYCR7cHJvcHMuYXBpTmFtZX0gWyR7cHJvcHMuc3RhZ2VOYW1lfV1gLFxuICAgICAgbG9nQ29uZmlnOiB7XG4gICAgICAgIGZpZWxkTG9nTGV2ZWw6IGF3c19hcHBzeW5jLkZpZWxkTG9nTGV2ZWwuQUxMLFxuICAgICAgICByZXRlbnRpb246IGF3c19sb2dzLlJldGVudGlvbkRheXMuVFdPX01PTlRIUyxcbiAgICAgIH0sXG4gICAgICBzY2hlbWE6IGF3c19hcHBzeW5jLlNjaGVtYUZpbGUuZnJvbUFzc2V0KHByb3BzLmRlZmluaXRpb25GaWxlTmFtZSksXG4gICAgICBkb21haW5OYW1lOiBjdXN0b21Eb21haW5OYW1lLFxuICAgICAgLi4udGhpcy5jb2duaXRvQXV0aCAmJiB7XG4gICAgICAgIGF1dGhvcml6YXRpb25Db25maWc6IHtcbiAgICAgICAgICBhZGRpdGlvbmFsQXV0aG9yaXphdGlvbk1vZGVzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGF1dGhvcml6YXRpb25UeXBlOiBhd3NfYXBwc3luYy5BdXRob3JpemF0aW9uVHlwZS5VU0VSX1BPT0wsXG4gICAgICAgICAgICAgIHVzZXJQb29sQ29uZmlnOiB7XG4gICAgICAgICAgICAgICAgdXNlclBvb2w6IHRoaXMuY29nbml0b0F1dGgudXNlcnBvb2wsXG4gICAgICAgICAgICAgICAgZGVmYXVsdEFjdGlvbjogYXdzX2FwcHN5bmMuVXNlclBvb2xEZWZhdWx0QWN0aW9uLkRFTlksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4udGhpcy5jb2duaXRvQXV0aC5pZGVudGl0eVBvb2wgPyBbeyBhdXRob3JpemF0aW9uVHlwZTogYXdzX2FwcHN5bmMuQXV0aG9yaXphdGlvblR5cGUuSUFNIH1dIDogW10sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKGN1c3RvbURvbWFpbk5hbWUgJiYgdGhpcy5hcGkuYXBwU3luY0RvbWFpbk5hbWUpIHtcbiAgICAgIG5ldyBhd3Nfcm91dGU1My5DbmFtZVJlY29yZCh0aGlzLCAnRG5zUmVjb3JkJywge1xuICAgICAgICB6b25lOiB0aGlzLmhvc3RlZFpvbmUhLFxuICAgICAgICByZWNvcmROYW1lOiBjdXN0b21Eb21haW5OYW1lLmRvbWFpbk5hbWUsXG4gICAgICAgIGRvbWFpbk5hbWU6IHRoaXMuYXBpLmFwcFN5bmNEb21haW5OYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gaWYgKChwcm9wcy5tb25pdG9yaW5nID8/IHRydWUpICYmIHRoaXMubW9uaXRvcmluZykge1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmFwaUVycm9yc1dpZGdldC5hZGRMZWZ0TWV0cmljKG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgLy8gICAgIG5hbWVzcGFjZTogJ0FXUy9BcHBTeW5jJyxcbiAgICAvLyAgICAgbWV0cmljTmFtZTogJzVYWEVycm9yJyxcbiAgICAvLyAgICAgZGltZW5zaW9uc01hcDoge1xuICAgIC8vICAgICAgIEdyYXBoUUxBUElJZDogdGhpcy5hcGkuYXBpSWQsXG4gICAgLy8gICAgIH0sXG4gICAgLy8gICAgIHN0YXRpc3RpYzogJ3N1bScsXG4gICAgLy8gICB9KSk7XG4gICAgLy8gICB0aGlzLm1vbml0b3JpbmcuYXBpRXJyb3JzV2lkZ2V0LmFkZExlZnRNZXRyaWMobmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAvLyAgICAgbmFtZXNwYWNlOiAnQVdTL0FwcFN5bmMnLFxuICAgIC8vICAgICBtZXRyaWNOYW1lOiAnNFhYRXJyb3InLFxuICAgIC8vICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgLy8gICAgICAgR3JhcGhRTEFQSUlkOiB0aGlzLmFwaS5hcGlJZCxcbiAgICAvLyAgICAgfSxcbiAgICAvLyAgICAgc3RhdGlzdGljOiAnc3VtJyxcbiAgICAvLyAgIH0pKTtcbiAgICAvLyAgIHRoaXMubW9uaXRvcmluZy5hcGlMYXRlbmN5V2lkZ2V0LmFkZExlZnRNZXRyaWMobmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAvLyAgICAgbmFtZXNwYWNlOiAnQVdTL0FwcFN5bmMnLFxuICAgIC8vICAgICBtZXRyaWNOYW1lOiAnTGF0ZW5jeScsXG4gICAgLy8gICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAvLyAgICAgICBHcmFwaFFMQVBJSWQ6IHRoaXMuYXBpLmFwaUlkLFxuICAgIC8vICAgICB9LFxuICAgIC8vICAgICBzdGF0aXN0aWM6ICdBdmVyYWdlJyxcbiAgICAvLyAgIH0pKTtcbiAgICAvLyAgIHRoaXMubW9uaXRvcmluZy5hcGlMYXRlbmN5V2lkZ2V0LmFkZExlZnRNZXRyaWMobmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAvLyAgICAgbmFtZXNwYWNlOiAnQVdTL0FwcFN5bmMnLFxuICAgIC8vICAgICBtZXRyaWNOYW1lOiAnTGF0ZW5jeScsXG4gICAgLy8gICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAvLyAgICAgICBHcmFwaFFMQVBJSWQ6IHRoaXMuYXBpLmFwaUlkLFxuICAgIC8vICAgICB9LFxuICAgIC8vICAgICBzdGF0aXN0aWM6ICdwOTAnLFxuICAgIC8vICAgfSkpO1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmFwaUxhdGVuY3lUYWlsV2lkZ2V0LmFkZExlZnRNZXRyaWMobmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAvLyAgICAgbmFtZXNwYWNlOiAnQVdTL0FwcFN5bmMnLFxuICAgIC8vICAgICBtZXRyaWNOYW1lOiAnTGF0ZW5jeScsXG4gICAgLy8gICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAvLyAgICAgICBHcmFwaFFMQVBJSWQ6IHRoaXMuYXBpLmFwaUlkLFxuICAgIC8vICAgICB9LFxuICAgIC8vICAgICBzdGF0aXN0aWM6ICdwOTUnLFxuICAgIC8vICAgfSkpO1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmFwaUxhdGVuY3lUYWlsV2lkZ2V0LmFkZExlZnRNZXRyaWMobmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAvLyAgICAgbmFtZXNwYWNlOiAnQVdTL0FwcFN5bmMnLFxuICAgIC8vICAgICBtZXRyaWNOYW1lOiAnTGF0ZW5jeScsXG4gICAgLy8gICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAvLyAgICAgICBHcmFwaFFMQVBJSWQ6IHRoaXMuYXBpLmFwaUlkLFxuICAgIC8vICAgICB9LFxuICAgIC8vICAgICBzdGF0aXN0aWM6ICdwOTknLFxuICAgIC8vICAgfSkpO1xuICAgIC8vIH1cblxuICAgIGlmIChwcm9wcy5zaW5nbGVUYWJsZURhdGFzdG9yZSkge1xuICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UgPSBuZXcgYXdzX2FwcHN5bmMuRHluYW1vRGJEYXRhU291cmNlKHRoaXMsICdTaW5nbGVUYWJsZVNvdXJjZScsIHtcbiAgICAgICAgYXBpOiB0aGlzLmFwaSxcbiAgICAgICAgdGFibGU6IHByb3BzLnNpbmdsZVRhYmxlRGF0YXN0b3JlPy50YWJsZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgcHVibGljIGdyYW50QWNjZXNzPFRZUEUgZXh0ZW5kcyBrZXlvZiBSRVNPTFZFUlMsIEZJRUxEVFlQRSBleHRlbmRzIE5vbk51bGxhYmxlPFJFU09MVkVSU1tUWVBFXT4+KFxuICAgIGdyYW50ZWU6IGF3c19pYW0uSUdyYW50YWJsZSxcbiAgICB0eXBlTmFtZTogVFlQRSxcbiAgICAuLi5maWVsZE5hbWVzOiAoa2V5b2YgRklFTERUWVBFKVtdKTogdm9pZCB7XG4gICAgdGhpcy5hcGkuZ3JhbnQoZ3JhbnRlZSwgYXdzX2FwcHN5bmMuSWFtUmVzb3VyY2Uub2ZUeXBlKHR5cGVOYW1lIGFzIHN0cmluZywgLi4uZmllbGROYW1lcyBhcyBzdHJpbmdbXSksICdhcHBzeW5jOkdyYXBoUUwnKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgcHVibGljIGdyYW50QWNjZXNzVW5BdXRoPFRZUEUgZXh0ZW5kcyBrZXlvZiBSRVNPTFZFUlMsIEZJRUxEVFlQRSBleHRlbmRzIE5vbk51bGxhYmxlPFJFU09MVkVSU1tUWVBFXT4+KFxuICAgIHR5cGVOYW1lOiBUWVBFLFxuICAgIC4uLmZpZWxkTmFtZXM6IChrZXlvZiBGSUVMRFRZUEUpW11cbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvZ25pdG9BdXRoLmlkZW50aXR5UG9vbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZ3JhbnQgdG8gQ29nbml0byBpZGVudGl0eSBwb29sIGFzIG5vbmUgaXMgcHJvdmlkZWQnKTtcbiAgICB9XG4gICAgdGhpcy5ncmFudEFjY2Vzcyh0aGlzLmNvZ25pdG9BdXRoLmlkZW50aXR5UG9vbC51bmF1dGhlbnRpY2F0ZWRSb2xlLCB0eXBlTmFtZSwgLi4uZmllbGROYW1lcyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICovXG4gIHB1YmxpYyBncmFudEFjY2Vzc0F1dGg8VFlQRSBleHRlbmRzIGtleW9mIFJFU09MVkVSUywgRklFTERUWVBFIGV4dGVuZHMgTm9uTnVsbGFibGU8UkVTT0xWRVJTW1RZUEVdPj4oXG4gICAgdHlwZU5hbWU6IFRZUEUsXG4gICAgLi4uZmllbGROYW1lczogKGtleW9mIEZJRUxEVFlQRSlbXVxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29nbml0b0F1dGguaWRlbnRpdHlQb29sKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBncmFudCB0byBDb2duaXRvIGlkZW50aXR5IHBvb2wgYXMgbm9uZSBpcyBwcm92aWRlZCcpO1xuICAgIH1cbiAgICB0aGlzLmdyYW50QWNjZXNzKHRoaXMuY29nbml0b0F1dGguaWRlbnRpdHlQb29sLmF1dGhlbnRpY2F0ZWRSb2xlLCB0eXBlTmFtZSwgLi4uZmllbGROYW1lcyk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBnZXRGdW5jdGlvbkZvck9wZXJhdGlvblxuICAgKi9cbiAgcHVibGljIGdldEZ1bmN0aW9uRm9yT3BlcmF0aW9uPFRZUEUgZXh0ZW5kcyBrZXlvZiBSRVNPTFZFUlMsIEZJRUxEVFlQRSBleHRlbmRzIE5vbk51bGxhYmxlPFJFU09MVkVSU1tUWVBFXT4+KFxuICAgIHR5cGVOYW1lOiBUWVBFLFxuICAgIGZpZWxkTmFtZToga2V5b2YgRklFTERUWVBFLFxuICApOiBMYW1iZGFGdW5jdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Z1bmN0aW9uc1tgJHt0eXBlTmFtZSBhcyBzdHJpbmd9LiR7ZmllbGROYW1lIGFzIFN0cmluZ31gXTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRMYW1iZGFSZXNvbHZlcjxUWVBFIGV4dGVuZHMga2V5b2YgUkVTT0xWRVJTLCBGSUVMRFRZUEUgZXh0ZW5kcyBOb25OdWxsYWJsZTxSRVNPTFZFUlNbVFlQRV0+PihcbiAgICB0eXBlTmFtZTogVFlQRSxcbiAgICBmaWVsZE5hbWU6IGtleW9mIEZJRUxEVFlQRSxcbiAgICBvcHRpb25zPzogTGFtYmRhUmVzb2x2ZXJPcHRpb25zLFxuICApOiBMYW1iZGFGdW5jdGlvbiB7XG4gICAgY29uc3QgaXNCYXRjaCA9IG9wdGlvbnM/Lm1heEJhdGNoU2l6ZSAhPT0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgb3BlcmF0aW9uSWQgPSBgJHt0eXBlTmFtZSBhcyBzdHJpbmd9LiR7ZmllbGROYW1lIGFzIFN0cmluZ31gO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gYFR5cGUgJHt0eXBlTmFtZSBhcyBzdHJpbmd9IEZpZWxkICR7ZmllbGROYW1lIGFzIFN0cmluZ30gUmVzb2x2ZXJgO1xuXG4gICAgY29uc3QgZW50cnlGaWxlID0gYC4vc3JjL2xhbWJkYS8ke29wZXJhdGlvbklkfS50c2A7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGVudHJ5RmlsZSkpIHtcbiAgICAgIGZzLm1rZGlyU3luYygnLi9zcmMvbGFtYmRhLycsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgdGhpcy5jcmVhdGVFbnRyeUZpbGUoZW50cnlGaWxlLCB0eXBlTmFtZSBhcyBzdHJpbmcsIGZpZWxkTmFtZSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5nZXRTY29wZUZvclR5cGVOYW1lKHR5cGVOYW1lIGFzIHN0cmluZyk7XG5cbiAgICBjb25zdCBmbiA9IG5ldyBMYW1iZGFGdW5jdGlvbihzY29wZSwgYEZuJHtvcGVyYXRpb25JZH1gLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMucHJvcHMuc3RhZ2VOYW1lLFxuICAgICAgYWRkaXRpb25hbEVudjogdGhpcy5wcm9wcy5hZGRpdGlvbmFsRW52LFxuICAgICAgZW50cnk6IGVudHJ5RmlsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgWyR7dGhpcy5wcm9wcy5zdGFnZU5hbWV9XSAke2Rlc2NyaXB0aW9ufWAsXG4gICAgICAuLi50aGlzLnByb3BzLmF1dGhlbnRpY2F0aW9uICYmIHtcbiAgICAgICAgdXNlclBvb2w6ICh0aGlzLnByb3BzLmF1dGhlbnRpY2F0aW9uIGFzIENvZ25pdG9BdXRoZW50aWNhdGlvbikudXNlcnBvb2wsXG4gICAgICB9LFxuICAgICAgLi4udGhpcy5wcm9wcy5zaW5nbGVUYWJsZURhdGFzdG9yZSAmJiB7XG4gICAgICAgIHRhYmxlOiB0aGlzLnByb3BzLnNpbmdsZVRhYmxlRGF0YXN0b3JlLnRhYmxlLFxuICAgICAgICB0YWJsZVdyaXRlczogdHlwZU5hbWUgPT09ICdNdXRhdGlvbicsXG4gICAgICB9LFxuICAgICAgLi4udGhpcy5wcm9wcy5hc3NldENkbiAmJiB7XG4gICAgICAgIGFzc2V0RG9tYWluTmFtZTogdGhpcy5wcm9wcy5hc3NldENkbi5hc3NldERvbWFpbk5hbWUsXG4gICAgICAgIGFzc2V0QnVja2V0OiB0aGlzLnByb3BzLmFzc2V0Q2RuLmFzc2V0QnVja2V0LFxuICAgICAgfSxcbiAgICAgIGxhbWJkYU9wdGlvbnM6IHRoaXMucHJvcHMubGFtYmRhT3B0aW9ucyxcbiAgICAgIGxhbWJkYVRyYWNpbmc6IHRoaXMucHJvcHMubGFtYmRhVHJhY2luZyxcbiAgICB9KTtcbiAgICB0aGlzLl9mdW5jdGlvbnNbb3BlcmF0aW9uSWRdID0gZm47XG4gICAgVGFncy5vZihmbikuYWRkKCdHcmFwaFFMJywgZGVzY3JpcHRpb24pO1xuXG4gICAgLy8gaWYgKHRoaXMubW9uaXRvcmluZykge1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmxhbWJkYUR1cmF0aW9uc1dpZGdldC5hZGRMZWZ0TWV0cmljKGZuLm1ldHJpY0R1cmF0aW9uKCkpO1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmxhbWJkYUludm9rZXNXaWRnZXQuYWRkTGVmdE1ldHJpYyhmbi5tZXRyaWNJbnZvY2F0aW9ucygpKTtcbiAgICAvLyAgIHRoaXMubW9uaXRvcmluZy5sYW1iZGFFcnJvcnNXaWRnZXQuYWRkTGVmdE1ldHJpYyhmbi5tZXRyaWNFcnJvcnMoKSk7XG4gICAgLy8gICB0aGlzLm1vbml0b3JpbmcubGFtYmRhRXJyb3JzV2lkZ2V0LmFkZExlZnRNZXRyaWMoZm4ubWV0cmljVGhyb3R0bGVzKCkpO1xuICAgIC8vIH1cblxuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgYXdzX2FwcHN5bmMuTGFtYmRhRGF0YVNvdXJjZShzY29wZSwgYExhbWJkYURTJHtvcGVyYXRpb25JZH1gLCB7XG4gICAgICBhcGk6IHRoaXMuYXBpLFxuICAgICAgbmFtZTogYExhbWJkYV8ke3R5cGVOYW1lIGFzIHN0cmluZ31fJHtmaWVsZE5hbWUgYXMgU3RyaW5nfWAsXG4gICAgICBsYW1iZGFGdW5jdGlvbjogZm4sXG4gICAgfSk7XG5cbiAgICBpZiAoaXNCYXRjaCkge1xuICAgICAgLy8gQSBiYXRjaCBmaWVsZCBhbHdheXMgdGFrZXMgdGhlIFVOSVQgQmF0Y2hJbnZva2UgcGF0aCwgZXZlbiB3aGVuIHRoZSBBUElcbiAgICAgIC8vIGhhcyB0eXBlZEVycm9ycyBlbmFibGVkLiBtYXhCYXRjaFNpemUgd2lucyBvdmVyIHR5cGVkRXJyb3JzIGZvciB0aGlzXG4gICAgICAvLyBmaWVsZCBiZWNhdXNlIHRoZSBCYXRjaEludm9rZSBtYXBwaW5nIHRlbXBsYXRlcyBoYXZlIG5vIGVxdWl2YWxlbnQgb25cbiAgICAgIC8vIHRoZSBBUFBTWU5DX0pTIHBpcGVsaW5lIHJlc29sdmVyLiBBcHBTeW5jIGJhdGNoZXMgdXAgdG8gbWF4QmF0Y2hTaXplXG4gICAgICAvLyBmaWVsZCBpbnZvY2F0aW9ucyBpbnRvIGEgc2luZ2xlIExhbWJkYSBjYWxsIGhhbmRsZWQgYnlcbiAgICAgIC8vIGNyZWF0ZUFwcFN5bmNCYXRjaEhhbmRsZXIuIFRoZSBMMiBCYXNlUmVzb2x2ZXJQcm9wcy5tYXhCYXRjaFNpemUgc2V0c1xuICAgICAgLy8gTWF4QmF0Y2hTaXplIGRpcmVjdGx5LCBzbyBubyBlc2NhcGUgaGF0Y2ggaXMgbmVlZGVkLlxuICAgICAgLy9cbiAgICAgIC8vIEFQUFNZTkNfVFlQRURfRVJST1JTIGlzIGludGVudGlvbmFsbHkgbm90IHNldCBoZXJlLiBBIGJhdGNoIGhhbmRsZXIgdGhhdFxuICAgICAgLy8gdGhyb3dzIGEgdHlwZWQgZXJyb3IgcmV0aHJvd3MgYW5kIGZhaWxzIHRoZSBpbnZvY2F0aW9uIGxvdWRseSBpbnN0ZWFkIG9mXG4gICAgICAvLyBoYXZpbmcgdGhlIGVycm9yIGVudmVsb3BlIHJldHVybmVkIGFzIGZpZWxkIGRhdGEuXG4gICAgICBuZXcgYXdzX2FwcHN5bmMuUmVzb2x2ZXIoc2NvcGUsIGBSZXNvbHZlciR7b3BlcmF0aW9uSWR9YCwge1xuICAgICAgICBhcGk6IHRoaXMuYXBpLFxuICAgICAgICB0eXBlTmFtZTogdHlwZU5hbWUgYXMgc3RyaW5nLFxuICAgICAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSBhcyBzdHJpbmcsXG4gICAgICAgIGRhdGFTb3VyY2UsXG4gICAgICAgIG1heEJhdGNoU2l6ZTogb3B0aW9ucyEubWF4QmF0Y2hTaXplLFxuICAgICAgICByZXF1ZXN0TWFwcGluZ1RlbXBsYXRlOiBhd3NfYXBwc3luYy5NYXBwaW5nVGVtcGxhdGUubGFtYmRhUmVxdWVzdCgnJHV0aWxzLnRvSnNvbigkY29udGV4dCknLCAnQmF0Y2hJbnZva2UnKSxcbiAgICAgICAgcmVzcG9uc2VNYXBwaW5nVGVtcGxhdGU6IGF3c19hcHBzeW5jLk1hcHBpbmdUZW1wbGF0ZS5sYW1iZGFSZXN1bHQoKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5wcm9wcy50eXBlZEVycm9ycykge1xuICAgICAgLy8gRGVmYXVsdCAocHJlLSMzODUpIHNoYXBlOiBhIHBsYWluIFVOSVQgcmVzb2x2ZXIgd2l0aCB0aGUgTGFtYmRhIGRhdGFcbiAgICAgIC8vIHNvdXJjZSBzZXQgZGlyZWN0bHkuIE5vIHJlc3BvbnNlIGhhbmRsZXIsIHNvIHRoZSBlcnJvciBlbnZlbG9wZSBmcm9tXG4gICAgICAvLyBjcmVhdGVBcHBTeW5jSGFuZGxlciB3b3VsZCBiZSBzdXJmYWNlZCBhcyBmaWVsZCBkYXRhIHJhdGhlciB0aGFuIGFcbiAgICAgIC8vIEdyYXBoUUwgZXJyb3IuIE9wdCBpbiB2aWEgYHR5cGVkRXJyb3JzOiB0cnVlYCB0byBnZXQgdGhlIHBpcGVsaW5lIGJlbG93LlxuICAgICAgbmV3IGF3c19hcHBzeW5jLlJlc29sdmVyKHNjb3BlLCBgUmVzb2x2ZXIke29wZXJhdGlvbklkfWAsIHtcbiAgICAgICAgYXBpOiB0aGlzLmFwaSxcbiAgICAgICAgdHlwZU5hbWU6IHR5cGVOYW1lIGFzIHN0cmluZyxcbiAgICAgICAgZmllbGROYW1lOiBmaWVsZE5hbWUgYXMgc3RyaW5nLFxuICAgICAgICBkYXRhU291cmNlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZm47XG4gICAgfVxuXG4gICAgLy8gQ291cGxlIHRoZSBoYW5kbGVyIHRvIHRoaXMgcGlwZWxpbmUuIGNyZWF0ZUFwcFN5bmNIYW5kbGVyIHJldHVybnMgdGhlXG4gICAgLy8gZXJyb3IgZW52ZWxvcGUgb25seSB3aGVuIEFQUFNZTkNfVFlQRURfRVJST1JTID09PSAndHJ1ZSc7IG90aGVyd2lzZSBpdFxuICAgIC8vIHJldGhyb3dzIHRoZSB0eXBlZCBlcnJvci4gSW5qZWN0IHRoZSBmbGFnIGhlcmUgKGFuZCBvbmx5IGhlcmUpIHNvIHRoZVxuICAgIC8vIGVudmVsb3BlIGJlaGF2aW9yIGlzIGFjdGl2ZSBleGFjdGx5IG9uIHRoZSBwYXRoIHRoYXQgaGFzIHRoZSByZXNwb25zZVxuICAgIC8vIGhhbmRsZXIgdG8gaW50ZXJwcmV0IGl0LiBUaGUgZGVmYXVsdCBVTklUIHBhdGggYWJvdmUgbGVhdmVzIHRoZSBlbnYgdmFyXG4gICAgLy8gdW5zZXQsIHNvIGEgaGFuZGxlciB0aGF0IHRocm93cyBhbiBBcHBTeW5jRXJyb3IgdGhlcmUgZmFpbHMgbG91ZGx5LlxuICAgIGZuLmFkZEVudmlyb25tZW50KCdBUFBTWU5DX1RZUEVEX0VSUk9SUycsICd0cnVlJyk7XG5cbiAgICAvLyBUaGUgTGFtYmRhIGludm9rZSBydW5zIGFzIGEgcGlwZWxpbmUgZnVuY3Rpb24gKGEgc2luZ2xlIEludm9rZSBwYXNzdGhyb3VnaCksXG4gICAgLy8gYW5kIHRoZSByZXNvbHZlcidzIHJlc3BvbnNlIGhhbmRsZXIgaW50ZXJwcmV0cyB0aGUgZXJyb3IgZW52ZWxvcGUgdGhhdFxuICAgIC8vIGNyZWF0ZUFwcFN5bmNIYW5kbGVyIHJldHVybnMuIEEgZGlyZWN0LUxhbWJkYSByZXNvbHZlciB3aXRob3V0IGEgcmVzcG9uc2VcbiAgICAvLyBoYW5kbGVyIHdvdWxkIHN1cmZhY2UgdGhlIHsgZGF0YSwgZXJyb3JUeXBlLCBlcnJvck1lc3NhZ2UsIGVycm9ySW5mbyB9XG4gICAgLy8gZW52ZWxvcGUgYXMgcGxhaW4gZmllbGQgZGF0YSwgc28gdGhlIHR5cGVkIGVycm9ycy5hcHBzeW5jLiogZXJyb3JzIG9ubHlcbiAgICAvLyBiZWNvbWUgR3JhcGhRTCBlcnJvcnMgYmVjYXVzZSBvZiB0aGUgcmVzcG9uc2UgaGFuZGxlciBhdHRhY2hlZCBiZWxvdy5cbiAgICBjb25zdCBpbnZva2VGdW5jdGlvbiA9IG5ldyBhd3NfYXBwc3luYy5BcHBzeW5jRnVuY3Rpb24oc2NvcGUsIGBMYW1iZGFGbiR7b3BlcmF0aW9uSWR9YCwge1xuICAgICAgYXBpOiB0aGlzLmFwaSxcbiAgICAgIG5hbWU6IGBMYW1iZGFfJHsodHlwZU5hbWUgYXMgc3RyaW5nKS5yZXBsYWNlKC9bXkEtWmEtejAtOV0vZywgJycpfV8keyhmaWVsZE5hbWUgYXMgU3RyaW5nKS5yZXBsYWNlKC9bXkEtWmEtejAtOV0vZywgJycpfWAsXG4gICAgICBkYXRhU291cmNlLFxuICAgICAgcnVudGltZTogYXdzX2FwcHN5bmMuRnVuY3Rpb25SdW50aW1lLkpTXzFfMF8wLFxuICAgICAgY29kZTogYXdzX2FwcHN5bmMuQ29kZS5mcm9tSW5saW5lKGBpbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGF3cy1hcHBzeW5jL3V0aWxzJztcblxuLy8gSW52b2tlIHRoZSBMYW1iZGEgZGF0YSBzb3VyY2Ugd2l0aCB0aGUgZnVsbCByZXNvbHZlciBjb250ZXh0IGFzIHRoZSBwYXlsb2FkLlxuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3QoY3R4KSB7XG4gIHJldHVybiB7XG4gICAgb3BlcmF0aW9uOiAnSW52b2tlJyxcbiAgICBwYXlsb2FkOiBjdHgsXG4gIH07XG59XG5cbi8vIEEgZmFpbGVkIGludm9rZSAoYW4gdW50eXBlZCBlcnJvciByZXRocm93biBieSBjcmVhdGVBcHBTeW5jSGFuZGxlciwgYSB0aW1lb3V0LFxuLy8gYSBtaXNzaW5nIHBlcm1pc3Npb24pIGxhbmRzIGluIHRoaXMgZnVuY3Rpb24ncyBjdHguZXJyb3IuIEFwcFN5bmMgZHJvcHMgaXRcbi8vIHVubGVzcyB0aGlzIGhhbmRsZXIgcmFpc2VzIGl0LCBhbmQgdGhlIGZpZWxkIHdvdWxkIHJlc29sdmUgdG8gbnVsbCB3aXRoIG5vXG4vLyBHcmFwaFFMIGVycm9yLiBSYWlzZSBpdCB3aXRoIHRoZSBzYW1lIG1lc3NhZ2UgYW5kIHR5cGUgYSBVTklUIGRpcmVjdC1MYW1iZGFcbi8vIHJlc29sdmVyIHJlcG9ydHMuIE90aGVyd2lzZSBwYXNzIHRoZSByZXN1bHQgdGhyb3VnaDsgdGhlIHJlc29sdmVyIHJlc3BvbnNlXG4vLyBoYW5kbGVyIGNvbnZlcnRzIHRoZSB0eXBlZCBlcnJvciBlbnZlbG9wZSBpbnRvIGEgR3JhcGhRTCBlcnJvci5cbmV4cG9ydCBmdW5jdGlvbiByZXNwb25zZShjdHgpIHtcbiAgaWYgKGN0eC5lcnJvcikge1xuICAgIHV0aWwuZXJyb3IoY3R4LmVycm9yLm1lc3NhZ2UsIGN0eC5lcnJvci50eXBlKTtcbiAgfVxuICByZXR1cm4gY3R4LnJlc3VsdDtcbn1cbmApLFxuICAgIH0pO1xuXG4gICAgbmV3IGF3c19hcHBzeW5jLlJlc29sdmVyKHNjb3BlLCBgUmVzb2x2ZXIke29wZXJhdGlvbklkfWAsIHtcbiAgICAgIGFwaTogdGhpcy5hcGksXG4gICAgICB0eXBlTmFtZTogdHlwZU5hbWUgYXMgc3RyaW5nLFxuICAgICAgZmllbGROYW1lOiBmaWVsZE5hbWUgYXMgc3RyaW5nLFxuICAgICAgcnVudGltZTogYXdzX2FwcHN5bmMuRnVuY3Rpb25SdW50aW1lLkpTXzFfMF8wLFxuICAgICAgcGlwZWxpbmVDb25maWc6IFtpbnZva2VGdW5jdGlvbl0sXG4gICAgICBjb2RlOiBhd3NfYXBwc3luYy5Db2RlLmZyb21JbmxpbmUoYGltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXdzLWFwcHN5bmMvdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVxdWVzdChjdHgpIHtcbiAgcmV0dXJuIHt9O1xufVxuXG4vLyBDb252ZXJ0IHRoZSBlcnJvciBlbnZlbG9wZSByZXR1cm5lZCBieSBjcmVhdGVBcHBTeW5jSGFuZGxlciBpbnRvIGEgR3JhcGhRTCBlcnJvci5cbi8vIHV0aWwuZXJyb3IgLyB1dGlsLmFwcGVuZEVycm9yIHRha2UgKG1lc3NhZ2UsIGVycm9yVHlwZSwgZGF0YSwgZXJyb3JJbmZvKSwgc29cbi8vIGVycm9yVHlwZSBhbmQgZXJyb3JJbmZvIHJlYWNoIHRoZSBjbGllbnQuIFdpdGhvdXQgdGhpcywgQXBwU3luYyB3b3VsZCBzdXJmYWNlXG4vLyB0aGUgZW52ZWxvcGUgb2JqZWN0IGFzIHRoZSBmaWVsZCByZXN1bHQgaW5zdGVhZCBvZiBhcyBhIEdyYXBoUUwgZXJyb3IuXG4vL1xuLy8gVGhlIGVudmVsb3BlIGlzIHJlY29nbmlzZWQgYnkgaXRzIHJlc2VydmVkIF9fYXBwU3luY0Vycm9yIHNlbnRpbmVsIGtleSwgd2hpY2hcbi8vIGNyZWF0ZUFwcFN5bmNIYW5kbGVyIHN0YW1wcy4gQnJhbmNoaW5nIG9uIHRoZSBzZW50aW5lbCAobm90IG9uIGEgYmFyZVxuLy8gZXJyb3JNZXNzYWdlKSBtZWFucyBhIGxlZ2l0aW1hdGUgcmVzdWx0IHRoYXQgbWVyZWx5IGhhcyBhbiBlcnJvck1lc3NhZ2UgZmllbGRcbi8vIGlzIHJldHVybmVkIHVuY2hhbmdlZCBpbnN0ZWFkIG9mIGJlaW5nIG1pc3JlYWQgYXMgYSB0eXBlZCBlcnJvci5cbi8vXG4vLyBJbnZva2UtbGV2ZWwgZXJyb3JzIGFyZSByYWlzZWQgYnkgdGhlIHBpcGVsaW5lIGZ1bmN0aW9uIGl0c2VsZjogYW4gZXJyb3IgbGVmdFxuLy8gaW4gYSBmdW5jdGlvbidzIGN0eC5lcnJvciBuZXZlciByZWFjaGVzIHRoaXMgaGFuZGxlcidzIGN0eC5lcnJvci5cbmV4cG9ydCBmdW5jdGlvbiByZXNwb25zZShjdHgpIHtcbiAgY29uc3QgcmVzdWx0ID0gY3R4LnByZXYucmVzdWx0O1xuICBpZiAocmVzdWx0ICYmIHJlc3VsdC5fX2FwcFN5bmNFcnJvcikge1xuICAgIHV0aWwuZXJyb3IocmVzdWx0LmVycm9yTWVzc2FnZSwgcmVzdWx0LmVycm9yVHlwZSwgbnVsbCwgcmVzdWx0LmVycm9ySW5mbyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmApLFxuICAgIH0pO1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHB1YmxpYyBhZGREeW5hbW9EYlZ0bFJlc29sdmVyPFRZUEUgZXh0ZW5kcyBrZXlvZiBSRVNPTFZFUlMsIEZJRUxEVFlQRSBleHRlbmRzIE5vbk51bGxhYmxlPFJFU09MVkVSU1tUWVBFXT4+KFxuICAgIHR5cGVOYW1lOiBUWVBFLFxuICAgIGZpZWxkTmFtZToga2V5b2YgRklFTERUWVBFLFxuICAgIG9wdGlvbnM/OiBPbWl0PFZ0bFJlc29sdmVyT3B0aW9ucywgJ2RhdGFTb3VyY2UnPik6IHZvaWQge1xuICAgIGlmICghdGhpcy50YWJsZURhdGFTb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRHluYW1vREIgaXMgbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIHRoaXMuYWRkVnRsUmVzb2x2ZXIodHlwZU5hbWUsIGZpZWxkTmFtZSwge1xuICAgICAgZGF0YVNvdXJjZTogdGhpcy50YWJsZURhdGFTb3VyY2UsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFkZER5bmFtb0RiSlNSZXNvbHZlcjxUWVBFIGV4dGVuZHMga2V5b2YgUkVTT0xWRVJTLCBGSUVMRFRZUEUgZXh0ZW5kcyBOb25OdWxsYWJsZTxSRVNPTFZFUlNbVFlQRV0+PihcbiAgICB0eXBlTmFtZTogVFlQRSxcbiAgICBmaWVsZE5hbWU6IGtleW9mIEZJRUxEVFlQRSxcbiAgICBvcHRpb25zPzogSnNSZXNvbHZlck9wdGlvbnMpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGFibGVEYXRhU291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0R5bmFtb0RCIGlzIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICB0aGlzLmFkZEpTUmVzb2x2ZXIodHlwZU5hbWUsIGZpZWxkTmFtZSwgdGhpcy50YWJsZURhdGFTb3VyY2UsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBzdGFzaFZhbHVlczoge1xuICAgICAgICAuLi5vcHRpb25zPy5zdGFzaFZhbHVlcyA/PyB7fSxcbiAgICAgICAgdGFibGU6IHRoaXMucHJvcHMuc2luZ2xlVGFibGVEYXRhc3RvcmUhLnRhYmxlLnRhYmxlTmFtZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYWRkSlNSZXNvbHZlcjxUWVBFIGV4dGVuZHMga2V5b2YgUkVTT0xWRVJTLCBGSUVMRFRZUEUgZXh0ZW5kcyBOb25OdWxsYWJsZTxSRVNPTFZFUlNbVFlQRV0+PihcbiAgICB0eXBlTmFtZTogVFlQRSxcbiAgICBmaWVsZE5hbWU6IGtleW9mIEZJRUxEVFlQRSxcbiAgICBkYXRhU291cmNlOiBhd3NfYXBwc3luYy5CYXNlRGF0YVNvdXJjZSwgb3B0aW9ucz86IEpzUmVzb2x2ZXJPcHRpb25zKTogdm9pZCB7XG4gICAgY29uc3Qgb3BlcmF0aW9uSWQgPSBgJHt0eXBlTmFtZSBhcyBzdHJpbmd9LiR7ZmllbGROYW1lIGFzIFN0cmluZ31gO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gYFR5cGUgJHt0eXBlTmFtZSBhcyBzdHJpbmd9IEZpZWxkICR7ZmllbGROYW1lIGFzIFN0cmluZ30gUmVzb2x2ZXJgO1xuXG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLmdldFNjb3BlRm9yVHlwZU5hbWUodHlwZU5hbWUgYXMgc3RyaW5nKTtcblxuICAgIGNvbnN0IHJlc29sdmVyRGlyID0gJy4vc3JjL2pzLXJlc29sdmVyLyc7XG4gICAgY29uc3QgZnVuY3Rpb25zOiBKc1Jlc29sdmVyQ29uZmlnW10gPSBbXTtcblxuICAgIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5waXBlbGluZVN0ZXBOYW1lcyB8fCBvcHRpb25zLnBpcGVsaW5lU3RlcE5hbWVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICBmdW5jdGlvbnMucHVzaCh7XG4gICAgICAgIG5hbWU6ICdkZWZhdWx0JyxcbiAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgIHN0ZXBDb3VudDogMSxcbiAgICAgICAgZW50cnlGaWxlOiBgJHtyZXNvbHZlckRpcn0vJHtvcGVyYXRpb25JZH0udHNgLFxuICAgICAgICBmdW5jdGlvbklkOiBgSlNGdW5jdGlvbiR7b3BlcmF0aW9uSWR9YCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmdW5jdGlvbnMucHVzaCguLi5vcHRpb25zLnBpcGVsaW5lU3RlcE5hbWVzLm1hcCgobmFtZSwgaW5kZXgpID0+ICh7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGluZGV4LFxuICAgICAgICBzdGVwQ291bnQ6IG9wdGlvbnMucGlwZWxpbmVTdGVwTmFtZXMhLmxlbmd0aCxcbiAgICAgICAgZW50cnlGaWxlOiBgJHtyZXNvbHZlckRpcn0vJHtvcGVyYXRpb25JZH0uJHtuYW1lfS50c2AsXG4gICAgICAgIGZ1bmN0aW9uSWQ6IGBKU0Z1bmN0aW9uJHtvcGVyYXRpb25JZH0ke25hbWV9YCxcbiAgICAgIH0pKSk7XG4gICAgfVxuXG4gICAgY29uc3QgcGlwZWxpbmVDb25maWcgPSBbXTtcblxuICAgIGZvciAoY29uc3QgZm4gb2YgZnVuY3Rpb25zKSB7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZm4uZW50cnlGaWxlKSkge1xuICAgICAgICBmcy5ta2RpclN5bmMocmVzb2x2ZXJEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLmNyZWF0ZUpTUmVzb2x2ZXJGaWxlKGZuLCB0eXBlTmFtZSBhcyBzdHJpbmcsIGZpZWxkTmFtZSBhcyBzdHJpbmcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBqc0Z1bmN0aW9uID0gbmV3IGF3c19hcHBzeW5jLkFwcHN5bmNGdW5jdGlvbihzY29wZSwgZm4uZnVuY3Rpb25JZCwge1xuICAgICAgICBhcGk6IHRoaXMuYXBpLFxuICAgICAgICBuYW1lOiBvcGVyYXRpb25JZC5yZXBsYWNlKC9cXC4vZywgJycpLFxuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgZGF0YVNvdXJjZSxcbiAgICAgICAgY29kZTogYXdzX2FwcHN5bmMuQ29kZS5mcm9tQXNzZXQoJy4nLCB7XG4gICAgICAgICAgYXNzZXRIYXNoVHlwZTogQXNzZXRIYXNoVHlwZS5PVVRQVVQsXG4gICAgICAgICAgZGVwbG95VGltZTogdHJ1ZSxcbiAgICAgICAgICBidW5kbGluZzoge1xuICAgICAgICAgICAgaW1hZ2U6IERvY2tlckltYWdlLmZyb21SZWdpc3RyeSgnZHVtbXknKSwgLy8gV2lsbCBuZXZlciBiZSB1c2VkIGR1ZSB0byBsb2NhbCBidW5kbGluZ1xuICAgICAgICAgICAgb3V0cHV0VHlwZTogQnVuZGxpbmdPdXRwdXQuU0lOR0xFX0ZJTEUsXG4gICAgICAgICAgICBmdW5jdGlvbklkOiBmbi5mdW5jdGlvbklkLFxuICAgICAgICAgICAgbG9jYWw6IHtcbiAgICAgICAgICAgICAgdHJ5QnVuZGxlKG91dHB1dERpcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9zUGxhdGZvcm0gPSBvcy5wbGF0Zm9ybSgpO1xuICAgICAgICAgICAgICAgIGV4ZWMoXG4gICAgICAgICAgICAgICAgICBvc1BsYXRmb3JtID09PSAnd2luMzInID8gJ2NtZCcgOiAnYmFzaCcsXG4gICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIG9zUGxhdGZvcm0gPT09ICd3aW4zMicgPyAnL2MnIDogJy1jJyxcbiAgICAgICAgICAgICAgICAgICAgYGVzYnVpbGQgLS1idW5kbGUgLS1zb3VyY2VtYXA9aW5saW5lIC0tc291cmNlcy1jb250ZW50PWZhbHNlIC0tdGFyZ2V0PWVzbmV4dCAtLXBsYXRmb3JtPW5vZGUgLS1mb3JtYXQ9ZXNtIC0tZXh0ZXJuYWw6QGF3cy1hcHBzeW5jL3V0aWxzIC0tb3V0ZGlyPSR7b3V0cHV0RGlyfSAke2ZuLmVudHJ5RmlsZX1gLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52IH0sXG4gICAgICAgICAgICAgICAgICAgIHN0ZGlvOiBbIC8vIHNob3cgb3V0cHV0XG4gICAgICAgICAgICAgICAgICAgICAgJ2lnbm9yZScsIC8vIGlnbm9yZSBzdGRpb1xuICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3Muc3RkZXJyLCAvLyByZWRpcmVjdCBzdGRvdXQgdG8gc3RkZXJyXG4gICAgICAgICAgICAgICAgICAgICAgJ2luaGVyaXQnLCAvLyBpbmhlcml0IHN0ZGVyclxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHM6IG9zUGxhdGZvcm0gPT09ICd3aW4zMicsXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9IGFzIEJ1bmRsaW5nT3B0aW9ucyxcbiAgICAgICAgfSksXG4gICAgICAgIHJ1bnRpbWU6IGF3c19hcHBzeW5jLkZ1bmN0aW9uUnVudGltZS5KU18xXzBfMCxcbiAgICAgIH0pO1xuICAgICAgcGlwZWxpbmVDb25maWcucHVzaChqc0Z1bmN0aW9uKTtcbiAgICB9XG5cbiAgICBuZXcgYXdzX2FwcHN5bmMuUmVzb2x2ZXIoc2NvcGUsIGBSZXNvbHZlciR7b3BlcmF0aW9uSWR9YCwge1xuICAgICAgYXBpOiB0aGlzLmFwaSxcbiAgICAgIHR5cGVOYW1lOiB0eXBlTmFtZSBhcyBzdHJpbmcsXG4gICAgICBmaWVsZE5hbWU6IGZpZWxkTmFtZSBhcyBzdHJpbmcsXG4gICAgICBydW50aW1lOiBhd3NfYXBwc3luYy5GdW5jdGlvblJ1bnRpbWUuSlNfMV8wXzAsXG4gICAgICBwaXBlbGluZUNvbmZpZyxcbiAgICAgIGNvZGU6IGF3c19hcHBzeW5jLkNvZGUuZnJvbUlubGluZShgXG4gICAgLy8gVGhlIGJlZm9yZSBzdGVwXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3QoY3R4KSB7XG4gICAgICBjb25zb2xlLmxvZyhjdHgpO1xuJHtPYmplY3QuZW50cmllcyhvcHRpb25zPy5zdGFzaFZhbHVlcyA/PyBbXSkubWFwKHZhbCA9PiBgICAgICAgY3R4LnN0YXNoLiR7dmFsWzBdfSA9ICcke3ZhbFsxXX0nYCkuam9pbignXFxuJyl9XG4gICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICAvLyBUaGUgYWZ0ZXIgc3RlcFxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNwb25zZShjdHgpIHtcbiAgICAgIHJldHVybiBjdHgucHJldi5yZXN1bHRcbiAgICB9XG4gIGApLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFkZFZ0bFJlc29sdmVyPFRZUEUgZXh0ZW5kcyBrZXlvZiBSRVNPTFZFUlMsIEZJRUxEVFlQRSBleHRlbmRzIE5vbk51bGxhYmxlPFJFU09MVkVSU1tUWVBFXT4+KFxuICAgIHR5cGVOYW1lOiBUWVBFLFxuICAgIGZpZWxkTmFtZToga2V5b2YgRklFTERUWVBFLFxuICAgIG9wdGlvbnM6IFZ0bFJlc29sdmVyT3B0aW9ucyk6IHZvaWQge1xuICAgIGNvbnN0IG9wZXJhdGlvbklkID0gYCR7dHlwZU5hbWUgYXMgc3RyaW5nfS4ke2ZpZWxkTmFtZSBhcyBTdHJpbmd9YDtcblxuICAgIGNvbnN0IG1hcHBpbmdSZXFGaWxlID0gYC4vc3JjL3Z0bC8ke29wZXJhdGlvbklkfS5yZXEudnRsYDtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMobWFwcGluZ1JlcUZpbGUpKSB7XG4gICAgICBmcy5ta2RpclN5bmMoJy4vc3JjL3Z0bC8nLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMobWFwcGluZ1JlcUZpbGUsICcjIyBSZXF1ZXN0IG1hcHBpbmcnLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuICAgIH1cbiAgICBjb25zdCBtYXBwaW5nUmVzRmlsZSA9IGAuL3NyYy92dGwvJHtvcGVyYXRpb25JZH0ucmVzLnZ0bGA7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKG1hcHBpbmdSZXNGaWxlKSkge1xuICAgICAgZnMubWtkaXJTeW5jKCcuL3NyYy92dGwvJywgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKG1hcHBpbmdSZXNGaWxlLCAnJHV0aWwudG9Kc29uKCRjdHgucmVzdWx0KScsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLmdldFNjb3BlRm9yVHlwZU5hbWUodHlwZU5hbWUgYXMgc3RyaW5nKTtcblxuICAgIG5ldyBhd3NfYXBwc3luYy5SZXNvbHZlcihzY29wZSwgYFJlc29sdmVyJHtvcGVyYXRpb25JZH1gLCB7XG4gICAgICBhcGk6IHRoaXMuYXBpLFxuICAgICAgdHlwZU5hbWU6IHR5cGVOYW1lIGFzIHN0cmluZyxcbiAgICAgIGZpZWxkTmFtZTogZmllbGROYW1lIGFzIHN0cmluZyxcbiAgICAgIGRhdGFTb3VyY2U6IG9wdGlvbnMuZGF0YVNvdXJjZSxcbiAgICAgIHJlcXVlc3RNYXBwaW5nVGVtcGxhdGU6IGF3c19hcHBzeW5jLk1hcHBpbmdUZW1wbGF0ZS5mcm9tU3RyaW5nKHRoaXMuc3Vic3RWYXJpYWJsZXMoZnMucmVhZEZpbGVTeW5jKG1hcHBpbmdSZXFGaWxlKS50b1N0cmluZygndXRmLTgnKSwgb3B0aW9ucy52YXJpYWJsZXMpKSxcbiAgICAgIHJlc3BvbnNlTWFwcGluZ1RlbXBsYXRlOiBhd3NfYXBwc3luYy5NYXBwaW5nVGVtcGxhdGUuZnJvbVN0cmluZyh0aGlzLnN1YnN0VmFyaWFibGVzKGZzLnJlYWRGaWxlU3luYyhtYXBwaW5nUmVzRmlsZSkudG9TdHJpbmcoJ3V0Zi04JyksIG9wdGlvbnMudmFyaWFibGVzKSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgc2NvcGUgZm9yIGNyZWF0aW5nIHJlc291cmNlcyBmb3IgdGhlIGdpdmVuIHR5cGUgbmFtZS5cbiAgICogSWYgdXNlTmVzdGVkU3RhY2tzIGlzIGVuYWJsZWQsIHJldHVybnMgYSBuZXN0ZWQgc3RhY2sgZm9yIHRoZSB0eXBlIG5hbWUsXG4gICAqIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXNuJ3QgZXhpc3QuIE90aGVyd2lzZSwgcmV0dXJucyB0aGlzIGNvbnN0cnVjdC5cbiAgICpcbiAgICogUXVlcnksIE11dGF0aW9uLCBhbmQgU3Vic2NyaXB0aW9uIGVhY2ggZ2V0IHRoZWlyIG93biBuZXN0ZWQgc3RhY2suXG4gICAqIEFsbCBvdGhlciB0eXBlcyAoZmllbGQgcmVzb2x2ZXJzKSBzaGFyZSBhIHNpbmdsZSBcIkZpZWxkXCIgbmVzdGVkIHN0YWNrLlxuICAgKlxuICAgKiBAcGFyYW0gdHlwZU5hbWUgLSBUaGUgR3JhcGhRTCB0eXBlIG5hbWUgKGUuZy4sICdRdWVyeScsICdNdXRhdGlvbicsICdTdWJzY3JpcHRpb24nLCBvciBhIGN1c3RvbSB0eXBlKVxuICAgKiBAcmV0dXJucyBUaGUgY29uc3RydWN0IHRvIHVzZSBhcyBzY29wZSBmb3IgY3JlYXRpbmcgcmVzb3VyY2VzXG4gICAqL1xuICBwcml2YXRlIGdldFNjb3BlRm9yVHlwZU5hbWUodHlwZU5hbWU6IHN0cmluZyk6IENvbnN0cnVjdCB7XG4gICAgaWYgKCF0aGlzLnByb3BzLnVzZU5lc3RlZFN0YWNrcykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgY29uc3Qgcm9vdFR5cGVzID0gWydRdWVyeScsICdNdXRhdGlvbicsICdTdWJzY3JpcHRpb24nXTtcbiAgICBjb25zdCBzdGFja0tleSA9IHJvb3RUeXBlcy5pbmNsdWRlcyh0eXBlTmFtZSkgPyB0eXBlTmFtZSA6ICdGaWVsZCc7XG5cbiAgICBpZiAoIXRoaXMubmVzdGVkU3RhY2tzW3N0YWNrS2V5XSkge1xuICAgICAgdGhpcy5uZXN0ZWRTdGFja3Nbc3RhY2tLZXldID0gbmV3IE5lc3RlZFN0YWNrKHRoaXMsIGAke3N0YWNrS2V5fVJlc29sdmVyc2AsIHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBOZXN0ZWQgc3RhY2sgZm9yICR7c3RhY2tLZXl9IHJlc29sdmVyc2AsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5uZXN0ZWRTdGFja3Nbc3RhY2tLZXldO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzdFZhcmlhYmxlcyhkYXRhOiBzdHJpbmcsIHZhcnM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9ID0ge30pOiBzdHJpbmcge1xuICAgIGxldCByZXMgPSBkYXRhO1xuICAgIGZvciAoY29uc3QgbmFtZSBpbiB2YXJzKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhcnMsIG5hbWUpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdmFyc1tuYW1lXTtcbiAgICAgICAgcmVzID0gcmVzLnJlcGxhY2UobmV3IFJlZ0V4cChgXFxcXCRcXHske25hbWV9XFx9YCwgJ2cnKSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVFbnRyeUZpbGUoZW50cnlGaWxlOiBzdHJpbmcsIHR5cGVOYW1lOiBzdHJpbmcsIGZpZWxkTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYXJnVHlwZSA9IGAke3R5cGVOYW1lfSR7dXBwZXJjYXNlRmlyc3QoZmllbGROYW1lKX1BcmdzYDtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGVudHJ5RmlsZSwgYGltcG9ydCB7IGFwaSB9IGZyb20gJ2Nkay1zZXJ2ZXJsZXNzL2xpYi9sYW1iZGEnO1xuaW1wb3J0IHsgJHt0eXBlTmFtZX0sICR7YXJnVHlwZX0gfSBmcm9tICcuLi9nZW5lcmF0ZWQvZ3JhcGhxbC4ke3RoaXMucHJvcHMuYXBpTmFtZS50b0xvd2VyQ2FzZSgpfS1tb2RlbC5nZW5lcmF0ZWQnO1xuXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IGFwaS5jcmVhdGVBcHBTeW5jSGFuZGxlcjwke2FyZ1R5cGV9LCAke3R5cGVOYW1lfVsnJHtmaWVsZE5hbWV9J10+KGFzeW5jIChjdHgpID0+IHtcbiAgY3R4LmxvZ2dlci5pbmZvKEpTT04uc3RyaW5naWZ5KGN0eC5ldmVudCkpO1xuICB0aHJvdyBuZXcgRXJyb3IoJ05vdCB5ZXQgaW1wbGVtZW50ZWQnKTtcbn0pO2AsIHtcbiAgICAgIGVuY29kaW5nOiAndXRmLTgnLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVKU1Jlc29sdmVyRmlsZShmbjogSnNSZXNvbHZlckNvbmZpZywgdHlwZU5hbWU6IHN0cmluZywgZmllbGROYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhcmdUeXBlID0gYCR7dHlwZU5hbWV9JHt1cHBlcmNhc2VGaXJzdChmaWVsZE5hbWUpfUFyZ3NgO1xuICAgIGNvbnN0IHJldHVyblR5cGUgPSAoZm4uaW5kZXggPT0gKGZuLnN0ZXBDb3VudCAtIDEpKSA/IGAke3R5cGVOYW1lfVsnJHtmaWVsZE5hbWV9J11gIDogJ2FueSc7XG5cbiAgICBmcy53cml0ZUZpbGVTeW5jKGZuLmVudHJ5RmlsZSwgYGltcG9ydCB7IENvbnRleHQsIHV0aWwgfSBmcm9tICdAYXdzLWFwcHN5bmMvdXRpbHMnO1xuaW1wb3J0IHsgJHt0eXBlTmFtZX0sICR7YXJnVHlwZX0gfSBmcm9tICcuLi9nZW5lcmF0ZWQvZ3JhcGhxbC4ke3RoaXMucHJvcHMuYXBpTmFtZS50b0xvd2VyQ2FzZSgpfS1tb2RlbC5nZW5lcmF0ZWQnO1xuXG4vKipcbiAqIFJlcXVlc3QgZm9yICR7dHlwZU5hbWV9LiR7ZmllbGROYW1lfSAoU3RlcDogJHtmbi5uYW1lfSAke2ZuLmluZGV4ICsgMX0vJHtmbi5zdGVwQ291bnR9KVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWVzdChjdHg6IENvbnRleHQ8JHthcmdUeXBlfT4pOiBhbnkge1xuICBjb25zb2xlLmxvZyhjdHgpO1xuICByZXR1cm4ge307XG59XG5cbi8qKlxuICogUmVzcG9uc2UgZm9yICR7dHlwZU5hbWV9LiR7ZmllbGROYW1lfSAoU3RlcDogJHtmbi5uYW1lfSAke2ZuLmluZGV4ICsgMX0vJHtmbi5zdGVwQ291bnR9KVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzcG9uc2UoY3R4OiBDb250ZXh0PCR7YXJnVHlwZX0+KTogJHtyZXR1cm5UeXBlfSB7XG4gIGNvbnNvbGUubG9nKGN0eCk7XG4gIHJldHVybiBjdHgucmVzdWx0Lml0ZW1zO1xufWAsIHtcbiAgICAgIGVuY29kaW5nOiAndXRmLTgnLFxuICAgIH0pO1xuICB9XG5cbn1cblxuZnVuY3Rpb24gdXBwZXJjYXNlRmlyc3QodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHZhbHVlLnN1YnN0cmluZygxKTtcbn1cblxuLyoqXG4gKiBDb3BpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi9tYWluL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzL2xpYi91dGlsLnRzXG4gKiBhcyBpdCBpcyBub3QgZXhwb3J0ZWQgYnkgYXdzLWNkay1saWJcbiAqL1xuZnVuY3Rpb24gZXhlYyhjbWQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIG9wdGlvbnM/OiBTcGF3blN5bmNPcHRpb25zKSB7XG4gIGNvbnN0IHByb2MgPSBzcGF3blN5bmMoY21kLCBhcmdzLCBvcHRpb25zKTtcblxuICBpZiAocHJvYy5lcnJvcikge1xuICAgIHRocm93IHByb2MuZXJyb3I7XG4gIH1cblxuICBpZiAocHJvYy5zdGF0dXMgIT09IDApIHtcbiAgICBpZiAocHJvYy5zdGRvdXQgfHwgcHJvYy5zdGRlcnIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1N0YXR1cyAke3Byb2Muc3RhdHVzfV0gc3Rkb3V0OiAke3Byb2Muc3Rkb3V0Py50b1N0cmluZygpLnRyaW0oKX1cXG5cXG5cXG5zdGRlcnI6ICR7cHJvYy5zdGRlcnI/LnRvU3RyaW5nKCkudHJpbSgpfWApO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Y21kfSAke2FyZ3Muam9pbignICcpfSAke29wdGlvbnM/LmN3ZCA/IGBydW4gaW4gZGlyZWN0b3J5ICR7b3B0aW9ucy5jd2R9YCA6ICcnfSBleGl0ZWQgd2l0aCBzdGF0dXMgJHtwcm9jLnN0YXR1c31gKTtcbiAgfVxuXG4gIHJldHVybiBwcm9jO1xufVxuXG4iXX0=
|
package/lib/lambda/handler.d.ts
CHANGED
|
@@ -88,3 +88,31 @@ export type AppSyncHandler<T, R> = (context: AppSyncHandlerContext<T>) => Promis
|
|
|
88
88
|
* @param handler The AppSyncHandler to use as the resolver.
|
|
89
89
|
*/
|
|
90
90
|
export declare const createAppSyncHandler: <T, R>(handler: AppSyncHandler<T, R>) => AWSLambda.AppSyncResolverHandler<T, R>;
|
|
91
|
+
/**
|
|
92
|
+
* The context for a batched AppSync resolver function.
|
|
93
|
+
* Extends AppSyncHandlerContext so handler code that reads ctx.event.arguments /
|
|
94
|
+
* ctx.event.identity keeps working against the first event, and additionally
|
|
95
|
+
* exposes the full batch of events so the handler can map over it.
|
|
96
|
+
*/
|
|
97
|
+
export interface AppSyncBatchHandlerContext<T, S extends Record<string, any> | null = Record<string, any> | null> extends AppSyncHandlerContext<T> {
|
|
98
|
+
event: AWSLambda.AppSyncResolverEvent<T, S>;
|
|
99
|
+
events: AWSLambda.AppSyncResolverEvent<T, S>[];
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* A function that handles an AppSync BatchInvoke event.
|
|
103
|
+
* Receives the batch context and returns the responses in source order.
|
|
104
|
+
*/
|
|
105
|
+
export type AppSyncBatchHandler<T, R, S extends Record<string, any> | null = Record<string, any> | null> = (context: AppSyncBatchHandlerContext<T, S>) => Promise<R[]>;
|
|
106
|
+
/**
|
|
107
|
+
* Creates a batched AppSync resolver handler from the given AppSyncBatchHandler.
|
|
108
|
+
* Returns a function that can be used as an AppSync BatchInvoke resolver: array
|
|
109
|
+
* in, array out, order preserved.
|
|
110
|
+
*
|
|
111
|
+
* It mirrors createAppSyncHandler's context and auth plumbing but operates on an
|
|
112
|
+
* array of events. Authentication runs once per batch off the first event, and
|
|
113
|
+
* the context carries both the first event (ctx.event = events[0]) and the full
|
|
114
|
+
* ctx.events array. The handler returns R[] in the same order as the input events.
|
|
115
|
+
*
|
|
116
|
+
* @param handler The AppSyncBatchHandler to use as the resolver.
|
|
117
|
+
*/
|
|
118
|
+
export declare const createAppSyncBatchHandler: <T, R, S extends Record<string, any> | null = Record<string, any> | null>(handler: AppSyncBatchHandler<T, R, S>) => AWSLambda.AppSyncBatchResolverHandler<T, R, S>;
|