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.
@@ -3,53 +3,42 @@ import * as lambda from 'aws-cdk-lib/aws-lambda';
3
3
  import * as logs from 'aws-cdk-lib/aws-logs';
4
4
  import * as sns from 'aws-cdk-lib/aws-sns';
5
5
  import { Construct } from 'constructs';
6
+ import { LambdaFailureDetector, type LambdaFailureDetection } from './lambda-failure-detector/lambda-failure-detector';
6
7
  /**
7
8
  * Props accepted by {@link createRunningSchedulerFailureDetection}.
8
9
  */
9
10
  interface CreateRunningSchedulerFailureDetectionProps {
10
- /** Failure detection options; alarms are created only when {@link FailureDetectionAlarms.enabled} is true. */
11
- readonly failureDetection?: FailureDetectionAlarms;
11
+ /** Failure detection options; alarms are created only when {@link RunningSchedulerFailureDetectionProps.enabled} is true. */
12
+ readonly failureDetection?: RunningSchedulerFailureDetectionProps;
12
13
  /** Running scheduler Lambda to monitor. */
13
14
  readonly runningScheduleFunction: lambda.IFunction;
14
15
  /** Application log group for the running scheduler Lambda. */
15
16
  readonly logGroup: logs.ILogGroup;
16
17
  }
17
18
  /**
18
- * Optional CloudWatch alarms and log-based metrics for operational failure detection.
19
+ * Opt-in failure detection for `EC2InstanceRunningScheduler`.
19
20
  *
20
- * When {@link FailureDetectionAlarms.enabled} is true, the construct creates alarms for Lambda
21
- * errors, Durable handler failures, EC2 instance status wait failures, and Slack post failures.
22
- * Alarms can optionally notify an SNS topic supplied by the caller.
21
+ * Pass as `EC2InstanceRunningSchedulerProps.failureDetection`. Extends
22
+ * {@link LambdaFailureDetection} (`enabled` / `alarmTopic`). Which log failures are
23
+ * monitored is defined in this module and applied by {@link RunningSchedulerFailureDetection}.
23
24
  */
24
- export interface FailureDetectionAlarms {
25
- /**
26
- * When true, creates failure detection alarms and log-based metrics.
27
- *
28
- * @default false when omitted
29
- */
30
- readonly enabled?: boolean;
31
- /**
32
- * SNS topic for alarm notifications.
33
- *
34
- * When omitted, alarms are created without SNS actions.
35
- */
36
- readonly alarmTopic?: sns.ITopic;
25
+ export interface RunningSchedulerFailureDetectionProps extends LambdaFailureDetection {
37
26
  }
38
27
  /**
39
- * Props for {@link RunningSchedulerFailureDetection}.
28
+ * Lambda and log group monitored by {@link RunningSchedulerFailureDetection}.
29
+ *
30
+ * Normally `EC2InstanceRunningScheduler` creates this binding. Use directly only when
31
+ * composing failure detection outside the scheduler construct.
40
32
  */
41
- export interface RunningSchedulerFailureDetectionProps {
42
- /** Alarm configuration (must have {@link FailureDetectionAlarms.enabled} true). */
43
- readonly failureDetection: FailureDetectionAlarms;
44
- /** Running scheduler Lambda to monitor. */
33
+ export interface RunningSchedulerFailureDetectionResourcesProps {
34
+ readonly alarmTopic?: sns.ITopic;
45
35
  readonly runningScheduleFunction: lambda.IFunction;
46
- /** Application log group for the running scheduler Lambda. */
47
36
  readonly logGroup: logs.ILogGroup;
48
37
  }
49
38
  /**
50
- * CloudWatch alarms and log-based metrics for the running scheduler Lambda.
39
+ * CloudWatch alarms and log-based metrics for the EC2 instance running scheduler.
51
40
  *
52
- * When enabled, creates four alarms:
41
+ * Extends {@link LambdaFailureDetector} with scheduler-specific log filters:
53
42
  * - `lambdaErrorsAlarm` – `AWS/Lambda` `Errors` metric.
54
43
  * - `instanceStatusFailureAlarm` – log filter for `ResourceWaitFailed:*`.
55
44
  * - `slackPostFailureAlarm` – log filter for `running-scheduler: Slack post failed`.
@@ -57,23 +46,19 @@ export interface RunningSchedulerFailureDetectionProps {
57
46
  *
58
47
  * Custom metrics are published under the `EC2InstanceRunningScheduler` namespace.
59
48
  */
60
- export declare class RunningSchedulerFailureDetection extends Construct {
61
- /** SNS topic used for alarm actions, when configured. */
62
- readonly alarmTopic?: sns.ITopic;
63
- /** Fires when the Lambda `Errors` metric is non-zero. */
64
- readonly lambdaErrorsAlarm: cloudwatch.Alarm;
65
- /** Fires on handler-level ERROR logs outside instance waiting and Slack post failures. */
66
- readonly durableExecutionFailureAlarm: cloudwatch.Alarm;
49
+ export declare class RunningSchedulerFailureDetection extends LambdaFailureDetector {
67
50
  /** Fires when instance stable-state waiting fails (`ResourceWaitFailed:*`). */
68
51
  readonly instanceStatusFailureAlarm: cloudwatch.Alarm;
69
52
  /** Fires when Slack `chat.postMessage` fails. */
70
53
  readonly slackPostFailureAlarm: cloudwatch.Alarm;
54
+ /** Fires on handler-level ERROR logs outside instance waiting and Slack post failures. */
55
+ readonly durableExecutionFailureAlarm: cloudwatch.Alarm;
71
56
  /**
72
57
  * @param scope - Parent construct.
73
58
  * @param id - Construct id.
74
- * @param props - Lambda, log group, and {@link FailureDetectionAlarms} (must have `enabled: true`).
59
+ * @param props - Lambda, log group, and optional alarm notification topic.
75
60
  */
76
- constructor(scope: Construct, id: string, props: RunningSchedulerFailureDetectionProps);
61
+ constructor(scope: Construct, id: string, props: RunningSchedulerFailureDetectionResourcesProps);
77
62
  }
78
63
  /**
79
64
  * Creates failure detection alarms when enabled in props.
@@ -1,85 +1,57 @@
1
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
2
  Object.defineProperty(exports, "__esModule", { value: true });
36
3
  exports.createRunningSchedulerFailureDetection = exports.RunningSchedulerFailureDetection = void 0;
37
4
  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
- /** CloudWatch custom metric namespace for log-based failure detection metrics. */
5
+ const lambda_failure_detector_1 = require("./lambda-failure-detector/lambda-failure-detector");
6
+ /** CloudWatch custom metric namespace for running-scheduler log-based failure metrics. */
44
7
  const METRIC_NAMESPACE = 'EC2InstanceRunningScheduler';
45
- const isFailureDetectionEnabled = (failureDetection) => failureDetection.enabled === true;
8
+ const INSTANCE_STATUS_FAILURE_ID = 'InstanceStatusFailure';
9
+ const SLACK_POST_FAILURE_ID = 'SlackPostFailure';
10
+ const DURABLE_EXECUTION_FAILURE_ID = 'DurableExecutionFailure';
46
11
  /**
47
- * Registers an SNS alarm action when a topic is configured.
12
+ * Log-based failure filters for the EC2 running scheduler Lambda.
48
13
  *
49
- * @param alarm - CloudWatch alarm to notify.
50
- * @param alarmTopic - Optional SNS topic from {@link FailureDetectionAlarms.alarmTopic}.
14
+ * Defined in one place for this construct; passed into {@link LambdaFailureDetector}.
51
15
  */
52
- const attachAlarmActions = (alarm, alarmTopic) => {
53
- if (!alarmTopic) {
54
- return;
55
- }
56
- alarm.addAlarmAction(new cloudwatch_actions.SnsAction(alarmTopic));
57
- };
16
+ const RUNNING_SCHEDULER_LOG_FILTERS = [
17
+ {
18
+ id: INSTANCE_STATUS_FAILURE_ID,
19
+ filterPattern: '"ResourceWaitFailed"',
20
+ metricNamespace: METRIC_NAMESPACE,
21
+ metricName: 'InstanceStatusFailure',
22
+ },
23
+ {
24
+ id: SLACK_POST_FAILURE_ID,
25
+ filterPattern: '"running-scheduler: Slack post failed"',
26
+ metricNamespace: METRIC_NAMESPACE,
27
+ metricName: 'SlackPostFailure',
28
+ },
29
+ {
30
+ id: DURABLE_EXECUTION_FAILURE_ID,
31
+ filterPattern: '"ERROR" - "processOneResource" - "ResourceWaitFailed" - "running-scheduler: Slack post failed"',
32
+ metricNamespace: METRIC_NAMESPACE,
33
+ metricName: 'DurableExecutionFailure',
34
+ },
35
+ ];
58
36
  /**
59
- * Creates a CloudWatch alarm that fires when a sum metric is greater than or equal to 1.
37
+ * Resolves a required log-filter alarm created from the scheduler log filters.
60
38
  *
61
- * Uses `treatMissingData: notBreaching` so scheduled invocations do not alarm between runs.
62
- *
63
- * @param scope - Parent construct.
64
- * @param id - Alarm construct id.
65
- * @param props - Metric to alarm on and optional SNS topic.
66
- * @returns Configured CloudWatch alarm.
39
+ * @param detector - Detector that owns the log-filter alarms.
40
+ * @param id - {@link LogFailureFilter} id.
41
+ * @returns The CloudWatch alarm for that filter.
42
+ * @throws {Error} When no alarm exists for the given id.
67
43
  */
68
- const createLogSumAlarm = (scope, id, props) => {
69
- const alarm = new cloudwatch.Alarm(scope, id, {
70
- metric: props.metric,
71
- threshold: 1,
72
- comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
73
- evaluationPeriods: 1,
74
- treatMissingData: cloudwatch.TreatMissingData.NOT_BREACHING,
75
- });
76
- attachAlarmActions(alarm, props.alarmTopic);
44
+ const requireLogFilterAlarm = (detector, id) => {
45
+ const alarm = detector.findLogFilterAlarm(id);
46
+ if (!alarm) {
47
+ throw new Error(`RunningSchedulerFailureDetection: missing log filter alarm for id "${id}".`);
48
+ }
77
49
  return alarm;
78
50
  };
79
51
  /**
80
- * CloudWatch alarms and log-based metrics for the running scheduler Lambda.
52
+ * CloudWatch alarms and log-based metrics for the EC2 instance running scheduler.
81
53
  *
82
- * When enabled, creates four alarms:
54
+ * Extends {@link LambdaFailureDetector} with scheduler-specific log filters:
83
55
  * - `lambdaErrorsAlarm` – `AWS/Lambda` `Errors` metric.
84
56
  * - `instanceStatusFailureAlarm` – log filter for `ResourceWaitFailed:*`.
85
57
  * - `slackPostFailureAlarm` – log filter for `running-scheduler: Slack post failed`.
@@ -87,79 +59,29 @@ const createLogSumAlarm = (scope, id, props) => {
87
59
  *
88
60
  * Custom metrics are published under the `EC2InstanceRunningScheduler` namespace.
89
61
  */
90
- class RunningSchedulerFailureDetection extends constructs_1.Construct {
91
- static [JSII_RTTI_SYMBOL_1] = { fqn: "ec2-instance-running-scheduler.RunningSchedulerFailureDetection", version: "0.4.6" };
92
- /** SNS topic used for alarm actions, when configured. */
93
- alarmTopic;
94
- /** Fires when the Lambda `Errors` metric is non-zero. */
95
- lambdaErrorsAlarm;
96
- /** Fires on handler-level ERROR logs outside instance waiting and Slack post failures. */
97
- durableExecutionFailureAlarm;
62
+ class RunningSchedulerFailureDetection extends lambda_failure_detector_1.LambdaFailureDetector {
63
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "ec2-instance-running-scheduler.RunningSchedulerFailureDetection", version: "0.5.0" };
98
64
  /** Fires when instance stable-state waiting fails (`ResourceWaitFailed:*`). */
99
65
  instanceStatusFailureAlarm;
100
66
  /** Fires when Slack `chat.postMessage` fails. */
101
67
  slackPostFailureAlarm;
68
+ /** Fires on handler-level ERROR logs outside instance waiting and Slack post failures. */
69
+ durableExecutionFailureAlarm;
102
70
  /**
103
71
  * @param scope - Parent construct.
104
72
  * @param id - Construct id.
105
- * @param props - Lambda, log group, and {@link FailureDetectionAlarms} (must have `enabled: true`).
73
+ * @param props - Lambda, log group, and optional alarm notification topic.
106
74
  */
107
75
  constructor(scope, id, props) {
108
- super(scope, id);
109
- const alarmTopic = props.failureDetection.alarmTopic;
110
- this.alarmTopic = alarmTopic;
111
- this.lambdaErrorsAlarm = createLogSumAlarm(this, 'LambdaErrorsAlarm', {
112
- metric: props.runningScheduleFunction.metricErrors({
113
- period: aws_cdk_lib_1.Duration.minutes(5),
114
- statistic: 'Sum',
115
- }),
116
- alarmTopic,
117
- });
118
- const instanceStatusFailureMetric = new logs.MetricFilter(this, 'InstanceStatusFailureMetric', {
119
- logGroup: props.logGroup,
120
- filterPattern: logs.FilterPattern.literal('"ResourceWaitFailed"'),
121
- metricNamespace: METRIC_NAMESPACE,
122
- metricName: 'InstanceStatusFailure',
123
- metricValue: '1',
124
- defaultValue: 0,
125
- });
126
- this.instanceStatusFailureAlarm = createLogSumAlarm(this, 'InstanceStatusFailureAlarm', {
127
- metric: instanceStatusFailureMetric.metric({
128
- period: aws_cdk_lib_1.Duration.minutes(5),
129
- statistic: 'Sum',
130
- }),
131
- alarmTopic,
132
- });
133
- const slackPostFailureMetric = new logs.MetricFilter(this, 'SlackPostFailureMetric', {
76
+ super(scope, id, {
77
+ lambdaFunction: props.runningScheduleFunction,
134
78
  logGroup: props.logGroup,
135
- filterPattern: logs.FilterPattern.literal('"running-scheduler: Slack post failed"'),
136
- metricNamespace: METRIC_NAMESPACE,
137
- metricName: 'SlackPostFailure',
138
- metricValue: '1',
139
- defaultValue: 0,
140
- });
141
- this.slackPostFailureAlarm = createLogSumAlarm(this, 'SlackPostFailureAlarm', {
142
- metric: slackPostFailureMetric.metric({
143
- period: aws_cdk_lib_1.Duration.minutes(5),
144
- statistic: 'Sum',
145
- }),
146
- alarmTopic,
147
- });
148
- const durableExecutionFailureMetric = new logs.MetricFilter(this, 'DurableExecutionFailureMetric', {
149
- logGroup: props.logGroup,
150
- filterPattern: logs.FilterPattern.literal('"ERROR" - "processOneResource" - "ResourceWaitFailed" - "running-scheduler: Slack post failed"'),
151
- metricNamespace: METRIC_NAMESPACE,
152
- metricName: 'DurableExecutionFailure',
153
- metricValue: '1',
154
- defaultValue: 0,
155
- });
156
- this.durableExecutionFailureAlarm = createLogSumAlarm(this, 'DurableExecutionFailureAlarm', {
157
- metric: durableExecutionFailureMetric.metric({
158
- period: aws_cdk_lib_1.Duration.minutes(5),
159
- statistic: 'Sum',
160
- }),
161
- alarmTopic,
79
+ alarmTopic: props.alarmTopic,
80
+ logFilters: RUNNING_SCHEDULER_LOG_FILTERS,
162
81
  });
82
+ this.instanceStatusFailureAlarm = requireLogFilterAlarm(this, INSTANCE_STATUS_FAILURE_ID);
83
+ this.slackPostFailureAlarm = requireLogFilterAlarm(this, SLACK_POST_FAILURE_ID);
84
+ this.durableExecutionFailureAlarm = requireLogFilterAlarm(this, DURABLE_EXECUTION_FAILURE_ID);
163
85
  }
164
86
  }
165
87
  exports.RunningSchedulerFailureDetection = RunningSchedulerFailureDetection;
@@ -172,14 +94,14 @@ exports.RunningSchedulerFailureDetection = RunningSchedulerFailureDetection;
172
94
  * @returns Failure detection construct, or undefined when disabled.
173
95
  */
174
96
  const createRunningSchedulerFailureDetection = (scope, id, props) => {
175
- if (!props.failureDetection || !isFailureDetectionEnabled(props.failureDetection)) {
97
+ if (!props.failureDetection || !(0, lambda_failure_detector_1.isLambdaFailureDetectionEnabled)(props.failureDetection)) {
176
98
  return undefined;
177
99
  }
178
100
  return new RunningSchedulerFailureDetection(scope, id, {
179
- failureDetection: props.failureDetection,
101
+ alarmTopic: props.failureDetection.alarmTopic,
180
102
  runningScheduleFunction: props.runningScheduleFunction,
181
103
  logGroup: props.logGroup,
182
104
  });
183
105
  };
184
106
  exports.createRunningSchedulerFailureDetection = createRunningSchedulerFailureDetection;
185
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1zY2hlZHVsZXItZmFpbHVyZS1kZXRlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uc3RydWN0cy9ydW5uaW5nLXNjaGVkdWxlci1mYWlsdXJlLWRldGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXVDO0FBQ3ZDLHVFQUF5RDtBQUN6RCx1RkFBeUU7QUFFekUsMkRBQTZDO0FBRTdDLDJDQUF1QztBQUV2QyxrRkFBa0Y7QUFDbEYsTUFBTSxnQkFBZ0IsR0FBRyw2QkFBNkIsQ0FBQztBQWdEdkQsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLGdCQUF3QyxFQUFXLEVBQUUsQ0FDdEYsZ0JBQWdCLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQztBQUVwQzs7Ozs7R0FLRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxLQUF1QixFQUFFLFVBQXVCLEVBQVEsRUFBRTtJQUNwRixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsT0FBTztJQUNULENBQUM7SUFFRCxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksa0JBQWtCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDckUsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxDQUN4QixLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FHQyxFQUNpQixFQUFFO0lBQ3BCLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1FBQzVDLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtRQUNwQixTQUFTLEVBQUUsQ0FBQztRQUNaLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxrQ0FBa0M7UUFDcEYsaUJBQWlCLEVBQUUsQ0FBQztRQUNwQixnQkFBZ0IsRUFBRSxVQUFVLENBQUMsZ0JBQWdCLENBQUMsYUFBYTtLQUNuQyxDQUFDLENBQUM7SUFDNUIsa0JBQWtCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1QyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFhLGdDQUFpQyxTQUFRLHNCQUFTOztJQUM3RCx5REFBeUQ7SUFDekMsVUFBVSxDQUFjO0lBQ3hDLHlEQUF5RDtJQUN6QyxpQkFBaUIsQ0FBbUI7SUFDcEQsMEZBQTBGO0lBQzFFLDRCQUE0QixDQUFtQjtJQUMvRCwrRUFBK0U7SUFDL0QsMEJBQTBCLENBQW1CO0lBQzdELGlEQUFpRDtJQUNqQyxxQkFBcUIsQ0FBbUI7SUFFeEQ7Ozs7T0FJRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNEM7UUFDcEYsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDO1FBQ3JELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBRTdCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUU7WUFDcEUsTUFBTSxFQUFFLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxZQUFZLENBQUM7Z0JBQ2pELE1BQU0sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLFNBQVMsRUFBRSxLQUFLO2FBQ2pCLENBQUM7WUFDRixVQUFVO1NBQ1gsQ0FBQyxDQUFDO1FBRUgsTUFBTSwyQkFBMkIsR0FBRyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLDZCQUE2QixFQUFFO1lBQzdGLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUN4QixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUM7WUFDakUsZUFBZSxFQUFFLGdCQUFnQjtZQUNqQyxVQUFVLEVBQUUsdUJBQXVCO1lBQ25DLFdBQVcsRUFBRSxHQUFHO1lBQ2hCLFlBQVksRUFBRSxDQUFDO1NBQ2hCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQywwQkFBMEIsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsNEJBQTRCLEVBQUU7WUFDdEYsTUFBTSxFQUFFLDJCQUEyQixDQUFDLE1BQU0sQ0FBQztnQkFDekMsTUFBTSxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDM0IsU0FBUyxFQUFFLEtBQUs7YUFDakIsQ0FBQztZQUNGLFVBQVU7U0FDWCxDQUFDLENBQUM7UUFFSCxNQUFNLHNCQUFzQixHQUFHLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsd0JBQXdCLEVBQUU7WUFDbkYsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ3hCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyx3Q0FBd0MsQ0FBQztZQUNuRixlQUFlLEVBQUUsZ0JBQWdCO1lBQ2pDLFVBQVUsRUFBRSxrQkFBa0I7WUFDOUIsV0FBVyxFQUFFLEdBQUc7WUFDaEIsWUFBWSxFQUFFLENBQUM7U0FDaEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHFCQUFxQixHQUFHLGlCQUFpQixDQUFDLElBQUksRUFBRSx1QkFBdUIsRUFBRTtZQUM1RSxNQUFNLEVBQUUsc0JBQXNCLENBQUMsTUFBTSxDQUFDO2dCQUNwQyxNQUFNLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixTQUFTLEVBQUUsS0FBSzthQUNqQixDQUFDO1lBQ0YsVUFBVTtTQUNYLENBQUMsQ0FBQztRQUVILE1BQU0sNkJBQTZCLEdBQUcsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSwrQkFBK0IsRUFBRTtZQUNqRyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDeEIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGdHQUFnRyxDQUFDO1lBQzNJLGVBQWUsRUFBRSxnQkFBZ0I7WUFDakMsVUFBVSxFQUFFLHlCQUF5QjtZQUNyQyxXQUFXLEVBQUUsR0FBRztZQUNoQixZQUFZLEVBQUUsQ0FBQztTQUNoQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsNEJBQTRCLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxFQUFFLDhCQUE4QixFQUFFO1lBQzFGLE1BQU0sRUFBRSw2QkFBNkIsQ0FBQyxNQUFNLENBQUM7Z0JBQzNDLE1BQU0sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLFNBQVMsRUFBRSxLQUFLO2FBQ2pCLENBQUM7WUFDRixVQUFVO1NBQ1gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUE5RUgsNEVBK0VDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNJLE1BQU0sc0NBQXNDLEdBQUcsQ0FDcEQsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBQWtELEVBQ0osRUFBRTtJQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztRQUNsRixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsT0FBTyxJQUFJLGdDQUFnQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7UUFDckQsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtRQUN4Qyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsdUJBQXVCO1FBQ3RELFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtLQUN6QixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFkVyxRQUFBLHNDQUFzQywwQ0FjakQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0ICogYXMgY2xvdWR3YXRjaF9hY3Rpb25zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoLWFjdGlvbnMnO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0ICogYXMgbG9ncyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbG9ncyc7XG5pbXBvcnQgKiBhcyBzbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuLyoqIENsb3VkV2F0Y2ggY3VzdG9tIG1ldHJpYyBuYW1lc3BhY2UgZm9yIGxvZy1iYXNlZCBmYWlsdXJlIGRldGVjdGlvbiBtZXRyaWNzLiAqL1xuY29uc3QgTUVUUklDX05BTUVTUEFDRSA9ICdFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXInO1xuXG4vKipcbiAqIFByb3BzIGFjY2VwdGVkIGJ5IHtAbGluayBjcmVhdGVSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvbn0uXG4gKi9cbmludGVyZmFjZSBDcmVhdGVSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvblByb3BzIHtcbiAgLyoqIEZhaWx1cmUgZGV0ZWN0aW9uIG9wdGlvbnM7IGFsYXJtcyBhcmUgY3JlYXRlZCBvbmx5IHdoZW4ge0BsaW5rIEZhaWx1cmVEZXRlY3Rpb25BbGFybXMuZW5hYmxlZH0gaXMgdHJ1ZS4gKi9cbiAgcmVhZG9ubHkgZmFpbHVyZURldGVjdGlvbj86IEZhaWx1cmVEZXRlY3Rpb25BbGFybXM7XG4gIC8qKiBSdW5uaW5nIHNjaGVkdWxlciBMYW1iZGEgdG8gbW9uaXRvci4gKi9cbiAgcmVhZG9ubHkgcnVubmluZ1NjaGVkdWxlRnVuY3Rpb246IGxhbWJkYS5JRnVuY3Rpb247XG4gIC8qKiBBcHBsaWNhdGlvbiBsb2cgZ3JvdXAgZm9yIHRoZSBydW5uaW5nIHNjaGVkdWxlciBMYW1iZGEuICovXG4gIHJlYWRvbmx5IGxvZ0dyb3VwOiBsb2dzLklMb2dHcm91cDtcbn1cblxuLyoqXG4gKiBPcHRpb25hbCBDbG91ZFdhdGNoIGFsYXJtcyBhbmQgbG9nLWJhc2VkIG1ldHJpY3MgZm9yIG9wZXJhdGlvbmFsIGZhaWx1cmUgZGV0ZWN0aW9uLlxuICpcbiAqIFdoZW4ge0BsaW5rIEZhaWx1cmVEZXRlY3Rpb25BbGFybXMuZW5hYmxlZH0gaXMgdHJ1ZSwgdGhlIGNvbnN0cnVjdCBjcmVhdGVzIGFsYXJtcyBmb3IgTGFtYmRhXG4gKiBlcnJvcnMsIER1cmFibGUgaGFuZGxlciBmYWlsdXJlcywgRUMyIGluc3RhbmNlIHN0YXR1cyB3YWl0IGZhaWx1cmVzLCBhbmQgU2xhY2sgcG9zdCBmYWlsdXJlcy5cbiAqIEFsYXJtcyBjYW4gb3B0aW9uYWxseSBub3RpZnkgYW4gU05TIHRvcGljIHN1cHBsaWVkIGJ5IHRoZSBjYWxsZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmFpbHVyZURldGVjdGlvbkFsYXJtcyB7XG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIGNyZWF0ZXMgZmFpbHVyZSBkZXRlY3Rpb24gYWxhcm1zIGFuZCBsb2ctYmFzZWQgbWV0cmljcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2Ugd2hlbiBvbWl0dGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNOUyB0b3BpYyBmb3IgYWxhcm0gbm90aWZpY2F0aW9ucy5cbiAgICpcbiAgICogV2hlbiBvbWl0dGVkLCBhbGFybXMgYXJlIGNyZWF0ZWQgd2l0aG91dCBTTlMgYWN0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGFsYXJtVG9waWM/OiBzbnMuSVRvcGljO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciB7QGxpbmsgUnVubmluZ1NjaGVkdWxlckZhaWx1cmVEZXRlY3Rpb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bm5pbmdTY2hlZHVsZXJGYWlsdXJlRGV0ZWN0aW9uUHJvcHMge1xuICAvKiogQWxhcm0gY29uZmlndXJhdGlvbiAobXVzdCBoYXZlIHtAbGluayBGYWlsdXJlRGV0ZWN0aW9uQWxhcm1zLmVuYWJsZWR9IHRydWUpLiAqL1xuICByZWFkb25seSBmYWlsdXJlRGV0ZWN0aW9uOiBGYWlsdXJlRGV0ZWN0aW9uQWxhcm1zO1xuICAvKiogUnVubmluZyBzY2hlZHVsZXIgTGFtYmRhIHRvIG1vbml0b3IuICovXG4gIHJlYWRvbmx5IHJ1bm5pbmdTY2hlZHVsZUZ1bmN0aW9uOiBsYW1iZGEuSUZ1bmN0aW9uO1xuICAvKiogQXBwbGljYXRpb24gbG9nIGdyb3VwIGZvciB0aGUgcnVubmluZyBzY2hlZHVsZXIgTGFtYmRhLiAqL1xuICByZWFkb25seSBsb2dHcm91cDogbG9ncy5JTG9nR3JvdXA7XG59XG5cbmNvbnN0IGlzRmFpbHVyZURldGVjdGlvbkVuYWJsZWQgPSAoZmFpbHVyZURldGVjdGlvbjogRmFpbHVyZURldGVjdGlvbkFsYXJtcyk6IGJvb2xlYW4gPT5cbiAgZmFpbHVyZURldGVjdGlvbi5lbmFibGVkID09PSB0cnVlO1xuXG4vKipcbiAqIFJlZ2lzdGVycyBhbiBTTlMgYWxhcm0gYWN0aW9uIHdoZW4gYSB0b3BpYyBpcyBjb25maWd1cmVkLlxuICpcbiAqIEBwYXJhbSBhbGFybSAtIENsb3VkV2F0Y2ggYWxhcm0gdG8gbm90aWZ5LlxuICogQHBhcmFtIGFsYXJtVG9waWMgLSBPcHRpb25hbCBTTlMgdG9waWMgZnJvbSB7QGxpbmsgRmFpbHVyZURldGVjdGlvbkFsYXJtcy5hbGFybVRvcGljfS5cbiAqL1xuY29uc3QgYXR0YWNoQWxhcm1BY3Rpb25zID0gKGFsYXJtOiBjbG91ZHdhdGNoLkFsYXJtLCBhbGFybVRvcGljPzogc25zLklUb3BpYyk6IHZvaWQgPT4ge1xuICBpZiAoIWFsYXJtVG9waWMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhbGFybS5hZGRBbGFybUFjdGlvbihuZXcgY2xvdWR3YXRjaF9hY3Rpb25zLlNuc0FjdGlvbihhbGFybVRvcGljKSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBDbG91ZFdhdGNoIGFsYXJtIHRoYXQgZmlyZXMgd2hlbiBhIHN1bSBtZXRyaWMgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEuXG4gKlxuICogVXNlcyBgdHJlYXRNaXNzaW5nRGF0YTogbm90QnJlYWNoaW5nYCBzbyBzY2hlZHVsZWQgaW52b2NhdGlvbnMgZG8gbm90IGFsYXJtIGJldHdlZW4gcnVucy5cbiAqXG4gKiBAcGFyYW0gc2NvcGUgLSBQYXJlbnQgY29uc3RydWN0LlxuICogQHBhcmFtIGlkIC0gQWxhcm0gY29uc3RydWN0IGlkLlxuICogQHBhcmFtIHByb3BzIC0gTWV0cmljIHRvIGFsYXJtIG9uIGFuZCBvcHRpb25hbCBTTlMgdG9waWMuXG4gKiBAcmV0dXJucyBDb25maWd1cmVkIENsb3VkV2F0Y2ggYWxhcm0uXG4gKi9cbmNvbnN0IGNyZWF0ZUxvZ1N1bUFsYXJtID0gKFxuICBzY29wZTogQ29uc3RydWN0LFxuICBpZDogc3RyaW5nLFxuICBwcm9wczoge1xuICAgIG1ldHJpYzogY2xvdWR3YXRjaC5JTWV0cmljO1xuICAgIGFsYXJtVG9waWM/OiBzbnMuSVRvcGljO1xuICB9LFxuKTogY2xvdWR3YXRjaC5BbGFybSA9PiB7XG4gIGNvbnN0IGFsYXJtID0gbmV3IGNsb3Vkd2F0Y2guQWxhcm0oc2NvcGUsIGlkLCB7XG4gICAgbWV0cmljOiBwcm9wcy5tZXRyaWMsXG4gICAgdGhyZXNob2xkOiAxLFxuICAgIGNvbXBhcmlzb25PcGVyYXRvcjogY2xvdWR3YXRjaC5Db21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX09SX0VRVUFMX1RPX1RIUkVTSE9MRCxcbiAgICBldmFsdWF0aW9uUGVyaW9kczogMSxcbiAgICB0cmVhdE1pc3NpbmdEYXRhOiBjbG91ZHdhdGNoLlRyZWF0TWlzc2luZ0RhdGEuTk9UX0JSRUFDSElORyxcbiAgfSBhcyBjbG91ZHdhdGNoLkFsYXJtUHJvcHMpO1xuICBhdHRhY2hBbGFybUFjdGlvbnMoYWxhcm0sIHByb3BzLmFsYXJtVG9waWMpO1xuICByZXR1cm4gYWxhcm07XG59O1xuXG4vKipcbiAqIENsb3VkV2F0Y2ggYWxhcm1zIGFuZCBsb2ctYmFzZWQgbWV0cmljcyBmb3IgdGhlIHJ1bm5pbmcgc2NoZWR1bGVyIExhbWJkYS5cbiAqXG4gKiBXaGVuIGVuYWJsZWQsIGNyZWF0ZXMgZm91ciBhbGFybXM6XG4gKiAtIGBsYW1iZGFFcnJvcnNBbGFybWAg4oCTIGBBV1MvTGFtYmRhYCBgRXJyb3JzYCBtZXRyaWMuXG4gKiAtIGBpbnN0YW5jZVN0YXR1c0ZhaWx1cmVBbGFybWAg4oCTIGxvZyBmaWx0ZXIgZm9yIGBSZXNvdXJjZVdhaXRGYWlsZWQ6KmAuXG4gKiAtIGBzbGFja1Bvc3RGYWlsdXJlQWxhcm1gIOKAkyBsb2cgZmlsdGVyIGZvciBgcnVubmluZy1zY2hlZHVsZXI6IFNsYWNrIHBvc3QgZmFpbGVkYC5cbiAqIC0gYGR1cmFibGVFeGVjdXRpb25GYWlsdXJlQWxhcm1gIOKAkyBvdGhlciBoYW5kbGVyLWxldmVsIGBFUlJPUmAgbG9ncyAoZXhjbHVkaW5nIHRoZSBhYm92ZSkuXG4gKlxuICogQ3VzdG9tIG1ldHJpY3MgYXJlIHB1Ymxpc2hlZCB1bmRlciB0aGUgYEVDMkluc3RhbmNlUnVubmluZ1NjaGVkdWxlcmAgbmFtZXNwYWNlLlxuICovXG5leHBvcnQgY2xhc3MgUnVubmluZ1NjaGVkdWxlckZhaWx1cmVEZXRlY3Rpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKiogU05TIHRvcGljIHVzZWQgZm9yIGFsYXJtIGFjdGlvbnMsIHdoZW4gY29uZmlndXJlZC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGFsYXJtVG9waWM/OiBzbnMuSVRvcGljO1xuICAvKiogRmlyZXMgd2hlbiB0aGUgTGFtYmRhIGBFcnJvcnNgIG1ldHJpYyBpcyBub24temVyby4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGxhbWJkYUVycm9yc0FsYXJtOiBjbG91ZHdhdGNoLkFsYXJtO1xuICAvKiogRmlyZXMgb24gaGFuZGxlci1sZXZlbCBFUlJPUiBsb2dzIG91dHNpZGUgaW5zdGFuY2Ugd2FpdGluZyBhbmQgU2xhY2sgcG9zdCBmYWlsdXJlcy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGR1cmFibGVFeGVjdXRpb25GYWlsdXJlQWxhcm06IGNsb3Vkd2F0Y2guQWxhcm07XG4gIC8qKiBGaXJlcyB3aGVuIGluc3RhbmNlIHN0YWJsZS1zdGF0ZSB3YWl0aW5nIGZhaWxzIChgUmVzb3VyY2VXYWl0RmFpbGVkOipgKS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGluc3RhbmNlU3RhdHVzRmFpbHVyZUFsYXJtOiBjbG91ZHdhdGNoLkFsYXJtO1xuICAvKiogRmlyZXMgd2hlbiBTbGFjayBgY2hhdC5wb3N0TWVzc2FnZWAgZmFpbHMuICovXG4gIHB1YmxpYyByZWFkb25seSBzbGFja1Bvc3RGYWlsdXJlQWxhcm06IGNsb3Vkd2F0Y2guQWxhcm07XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzY29wZSAtIFBhcmVudCBjb25zdHJ1Y3QuXG4gICAqIEBwYXJhbSBpZCAtIENvbnN0cnVjdCBpZC5cbiAgICogQHBhcmFtIHByb3BzIC0gTGFtYmRhLCBsb2cgZ3JvdXAsIGFuZCB7QGxpbmsgRmFpbHVyZURldGVjdGlvbkFsYXJtc30gKG11c3QgaGF2ZSBgZW5hYmxlZDogdHJ1ZWApLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJ1bm5pbmdTY2hlZHVsZXJGYWlsdXJlRGV0ZWN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgYWxhcm1Ub3BpYyA9IHByb3BzLmZhaWx1cmVEZXRlY3Rpb24uYWxhcm1Ub3BpYztcbiAgICB0aGlzLmFsYXJtVG9waWMgPSBhbGFybVRvcGljO1xuXG4gICAgdGhpcy5sYW1iZGFFcnJvcnNBbGFybSA9IGNyZWF0ZUxvZ1N1bUFsYXJtKHRoaXMsICdMYW1iZGFFcnJvcnNBbGFybScsIHtcbiAgICAgIG1ldHJpYzogcHJvcHMucnVubmluZ1NjaGVkdWxlRnVuY3Rpb24ubWV0cmljRXJyb3JzKHtcbiAgICAgICAgcGVyaW9kOiBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgfSksXG4gICAgICBhbGFybVRvcGljLFxuICAgIH0pO1xuXG4gICAgY29uc3QgaW5zdGFuY2VTdGF0dXNGYWlsdXJlTWV0cmljID0gbmV3IGxvZ3MuTWV0cmljRmlsdGVyKHRoaXMsICdJbnN0YW5jZVN0YXR1c0ZhaWx1cmVNZXRyaWMnLCB7XG4gICAgICBsb2dHcm91cDogcHJvcHMubG9nR3JvdXAsXG4gICAgICBmaWx0ZXJQYXR0ZXJuOiBsb2dzLkZpbHRlclBhdHRlcm4ubGl0ZXJhbCgnXCJSZXNvdXJjZVdhaXRGYWlsZWRcIicpLFxuICAgICAgbWV0cmljTmFtZXNwYWNlOiBNRVRSSUNfTkFNRVNQQUNFLFxuICAgICAgbWV0cmljTmFtZTogJ0luc3RhbmNlU3RhdHVzRmFpbHVyZScsXG4gICAgICBtZXRyaWNWYWx1ZTogJzEnLFxuICAgICAgZGVmYXVsdFZhbHVlOiAwLFxuICAgIH0pO1xuICAgIHRoaXMuaW5zdGFuY2VTdGF0dXNGYWlsdXJlQWxhcm0gPSBjcmVhdGVMb2dTdW1BbGFybSh0aGlzLCAnSW5zdGFuY2VTdGF0dXNGYWlsdXJlQWxhcm0nLCB7XG4gICAgICBtZXRyaWM6IGluc3RhbmNlU3RhdHVzRmFpbHVyZU1ldHJpYy5tZXRyaWMoe1xuICAgICAgICBwZXJpb2Q6IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gICAgICB9KSxcbiAgICAgIGFsYXJtVG9waWMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzbGFja1Bvc3RGYWlsdXJlTWV0cmljID0gbmV3IGxvZ3MuTWV0cmljRmlsdGVyKHRoaXMsICdTbGFja1Bvc3RGYWlsdXJlTWV0cmljJywge1xuICAgICAgbG9nR3JvdXA6IHByb3BzLmxvZ0dyb3VwLFxuICAgICAgZmlsdGVyUGF0dGVybjogbG9ncy5GaWx0ZXJQYXR0ZXJuLmxpdGVyYWwoJ1wicnVubmluZy1zY2hlZHVsZXI6IFNsYWNrIHBvc3QgZmFpbGVkXCInKSxcbiAgICAgIG1ldHJpY05hbWVzcGFjZTogTUVUUklDX05BTUVTUEFDRSxcbiAgICAgIG1ldHJpY05hbWU6ICdTbGFja1Bvc3RGYWlsdXJlJyxcbiAgICAgIG1ldHJpY1ZhbHVlOiAnMScsXG4gICAgICBkZWZhdWx0VmFsdWU6IDAsXG4gICAgfSk7XG4gICAgdGhpcy5zbGFja1Bvc3RGYWlsdXJlQWxhcm0gPSBjcmVhdGVMb2dTdW1BbGFybSh0aGlzLCAnU2xhY2tQb3N0RmFpbHVyZUFsYXJtJywge1xuICAgICAgbWV0cmljOiBzbGFja1Bvc3RGYWlsdXJlTWV0cmljLm1ldHJpYyh7XG4gICAgICAgIHBlcmlvZDogRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICAgICAgc3RhdGlzdGljOiAnU3VtJyxcbiAgICAgIH0pLFxuICAgICAgYWxhcm1Ub3BpYyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGR1cmFibGVFeGVjdXRpb25GYWlsdXJlTWV0cmljID0gbmV3IGxvZ3MuTWV0cmljRmlsdGVyKHRoaXMsICdEdXJhYmxlRXhlY3V0aW9uRmFpbHVyZU1ldHJpYycsIHtcbiAgICAgIGxvZ0dyb3VwOiBwcm9wcy5sb2dHcm91cCxcbiAgICAgIGZpbHRlclBhdHRlcm46IGxvZ3MuRmlsdGVyUGF0dGVybi5saXRlcmFsKCdcIkVSUk9SXCIgLSBcInByb2Nlc3NPbmVSZXNvdXJjZVwiIC0gXCJSZXNvdXJjZVdhaXRGYWlsZWRcIiAtIFwicnVubmluZy1zY2hlZHVsZXI6IFNsYWNrIHBvc3QgZmFpbGVkXCInKSxcbiAgICAgIG1ldHJpY05hbWVzcGFjZTogTUVUUklDX05BTUVTUEFDRSxcbiAgICAgIG1ldHJpY05hbWU6ICdEdXJhYmxlRXhlY3V0aW9uRmFpbHVyZScsXG4gICAgICBtZXRyaWNWYWx1ZTogJzEnLFxuICAgICAgZGVmYXVsdFZhbHVlOiAwLFxuICAgIH0pO1xuICAgIHRoaXMuZHVyYWJsZUV4ZWN1dGlvbkZhaWx1cmVBbGFybSA9IGNyZWF0ZUxvZ1N1bUFsYXJtKHRoaXMsICdEdXJhYmxlRXhlY3V0aW9uRmFpbHVyZUFsYXJtJywge1xuICAgICAgbWV0cmljOiBkdXJhYmxlRXhlY3V0aW9uRmFpbHVyZU1ldHJpYy5tZXRyaWMoe1xuICAgICAgICBwZXJpb2Q6IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gICAgICB9KSxcbiAgICAgIGFsYXJtVG9waWMsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGZhaWx1cmUgZGV0ZWN0aW9uIGFsYXJtcyB3aGVuIGVuYWJsZWQgaW4gcHJvcHMuXG4gKlxuICogQHBhcmFtIHNjb3BlIC0gUGFyZW50IGNvbnN0cnVjdC5cbiAqIEBwYXJhbSBpZCAtIENvbnN0cnVjdCBpZC5cbiAqIEBwYXJhbSBwcm9wcyAtIExhbWJkYSwgbG9nIGdyb3VwLCBhbmQgb3B0aW9uYWwgYWxhcm0gY29uZmlndXJhdGlvbi5cbiAqIEByZXR1cm5zIEZhaWx1cmUgZGV0ZWN0aW9uIGNvbnN0cnVjdCwgb3IgdW5kZWZpbmVkIHdoZW4gZGlzYWJsZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvbiA9IChcbiAgc2NvcGU6IENvbnN0cnVjdCxcbiAgaWQ6IHN0cmluZyxcbiAgcHJvcHM6IENyZWF0ZVJ1bm5pbmdTY2hlZHVsZXJGYWlsdXJlRGV0ZWN0aW9uUHJvcHMsXG4pOiBSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvbiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghcHJvcHMuZmFpbHVyZURldGVjdGlvbiB8fCAhaXNGYWlsdXJlRGV0ZWN0aW9uRW5hYmxlZChwcm9wcy5mYWlsdXJlRGV0ZWN0aW9uKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gbmV3IFJ1bm5pbmdTY2hlZHVsZXJGYWlsdXJlRGV0ZWN0aW9uKHNjb3BlLCBpZCwge1xuICAgIGZhaWx1cmVEZXRlY3Rpb246IHByb3BzLmZhaWx1cmVEZXRlY3Rpb24sXG4gICAgcnVubmluZ1NjaGVkdWxlRnVuY3Rpb246IHByb3BzLnJ1bm5pbmdTY2hlZHVsZUZ1bmN0aW9uLFxuICAgIGxvZ0dyb3VwOiBwcm9wcy5sb2dHcm91cCxcbiAgfSk7XG59O1xuIl19
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1zY2hlZHVsZXItZmFpbHVyZS1kZXRlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uc3RydWN0cy9ydW5uaW5nLXNjaGVkdWxlci1mYWlsdXJlLWRldGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBS0EsK0ZBSzJEO0FBRTNELDBGQUEwRjtBQUMxRixNQUFNLGdCQUFnQixHQUFHLDZCQUE2QixDQUFDO0FBRXZELE1BQU0sMEJBQTBCLEdBQUcsdUJBQXVCLENBQUM7QUFDM0QsTUFBTSxxQkFBcUIsR0FBRyxrQkFBa0IsQ0FBQztBQUNqRCxNQUFNLDRCQUE0QixHQUFHLHlCQUF5QixDQUFDO0FBRS9EOzs7O0dBSUc7QUFDSCxNQUFNLDZCQUE2QixHQUF1QjtJQUN4RDtRQUNFLEVBQUUsRUFBRSwwQkFBMEI7UUFDOUIsYUFBYSxFQUFFLHNCQUFzQjtRQUNyQyxlQUFlLEVBQUUsZ0JBQWdCO1FBQ2pDLFVBQVUsRUFBRSx1QkFBdUI7S0FDcEM7SUFDRDtRQUNFLEVBQUUsRUFBRSxxQkFBcUI7UUFDekIsYUFBYSxFQUFFLHdDQUF3QztRQUN2RCxlQUFlLEVBQUUsZ0JBQWdCO1FBQ2pDLFVBQVUsRUFBRSxrQkFBa0I7S0FDL0I7SUFDRDtRQUNFLEVBQUUsRUFBRSw0QkFBNEI7UUFDaEMsYUFBYSxFQUFFLGdHQUFnRztRQUMvRyxlQUFlLEVBQUUsZ0JBQWdCO1FBQ2pDLFVBQVUsRUFBRSx5QkFBeUI7S0FDdEM7Q0FDRixDQUFDO0FBbUNGOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLHFCQUFxQixHQUFHLENBQzVCLFFBQStCLEVBQy9CLEVBQVUsRUFDUSxFQUFFO0lBQ3BCLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLHNFQUFzRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFhLGdDQUFpQyxTQUFRLCtDQUFxQjs7SUFDekUsK0VBQStFO0lBQy9ELDBCQUEwQixDQUFtQjtJQUM3RCxpREFBaUQ7SUFDakMscUJBQXFCLENBQW1CO0lBQ3hELDBGQUEwRjtJQUMxRSw0QkFBNEIsQ0FBbUI7SUFFL0Q7Ozs7T0FJRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBcUQ7UUFDN0YsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixjQUFjLEVBQUUsS0FBSyxDQUFDLHVCQUF1QjtZQUM3QyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDeEIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1lBQzVCLFVBQVUsRUFBRSw2QkFBNkI7U0FDMUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLDBCQUEwQixHQUFHLHFCQUFxQixDQUFDLElBQUksRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1FBQzFGLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsNEJBQTRCLEdBQUcscUJBQXFCLENBQUMsSUFBSSxFQUFFLDRCQUE0QixDQUFDLENBQUM7SUFDaEcsQ0FBQzs7QUF4QkgsNEVBeUJDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNJLE1BQU0sc0NBQXNDLEdBQUcsQ0FDcEQsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBQWtELEVBQ0osRUFBRTtJQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixJQUFJLENBQUMsSUFBQSx5REFBK0IsRUFBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1FBQ3hGLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxPQUFPLElBQUksZ0NBQWdDLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtRQUNyRCxVQUFVLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFVBQVU7UUFDN0MsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLHVCQUF1QjtRQUN0RCxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7S0FDekIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBZFcsUUFBQSxzQ0FBc0MsMENBY2pEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2xvdWR3YXRjaCBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sb2dzJztcbmltcG9ydCAqIGFzIHNucyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc25zJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHtcbiAgaXNMYW1iZGFGYWlsdXJlRGV0ZWN0aW9uRW5hYmxlZCxcbiAgTGFtYmRhRmFpbHVyZURldGVjdG9yLFxuICB0eXBlIExhbWJkYUZhaWx1cmVEZXRlY3Rpb24sXG4gIHR5cGUgTG9nRmFpbHVyZUZpbHRlcixcbn0gZnJvbSAnLi9sYW1iZGEtZmFpbHVyZS1kZXRlY3Rvci9sYW1iZGEtZmFpbHVyZS1kZXRlY3Rvcic7XG5cbi8qKiBDbG91ZFdhdGNoIGN1c3RvbSBtZXRyaWMgbmFtZXNwYWNlIGZvciBydW5uaW5nLXNjaGVkdWxlciBsb2ctYmFzZWQgZmFpbHVyZSBtZXRyaWNzLiAqL1xuY29uc3QgTUVUUklDX05BTUVTUEFDRSA9ICdFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXInO1xuXG5jb25zdCBJTlNUQU5DRV9TVEFUVVNfRkFJTFVSRV9JRCA9ICdJbnN0YW5jZVN0YXR1c0ZhaWx1cmUnO1xuY29uc3QgU0xBQ0tfUE9TVF9GQUlMVVJFX0lEID0gJ1NsYWNrUG9zdEZhaWx1cmUnO1xuY29uc3QgRFVSQUJMRV9FWEVDVVRJT05fRkFJTFVSRV9JRCA9ICdEdXJhYmxlRXhlY3V0aW9uRmFpbHVyZSc7XG5cbi8qKlxuICogTG9nLWJhc2VkIGZhaWx1cmUgZmlsdGVycyBmb3IgdGhlIEVDMiBydW5uaW5nIHNjaGVkdWxlciBMYW1iZGEuXG4gKlxuICogRGVmaW5lZCBpbiBvbmUgcGxhY2UgZm9yIHRoaXMgY29uc3RydWN0OyBwYXNzZWQgaW50byB7QGxpbmsgTGFtYmRhRmFpbHVyZURldGVjdG9yfS5cbiAqL1xuY29uc3QgUlVOTklOR19TQ0hFRFVMRVJfTE9HX0ZJTFRFUlM6IExvZ0ZhaWx1cmVGaWx0ZXJbXSA9IFtcbiAge1xuICAgIGlkOiBJTlNUQU5DRV9TVEFUVVNfRkFJTFVSRV9JRCxcbiAgICBmaWx0ZXJQYXR0ZXJuOiAnXCJSZXNvdXJjZVdhaXRGYWlsZWRcIicsXG4gICAgbWV0cmljTmFtZXNwYWNlOiBNRVRSSUNfTkFNRVNQQUNFLFxuICAgIG1ldHJpY05hbWU6ICdJbnN0YW5jZVN0YXR1c0ZhaWx1cmUnLFxuICB9LFxuICB7XG4gICAgaWQ6IFNMQUNLX1BPU1RfRkFJTFVSRV9JRCxcbiAgICBmaWx0ZXJQYXR0ZXJuOiAnXCJydW5uaW5nLXNjaGVkdWxlcjogU2xhY2sgcG9zdCBmYWlsZWRcIicsXG4gICAgbWV0cmljTmFtZXNwYWNlOiBNRVRSSUNfTkFNRVNQQUNFLFxuICAgIG1ldHJpY05hbWU6ICdTbGFja1Bvc3RGYWlsdXJlJyxcbiAgfSxcbiAge1xuICAgIGlkOiBEVVJBQkxFX0VYRUNVVElPTl9GQUlMVVJFX0lELFxuICAgIGZpbHRlclBhdHRlcm46ICdcIkVSUk9SXCIgLSBcInByb2Nlc3NPbmVSZXNvdXJjZVwiIC0gXCJSZXNvdXJjZVdhaXRGYWlsZWRcIiAtIFwicnVubmluZy1zY2hlZHVsZXI6IFNsYWNrIHBvc3QgZmFpbGVkXCInLFxuICAgIG1ldHJpY05hbWVzcGFjZTogTUVUUklDX05BTUVTUEFDRSxcbiAgICBtZXRyaWNOYW1lOiAnRHVyYWJsZUV4ZWN1dGlvbkZhaWx1cmUnLFxuICB9LFxuXTtcblxuLyoqXG4gKiBQcm9wcyBhY2NlcHRlZCBieSB7QGxpbmsgY3JlYXRlUnVubmluZ1NjaGVkdWxlckZhaWx1cmVEZXRlY3Rpb259LlxuICovXG5pbnRlcmZhY2UgQ3JlYXRlUnVubmluZ1NjaGVkdWxlckZhaWx1cmVEZXRlY3Rpb25Qcm9wcyB7XG4gIC8qKiBGYWlsdXJlIGRldGVjdGlvbiBvcHRpb25zOyBhbGFybXMgYXJlIGNyZWF0ZWQgb25seSB3aGVuIHtAbGluayBSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvblByb3BzLmVuYWJsZWR9IGlzIHRydWUuICovXG4gIHJlYWRvbmx5IGZhaWx1cmVEZXRlY3Rpb24/OiBSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvblByb3BzO1xuICAvKiogUnVubmluZyBzY2hlZHVsZXIgTGFtYmRhIHRvIG1vbml0b3IuICovXG4gIHJlYWRvbmx5IHJ1bm5pbmdTY2hlZHVsZUZ1bmN0aW9uOiBsYW1iZGEuSUZ1bmN0aW9uO1xuICAvKiogQXBwbGljYXRpb24gbG9nIGdyb3VwIGZvciB0aGUgcnVubmluZyBzY2hlZHVsZXIgTGFtYmRhLiAqL1xuICByZWFkb25seSBsb2dHcm91cDogbG9ncy5JTG9nR3JvdXA7XG59XG5cbi8qKlxuICogT3B0LWluIGZhaWx1cmUgZGV0ZWN0aW9uIGZvciBgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyYC5cbiAqXG4gKiBQYXNzIGFzIGBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXJQcm9wcy5mYWlsdXJlRGV0ZWN0aW9uYC4gRXh0ZW5kc1xuICoge0BsaW5rIExhbWJkYUZhaWx1cmVEZXRlY3Rpb259IChgZW5hYmxlZGAgLyBgYWxhcm1Ub3BpY2ApLiBXaGljaCBsb2cgZmFpbHVyZXMgYXJlXG4gKiBtb25pdG9yZWQgaXMgZGVmaW5lZCBpbiB0aGlzIG1vZHVsZSBhbmQgYXBwbGllZCBieSB7QGxpbmsgUnVubmluZ1NjaGVkdWxlckZhaWx1cmVEZXRlY3Rpb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bm5pbmdTY2hlZHVsZXJGYWlsdXJlRGV0ZWN0aW9uUHJvcHMgZXh0ZW5kcyBMYW1iZGFGYWlsdXJlRGV0ZWN0aW9uIHt9XG5cbi8qKlxuICogTGFtYmRhIGFuZCBsb2cgZ3JvdXAgbW9uaXRvcmVkIGJ5IHtAbGluayBSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvbn0uXG4gKlxuICogTm9ybWFsbHkgYEVDMkluc3RhbmNlUnVubmluZ1NjaGVkdWxlcmAgY3JlYXRlcyB0aGlzIGJpbmRpbmcuIFVzZSBkaXJlY3RseSBvbmx5IHdoZW5cbiAqIGNvbXBvc2luZyBmYWlsdXJlIGRldGVjdGlvbiBvdXRzaWRlIHRoZSBzY2hlZHVsZXIgY29uc3RydWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bm5pbmdTY2hlZHVsZXJGYWlsdXJlRGV0ZWN0aW9uUmVzb3VyY2VzUHJvcHMge1xuICByZWFkb25seSBhbGFybVRvcGljPzogc25zLklUb3BpYztcbiAgcmVhZG9ubHkgcnVubmluZ1NjaGVkdWxlRnVuY3Rpb246IGxhbWJkYS5JRnVuY3Rpb247XG4gIHJlYWRvbmx5IGxvZ0dyb3VwOiBsb2dzLklMb2dHcm91cDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIHJlcXVpcmVkIGxvZy1maWx0ZXIgYWxhcm0gY3JlYXRlZCBmcm9tIHRoZSBzY2hlZHVsZXIgbG9nIGZpbHRlcnMuXG4gKlxuICogQHBhcmFtIGRldGVjdG9yIC0gRGV0ZWN0b3IgdGhhdCBvd25zIHRoZSBsb2ctZmlsdGVyIGFsYXJtcy5cbiAqIEBwYXJhbSBpZCAtIHtAbGluayBMb2dGYWlsdXJlRmlsdGVyfSBpZC5cbiAqIEByZXR1cm5zIFRoZSBDbG91ZFdhdGNoIGFsYXJtIGZvciB0aGF0IGZpbHRlci5cbiAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIG5vIGFsYXJtIGV4aXN0cyBmb3IgdGhlIGdpdmVuIGlkLlxuICovXG5jb25zdCByZXF1aXJlTG9nRmlsdGVyQWxhcm0gPSAoXG4gIGRldGVjdG9yOiBMYW1iZGFGYWlsdXJlRGV0ZWN0b3IsXG4gIGlkOiBzdHJpbmcsXG4pOiBjbG91ZHdhdGNoLkFsYXJtID0+IHtcbiAgY29uc3QgYWxhcm0gPSBkZXRlY3Rvci5maW5kTG9nRmlsdGVyQWxhcm0oaWQpO1xuICBpZiAoIWFsYXJtKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvbjogbWlzc2luZyBsb2cgZmlsdGVyIGFsYXJtIGZvciBpZCBcIiR7aWR9XCIuYCk7XG4gIH1cblxuICByZXR1cm4gYWxhcm07XG59O1xuXG4vKipcbiAqIENsb3VkV2F0Y2ggYWxhcm1zIGFuZCBsb2ctYmFzZWQgbWV0cmljcyBmb3IgdGhlIEVDMiBpbnN0YW5jZSBydW5uaW5nIHNjaGVkdWxlci5cbiAqXG4gKiBFeHRlbmRzIHtAbGluayBMYW1iZGFGYWlsdXJlRGV0ZWN0b3J9IHdpdGggc2NoZWR1bGVyLXNwZWNpZmljIGxvZyBmaWx0ZXJzOlxuICogLSBgbGFtYmRhRXJyb3JzQWxhcm1gIOKAkyBgQVdTL0xhbWJkYWAgYEVycm9yc2AgbWV0cmljLlxuICogLSBgaW5zdGFuY2VTdGF0dXNGYWlsdXJlQWxhcm1gIOKAkyBsb2cgZmlsdGVyIGZvciBgUmVzb3VyY2VXYWl0RmFpbGVkOipgLlxuICogLSBgc2xhY2tQb3N0RmFpbHVyZUFsYXJtYCDigJMgbG9nIGZpbHRlciBmb3IgYHJ1bm5pbmctc2NoZWR1bGVyOiBTbGFjayBwb3N0IGZhaWxlZGAuXG4gKiAtIGBkdXJhYmxlRXhlY3V0aW9uRmFpbHVyZUFsYXJtYCDigJMgb3RoZXIgaGFuZGxlci1sZXZlbCBgRVJST1JgIGxvZ3MgKGV4Y2x1ZGluZyB0aGUgYWJvdmUpLlxuICpcbiAqIEN1c3RvbSBtZXRyaWNzIGFyZSBwdWJsaXNoZWQgdW5kZXIgdGhlIGBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXJgIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bm5pbmdTY2hlZHVsZXJGYWlsdXJlRGV0ZWN0aW9uIGV4dGVuZHMgTGFtYmRhRmFpbHVyZURldGVjdG9yIHtcbiAgLyoqIEZpcmVzIHdoZW4gaW5zdGFuY2Ugc3RhYmxlLXN0YXRlIHdhaXRpbmcgZmFpbHMgKGBSZXNvdXJjZVdhaXRGYWlsZWQ6KmApLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW5zdGFuY2VTdGF0dXNGYWlsdXJlQWxhcm06IGNsb3Vkd2F0Y2guQWxhcm07XG4gIC8qKiBGaXJlcyB3aGVuIFNsYWNrIGBjaGF0LnBvc3RNZXNzYWdlYCBmYWlscy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHNsYWNrUG9zdEZhaWx1cmVBbGFybTogY2xvdWR3YXRjaC5BbGFybTtcbiAgLyoqIEZpcmVzIG9uIGhhbmRsZXItbGV2ZWwgRVJST1IgbG9ncyBvdXRzaWRlIGluc3RhbmNlIHdhaXRpbmcgYW5kIFNsYWNrIHBvc3QgZmFpbHVyZXMuICovXG4gIHB1YmxpYyByZWFkb25seSBkdXJhYmxlRXhlY3V0aW9uRmFpbHVyZUFsYXJtOiBjbG91ZHdhdGNoLkFsYXJtO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBQYXJlbnQgY29uc3RydWN0LlxuICAgKiBAcGFyYW0gaWQgLSBDb25zdHJ1Y3QgaWQuXG4gICAqIEBwYXJhbSBwcm9wcyAtIExhbWJkYSwgbG9nIGdyb3VwLCBhbmQgb3B0aW9uYWwgYWxhcm0gbm90aWZpY2F0aW9uIHRvcGljLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJ1bm5pbmdTY2hlZHVsZXJGYWlsdXJlRGV0ZWN0aW9uUmVzb3VyY2VzUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiBwcm9wcy5ydW5uaW5nU2NoZWR1bGVGdW5jdGlvbixcbiAgICAgIGxvZ0dyb3VwOiBwcm9wcy5sb2dHcm91cCxcbiAgICAgIGFsYXJtVG9waWM6IHByb3BzLmFsYXJtVG9waWMsXG4gICAgICBsb2dGaWx0ZXJzOiBSVU5OSU5HX1NDSEVEVUxFUl9MT0dfRklMVEVSUyxcbiAgICB9KTtcblxuICAgIHRoaXMuaW5zdGFuY2VTdGF0dXNGYWlsdXJlQWxhcm0gPSByZXF1aXJlTG9nRmlsdGVyQWxhcm0odGhpcywgSU5TVEFOQ0VfU1RBVFVTX0ZBSUxVUkVfSUQpO1xuICAgIHRoaXMuc2xhY2tQb3N0RmFpbHVyZUFsYXJtID0gcmVxdWlyZUxvZ0ZpbHRlckFsYXJtKHRoaXMsIFNMQUNLX1BPU1RfRkFJTFVSRV9JRCk7XG4gICAgdGhpcy5kdXJhYmxlRXhlY3V0aW9uRmFpbHVyZUFsYXJtID0gcmVxdWlyZUxvZ0ZpbHRlckFsYXJtKHRoaXMsIERVUkFCTEVfRVhFQ1VUSU9OX0ZBSUxVUkVfSUQpO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBmYWlsdXJlIGRldGVjdGlvbiBhbGFybXMgd2hlbiBlbmFibGVkIGluIHByb3BzLlxuICpcbiAqIEBwYXJhbSBzY29wZSAtIFBhcmVudCBjb25zdHJ1Y3QuXG4gKiBAcGFyYW0gaWQgLSBDb25zdHJ1Y3QgaWQuXG4gKiBAcGFyYW0gcHJvcHMgLSBMYW1iZGEsIGxvZyBncm91cCwgYW5kIG9wdGlvbmFsIGFsYXJtIGNvbmZpZ3VyYXRpb24uXG4gKiBAcmV0dXJucyBGYWlsdXJlIGRldGVjdGlvbiBjb25zdHJ1Y3QsIG9yIHVuZGVmaW5lZCB3aGVuIGRpc2FibGVkLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlUnVubmluZ1NjaGVkdWxlckZhaWx1cmVEZXRlY3Rpb24gPSAoXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXG4gIGlkOiBzdHJpbmcsXG4gIHByb3BzOiBDcmVhdGVSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvblByb3BzLFxuKTogUnVubmluZ1NjaGVkdWxlckZhaWx1cmVEZXRlY3Rpb24gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIXByb3BzLmZhaWx1cmVEZXRlY3Rpb24gfHwgIWlzTGFtYmRhRmFpbHVyZURldGVjdGlvbkVuYWJsZWQocHJvcHMuZmFpbHVyZURldGVjdGlvbikpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSdW5uaW5nU2NoZWR1bGVyRmFpbHVyZURldGVjdGlvbihzY29wZSwgaWQsIHtcbiAgICBhbGFybVRvcGljOiBwcm9wcy5mYWlsdXJlRGV0ZWN0aW9uLmFsYXJtVG9waWMsXG4gICAgcnVubmluZ1NjaGVkdWxlRnVuY3Rpb246IHByb3BzLnJ1bm5pbmdTY2hlZHVsZUZ1bmN0aW9uLFxuICAgIGxvZ0dyb3VwOiBwcm9wcy5sb2dHcm91cCxcbiAgfSk7XG59O1xuIl19
@@ -18,15 +18,15 @@ const running_scheduler_wait_config_1 = require("./running-scheduler-wait-config
18
18
  const parseResourceWaitLimitsFromEnv = () => {
19
19
  const parsed = strict_env_resolver_1.StrictEnvResolver.resolveAll({
20
20
  [running_scheduler_wait_config_1.PROCESS_RESOURCE_MAX_LOOP_COUNT_ENV]: [
21
- strict_env_resolver_1.StrictEnvType.PositiveInt,
21
+ strict_env_resolver_1.StrictEnvType.Number.PositiveInteger,
22
22
  { default: running_scheduler_predicates_1.DEFAULT_RESOURCE_WAIT_LIMITS.maxLoopCount },
23
23
  ],
24
24
  [running_scheduler_wait_config_1.PROCESS_RESOURCE_MAX_ELAPSED_SECONDS_ENV]: [
25
- strict_env_resolver_1.StrictEnvType.PositiveInt,
25
+ strict_env_resolver_1.StrictEnvType.Number.PositiveInteger,
26
26
  { default: running_scheduler_predicates_1.DEFAULT_RESOURCE_WAIT_LIMITS.maxElapsedSeconds },
27
27
  ],
28
28
  [running_scheduler_wait_config_1.PROCESS_RESOURCE_STATUS_CHANGE_WAIT_SECONDS_ENV]: [
29
- strict_env_resolver_1.StrictEnvType.PositiveInt,
29
+ strict_env_resolver_1.StrictEnvType.Number.PositiveInteger,
30
30
  { default: running_scheduler_predicates_1.DEFAULT_RESOURCE_WAIT_LIMITS.statusChangeWaitSeconds },
31
31
  ],
32
32
  });
@@ -46,11 +46,11 @@ exports.parseResourceWaitLimitsFromEnv = parseResourceWaitLimitsFromEnv;
46
46
  const parseMaxConcurrencyFromEnv = () => {
47
47
  const parsed = strict_env_resolver_1.StrictEnvResolver.resolveAll({
48
48
  [running_scheduler_wait_config_1.PROCESS_RESOURCES_MAX_CONCURRENCY_ENV]: [
49
- strict_env_resolver_1.StrictEnvType.PositiveInt,
49
+ strict_env_resolver_1.StrictEnvType.Number.PositiveInteger,
50
50
  { default: running_scheduler_predicates_1.DEFAULT_MAX_CONCURRENCY },
51
51
  ],
52
52
  });
53
53
  return parsed[running_scheduler_wait_config_1.PROCESS_RESOURCES_MAX_CONCURRENCY_ENV];
54
54
  };
55
55
  exports.parseMaxConcurrencyFromEnv = parseMaxConcurrencyFromEnv;
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1zY2hlZHVsZXItd2FpdC1lbnYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZnVuY3MvcnVubmluZy1zY2hlZHVsZXItd2FpdC1lbnYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7Ozs7R0FJRztBQUNILDZEQUF1RTtBQUN2RSxpRkFJd0M7QUFDeEMsbUZBS3lDO0FBRXpDOzs7OztHQUtHO0FBQ0ksTUFBTSw4QkFBOEIsR0FBRyxHQUF1QixFQUFFO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLHVDQUFpQixDQUFDLFVBQVUsQ0FBQztRQUMxQyxDQUFDLG1FQUFtQyxDQUFDLEVBQUU7WUFDckMsbUNBQWEsQ0FBQyxXQUFXO1lBQ3pCLEVBQUUsT0FBTyxFQUFFLDJEQUE0QixDQUFDLFlBQVksRUFBRTtTQUN2RDtRQUNELENBQUMsd0VBQXdDLENBQUMsRUFBRTtZQUMxQyxtQ0FBYSxDQUFDLFdBQVc7WUFDekIsRUFBRSxPQUFPLEVBQUUsMkRBQTRCLENBQUMsaUJBQWlCLEVBQUU7U0FDNUQ7UUFDRCxDQUFDLCtFQUErQyxDQUFDLEVBQUU7WUFDakQsbUNBQWEsQ0FBQyxXQUFXO1lBQ3pCLEVBQUUsT0FBTyxFQUFFLDJEQUE0QixDQUFDLHVCQUF1QixFQUFFO1NBQ2xFO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsT0FBTztRQUNMLFlBQVksRUFBRSxNQUFNLENBQUMsbUVBQW1DLENBQUM7UUFDekQsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLHdFQUF3QyxDQUFDO1FBQ25FLHVCQUF1QixFQUFFLE1BQU0sQ0FBQywrRUFBK0MsQ0FBQztLQUNqRixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBckJXLFFBQUEsOEJBQThCLGtDQXFCekM7QUFFRjs7Ozs7R0FLRztBQUNJLE1BQU0sMEJBQTBCLEdBQUcsR0FBVyxFQUFFO0lBQ3JELE1BQU0sTUFBTSxHQUFHLHVDQUFpQixDQUFDLFVBQVUsQ0FBQztRQUMxQyxDQUFDLHFFQUFxQyxDQUFDLEVBQUU7WUFDdkMsbUNBQWEsQ0FBQyxXQUFXO1lBQ3pCLEVBQUUsT0FBTyxFQUFFLHNEQUF1QixFQUFFO1NBQ3JDO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsT0FBTyxNQUFNLENBQUMscUVBQXFDLENBQUMsQ0FBQztBQUN2RCxDQUFDLENBQUM7QUFUVyxRQUFBLDBCQUEwQiw4QkFTckMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExhbWJkYS1vbmx5IGVudmlyb25tZW50IHBhcnNpbmcgZm9yIHJ1bm5pbmcgc2NoZWR1bGVyIGhhbmRsZXIgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBCdW5kbGVkIGludG8gdGhlIHJ1bm5pbmcgc2NoZWR1bGVyIGZ1bmN0aW9uOyBub3QgaW1wb3J0ZWQgZnJvbSBDREsgY29uc3RydWN0cy5cbiAqL1xuaW1wb3J0IHsgU3RyaWN0RW52UmVzb2x2ZXIsIFN0cmljdEVudlR5cGUgfSBmcm9tICdzdHJpY3QtZW52LXJlc29sdmVyJztcbmltcG9ydCB7XG4gIERFRkFVTFRfTUFYX0NPTkNVUlJFTkNZLFxuICBERUZBVUxUX1JFU09VUkNFX1dBSVRfTElNSVRTLFxuICB0eXBlIFJlc291cmNlV2FpdExpbWl0cyxcbn0gZnJvbSAnLi9ydW5uaW5nLXNjaGVkdWxlci1wcmVkaWNhdGVzJztcbmltcG9ydCB7XG4gIFBST0NFU1NfUkVTT1VSQ0VfTUFYX0VMQVBTRURfU0VDT05EU19FTlYsXG4gIFBST0NFU1NfUkVTT1VSQ0VfTUFYX0xPT1BfQ09VTlRfRU5WLFxuICBQUk9DRVNTX1JFU09VUkNFX1NUQVRVU19DSEFOR0VfV0FJVF9TRUNPTkRTX0VOVixcbiAgUFJPQ0VTU19SRVNPVVJDRVNfTUFYX0NPTkNVUlJFTkNZX0VOVixcbn0gZnJvbSAnLi9ydW5uaW5nLXNjaGVkdWxlci13YWl0LWNvbmZpZyc7XG5cbi8qKlxuICogUmVhZHMgcGVyLWluc3RhbmNlIHdhaXQgbGltaXRzIGZyb20gTGFtYmRhIGVudmlyb25tZW50IHZhcmlhYmxlcyBzZXQgYnkgdGhlIENESyBjb25zdHJ1Y3QuXG4gKlxuICogQHJldHVybnMgUGFyc2VkIGxpbWl0cywgdXNpbmcge0BsaW5rIERFRkFVTFRfUkVTT1VSQ0VfV0FJVF9MSU1JVFN9IHdoZW4gdmFyaWFibGVzIGFyZSB1bnNldC5cbiAqIEB0aHJvd3Mge2ltcG9ydCgnc3RyaWN0LWVudi1yZXNvbHZlcicpLlN0cmljdEVudlZhbGlkYXRpb25FcnJvcn0gV2hlbiBhIHNldCB2YXJpYWJsZSBpcyBub3QgYSBwb3NpdGl2ZSBpbnRlZ2VyLlxuICovXG5leHBvcnQgY29uc3QgcGFyc2VSZXNvdXJjZVdhaXRMaW1pdHNGcm9tRW52ID0gKCk6IFJlc291cmNlV2FpdExpbWl0cyA9PiB7XG4gIGNvbnN0IHBhcnNlZCA9IFN0cmljdEVudlJlc29sdmVyLnJlc29sdmVBbGwoe1xuICAgIFtQUk9DRVNTX1JFU09VUkNFX01BWF9MT09QX0NPVU5UX0VOVl06IFtcbiAgICAgIFN0cmljdEVudlR5cGUuUG9zaXRpdmVJbnQsXG4gICAgICB7IGRlZmF1bHQ6IERFRkFVTFRfUkVTT1VSQ0VfV0FJVF9MSU1JVFMubWF4TG9vcENvdW50IH0sXG4gICAgXSxcbiAgICBbUFJPQ0VTU19SRVNPVVJDRV9NQVhfRUxBUFNFRF9TRUNPTkRTX0VOVl06IFtcbiAgICAgIFN0cmljdEVudlR5cGUuUG9zaXRpdmVJbnQsXG4gICAgICB7IGRlZmF1bHQ6IERFRkFVTFRfUkVTT1VSQ0VfV0FJVF9MSU1JVFMubWF4RWxhcHNlZFNlY29uZHMgfSxcbiAgICBdLFxuICAgIFtQUk9DRVNTX1JFU09VUkNFX1NUQVRVU19DSEFOR0VfV0FJVF9TRUNPTkRTX0VOVl06IFtcbiAgICAgIFN0cmljdEVudlR5cGUuUG9zaXRpdmVJbnQsXG4gICAgICB7IGRlZmF1bHQ6IERFRkFVTFRfUkVTT1VSQ0VfV0FJVF9MSU1JVFMuc3RhdHVzQ2hhbmdlV2FpdFNlY29uZHMgfSxcbiAgICBdLFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIG1heExvb3BDb3VudDogcGFyc2VkW1BST0NFU1NfUkVTT1VSQ0VfTUFYX0xPT1BfQ09VTlRfRU5WXSxcbiAgICBtYXhFbGFwc2VkU2Vjb25kczogcGFyc2VkW1BST0NFU1NfUkVTT1VSQ0VfTUFYX0VMQVBTRURfU0VDT05EU19FTlZdLFxuICAgIHN0YXR1c0NoYW5nZVdhaXRTZWNvbmRzOiBwYXJzZWRbUFJPQ0VTU19SRVNPVVJDRV9TVEFUVVNfQ0hBTkdFX1dBSVRfU0VDT05EU19FTlZdLFxuICB9O1xufTtcblxuLyoqXG4gKiBSZWFkcyBkdXJhYmxlIGBtYXBgIGJvdW5kZWQgY29uY3VycmVuY3kgZnJvbSB0aGUgTGFtYmRhIGVudmlyb25tZW50LlxuICpcbiAqIEByZXR1cm5zIFBhcnNlZCBjb25jdXJyZW5jeSwgdXNpbmcge0BsaW5rIERFRkFVTFRfTUFYX0NPTkNVUlJFTkNZfSB3aGVuIHVuc2V0LlxuICogQHRocm93cyB7aW1wb3J0KCdzdHJpY3QtZW52LXJlc29sdmVyJykuU3RyaWN0RW52VmFsaWRhdGlvbkVycm9yfSBXaGVuIGEgc2V0IHZhcmlhYmxlIGlzIG5vdCBhIHBvc2l0aXZlIGludGVnZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBwYXJzZU1heENvbmN1cnJlbmN5RnJvbUVudiA9ICgpOiBudW1iZXIgPT4ge1xuICBjb25zdCBwYXJzZWQgPSBTdHJpY3RFbnZSZXNvbHZlci5yZXNvbHZlQWxsKHtcbiAgICBbUFJPQ0VTU19SRVNPVVJDRVNfTUFYX0NPTkNVUlJFTkNZX0VOVl06IFtcbiAgICAgIFN0cmljdEVudlR5cGUuUG9zaXRpdmVJbnQsXG4gICAgICB7IGRlZmF1bHQ6IERFRkFVTFRfTUFYX0NPTkNVUlJFTkNZIH0sXG4gICAgXSxcbiAgfSk7XG5cbiAgcmV0dXJuIHBhcnNlZFtQUk9DRVNTX1JFU09VUkNFU19NQVhfQ09OQ1VSUkVOQ1lfRU5WXTtcbn07XG4iXX0=
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1zY2hlZHVsZXItd2FpdC1lbnYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZnVuY3MvcnVubmluZy1zY2hlZHVsZXItd2FpdC1lbnYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7Ozs7R0FJRztBQUNILDZEQUF1RTtBQUN2RSxpRkFJd0M7QUFDeEMsbUZBS3lDO0FBRXpDOzs7OztHQUtHO0FBQ0ksTUFBTSw4QkFBOEIsR0FBRyxHQUF1QixFQUFFO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLHVDQUFpQixDQUFDLFVBQVUsQ0FBQztRQUMxQyxDQUFDLG1FQUFtQyxDQUFDLEVBQUU7WUFDckMsbUNBQWEsQ0FBQyxNQUFNLENBQUMsZUFBZTtZQUNwQyxFQUFFLE9BQU8sRUFBRSwyREFBNEIsQ0FBQyxZQUFZLEVBQUU7U0FDdkQ7UUFDRCxDQUFDLHdFQUF3QyxDQUFDLEVBQUU7WUFDMUMsbUNBQWEsQ0FBQyxNQUFNLENBQUMsZUFBZTtZQUNwQyxFQUFFLE9BQU8sRUFBRSwyREFBNEIsQ0FBQyxpQkFBaUIsRUFBRTtTQUM1RDtRQUNELENBQUMsK0VBQStDLENBQUMsRUFBRTtZQUNqRCxtQ0FBYSxDQUFDLE1BQU0sQ0FBQyxlQUFlO1lBQ3BDLEVBQUUsT0FBTyxFQUFFLDJEQUE0QixDQUFDLHVCQUF1QixFQUFFO1NBQ2xFO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsT0FBTztRQUNMLFlBQVksRUFBRSxNQUFNLENBQUMsbUVBQW1DLENBQUM7UUFDekQsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLHdFQUF3QyxDQUFDO1FBQ25FLHVCQUF1QixFQUFFLE1BQU0sQ0FBQywrRUFBK0MsQ0FBQztLQUNqRixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBckJXLFFBQUEsOEJBQThCLGtDQXFCekM7QUFFRjs7Ozs7R0FLRztBQUNJLE1BQU0sMEJBQTBCLEdBQUcsR0FBVyxFQUFFO0lBQ3JELE1BQU0sTUFBTSxHQUFHLHVDQUFpQixDQUFDLFVBQVUsQ0FBQztRQUMxQyxDQUFDLHFFQUFxQyxDQUFDLEVBQUU7WUFDdkMsbUNBQWEsQ0FBQyxNQUFNLENBQUMsZUFBZTtZQUNwQyxFQUFFLE9BQU8sRUFBRSxzREFBdUIsRUFBRTtTQUNyQztLQUNGLENBQUMsQ0FBQztJQUVILE9BQU8sTUFBTSxDQUFDLHFFQUFxQyxDQUFDLENBQUM7QUFDdkQsQ0FBQyxDQUFDO0FBVFcsUUFBQSwwQkFBMEIsOEJBU3JDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMYW1iZGEtb25seSBlbnZpcm9ubWVudCBwYXJzaW5nIGZvciBydW5uaW5nIHNjaGVkdWxlciBoYW5kbGVyIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQnVuZGxlZCBpbnRvIHRoZSBydW5uaW5nIHNjaGVkdWxlciBmdW5jdGlvbjsgbm90IGltcG9ydGVkIGZyb20gQ0RLIGNvbnN0cnVjdHMuXG4gKi9cbmltcG9ydCB7IFN0cmljdEVudlJlc29sdmVyLCBTdHJpY3RFbnZUeXBlIH0gZnJvbSAnc3RyaWN0LWVudi1yZXNvbHZlcic7XG5pbXBvcnQge1xuICBERUZBVUxUX01BWF9DT05DVVJSRU5DWSxcbiAgREVGQVVMVF9SRVNPVVJDRV9XQUlUX0xJTUlUUyxcbiAgdHlwZSBSZXNvdXJjZVdhaXRMaW1pdHMsXG59IGZyb20gJy4vcnVubmluZy1zY2hlZHVsZXItcHJlZGljYXRlcyc7XG5pbXBvcnQge1xuICBQUk9DRVNTX1JFU09VUkNFX01BWF9FTEFQU0VEX1NFQ09ORFNfRU5WLFxuICBQUk9DRVNTX1JFU09VUkNFX01BWF9MT09QX0NPVU5UX0VOVixcbiAgUFJPQ0VTU19SRVNPVVJDRV9TVEFUVVNfQ0hBTkdFX1dBSVRfU0VDT05EU19FTlYsXG4gIFBST0NFU1NfUkVTT1VSQ0VTX01BWF9DT05DVVJSRU5DWV9FTlYsXG59IGZyb20gJy4vcnVubmluZy1zY2hlZHVsZXItd2FpdC1jb25maWcnO1xuXG4vKipcbiAqIFJlYWRzIHBlci1pbnN0YW5jZSB3YWl0IGxpbWl0cyBmcm9tIExhbWJkYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc2V0IGJ5IHRoZSBDREsgY29uc3RydWN0LlxuICpcbiAqIEByZXR1cm5zIFBhcnNlZCBsaW1pdHMsIHVzaW5nIHtAbGluayBERUZBVUxUX1JFU09VUkNFX1dBSVRfTElNSVRTfSB3aGVuIHZhcmlhYmxlcyBhcmUgdW5zZXQuXG4gKiBAdGhyb3dzIHtpbXBvcnQoJ3N0cmljdC1lbnYtcmVzb2x2ZXInKS5TdHJpY3RFbnZWYWxpZGF0aW9uRXJyb3J9IFdoZW4gYSBzZXQgdmFyaWFibGUgaXMgbm90IGEgcG9zaXRpdmUgaW50ZWdlci5cbiAqL1xuZXhwb3J0IGNvbnN0IHBhcnNlUmVzb3VyY2VXYWl0TGltaXRzRnJvbUVudiA9ICgpOiBSZXNvdXJjZVdhaXRMaW1pdHMgPT4ge1xuICBjb25zdCBwYXJzZWQgPSBTdHJpY3RFbnZSZXNvbHZlci5yZXNvbHZlQWxsKHtcbiAgICBbUFJPQ0VTU19SRVNPVVJDRV9NQVhfTE9PUF9DT1VOVF9FTlZdOiBbXG4gICAgICBTdHJpY3RFbnZUeXBlLk51bWJlci5Qb3NpdGl2ZUludGVnZXIsXG4gICAgICB7IGRlZmF1bHQ6IERFRkFVTFRfUkVTT1VSQ0VfV0FJVF9MSU1JVFMubWF4TG9vcENvdW50IH0sXG4gICAgXSxcbiAgICBbUFJPQ0VTU19SRVNPVVJDRV9NQVhfRUxBUFNFRF9TRUNPTkRTX0VOVl06IFtcbiAgICAgIFN0cmljdEVudlR5cGUuTnVtYmVyLlBvc2l0aXZlSW50ZWdlcixcbiAgICAgIHsgZGVmYXVsdDogREVGQVVMVF9SRVNPVVJDRV9XQUlUX0xJTUlUUy5tYXhFbGFwc2VkU2Vjb25kcyB9LFxuICAgIF0sXG4gICAgW1BST0NFU1NfUkVTT1VSQ0VfU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFNfRU5WXTogW1xuICAgICAgU3RyaWN0RW52VHlwZS5OdW1iZXIuUG9zaXRpdmVJbnRlZ2VyLFxuICAgICAgeyBkZWZhdWx0OiBERUZBVUxUX1JFU09VUkNFX1dBSVRfTElNSVRTLnN0YXR1c0NoYW5nZVdhaXRTZWNvbmRzIH0sXG4gICAgXSxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBtYXhMb29wQ291bnQ6IHBhcnNlZFtQUk9DRVNTX1JFU09VUkNFX01BWF9MT09QX0NPVU5UX0VOVl0sXG4gICAgbWF4RWxhcHNlZFNlY29uZHM6IHBhcnNlZFtQUk9DRVNTX1JFU09VUkNFX01BWF9FTEFQU0VEX1NFQ09ORFNfRU5WXSxcbiAgICBzdGF0dXNDaGFuZ2VXYWl0U2Vjb25kczogcGFyc2VkW1BST0NFU1NfUkVTT1VSQ0VfU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFNfRU5WXSxcbiAgfTtcbn07XG5cbi8qKlxuICogUmVhZHMgZHVyYWJsZSBgbWFwYCBib3VuZGVkIGNvbmN1cnJlbmN5IGZyb20gdGhlIExhbWJkYSBlbnZpcm9ubWVudC5cbiAqXG4gKiBAcmV0dXJucyBQYXJzZWQgY29uY3VycmVuY3ksIHVzaW5nIHtAbGluayBERUZBVUxUX01BWF9DT05DVVJSRU5DWX0gd2hlbiB1bnNldC5cbiAqIEB0aHJvd3Mge2ltcG9ydCgnc3RyaWN0LWVudi1yZXNvbHZlcicpLlN0cmljdEVudlZhbGlkYXRpb25FcnJvcn0gV2hlbiBhIHNldCB2YXJpYWJsZSBpcyBub3QgYSBwb3NpdGl2ZSBpbnRlZ2VyLlxuICovXG5leHBvcnQgY29uc3QgcGFyc2VNYXhDb25jdXJyZW5jeUZyb21FbnYgPSAoKTogbnVtYmVyID0+IHtcbiAgY29uc3QgcGFyc2VkID0gU3RyaWN0RW52UmVzb2x2ZXIucmVzb2x2ZUFsbCh7XG4gICAgW1BST0NFU1NfUkVTT1VSQ0VTX01BWF9DT05DVVJSRU5DWV9FTlZdOiBbXG4gICAgICBTdHJpY3RFbnZUeXBlLk51bWJlci5Qb3NpdGl2ZUludGVnZXIsXG4gICAgICB7IGRlZmF1bHQ6IERFRkFVTFRfTUFYX0NPTkNVUlJFTkNZIH0sXG4gICAgXSxcbiAgfSk7XG5cbiAgcmV0dXJuIHBhcnNlZFtQUk9DRVNTX1JFU09VUkNFU19NQVhfQ09OQ1VSUkVOQ1lfRU5WXTtcbn07XG4iXX0=