ec2-instance-running-scheduler 0.4.6 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.editorconfig +12 -0
- package/.jsii +561 -117
- package/API.md +613 -54
- package/README.md +46 -64
- package/assets/funcs/running-scheduler.lambda/index.js +668 -335
- package/assets/funcs/running-scheduler.lambda/index.js.map +4 -4
- package/lib/constructs/ec2-instance-running-scheduler.d.ts +5 -4
- package/lib/constructs/ec2-instance-running-scheduler.js +8 -4
- package/lib/constructs/lambda-failure-detector/lambda-failure-detection.d.ts +26 -0
- package/lib/constructs/lambda-failure-detector/lambda-failure-detection.js +9 -0
- package/lib/constructs/lambda-failure-detector/lambda-failure-detector.d.ts +99 -0
- package/lib/constructs/lambda-failure-detector/lambda-failure-detector.js +172 -0
- package/lib/constructs/lambda-failure-detector/log-failure-filter.d.ts +22 -0
- package/lib/constructs/lambda-failure-detector/log-failure-filter.js +3 -0
- package/lib/constructs/running-scheduler-failure-detection.d.ts +21 -36
- package/lib/constructs/running-scheduler-failure-detection.js +54 -132
- package/lib/funcs/running-scheduler-wait-env.js +5 -5
- package/lib/funcs/running-scheduler.lambda.js +4 -3
- package/lib/index.d.ts +2 -1
- package/lib/index.js +3 -2
- package/lib/stacks/ec2-instance-running-schedule-stack.d.ts +3 -3
- package/lib/stacks/ec2-instance-running-schedule-stack.js +3 -3
- package/package.json +5 -4
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { Duration, RemovalPolicy, TimeZone } from 'aws-cdk-lib';
|
|
2
2
|
import * as logs from 'aws-cdk-lib/aws-logs';
|
|
3
3
|
import { Construct } from 'constructs';
|
|
4
|
-
import { type
|
|
5
|
-
export type {
|
|
4
|
+
import { type RunningSchedulerFailureDetection, type RunningSchedulerFailureDetectionProps } from './running-scheduler-failure-detection';
|
|
5
|
+
export type { RunningSchedulerFailureDetection, RunningSchedulerFailureDetectionProps, RunningSchedulerFailureDetectionResourcesProps, } from './running-scheduler-failure-detection';
|
|
6
|
+
export { createLambdaFailureDetector, isLambdaFailureDetectionEnabled, LambdaFailureDetector, type CreateLambdaFailureDetectorProps, type LambdaFailureDetection, type LambdaFailureDetectorProps, type LogFailureAlarm, type LogFailureFilter, } from './lambda-failure-detector/lambda-failure-detector';
|
|
6
7
|
/**
|
|
7
8
|
* Cron-style schedule configuration for start/stop actions.
|
|
8
9
|
*/
|
|
@@ -177,7 +178,7 @@ export interface EC2InstanceRunningSchedulerProps {
|
|
|
177
178
|
*
|
|
178
179
|
* @default disabled when omitted
|
|
179
180
|
*/
|
|
180
|
-
readonly failureDetection?:
|
|
181
|
+
readonly failureDetection?: RunningSchedulerFailureDetectionProps;
|
|
181
182
|
}
|
|
182
183
|
/**
|
|
183
184
|
* Provisions EventBridge Scheduler rules and a Durable Execution Lambda that start/stop tagged EC2 instances.
|
|
@@ -205,7 +206,7 @@ export declare class EC2InstanceRunningScheduler extends Construct {
|
|
|
205
206
|
* @param props - Target tags, schedules, Slack secret, schedule enable flag, optional
|
|
206
207
|
* {@link ResourceWaitLimits}, {@link RunningSchedulerRuntimeProps},
|
|
207
208
|
* {@link RunningSchedulerDurableProps}, {@link RunningSchedulerLogGroupProps},
|
|
208
|
-
* and optional {@link
|
|
209
|
+
* and optional {@link RunningSchedulerFailureDetectionProps}.
|
|
209
210
|
*/
|
|
210
211
|
constructor(scope: Construct, id: string, props: EC2InstanceRunningSchedulerProps);
|
|
211
212
|
}
|
|
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.EC2InstanceRunningScheduler = void 0;
|
|
36
|
+
exports.EC2InstanceRunningScheduler = exports.LambdaFailureDetector = exports.isLambdaFailureDetectionEnabled = exports.createLambdaFailureDetector = void 0;
|
|
37
37
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
38
38
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
39
39
|
const iam = __importStar(require("aws-cdk-lib/aws-iam"));
|
|
@@ -47,6 +47,10 @@ const running_scheduler_failure_detection_1 = require("./running-scheduler-failu
|
|
|
47
47
|
const running_scheduler_function_1 = require("../funcs/running-scheduler-function");
|
|
48
48
|
const running_scheduler_predicates_1 = require("../funcs/running-scheduler-predicates");
|
|
49
49
|
const running_scheduler_wait_config_1 = require("../funcs/running-scheduler-wait-config");
|
|
50
|
+
var lambda_failure_detector_1 = require("./lambda-failure-detector/lambda-failure-detector");
|
|
51
|
+
Object.defineProperty(exports, "createLambdaFailureDetector", { enumerable: true, get: function () { return lambda_failure_detector_1.createLambdaFailureDetector; } });
|
|
52
|
+
Object.defineProperty(exports, "isLambdaFailureDetectionEnabled", { enumerable: true, get: function () { return lambda_failure_detector_1.isLambdaFailureDetectionEnabled; } });
|
|
53
|
+
Object.defineProperty(exports, "LambdaFailureDetector", { enumerable: true, get: function () { return lambda_failure_detector_1.LambdaFailureDetector; } });
|
|
50
54
|
const DEFAULT_LAMBDA_MEMORY_SIZE = 512;
|
|
51
55
|
const DEFAULT_LAMBDA_TIMEOUT = aws_cdk_lib_1.Duration.minutes(15);
|
|
52
56
|
const DEFAULT_DURABLE_EXECUTION_TIMEOUT = aws_cdk_lib_1.Duration.hours(2);
|
|
@@ -132,7 +136,7 @@ const taggedInstanceStartStopStatement = (scope, targetResource) => {
|
|
|
132
136
|
* detection is available via {@link EC2InstanceRunningSchedulerProps.failureDetection}.
|
|
133
137
|
*/
|
|
134
138
|
class EC2InstanceRunningScheduler extends constructs_1.Construct {
|
|
135
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "ec2-instance-running-scheduler.EC2InstanceRunningScheduler", version: "0.
|
|
139
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "ec2-instance-running-scheduler.EC2InstanceRunningScheduler", version: "0.5.0" };
|
|
136
140
|
/** Failure detection alarms, when {@link EC2InstanceRunningSchedulerProps.failureDetection} is enabled. */
|
|
137
141
|
failureDetection;
|
|
138
142
|
/**
|
|
@@ -144,7 +148,7 @@ class EC2InstanceRunningScheduler extends constructs_1.Construct {
|
|
|
144
148
|
* @param props - Target tags, schedules, Slack secret, schedule enable flag, optional
|
|
145
149
|
* {@link ResourceWaitLimits}, {@link RunningSchedulerRuntimeProps},
|
|
146
150
|
* {@link RunningSchedulerDurableProps}, {@link RunningSchedulerLogGroupProps},
|
|
147
|
-
* and optional {@link
|
|
151
|
+
* and optional {@link RunningSchedulerFailureDetectionProps}.
|
|
148
152
|
*/
|
|
149
153
|
constructor(scope, id, props) {
|
|
150
154
|
super(scope, id);
|
|
@@ -275,4 +279,4 @@ class EC2InstanceRunningScheduler extends constructs_1.Construct {
|
|
|
275
279
|
}
|
|
276
280
|
}
|
|
277
281
|
exports.EC2InstanceRunningScheduler = EC2InstanceRunningScheduler;
|
|
278
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWMyLWluc3RhbmNlLXJ1bm5pbmctc2NoZWR1bGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0cnVjdHMvZWMyLWluc3RhbmNlLXJ1bm5pbmctc2NoZWR1bGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBa0Y7QUFDbEYseURBQTJDO0FBQzNDLCtEQUFpRDtBQUNqRCwyREFBNkM7QUFDN0MscUVBQXVEO0FBQ3ZELDJFQUE2RDtBQUM3RCx1RUFBd0Q7QUFDeEQsMkNBQXVDO0FBQ3ZDLCtGQUkrQztBQUMvQyxvRkFBK0U7QUFDL0Usd0ZBRytDO0FBQy9DLDBGQUtnRDtBQWdNaEQsTUFBTSwwQkFBMEIsR0FBRyxHQUFHLENBQUM7QUFDdkMsTUFBTSxzQkFBc0IsR0FBRyxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwRCxNQUFNLGlDQUFpQyxHQUFHLHNCQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVELE1BQU0sZ0NBQWdDLEdBQUcsc0JBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFMUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLHNCQUFzQixHQUFHLENBQUMsSUFBWSxFQUFFLEtBQXlCLEVBQUUsWUFBb0IsRUFBVSxFQUFFO0lBQ3ZHLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksb0NBQW9DLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFD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QUFTO3dCQUN6QyxJQUFJLEVBQUUsTUFBTTtxQkFDYjtpQkFDRixDQUFDO2FBQ0gsQ0FBQztTQUNILENBQUMsQ0FBQztJQUNMLENBQUM7O0FBNUtILGtFQTZLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFybkZvcm1hdCwgRHVyYXRpb24sIFJlbW92YWxQb2xpY3ksIFN0YWNrLCBUaW1lWm9uZSB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0ICogYXMgc2NoZWR1bGVyIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zY2hlZHVsZXInO1xuaW1wb3J0ICogYXMgdGFyZ2V0cyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2NoZWR1bGVyLXRhcmdldHMnO1xuaW1wb3J0IHsgU2VjcmV0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlUnVubmluZ1NjaGVkdWxlckZhaWx1cmVEZXRlY3Rpb24sXG4gIHR5cGUgRmFpbHVyZURldGVjdGlvbkFsYXJtcyxcbiAgdHlwZSBSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvbixcbn0gZnJvbSAnLi9ydW5uaW5nLXNjaGVkdWxlci1mYWlsdXJlLWRldGVjdGlvbic7XG5pbXBvcnQgeyBSdW5uaW5nU2NoZWR1bGVyRnVuY3Rpb24gfSBmcm9tICcuLi9mdW5jcy9ydW5uaW5nLXNjaGVkdWxlci1mdW5jdGlvbic7XG5pbXBvcnQge1xuICBERUZBVUxUX01BWF9DT05DVVJSRU5DWSxcbiAgREVGQVVMVF9SRVNPVVJDRV9XQUlUX0xJTUlUUyxcbn0gZnJvbSAnLi4vZnVuY3MvcnVubmluZy1zY2hlZHVsZXItcHJlZGljYXRlcyc7XG5pbXBvcnQge1xuICBQUk9DRVNTX1JFU09VUkNFX01BWF9FTEFQU0VEX1NFQ09ORFNfRU5WLFxuICBQUk9DRVNTX1JFU09VUkNFX01BWF9MT09QX0NPVU5UX0VOVixcbiAgUFJPQ0VTU19SRVNPVVJDRV9TVEFUVVNfQ0hBTkdFX1dBSVRfU0VDT05EU19FTlYsXG4gIFBST0NFU1NfUkVTT1VSQ0VTX01BWF9DT05DVVJSRU5DWV9FTlYsXG59IGZyb20gJy4uL2Z1bmNzL3J1bm5pbmctc2NoZWR1bGVyLXdhaXQtY29uZmlnJztcblxuZXhwb3J0IHR5cGUge1xuICBGYWlsdXJlRGV0ZWN0aW9uQWxhcm1zLFxuICBSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvbixcbiAgUnVubmluZ1NjaGVkdWxlckZhaWx1cmVEZXRlY3Rpb25Qcm9wcyxcbn0gZnJvbSAnLi9ydW5uaW5nLXNjaGVkdWxlci1mYWlsdXJlLWRldGVjdGlvbic7XG5cbi8qKlxuICogQ3Jvbi1zdHlsZSBzY2hlZHVsZSBjb25maWd1cmF0aW9uIGZvciBzdGFydC9zdG9wIGFjdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGUge1xuICAvKiogVGltZSB6b25lIGZvciB0aGUgc2NoZWR1bGUgKGUuZy4gRVRDX1VUQykuICovXG4gIHJlYWRvbmx5IHRpbWV6b25lOiBUaW1lWm9uZTtcbiAgLyoqIENyb24gbWludXRlICgw4oCTNTkpLiAqL1xuICByZWFkb25seSBtaW51dGU/OiBzdHJpbmc7XG4gIC8qKiBDcm9uIGhvdXIgKDDigJMyMykuICovXG4gIHJlYWRvbmx5IGhvdXI/OiBzdHJpbmc7XG4gIC8qKiBDcm9uIGRheSBvZiB3ZWVrIChlLmcuIE1PTi1GUkkpLiAqL1xuICByZWFkb25seSB3ZWVrPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIERlZmluZXMgd2hpY2ggRUMyIGluc3RhbmNlcyBhcmUgdGFyZ2V0ZWQgYnkgdGFnIGtleSBhbmQgdmFsdWVzLlxuICpcbiAqIEluc3RhbmNlcyBtdXN0IGFscmVhZHkgaGF2ZSB0aGlzIHRhZy4gSUFNIGFsbG93cyBgZWMyOlN0YXJ0SW5zdGFuY2VzYCAvXG4gKiBgZWMyOlN0b3BJbnN0YW5jZXNgIG9ubHkgb24gaW5zdGFuY2VzIGluIHRoZSBzdGFjayBhY2NvdW50IGFuZCByZWdpb24gd2hvc2VcbiAqIGBhd3M6UmVzb3VyY2VUYWcvPHRhZ0tleT5gIG1hdGNoZXMgb25lIG9mIHtAbGluayBUYXJnZXRSZXNvdXJjZS50YWdWYWx1ZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhcmdldFJlc291cmNlIHtcbiAgLyoqIFRhZyBrZXkgdXNlZCB0byBzZWxlY3QgaW5zdGFuY2VzIChlLmcuIFNjaGVkdWxlKS4gKi9cbiAgcmVhZG9ubHkgdGFnS2V5OiBzdHJpbmc7XG4gIC8qKiBUYWcgdmFsdWVzIHRoYXQgbWF0Y2ggaW5zdGFuY2VzIHRvIGluY2x1ZGUuICovXG4gIHJlYWRvbmx5IHRhZ1ZhbHVlczogc3RyaW5nW107XG59XG5cbi8qKlxuICogU2VjcmV0IGlkZW50aWZpZXJzIHJlcXVpcmVkIGJ5IHRoZSBzY2hlZHVsZXIgKGUuZy4gU2xhY2spLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlY3JldHMge1xuICAvKiogTmFtZSBvZiB0aGUgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBjb250YWluaW5nIFNsYWNrIHRva2VuIGFuZCBjaGFubmVsLiAqL1xuICByZWFkb25seSBzbGFja1NlY3JldE5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDREstc2lkZSBsaW1pdHMgZm9yIHBlci1pbnN0YW5jZSBzdGFibGUtc3RhdGUgd2FpdGluZyBpbiB0aGUgRHVyYWJsZSBMYW1iZGEgaGFuZGxlci5cbiAqXG4gKiBPcHRpb25hbCBmaWVsZHMgbWFwIHRvIHtAbGluayBQUk9DRVNTX1JFU09VUkNFX01BWF9MT09QX0NPVU5UX0VOVn0gYW5kXG4gKiB7QGxpbmsgUFJPQ0VTU19SRVNPVVJDRV9NQVhfRUxBUFNFRF9TRUNPTkRTX0VOVn0gb24gdGhlIHJ1bm5pbmcgc2NoZWR1bGVyIGZ1bmN0aW9uLlxuICogUHJldmVudHMgYWJub3JtYWwgb3Igc3R1Y2sgdHJhbnNpdGlvbnMgZnJvbSBydW5uaW5nIHVudGlsIHRoZSBEdXJhYmxlIGV4ZWN1dGlvbiB0aW1lb3V0LlxuICpcbiAqIEBzZWUge0BsaW5rIFJlc291cmNlV2FpdExpbWl0c30gaW4gYHJ1bm5pbmctc2NoZWR1bGVyLXByZWRpY2F0ZXMudHNgIGZvciB0aGUgaGFuZGxlci1zaWRlIHJlcXVpcmVkIHNoYXBlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlV2FpdExpbWl0cyB7XG4gIC8qKlxuICAgKiBNYXhpbXVtIGRlc2NyaWJlL3dhaXQgbG9vcCBpdGVyYXRpb25zIHBlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIERFRkFVTFRfUkVTT1VSQ0VfV0FJVF9MSU1JVFMubWF4TG9vcENvdW50fSAoOTApXG4gICAqL1xuICByZWFkb25seSBtYXhMb29wQ291bnQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBNYXhpbXVtIHdhbGwtY2xvY2sgc2Vjb25kcyBzcGVudCB3YWl0aW5nIGZvciBhIHNpbmdsZSBpbnN0YW5jZSB0byBzdGFiaWxpemUuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBERUZBVUxUX1JFU09VUkNFX1dBSVRfTElNSVRTLm1heEVsYXBzZWRTZWNvbmRzfSAoMTgwMCwgMzAgbWludXRlcylcbiAgICovXG4gIHJlYWRvbmx5IG1heEVsYXBzZWRTZWNvbmRzPzogbnVtYmVyO1xuICAvKipcbiAgICogU2Vjb25kcyB0byB3YWl0IGJldHdlZW4gZGVzY3JpYmUgaXRlcmF0aW9ucyBhZnRlciBzdGFydC9zdG9wIG9yIHdoaWxlIHRyYW5zaXRpb25pbmcuXG4gICAqXG4gICAqIExvd2VyIHZhbHVlcyBkZXRlY3Qgc3RhdGUgY2hhbmdlcyBzb29uZXI7IGhpZ2hlciB2YWx1ZXMgcmVkdWNlIERlc2NyaWJlSW5zdGFuY2VzIGNhbGxzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgREVGQVVMVF9SRVNPVVJDRV9XQUlUX0xJTUlUUy5zdGF0dXNDaGFuZ2VXYWl0U2Vjb25kc30gKDIwKVxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdHVzQ2hhbmdlV2FpdFNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogTGFtYmRhIGludm9rZSBzZXR0aW5ncyBhbmQgYm91bmRlZCBwYXJhbGxlbGlzbSBmb3IgdGhlIHJ1bm5pbmcgc2NoZWR1bGVyIGZ1bmN0aW9uLlxuICpcbiAqIEluY3JlYXNlIHtAbGluayBtZW1vcnlTaXplfSBhbmQge0BsaW5rIG1heENvbmN1cnJlbmN5fSB3aGVuIGEgc2luZ2xlIGludm9jYXRpb24gdGFyZ2V0c1xuICogbWFueSBpbnN0YW5jZXMgb3IgcmVnaW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5uaW5nU2NoZWR1bGVyUnVudGltZVByb3BzIHtcbiAgLyoqXG4gICAqIE1lbW9yeSBhbGxvY2F0ZWQgdG8gdGhlIHJ1bm5pbmcgc2NoZWR1bGVyIExhbWJkYSwgaW4gTUIuXG4gICAqXG4gICAqIEBkZWZhdWx0IDUxMlxuICAgKi9cbiAgcmVhZG9ubHkgbWVtb3J5U2l6ZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIEludm9rZSB0aW1lb3V0IGZvciB0aGUgTGFtYmRhIGZ1bmN0aW9uIChub3QgdGhlIGR1cmFibGUgZXhlY3V0aW9uIHRpbWVvdXQpLlxuICAgKlxuICAgKiBBV1MgTGFtYmRhJ3MgbWF4aW11bSBpbnZva2UgdGltZW91dCBpcyAxNSBtaW51dGVzLiBEdXJhYmxlIHdhaXRzIGNhbiBjb250aW51ZVxuICAgKiBiZXlvbmQgdGhpcyB2aWEge0BsaW5rIFJ1bm5pbmdTY2hlZHVsZXJEdXJhYmxlUHJvcHMuZXhlY3V0aW9uVGltZW91dH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLm1pbnV0ZXMoMTUpXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0PzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiBpbnN0YW5jZXMgcHJvY2Vzc2VkIGluIHBhcmFsbGVsIGJ5IHRoZSBkdXJhYmxlIGBtYXBgLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgREVGQVVMVF9NQVhfQ09OQ1VSUkVOQ1l9ICgxMClcbiAgICovXG4gIHJlYWRvbmx5IG1heENvbmN1cnJlbmN5PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIER1cmFibGUgRXhlY3V0aW9uIHRpbWVvdXQgYW5kIGhpc3RvcnkgcmV0ZW50aW9uIGZvciB0aGUgcnVubmluZyBzY2hlZHVsZXIgTGFtYmRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bm5pbmdTY2hlZHVsZXJEdXJhYmxlUHJvcHMge1xuICAvKipcbiAgICogTWF4aW11bSBkdXJhdGlvbiBvZiBhIGR1cmFibGUgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBJbmNyZWFzZSB3aGVuIG1hbnkgaW5zdGFuY2VzIGFyZSBwcm9jZXNzZWQgd2l0aCBsb25nIHBlci1pbnN0YW5jZSB3YWl0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uaG91cnMoMilcbiAgICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblRpbWVvdXQ/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIEhvdyBsb25nIHRvIHJldGFpbiBkdXJhYmxlIGV4ZWN1dGlvbiBoaXN0b3J5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5kYXlzKDEpXG4gICAqL1xuICByZWFkb25seSByZXRlbnRpb25QZXJpb2Q/OiBEdXJhdGlvbjtcbn1cblxuLyoqXG4gKiBDbG91ZFdhdGNoIExvZ3Mgc2V0dGluZ3MgZm9yIHRoZSBydW5uaW5nIHNjaGVkdWxlciBmdW5jdGlvbiBsb2cgZ3JvdXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVubmluZ1NjaGVkdWxlckxvZ0dyb3VwUHJvcHMge1xuICAvKipcbiAgICogSG93IGxvbmcgdG8gcmV0YWluIGFwcGxpY2F0aW9uIGxvZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IFJldGVudGlvbkRheXMuVEhSRUVfTU9OVEhTXG4gICAqL1xuICByZWFkb25seSByZXRlbnRpb24/OiBsb2dzLlJldGVudGlvbkRheXM7XG4gIC8qKlxuICAgKiBSZW1vdmFsIHBvbGljeSBmb3IgdGhlIGxvZyBncm91cC5cbiAgICpcbiAgICogQGRlZmF1bHQgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZXG4gICAqL1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhbiBFQzIgaW5zdGFuY2UgcnVubmluZyBzY2hlZHVsZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyUHJvcHMge1xuICAvKiogVGFnLWJhc2VkIHRhcmdldGluZyBmb3IgRUMyIGluc3RhbmNlcyB0byBzdGFydC9zdG9wLiAqL1xuICByZWFkb25seSB0YXJnZXRSZXNvdXJjZTogVGFyZ2V0UmVzb3VyY2U7XG4gIC8qKiBXaGV0aGVyIEV2ZW50QnJpZGdlIFNjaGVkdWxlciBydWxlcyBhcmUgZW5hYmxlZC4gRGVmYXVsdHMgdG8gdHJ1ZSBpZiBvbWl0dGVkLiAqL1xuICByZWFkb25seSBlbmFibGVTY2hlZHVsaW5nPzogYm9vbGVhbjtcbiAgLyoqIFNlY3JldHMgKGUuZy4gU2xhY2spIHVzZWQgZm9yIG5vdGlmaWNhdGlvbnMuICovXG4gIHJlYWRvbmx5IHNlY3JldHM6IFNlY3JldHM7XG4gIC8qKiBDcm9uIHNjaGVkdWxlIGZvciBzdG9wcGluZyBpbnN0YW5jZXMuICovXG4gIHJlYWRvbmx5IHN0b3BTY2hlZHVsZT86IFNjaGVkdWxlO1xuICAvKiogQ3JvbiBzY2hlZHVsZSBmb3Igc3RhcnRpbmcgaW5zdGFuY2VzLiAqL1xuICByZWFkb25seSBzdGFydFNjaGVkdWxlPzogU2NoZWR1bGU7XG4gIC8qKlxuICAgKiBQZXItaW5zdGFuY2Ugd2FpdCBsaW1pdHMgZm9yIHRoZSBydW5uaW5nIHNjaGVkdWxlciBMYW1iZGEuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBERUZBVUxUX1JFU09VUkNFX1dBSVRfTElNSVRTfVxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VXYWl0PzogUmVzb3VyY2VXYWl0TGltaXRzO1xuICAvKipcbiAgICogTGFtYmRhIG1lbW9yeSwgaW52b2tlIHRpbWVvdXQsIGFuZCBwZXItaW52b2NhdGlvbiBpbnN0YW5jZSBjb25jdXJyZW5jeS5cbiAgICpcbiAgICogQGRlZmF1bHQgNTEyIE1CLCAxNSBtaW51dGVzLCB7QGxpbmsgREVGQVVMVF9NQVhfQ09OQ1VSUkVOQ1l9ICgxMClcbiAgICovXG4gIHJlYWRvbmx5IHJ1bnRpbWU/OiBSdW5uaW5nU2NoZWR1bGVyUnVudGltZVByb3BzO1xuICAvKipcbiAgICogRHVyYWJsZSBFeGVjdXRpb24gdGltZW91dCBhbmQgaGlzdG9yeSByZXRlbnRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGV4ZWN1dGlvblRpbWVvdXQgMiBob3VycywgcmV0ZW50aW9uUGVyaW9kIDEgZGF5XG4gICAqL1xuICByZWFkb25seSBkdXJhYmxlPzogUnVubmluZ1NjaGVkdWxlckR1cmFibGVQcm9wcztcbiAgLyoqXG4gICAqIENsb3VkV2F0Y2ggTG9ncyByZXRlbnRpb24gYW5kIHJlbW92YWwgcG9saWN5IGZvciB0aGUgZnVuY3Rpb24gbG9nIGdyb3VwLlxuICAgKlxuICAgKiBAZGVmYXVsdCBSZXRlbnRpb25EYXlzLlRIUkVFX01PTlRIUywgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZXG4gICAqL1xuICByZWFkb25seSBsb2dHcm91cD86IFJ1bm5pbmdTY2hlZHVsZXJMb2dHcm91cFByb3BzO1xuICAvKipcbiAgICogT3B0aW9uYWwgQ2xvdWRXYXRjaCBhbGFybXMgYW5kIGxvZy1iYXNlZCBtZXRyaWNzIGZvciBmYWlsdXJlIGRldGVjdGlvbi5cbiAgICpcbiAgICogU2V0IGBlbmFibGVkOiB0cnVlYCB0byBjcmVhdGUgYWxhcm1zOyBvcHRpb25hbGx5IHBhc3MgYGFsYXJtVG9waWNgIGZvciBTTlMgbm90aWZpY2F0aW9ucy5cbiAgICpcbiAgICogQGRlZmF1bHQgZGlzYWJsZWQgd2hlbiBvbWl0dGVkXG4gICAqL1xuICByZWFkb25seSBmYWlsdXJlRGV0ZWN0aW9uPzogRmFpbHVyZURldGVjdGlvbkFsYXJtcztcbn1cblxuY29uc3QgREVGQVVMVF9MQU1CREFfTUVNT1JZX1NJWkUgPSA1MTI7XG5jb25zdCBERUZBVUxUX0xBTUJEQV9USU1FT1VUID0gRHVyYXRpb24ubWludXRlcygxNSk7XG5jb25zdCBERUZBVUxUX0RVUkFCTEVfRVhFQ1VUSU9OX1RJTUVPVVQgPSBEdXJhdGlvbi5ob3VycygyKTtcbmNvbnN0IERFRkFVTFRfRFVSQUJMRV9SRVRFTlRJT05fUEVSSU9EID0gRHVyYXRpb24uZGF5cygxKTtcblxuLyoqXG4gKiBSZXR1cm5zIGB2YWx1ZWAgd2hlbiBzZXQsIG90aGVyd2lzZSBgZGVmYXVsdFZhbHVlYC5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFByb3BlcnR5IHBhdGggdXNlZCBpbiB0aGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwYXJhbSB2YWx1ZSAtIE9wdGlvbmFsIHBvc2l0aXZlIGludGVnZXIgZnJvbSBjb25zdHJ1Y3QgcHJvcHMuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIC0gRmFsbGJhY2sgd2hlbiBgdmFsdWVgIGlzIG9taXR0ZWQuXG4gKiBAcmV0dXJucyBBIHBvc2l0aXZlIGludGVnZXIuXG4gKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBgdmFsdWVgIGlzIHNldCBhbmQgaXMgbm90IGEgcG9zaXRpdmUgaW50ZWdlci5cbiAqL1xuY29uc3QgcmVzb2x2ZVBvc2l0aXZlSW50ZWdlciA9IChuYW1lOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQsIGRlZmF1bHRWYWx1ZTogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICB9XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgfHwgdmFsdWUgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtuYW1lfSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciAoZ290ICR7U3RyaW5nKHZhbHVlKX0pYCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuLyoqXG4gKiBFbnN1cmVzIHtAbGluayBUYXJnZXRSZXNvdXJjZX0gY2FuIGJlIHVzZWQgaW4gSUFNIGBhd3M6UmVzb3VyY2VUYWdgIGNvbmRpdGlvbnMuXG4gKlxuICogQHBhcmFtIHRhcmdldFJlc291cmNlIC0gVGFnIGtleSBhbmQgdmFsdWVzIHVzZWQgdG8gc2VsZWN0IEVDMiBpbnN0YW5jZXMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBgdGFnS2V5YCBpcyBlbXB0eSBvciBgdGFnVmFsdWVzYCBpcyBlbXB0eS5cbiAqL1xuY29uc3QgYXNzZXJ0VGFyZ2V0UmVzb3VyY2VGb3JJYW0gPSAodGFyZ2V0UmVzb3VyY2U6IFRhcmdldFJlc291cmNlKTogdm9pZCA9PiB7XG4gIGlmICh0YXJnZXRSZXNvdXJjZS50YWdLZXkgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXJnZXRSZXNvdXJjZS50YWdLZXkgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgfVxuICBpZiAodGFyZ2V0UmVzb3VyY2UudGFnVmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFyZ2V0UmVzb3VyY2UudGFnVmFsdWVzIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgdmFsdWUnKTtcbiAgfVxufTtcblxuLyoqXG4gKiBJQU0gc3RhdGVtZW50IHRoYXQgYWxsb3dzIHN0YXJ0L3N0b3Agb25seSBvbiBFQzIgaW5zdGFuY2VzIGluIHRoaXMgYWNjb3VudCBhbmQgcmVnaW9uXG4gKiB3aG9zZSB0YWdzIG1hdGNoIHtAbGluayBUYXJnZXRSZXNvdXJjZX0uXG4gKlxuICogYHRhZzpHZXRSZXNvdXJjZXNgIGFuZCBgZWMyOkRlc2NyaWJlSW5zdGFuY2VzYCBjYW5ub3QgdXNlIHJlc291cmNlLWxldmVsIEFSTnMgb3JcbiAqIHJlc291cmNlLXRhZyBjb25kaXRpb25zIChBV1MgQVBJIGxpbWl0YXRpb24pLiBTdGFydC9zdG9wIGFyZSBzY29wZWQgaW5zdGVhZCBzbyBhXG4gKiBjb21wcm9taXNlZCBmdW5jdGlvbiBjYW5ub3Qgc3RhcnQgb3Igc3RvcCB1bnRhZ2dlZCBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIHNjb3BlIC0gQ29uc3RydWN0IHVzZWQgdG8gcmVzb2x2ZSB0aGUgc3RhY2sgQVJOIHBhcnRpdGlvbiwgcmVnaW9uLCBhbmQgYWNjb3VudC5cbiAqIEBwYXJhbSB0YXJnZXRSZXNvdXJjZSAtIFRhZyBrZXkgYW5kIHZhbHVlcyByZXF1aXJlZCBvbiB0YXJnZXQgaW5zdGFuY2VzLlxuICogQHJldHVybnMgUG9saWN5IHN0YXRlbWVudCBmb3IgYGVjMjpTdGFydEluc3RhbmNlc2AgYW5kIGBlYzI6U3RvcEluc3RhbmNlc2AuXG4gKi9cbmNvbnN0IHRhZ2dlZEluc3RhbmNlU3RhcnRTdG9wU3RhdGVtZW50ID0gKFxuICBzY29wZTogQ29uc3RydWN0LFxuICB0YXJnZXRSZXNvdXJjZTogVGFyZ2V0UmVzb3VyY2UsXG4pOiBpYW0uUG9saWN5U3RhdGVtZW50ID0+IHtcbiAgY29uc3QgaW5zdGFuY2VBcm4gPSBTdGFjay5vZihzY29wZSkuZm9ybWF0QXJuKHtcbiAgICBzZXJ2aWNlOiAnZWMyJyxcbiAgICByZXNvdXJjZTogJ2luc3RhbmNlJyxcbiAgICByZXNvdXJjZU5hbWU6ICcqJyxcbiAgICBhcm5Gb3JtYXQ6IEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FLFxuICB9KTtcblxuICByZXR1cm4gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgIHNpZDogJ0VjMlN0YXJ0U3RvcFRhZ2dlZEluc3RhbmNlcycsXG4gICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgIGFjdGlvbnM6IFtcbiAgICAgICdlYzI6U3RhcnRJbnN0YW5jZXMnLFxuICAgICAgJ2VjMjpTdG9wSW5zdGFuY2VzJyxcbiAgICBdLFxuICAgIHJlc291cmNlczogW2luc3RhbmNlQXJuXSxcbiAgICBjb25kaXRpb25zOiB7XG4gICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgW2Bhd3M6UmVzb3VyY2VUYWcvJHt0YXJnZXRSZXNvdXJjZS50YWdLZXl9YF06IHRhcmdldFJlc291cmNlLnRhZ1ZhbHVlcyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIFByb3Zpc2lvbnMgRXZlbnRCcmlkZ2UgU2NoZWR1bGVyIHJ1bGVzIGFuZCBhIER1cmFibGUgRXhlY3V0aW9uIExhbWJkYSB0aGF0IHN0YXJ0L3N0b3AgdGFnZ2VkIEVDMiBpbnN0YW5jZXMuXG4gKlxuICogRWFjaCBzY2hlZHVsZSBpbnZva2VzIHRoZSBmdW5jdGlvbiB3aXRoIGBQYXJhbXNgIChgVGFnS2V5YCwgYFRhZ1ZhbHVlc2AsIGBNb2RlYCkuIFRoZSBmdW5jdGlvbiB1c2VzXG4gKiB0aGUgUmVzb3VyY2UgR3JvdXBzIFRhZ2dpbmcgQVBJIGFuZCBFQzIgQVBJczsgU2xhY2sgbm90aWZpY2F0aW9ucyB1c2UgdGhlIHNlY3JldCBuYW1lZCBpbiB7QGxpbmsgU2VjcmV0cy5zbGFja1NlY3JldE5hbWV9LlxuICpcbiAqIFBlci1pbnN0YW5jZSB3YWl0IHRpbWVvdXRzIGFyZSBjb25maWd1cmVkIHZpYSB7QGxpbmsgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyUHJvcHMucmVzb3VyY2VXYWl0fVxuICogYW5kIGVuZm9yY2VkIGluIHRoZSBoYW5kbGVyIGJlZm9yZSB0aGUgRHVyYWJsZSBleGVjdXRpb24gdGltZW91dC4gTGFtYmRhIG1lbW9yeSwgaW52b2tlIHRpbWVvdXQsXG4gKiBhbmQgbWFwIGNvbmN1cnJlbmN5IGFyZSBzZXQgdmlhIHtAbGluayBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXJQcm9wcy5ydW50aW1lfTsgRHVyYWJsZVxuICogZXhlY3V0aW9uIHRpbWVvdXQgYW5kIGhpc3RvcnkgcmV0ZW50aW9uIHZpYSB7QGxpbmsgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyUHJvcHMuZHVyYWJsZX07XG4gKiBsb2cgcmV0ZW50aW9uIHZpYSB7QGxpbmsgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyUHJvcHMubG9nR3JvdXB9LiBTdGFydC9zdG9wIElBTSBpcyBsaW1pdGVkXG4gKiB0byBpbnN0YW5jZXMgdGFnZ2VkIGFzIHtAbGluayBUYXJnZXRSZXNvdXJjZX0uIE9wdGlvbmFsIENsb3VkV2F0Y2ggZmFpbHVyZVxuICogZGV0ZWN0aW9uIGlzIGF2YWlsYWJsZSB2aWEge0BsaW5rIEVDMkluc3RhbmNlUnVubmluZ1NjaGVkdWxlclByb3BzLmZhaWx1cmVEZXRlY3Rpb259LlxuICovXG5leHBvcnQgY2xhc3MgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqIEZhaWx1cmUgZGV0ZWN0aW9uIGFsYXJtcywgd2hlbiB7QGxpbmsgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyUHJvcHMuZmFpbHVyZURldGVjdGlvbn0gaXMgZW5hYmxlZC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGZhaWx1cmVEZXRlY3Rpb24/OiBSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvbjtcblxuICAvKipcbiAgICogRGVmaW5lcyBJQU0sIGxvZ2dpbmcsIG9wdGlvbmFsIGZhaWx1cmUgZGV0ZWN0aW9uIGFsYXJtcywgdHdvIGNyb24gc2NoZWR1bGVzIChzdGFydC9zdG9wKSxcbiAgICogYW5kIHRoZSBidW5kbGVkIHJ1bm5pbmctc2NoZWR1bGVyIExhbWJkYSAoTm9kZS5qcywgRHVyYWJsZSBFeGVjdXRpb24pLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBQYXJlbnQgY29uc3RydWN0LlxuICAgKiBAcGFyYW0gaWQgLSBDb25zdHJ1Y3QgaWQuXG4gICAqIEBwYXJhbSBwcm9wcyAtIFRhcmdldCB0YWdzLCBzY2hlZHVsZXMsIFNsYWNrIHNlY3JldCwgc2NoZWR1bGUgZW5hYmxlIGZsYWcsIG9wdGlvbmFsXG4gICAqICAge0BsaW5rIFJlc291cmNlV2FpdExpbWl0c30sIHtAbGluayBSdW5uaW5nU2NoZWR1bGVyUnVudGltZVByb3BzfSxcbiAgICogICB7QGxpbmsgUnVubmluZ1NjaGVkdWxlckR1cmFibGVQcm9wc30sIHtAbGluayBSdW5uaW5nU2NoZWR1bGVyTG9nR3JvdXBQcm9wc30sXG4gICAqICAgYW5kIG9wdGlvbmFsIHtAbGluayBGYWlsdXJlRGV0ZWN0aW9uQWxhcm1zfS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBhc3NlcnRUYXJnZXRSZXNvdXJjZUZvcklhbShwcm9wcy50YXJnZXRSZXNvdXJjZSk7XG5cbiAgICBjb25zdCBzbGFja1NlY3JldCA9IFNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKHRoaXMsICdTbGFja1NlY3JldCcsIHByb3BzLnNlY3JldHMuc2xhY2tTZWNyZXROYW1lKTtcblxuICAgIGNvbnN0IG1heExvb3BDb3VudCA9IHJlc29sdmVQb3NpdGl2ZUludGVnZXIoXG4gICAgICAncmVzb3VyY2VXYWl0Lm1heExvb3BDb3VudCcsXG4gICAgICBwcm9wcy5yZXNvdXJjZVdhaXQ/Lm1heExvb3BDb3VudCxcbiAgICAgIERFRkFVTFRfUkVTT1VSQ0VfV0FJVF9MSU1JVFMubWF4TG9vcENvdW50LFxuICAgICk7XG4gICAgY29uc3QgbWF4RWxhcHNlZFNlY29uZHMgPSByZXNvbHZlUG9zaXRpdmVJbnRlZ2VyKFxuICAgICAgJ3Jlc291cmNlV2FpdC5tYXhFbGFwc2VkU2Vjb25kcycsXG4gICAgICBwcm9wcy5yZXNvdXJjZVdhaXQ/Lm1heEVsYXBzZWRTZWNvbmRzLFxuICAgICAgREVGQVVMVF9SRVNPVVJDRV9XQUlUX0xJTUlUUy5tYXhFbGFwc2VkU2Vjb25kcyxcbiAgICApO1xuICAgIGNvbnN0IHN0YXR1c0NoYW5nZVdhaXRTZWNvbmRzID0gcmVzb2x2ZVBvc2l0aXZlSW50ZWdlcihcbiAgICAgICdyZXNvdXJjZVdhaXQuc3RhdHVzQ2hhbmdlV2FpdFNlY29uZHMnLFxuICAgICAgcHJvcHMucmVzb3VyY2VXYWl0Py5zdGF0dXNDaGFuZ2VXYWl0U2Vjb25kcyxcbiAgICAgIERFRkFVTFRfUkVTT1VSQ0VfV0FJVF9MSU1JVFMuc3RhdHVzQ2hhbmdlV2FpdFNlY29uZHMsXG4gICAgKTtcbiAgICBjb25zdCBtYXhDb25jdXJyZW5jeSA9IHJlc29sdmVQb3NpdGl2ZUludGVnZXIoXG4gICAgICAncnVudGltZS5tYXhDb25jdXJyZW5jeScsXG4gICAgICBwcm9wcy5ydW50aW1lPy5tYXhDb25jdXJyZW5jeSxcbiAgICAgIERFRkFVTFRfTUFYX0NPTkNVUlJFTkNZLFxuICAgICk7XG4gICAgY29uc3QgbWVtb3J5U2l6ZSA9IHJlc29sdmVQb3NpdGl2ZUludGVnZXIoXG4gICAgICAncnVudGltZS5tZW1vcnlTaXplJyxcbiAgICAgIHByb3BzLnJ1bnRpbWU/Lm1lbW9yeVNpemUsXG4gICAgICBERUZBVUxUX0xBTUJEQV9NRU1PUllfU0laRSxcbiAgICApO1xuXG4gICAgLy8gRHVyYWJsZSBGdW5jdGlvbnMtYmFzZWQgUnVubmluZyBTY2hlZHVsZXIgKHByZXZpb3VzIFN0ZXAgRnVuY3Rpb25zIGxvZ2ljIGltcGxlbWVudGVkIGluIExhbWJkYSkuXG4gICAgLy8gRHVyYWJsZSBFeGVjdXRpb24gcmVxdWlyZXMgTm9kZS5qcyAyMisuXG4gICAgY29uc3QgcnVubmluZ1NjaGVkdWxlRnVuY3Rpb25Mb2dHcm91cCA9IG5ldyBsb2dzLkxvZ0dyb3VwKHRoaXMsICdSdW5uaW5nU2NoZWR1bGVyRnVuY3Rpb25Mb2dHcm91cCcsIHtcbiAgICAgIHJldGVudGlvbjogcHJvcHMubG9nR3JvdXA/LnJldGVudGlvbiA/PyBsb2dzLlJldGVudGlvbkRheXMuVEhSRUVfTU9OVEhTLFxuICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMubG9nR3JvdXA/LnJlbW92YWxQb2xpY3kgPz8gUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcnVubmluZ1NjaGVkdWxlRnVuY3Rpb24gPSBuZXcgUnVubmluZ1NjaGVkdWxlckZ1bmN0aW9uKHRoaXMsICdSdW5uaW5nU2NoZWR1bGVyRnVuY3Rpb24nLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1N0YXJ0cyBhbmQgc3RvcHMgdGFnZ2VkIEVDMiBpbnN0YW5jZXMgb24gRXZlbnRCcmlkZ2UgU2NoZWR1bGVyIHNjaGVkdWxlcy4nLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBsYW1iZGEuQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgIHRpbWVvdXQ6IHByb3BzLnJ1bnRpbWU/LnRpbWVvdXQgPz8gREVGQVVMVF9MQU1CREFfVElNRU9VVCxcbiAgICAgIG1lbW9yeVNpemUsXG4gICAgICByZXRyeUF0dGVtcHRzOiAyLFxuICAgICAgZHVyYWJsZUNvbmZpZzoge1xuICAgICAgICBleGVjdXRpb25UaW1lb3V0OiBwcm9wcy5kdXJhYmxlPy5leGVjdXRpb25UaW1lb3V0ID8/IERFRkFVTFRfRFVSQUJMRV9FWEVDVVRJT05fVElNRU9VVCxcbiAgICAgICAgcmV0ZW50aW9uUGVyaW9kOiBwcm9wcy5kdXJhYmxlPy5yZXRlbnRpb25QZXJpb2QgPz8gREVGQVVMVF9EVVJBQkxFX1JFVEVOVElPTl9QRVJJT0QsXG4gICAgICB9LFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgU0xBQ0tfU0VDUkVUX05BTUU6IHByb3BzLnNlY3JldHMuc2xhY2tTZWNyZXROYW1lLFxuICAgICAgICBbUFJPQ0VTU19SRVNPVVJDRV9NQVhfTE9PUF9DT1VOVF9FTlZdOiBTdHJpbmcobWF4TG9vcENvdW50KSxcbiAgICAgICAgW1BST0NFU1NfUkVTT1VSQ0VfTUFYX0VMQVBTRURfU0VDT05EU19FTlZdOiBTdHJpbmcobWF4RWxhcHNlZFNlY29uZHMpLFxuICAgICAgICBbUFJPQ0VTU19SRVNPVVJDRV9TVEFUVVNfQ0hBTkdFX1dBSVRfU0VDT05EU19FTlZdOiBTdHJpbmcoc3RhdHVzQ2hhbmdlV2FpdFNlY29uZHMpLFxuICAgICAgICBbUFJPQ0VTU19SRVNPVVJDRVNfTUFYX0NPTkNVUlJFTkNZX0VOVl06IFN0cmluZyhtYXhDb25jdXJyZW5jeSksXG4gICAgICB9LFxuICAgICAgcGFyYW1zQW5kU2VjcmV0czogbGFtYmRhLlBhcmFtc0FuZFNlY3JldHNMYXllclZlcnNpb24uZnJvbVZlcnNpb24obGFtYmRhLlBhcmFtc0FuZFNlY3JldHNWZXJzaW9ucy5WMV8wXzEwMywge1xuICAgICAgICAvLyBSZXF1aXJlZCBieSBhd3MtbGFtYmRhLXNlY3JldC1mZXRjaGVyIChleHRlbnNpb24gSFRUUCBBUEkgb24gbG9jYWxob3N0OyBwb3J0IGZyb20gUEFSQU1FVEVSU19TRUNSRVRTX0VYVEVOU0lPTl9IVFRQX1BPUlQpLlxuICAgICAgICBjYWNoZVNpemU6IDUwMCxcbiAgICAgICAgbG9nTGV2ZWw6IGxhbWJkYS5QYXJhbXNBbmRTZWNyZXRzTG9nTGV2ZWwuSU5GTyxcbiAgICAgIH0pLFxuICAgICAgcm9sZTogbmV3IGlhbS5Sb2xlKHRoaXMsICdSdW5uaW5nU2NoZWR1bGVyRnVuY3Rpb25Sb2xlJywge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ0FsbG93cyB0aGUgcnVubmluZyBzY2hlZHVsZXIgdG8gZGVzY3JpYmUgaW5zdGFuY2VzIGFuZCBzdGFydC9zdG9wIHRhZ2dlZCBFQzIgaW5zdGFuY2VzLCBhbmQgdG8gcmVhZCBTbGFjayBzZWNyZXRzLicsXG4gICAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdsYW1iZGEuYW1hem9uYXdzLmNvbScpLFxuICAgICAgICBtYW5hZ2VkUG9saWNpZXM6IFtcbiAgICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ3NlcnZpY2Utcm9sZS9BV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGUnKSxcbiAgICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ3NlcnZpY2Utcm9sZS9BV1NMYW1iZGFCYXNpY0R1cmFibGVFeGVjdXRpb25Sb2xlUG9saWN5JyksXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICAgIGxvZ0dyb3VwOiBydW5uaW5nU2NoZWR1bGVGdW5jdGlvbkxvZ0dyb3VwLFxuICAgICAgbG9nZ2luZ0Zvcm1hdDogbGFtYmRhLkxvZ2dpbmdGb3JtYXQuSlNPTixcbiAgICAgIHN5c3RlbUxvZ0xldmVsVjI6IGxhbWJkYS5TeXN0ZW1Mb2dMZXZlbC5JTkZPLFxuICAgICAgYXBwbGljYXRpb25Mb2dMZXZlbFYyOiBsYW1iZGEuQXBwbGljYXRpb25Mb2dMZXZlbC5JTkZPLFxuICAgIH0pO1xuICAgIHJ1bm5pbmdTY2hlZHVsZUZ1bmN0aW9uLmFkZFRvUm9sZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBzaWQ6ICdHZXRSZXNvdXJjZXMnLFxuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogW1xuICAgICAgICAndGFnOkdldFJlc291cmNlcycsXG4gICAgICBdLFxuICAgICAgLy8gUmVzb3VyY2UgR3JvdXBzIFRhZ2dpbmcgQVBJIGRvZXMgbm90IHN1cHBvcnQgcmVzb3VyY2UtbGV2ZWwgcGVybWlzc2lvbnMuXG4gICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgIH0pKTtcbiAgICBydW5uaW5nU2NoZWR1bGVGdW5jdGlvbi5hZGRUb1JvbGVQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgc2lkOiAnRWMyRGVzY3JpYmVJbnN0YW5jZXMnLFxuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogW1xuICAgICAgICAnZWMyOkRlc2NyaWJlSW5zdGFuY2VzJyxcbiAgICAgIF0sXG4gICAgICAvLyBEZXNjcmliZSogQVBJcyBkbyBub3Qgc3VwcG9ydCByZXNvdXJjZS1sZXZlbCBwZXJtaXNzaW9ucyBvciByZXNvdXJjZS10YWcgY29uZGl0aW9ucy5cbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgfSkpO1xuICAgIHJ1bm5pbmdTY2hlZHVsZUZ1bmN0aW9uLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIHRhZ2dlZEluc3RhbmNlU3RhcnRTdG9wU3RhdGVtZW50KHRoaXMsIHByb3BzLnRhcmdldFJlc291cmNlKSxcbiAgICApO1xuICAgIC8vIEdyYW50IHJlYWQgYWNjZXNzIHRvIHRoZSBTbGFjayBzZWNyZXRcbiAgICBzbGFja1NlY3JldC5ncmFudFJlYWQocnVubmluZ1NjaGVkdWxlRnVuY3Rpb24pO1xuXG4gICAgdGhpcy5mYWlsdXJlRGV0ZWN0aW9uID0gY3JlYXRlUnVubmluZ1NjaGVkdWxlckZhaWx1cmVEZXRlY3Rpb24odGhpcywgJ0ZhaWx1cmVEZXRlY3Rpb24nLCB7XG4gICAgICBmYWlsdXJlRGV0ZWN0aW9uOiBwcm9wcy5mYWlsdXJlRGV0ZWN0aW9uLFxuICAgICAgcnVubmluZ1NjaGVkdWxlRnVuY3Rpb24sXG4gICAgICBsb2dHcm91cDogcnVubmluZ1NjaGVkdWxlRnVuY3Rpb25Mb2dHcm91cCxcbiAgICB9KTtcblxuICAgIC8vIFNlZTogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvZHVyYWJsZS1nZXR0aW5nLXN0YXJ0ZWQtaWFjLmh0bWxcbiAgICBjb25zdCBydW5uaW5nU2NoZWR1bGVGdW5jdGlvbkFsaWFzID0gcnVubmluZ1NjaGVkdWxlRnVuY3Rpb24uYWRkQWxpYXMoJ2xpdmUnKTtcblxuICAgIC8vIFdoZXRoZXIgc2NoZWR1bGVzIGFyZSBlbmFibGVkIChkZWZhdWx0IHRydWUgdW5sZXNzIGV4cGxpY2l0bHkgZGlzYWJsZWQpLlxuICAgIGNvbnN0IHNjaGVkdWxlRW5hYmxlZDogYm9vbGVhbiA9ICgoKSA9PiB7XG4gICAgICBpZiAocHJvcHMuZW5hYmxlU2NoZWR1bGluZyA9PT0gdW5kZWZpbmVkIHx8IHByb3BzLmVuYWJsZVNjaGVkdWxpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSkoKTtcblxuICAgIC8vIER1cmFibGUgRnVuY3Rpb25zOiBMYW1iZGEgcGVyZm9ybXMgdGFnIGxvb2t1cCBhbmQgaW5zdGFuY2Ugc3RhcnQvc3RvcCBpbiBhIHNpbmdsZSBydW4uXG4gICAgbmV3IHNjaGVkdWxlci5TY2hlZHVsZSh0aGlzLCAnUnVubmluZ1N0YXJ0U2NoZWR1bGUnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ3J1bm5pbmcgc3RhcnQgc2NoZWR1bGUnLFxuICAgICAgZW5hYmxlZDogc2NoZWR1bGVFbmFibGVkLFxuICAgICAgc2NoZWR1bGU6IHNjaGVkdWxlci5TY2hlZHVsZUV4cHJlc3Npb24uY3Jvbih7XG4gICAgICAgIG1pbnV0ZTogcHJvcHMuc3RhcnRTY2hlZHVsZT8ubWludXRlID8/ICc1MCcsXG4gICAgICAgIGhvdXI6IHByb3BzLnN0YXJ0U2NoZWR1bGU/LmhvdXIgPz8gJzcnLFxuICAgICAgICB3ZWVrRGF5OiBwcm9wcy5zdGFydFNjaGVkdWxlPy53ZWVrID8/ICdNT04tRlJJJyxcbiAgICAgICAgdGltZVpvbmU6IHByb3BzLnN0YXJ0U2NoZWR1bGU/LnRpbWV6b25lID8/IFRpbWVab25lLkVUQ19VVEMsXG4gICAgICB9KSxcbiAgICAgIHRhcmdldDogbmV3IHRhcmdldHMuTGFtYmRhSW52b2tlKHJ1bm5pbmdTY2hlZHVsZUZ1bmN0aW9uQWxpYXMsIHtcbiAgICAgICAgaW5wdXQ6IHNjaGVkdWxlci5TY2hlZHVsZVRhcmdldElucHV0LmZyb21PYmplY3Qoe1xuICAgICAgICAgIFBhcmFtczoge1xuICAgICAgICAgICAgVGFnS2V5OiBwcm9wcy50YXJnZXRSZXNvdXJjZS50YWdLZXksXG4gICAgICAgICAgICBUYWdWYWx1ZXM6IHByb3BzLnRhcmdldFJlc291cmNlLnRhZ1ZhbHVlcyxcbiAgICAgICAgICAgIE1vZGU6ICdTdGFydCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIG5ldyBzY2hlZHVsZXIuU2NoZWR1bGUodGhpcywgJ1J1bm5pbmdTdG9wU2NoZWR1bGUnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ3J1bm5pbmcgc3RvcCBzY2hlZHVsZScsXG4gICAgICBlbmFibGVkOiBzY2hlZHVsZUVuYWJsZWQsXG4gICAgICBzY2hlZHVsZTogc2NoZWR1bGVyLlNjaGVkdWxlRXhwcmVzc2lvbi5jcm9uKHtcbiAgICAgICAgbWludXRlOiBwcm9wcy5zdG9wU2NoZWR1bGU/Lm1pbnV0ZSA/PyAnNScsXG4gICAgICAgIGhvdXI6IHByb3BzLnN0b3BTY2hlZHVsZT8uaG91ciA/PyAnMTknLFxuICAgICAgICB3ZWVrRGF5OiBwcm9wcy5zdG9wU2NoZWR1bGU/LndlZWsgPz8gJ01PTi1GUkknLFxuICAgICAgICB0aW1lWm9uZTogcHJvcHMuc3RvcFNjaGVkdWxlPy50aW1lem9uZSA/PyBUaW1lWm9uZS5FVENfVVRDLFxuICAgICAgfSksXG4gICAgICB0YXJnZXQ6IG5ldyB0YXJnZXRzLkxhbWJkYUludm9rZShydW5uaW5nU2NoZWR1bGVGdW5jdGlvbkFsaWFzLCB7XG4gICAgICAgIGlucHV0OiBzY2hlZHVsZXIuU2NoZWR1bGVUYXJnZXRJbnB1dC5mcm9tT2JqZWN0KHtcbiAgICAgICAgICBQYXJhbXM6IHtcbiAgICAgICAgICAgIFRhZ0tleTogcHJvcHMudGFyZ2V0UmVzb3VyY2UudGFnS2V5LFxuICAgICAgICAgICAgVGFnVmFsdWVzOiBwcm9wcy50YXJnZXRSZXNvdXJjZS50YWdWYWx1ZXMsXG4gICAgICAgICAgICBNb2RlOiAnU3RvcCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
282
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWMyLWluc3RhbmNlLXJ1bm5pbmctc2NoZWR1bGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0cnVjdHMvZWMyLWluc3RhbmNlLXJ1bm5pbmctc2NoZWR1bGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBa0Y7QUFDbEYseURBQTJDO0FBQzNDLCtEQUFpRDtBQUNqRCwyREFBNkM7QUFDN0MscUVBQXVEO0FBQ3ZELDJFQUE2RDtBQUM3RCx1RUFBd0Q7QUFDeEQsMkNBQXVDO0FBQ3ZDLCtGQUkrQztBQUMvQyxvRkFBK0U7QUFDL0Usd0ZBRytDO0FBQy9DLDBGQUtnRDtBQU9oRCw2RkFTMkQ7QUFSekQsc0lBQUEsMkJBQTJCLE9BQUE7QUFDM0IsMElBQUEsK0JBQStCLE9BQUE7QUFDL0IsZ0lBQUEscUJBQXFCLE9BQUE7QUFnTXZCLE1BQU0sMEJBQTBCLEdBQUcsR0FBRyxDQUFDO0FBQ3ZDLE1BQU0sc0JBQXNCLEdBQUcsc0JBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEQsTUFBTSxpQ0FBaUMsR0FBRyxzQkFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RCxNQUFNLGdDQUFnQyxHQUFHLHNCQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRTFEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLElBQVksRUFBRSxLQUF5QixFQUFFLFlBQW9CLEVBQVUsRUFBRTtJQUN2RyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN4QixPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzNDLE1BQU0sSUFBSSxLQUFLLENB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LEVBQUU7d0JBQ04sTUFBTSxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTTt3QkFDbkMsU0FBUyxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsU0FBUzt3QkFDekMsSUFBSSxFQUFFLE1BQU07cUJBQ2I7aUJBQ0YsQ0FBQzthQUNILENBQUM7U0FDSCxDQUFDLENBQUM7SUFDTCxDQUFDOztBQTVLSCxrRUE2S0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcm5Gb3JtYXQsIER1cmF0aW9uLCBSZW1vdmFsUG9saWN5LCBTdGFjaywgVGltZVpvbmUgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sb2dzJztcbmltcG9ydCAqIGFzIHNjaGVkdWxlciBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2NoZWR1bGVyJztcbmltcG9ydCAqIGFzIHRhcmdldHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNjaGVkdWxlci10YXJnZXRzJztcbmltcG9ydCB7IFNlY3JldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlcic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVJ1bm5pbmdTY2hlZHVsZXJGYWlsdXJlRGV0ZWN0aW9uLFxuICB0eXBlIFJ1bm5pbmdTY2hlZHVsZXJGYWlsdXJlRGV0ZWN0aW9uLFxuICB0eXBlIFJ1bm5pbmdTY2hlZHVsZXJGYWlsdXJlRGV0ZWN0aW9uUHJvcHMsXG59IGZyb20gJy4vcnVubmluZy1zY2hlZHVsZXItZmFpbHVyZS1kZXRlY3Rpb24nO1xuaW1wb3J0IHsgUnVubmluZ1NjaGVkdWxlckZ1bmN0aW9uIH0gZnJvbSAnLi4vZnVuY3MvcnVubmluZy1zY2hlZHVsZXItZnVuY3Rpb24nO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9NQVhfQ09OQ1VSUkVOQ1ksXG4gIERFRkFVTFRfUkVTT1VSQ0VfV0FJVF9MSU1JVFMsXG59IGZyb20gJy4uL2Z1bmNzL3J1bm5pbmctc2NoZWR1bGVyLXByZWRpY2F0ZXMnO1xuaW1wb3J0IHtcbiAgUFJPQ0VTU19SRVNPVVJDRV9NQVhfRUxBUFNFRF9TRUNPTkRTX0VOVixcbiAgUFJPQ0VTU19SRVNPVVJDRV9NQVhfTE9PUF9DT1VOVF9FTlYsXG4gIFBST0NFU1NfUkVTT1VSQ0VfU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFNfRU5WLFxuICBQUk9DRVNTX1JFU09VUkNFU19NQVhfQ09OQ1VSUkVOQ1lfRU5WLFxufSBmcm9tICcuLi9mdW5jcy9ydW5uaW5nLXNjaGVkdWxlci13YWl0LWNvbmZpZyc7XG5cbmV4cG9ydCB0eXBlIHtcbiAgUnVubmluZ1NjaGVkdWxlckZhaWx1cmVEZXRlY3Rpb24sXG4gIFJ1bm5pbmdTY2hlZHVsZXJGYWlsdXJlRGV0ZWN0aW9uUHJvcHMsXG4gIFJ1bm5pbmdTY2hlZHVsZXJGYWlsdXJlRGV0ZWN0aW9uUmVzb3VyY2VzUHJvcHMsXG59IGZyb20gJy4vcnVubmluZy1zY2hlZHVsZXItZmFpbHVyZS1kZXRlY3Rpb24nO1xuZXhwb3J0IHtcbiAgY3JlYXRlTGFtYmRhRmFpbHVyZURldGVjdG9yLFxuICBpc0xhbWJkYUZhaWx1cmVEZXRlY3Rpb25FbmFibGVkLFxuICBMYW1iZGFGYWlsdXJlRGV0ZWN0b3IsXG4gIHR5cGUgQ3JlYXRlTGFtYmRhRmFpbHVyZURldGVjdG9yUHJvcHMsXG4gIHR5cGUgTGFtYmRhRmFpbHVyZURldGVjdGlvbixcbiAgdHlwZSBMYW1iZGFGYWlsdXJlRGV0ZWN0b3JQcm9wcyxcbiAgdHlwZSBMb2dGYWlsdXJlQWxhcm0sXG4gIHR5cGUgTG9nRmFpbHVyZUZpbHRlcixcbn0gZnJvbSAnLi9sYW1iZGEtZmFpbHVyZS1kZXRlY3Rvci9sYW1iZGEtZmFpbHVyZS1kZXRlY3Rvcic7XG5cbi8qKlxuICogQ3Jvbi1zdHlsZSBzY2hlZHVsZSBjb25maWd1cmF0aW9uIGZvciBzdGFydC9zdG9wIGFjdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGUge1xuICAvKiogVGltZSB6b25lIGZvciB0aGUgc2NoZWR1bGUgKGUuZy4gRVRDX1VUQykuICovXG4gIHJlYWRvbmx5IHRpbWV6b25lOiBUaW1lWm9uZTtcbiAgLyoqIENyb24gbWludXRlICgw4oCTNTkpLiAqL1xuICByZWFkb25seSBtaW51dGU/OiBzdHJpbmc7XG4gIC8qKiBDcm9uIGhvdXIgKDDigJMyMykuICovXG4gIHJlYWRvbmx5IGhvdXI/OiBzdHJpbmc7XG4gIC8qKiBDcm9uIGRheSBvZiB3ZWVrIChlLmcuIE1PTi1GUkkpLiAqL1xuICByZWFkb25seSB3ZWVrPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIERlZmluZXMgd2hpY2ggRUMyIGluc3RhbmNlcyBhcmUgdGFyZ2V0ZWQgYnkgdGFnIGtleSBhbmQgdmFsdWVzLlxuICpcbiAqIEluc3RhbmNlcyBtdXN0IGFscmVhZHkgaGF2ZSB0aGlzIHRhZy4gSUFNIGFsbG93cyBgZWMyOlN0YXJ0SW5zdGFuY2VzYCAvXG4gKiBgZWMyOlN0b3BJbnN0YW5jZXNgIG9ubHkgb24gaW5zdGFuY2VzIGluIHRoZSBzdGFjayBhY2NvdW50IGFuZCByZWdpb24gd2hvc2VcbiAqIGBhd3M6UmVzb3VyY2VUYWcvPHRhZ0tleT5gIG1hdGNoZXMgb25lIG9mIHtAbGluayBUYXJnZXRSZXNvdXJjZS50YWdWYWx1ZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhcmdldFJlc291cmNlIHtcbiAgLyoqIFRhZyBrZXkgdXNlZCB0byBzZWxlY3QgaW5zdGFuY2VzIChlLmcuIFNjaGVkdWxlKS4gKi9cbiAgcmVhZG9ubHkgdGFnS2V5OiBzdHJpbmc7XG4gIC8qKiBUYWcgdmFsdWVzIHRoYXQgbWF0Y2ggaW5zdGFuY2VzIHRvIGluY2x1ZGUuICovXG4gIHJlYWRvbmx5IHRhZ1ZhbHVlczogc3RyaW5nW107XG59XG5cbi8qKlxuICogU2VjcmV0IGlkZW50aWZpZXJzIHJlcXVpcmVkIGJ5IHRoZSBzY2hlZHVsZXIgKGUuZy4gU2xhY2spLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlY3JldHMge1xuICAvKiogTmFtZSBvZiB0aGUgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBjb250YWluaW5nIFNsYWNrIHRva2VuIGFuZCBjaGFubmVsLiAqL1xuICByZWFkb25seSBzbGFja1NlY3JldE5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDREstc2lkZSBsaW1pdHMgZm9yIHBlci1pbnN0YW5jZSBzdGFibGUtc3RhdGUgd2FpdGluZyBpbiB0aGUgRHVyYWJsZSBMYW1iZGEgaGFuZGxlci5cbiAqXG4gKiBPcHRpb25hbCBmaWVsZHMgbWFwIHRvIHtAbGluayBQUk9DRVNTX1JFU09VUkNFX01BWF9MT09QX0NPVU5UX0VOVn0gYW5kXG4gKiB7QGxpbmsgUFJPQ0VTU19SRVNPVVJDRV9NQVhfRUxBUFNFRF9TRUNPTkRTX0VOVn0gb24gdGhlIHJ1bm5pbmcgc2NoZWR1bGVyIGZ1bmN0aW9uLlxuICogUHJldmVudHMgYWJub3JtYWwgb3Igc3R1Y2sgdHJhbnNpdGlvbnMgZnJvbSBydW5uaW5nIHVudGlsIHRoZSBEdXJhYmxlIGV4ZWN1dGlvbiB0aW1lb3V0LlxuICpcbiAqIEBzZWUge0BsaW5rIFJlc291cmNlV2FpdExpbWl0c30gaW4gYHJ1bm5pbmctc2NoZWR1bGVyLXByZWRpY2F0ZXMudHNgIGZvciB0aGUgaGFuZGxlci1zaWRlIHJlcXVpcmVkIHNoYXBlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlV2FpdExpbWl0cyB7XG4gIC8qKlxuICAgKiBNYXhpbXVtIGRlc2NyaWJlL3dhaXQgbG9vcCBpdGVyYXRpb25zIHBlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIERFRkFVTFRfUkVTT1VSQ0VfV0FJVF9MSU1JVFMubWF4TG9vcENvdW50fSAoOTApXG4gICAqL1xuICByZWFkb25seSBtYXhMb29wQ291bnQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBNYXhpbXVtIHdhbGwtY2xvY2sgc2Vjb25kcyBzcGVudCB3YWl0aW5nIGZvciBhIHNpbmdsZSBpbnN0YW5jZSB0byBzdGFiaWxpemUuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBERUZBVUxUX1JFU09VUkNFX1dBSVRfTElNSVRTLm1heEVsYXBzZWRTZWNvbmRzfSAoMTgwMCwgMzAgbWludXRlcylcbiAgICovXG4gIHJlYWRvbmx5IG1heEVsYXBzZWRTZWNvbmRzPzogbnVtYmVyO1xuICAvKipcbiAgICogU2Vjb25kcyB0byB3YWl0IGJldHdlZW4gZGVzY3JpYmUgaXRlcmF0aW9ucyBhZnRlciBzdGFydC9zdG9wIG9yIHdoaWxlIHRyYW5zaXRpb25pbmcuXG4gICAqXG4gICAqIExvd2VyIHZhbHVlcyBkZXRlY3Qgc3RhdGUgY2hhbmdlcyBzb29uZXI7IGhpZ2hlciB2YWx1ZXMgcmVkdWNlIERlc2NyaWJlSW5zdGFuY2VzIGNhbGxzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgREVGQVVMVF9SRVNPVVJDRV9XQUlUX0xJTUlUUy5zdGF0dXNDaGFuZ2VXYWl0U2Vjb25kc30gKDIwKVxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdHVzQ2hhbmdlV2FpdFNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogTGFtYmRhIGludm9rZSBzZXR0aW5ncyBhbmQgYm91bmRlZCBwYXJhbGxlbGlzbSBmb3IgdGhlIHJ1bm5pbmcgc2NoZWR1bGVyIGZ1bmN0aW9uLlxuICpcbiAqIEluY3JlYXNlIHtAbGluayBtZW1vcnlTaXplfSBhbmQge0BsaW5rIG1heENvbmN1cnJlbmN5fSB3aGVuIGEgc2luZ2xlIGludm9jYXRpb24gdGFyZ2V0c1xuICogbWFueSBpbnN0YW5jZXMgb3IgcmVnaW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5uaW5nU2NoZWR1bGVyUnVudGltZVByb3BzIHtcbiAgLyoqXG4gICAqIE1lbW9yeSBhbGxvY2F0ZWQgdG8gdGhlIHJ1bm5pbmcgc2NoZWR1bGVyIExhbWJkYSwgaW4gTUIuXG4gICAqXG4gICAqIEBkZWZhdWx0IDUxMlxuICAgKi9cbiAgcmVhZG9ubHkgbWVtb3J5U2l6ZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIEludm9rZSB0aW1lb3V0IGZvciB0aGUgTGFtYmRhIGZ1bmN0aW9uIChub3QgdGhlIGR1cmFibGUgZXhlY3V0aW9uIHRpbWVvdXQpLlxuICAgKlxuICAgKiBBV1MgTGFtYmRhJ3MgbWF4aW11bSBpbnZva2UgdGltZW91dCBpcyAxNSBtaW51dGVzLiBEdXJhYmxlIHdhaXRzIGNhbiBjb250aW51ZVxuICAgKiBiZXlvbmQgdGhpcyB2aWEge0BsaW5rIFJ1bm5pbmdTY2hlZHVsZXJEdXJhYmxlUHJvcHMuZXhlY3V0aW9uVGltZW91dH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLm1pbnV0ZXMoMTUpXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0PzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiBpbnN0YW5jZXMgcHJvY2Vzc2VkIGluIHBhcmFsbGVsIGJ5IHRoZSBkdXJhYmxlIGBtYXBgLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgREVGQVVMVF9NQVhfQ09OQ1VSUkVOQ1l9ICgxMClcbiAgICovXG4gIHJlYWRvbmx5IG1heENvbmN1cnJlbmN5PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIER1cmFibGUgRXhlY3V0aW9uIHRpbWVvdXQgYW5kIGhpc3RvcnkgcmV0ZW50aW9uIGZvciB0aGUgcnVubmluZyBzY2hlZHVsZXIgTGFtYmRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bm5pbmdTY2hlZHVsZXJEdXJhYmxlUHJvcHMge1xuICAvKipcbiAgICogTWF4aW11bSBkdXJhdGlvbiBvZiBhIGR1cmFibGUgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBJbmNyZWFzZSB3aGVuIG1hbnkgaW5zdGFuY2VzIGFyZSBwcm9jZXNzZWQgd2l0aCBsb25nIHBlci1pbnN0YW5jZSB3YWl0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uaG91cnMoMilcbiAgICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblRpbWVvdXQ/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIEhvdyBsb25nIHRvIHJldGFpbiBkdXJhYmxlIGV4ZWN1dGlvbiBoaXN0b3J5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5kYXlzKDEpXG4gICAqL1xuICByZWFkb25seSByZXRlbnRpb25QZXJpb2Q/OiBEdXJhdGlvbjtcbn1cblxuLyoqXG4gKiBDbG91ZFdhdGNoIExvZ3Mgc2V0dGluZ3MgZm9yIHRoZSBydW5uaW5nIHNjaGVkdWxlciBmdW5jdGlvbiBsb2cgZ3JvdXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVubmluZ1NjaGVkdWxlckxvZ0dyb3VwUHJvcHMge1xuICAvKipcbiAgICogSG93IGxvbmcgdG8gcmV0YWluIGFwcGxpY2F0aW9uIGxvZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IFJldGVudGlvbkRheXMuVEhSRUVfTU9OVEhTXG4gICAqL1xuICByZWFkb25seSByZXRlbnRpb24/OiBsb2dzLlJldGVudGlvbkRheXM7XG4gIC8qKlxuICAgKiBSZW1vdmFsIHBvbGljeSBmb3IgdGhlIGxvZyBncm91cC5cbiAgICpcbiAgICogQGRlZmF1bHQgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZXG4gICAqL1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhbiBFQzIgaW5zdGFuY2UgcnVubmluZyBzY2hlZHVsZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyUHJvcHMge1xuICAvKiogVGFnLWJhc2VkIHRhcmdldGluZyBmb3IgRUMyIGluc3RhbmNlcyB0byBzdGFydC9zdG9wLiAqL1xuICByZWFkb25seSB0YXJnZXRSZXNvdXJjZTogVGFyZ2V0UmVzb3VyY2U7XG4gIC8qKiBXaGV0aGVyIEV2ZW50QnJpZGdlIFNjaGVkdWxlciBydWxlcyBhcmUgZW5hYmxlZC4gRGVmYXVsdHMgdG8gdHJ1ZSBpZiBvbWl0dGVkLiAqL1xuICByZWFkb25seSBlbmFibGVTY2hlZHVsaW5nPzogYm9vbGVhbjtcbiAgLyoqIFNlY3JldHMgKGUuZy4gU2xhY2spIHVzZWQgZm9yIG5vdGlmaWNhdGlvbnMuICovXG4gIHJlYWRvbmx5IHNlY3JldHM6IFNlY3JldHM7XG4gIC8qKiBDcm9uIHNjaGVkdWxlIGZvciBzdG9wcGluZyBpbnN0YW5jZXMuICovXG4gIHJlYWRvbmx5IHN0b3BTY2hlZHVsZT86IFNjaGVkdWxlO1xuICAvKiogQ3JvbiBzY2hlZHVsZSBmb3Igc3RhcnRpbmcgaW5zdGFuY2VzLiAqL1xuICByZWFkb25seSBzdGFydFNjaGVkdWxlPzogU2NoZWR1bGU7XG4gIC8qKlxuICAgKiBQZXItaW5zdGFuY2Ugd2FpdCBsaW1pdHMgZm9yIHRoZSBydW5uaW5nIHNjaGVkdWxlciBMYW1iZGEuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBERUZBVUxUX1JFU09VUkNFX1dBSVRfTElNSVRTfVxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VXYWl0PzogUmVzb3VyY2VXYWl0TGltaXRzO1xuICAvKipcbiAgICogTGFtYmRhIG1lbW9yeSwgaW52b2tlIHRpbWVvdXQsIGFuZCBwZXItaW52b2NhdGlvbiBpbnN0YW5jZSBjb25jdXJyZW5jeS5cbiAgICpcbiAgICogQGRlZmF1bHQgNTEyIE1CLCAxNSBtaW51dGVzLCB7QGxpbmsgREVGQVVMVF9NQVhfQ09OQ1VSUkVOQ1l9ICgxMClcbiAgICovXG4gIHJlYWRvbmx5IHJ1bnRpbWU/OiBSdW5uaW5nU2NoZWR1bGVyUnVudGltZVByb3BzO1xuICAvKipcbiAgICogRHVyYWJsZSBFeGVjdXRpb24gdGltZW91dCBhbmQgaGlzdG9yeSByZXRlbnRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGV4ZWN1dGlvblRpbWVvdXQgMiBob3VycywgcmV0ZW50aW9uUGVyaW9kIDEgZGF5XG4gICAqL1xuICByZWFkb25seSBkdXJhYmxlPzogUnVubmluZ1NjaGVkdWxlckR1cmFibGVQcm9wcztcbiAgLyoqXG4gICAqIENsb3VkV2F0Y2ggTG9ncyByZXRlbnRpb24gYW5kIHJlbW92YWwgcG9saWN5IGZvciB0aGUgZnVuY3Rpb24gbG9nIGdyb3VwLlxuICAgKlxuICAgKiBAZGVmYXVsdCBSZXRlbnRpb25EYXlzLlRIUkVFX01PTlRIUywgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZXG4gICAqL1xuICByZWFkb25seSBsb2dHcm91cD86IFJ1bm5pbmdTY2hlZHVsZXJMb2dHcm91cFByb3BzO1xuICAvKipcbiAgICogT3B0aW9uYWwgQ2xvdWRXYXRjaCBhbGFybXMgYW5kIGxvZy1iYXNlZCBtZXRyaWNzIGZvciBmYWlsdXJlIGRldGVjdGlvbi5cbiAgICpcbiAgICogU2V0IGBlbmFibGVkOiB0cnVlYCB0byBjcmVhdGUgYWxhcm1zOyBvcHRpb25hbGx5IHBhc3MgYGFsYXJtVG9waWNgIGZvciBTTlMgbm90aWZpY2F0aW9ucy5cbiAgICpcbiAgICogQGRlZmF1bHQgZGlzYWJsZWQgd2hlbiBvbWl0dGVkXG4gICAqL1xuICByZWFkb25seSBmYWlsdXJlRGV0ZWN0aW9uPzogUnVubmluZ1NjaGVkdWxlckZhaWx1cmVEZXRlY3Rpb25Qcm9wcztcbn1cblxuY29uc3QgREVGQVVMVF9MQU1CREFfTUVNT1JZX1NJWkUgPSA1MTI7XG5jb25zdCBERUZBVUxUX0xBTUJEQV9USU1FT1VUID0gRHVyYXRpb24ubWludXRlcygxNSk7XG5jb25zdCBERUZBVUxUX0RVUkFCTEVfRVhFQ1VUSU9OX1RJTUVPVVQgPSBEdXJhdGlvbi5ob3VycygyKTtcbmNvbnN0IERFRkFVTFRfRFVSQUJMRV9SRVRFTlRJT05fUEVSSU9EID0gRHVyYXRpb24uZGF5cygxKTtcblxuLyoqXG4gKiBSZXR1cm5zIGB2YWx1ZWAgd2hlbiBzZXQsIG90aGVyd2lzZSBgZGVmYXVsdFZhbHVlYC5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFByb3BlcnR5IHBhdGggdXNlZCBpbiB0aGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwYXJhbSB2YWx1ZSAtIE9wdGlvbmFsIHBvc2l0aXZlIGludGVnZXIgZnJvbSBjb25zdHJ1Y3QgcHJvcHMuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIC0gRmFsbGJhY2sgd2hlbiBgdmFsdWVgIGlzIG9taXR0ZWQuXG4gKiBAcmV0dXJucyBBIHBvc2l0aXZlIGludGVnZXIuXG4gKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBgdmFsdWVgIGlzIHNldCBhbmQgaXMgbm90IGEgcG9zaXRpdmUgaW50ZWdlci5cbiAqL1xuY29uc3QgcmVzb2x2ZVBvc2l0aXZlSW50ZWdlciA9IChuYW1lOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQsIGRlZmF1bHRWYWx1ZTogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICB9XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgfHwgdmFsdWUgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtuYW1lfSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciAoZ290ICR7U3RyaW5nKHZhbHVlKX0pYCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuLyoqXG4gKiBFbnN1cmVzIHtAbGluayBUYXJnZXRSZXNvdXJjZX0gY2FuIGJlIHVzZWQgaW4gSUFNIGBhd3M6UmVzb3VyY2VUYWdgIGNvbmRpdGlvbnMuXG4gKlxuICogQHBhcmFtIHRhcmdldFJlc291cmNlIC0gVGFnIGtleSBhbmQgdmFsdWVzIHVzZWQgdG8gc2VsZWN0IEVDMiBpbnN0YW5jZXMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBgdGFnS2V5YCBpcyBlbXB0eSBvciBgdGFnVmFsdWVzYCBpcyBlbXB0eS5cbiAqL1xuY29uc3QgYXNzZXJ0VGFyZ2V0UmVzb3VyY2VGb3JJYW0gPSAodGFyZ2V0UmVzb3VyY2U6IFRhcmdldFJlc291cmNlKTogdm9pZCA9PiB7XG4gIGlmICh0YXJnZXRSZXNvdXJjZS50YWdLZXkgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXJnZXRSZXNvdXJjZS50YWdLZXkgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgfVxuICBpZiAodGFyZ2V0UmVzb3VyY2UudGFnVmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFyZ2V0UmVzb3VyY2UudGFnVmFsdWVzIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgdmFsdWUnKTtcbiAgfVxufTtcblxuLyoqXG4gKiBJQU0gc3RhdGVtZW50IHRoYXQgYWxsb3dzIHN0YXJ0L3N0b3Agb25seSBvbiBFQzIgaW5zdGFuY2VzIGluIHRoaXMgYWNjb3VudCBhbmQgcmVnaW9uXG4gKiB3aG9zZSB0YWdzIG1hdGNoIHtAbGluayBUYXJnZXRSZXNvdXJjZX0uXG4gKlxuICogYHRhZzpHZXRSZXNvdXJjZXNgIGFuZCBgZWMyOkRlc2NyaWJlSW5zdGFuY2VzYCBjYW5ub3QgdXNlIHJlc291cmNlLWxldmVsIEFSTnMgb3JcbiAqIHJlc291cmNlLXRhZyBjb25kaXRpb25zIChBV1MgQVBJIGxpbWl0YXRpb24pLiBTdGFydC9zdG9wIGFyZSBzY29wZWQgaW5zdGVhZCBzbyBhXG4gKiBjb21wcm9taXNlZCBmdW5jdGlvbiBjYW5ub3Qgc3RhcnQgb3Igc3RvcCB1bnRhZ2dlZCBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIHNjb3BlIC0gQ29uc3RydWN0IHVzZWQgdG8gcmVzb2x2ZSB0aGUgc3RhY2sgQVJOIHBhcnRpdGlvbiwgcmVnaW9uLCBhbmQgYWNjb3VudC5cbiAqIEBwYXJhbSB0YXJnZXRSZXNvdXJjZSAtIFRhZyBrZXkgYW5kIHZhbHVlcyByZXF1aXJlZCBvbiB0YXJnZXQgaW5zdGFuY2VzLlxuICogQHJldHVybnMgUG9saWN5IHN0YXRlbWVudCBmb3IgYGVjMjpTdGFydEluc3RhbmNlc2AgYW5kIGBlYzI6U3RvcEluc3RhbmNlc2AuXG4gKi9cbmNvbnN0IHRhZ2dlZEluc3RhbmNlU3RhcnRTdG9wU3RhdGVtZW50ID0gKFxuICBzY29wZTogQ29uc3RydWN0LFxuICB0YXJnZXRSZXNvdXJjZTogVGFyZ2V0UmVzb3VyY2UsXG4pOiBpYW0uUG9saWN5U3RhdGVtZW50ID0+IHtcbiAgY29uc3QgaW5zdGFuY2VBcm4gPSBTdGFjay5vZihzY29wZSkuZm9ybWF0QXJuKHtcbiAgICBzZXJ2aWNlOiAnZWMyJyxcbiAgICByZXNvdXJjZTogJ2luc3RhbmNlJyxcbiAgICByZXNvdXJjZU5hbWU6ICcqJyxcbiAgICBhcm5Gb3JtYXQ6IEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FLFxuICB9KTtcblxuICByZXR1cm4gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgIHNpZDogJ0VjMlN0YXJ0U3RvcFRhZ2dlZEluc3RhbmNlcycsXG4gICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgIGFjdGlvbnM6IFtcbiAgICAgICdlYzI6U3RhcnRJbnN0YW5jZXMnLFxuICAgICAgJ2VjMjpTdG9wSW5zdGFuY2VzJyxcbiAgICBdLFxuICAgIHJlc291cmNlczogW2luc3RhbmNlQXJuXSxcbiAgICBjb25kaXRpb25zOiB7XG4gICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgW2Bhd3M6UmVzb3VyY2VUYWcvJHt0YXJnZXRSZXNvdXJjZS50YWdLZXl9YF06IHRhcmdldFJlc291cmNlLnRhZ1ZhbHVlcyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIFByb3Zpc2lvbnMgRXZlbnRCcmlkZ2UgU2NoZWR1bGVyIHJ1bGVzIGFuZCBhIER1cmFibGUgRXhlY3V0aW9uIExhbWJkYSB0aGF0IHN0YXJ0L3N0b3AgdGFnZ2VkIEVDMiBpbnN0YW5jZXMuXG4gKlxuICogRWFjaCBzY2hlZHVsZSBpbnZva2VzIHRoZSBmdW5jdGlvbiB3aXRoIGBQYXJhbXNgIChgVGFnS2V5YCwgYFRhZ1ZhbHVlc2AsIGBNb2RlYCkuIFRoZSBmdW5jdGlvbiB1c2VzXG4gKiB0aGUgUmVzb3VyY2UgR3JvdXBzIFRhZ2dpbmcgQVBJIGFuZCBFQzIgQVBJczsgU2xhY2sgbm90aWZpY2F0aW9ucyB1c2UgdGhlIHNlY3JldCBuYW1lZCBpbiB7QGxpbmsgU2VjcmV0cy5zbGFja1NlY3JldE5hbWV9LlxuICpcbiAqIFBlci1pbnN0YW5jZSB3YWl0IHRpbWVvdXRzIGFyZSBjb25maWd1cmVkIHZpYSB7QGxpbmsgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyUHJvcHMucmVzb3VyY2VXYWl0fVxuICogYW5kIGVuZm9yY2VkIGluIHRoZSBoYW5kbGVyIGJlZm9yZSB0aGUgRHVyYWJsZSBleGVjdXRpb24gdGltZW91dC4gTGFtYmRhIG1lbW9yeSwgaW52b2tlIHRpbWVvdXQsXG4gKiBhbmQgbWFwIGNvbmN1cnJlbmN5IGFyZSBzZXQgdmlhIHtAbGluayBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXJQcm9wcy5ydW50aW1lfTsgRHVyYWJsZVxuICogZXhlY3V0aW9uIHRpbWVvdXQgYW5kIGhpc3RvcnkgcmV0ZW50aW9uIHZpYSB7QGxpbmsgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyUHJvcHMuZHVyYWJsZX07XG4gKiBsb2cgcmV0ZW50aW9uIHZpYSB7QGxpbmsgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyUHJvcHMubG9nR3JvdXB9LiBTdGFydC9zdG9wIElBTSBpcyBsaW1pdGVkXG4gKiB0byBpbnN0YW5jZXMgdGFnZ2VkIGFzIHtAbGluayBUYXJnZXRSZXNvdXJjZX0uIE9wdGlvbmFsIENsb3VkV2F0Y2ggZmFpbHVyZVxuICogZGV0ZWN0aW9uIGlzIGF2YWlsYWJsZSB2aWEge0BsaW5rIEVDMkluc3RhbmNlUnVubmluZ1NjaGVkdWxlclByb3BzLmZhaWx1cmVEZXRlY3Rpb259LlxuICovXG5leHBvcnQgY2xhc3MgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqIEZhaWx1cmUgZGV0ZWN0aW9uIGFsYXJtcywgd2hlbiB7QGxpbmsgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyUHJvcHMuZmFpbHVyZURldGVjdGlvbn0gaXMgZW5hYmxlZC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGZhaWx1cmVEZXRlY3Rpb24/OiBSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvbjtcblxuICAvKipcbiAgICogRGVmaW5lcyBJQU0sIGxvZ2dpbmcsIG9wdGlvbmFsIGZhaWx1cmUgZGV0ZWN0aW9uIGFsYXJtcywgdHdvIGNyb24gc2NoZWR1bGVzIChzdGFydC9zdG9wKSxcbiAgICogYW5kIHRoZSBidW5kbGVkIHJ1bm5pbmctc2NoZWR1bGVyIExhbWJkYSAoTm9kZS5qcywgRHVyYWJsZSBFeGVjdXRpb24pLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBQYXJlbnQgY29uc3RydWN0LlxuICAgKiBAcGFyYW0gaWQgLSBDb25zdHJ1Y3QgaWQuXG4gICAqIEBwYXJhbSBwcm9wcyAtIFRhcmdldCB0YWdzLCBzY2hlZHVsZXMsIFNsYWNrIHNlY3JldCwgc2NoZWR1bGUgZW5hYmxlIGZsYWcsIG9wdGlvbmFsXG4gICAqICAge0BsaW5rIFJlc291cmNlV2FpdExpbWl0c30sIHtAbGluayBSdW5uaW5nU2NoZWR1bGVyUnVudGltZVByb3BzfSxcbiAgICogICB7QGxpbmsgUnVubmluZ1NjaGVkdWxlckR1cmFibGVQcm9wc30sIHtAbGluayBSdW5uaW5nU2NoZWR1bGVyTG9nR3JvdXBQcm9wc30sXG4gICAqICAgYW5kIG9wdGlvbmFsIHtAbGluayBSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvblByb3BzfS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBhc3NlcnRUYXJnZXRSZXNvdXJjZUZvcklhbShwcm9wcy50YXJnZXRSZXNvdXJjZSk7XG5cbiAgICBjb25zdCBzbGFja1NlY3JldCA9IFNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKHRoaXMsICdTbGFja1NlY3JldCcsIHByb3BzLnNlY3JldHMuc2xhY2tTZWNyZXROYW1lKTtcblxuICAgIGNvbnN0IG1heExvb3BDb3VudCA9IHJlc29sdmVQb3NpdGl2ZUludGVnZXIoXG4gICAgICAncmVzb3VyY2VXYWl0Lm1heExvb3BDb3VudCcsXG4gICAgICBwcm9wcy5yZXNvdXJjZVdhaXQ/Lm1heExvb3BDb3VudCxcbiAgICAgIERFRkFVTFRfUkVTT1VSQ0VfV0FJVF9MSU1JVFMubWF4TG9vcENvdW50LFxuICAgICk7XG4gICAgY29uc3QgbWF4RWxhcHNlZFNlY29uZHMgPSByZXNvbHZlUG9zaXRpdmVJbnRlZ2VyKFxuICAgICAgJ3Jlc291cmNlV2FpdC5tYXhFbGFwc2VkU2Vjb25kcycsXG4gICAgICBwcm9wcy5yZXNvdXJjZVdhaXQ/Lm1heEVsYXBzZWRTZWNvbmRzLFxuICAgICAgREVGQVVMVF9SRVNPVVJDRV9XQUlUX0xJTUlUUy5tYXhFbGFwc2VkU2Vjb25kcyxcbiAgICApO1xuICAgIGNvbnN0IHN0YXR1c0NoYW5nZVdhaXRTZWNvbmRzID0gcmVzb2x2ZVBvc2l0aXZlSW50ZWdlcihcbiAgICAgICdyZXNvdXJjZVdhaXQuc3RhdHVzQ2hhbmdlV2FpdFNlY29uZHMnLFxuICAgICAgcHJvcHMucmVzb3VyY2VXYWl0Py5zdGF0dXNDaGFuZ2VXYWl0U2Vjb25kcyxcbiAgICAgIERFRkFVTFRfUkVTT1VSQ0VfV0FJVF9MSU1JVFMuc3RhdHVzQ2hhbmdlV2FpdFNlY29uZHMsXG4gICAgKTtcbiAgICBjb25zdCBtYXhDb25jdXJyZW5jeSA9IHJlc29sdmVQb3NpdGl2ZUludGVnZXIoXG4gICAgICAncnVudGltZS5tYXhDb25jdXJyZW5jeScsXG4gICAgICBwcm9wcy5ydW50aW1lPy5tYXhDb25jdXJyZW5jeSxcbiAgICAgIERFRkFVTFRfTUFYX0NPTkNVUlJFTkNZLFxuICAgICk7XG4gICAgY29uc3QgbWVtb3J5U2l6ZSA9IHJlc29sdmVQb3NpdGl2ZUludGVnZXIoXG4gICAgICAncnVudGltZS5tZW1vcnlTaXplJyxcbiAgICAgIHByb3BzLnJ1bnRpbWU/Lm1lbW9yeVNpemUsXG4gICAgICBERUZBVUxUX0xBTUJEQV9NRU1PUllfU0laRSxcbiAgICApO1xuXG4gICAgLy8gRHVyYWJsZSBGdW5jdGlvbnMtYmFzZWQgUnVubmluZyBTY2hlZHVsZXIgKHByZXZpb3VzIFN0ZXAgRnVuY3Rpb25zIGxvZ2ljIGltcGxlbWVudGVkIGluIExhbWJkYSkuXG4gICAgLy8gRHVyYWJsZSBFeGVjdXRpb24gcmVxdWlyZXMgTm9kZS5qcyAyMisuXG4gICAgY29uc3QgcnVubmluZ1NjaGVkdWxlRnVuY3Rpb25Mb2dHcm91cCA9IG5ldyBsb2dzLkxvZ0dyb3VwKHRoaXMsICdSdW5uaW5nU2NoZWR1bGVyRnVuY3Rpb25Mb2dHcm91cCcsIHtcbiAgICAgIHJldGVudGlvbjogcHJvcHMubG9nR3JvdXA/LnJldGVudGlvbiA/PyBsb2dzLlJldGVudGlvbkRheXMuVEhSRUVfTU9OVEhTLFxuICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMubG9nR3JvdXA/LnJlbW92YWxQb2xpY3kgPz8gUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcnVubmluZ1NjaGVkdWxlRnVuY3Rpb24gPSBuZXcgUnVubmluZ1NjaGVkdWxlckZ1bmN0aW9uKHRoaXMsICdSdW5uaW5nU2NoZWR1bGVyRnVuY3Rpb24nLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1N0YXJ0cyBhbmQgc3RvcHMgdGFnZ2VkIEVDMiBpbnN0YW5jZXMgb24gRXZlbnRCcmlkZ2UgU2NoZWR1bGVyIHNjaGVkdWxlcy4nLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBsYW1iZGEuQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgIHRpbWVvdXQ6IHByb3BzLnJ1bnRpbWU/LnRpbWVvdXQgPz8gREVGQVVMVF9MQU1CREFfVElNRU9VVCxcbiAgICAgIG1lbW9yeVNpemUsXG4gICAgICByZXRyeUF0dGVtcHRzOiAyLFxuICAgICAgZHVyYWJsZUNvbmZpZzoge1xuICAgICAgICBleGVjdXRpb25UaW1lb3V0OiBwcm9wcy5kdXJhYmxlPy5leGVjdXRpb25UaW1lb3V0ID8/IERFRkFVTFRfRFVSQUJMRV9FWEVDVVRJT05fVElNRU9VVCxcbiAgICAgICAgcmV0ZW50aW9uUGVyaW9kOiBwcm9wcy5kdXJhYmxlPy5yZXRlbnRpb25QZXJpb2QgPz8gREVGQVVMVF9EVVJBQkxFX1JFVEVOVElPTl9QRVJJT0QsXG4gICAgICB9LFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgU0xBQ0tfU0VDUkVUX05BTUU6IHByb3BzLnNlY3JldHMuc2xhY2tTZWNyZXROYW1lLFxuICAgICAgICBbUFJPQ0VTU19SRVNPVVJDRV9NQVhfTE9PUF9DT1VOVF9FTlZdOiBTdHJpbmcobWF4TG9vcENvdW50KSxcbiAgICAgICAgW1BST0NFU1NfUkVTT1VSQ0VfTUFYX0VMQVBTRURfU0VDT05EU19FTlZdOiBTdHJpbmcobWF4RWxhcHNlZFNlY29uZHMpLFxuICAgICAgICBbUFJPQ0VTU19SRVNPVVJDRV9TVEFUVVNfQ0hBTkdFX1dBSVRfU0VDT05EU19FTlZdOiBTdHJpbmcoc3RhdHVzQ2hhbmdlV2FpdFNlY29uZHMpLFxuICAgICAgICBbUFJPQ0VTU19SRVNPVVJDRVNfTUFYX0NPTkNVUlJFTkNZX0VOVl06IFN0cmluZyhtYXhDb25jdXJyZW5jeSksXG4gICAgICB9LFxuICAgICAgcGFyYW1zQW5kU2VjcmV0czogbGFtYmRhLlBhcmFtc0FuZFNlY3JldHNMYXllclZlcnNpb24uZnJvbVZlcnNpb24obGFtYmRhLlBhcmFtc0FuZFNlY3JldHNWZXJzaW9ucy5WMV8wXzEwMywge1xuICAgICAgICAvLyBSZXF1aXJlZCBieSBhd3MtbGFtYmRhLXNlY3JldC1mZXRjaGVyIChleHRlbnNpb24gSFRUUCBBUEkgb24gbG9jYWxob3N0OyBwb3J0IGZyb20gUEFSQU1FVEVSU19TRUNSRVRTX0VYVEVOU0lPTl9IVFRQX1BPUlQpLlxuICAgICAgICBjYWNoZVNpemU6IDUwMCxcbiAgICAgICAgbG9nTGV2ZWw6IGxhbWJkYS5QYXJhbXNBbmRTZWNyZXRzTG9nTGV2ZWwuSU5GTyxcbiAgICAgIH0pLFxuICAgICAgcm9sZTogbmV3IGlhbS5Sb2xlKHRoaXMsICdSdW5uaW5nU2NoZWR1bGVyRnVuY3Rpb25Sb2xlJywge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ0FsbG93cyB0aGUgcnVubmluZyBzY2hlZHVsZXIgdG8gZGVzY3JpYmUgaW5zdGFuY2VzIGFuZCBzdGFydC9zdG9wIHRhZ2dlZCBFQzIgaW5zdGFuY2VzLCBhbmQgdG8gcmVhZCBTbGFjayBzZWNyZXRzLicsXG4gICAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdsYW1iZGEuYW1hem9uYXdzLmNvbScpLFxuICAgICAgICBtYW5hZ2VkUG9saWNpZXM6IFtcbiAgICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ3NlcnZpY2Utcm9sZS9BV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGUnKSxcbiAgICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ3NlcnZpY2Utcm9sZS9BV1NMYW1iZGFCYXNpY0R1cmFibGVFeGVjdXRpb25Sb2xlUG9saWN5JyksXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICAgIGxvZ0dyb3VwOiBydW5uaW5nU2NoZWR1bGVGdW5jdGlvbkxvZ0dyb3VwLFxuICAgICAgbG9nZ2luZ0Zvcm1hdDogbGFtYmRhLkxvZ2dpbmdGb3JtYXQuSlNPTixcbiAgICAgIHN5c3RlbUxvZ0xldmVsVjI6IGxhbWJkYS5TeXN0ZW1Mb2dMZXZlbC5JTkZPLFxuICAgICAgYXBwbGljYXRpb25Mb2dMZXZlbFYyOiBsYW1iZGEuQXBwbGljYXRpb25Mb2dMZXZlbC5JTkZPLFxuICAgIH0pO1xuICAgIHJ1bm5pbmdTY2hlZHVsZUZ1bmN0aW9uLmFkZFRvUm9sZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBzaWQ6ICdHZXRSZXNvdXJjZXMnLFxuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogW1xuICAgICAgICAndGFnOkdldFJlc291cmNlcycsXG4gICAgICBdLFxuICAgICAgLy8gUmVzb3VyY2UgR3JvdXBzIFRhZ2dpbmcgQVBJIGRvZXMgbm90IHN1cHBvcnQgcmVzb3VyY2UtbGV2ZWwgcGVybWlzc2lvbnMuXG4gICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgIH0pKTtcbiAgICBydW5uaW5nU2NoZWR1bGVGdW5jdGlvbi5hZGRUb1JvbGVQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgc2lkOiAnRWMyRGVzY3JpYmVJbnN0YW5jZXMnLFxuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogW1xuICAgICAgICAnZWMyOkRlc2NyaWJlSW5zdGFuY2VzJyxcbiAgICAgIF0sXG4gICAgICAvLyBEZXNjcmliZSogQVBJcyBkbyBub3Qgc3VwcG9ydCByZXNvdXJjZS1sZXZlbCBwZXJtaXNzaW9ucyBvciByZXNvdXJjZS10YWcgY29uZGl0aW9ucy5cbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgfSkpO1xuICAgIHJ1bm5pbmdTY2hlZHVsZUZ1bmN0aW9uLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIHRhZ2dlZEluc3RhbmNlU3RhcnRTdG9wU3RhdGVtZW50KHRoaXMsIHByb3BzLnRhcmdldFJlc291cmNlKSxcbiAgICApO1xuICAgIC8vIEdyYW50IHJlYWQgYWNjZXNzIHRvIHRoZSBTbGFjayBzZWNyZXRcbiAgICBzbGFja1NlY3JldC5ncmFudFJlYWQocnVubmluZ1NjaGVkdWxlRnVuY3Rpb24pO1xuXG4gICAgdGhpcy5mYWlsdXJlRGV0ZWN0aW9uID0gY3JlYXRlUnVubmluZ1NjaGVkdWxlckZhaWx1cmVEZXRlY3Rpb24odGhpcywgJ0ZhaWx1cmVEZXRlY3Rpb24nLCB7XG4gICAgICBmYWlsdXJlRGV0ZWN0aW9uOiBwcm9wcy5mYWlsdXJlRGV0ZWN0aW9uLFxuICAgICAgcnVubmluZ1NjaGVkdWxlRnVuY3Rpb24sXG4gICAgICBsb2dHcm91cDogcnVubmluZ1NjaGVkdWxlRnVuY3Rpb25Mb2dHcm91cCxcbiAgICB9KTtcblxuICAgIC8vIFNlZTogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvZHVyYWJsZS1nZXR0aW5nLXN0YXJ0ZWQtaWFjLmh0bWxcbiAgICBjb25zdCBydW5uaW5nU2NoZWR1bGVGdW5jdGlvbkFsaWFzID0gcnVubmluZ1NjaGVkdWxlRnVuY3Rpb24uYWRkQWxpYXMoJ2xpdmUnKTtcblxuICAgIC8vIFdoZXRoZXIgc2NoZWR1bGVzIGFyZSBlbmFibGVkIChkZWZhdWx0IHRydWUgdW5sZXNzIGV4cGxpY2l0bHkgZGlzYWJsZWQpLlxuICAgIGNvbnN0IHNjaGVkdWxlRW5hYmxlZDogYm9vbGVhbiA9ICgoKSA9PiB7XG4gICAgICBpZiAocHJvcHMuZW5hYmxlU2NoZWR1bGluZyA9PT0gdW5kZWZpbmVkIHx8IHByb3BzLmVuYWJsZVNjaGVkdWxpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSkoKTtcblxuICAgIC8vIER1cmFibGUgRnVuY3Rpb25zOiBMYW1iZGEgcGVyZm9ybXMgdGFnIGxvb2t1cCBhbmQgaW5zdGFuY2Ugc3RhcnQvc3RvcCBpbiBhIHNpbmdsZSBydW4uXG4gICAgbmV3IHNjaGVkdWxlci5TY2hlZHVsZSh0aGlzLCAnUnVubmluZ1N0YXJ0U2NoZWR1bGUnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ3J1bm5pbmcgc3RhcnQgc2NoZWR1bGUnLFxuICAgICAgZW5hYmxlZDogc2NoZWR1bGVFbmFibGVkLFxuICAgICAgc2NoZWR1bGU6IHNjaGVkdWxlci5TY2hlZHVsZUV4cHJlc3Npb24uY3Jvbih7XG4gICAgICAgIG1pbnV0ZTogcHJvcHMuc3RhcnRTY2hlZHVsZT8ubWludXRlID8/ICc1MCcsXG4gICAgICAgIGhvdXI6IHByb3BzLnN0YXJ0U2NoZWR1bGU/LmhvdXIgPz8gJzcnLFxuICAgICAgICB3ZWVrRGF5OiBwcm9wcy5zdGFydFNjaGVkdWxlPy53ZWVrID8/ICdNT04tRlJJJyxcbiAgICAgICAgdGltZVpvbmU6IHByb3BzLnN0YXJ0U2NoZWR1bGU/LnRpbWV6b25lID8/IFRpbWVab25lLkVUQ19VVEMsXG4gICAgICB9KSxcbiAgICAgIHRhcmdldDogbmV3IHRhcmdldHMuTGFtYmRhSW52b2tlKHJ1bm5pbmdTY2hlZHVsZUZ1bmN0aW9uQWxpYXMsIHtcbiAgICAgICAgaW5wdXQ6IHNjaGVkdWxlci5TY2hlZHVsZVRhcmdldElucHV0LmZyb21PYmplY3Qoe1xuICAgICAgICAgIFBhcmFtczoge1xuICAgICAgICAgICAgVGFnS2V5OiBwcm9wcy50YXJnZXRSZXNvdXJjZS50YWdLZXksXG4gICAgICAgICAgICBUYWdWYWx1ZXM6IHByb3BzLnRhcmdldFJlc291cmNlLnRhZ1ZhbHVlcyxcbiAgICAgICAgICAgIE1vZGU6ICdTdGFydCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIG5ldyBzY2hlZHVsZXIuU2NoZWR1bGUodGhpcywgJ1J1bm5pbmdTdG9wU2NoZWR1bGUnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ3J1bm5pbmcgc3RvcCBzY2hlZHVsZScsXG4gICAgICBlbmFibGVkOiBzY2hlZHVsZUVuYWJsZWQsXG4gICAgICBzY2hlZHVsZTogc2NoZWR1bGVyLlNjaGVkdWxlRXhwcmVzc2lvbi5jcm9uKHtcbiAgICAgICAgbWludXRlOiBwcm9wcy5zdG9wU2NoZWR1bGU/Lm1pbnV0ZSA/PyAnNScsXG4gICAgICAgIGhvdXI6IHByb3BzLnN0b3BTY2hlZHVsZT8uaG91ciA/PyAnMTknLFxuICAgICAgICB3ZWVrRGF5OiBwcm9wcy5zdG9wU2NoZWR1bGU/LndlZWsgPz8gJ01PTi1GUkknLFxuICAgICAgICB0aW1lWm9uZTogcHJvcHMuc3RvcFNjaGVkdWxlPy50aW1lem9uZSA/PyBUaW1lWm9uZS5FVENfVVRDLFxuICAgICAgfSksXG4gICAgICB0YXJnZXQ6IG5ldyB0YXJnZXRzLkxhbWJkYUludm9rZShydW5uaW5nU2NoZWR1bGVGdW5jdGlvbkFsaWFzLCB7XG4gICAgICAgIGlucHV0OiBzY2hlZHVsZXIuU2NoZWR1bGVUYXJnZXRJbnB1dC5mcm9tT2JqZWN0KHtcbiAgICAgICAgICBQYXJhbXM6IHtcbiAgICAgICAgICAgIFRhZ0tleTogcHJvcHMudGFyZ2V0UmVzb3VyY2UudGFnS2V5LFxuICAgICAgICAgICAgVGFnVmFsdWVzOiBwcm9wcy50YXJnZXRSZXNvdXJjZS50YWdWYWx1ZXMsXG4gICAgICAgICAgICBNb2RlOiAnU3RvcCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as sns from 'aws-cdk-lib/aws-sns';
|
|
2
|
+
/**
|
|
3
|
+
* Opt-in options for {@link LambdaFailureDetector}.
|
|
4
|
+
*
|
|
5
|
+
* When {@link LambdaFailureDetection.enabled} is true, alarms are created.
|
|
6
|
+
* {@link LambdaFailureDetection.alarmTopic} is optional; when omitted, alarms have no SNS actions.
|
|
7
|
+
* The construct never creates an SNS topic.
|
|
8
|
+
*/
|
|
9
|
+
export interface LambdaFailureDetection {
|
|
10
|
+
/**
|
|
11
|
+
* When true, creates failure detection alarms and log-based metrics.
|
|
12
|
+
*
|
|
13
|
+
* @default false when omitted
|
|
14
|
+
*/
|
|
15
|
+
readonly enabled?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* SNS topic for alarm notifications.
|
|
18
|
+
*
|
|
19
|
+
* When omitted, alarms are created without SNS actions.
|
|
20
|
+
*/
|
|
21
|
+
readonly alarmTopic?: sns.ITopic;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Whether {@link LambdaFailureDetection} requests alarm creation.
|
|
25
|
+
*/
|
|
26
|
+
export declare const isLambdaFailureDetectionEnabled: (failureDetection: LambdaFailureDetection) => boolean;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isLambdaFailureDetectionEnabled = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Whether {@link LambdaFailureDetection} requests alarm creation.
|
|
6
|
+
*/
|
|
7
|
+
const isLambdaFailureDetectionEnabled = (failureDetection) => failureDetection.enabled === true;
|
|
8
|
+
exports.isLambdaFailureDetectionEnabled = isLambdaFailureDetectionEnabled;
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLWZhaWx1cmUtZGV0ZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbnN0cnVjdHMvbGFtYmRhLWZhaWx1cmUtZGV0ZWN0b3IvbGFtYmRhLWZhaWx1cmUtZGV0ZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXdCQTs7R0FFRztBQUNJLE1BQU0sK0JBQStCLEdBQUcsQ0FDN0MsZ0JBQXdDLEVBQy9CLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDO0FBRm5DLFFBQUEsK0JBQStCLG1DQUVJIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgc25zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMnO1xuXG4vKipcbiAqIE9wdC1pbiBvcHRpb25zIGZvciB7QGxpbmsgTGFtYmRhRmFpbHVyZURldGVjdG9yfS5cbiAqXG4gKiBXaGVuIHtAbGluayBMYW1iZGFGYWlsdXJlRGV0ZWN0aW9uLmVuYWJsZWR9IGlzIHRydWUsIGFsYXJtcyBhcmUgY3JlYXRlZC5cbiAqIHtAbGluayBMYW1iZGFGYWlsdXJlRGV0ZWN0aW9uLmFsYXJtVG9waWN9IGlzIG9wdGlvbmFsOyB3aGVuIG9taXR0ZWQsIGFsYXJtcyBoYXZlIG5vIFNOUyBhY3Rpb25zLlxuICogVGhlIGNvbnN0cnVjdCBuZXZlciBjcmVhdGVzIGFuIFNOUyB0b3BpYy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYW1iZGFGYWlsdXJlRGV0ZWN0aW9uIHtcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgY3JlYXRlcyBmYWlsdXJlIGRldGVjdGlvbiBhbGFybXMgYW5kIGxvZy1iYXNlZCBtZXRyaWNzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZSB3aGVuIG9taXR0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogU05TIHRvcGljIGZvciBhbGFybSBub3RpZmljYXRpb25zLlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIGFsYXJtcyBhcmUgY3JlYXRlZCB3aXRob3V0IFNOUyBhY3Rpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxhcm1Ub3BpYz86IHNucy5JVG9waWM7XG59XG5cbi8qKlxuICogV2hldGhlciB7QGxpbmsgTGFtYmRhRmFpbHVyZURldGVjdGlvbn0gcmVxdWVzdHMgYWxhcm0gY3JlYXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBpc0xhbWJkYUZhaWx1cmVEZXRlY3Rpb25FbmFibGVkID0gKFxuICBmYWlsdXJlRGV0ZWN0aW9uOiBMYW1iZGFGYWlsdXJlRGV0ZWN0aW9uLFxuKTogYm9vbGVhbiA9PiBmYWlsdXJlRGV0ZWN0aW9uLmVuYWJsZWQgPT09IHRydWU7XG4iXX0=
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch';
|
|
2
|
+
import * as lambda from 'aws-cdk-lib/aws-lambda';
|
|
3
|
+
import * as logs from 'aws-cdk-lib/aws-logs';
|
|
4
|
+
import * as sns from 'aws-cdk-lib/aws-sns';
|
|
5
|
+
import { Construct } from 'constructs';
|
|
6
|
+
import { type LambdaFailureDetection } from './lambda-failure-detection';
|
|
7
|
+
import type { LogFailureFilter } from './log-failure-filter';
|
|
8
|
+
/**
|
|
9
|
+
* Alarm created for one {@link LogFailureFilter}.
|
|
10
|
+
*/
|
|
11
|
+
export interface LogFailureAlarm {
|
|
12
|
+
/** Same as {@link LogFailureFilter.id}. */
|
|
13
|
+
readonly id: string;
|
|
14
|
+
/** Alarm on the log metric filter sum. */
|
|
15
|
+
readonly alarm: cloudwatch.Alarm;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Props for {@link LambdaFailureDetector}.
|
|
19
|
+
*/
|
|
20
|
+
export interface LambdaFailureDetectorProps {
|
|
21
|
+
/** Lambda function whose platform `Errors` metric is alarmed. */
|
|
22
|
+
readonly lambdaFunction: lambda.IFunction;
|
|
23
|
+
/** Log group used for {@link LogFailureFilter} metric filters. */
|
|
24
|
+
readonly logGroup: logs.ILogGroup;
|
|
25
|
+
/**
|
|
26
|
+
* Optional SNS topic for all alarm actions.
|
|
27
|
+
*
|
|
28
|
+
* When omitted, alarms are created without SNS actions.
|
|
29
|
+
*/
|
|
30
|
+
readonly alarmTopic?: sns.ITopic;
|
|
31
|
+
/**
|
|
32
|
+
* Log-based failure filters. Each entry creates a metric filter and alarm.
|
|
33
|
+
*
|
|
34
|
+
* @default no log-based alarms
|
|
35
|
+
*/
|
|
36
|
+
readonly logFilters?: LogFailureFilter[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Props accepted by {@link createLambdaFailureDetector}.
|
|
40
|
+
*/
|
|
41
|
+
export interface CreateLambdaFailureDetectorProps {
|
|
42
|
+
/** Opt-in options; alarms are created only when {@link LambdaFailureDetection.enabled} is true. */
|
|
43
|
+
readonly failureDetection?: LambdaFailureDetection;
|
|
44
|
+
/** Lambda function to monitor. */
|
|
45
|
+
readonly lambdaFunction: lambda.IFunction;
|
|
46
|
+
/** Application log group for log-based filters. */
|
|
47
|
+
readonly logGroup: logs.ILogGroup;
|
|
48
|
+
/**
|
|
49
|
+
* Log-based failure filters.
|
|
50
|
+
*
|
|
51
|
+
* @default no log-based alarms
|
|
52
|
+
*/
|
|
53
|
+
readonly logFilters?: LogFailureFilter[];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* CloudWatch failure detection for a Lambda function.
|
|
57
|
+
*
|
|
58
|
+
* Always creates a platform `AWS/Lambda` `Errors` alarm. Optionally creates one
|
|
59
|
+
* metric filter + alarm per {@link LogFailureFilter}. Does not create an SNS topic;
|
|
60
|
+
* pass {@link LambdaFailureDetectorProps.alarmTopic} to attach notifications.
|
|
61
|
+
*
|
|
62
|
+
* Entry module for `lambda-failure-detector/`: import types and helpers from this file only.
|
|
63
|
+
*/
|
|
64
|
+
export declare class LambdaFailureDetector extends Construct {
|
|
65
|
+
/** SNS topic used for alarm actions, when configured. */
|
|
66
|
+
readonly alarmTopic?: sns.ITopic;
|
|
67
|
+
/** Fires when the Lambda `Errors` metric is non-zero. */
|
|
68
|
+
readonly lambdaErrorsAlarm: cloudwatch.Alarm;
|
|
69
|
+
/**
|
|
70
|
+
* Alarms for each log filter, in the same order as
|
|
71
|
+
* {@link LambdaFailureDetectorProps.logFilters}.
|
|
72
|
+
*/
|
|
73
|
+
readonly logFilterAlarms: LogFailureAlarm[];
|
|
74
|
+
/**
|
|
75
|
+
* @param scope - Parent construct.
|
|
76
|
+
* @param id - Construct id.
|
|
77
|
+
* @param props - Lambda, log group, optional topic, and log filters.
|
|
78
|
+
*/
|
|
79
|
+
constructor(scope: Construct, id: string, props: LambdaFailureDetectorProps);
|
|
80
|
+
/**
|
|
81
|
+
* Returns the log-filter alarm for the given filter id, or undefined when missing.
|
|
82
|
+
*
|
|
83
|
+
* @param id - Same as {@link LogFailureFilter.id}.
|
|
84
|
+
* @returns Matching alarm, or undefined when the id was not in `logFilters`.
|
|
85
|
+
*/
|
|
86
|
+
findLogFilterAlarm(id: string): cloudwatch.Alarm | undefined;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Creates a {@link LambdaFailureDetector} when failure detection is enabled.
|
|
90
|
+
*
|
|
91
|
+
* @param scope - Parent construct.
|
|
92
|
+
* @param id - Construct id.
|
|
93
|
+
* @param props - Lambda, log group, optional opt-in options, and log filters.
|
|
94
|
+
* @returns Detector construct, or undefined when disabled.
|
|
95
|
+
*/
|
|
96
|
+
export declare const createLambdaFailureDetector: (scope: Construct, id: string, props: CreateLambdaFailureDetectorProps) => LambdaFailureDetector | undefined;
|
|
97
|
+
export type { LambdaFailureDetection } from './lambda-failure-detection';
|
|
98
|
+
export { isLambdaFailureDetectionEnabled } from './lambda-failure-detection';
|
|
99
|
+
export type { LogFailureFilter } from './log-failure-filter';
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.isLambdaFailureDetectionEnabled = exports.createLambdaFailureDetector = exports.LambdaFailureDetector = void 0;
|
|
37
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
38
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
39
|
+
const cloudwatch = __importStar(require("aws-cdk-lib/aws-cloudwatch"));
|
|
40
|
+
const cloudwatch_actions = __importStar(require("aws-cdk-lib/aws-cloudwatch-actions"));
|
|
41
|
+
const logs = __importStar(require("aws-cdk-lib/aws-logs"));
|
|
42
|
+
const constructs_1 = require("constructs");
|
|
43
|
+
const lambda_failure_detection_1 = require("./lambda-failure-detection");
|
|
44
|
+
/** Alarm threshold for failure sum metrics. */
|
|
45
|
+
const FAILURE_ALARM_THRESHOLD = 1;
|
|
46
|
+
/** Evaluation periods for failure alarms. */
|
|
47
|
+
const FAILURE_ALARM_EVALUATION_PERIODS = 1;
|
|
48
|
+
/** Metric period for failure alarms. */
|
|
49
|
+
const FAILURE_ALARM_PERIOD = aws_cdk_lib_1.Duration.minutes(5);
|
|
50
|
+
/** Statistic used for failure sum metrics. */
|
|
51
|
+
const FAILURE_ALARM_STATISTIC = 'Sum';
|
|
52
|
+
/** Metric filter value emitted per matching log event. */
|
|
53
|
+
const LOG_METRIC_VALUE = '1';
|
|
54
|
+
/** Default value when no matching log events occur in the period. */
|
|
55
|
+
const LOG_METRIC_DEFAULT_VALUE = 0;
|
|
56
|
+
/**
|
|
57
|
+
* Registers an SNS alarm action when a topic is configured.
|
|
58
|
+
*/
|
|
59
|
+
const attachAlarmActions = (alarm, alarmTopic) => {
|
|
60
|
+
if (!alarmTopic) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
alarm.addAlarmAction(new cloudwatch_actions.SnsAction(alarmTopic));
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Creates a CloudWatch alarm that fires when a sum metric is at or above the failure threshold.
|
|
67
|
+
*
|
|
68
|
+
* Uses `treatMissingData: notBreaching` so scheduled invocations do not alarm between runs.
|
|
69
|
+
*/
|
|
70
|
+
const createSumAlarm = (scope, id, props) => {
|
|
71
|
+
// CreateAlarmOptionsBase typings in this aws-cdk-lib build omit evaluationPeriods;
|
|
72
|
+
// the Alarm construct still accepts the property at synth time.
|
|
73
|
+
const alarm = new cloudwatch.Alarm(scope, id, {
|
|
74
|
+
metric: props.metric,
|
|
75
|
+
threshold: FAILURE_ALARM_THRESHOLD,
|
|
76
|
+
comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
|
|
77
|
+
evaluationPeriods: FAILURE_ALARM_EVALUATION_PERIODS,
|
|
78
|
+
treatMissingData: cloudwatch.TreatMissingData.NOT_BREACHING,
|
|
79
|
+
});
|
|
80
|
+
attachAlarmActions(alarm, props.alarmTopic);
|
|
81
|
+
return alarm;
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* CloudWatch failure detection for a Lambda function.
|
|
85
|
+
*
|
|
86
|
+
* Always creates a platform `AWS/Lambda` `Errors` alarm. Optionally creates one
|
|
87
|
+
* metric filter + alarm per {@link LogFailureFilter}. Does not create an SNS topic;
|
|
88
|
+
* pass {@link LambdaFailureDetectorProps.alarmTopic} to attach notifications.
|
|
89
|
+
*
|
|
90
|
+
* Entry module for `lambda-failure-detector/`: import types and helpers from this file only.
|
|
91
|
+
*/
|
|
92
|
+
class LambdaFailureDetector extends constructs_1.Construct {
|
|
93
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "ec2-instance-running-scheduler.LambdaFailureDetector", version: "0.5.0" };
|
|
94
|
+
/** SNS topic used for alarm actions, when configured. */
|
|
95
|
+
alarmTopic;
|
|
96
|
+
/** Fires when the Lambda `Errors` metric is non-zero. */
|
|
97
|
+
lambdaErrorsAlarm;
|
|
98
|
+
/**
|
|
99
|
+
* Alarms for each log filter, in the same order as
|
|
100
|
+
* {@link LambdaFailureDetectorProps.logFilters}.
|
|
101
|
+
*/
|
|
102
|
+
logFilterAlarms;
|
|
103
|
+
/**
|
|
104
|
+
* @param scope - Parent construct.
|
|
105
|
+
* @param id - Construct id.
|
|
106
|
+
* @param props - Lambda, log group, optional topic, and log filters.
|
|
107
|
+
*/
|
|
108
|
+
constructor(scope, id, props) {
|
|
109
|
+
super(scope, id);
|
|
110
|
+
const alarmTopic = props.alarmTopic;
|
|
111
|
+
this.alarmTopic = alarmTopic;
|
|
112
|
+
this.lambdaErrorsAlarm = createSumAlarm(this, 'LambdaErrorsAlarm', {
|
|
113
|
+
metric: props.lambdaFunction.metricErrors({
|
|
114
|
+
period: FAILURE_ALARM_PERIOD,
|
|
115
|
+
statistic: FAILURE_ALARM_STATISTIC,
|
|
116
|
+
}),
|
|
117
|
+
alarmTopic,
|
|
118
|
+
});
|
|
119
|
+
const logFilters = props.logFilters ?? [];
|
|
120
|
+
this.logFilterAlarms = logFilters.map((filter) => {
|
|
121
|
+
const metricFilter = new logs.MetricFilter(this, `${filter.id}Metric`, {
|
|
122
|
+
logGroup: props.logGroup,
|
|
123
|
+
filterPattern: logs.FilterPattern.literal(filter.filterPattern),
|
|
124
|
+
metricNamespace: filter.metricNamespace,
|
|
125
|
+
metricName: filter.metricName,
|
|
126
|
+
metricValue: LOG_METRIC_VALUE,
|
|
127
|
+
defaultValue: LOG_METRIC_DEFAULT_VALUE,
|
|
128
|
+
});
|
|
129
|
+
const alarm = createSumAlarm(this, `${filter.id}Alarm`, {
|
|
130
|
+
metric: metricFilter.metric({
|
|
131
|
+
period: FAILURE_ALARM_PERIOD,
|
|
132
|
+
statistic: FAILURE_ALARM_STATISTIC,
|
|
133
|
+
}),
|
|
134
|
+
alarmTopic,
|
|
135
|
+
});
|
|
136
|
+
return { id: filter.id, alarm };
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Returns the log-filter alarm for the given filter id, or undefined when missing.
|
|
141
|
+
*
|
|
142
|
+
* @param id - Same as {@link LogFailureFilter.id}.
|
|
143
|
+
* @returns Matching alarm, or undefined when the id was not in `logFilters`.
|
|
144
|
+
*/
|
|
145
|
+
findLogFilterAlarm(id) {
|
|
146
|
+
return this.logFilterAlarms.find((entry) => entry.id === id)?.alarm;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
exports.LambdaFailureDetector = LambdaFailureDetector;
|
|
150
|
+
/**
|
|
151
|
+
* Creates a {@link LambdaFailureDetector} when failure detection is enabled.
|
|
152
|
+
*
|
|
153
|
+
* @param scope - Parent construct.
|
|
154
|
+
* @param id - Construct id.
|
|
155
|
+
* @param props - Lambda, log group, optional opt-in options, and log filters.
|
|
156
|
+
* @returns Detector construct, or undefined when disabled.
|
|
157
|
+
*/
|
|
158
|
+
const createLambdaFailureDetector = (scope, id, props) => {
|
|
159
|
+
if (!props.failureDetection || !(0, lambda_failure_detection_1.isLambdaFailureDetectionEnabled)(props.failureDetection)) {
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
return new LambdaFailureDetector(scope, id, {
|
|
163
|
+
lambdaFunction: props.lambdaFunction,
|
|
164
|
+
logGroup: props.logGroup,
|
|
165
|
+
alarmTopic: props.failureDetection.alarmTopic,
|
|
166
|
+
logFilters: props.logFilters,
|
|
167
|
+
});
|
|
168
|
+
};
|
|
169
|
+
exports.createLambdaFailureDetector = createLambdaFailureDetector;
|
|
170
|
+
var lambda_failure_detection_2 = require("./lambda-failure-detection");
|
|
171
|
+
Object.defineProperty(exports, "isLambdaFailureDetectionEnabled", { enumerable: true, get: function () { return lambda_failure_detection_2.isLambdaFailureDetectionEnabled; } });
|
|
172
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLWZhaWx1cmUtZGV0ZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29uc3RydWN0cy9sYW1iZGEtZmFpbHVyZS1kZXRlY3Rvci9sYW1iZGEtZmFpbHVyZS1kZXRlY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXVDO0FBQ3ZDLHVFQUF5RDtBQUN6RCx1RkFBeUU7QUFFekUsMkRBQTZDO0FBRTdDLDJDQUF1QztBQUN2Qyx5RUFHb0M7QUFHcEMsK0NBQStDO0FBQy9DLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO0FBQ2xDLDZDQUE2QztBQUM3QyxNQUFNLGdDQUFnQyxHQUFHLENBQUMsQ0FBQztBQUMzQyx3Q0FBd0M7QUFDeEMsTUFBTSxvQkFBb0IsR0FBRyxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRCw4Q0FBOEM7QUFDOUMsTUFBTSx1QkFBdUIsR0FBRyxLQUFLLENBQUM7QUFDdEMsMERBQTBEO0FBQzFELE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO0FBQzdCLHFFQUFxRTtBQUNyRSxNQUFNLHdCQUF3QixHQUFHLENBQUMsQ0FBQztBQW9EbkM7O0dBRUc7QUFDSCxNQUFNLGtCQUFrQixHQUFHLENBQUMsS0FBdUIsRUFBRSxVQUF1QixFQUFRLEVBQUU7SUFDcEYsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE9BQU87SUFDVCxDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLENBQUMsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLGNBQWMsR0FBRyxDQUNyQixLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FHQyxFQUNpQixFQUFFO0lBQ3BCLG1GQUFtRjtJQUNuRixnRUFB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SixFQUFFO0lBQ3JDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxJQUFBLDBEQUErQixFQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7UUFDeEYsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELE9BQU8sSUFBSSxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1FBQzFDLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYztRQUNwQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7UUFDeEIsVUFBVSxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVO1FBQzdDLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtLQUM3QixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFmVyxRQUFBLDJCQUEyQiwrQkFldEM7QUFHRix1RUFBNkU7QUFBcEUsMklBQUEsK0JBQStCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0ICogYXMgY2xvdWR3YXRjaF9hY3Rpb25zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoLWFjdGlvbnMnO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0ICogYXMgbG9ncyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbG9ncyc7XG5pbXBvcnQgKiBhcyBzbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7XG4gIGlzTGFtYmRhRmFpbHVyZURldGVjdGlvbkVuYWJsZWQsXG4gIHR5cGUgTGFtYmRhRmFpbHVyZURldGVjdGlvbixcbn0gZnJvbSAnLi9sYW1iZGEtZmFpbHVyZS1kZXRlY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBMb2dGYWlsdXJlRmlsdGVyIH0gZnJvbSAnLi9sb2ctZmFpbHVyZS1maWx0ZXInO1xuXG4vKiogQWxhcm0gdGhyZXNob2xkIGZvciBmYWlsdXJlIHN1bSBtZXRyaWNzLiAqL1xuY29uc3QgRkFJTFVSRV9BTEFSTV9USFJFU0hPTEQgPSAxO1xuLyoqIEV2YWx1YXRpb24gcGVyaW9kcyBmb3IgZmFpbHVyZSBhbGFybXMuICovXG5jb25zdCBGQUlMVVJFX0FMQVJNX0VWQUxVQVRJT05fUEVSSU9EUyA9IDE7XG4vKiogTWV0cmljIHBlcmlvZCBmb3IgZmFpbHVyZSBhbGFybXMuICovXG5jb25zdCBGQUlMVVJFX0FMQVJNX1BFUklPRCA9IER1cmF0aW9uLm1pbnV0ZXMoNSk7XG4vKiogU3RhdGlzdGljIHVzZWQgZm9yIGZhaWx1cmUgc3VtIG1ldHJpY3MuICovXG5jb25zdCBGQUlMVVJFX0FMQVJNX1NUQVRJU1RJQyA9ICdTdW0nO1xuLyoqIE1ldHJpYyBmaWx0ZXIgdmFsdWUgZW1pdHRlZCBwZXIgbWF0Y2hpbmcgbG9nIGV2ZW50LiAqL1xuY29uc3QgTE9HX01FVFJJQ19WQUxVRSA9ICcxJztcbi8qKiBEZWZhdWx0IHZhbHVlIHdoZW4gbm8gbWF0Y2hpbmcgbG9nIGV2ZW50cyBvY2N1ciBpbiB0aGUgcGVyaW9kLiAqL1xuY29uc3QgTE9HX01FVFJJQ19ERUZBVUxUX1ZBTFVFID0gMDtcblxuLyoqXG4gKiBBbGFybSBjcmVhdGVkIGZvciBvbmUge0BsaW5rIExvZ0ZhaWx1cmVGaWx0ZXJ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ0ZhaWx1cmVBbGFybSB7XG4gIC8qKiBTYW1lIGFzIHtAbGluayBMb2dGYWlsdXJlRmlsdGVyLmlkfS4gKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgLyoqIEFsYXJtIG9uIHRoZSBsb2cgbWV0cmljIGZpbHRlciBzdW0uICovXG4gIHJlYWRvbmx5IGFsYXJtOiBjbG91ZHdhdGNoLkFsYXJtO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciB7QGxpbmsgTGFtYmRhRmFpbHVyZURldGVjdG9yfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYW1iZGFGYWlsdXJlRGV0ZWN0b3JQcm9wcyB7XG4gIC8qKiBMYW1iZGEgZnVuY3Rpb24gd2hvc2UgcGxhdGZvcm0gYEVycm9yc2AgbWV0cmljIGlzIGFsYXJtZWQuICovXG4gIHJlYWRvbmx5IGxhbWJkYUZ1bmN0aW9uOiBsYW1iZGEuSUZ1bmN0aW9uO1xuICAvKiogTG9nIGdyb3VwIHVzZWQgZm9yIHtAbGluayBMb2dGYWlsdXJlRmlsdGVyfSBtZXRyaWMgZmlsdGVycy4gKi9cbiAgcmVhZG9ubHkgbG9nR3JvdXA6IGxvZ3MuSUxvZ0dyb3VwO1xuICAvKipcbiAgICogT3B0aW9uYWwgU05TIHRvcGljIGZvciBhbGwgYWxhcm0gYWN0aW9ucy5cbiAgICpcbiAgICogV2hlbiBvbWl0dGVkLCBhbGFybXMgYXJlIGNyZWF0ZWQgd2l0aG91dCBTTlMgYWN0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGFsYXJtVG9waWM/OiBzbnMuSVRvcGljO1xuICAvKipcbiAgICogTG9nLWJhc2VkIGZhaWx1cmUgZmlsdGVycy4gRWFjaCBlbnRyeSBjcmVhdGVzIGEgbWV0cmljIGZpbHRlciBhbmQgYWxhcm0uXG4gICAqXG4gICAqIEBkZWZhdWx0IG5vIGxvZy1iYXNlZCBhbGFybXNcbiAgICovXG4gIHJlYWRvbmx5IGxvZ0ZpbHRlcnM/OiBMb2dGYWlsdXJlRmlsdGVyW107XG59XG5cbi8qKlxuICogUHJvcHMgYWNjZXB0ZWQgYnkge0BsaW5rIGNyZWF0ZUxhbWJkYUZhaWx1cmVEZXRlY3Rvcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlTGFtYmRhRmFpbHVyZURldGVjdG9yUHJvcHMge1xuICAvKiogT3B0LWluIG9wdGlvbnM7IGFsYXJtcyBhcmUgY3JlYXRlZCBvbmx5IHdoZW4ge0BsaW5rIExhbWJkYUZhaWx1cmVEZXRlY3Rpb24uZW5hYmxlZH0gaXMgdHJ1ZS4gKi9cbiAgcmVhZG9ubHkgZmFpbHVyZURldGVjdGlvbj86IExhbWJkYUZhaWx1cmVEZXRlY3Rpb247XG4gIC8qKiBMYW1iZGEgZnVuY3Rpb24gdG8gbW9uaXRvci4gKi9cbiAgcmVhZG9ubHkgbGFtYmRhRnVuY3Rpb246IGxhbWJkYS5JRnVuY3Rpb247XG4gIC8qKiBBcHBsaWNhdGlvbiBsb2cgZ3JvdXAgZm9yIGxvZy1iYXNlZCBmaWx0ZXJzLiAqL1xuICByZWFkb25seSBsb2dHcm91cDogbG9ncy5JTG9nR3JvdXA7XG4gIC8qKlxuICAgKiBMb2ctYmFzZWQgZmFpbHVyZSBmaWx0ZXJzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBubyBsb2ctYmFzZWQgYWxhcm1zXG4gICAqL1xuICByZWFkb25seSBsb2dGaWx0ZXJzPzogTG9nRmFpbHVyZUZpbHRlcltdO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhbiBTTlMgYWxhcm0gYWN0aW9uIHdoZW4gYSB0b3BpYyBpcyBjb25maWd1cmVkLlxuICovXG5jb25zdCBhdHRhY2hBbGFybUFjdGlvbnMgPSAoYWxhcm06IGNsb3Vkd2F0Y2guQWxhcm0sIGFsYXJtVG9waWM/OiBzbnMuSVRvcGljKTogdm9pZCA9PiB7XG4gIGlmICghYWxhcm1Ub3BpYykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGFsYXJtLmFkZEFsYXJtQWN0aW9uKG5ldyBjbG91ZHdhdGNoX2FjdGlvbnMuU25zQWN0aW9uKGFsYXJtVG9waWMpKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIENsb3VkV2F0Y2ggYWxhcm0gdGhhdCBmaXJlcyB3aGVuIGEgc3VtIG1ldHJpYyBpcyBhdCBvciBhYm92ZSB0aGUgZmFpbHVyZSB0aHJlc2hvbGQuXG4gKlxuICogVXNlcyBgdHJlYXRNaXNzaW5nRGF0YTogbm90QnJlYWNoaW5nYCBzbyBzY2hlZHVsZWQgaW52b2NhdGlvbnMgZG8gbm90IGFsYXJtIGJldHdlZW4gcnVucy5cbiAqL1xuY29uc3QgY3JlYXRlU3VtQWxhcm0gPSAoXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXG4gIGlkOiBzdHJpbmcsXG4gIHByb3BzOiB7XG4gICAgbWV0cmljOiBjbG91ZHdhdGNoLklNZXRyaWM7XG4gICAgYWxhcm1Ub3BpYz86IHNucy5JVG9waWM7XG4gIH0sXG4pOiBjbG91ZHdhdGNoLkFsYXJtID0+IHtcbiAgLy8gQ3JlYXRlQWxhcm1PcHRpb25zQmFzZSB0eXBpbmdzIGluIHRoaXMgYXdzLWNkay1saWIgYnVpbGQgb21pdCBldmFsdWF0aW9uUGVyaW9kcztcbiAgLy8gdGhlIEFsYXJtIGNvbnN0cnVjdCBzdGlsbCBhY2NlcHRzIHRoZSBwcm9wZXJ0eSBhdCBzeW50aCB0aW1lLlxuICBjb25zdCBhbGFybSA9IG5ldyBjbG91ZHdhdGNoLkFsYXJtKHNjb3BlLCBpZCwge1xuICAgIG1ldHJpYzogcHJvcHMubWV0cmljLFxuICAgIHRocmVzaG9sZDogRkFJTFVSRV9BTEFSTV9USFJFU0hPTEQsXG4gICAgY29tcGFyaXNvbk9wZXJhdG9yOiBjbG91ZHdhdGNoLkNvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fT1JfRVFVQUxfVE9fVEhSRVNIT0xELFxuICAgIGV2YWx1YXRpb25QZXJpb2RzOiBGQUlMVVJFX0FMQVJNX0VWQUxVQVRJT05fUEVSSU9EUyxcbiAgICB0cmVhdE1pc3NpbmdEYXRhOiBjbG91ZHdhdGNoLlRyZWF0TWlzc2luZ0RhdGEuTk9UX0JSRUFDSElORyxcbiAgfSBhcyBjbG91ZHdhdGNoLkFsYXJtUHJvcHMpO1xuICBhdHRhY2hBbGFybUFjdGlvbnMoYWxhcm0sIHByb3BzLmFsYXJtVG9waWMpO1xuICByZXR1cm4gYWxhcm07XG59O1xuXG4vKipcbiAqIENsb3VkV2F0Y2ggZmFpbHVyZSBkZXRlY3Rpb24gZm9yIGEgTGFtYmRhIGZ1bmN0aW9uLlxuICpcbiAqIEFsd2F5cyBjcmVhdGVzIGEgcGxhdGZvcm0gYEFXUy9MYW1iZGFgIGBFcnJvcnNgIGFsYXJtLiBPcHRpb25hbGx5IGNyZWF0ZXMgb25lXG4gKiBtZXRyaWMgZmlsdGVyICsgYWxhcm0gcGVyIHtAbGluayBMb2dGYWlsdXJlRmlsdGVyfS4gRG9lcyBub3QgY3JlYXRlIGFuIFNOUyB0b3BpYztcbiAqIHBhc3Mge0BsaW5rIExhbWJkYUZhaWx1cmVEZXRlY3RvclByb3BzLmFsYXJtVG9waWN9IHRvIGF0dGFjaCBub3RpZmljYXRpb25zLlxuICpcbiAqIEVudHJ5IG1vZHVsZSBmb3IgYGxhbWJkYS1mYWlsdXJlLWRldGVjdG9yL2A6IGltcG9ydCB0eXBlcyBhbmQgaGVscGVycyBmcm9tIHRoaXMgZmlsZSBvbmx5LlxuICovXG5leHBvcnQgY2xhc3MgTGFtYmRhRmFpbHVyZURldGVjdG9yIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqIFNOUyB0b3BpYyB1c2VkIGZvciBhbGFybSBhY3Rpb25zLCB3aGVuIGNvbmZpZ3VyZWQuICovXG4gIHB1YmxpYyByZWFkb25seSBhbGFybVRvcGljPzogc25zLklUb3BpYztcbiAgLyoqIEZpcmVzIHdoZW4gdGhlIExhbWJkYSBgRXJyb3JzYCBtZXRyaWMgaXMgbm9uLXplcm8uICovXG4gIHB1YmxpYyByZWFkb25seSBsYW1iZGFFcnJvcnNBbGFybTogY2xvdWR3YXRjaC5BbGFybTtcbiAgLyoqXG4gICAqIEFsYXJtcyBmb3IgZWFjaCBsb2cgZmlsdGVyLCBpbiB0aGUgc2FtZSBvcmRlciBhc1xuICAgKiB7QGxpbmsgTGFtYmRhRmFpbHVyZURldGVjdG9yUHJvcHMubG9nRmlsdGVyc30uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nRmlsdGVyQWxhcm1zOiBMb2dGYWlsdXJlQWxhcm1bXTtcblxuICAvKipcbiAgICogQHBhcmFtIHNjb3BlIC0gUGFyZW50IGNvbnN0cnVjdC5cbiAgICogQHBhcmFtIGlkIC0gQ29uc3RydWN0IGlkLlxuICAgKiBAcGFyYW0gcHJvcHMgLSBMYW1iZGEsIGxvZyBncm91cCwgb3B0aW9uYWwgdG9waWMsIGFuZCBsb2cgZmlsdGVycy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBMYW1iZGFGYWlsdXJlRGV0ZWN0b3JQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBhbGFybVRvcGljID0gcHJvcHMuYWxhcm1Ub3BpYztcbiAgICB0aGlzLmFsYXJtVG9waWMgPSBhbGFybVRvcGljO1xuXG4gICAgdGhpcy5sYW1iZGFFcnJvcnNBbGFybSA9IGNyZWF0ZVN1bUFsYXJtKHRoaXMsICdMYW1iZGFFcnJvcnNBbGFybScsIHtcbiAgICAgIG1ldHJpYzogcHJvcHMubGFtYmRhRnVuY3Rpb24ubWV0cmljRXJyb3JzKHtcbiAgICAgICAgcGVyaW9kOiBGQUlMVVJFX0FMQVJNX1BFUklPRCxcbiAgICAgICAgc3RhdGlzdGljOiBGQUlMVVJFX0FMQVJNX1NUQVRJU1RJQyxcbiAgICAgIH0pLFxuICAgICAgYWxhcm1Ub3BpYyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGxvZ0ZpbHRlcnMgPSBwcm9wcy5sb2dGaWx0ZXJzID8/IFtdO1xuICAgIHRoaXMubG9nRmlsdGVyQWxhcm1zID0gbG9nRmlsdGVycy5tYXAoKGZpbHRlcikgPT4ge1xuICAgICAgY29uc3QgbWV0cmljRmlsdGVyID0gbmV3IGxvZ3MuTWV0cmljRmlsdGVyKHRoaXMsIGAke2ZpbHRlci5pZH1NZXRyaWNgLCB7XG4gICAgICAgIGxvZ0dyb3VwOiBwcm9wcy5sb2dHcm91cCxcbiAgICAgICAgZmlsdGVyUGF0dGVybjogbG9ncy5GaWx0ZXJQYXR0ZXJuLmxpdGVyYWwoZmlsdGVyLmZpbHRlclBhdHRlcm4pLFxuICAgICAgICBtZXRyaWNOYW1lc3BhY2U6IGZpbHRlci5tZXRyaWNOYW1lc3BhY2UsXG4gICAgICAgIG1ldHJpY05hbWU6IGZpbHRlci5tZXRyaWNOYW1lLFxuICAgICAgICBtZXRyaWNWYWx1ZTogTE9HX01FVFJJQ19WQUxVRSxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBMT0dfTUVUUklDX0RFRkFVTFRfVkFMVUUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGFsYXJtID0gY3JlYXRlU3VtQWxhcm0odGhpcywgYCR7ZmlsdGVyLmlkfUFsYXJtYCwge1xuICAgICAgICBtZXRyaWM6IG1ldHJpY0ZpbHRlci5tZXRyaWMoe1xuICAgICAgICAgIHBlcmlvZDogRkFJTFVSRV9BTEFSTV9QRVJJT0QsXG4gICAgICAgICAgc3RhdGlzdGljOiBGQUlMVVJFX0FMQVJNX1NUQVRJU1RJQyxcbiAgICAgICAgfSksXG4gICAgICAgIGFsYXJtVG9waWMsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IGlkOiBmaWx0ZXIuaWQsIGFsYXJtIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbG9nLWZpbHRlciBhbGFybSBmb3IgdGhlIGdpdmVuIGZpbHRlciBpZCwgb3IgdW5kZWZpbmVkIHdoZW4gbWlzc2luZy5cbiAgICpcbiAgICogQHBhcmFtIGlkIC0gU2FtZSBhcyB7QGxpbmsgTG9nRmFpbHVyZUZpbHRlci5pZH0uXG4gICAqIEByZXR1cm5zIE1hdGNoaW5nIGFsYXJtLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgaWQgd2FzIG5vdCBpbiBgbG9nRmlsdGVyc2AuXG4gICAqL1xuICBwdWJsaWMgZmluZExvZ0ZpbHRlckFsYXJtKGlkOiBzdHJpbmcpOiBjbG91ZHdhdGNoLkFsYXJtIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5sb2dGaWx0ZXJBbGFybXMuZmluZCgoZW50cnkpID0+IGVudHJ5LmlkID09PSBpZCk/LmFsYXJtO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHtAbGluayBMYW1iZGFGYWlsdXJlRGV0ZWN0b3J9IHdoZW4gZmFpbHVyZSBkZXRlY3Rpb24gaXMgZW5hYmxlZC5cbiAqXG4gKiBAcGFyYW0gc2NvcGUgLSBQYXJlbnQgY29uc3RydWN0LlxuICogQHBhcmFtIGlkIC0gQ29uc3RydWN0IGlkLlxuICogQHBhcmFtIHByb3BzIC0gTGFtYmRhLCBsb2cgZ3JvdXAsIG9wdGlvbmFsIG9wdC1pbiBvcHRpb25zLCBhbmQgbG9nIGZpbHRlcnMuXG4gKiBAcmV0dXJucyBEZXRlY3RvciBjb25zdHJ1Y3QsIG9yIHVuZGVmaW5lZCB3aGVuIGRpc2FibGVkLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlTGFtYmRhRmFpbHVyZURldGVjdG9yID0gKFxuICBzY29wZTogQ29uc3RydWN0LFxuICBpZDogc3RyaW5nLFxuICBwcm9wczogQ3JlYXRlTGFtYmRhRmFpbHVyZURldGVjdG9yUHJvcHMsXG4pOiBMYW1iZGFGYWlsdXJlRGV0ZWN0b3IgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIXByb3BzLmZhaWx1cmVEZXRlY3Rpb24gfHwgIWlzTGFtYmRhRmFpbHVyZURldGVjdGlvbkVuYWJsZWQocHJvcHMuZmFpbHVyZURldGVjdGlvbikpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBMYW1iZGFGYWlsdXJlRGV0ZWN0b3Ioc2NvcGUsIGlkLCB7XG4gICAgbGFtYmRhRnVuY3Rpb246IHByb3BzLmxhbWJkYUZ1bmN0aW9uLFxuICAgIGxvZ0dyb3VwOiBwcm9wcy5sb2dHcm91cCxcbiAgICBhbGFybVRvcGljOiBwcm9wcy5mYWlsdXJlRGV0ZWN0aW9uLmFsYXJtVG9waWMsXG4gICAgbG9nRmlsdGVyczogcHJvcHMubG9nRmlsdGVycyxcbiAgfSk7XG59O1xuXG5leHBvcnQgdHlwZSB7IExhbWJkYUZhaWx1cmVEZXRlY3Rpb24gfSBmcm9tICcuL2xhbWJkYS1mYWlsdXJlLWRldGVjdGlvbic7XG5leHBvcnQgeyBpc0xhbWJkYUZhaWx1cmVEZXRlY3Rpb25FbmFibGVkIH0gZnJvbSAnLi9sYW1iZGEtZmFpbHVyZS1kZXRlY3Rpb24nO1xuZXhwb3J0IHR5cGUgeyBMb2dGYWlsdXJlRmlsdGVyIH0gZnJvbSAnLi9sb2ctZmFpbHVyZS1maWx0ZXInO1xuIl19
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One log-based failure signal for {@link LambdaFailureDetector}.
|
|
3
|
+
*
|
|
4
|
+
* Creates a CloudWatch Logs metric filter and an alarm on the resulting sum metric.
|
|
5
|
+
*/
|
|
6
|
+
export interface LogFailureFilter {
|
|
7
|
+
/**
|
|
8
|
+
* Stable id used as the MetricFilter / Alarm construct id prefix
|
|
9
|
+
* (e.g. `InstanceStatusFailure` → `InstanceStatusFailureMetric`).
|
|
10
|
+
*/
|
|
11
|
+
readonly id: string;
|
|
12
|
+
/**
|
|
13
|
+
* CloudWatch Logs filter pattern string passed to `FilterPattern.literal`.
|
|
14
|
+
*
|
|
15
|
+
* @example '"ResourceWaitFailed"'
|
|
16
|
+
*/
|
|
17
|
+
readonly filterPattern: string;
|
|
18
|
+
/** Custom metric namespace for the metric filter. */
|
|
19
|
+
readonly metricNamespace: string;
|
|
20
|
+
/** Custom metric name for the metric filter. */
|
|
21
|
+
readonly metricName: string;
|
|
22
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLWZhaWx1cmUtZmlsdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbnN0cnVjdHMvbGFtYmRhLWZhaWx1cmUtZGV0ZWN0b3IvbG9nLWZhaWx1cmUtZmlsdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE9uZSBsb2ctYmFzZWQgZmFpbHVyZSBzaWduYWwgZm9yIHtAbGluayBMYW1iZGFGYWlsdXJlRGV0ZWN0b3J9LlxuICpcbiAqIENyZWF0ZXMgYSBDbG91ZFdhdGNoIExvZ3MgbWV0cmljIGZpbHRlciBhbmQgYW4gYWxhcm0gb24gdGhlIHJlc3VsdGluZyBzdW0gbWV0cmljLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ0ZhaWx1cmVGaWx0ZXIge1xuICAvKipcbiAgICogU3RhYmxlIGlkIHVzZWQgYXMgdGhlIE1ldHJpY0ZpbHRlciAvIEFsYXJtIGNvbnN0cnVjdCBpZCBwcmVmaXhcbiAgICogKGUuZy4gYEluc3RhbmNlU3RhdHVzRmFpbHVyZWAg4oaSIGBJbnN0YW5jZVN0YXR1c0ZhaWx1cmVNZXRyaWNgKS5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDbG91ZFdhdGNoIExvZ3MgZmlsdGVyIHBhdHRlcm4gc3RyaW5nIHBhc3NlZCB0byBgRmlsdGVyUGF0dGVybi5saXRlcmFsYC5cbiAgICpcbiAgICogQGV4YW1wbGUgJ1wiUmVzb3VyY2VXYWl0RmFpbGVkXCInXG4gICAqL1xuICByZWFkb25seSBmaWx0ZXJQYXR0ZXJuOiBzdHJpbmc7XG4gIC8qKiBDdXN0b20gbWV0cmljIG5hbWVzcGFjZSBmb3IgdGhlIG1ldHJpYyBmaWx0ZXIuICovXG4gIHJlYWRvbmx5IG1ldHJpY05hbWVzcGFjZTogc3RyaW5nO1xuICAvKiogQ3VzdG9tIG1ldHJpYyBuYW1lIGZvciB0aGUgbWV0cmljIGZpbHRlci4gKi9cbiAgcmVhZG9ubHkgbWV0cmljTmFtZTogc3RyaW5nO1xufVxuIl19
|