ec2-instance-running-scheduler 0.1.8 → 0.2.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/.jsii +110 -36
- package/API.md +77 -7
- package/README.md +39 -12
- package/assets/funcs/running-scheduler.lambda/index.js +144 -38
- package/assets/funcs/running-scheduler.lambda/index.js.map +4 -4
- package/lib/constructs/ec2-instance-running-scheduler.d.ts +31 -1
- package/lib/constructs/ec2-instance-running-scheduler.js +10 -3
- package/lib/funcs/running-scheduler-polling-config.d.ts +17 -0
- package/lib/funcs/running-scheduler-polling-config.js +21 -0
- package/lib/funcs/running-scheduler-polling-env.d.ts +8 -0
- package/lib/funcs/running-scheduler-polling-env.js +53 -0
- package/lib/funcs/running-scheduler-predicates.d.ts +56 -0
- package/lib/funcs/running-scheduler-predicates.js +55 -2
- package/lib/funcs/running-scheduler.lambda.d.ts +12 -3
- package/lib/funcs/running-scheduler.lambda.js +53 -11
- package/lib/index.d.ts +3 -1
- package/lib/index.js +4 -2
- package/lib/stacks/ec2-instance-running-schedule-stack.d.ts +6 -4
- package/lib/stacks/ec2-instance-running-schedule-stack.js +6 -6
- package/package.json +3 -3
|
@@ -15,13 +15,18 @@ const client_resource_groups_tagging_api_1 = require("@aws-sdk/client-resource-g
|
|
|
15
15
|
const web_api_1 = require("@slack/web-api");
|
|
16
16
|
const aws_lambda_secret_fetcher_1 = require("aws-lambda-secret-fetcher");
|
|
17
17
|
const safe_env_getter_1 = require("safe-env-getter");
|
|
18
|
+
const running_scheduler_polling_env_1 = require("./running-scheduler-polling-env");
|
|
18
19
|
const running_scheduler_predicates_1 = require("./running-scheduler-predicates");
|
|
19
20
|
/** Mapping of EC2 instance state to display name and emoji for Slack. */
|
|
20
21
|
const STATE_LIST = [
|
|
21
22
|
{ name: 'RUNNING', emoji: '😆', state: 'running' },
|
|
22
23
|
{ name: 'STOPPED', emoji: '😴', state: 'stopped' },
|
|
23
24
|
];
|
|
24
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
* Seconds to wait between polling instance state after start/stop or while transitioning.
|
|
27
|
+
*
|
|
28
|
+
* Used with {@link processOneResource} durable `wait` calls between describe iterations.
|
|
29
|
+
*/
|
|
25
30
|
const STATUS_CHANGE_WAIT_SECONDS = 20;
|
|
26
31
|
/**
|
|
27
32
|
* Returns display name and emoji for an EC2 instance state.
|
|
@@ -37,14 +42,19 @@ const getStateDisplay = (current) => {
|
|
|
37
42
|
* Processes one EC2 instance: describes state, issues start/stop when needed, then polls until
|
|
38
43
|
* {@link isDesiredStableState} is satisfied (durable `step` / `wait` between attempts).
|
|
39
44
|
*
|
|
45
|
+
* Each loop iteration checks {@link getPollingAbortReason} before describe. Failures use
|
|
46
|
+
* {@link formatResourcePollingFailure} (`ResourcePollingFailed:*` message prefix).
|
|
47
|
+
*
|
|
40
48
|
* @param ctx - Durable execution context (child context per instance recommended).
|
|
41
49
|
* @param targetResource - EC2 instance ARN.
|
|
42
50
|
* @param params - Scheduler params (`TagKey`, `TagValues`, `Mode`).
|
|
43
51
|
* @param resourceIndex - Index used in durable step names for this resource.
|
|
52
|
+
* @param pollingLimits - Per-instance caps from {@link parseResourcePollingLimitsFromEnv} (set by the CDK construct).
|
|
44
53
|
* @returns Final resource ARN, EC2 state name, parsed account, region, and instance id.
|
|
45
|
-
* @throws {Error}
|
|
54
|
+
* @throws {Error} When polling limits are exceeded (`MaxLoopCountExceeded`, `MaxElapsedTimeExceeded`),
|
|
55
|
+
* the instance is in an unexpected state (`UnexpectedInstanceState`), or the loop exits without a stable goal state.
|
|
46
56
|
*/
|
|
47
|
-
const processOneResource = async (ctx, targetResource, params, resourceIndex) => {
|
|
57
|
+
const processOneResource = async (ctx, targetResource, params, resourceIndex, pollingLimits) => {
|
|
48
58
|
const parts = targetResource.split('/');
|
|
49
59
|
const identifier = parts[parts.length - 1] ?? 'unknown';
|
|
50
60
|
const arnParts = targetResource.split(':');
|
|
@@ -57,10 +67,32 @@ const processOneResource = async (ctx, targetResource, params, resourceIndex) =>
|
|
|
57
67
|
region,
|
|
58
68
|
account,
|
|
59
69
|
mode: params.Mode,
|
|
70
|
+
maxLoopCount: pollingLimits.maxLoopCount,
|
|
71
|
+
maxElapsedSeconds: pollingLimits.maxElapsedSeconds,
|
|
60
72
|
});
|
|
73
|
+
const startedAtMs = await ctx.step(`${stepPrefix}-polling-started-at`, async () => Date.now());
|
|
61
74
|
let loopCount = 0;
|
|
62
75
|
let currentState = '';
|
|
63
76
|
do {
|
|
77
|
+
const abortReason = await ctx.step(`${stepPrefix}-poll-limit-check-${loopCount}`, async () => (0, running_scheduler_predicates_1.getPollingAbortReason)(loopCount, startedAtMs, Date.now(), pollingLimits));
|
|
78
|
+
if (abortReason) {
|
|
79
|
+
const message = (0, running_scheduler_predicates_1.formatResourcePollingFailure)(abortReason, {
|
|
80
|
+
identifier,
|
|
81
|
+
mode: params.Mode,
|
|
82
|
+
currentState: currentState || 'unknown',
|
|
83
|
+
loopCount,
|
|
84
|
+
limits: pollingLimits,
|
|
85
|
+
});
|
|
86
|
+
ctx.logger.error('processOneResource: polling limit exceeded', {
|
|
87
|
+
identifier,
|
|
88
|
+
abortReason,
|
|
89
|
+
loopCount,
|
|
90
|
+
currentState,
|
|
91
|
+
maxLoopCount: pollingLimits.maxLoopCount,
|
|
92
|
+
maxElapsedSeconds: pollingLimits.maxElapsedSeconds,
|
|
93
|
+
});
|
|
94
|
+
throw new Error(message);
|
|
95
|
+
}
|
|
64
96
|
currentState = await ctx.step(`${stepPrefix}-describe-${loopCount}`, async () => {
|
|
65
97
|
const ec2 = new client_ec2_1.EC2Client({});
|
|
66
98
|
const out = await ec2.send(new client_ec2_1.DescribeInstancesCommand({ InstanceIds: [identifier] }));
|
|
@@ -102,9 +134,7 @@ const processOneResource = async (ctx, targetResource, params, resourceIndex) =>
|
|
|
102
134
|
continue;
|
|
103
135
|
}
|
|
104
136
|
if (!(0, running_scheduler_predicates_1.isDesiredStableState)(mode, currentState)) {
|
|
105
|
-
|
|
106
|
-
(mode === 'Stop' && (currentState === 'stopping' || currentState === 'shutting-down'));
|
|
107
|
-
if (transitioning) {
|
|
137
|
+
if ((0, running_scheduler_predicates_1.isTransitioningState)(mode, currentState)) {
|
|
108
138
|
ctx.logger.info('processOneResource: wait while transitioning', {
|
|
109
139
|
identifier,
|
|
110
140
|
loopCount,
|
|
@@ -116,13 +146,20 @@ const processOneResource = async (ctx, targetResource, params, resourceIndex) =>
|
|
|
116
146
|
loopCount += 1;
|
|
117
147
|
continue;
|
|
118
148
|
}
|
|
149
|
+
const message = (0, running_scheduler_predicates_1.formatResourcePollingFailure)('UnexpectedInstanceState', {
|
|
150
|
+
identifier,
|
|
151
|
+
mode,
|
|
152
|
+
currentState,
|
|
153
|
+
loopCount,
|
|
154
|
+
limits: pollingLimits,
|
|
155
|
+
});
|
|
119
156
|
ctx.logger.error('processOneResource: unexpected state', {
|
|
120
157
|
identifier,
|
|
121
158
|
mode,
|
|
122
159
|
currentState,
|
|
123
160
|
loopCount,
|
|
124
161
|
});
|
|
125
|
-
throw new Error(
|
|
162
|
+
throw new Error(message);
|
|
126
163
|
}
|
|
127
164
|
} while (!(0, running_scheduler_predicates_1.isDesiredStableState)(params.Mode, currentState));
|
|
128
165
|
ctx.logger.info('processOneResource: reached desired stable state', {
|
|
@@ -146,12 +183,16 @@ const processOneResource = async (ctx, targetResource, params, resourceIndex) =>
|
|
|
146
183
|
* in parallel (bounded concurrency), posts a parent Slack message and per-instance thread replies,
|
|
147
184
|
* and uses durable `step` / `wait` / `map` so the run can resume across suspensions.
|
|
148
185
|
*
|
|
186
|
+
* Reads per-instance polling limits from `PROCESS_RESOURCE_MAX_LOOP_COUNT` and
|
|
187
|
+
* `PROCESS_RESOURCE_MAX_ELAPSED_SECONDS` via {@link parseResourcePollingLimitsFromEnv}.
|
|
188
|
+
*
|
|
149
189
|
* @param event - Payload from EventBridge Scheduler; must include `Params.TagKey`, `Params.TagValues`, `Params.Mode`.
|
|
150
190
|
* @param ctx - Root durable execution context.
|
|
151
191
|
* @returns
|
|
152
192
|
* - `{ status: 'TargetResourcesNotFound' }` when no instances match the tag filter.
|
|
153
|
-
* - `{ status: 'Completed', processed, results }` when instances were handled (`results` entries match {@link processOneResource}).
|
|
154
|
-
* @throws {Error} If `Params` is invalid,
|
|
193
|
+
* - `{ status: 'Completed', processed, results }` when instances were handled (`results` entries match {@link processOneResource} return shape).
|
|
194
|
+
* @throws {Error} If `Params` is invalid, polling env vars are invalid, `SLACK_SECRET_NAME` is unset,
|
|
195
|
+
* the Slack secret is incomplete, or instance processing fails (including `ResourcePollingFailed:*` errors).
|
|
155
196
|
*/
|
|
156
197
|
exports.handler = (0, durable_execution_sdk_js_1.withDurableExecution)(async (event, ctx) => {
|
|
157
198
|
const params = event.Params;
|
|
@@ -163,6 +204,7 @@ exports.handler = (0, durable_execution_sdk_js_1.withDurableExecution)(async (ev
|
|
|
163
204
|
if (!params?.TagKey || !params?.TagValues || !params?.Mode) {
|
|
164
205
|
throw new Error('Invalid event: Params.TagKey, Params.TagValues, Params.Mode are required.');
|
|
165
206
|
}
|
|
207
|
+
const pollingLimits = (0, running_scheduler_polling_env_1.parseResourcePollingLimitsFromEnv)();
|
|
166
208
|
// safe get Secrets name from environment variable
|
|
167
209
|
const slackSecretName = safe_env_getter_1.SafeEnvGetter.getEnv('SLACK_SECRET_NAME');
|
|
168
210
|
const slackSecretValue = await ctx.step('fetch-slack-secret', async () => {
|
|
@@ -215,7 +257,7 @@ exports.handler = (0, durable_execution_sdk_js_1.withDurableExecution)(async (ev
|
|
|
215
257
|
// ),
|
|
216
258
|
async (mapCtx, targetResource, index) => {
|
|
217
259
|
return mapCtx.runInChildContext(`resource-${index}`, async (childCtx) => {
|
|
218
|
-
const result = await processOneResource(childCtx, targetResource, params, index);
|
|
260
|
+
const result = await processOneResource(childCtx, targetResource, params, index, pollingLimits);
|
|
219
261
|
// if (result.status === 'skipped') {
|
|
220
262
|
// return result;
|
|
221
263
|
// }
|
|
@@ -258,4 +300,4 @@ exports.handler = (0, durable_execution_sdk_js_1.withDurableExecution)(async (ev
|
|
|
258
300
|
results: resultList,
|
|
259
301
|
};
|
|
260
302
|
});
|
|
261
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1zY2hlZHVsZXIubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Z1bmNzL3J1bm5pbmctc2NoZWR1bGVyLmxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7R0FPRzs7O0FBRUgsNEVBQTBGO0FBQzFGLG9EQUs2QjtBQUM3QixvR0FBa0g7QUFDbEgsNENBQTJDO0FBQzNDLHlFQUEwRDtBQUMxRCxxREFBZ0Q7QUFDaEQsaUZBQXNFO0FBRXRFLHlFQUF5RTtBQUN6RSxNQUFNLFVBQVUsR0FBRztJQUNqQixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO0lBQ2xELEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7Q0FDMUMsQ0FBQztBQUVYLHVFQUF1RTtBQUN2RSxNQUFNLDBCQUEwQixHQUFHLEVBQUUsQ0FBQztBQXNCdEM7Ozs7O0dBS0c7QUFDSCxNQUFNLGVBQWUsR0FBRyxDQUFDLE9BQWUsRUFBK0MsRUFBRTtJQUN2RixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLE9BQU8sQ0FBQyxDQUFDO0lBQzFELE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN0RSxDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLEVBQzlCLEdBQW1CLEVBQ25CLGNBQXNCLEVBQ3RCLE1BQWdDLEVBQ2hDLGFBQXFCLEVBQytFLEVBQUU7SUFDdEcsTUFBTSxL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Q0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDhCQUE4QixFQUFFO1FBQzlDLFNBQVMsRUFBRSxlQUFlLENBQUMsTUFBTTtRQUNqQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU07S0FDL0IsQ0FBQyxDQUFDO0lBQ0gsT0FBTztRQUNMLE1BQU0sRUFBRSxXQUFvQjtRQUM1QixTQUFTLEVBQUUsZUFBZSxDQUFDLE1BQU07UUFDakMsT0FBTyxFQUFFLFVBQVU7S0FDcEIsQ0FBQztBQUNKLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFQzIgUnVubmluZyBTY2hlZHVsZXIg4oCTIER1cmFibGUgRnVuY3Rpb25zIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEltcGxlbWVudHMgdGhlIHJ1bm5pbmctY29udHJvbCBmbG93IHVzaW5nIEFXUyBMYW1iZGEgRHVyYWJsZSBFeGVjdXRpb24uXG4gKiBTdGVwIGNoZWNrcG9pbnRzLCB3YWl0IChubyBjaGFyZ2UpLCBhbmQgcGFyYWxsZWwgbWFwIHByb3ZpZGUgYSBmbG93IGVxdWl2YWxlbnQgdG8gU3RlcCBGdW5jdGlvbnMuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFtYmRhL2xhdGVzdC9kZy9kdXJhYmxlLWV4ZWN1dGlvbi1zZGsuaHRtbFxuICovXG5cbmltcG9ydCB7IHdpdGhEdXJhYmxlRXhlY3V0aW9uLCB0eXBlIER1cmFibGVDb250ZXh0IH0gZnJvbSAnQGF3cy9kdXJhYmxlLWV4ZWN1dGlvbi1zZGstanMnO1xuaW1wb3J0IHtcbiAgRUMyQ2xpZW50LFxuICBEZXNjcmliZUluc3RhbmNlc0NvbW1hbmQsXG4gIFN0YXJ0SW5zdGFuY2VzQ29tbWFuZCxcbiAgU3RvcEluc3RhbmNlc0NvbW1hbmQsXG59IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1lYzInO1xuaW1wb3J0IHsgR2V0UmVzb3VyY2VzQ29tbWFuZCwgUmVzb3VyY2VHcm91cHNUYWdnaW5nQVBJQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXJlc291cmNlLWdyb3Vwcy10YWdnaW5nLWFwaSc7XG5pbXBvcnQgeyBXZWJDbGllbnQgfSBmcm9tICdAc2xhY2svd2ViLWFwaSc7XG5pbXBvcnQgeyBzZWNyZXRGZXRjaGVyIH0gZnJvbSAnYXdzLWxhbWJkYS1zZWNyZXQtZmV0Y2hlcic7XG5pbXBvcnQgeyBTYWZlRW52R2V0dGVyIH0gZnJvbSAnc2FmZS1lbnYtZ2V0dGVyJztcbmltcG9ydCB7IGlzRGVzaXJlZFN0YWJsZVN0YXRlIH0gZnJvbSAnLi9ydW5uaW5nLXNjaGVkdWxlci1wcmVkaWNhdGVzJztcblxuLyoqIE1hcHBpbmcgb2YgRUMyIGluc3RhbmNlIHN0YXRlIHRvIGRpc3BsYXkgbmFtZSBhbmQgZW1vamkgZm9yIFNsYWNrLiAqL1xuY29uc3QgU1RBVEVfTElTVCA9IFtcbiAgeyBuYW1lOiAnUlVOTklORycsIGVtb2ppOiAn8J+YhicsIHN0YXRlOiAncnVubmluZycgfSxcbiAgeyBuYW1lOiAnU1RPUFBFRCcsIGVtb2ppOiAn8J+YtCcsIHN0YXRlOiAnc3RvcHBlZCcgfSxcbl0gYXMgY29uc3Q7XG5cbi8qKiBTZWNvbmRzIHRvIHdhaXQgYmV0d2VlbiBwb2xsaW5nIGluc3RhbmNlIHN0YXRlIGFmdGVyIHN0YXJ0L3N0b3AuICovXG5jb25zdCBTVEFUVVNfQ0hBTkdFX1dBSVRfU0VDT05EUyA9IDIwO1xuXG4vKiogRXZlbnQgcGF5bG9hZCBmcm9tIEV2ZW50QnJpZGdlIFNjaGVkdWxlciBpbnZva2luZyB0aGlzIExhbWJkYS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGVyRXZlbnQge1xuICBQYXJhbXM6IHtcbiAgICAvKiogVGFnIGtleSB1c2VkIHRvIHNlbGVjdCBFQzIgaW5zdGFuY2VzLiAqL1xuICAgIFRhZ0tleTogc3RyaW5nO1xuICAgIC8qKiBUYWcgdmFsdWVzIHRvIG1hdGNoLiAqL1xuICAgIFRhZ1ZhbHVlczogc3RyaW5nW107XG4gICAgLyoqIFdoZXRoZXIgdG8gc3RhcnQgb3Igc3RvcCBpbnN0YW5jZXMuICovXG4gICAgTW9kZTogJ1N0YXJ0JyB8ICdTdG9wJztcbiAgfTtcbn1cblxuLyoqIFNsYWNrIGNyZWRlbnRpYWxzIGFuZCBkZWZhdWx0IGNoYW5uZWwgbG9hZGVkIGZyb20gU2VjcmV0cyBNYW5hZ2VyIChgU0xBQ0tfU0VDUkVUX05BTUVgKS4gKi9cbmludGVyZmFjZSBTbGFja1NlY3JldCB7XG4gIC8qKiBTbGFjayBib3QgdG9rZW4gZm9yIHRoZSBTbGFjayBgV2ViQ2xpZW50YC4gKi9cbiAgdG9rZW46IHN0cmluZztcbiAgLyoqIENoYW5uZWwgSUQgb3IgbmFtZSBwYXNzZWQgdG8gYGNoYXQucG9zdE1lc3NhZ2VgLiAqL1xuICBjaGFubmVsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmV0dXJucyBkaXNwbGF5IG5hbWUgYW5kIGVtb2ppIGZvciBhbiBFQzIgaW5zdGFuY2Ugc3RhdGUuXG4gKlxuICogQHBhcmFtIGN1cnJlbnQgLSBDdXJyZW50IGluc3RhbmNlIHN0YXRlIChlLmcuICdydW5uaW5nJywgJ3N0b3BwZWQnKS5cbiAqIEByZXR1cm5zIERpc3BsYXkgaW5mbyBvciB1bmRlZmluZWQgaWYgc3RhdGUgaXMgbm90IGluIFNUQVRFX0xJU1QuXG4gKi9cbmNvbnN0IGdldFN0YXRlRGlzcGxheSA9IChjdXJyZW50OiBzdHJpbmcpOiB7IGVtb2ppOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9IHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgZm91bmQgPSBTVEFURV9MSVNULmZpbmQoKHMpID0+IHMuc3RhdGUgPT09IGN1cnJlbnQpO1xuICByZXR1cm4gZm91bmQgPyB7IGVtb2ppOiBmb3VuZC5lbW9qaSwgbmFtZTogZm91bmQubmFtZSB9IDogdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBQcm9jZXNzZXMgb25lIEVDMiBpbnN0YW5jZTogZGVzY3JpYmVzIHN0YXRlLCBpc3N1ZXMgc3RhcnQvc3RvcCB3aGVuIG5lZWRlZCwgdGhlbiBwb2xscyB1bnRpbFxuICoge0BsaW5rIGlzRGVzaXJlZFN0YWJsZVN0YXRlfSBpcyBzYXRpc2ZpZWQgKGR1cmFibGUgYHN0ZXBgIC8gYHdhaXRgIGJldHdlZW4gYXR0ZW1wdHMpLlxuICpcbiAqIEBwYXJhbSBjdHggLSBEdXJhYmxlIGV4ZWN1dGlvbiBjb250ZXh0IChjaGlsZCBjb250ZXh0IHBlciBpbnN0YW5jZSByZWNvbW1lbmRlZCkuXG4gKiBAcGFyYW0gdGFyZ2V0UmVzb3VyY2UgLSBFQzIgaW5zdGFuY2UgQVJOLlxuICogQHBhcmFtIHBhcmFtcyAtIFNjaGVkdWxlciBwYXJhbXMgKGBUYWdLZXlgLCBgVGFnVmFsdWVzYCwgYE1vZGVgKS5cbiAqIEBwYXJhbSByZXNvdXJjZUluZGV4IC0gSW5kZXggdXNlZCBpbiBkdXJhYmxlIHN0ZXAgbmFtZXMgZm9yIHRoaXMgcmVzb3VyY2UuXG4gKiBAcmV0dXJucyBGaW5hbCByZXNvdXJjZSBBUk4sIEVDMiBzdGF0ZSBuYW1lLCBwYXJzZWQgYWNjb3VudCwgcmVnaW9uLCBhbmQgaW5zdGFuY2UgaWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHN0YXRlIGlzIG5laXRoZXIgYWN0aW9uYWJsZSwgdHJhbnNpdGlvbmluZywgbm9yIHRoZSBkZXNpcmVkIHN0YWJsZSBzdGF0ZS5cbiAqL1xuY29uc3QgcHJvY2Vzc09uZVJlc291cmNlID0gYXN5bmMgKFxuICBjdHg6IER1cmFibGVDb250ZXh0LFxuICB0YXJnZXRSZXNvdXJjZTogc3RyaW5nLFxuICBwYXJhbXM6IFNjaGVkdWxlckV2ZW50WydQYXJhbXMnXSxcbiAgcmVzb3VyY2VJbmRleDogbnVtYmVyLFxuKTogUHJvbWlzZTx7IHJlc291cmNlOiBzdHJpbmc7IHN0YXR1czogc3RyaW5nOyBhY2NvdW50OiBzdHJpbmc7IHJlZ2lvbjogc3RyaW5nOyBpZGVudGlmaWVyOiBzdHJpbmcgfT4gPT4ge1xuICBjb25zdCBwYXJ0cyA9IHRhcmdldFJlc291cmNlLnNwbGl0KCcvJyk7XG4gIGNvbnN0IGlkZW50aWZpZXIgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSA/PyAndW5rbm93bic7XG4gIGNvbnN0IGFyblBhcnRzID0gdGFyZ2V0UmVzb3VyY2Uuc3BsaXQoJzonKTtcbiAgY29uc3QgYWNjb3VudCA9IGFyblBhcnRzWzRdID8/ICcnO1xuICBjb25zdCByZWdpb24gPSBhcm5QYXJ0c1szXSA/PyAnJztcbiAgY29uc3Qgc3RlcFByZWZpeCA9IGByZXNvdXJjZS0ke3Jlc291cmNlSW5kZXh9LSR7aWRlbnRpZmllcn1gO1xuXG4gIGN0eC5sb2dnZXIuaW5mbygncHJvY2Vzc09uZVJlc291cmNlOiBzdGFydCcsIHtcbiAgICByZXNvdXJjZUluZGV4LFxuICAgIGlkZW50aWZpZXIsXG4gICAgcmVnaW9uLFxuICAgIGFjY291bnQsXG4gICAgbW9kZTogcGFyYW1zLk1vZGUsXG4gIH0pO1xuXG4gIGxldCBsb29wQ291bnQgPSAwO1xuICBsZXQgY3VycmVudFN0YXRlID0gJyc7XG4gIGRvIHtcbiAgICBjdXJyZW50U3RhdGUgPSBhd2FpdCBjdHguc3RlcChgJHtzdGVwUHJlZml4fS1kZXNjcmliZS0ke2xvb3BDb3VudH1gLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlYzIgPSBuZXcgRUMyQ2xpZW50KHt9KTtcbiAgICAgIGNvbnN0IG91dCA9IGF3YWl0IGVjMi5zZW5kKG5ldyBEZXNjcmliZUluc3RhbmNlc0NvbW1hbmQoeyBJbnN0YW5jZUlkczogW2lkZW50aWZpZXJdIH0pKTtcbiAgICAgIHJldHVybiBvdXQuUmVzZXJ2YXRpb25zPy5bMF0/Lkluc3RhbmNlcz8uWzBdPy5TdGF0ZT8uTmFtZSA/PyAndW5rbm93bic7XG4gICAgfSk7XG5cbiAgICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogZGVzY3JpYmVkJywge1xuICAgICAgaWRlbnRpZmllcixcbiAgICAgIGxvb3BDb3VudCxcbiAgICAgIGN1cnJlbnRTdGF0ZSxcbiAgICAgIG1vZGU6IHBhcmFtcy5Nb2RlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgbW9kZSA9IHBhcmFtcy5Nb2RlO1xuXG4gICAgaWYgKG1vZGUgPT09ICdTdGFydCcgJiYgY3VycmVudFN0YXRlID09PSAnc3RvcHBlZCcpIHtcbiAgICAgIGN0eC5sb2dnZXIuaW5mbygncHJvY2Vzc09uZVJlc291cmNlOiBzdGFydGluZyBpbnN0YW5jZScsIHsgaWRlbnRpZmllciwgbG9vcENvdW50IH0pO1xuICAgICAgYXdhaXQgY3R4LnN0ZXAoYCR7c3RlcFByZWZpeH0tc3RhcnQtJHtsb29wQ291bnR9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBlYzIgPSBuZXcgRUMyQ2xpZW50KHt9KTtcbiAgICAgICAgYXdhaXQgZWMyLnNlbmQobmV3IFN0YXJ0SW5zdGFuY2VzQ29tbWFuZCh7IEluc3RhbmNlSWRzOiBbaWRlbnRpZmllcl0gfSkpO1xuICAgICAgfSk7XG4gICAgICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogd2FpdCBhZnRlciBzdGFydCcsIHtcbiAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGN0eC53YWl0KHsgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMgfSk7XG4gICAgICBsb29wQ291bnQgKz0gMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChtb2RlID09PSAnU3RvcCcgJiYgY3VycmVudFN0YXRlID09PSAncnVubmluZycpIHtcbiAgICAgIGN0eC5sb2dnZXIuaW5mbygncHJvY2Vzc09uZVJlc291cmNlOiBzdG9wcGluZyBpbnN0YW5jZScsIHsgaWRlbnRpZmllciwgbG9vcENvdW50IH0pO1xuICAgICAgYXdhaXQgY3R4LnN0ZXAoYCR7c3RlcFByZWZpeH0tc3RvcC0ke2xvb3BDb3VudH1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVjMiA9IG5ldyBFQzJDbGllbnQoe30pO1xuICAgICAgICBhd2FpdCBlYzIuc2VuZChuZXcgU3RvcEluc3RhbmNlc0NvbW1hbmQoeyBJbnN0YW5jZUlkczogW2lkZW50aWZpZXJdIH0pKTtcbiAgICAgIH0pO1xuICAgICAgY3R4LmxvZ2dlci5pbmZvKCdwcm9jZXNzT25lUmVzb3VyY2U6IHdhaXQgYWZ0ZXIgc3RvcCcsIHtcbiAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGN0eC53YWl0KHsgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMgfSk7XG4gICAgICBsb29wQ291bnQgKz0gMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghaXNEZXNpcmVkU3RhYmxlU3RhdGUobW9kZSwgY3VycmVudFN0YXRlKSkge1xuICAgICAgY29uc3QgdHJhbnNpdGlvbmluZyA9XG4gICAgICAgIChtb2RlID09PSAnU3RhcnQnICYmIGN1cnJlbnRTdGF0ZSA9PT0gJ3BlbmRpbmcnKSB8fFxuICAgICAgICAobW9kZSA9PT0gJ1N0b3AnICYmIChjdXJyZW50U3RhdGUgPT09ICdzdG9wcGluZycgfHwgY3VycmVudFN0YXRlID09PSAnc2h1dHRpbmctZG93bicpKTtcblxuICAgICAgaWYgKHRyYW5zaXRpb25pbmcpIHtcbiAgICAgICAgY3R4LmxvZ2dlci5pbmZvKCdwcm9jZXNzT25lUmVzb3VyY2U6IHdhaXQgd2hpbGUgdHJhbnNpdGlvbmluZycsIHtcbiAgICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICAgIGxvb3BDb3VudCxcbiAgICAgICAgICBjdXJyZW50U3RhdGUsXG4gICAgICAgICAgbW9kZSxcbiAgICAgICAgICBzZWNvbmRzOiBTVEFUVVNfQ0hBTkdFX1dBSVRfU0VDT05EUyxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IGN0eC53YWl0KHsgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMgfSk7XG4gICAgICAgIGxvb3BDb3VudCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY3R4LmxvZ2dlci5lcnJvcigncHJvY2Vzc09uZVJlc291cmNlOiB1bmV4cGVjdGVkIHN0YXRlJywge1xuICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICBtb2RlLFxuICAgICAgICBjdXJyZW50U3RhdGUsXG4gICAgICAgIGxvb3BDb3VudCxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnN0YW5jZSBzdGF0dXMgZmFpbDogbW9kZT0ke21vZGV9IGN1cnJlbnRTdGF0ZT0ke2N1cnJlbnRTdGF0ZX1gKTtcbiAgICB9XG4gIH0gd2hpbGUgKCFpc0Rlc2lyZWRTdGFibGVTdGF0ZShwYXJhbXMuTW9kZSwgY3VycmVudFN0YXRlKSk7XG5cbiAgY3R4LmxvZ2dlci5pbmZvKCdwcm9jZXNzT25lUmVzb3VyY2U6IHJlYWNoZWQgZGVzaXJlZCBzdGFibGUgc3RhdGUnLCB7XG4gICAgaWRlbnRpZmllcixcbiAgICBmaW5hbFN0YXRlOiBjdXJyZW50U3RhdGUsXG4gICAgbW9kZTogcGFyYW1zLk1vZGUsXG4gICAgbG9vcENvdW50LFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIGlkZW50aWZpZXIsXG4gICAgYWNjb3VudCxcbiAgICByZWdpb24sXG4gICAgcmVzb3VyY2U6IHRhcmdldFJlc291cmNlLFxuICAgIHN0YXR1czogY3VycmVudFN0YXRlLFxuICB9O1xufTtcblxuLyoqXG4gKiBEdXJhYmxlIExhbWJkYSBlbnRyeSBwb2ludCBmb3IgdGhlIEVDMiBydW5uaW5nIHNjaGVkdWxlci5cbiAqXG4gKiBSZXNvbHZlcyBpbnN0YW5jZXMgdmlhIFJlc291cmNlIEdyb3VwcyBUYWdnaW5nIEFQSSwgcnVucyB7QGxpbmsgcHJvY2Vzc09uZVJlc291cmNlfSBmb3IgZWFjaCBBUk5cbiAqIGluIHBhcmFsbGVsIChib3VuZGVkIGNvbmN1cnJlbmN5KSwgcG9zdHMgYSBwYXJlbnQgU2xhY2sgbWVzc2FnZSBhbmQgcGVyLWluc3RhbmNlIHRocmVhZCByZXBsaWVzLFxuICogYW5kIHVzZXMgZHVyYWJsZSBgc3RlcGAgLyBgd2FpdGAgLyBgbWFwYCBzbyB0aGUgcnVuIGNhbiByZXN1bWUgYWNyb3NzIHN1c3BlbnNpb25zLlxuICpcbiAqIEBwYXJhbSBldmVudCAtIFBheWxvYWQgZnJvbSBFdmVudEJyaWRnZSBTY2hlZHVsZXI7IG11c3QgaW5jbHVkZSBgUGFyYW1zLlRhZ0tleWAsIGBQYXJhbXMuVGFnVmFsdWVzYCwgYFBhcmFtcy5Nb2RlYC5cbiAqIEBwYXJhbSBjdHggLSBSb290IGR1cmFibGUgZXhlY3V0aW9uIGNvbnRleHQuXG4gKiBAcmV0dXJuc1xuICogLSBgeyBzdGF0dXM6ICdUYXJnZXRSZXNvdXJjZXNOb3RGb3VuZCcgfWAgd2hlbiBubyBpbnN0YW5jZXMgbWF0Y2ggdGhlIHRhZyBmaWx0ZXIuXG4gKiAtIGB7IHN0YXR1czogJ0NvbXBsZXRlZCcsIHByb2Nlc3NlZCwgcmVzdWx0cyB9YCB3aGVuIGluc3RhbmNlcyB3ZXJlIGhhbmRsZWQgKGByZXN1bHRzYCBlbnRyaWVzIG1hdGNoIHtAbGluayBwcm9jZXNzT25lUmVzb3VyY2V9KS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBgUGFyYW1zYCBpcyBpbnZhbGlkLCBgU0xBQ0tfU0VDUkVUX05BTUVgIGlzIHVuc2V0LCB0aGUgU2xhY2sgc2VjcmV0IGlzIGluY29tcGxldGUsIG9yIGluc3RhbmNlIHByb2Nlc3NpbmcgZmFpbHMuXG4gKi9cbmV4cG9ydCBjb25zdCBoYW5kbGVyID0gd2l0aER1cmFibGVFeGVjdXRpb24oYXN5bmMgKGV2ZW50OiBTY2hlZHVsZXJFdmVudCwgY3R4OiBEdXJhYmxlQ29udGV4dCkgPT4ge1xuXG4gIGNvbnN0IHBhcmFtcyA9IGV2ZW50LlBhcmFtcztcblxuICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBpbnZvY2F0aW9uJywge1xuICAgIG1vZGU6IHBhcmFtcz8uTW9kZSxcbiAgICB0YWdLZXk6IHBhcmFtcz8uVGFnS2V5LFxuICAgIHRhZ1ZhbHVlQ291bnQ6IHBhcmFtcz8uVGFnVmFsdWVzPy5sZW5ndGggPz8gMCxcbiAgfSk7XG5cbiAgaWYgKCFwYXJhbXM/LlRhZ0tleSB8fCAhcGFyYW1zPy5UYWdWYWx1ZXMgfHwgIXBhcmFtcz8uTW9kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBldmVudDogUGFyYW1zLlRhZ0tleSwgUGFyYW1zLlRhZ1ZhbHVlcywgUGFyYW1zLk1vZGUgYXJlIHJlcXVpcmVkLicpO1xuICB9XG5cbiAgLy8gc2FmZSBnZXQgU2VjcmV0cyBuYW1lIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVcbiAgY29uc3Qgc2xhY2tTZWNyZXROYW1lID0gU2FmZUVudkdldHRlci5nZXRFbnYoJ1NMQUNLX1NFQ1JFVF9OQU1FJyk7XG5cbiAgY29uc3Qgc2xhY2tTZWNyZXRWYWx1ZSA9IGF3YWl0IGN0eC5zdGVwKCdmZXRjaC1zbGFjay1zZWNyZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogZmV0Y2hpbmcgU2xhY2sgc2VjcmV0JywgeyBzZWNyZXROYW1lOiBzbGFja1NlY3JldE5hbWUgfSk7XG4gICAgcmV0dXJuIHNlY3JldEZldGNoZXIuZ2V0U2VjcmV0VmFsdWU8U2xhY2tTZWNyZXQ+KHNsYWNrU2VjcmV0TmFtZSk7XG4gIH0pO1xuXG4gIGN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IFNsYWNrIHNlY3JldCBsb2FkZWQnKTtcblxuICBpZiAoIXNsYWNrU2VjcmV0VmFsdWU/LnRva2VuIHx8ICFzbGFja1NlY3JldFZhbHVlPy5jaGFubmVsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTbGFjayBzZWNyZXQgbXVzdCBjb250YWluIHRva2VuIGFuZCBjaGFubmVsLicpO1xuICB9XG5cbiAgY29uc3QgdGFyZ2V0UmVzb3VyY2VzID0gYXdhaXQgY3R4LnN0ZXAoJ2dldC10YXJnZXQtcmVzb3VyY2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBSZXNvdXJjZUdyb3Vwc1RhZ2dpbmdBUElDbGllbnQoe30pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5zZW5kKFxuICAgICAgbmV3IEdldFJlc291cmNlc0NvbW1hbmQoe1xuICAgICAgICBSZXNvdXJjZVR5cGVGaWx0ZXJzOiBbJ2VjMjppbnN0YW5jZSddLFxuICAgICAgICBUYWdGaWx0ZXJzOiBbeyBLZXk6IHBhcmFtcy5UYWdLZXksIFZhbHVlczogcGFyYW1zLlRhZ1ZhbHVlcyB9XSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgY29uc3QgYXJucyA9IChyZXN1bHQuUmVzb3VyY2VUYWdNYXBwaW5nTGlzdCA/PyBbXSlcbiAgICAgIC5tYXAoKG06IHsgUmVzb3VyY2VBUk4/OiBzdHJpbmcgfSkgPT4gbS5SZXNvdXJjZUFSTilcbiAgICAgIC5maWx0ZXIoKGFybjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYXJuIGlzIHN0cmluZyA9PiBhcm4gIT0gbnVsbCk7XG4gICAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogZ2V0LXRhcmdldC1yZXNvdXJjZXMgZG9uZScsIHsgY291bnQ6IGFybnMubGVuZ3RoIH0pO1xuICAgIHJldHVybiBhcm5zO1xuICB9KTtcblxuICBpZiAodGFyZ2V0UmVzb3VyY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IG5vIG1hdGNoaW5nIGluc3RhbmNlcycsIHsgdGFnS2V5OiBwYXJhbXMuVGFnS2V5IH0pO1xuICAgIHJldHVybiB7IHN0YXR1czogJ1RhcmdldFJlc291cmNlc05vdEZvdW5kJyBhcyBjb25zdCB9O1xuICB9XG5cbiAgY29uc3QgY2xpZW50ID0gbmV3IFdlYkNsaWVudChzbGFja1NlY3JldFZhbHVlLnRva2VuKTtcbiAgY29uc3QgY2hhbm5lbCA9IHNsYWNrU2VjcmV0VmFsdWUuY2hhbm5lbDtcblxuICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBwb3N0aW5nIHBhcmVudCBTbGFjayBtZXNzYWdlJywge1xuICAgIGluc3RhbmNlQ291bnQ6IHRhcmdldFJlc291cmNlcy5sZW5ndGgsXG4gIH0pO1xuXG4gIC8vIHNlbmQgc2xhY2sgbWVzc2FnZVxuICBjb25zdCBzbGFja1BhcmVudE1lc3NhZ2VSZXN1bHQgPSBhd2FpdCBjdHguc3RlcCgncG9zdC1zbGFjay1tZXNzYWdlcycsIGFzeW5jICgpID0+IHtcbiAgICByZXR1cm4gY2xpZW50LmNoYXQucG9zdE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbCxcbiAgICAgIHRleHQ6IGAke3BhcmFtcy5Nb2RlID09PSAnU3RhcnQnID8gJ/CfmIYgU3RhcnRzJyA6ICfwn6WxIFN0b3BzJ30gdGhlIHNjaGVkdWxlZCBFQzIgSW5zdGFuY2UuYCxcbiAgICB9KTtcbiAgfSk7XG5cbiAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogcGFyZW50IFNsYWNrIG1lc3NhZ2UgcG9zdGVkJywge1xuICAgIHRocmVhZFRzOiBzbGFja1BhcmVudE1lc3NhZ2VSZXN1bHQ/LnRzID8/IG51bGwsXG4gIH0pO1xuXG4gIGN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IHN0YXJ0aW5nIHBhcmFsbGVsIGluc3RhbmNlIHByb2Nlc3NpbmcnLCB7XG4gICAgY291bnQ6IHRhcmdldFJlc291cmNlcy5sZW5ndGgsXG4gICAgbWF4Q29uY3VycmVuY3k6IDEwLFxuICB9KTtcblxuICBjb25zdCByZXN1bHRzID0gYXdhaXQgY3R4Lm1hcChcbiAgICB0YXJnZXRSZXNvdXJjZXMsXG4gICAgLy8gYXN5bmMgKGN0eDogRHVyYWJsZUNvbnRleHQsIHRhcmdldFJlc291cmNlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+XG4gICAgLy8gICBjdHguc3RlcChgcHJvY2Vzcy1yZXNvdXJjZS0ke2luZGV4fWAsIGFzeW5jICgpID0+XG4gICAgLy8gICAgIHByb2Nlc3NPbmVSZXNvdXJjZShjdHgsIHRhcmdldFJlc291cmNlLCBwYXJhbXMsIGluZGV4KSxcbiAgICAvLyAgICksXG4gICAgYXN5bmMgKG1hcEN0eDogRHVyYWJsZUNvbnRleHQsIHRhcmdldFJlc291cmNlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIHJldHVybiBtYXBDdHgucnVuSW5DaGlsZENvbnRleHQoYHJlc291cmNlLSR7aW5kZXh9YCwgYXN5bmMgKGNoaWxkQ3R4OiBEdXJhYmxlQ29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9jZXNzT25lUmVzb3VyY2UoY2hpbGRDdHgsIHRhcmdldFJlc291cmNlLCBwYXJhbXMsIGluZGV4KTtcbiAgICAgICAgLy8gaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdza2lwcGVkJykge1xuICAgICAgICAvLyAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIC8vIH1cbiAgICAgICAgY2hpbGRDdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBwb3N0aW5nIHRocmVhZCBTbGFjayBtZXNzYWdlJywge1xuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGlkZW50aWZpZXI6IHJlc3VsdC5pZGVudGlmaWVyLFxuICAgICAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHNlbmQgc2xhY2sgdGhyZWFkIG1lc3NhZ2VcbiAgICAgICAgYXdhaXQgY2hpbGRDdHguc3RlcCgncG9zdC1zbGFjay1jaGlsZC1tZXNzYWdlcycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBkaXNwbGF5ID0gZ2V0U3RhdGVEaXNwbGF5KHJlc3VsdC5zdGF0dXMpO1xuXG4gICAgICAgICAgcmV0dXJuIGNsaWVudC5jaGF0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICB0aHJlYWRfdHM6IHNsYWNrUGFyZW50TWVzc2FnZVJlc3VsdD8udHMsXG4gICAgICAgICAgICBhdHRhY2htZW50czogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29sb3I6ICcjMzZhNjRmJyxcbiAgICAgICAgICAgICAgICBwcmV0ZXh0OiBgJHtkaXNwbGF5Py5lbW9qaX0gVGhlIHN0YXR1cyBvZiB0aGUgRUMyIEluc3RhbmNlICR7cmVzdWx0LmlkZW50aWZpZXJ9IGNoYW5nZWQgdG8gJHtkaXNwbGF5Py5uYW1lfSBkdWUgdG8gdGhlIHNjaGVkdWxlLmAsXG4gICAgICAgICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICAgICAgICB7IHRpdGxlOiAnQWNjb3VudCcsIHZhbHVlOiByZXN1bHQuYWNjb3VudCwgc2hvcnQ6IHRydWUgfSxcbiAgICAgICAgICAgICAgICAgIHsgdGl0bGU6ICdSZWdpb24nLCB2YWx1ZTogcmVzdWx0LnJlZ2lvbiwgc2hvcnQ6IHRydWUgfSxcbiAgICAgICAgICAgICAgICAgIHsgdGl0bGU6ICdJZGVudGlmaWVyJywgdmFsdWU6IHJlc3VsdC5pZGVudGlmaWVyLCBzaG9ydDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgICAgeyB0aXRsZTogJ1N0YXR1cycsIHZhbHVlOiAoZGlzcGxheT8ubmFtZSA/PyAnVW5rbm93bicpLCBzaG9ydDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgeyBtYXhDb25jdXJyZW5jeTogMTAgfSxcbiAgKTtcblxuICBjb25zdCByZXN1bHRMaXN0ID0gQXJyYXkuaXNBcnJheShyZXN1bHRzKSA/IHJlc3VsdHMgOiBbXTtcbiAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogY29tcGxldGVkJywge1xuICAgIHByb2Nlc3NlZDogdGFyZ2V0UmVzb3VyY2VzLmxlbmd0aCxcbiAgICByZXN1bHRDb3VudDogcmVzdWx0TGlzdC5sZW5ndGgsXG4gIH0pO1xuICByZXR1cm4ge1xuICAgIHN0YXR1czogJ0NvbXBsZXRlZCcgYXMgY29uc3QsXG4gICAgcHJvY2Vzc2VkOiB0YXJnZXRSZXNvdXJjZXMubGVuZ3RoLFxuICAgIHJlc3VsdHM6IHJlc3VsdExpc3QsXG4gIH07XG59KTtcbiJdfQ==
|
|
303
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1zY2hlZHVsZXIubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Z1bmNzL3J1bm5pbmctc2NoZWR1bGVyLmxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7R0FPRzs7O0FBRUgsNEVBQTBGO0FBQzFGLG9EQUs2QjtBQUM3QixvR0FBa0g7QUFDbEgsNENBQTJDO0FBQzNDLHlFQUEwRDtBQUMxRCxxREFBZ0Q7QUFDaEQsbUZBQW9GO0FBQ3BGLGlGQU13QztBQUV4Qyx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLEdBQUc7SUFDakIsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtJQUNsRCxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO0NBQzFDLENBQUM7QUFFWDs7OztHQUlHO0FBQ0gsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLENBQUM7QUEyQnRDOzs7OztHQUtHO0FBQ0gsTUFBTSxlQUFlLEdBQUcsQ0FBQyxPQUFlLEVBQStDLEVBQUU7SUFDdkYsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsQ0FBQztJQUMxRCxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDdEUsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLEVBQzlCLEdBQW1CLEVBQ25CLGNBQXNCLEVBQ3RCLE1BQWdDLEVBQ2hDLGFBQXFCLEVBQ3JC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QzlDLFNBQVMsRUFBRSxlQUFlLENBQUMsTUFBTTtRQUNqQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU07S0FDL0IsQ0FBQyxDQUFDO0lBQ0gsT0FBTztRQUNMLE1BQU0sRUFBRSxXQUFvQjtRQUM1QixTQUFTLEVBQUUsZUFBZSxDQUFDLE1BQU07UUFDakMsT0FBTyxFQUFFLFVBQVU7S0FDcEIsQ0FBQztBQUNKLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFQzIgUnVubmluZyBTY2hlZHVsZXIg4oCTIER1cmFibGUgRnVuY3Rpb25zIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEltcGxlbWVudHMgdGhlIHJ1bm5pbmctY29udHJvbCBmbG93IHVzaW5nIEFXUyBMYW1iZGEgRHVyYWJsZSBFeGVjdXRpb24uXG4gKiBTdGVwIGNoZWNrcG9pbnRzLCB3YWl0IChubyBjaGFyZ2UpLCBhbmQgcGFyYWxsZWwgbWFwIHByb3ZpZGUgYSBmbG93IGVxdWl2YWxlbnQgdG8gU3RlcCBGdW5jdGlvbnMuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFtYmRhL2xhdGVzdC9kZy9kdXJhYmxlLWV4ZWN1dGlvbi1zZGsuaHRtbFxuICovXG5cbmltcG9ydCB7IHdpdGhEdXJhYmxlRXhlY3V0aW9uLCB0eXBlIER1cmFibGVDb250ZXh0IH0gZnJvbSAnQGF3cy9kdXJhYmxlLWV4ZWN1dGlvbi1zZGstanMnO1xuaW1wb3J0IHtcbiAgRUMyQ2xpZW50LFxuICBEZXNjcmliZUluc3RhbmNlc0NvbW1hbmQsXG4gIFN0YXJ0SW5zdGFuY2VzQ29tbWFuZCxcbiAgU3RvcEluc3RhbmNlc0NvbW1hbmQsXG59IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1lYzInO1xuaW1wb3J0IHsgR2V0UmVzb3VyY2VzQ29tbWFuZCwgUmVzb3VyY2VHcm91cHNUYWdnaW5nQVBJQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXJlc291cmNlLWdyb3Vwcy10YWdnaW5nLWFwaSc7XG5pbXBvcnQgeyBXZWJDbGllbnQgfSBmcm9tICdAc2xhY2svd2ViLWFwaSc7XG5pbXBvcnQgeyBzZWNyZXRGZXRjaGVyIH0gZnJvbSAnYXdzLWxhbWJkYS1zZWNyZXQtZmV0Y2hlcic7XG5pbXBvcnQgeyBTYWZlRW52R2V0dGVyIH0gZnJvbSAnc2FmZS1lbnYtZ2V0dGVyJztcbmltcG9ydCB7IHBhcnNlUmVzb3VyY2VQb2xsaW5nTGltaXRzRnJvbUVudiB9IGZyb20gJy4vcnVubmluZy1zY2hlZHVsZXItcG9sbGluZy1lbnYnO1xuaW1wb3J0IHtcbiAgZm9ybWF0UmVzb3VyY2VQb2xsaW5nRmFpbHVyZSxcbiAgZ2V0UG9sbGluZ0Fib3J0UmVhc29uLFxuICBpc0Rlc2lyZWRTdGFibGVTdGF0ZSxcbiAgaXNUcmFuc2l0aW9uaW5nU3RhdGUsXG4gIHR5cGUgUmVzb3VyY2VQb2xsaW5nTGltaXRzLFxufSBmcm9tICcuL3J1bm5pbmctc2NoZWR1bGVyLXByZWRpY2F0ZXMnO1xuXG4vKiogTWFwcGluZyBvZiBFQzIgaW5zdGFuY2Ugc3RhdGUgdG8gZGlzcGxheSBuYW1lIGFuZCBlbW9qaSBmb3IgU2xhY2suICovXG5jb25zdCBTVEFURV9MSVNUID0gW1xuICB7IG5hbWU6ICdSVU5OSU5HJywgZW1vamk6ICfwn5iGJywgc3RhdGU6ICdydW5uaW5nJyB9LFxuICB7IG5hbWU6ICdTVE9QUEVEJywgZW1vamk6ICfwn5i0Jywgc3RhdGU6ICdzdG9wcGVkJyB9LFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBTZWNvbmRzIHRvIHdhaXQgYmV0d2VlbiBwb2xsaW5nIGluc3RhbmNlIHN0YXRlIGFmdGVyIHN0YXJ0L3N0b3Agb3Igd2hpbGUgdHJhbnNpdGlvbmluZy5cbiAqXG4gKiBVc2VkIHdpdGgge0BsaW5rIHByb2Nlc3NPbmVSZXNvdXJjZX0gZHVyYWJsZSBgd2FpdGAgY2FsbHMgYmV0d2VlbiBkZXNjcmliZSBpdGVyYXRpb25zLlxuICovXG5jb25zdCBTVEFUVVNfQ0hBTkdFX1dBSVRfU0VDT05EUyA9IDIwO1xuXG4vKipcbiAqIEV2ZW50IHBheWxvYWQgZnJvbSBFdmVudEJyaWRnZSBTY2hlZHVsZXIgaW52b2tpbmcgdGhpcyBMYW1iZGEuXG4gKlxuICogQHNlZSB7QGxpbmsgaGFuZGxlcn1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2hlZHVsZXJFdmVudCB7XG4gIC8qKiBTY2hlZHVsZXIgaW52b2NhdGlvbiBwYXJhbWV0ZXJzICh0YWcgZmlsdGVyIGFuZCBzdGFydC9zdG9wIG1vZGUpLiAqL1xuICBQYXJhbXM6IHtcbiAgICAvKiogVGFnIGtleSB1c2VkIHRvIHNlbGVjdCBFQzIgaW5zdGFuY2VzLiAqL1xuICAgIFRhZ0tleTogc3RyaW5nO1xuICAgIC8qKiBUYWcgdmFsdWVzIHRvIG1hdGNoLiAqL1xuICAgIFRhZ1ZhbHVlczogc3RyaW5nW107XG4gICAgLyoqIFdoZXRoZXIgdG8gc3RhcnQgb3Igc3RvcCBpbnN0YW5jZXMuICovXG4gICAgTW9kZTogJ1N0YXJ0JyB8ICdTdG9wJztcbiAgfTtcbn1cblxuLyoqIFNsYWNrIGNyZWRlbnRpYWxzIGFuZCBkZWZhdWx0IGNoYW5uZWwgbG9hZGVkIGZyb20gU2VjcmV0cyBNYW5hZ2VyIChgU0xBQ0tfU0VDUkVUX05BTUVgKS4gKi9cbmludGVyZmFjZSBTbGFja1NlY3JldCB7XG4gIC8qKiBTbGFjayBib3QgdG9rZW4gZm9yIHRoZSBTbGFjayBgV2ViQ2xpZW50YC4gKi9cbiAgdG9rZW46IHN0cmluZztcbiAgLyoqIENoYW5uZWwgSUQgb3IgbmFtZSBwYXNzZWQgdG8gYGNoYXQucG9zdE1lc3NhZ2VgLiAqL1xuICBjaGFubmVsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmV0dXJucyBkaXNwbGF5IG5hbWUgYW5kIGVtb2ppIGZvciBhbiBFQzIgaW5zdGFuY2Ugc3RhdGUuXG4gKlxuICogQHBhcmFtIGN1cnJlbnQgLSBDdXJyZW50IGluc3RhbmNlIHN0YXRlIChlLmcuICdydW5uaW5nJywgJ3N0b3BwZWQnKS5cbiAqIEByZXR1cm5zIERpc3BsYXkgaW5mbyBvciB1bmRlZmluZWQgaWYgc3RhdGUgaXMgbm90IGluIFNUQVRFX0xJU1QuXG4gKi9cbmNvbnN0IGdldFN0YXRlRGlzcGxheSA9IChjdXJyZW50OiBzdHJpbmcpOiB7IGVtb2ppOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9IHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgZm91bmQgPSBTVEFURV9MSVNULmZpbmQoKHMpID0+IHMuc3RhdGUgPT09IGN1cnJlbnQpO1xuICByZXR1cm4gZm91bmQgPyB7IGVtb2ppOiBmb3VuZC5lbW9qaSwgbmFtZTogZm91bmQubmFtZSB9IDogdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBQcm9jZXNzZXMgb25lIEVDMiBpbnN0YW5jZTogZGVzY3JpYmVzIHN0YXRlLCBpc3N1ZXMgc3RhcnQvc3RvcCB3aGVuIG5lZWRlZCwgdGhlbiBwb2xscyB1bnRpbFxuICoge0BsaW5rIGlzRGVzaXJlZFN0YWJsZVN0YXRlfSBpcyBzYXRpc2ZpZWQgKGR1cmFibGUgYHN0ZXBgIC8gYHdhaXRgIGJldHdlZW4gYXR0ZW1wdHMpLlxuICpcbiAqIEVhY2ggbG9vcCBpdGVyYXRpb24gY2hlY2tzIHtAbGluayBnZXRQb2xsaW5nQWJvcnRSZWFzb259IGJlZm9yZSBkZXNjcmliZS4gRmFpbHVyZXMgdXNlXG4gKiB7QGxpbmsgZm9ybWF0UmVzb3VyY2VQb2xsaW5nRmFpbHVyZX0gKGBSZXNvdXJjZVBvbGxpbmdGYWlsZWQ6KmAgbWVzc2FnZSBwcmVmaXgpLlxuICpcbiAqIEBwYXJhbSBjdHggLSBEdXJhYmxlIGV4ZWN1dGlvbiBjb250ZXh0IChjaGlsZCBjb250ZXh0IHBlciBpbnN0YW5jZSByZWNvbW1lbmRlZCkuXG4gKiBAcGFyYW0gdGFyZ2V0UmVzb3VyY2UgLSBFQzIgaW5zdGFuY2UgQVJOLlxuICogQHBhcmFtIHBhcmFtcyAtIFNjaGVkdWxlciBwYXJhbXMgKGBUYWdLZXlgLCBgVGFnVmFsdWVzYCwgYE1vZGVgKS5cbiAqIEBwYXJhbSByZXNvdXJjZUluZGV4IC0gSW5kZXggdXNlZCBpbiBkdXJhYmxlIHN0ZXAgbmFtZXMgZm9yIHRoaXMgcmVzb3VyY2UuXG4gKiBAcGFyYW0gcG9sbGluZ0xpbWl0cyAtIFBlci1pbnN0YW5jZSBjYXBzIGZyb20ge0BsaW5rIHBhcnNlUmVzb3VyY2VQb2xsaW5nTGltaXRzRnJvbUVudn0gKHNldCBieSB0aGUgQ0RLIGNvbnN0cnVjdCkuXG4gKiBAcmV0dXJucyBGaW5hbCByZXNvdXJjZSBBUk4sIEVDMiBzdGF0ZSBuYW1lLCBwYXJzZWQgYWNjb3VudCwgcmVnaW9uLCBhbmQgaW5zdGFuY2UgaWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBwb2xsaW5nIGxpbWl0cyBhcmUgZXhjZWVkZWQgKGBNYXhMb29wQ291bnRFeGNlZWRlZGAsIGBNYXhFbGFwc2VkVGltZUV4Y2VlZGVkYCksXG4gKiAgIHRoZSBpbnN0YW5jZSBpcyBpbiBhbiB1bmV4cGVjdGVkIHN0YXRlIChgVW5leHBlY3RlZEluc3RhbmNlU3RhdGVgKSwgb3IgdGhlIGxvb3AgZXhpdHMgd2l0aG91dCBhIHN0YWJsZSBnb2FsIHN0YXRlLlxuICovXG5jb25zdCBwcm9jZXNzT25lUmVzb3VyY2UgPSBhc3luYyAoXG4gIGN0eDogRHVyYWJsZUNvbnRleHQsXG4gIHRhcmdldFJlc291cmNlOiBzdHJpbmcsXG4gIHBhcmFtczogU2NoZWR1bGVyRXZlbnRbJ1BhcmFtcyddLFxuICByZXNvdXJjZUluZGV4OiBudW1iZXIsXG4gIHBvbGxpbmdMaW1pdHM6IFJlc291cmNlUG9sbGluZ0xpbWl0cyxcbik6IFByb21pc2U8eyByZXNvdXJjZTogc3RyaW5nOyBzdGF0dXM6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nOyByZWdpb246IHN0cmluZzsgaWRlbnRpZmllcjogc3RyaW5nIH0+ID0+IHtcbiAgY29uc3QgcGFydHMgPSB0YXJnZXRSZXNvdXJjZS5zcGxpdCgnLycpO1xuICBjb25zdCBpZGVudGlmaWVyID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV0gPz8gJ3Vua25vd24nO1xuICBjb25zdCBhcm5QYXJ0cyA9IHRhcmdldFJlc291cmNlLnNwbGl0KCc6Jyk7XG4gIGNvbnN0IGFjY291bnQgPSBhcm5QYXJ0c1s0XSA/PyAnJztcbiAgY29uc3QgcmVnaW9uID0gYXJuUGFydHNbM10gPz8gJyc7XG4gIGNvbnN0IHN0ZXBQcmVmaXggPSBgcmVzb3VyY2UtJHtyZXNvdXJjZUluZGV4fS0ke2lkZW50aWZpZXJ9YDtcblxuICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogc3RhcnQnLCB7XG4gICAgcmVzb3VyY2VJbmRleCxcbiAgICBpZGVudGlmaWVyLFxuICAgIHJlZ2lvbixcbiAgICBhY2NvdW50LFxuICAgIG1vZGU6IHBhcmFtcy5Nb2RlLFxuICAgIG1heExvb3BDb3VudDogcG9sbGluZ0xpbWl0cy5tYXhMb29wQ291bnQsXG4gICAgbWF4RWxhcHNlZFNlY29uZHM6IHBvbGxpbmdMaW1pdHMubWF4RWxhcHNlZFNlY29uZHMsXG4gIH0pO1xuXG4gIGNvbnN0IHN0YXJ0ZWRBdE1zID0gYXdhaXQgY3R4LnN0ZXAoYCR7c3RlcFByZWZpeH0tcG9sbGluZy1zdGFydGVkLWF0YCwgYXN5bmMgKCkgPT4gRGF0ZS5ub3coKSk7XG5cbiAgbGV0IGxvb3BDb3VudCA9IDA7XG4gIGxldCBjdXJyZW50U3RhdGUgPSAnJztcbiAgZG8ge1xuICAgIGNvbnN0IGFib3J0UmVhc29uID0gYXdhaXQgY3R4LnN0ZXAoYCR7c3RlcFByZWZpeH0tcG9sbC1saW1pdC1jaGVjay0ke2xvb3BDb3VudH1gLCBhc3luYyAoKSA9PlxuICAgICAgZ2V0UG9sbGluZ0Fib3J0UmVhc29uKGxvb3BDb3VudCwgc3RhcnRlZEF0TXMsIERhdGUubm93KCksIHBvbGxpbmdMaW1pdHMpLFxuICAgICk7XG4gICAgaWYgKGFib3J0UmVhc29uKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZm9ybWF0UmVzb3VyY2VQb2xsaW5nRmFpbHVyZShhYm9ydFJlYXNvbiwge1xuICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICBtb2RlOiBwYXJhbXMuTW9kZSxcbiAgICAgICAgY3VycmVudFN0YXRlOiBjdXJyZW50U3RhdGUgfHwgJ3Vua25vd24nLFxuICAgICAgICBsb29wQ291bnQsXG4gICAgICAgIGxpbWl0czogcG9sbGluZ0xpbWl0cyxcbiAgICAgIH0pO1xuICAgICAgY3R4LmxvZ2dlci5lcnJvcigncHJvY2Vzc09uZVJlc291cmNlOiBwb2xsaW5nIGxpbWl0IGV4Y2VlZGVkJywge1xuICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICBhYm9ydFJlYXNvbixcbiAgICAgICAgbG9vcENvdW50LFxuICAgICAgICBjdXJyZW50U3RhdGUsXG4gICAgICAgIG1heExvb3BDb3VudDogcG9sbGluZ0xpbWl0cy5tYXhMb29wQ291bnQsXG4gICAgICAgIG1heEVsYXBzZWRTZWNvbmRzOiBwb2xsaW5nTGltaXRzLm1heEVsYXBzZWRTZWNvbmRzLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgY3VycmVudFN0YXRlID0gYXdhaXQgY3R4LnN0ZXAoYCR7c3RlcFByZWZpeH0tZGVzY3JpYmUtJHtsb29wQ291bnR9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZWMyID0gbmV3IEVDMkNsaWVudCh7fSk7XG4gICAgICBjb25zdCBvdXQgPSBhd2FpdCBlYzIuc2VuZChuZXcgRGVzY3JpYmVJbnN0YW5jZXNDb21tYW5kKHsgSW5zdGFuY2VJZHM6IFtpZGVudGlmaWVyXSB9KSk7XG4gICAgICByZXR1cm4gb3V0LlJlc2VydmF0aW9ucz8uWzBdPy5JbnN0YW5jZXM/LlswXT8uU3RhdGU/Lk5hbWUgPz8gJ3Vua25vd24nO1xuICAgIH0pO1xuXG4gICAgY3R4LmxvZ2dlci5pbmZvKCdwcm9jZXNzT25lUmVzb3VyY2U6IGRlc2NyaWJlZCcsIHtcbiAgICAgIGlkZW50aWZpZXIsXG4gICAgICBsb29wQ291bnQsXG4gICAgICBjdXJyZW50U3RhdGUsXG4gICAgICBtb2RlOiBwYXJhbXMuTW9kZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1vZGUgPSBwYXJhbXMuTW9kZTtcblxuICAgIGlmIChtb2RlID09PSAnU3RhcnQnICYmIGN1cnJlbnRTdGF0ZSA9PT0gJ3N0b3BwZWQnKSB7XG4gICAgICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogc3RhcnRpbmcgaW5zdGFuY2UnLCB7IGlkZW50aWZpZXIsIGxvb3BDb3VudCB9KTtcbiAgICAgIGF3YWl0IGN0eC5zdGVwKGAke3N0ZXBQcmVmaXh9LXN0YXJ0LSR7bG9vcENvdW50fWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZWMyID0gbmV3IEVDMkNsaWVudCh7fSk7XG4gICAgICAgIGF3YWl0IGVjMi5zZW5kKG5ldyBTdGFydEluc3RhbmNlc0NvbW1hbmQoeyBJbnN0YW5jZUlkczogW2lkZW50aWZpZXJdIH0pKTtcbiAgICAgIH0pO1xuICAgICAgY3R4LmxvZ2dlci5pbmZvKCdwcm9jZXNzT25lUmVzb3VyY2U6IHdhaXQgYWZ0ZXIgc3RhcnQnLCB7XG4gICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgIHNlY29uZHM6IFNUQVRVU19DSEFOR0VfV0FJVF9TRUNPTkRTLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBjdHgud2FpdCh7IHNlY29uZHM6IFNUQVRVU19DSEFOR0VfV0FJVF9TRUNPTkRTIH0pO1xuICAgICAgbG9vcENvdW50ICs9IDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobW9kZSA9PT0gJ1N0b3AnICYmIGN1cnJlbnRTdGF0ZSA9PT0gJ3J1bm5pbmcnKSB7XG4gICAgICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogc3RvcHBpbmcgaW5zdGFuY2UnLCB7IGlkZW50aWZpZXIsIGxvb3BDb3VudCB9KTtcbiAgICAgIGF3YWl0IGN0eC5zdGVwKGAke3N0ZXBQcmVmaXh9LXN0b3AtJHtsb29wQ291bnR9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBlYzIgPSBuZXcgRUMyQ2xpZW50KHt9KTtcbiAgICAgICAgYXdhaXQgZWMyLnNlbmQobmV3IFN0b3BJbnN0YW5jZXNDb21tYW5kKHsgSW5zdGFuY2VJZHM6IFtpZGVudGlmaWVyXSB9KSk7XG4gICAgICB9KTtcbiAgICAgIGN0eC5sb2dnZXIuaW5mbygncHJvY2Vzc09uZVJlc291cmNlOiB3YWl0IGFmdGVyIHN0b3AnLCB7XG4gICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgIHNlY29uZHM6IFNUQVRVU19DSEFOR0VfV0FJVF9TRUNPTkRTLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBjdHgud2FpdCh7IHNlY29uZHM6IFNUQVRVU19DSEFOR0VfV0FJVF9TRUNPTkRTIH0pO1xuICAgICAgbG9vcENvdW50ICs9IDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzRGVzaXJlZFN0YWJsZVN0YXRlKG1vZGUsIGN1cnJlbnRTdGF0ZSkpIHtcbiAgICAgIGlmIChpc1RyYW5zaXRpb25pbmdTdGF0ZShtb2RlLCBjdXJyZW50U3RhdGUpKSB7XG4gICAgICAgIGN0eC5sb2dnZXIuaW5mbygncHJvY2Vzc09uZVJlc291cmNlOiB3YWl0IHdoaWxlIHRyYW5zaXRpb25pbmcnLCB7XG4gICAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgICBsb29wQ291bnQsXG4gICAgICAgICAgY3VycmVudFN0YXRlLFxuICAgICAgICAgIG1vZGUsXG4gICAgICAgICAgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMsXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBjdHgud2FpdCh7IHNlY29uZHM6IFNUQVRVU19DSEFOR0VfV0FJVF9TRUNPTkRTIH0pO1xuICAgICAgICBsb29wQ291bnQgKz0gMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBmb3JtYXRSZXNvdXJjZVBvbGxpbmdGYWlsdXJlKCdVbmV4cGVjdGVkSW5zdGFuY2VTdGF0ZScsIHtcbiAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgbW9kZSxcbiAgICAgICAgY3VycmVudFN0YXRlLFxuICAgICAgICBsb29wQ291bnQsXG4gICAgICAgIGxpbWl0czogcG9sbGluZ0xpbWl0cyxcbiAgICAgIH0pO1xuICAgICAgY3R4LmxvZ2dlci5lcnJvcigncHJvY2Vzc09uZVJlc291cmNlOiB1bmV4cGVjdGVkIHN0YXRlJywge1xuICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICBtb2RlLFxuICAgICAgICBjdXJyZW50U3RhdGUsXG4gICAgICAgIGxvb3BDb3VudCxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgfSB3aGlsZSAoIWlzRGVzaXJlZFN0YWJsZVN0YXRlKHBhcmFtcy5Nb2RlLCBjdXJyZW50U3RhdGUpKTtcblxuICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogcmVhY2hlZCBkZXNpcmVkIHN0YWJsZSBzdGF0ZScsIHtcbiAgICBpZGVudGlmaWVyLFxuICAgIGZpbmFsU3RhdGU6IGN1cnJlbnRTdGF0ZSxcbiAgICBtb2RlOiBwYXJhbXMuTW9kZSxcbiAgICBsb29wQ291bnQsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgaWRlbnRpZmllcixcbiAgICBhY2NvdW50LFxuICAgIHJlZ2lvbixcbiAgICByZXNvdXJjZTogdGFyZ2V0UmVzb3VyY2UsXG4gICAgc3RhdHVzOiBjdXJyZW50U3RhdGUsXG4gIH07XG59O1xuXG4vKipcbiAqIER1cmFibGUgTGFtYmRhIGVudHJ5IHBvaW50IGZvciB0aGUgRUMyIHJ1bm5pbmcgc2NoZWR1bGVyLlxuICpcbiAqIFJlc29sdmVzIGluc3RhbmNlcyB2aWEgUmVzb3VyY2UgR3JvdXBzIFRhZ2dpbmcgQVBJLCBydW5zIHtAbGluayBwcm9jZXNzT25lUmVzb3VyY2V9IGZvciBlYWNoIEFSTlxuICogaW4gcGFyYWxsZWwgKGJvdW5kZWQgY29uY3VycmVuY3kpLCBwb3N0cyBhIHBhcmVudCBTbGFjayBtZXNzYWdlIGFuZCBwZXItaW5zdGFuY2UgdGhyZWFkIHJlcGxpZXMsXG4gKiBhbmQgdXNlcyBkdXJhYmxlIGBzdGVwYCAvIGB3YWl0YCAvIGBtYXBgIHNvIHRoZSBydW4gY2FuIHJlc3VtZSBhY3Jvc3Mgc3VzcGVuc2lvbnMuXG4gKlxuICogUmVhZHMgcGVyLWluc3RhbmNlIHBvbGxpbmcgbGltaXRzIGZyb20gYFBST0NFU1NfUkVTT1VSQ0VfTUFYX0xPT1BfQ09VTlRgIGFuZFxuICogYFBST0NFU1NfUkVTT1VSQ0VfTUFYX0VMQVBTRURfU0VDT05EU2AgdmlhIHtAbGluayBwYXJzZVJlc291cmNlUG9sbGluZ0xpbWl0c0Zyb21FbnZ9LlxuICpcbiAqIEBwYXJhbSBldmVudCAtIFBheWxvYWQgZnJvbSBFdmVudEJyaWRnZSBTY2hlZHVsZXI7IG11c3QgaW5jbHVkZSBgUGFyYW1zLlRhZ0tleWAsIGBQYXJhbXMuVGFnVmFsdWVzYCwgYFBhcmFtcy5Nb2RlYC5cbiAqIEBwYXJhbSBjdHggLSBSb290IGR1cmFibGUgZXhlY3V0aW9uIGNvbnRleHQuXG4gKiBAcmV0dXJuc1xuICogLSBgeyBzdGF0dXM6ICdUYXJnZXRSZXNvdXJjZXNOb3RGb3VuZCcgfWAgd2hlbiBubyBpbnN0YW5jZXMgbWF0Y2ggdGhlIHRhZyBmaWx0ZXIuXG4gKiAtIGB7IHN0YXR1czogJ0NvbXBsZXRlZCcsIHByb2Nlc3NlZCwgcmVzdWx0cyB9YCB3aGVuIGluc3RhbmNlcyB3ZXJlIGhhbmRsZWQgKGByZXN1bHRzYCBlbnRyaWVzIG1hdGNoIHtAbGluayBwcm9jZXNzT25lUmVzb3VyY2V9IHJldHVybiBzaGFwZSkuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYFBhcmFtc2AgaXMgaW52YWxpZCwgcG9sbGluZyBlbnYgdmFycyBhcmUgaW52YWxpZCwgYFNMQUNLX1NFQ1JFVF9OQU1FYCBpcyB1bnNldCxcbiAqICAgdGhlIFNsYWNrIHNlY3JldCBpcyBpbmNvbXBsZXRlLCBvciBpbnN0YW5jZSBwcm9jZXNzaW5nIGZhaWxzIChpbmNsdWRpbmcgYFJlc291cmNlUG9sbGluZ0ZhaWxlZDoqYCBlcnJvcnMpLlxuICovXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IHdpdGhEdXJhYmxlRXhlY3V0aW9uKGFzeW5jIChldmVudDogU2NoZWR1bGVyRXZlbnQsIGN0eDogRHVyYWJsZUNvbnRleHQpID0+IHtcblxuICBjb25zdCBwYXJhbXMgPSBldmVudC5QYXJhbXM7XG5cbiAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogaW52b2NhdGlvbicsIHtcbiAgICBtb2RlOiBwYXJhbXM/Lk1vZGUsXG4gICAgdGFnS2V5OiBwYXJhbXM/LlRhZ0tleSxcbiAgICB0YWdWYWx1ZUNvdW50OiBwYXJhbXM/LlRhZ1ZhbHVlcz8ubGVuZ3RoID8/IDAsXG4gIH0pO1xuXG4gIGlmICghcGFyYW1zPy5UYWdLZXkgfHwgIXBhcmFtcz8uVGFnVmFsdWVzIHx8ICFwYXJhbXM/Lk1vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZXZlbnQ6IFBhcmFtcy5UYWdLZXksIFBhcmFtcy5UYWdWYWx1ZXMsIFBhcmFtcy5Nb2RlIGFyZSByZXF1aXJlZC4nKTtcbiAgfVxuXG4gIGNvbnN0IHBvbGxpbmdMaW1pdHMgPSBwYXJzZVJlc291cmNlUG9sbGluZ0xpbWl0c0Zyb21FbnYoKTtcblxuICAvLyBzYWZlIGdldCBTZWNyZXRzIG5hbWUgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZVxuICBjb25zdCBzbGFja1NlY3JldE5hbWUgPSBTYWZlRW52R2V0dGVyLmdldEVudignU0xBQ0tfU0VDUkVUX05BTUUnKTtcblxuICBjb25zdCBzbGFja1NlY3JldFZhbHVlID0gYXdhaXQgY3R4LnN0ZXAoJ2ZldGNoLXNsYWNrLXNlY3JldCcsIGFzeW5jICgpID0+IHtcbiAgICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBmZXRjaGluZyBTbGFjayBzZWNyZXQnLCB7IHNlY3JldE5hbWU6IHNsYWNrU2VjcmV0TmFtZSB9KTtcbiAgICByZXR1cm4gc2VjcmV0RmV0Y2hlci5nZXRTZWNyZXRWYWx1ZTxTbGFja1NlY3JldD4oc2xhY2tTZWNyZXROYW1lKTtcbiAgfSk7XG5cbiAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogU2xhY2sgc2VjcmV0IGxvYWRlZCcpO1xuXG4gIGlmICghc2xhY2tTZWNyZXRWYWx1ZT8udG9rZW4gfHwgIXNsYWNrU2VjcmV0VmFsdWU/LmNoYW5uZWwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NsYWNrIHNlY3JldCBtdXN0IGNvbnRhaW4gdG9rZW4gYW5kIGNoYW5uZWwuJyk7XG4gIH1cblxuICBjb25zdCB0YXJnZXRSZXNvdXJjZXMgPSBhd2FpdCBjdHguc3RlcCgnZ2V0LXRhcmdldC1yZXNvdXJjZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IFJlc291cmNlR3JvdXBzVGFnZ2luZ0FQSUNsaWVudCh7fSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnNlbmQoXG4gICAgICBuZXcgR2V0UmVzb3VyY2VzQ29tbWFuZCh7XG4gICAgICAgIFJlc291cmNlVHlwZUZpbHRlcnM6IFsnZWMyOmluc3RhbmNlJ10sXG4gICAgICAgIFRhZ0ZpbHRlcnM6IFt7IEtleTogcGFyYW1zLlRhZ0tleSwgVmFsdWVzOiBwYXJhbXMuVGFnVmFsdWVzIH1dLFxuICAgICAgfSksXG4gICAgKTtcbiAgICBjb25zdCBhcm5zID0gKHJlc3VsdC5SZXNvdXJjZVRhZ01hcHBpbmdMaXN0ID8/IFtdKVxuICAgICAgLm1hcCgobTogeyBSZXNvdXJjZUFSTj86IHN0cmluZyB9KSA9PiBtLlJlc291cmNlQVJOKVxuICAgICAgLmZpbHRlcigoYXJuOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBhcm4gaXMgc3RyaW5nID0+IGFybiAhPSBudWxsKTtcbiAgICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBnZXQtdGFyZ2V0LXJlc291cmNlcyBkb25lJywgeyBjb3VudDogYXJucy5sZW5ndGggfSk7XG4gICAgcmV0dXJuIGFybnM7XG4gIH0pO1xuXG4gIGlmICh0YXJnZXRSZXNvdXJjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogbm8gbWF0Y2hpbmcgaW5zdGFuY2VzJywgeyB0YWdLZXk6IHBhcmFtcy5UYWdLZXkgfSk7XG4gICAgcmV0dXJuIHsgc3RhdHVzOiAnVGFyZ2V0UmVzb3VyY2VzTm90Rm91bmQnIGFzIGNvbnN0IH07XG4gIH1cblxuICBjb25zdCBjbGllbnQgPSBuZXcgV2ViQ2xpZW50KHNsYWNrU2VjcmV0VmFsdWUudG9rZW4pO1xuICBjb25zdCBjaGFubmVsID0gc2xhY2tTZWNyZXRWYWx1ZS5jaGFubmVsO1xuXG4gIGN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IHBvc3RpbmcgcGFyZW50IFNsYWNrIG1lc3NhZ2UnLCB7XG4gICAgaW5zdGFuY2VDb3VudDogdGFyZ2V0UmVzb3VyY2VzLmxlbmd0aCxcbiAgfSk7XG5cbiAgLy8gc2VuZCBzbGFjayBtZXNzYWdlXG4gIGNvbnN0IHNsYWNrUGFyZW50TWVzc2FnZVJlc3VsdCA9IGF3YWl0IGN0eC5zdGVwKCdwb3N0LXNsYWNrLW1lc3NhZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIHJldHVybiBjbGllbnQuY2hhdC5wb3N0TWVzc2FnZSh7XG4gICAgICBjaGFubmVsLFxuICAgICAgdGV4dDogYCR7cGFyYW1zLk1vZGUgPT09ICdTdGFydCcgPyAn8J+YhiBTdGFydHMnIDogJ/CfpbEgU3RvcHMnfSB0aGUgc2NoZWR1bGVkIEVDMiBJbnN0YW5jZS5gLFxuICAgIH0pO1xuICB9KTtcblxuICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBwYXJlbnQgU2xhY2sgbWVzc2FnZSBwb3N0ZWQnLCB7XG4gICAgdGhyZWFkVHM6IHNsYWNrUGFyZW50TWVzc2FnZVJlc3VsdD8udHMgPz8gbnVsbCxcbiAgfSk7XG5cbiAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogc3RhcnRpbmcgcGFyYWxsZWwgaW5zdGFuY2UgcHJvY2Vzc2luZycsIHtcbiAgICBjb3VudDogdGFyZ2V0UmVzb3VyY2VzLmxlbmd0aCxcbiAgICBtYXhDb25jdXJyZW5jeTogMTAsXG4gIH0pO1xuXG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBjdHgubWFwKFxuICAgIHRhcmdldFJlc291cmNlcyxcbiAgICAvLyBhc3luYyAoY3R4OiBEdXJhYmxlQ29udGV4dCwgdGFyZ2V0UmVzb3VyY2U6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT5cbiAgICAvLyAgIGN0eC5zdGVwKGBwcm9jZXNzLXJlc291cmNlLSR7aW5kZXh9YCwgYXN5bmMgKCkgPT5cbiAgICAvLyAgICAgcHJvY2Vzc09uZVJlc291cmNlKGN0eCwgdGFyZ2V0UmVzb3VyY2UsIHBhcmFtcywgaW5kZXgpLFxuICAgIC8vICAgKSxcbiAgICBhc3luYyAobWFwQ3R4OiBEdXJhYmxlQ29udGV4dCwgdGFyZ2V0UmVzb3VyY2U6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgcmV0dXJuIG1hcEN0eC5ydW5JbkNoaWxkQ29udGV4dChgcmVzb3VyY2UtJHtpbmRleH1gLCBhc3luYyAoY2hpbGRDdHg6IER1cmFibGVDb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb2Nlc3NPbmVSZXNvdXJjZShjaGlsZEN0eCwgdGFyZ2V0UmVzb3VyY2UsIHBhcmFtcywgaW5kZXgsIHBvbGxpbmdMaW1pdHMpO1xuICAgICAgICAvLyBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ3NraXBwZWQnKSB7XG4gICAgICAgIC8vICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgLy8gfVxuICAgICAgICBjaGlsZEN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IHBvc3RpbmcgdGhyZWFkIFNsYWNrIG1lc3NhZ2UnLCB7XG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgaWRlbnRpZmllcjogcmVzdWx0LmlkZW50aWZpZXIsXG4gICAgICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gc2VuZCBzbGFjayB0aHJlYWQgbWVzc2FnZVxuICAgICAgICBhd2FpdCBjaGlsZEN0eC5zdGVwKCdwb3N0LXNsYWNrLWNoaWxkLW1lc3NhZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRpc3BsYXkgPSBnZXRTdGF0ZURpc3BsYXkocmVzdWx0LnN0YXR1cyk7XG5cbiAgICAgICAgICByZXR1cm4gY2xpZW50LmNoYXQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgIHRocmVhZF90czogc2xhY2tQYXJlbnRNZXNzYWdlUmVzdWx0Py50cyxcbiAgICAgICAgICAgIGF0dGFjaG1lbnRzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb2xvcjogJyMzNmE2NGYnLFxuICAgICAgICAgICAgICAgIHByZXRleHQ6IGAke2Rpc3BsYXk/LmVtb2ppfSBUaGUgc3RhdHVzIG9mIHRoZSBFQzIgSW5zdGFuY2UgJHtyZXN1bHQuaWRlbnRpZmllcn0gY2hhbmdlZCB0byAke2Rpc3BsYXk/Lm5hbWV9IGR1ZSB0byB0aGUgc2NoZWR1bGUuYCxcbiAgICAgICAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgICAgICAgIHsgdGl0bGU6ICdBY2NvdW50JywgdmFsdWU6IHJlc3VsdC5hY2NvdW50LCBzaG9ydDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgICAgeyB0aXRsZTogJ1JlZ2lvbicsIHZhbHVlOiByZXN1bHQucmVnaW9uLCBzaG9ydDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgICAgeyB0aXRsZTogJ0lkZW50aWZpZXInLCB2YWx1ZTogcmVzdWx0LmlkZW50aWZpZXIsIHNob3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgICB7IHRpdGxlOiAnU3RhdHVzJywgdmFsdWU6IChkaXNwbGF5Py5uYW1lID8/ICdVbmtub3duJyksIHNob3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG4gICAgfSxcbiAgICB7IG1heENvbmN1cnJlbmN5OiAxMCB9LFxuICApO1xuXG4gIGNvbnN0IHJlc3VsdExpc3QgPSBBcnJheS5pc0FycmF5KHJlc3VsdHMpID8gcmVzdWx0cyA6IFtdO1xuICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBjb21wbGV0ZWQnLCB7XG4gICAgcHJvY2Vzc2VkOiB0YXJnZXRSZXNvdXJjZXMubGVuZ3RoLFxuICAgIHJlc3VsdENvdW50OiByZXN1bHRMaXN0Lmxlbmd0aCxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgc3RhdHVzOiAnQ29tcGxldGVkJyBhcyBjb25zdCxcbiAgICBwcm9jZXNzZWQ6IHRhcmdldFJlc291cmNlcy5sZW5ndGgsXG4gICAgcmVzdWx0czogcmVzdWx0TGlzdCxcbiAgfTtcbn0pO1xuIl19
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Public API
|
|
2
|
+
* Public API for the EC2 instance running scheduler CDK library.
|
|
3
|
+
*
|
|
4
|
+
* Exports {@link EC2InstanceRunningScheduler}, {@link EC2InstanceRunningScheduleStack}, and related prop types.
|
|
3
5
|
*/
|
|
4
6
|
export * from './constructs/ec2-instance-running-scheduler';
|
|
5
7
|
export * from './stacks/ec2-instance-running-schedule-stack';
|
package/lib/index.js
CHANGED
|
@@ -15,8 +15,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
/**
|
|
18
|
-
* Public API
|
|
18
|
+
* Public API for the EC2 instance running scheduler CDK library.
|
|
19
|
+
*
|
|
20
|
+
* Exports {@link EC2InstanceRunningScheduler}, {@link EC2InstanceRunningScheduleStack}, and related prop types.
|
|
19
21
|
*/
|
|
20
22
|
__exportStar(require("./constructs/ec2-instance-running-scheduler"), exports);
|
|
21
23
|
__exportStar(require("./stacks/ec2-instance-running-schedule-stack"), exports);
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0dBSUc7QUFDSCw4RUFBNEQ7QUFDNUQsK0VBQTZEIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQdWJsaWMgQVBJIGZvciB0aGUgRUMyIGluc3RhbmNlIHJ1bm5pbmcgc2NoZWR1bGVyIENESyBsaWJyYXJ5LlxuICpcbiAqIEV4cG9ydHMge0BsaW5rIEVDMkluc3RhbmNlUnVubmluZ1NjaGVkdWxlcn0sIHtAbGluayBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZVN0YWNrfSwgYW5kIHJlbGF0ZWQgcHJvcCB0eXBlcy5cbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9jb25zdHJ1Y3RzL2VjMi1pbnN0YW5jZS1ydW5uaW5nLXNjaGVkdWxlcic7XG5leHBvcnQgKiBmcm9tICcuL3N0YWNrcy9lYzItaW5zdGFuY2UtcnVubmluZy1zY2hlZHVsZS1zdGFjayc7Il19
|
|
@@ -3,6 +3,8 @@ import { Construct } from 'constructs';
|
|
|
3
3
|
import { TargetResource, Secrets, Schedule } from '../constructs/ec2-instance-running-scheduler';
|
|
4
4
|
/**
|
|
5
5
|
* Props for the EC2 instance running schedule CDK stack.
|
|
6
|
+
*
|
|
7
|
+
* @see {@link EC2InstanceRunningSchedulerProps} for construct-level options not exposed here (e.g. `resourcePolling`).
|
|
6
8
|
*/
|
|
7
9
|
export interface EC2InstanceRunningScheduleStackProps extends StackProps {
|
|
8
10
|
/** Tag-based target resource for EC2 instances to start/stop. */
|
|
@@ -17,15 +19,15 @@ export interface EC2InstanceRunningScheduleStackProps extends StackProps {
|
|
|
17
19
|
readonly startSchedule?: Schedule;
|
|
18
20
|
}
|
|
19
21
|
/**
|
|
20
|
-
* CDK
|
|
22
|
+
* CDK stack that deploys the EC2 instance running scheduler (EventBridge Scheduler + Durable Lambda).
|
|
21
23
|
*/
|
|
22
24
|
export declare class EC2InstanceRunningScheduleStack extends Stack {
|
|
23
25
|
/**
|
|
24
|
-
* Creates the stack and
|
|
26
|
+
* Creates the stack and wires {@link EC2InstanceRunningScheduler}.
|
|
25
27
|
*
|
|
26
|
-
* @param scope - Parent construct.
|
|
28
|
+
* @param scope - Parent construct or app.
|
|
27
29
|
* @param id - Stack id.
|
|
28
|
-
* @param props -
|
|
30
|
+
* @param props - Target resource, schedules, secrets, and standard stack props.
|
|
29
31
|
*/
|
|
30
32
|
constructor(scope: Construct, id: string, props: EC2InstanceRunningScheduleStackProps);
|
|
31
33
|
}
|
|
@@ -6,15 +6,15 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
|
6
6
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
7
7
|
const ec2_instance_running_scheduler_1 = require("../constructs/ec2-instance-running-scheduler");
|
|
8
8
|
/**
|
|
9
|
-
* CDK
|
|
9
|
+
* CDK stack that deploys the EC2 instance running scheduler (EventBridge Scheduler + Durable Lambda).
|
|
10
10
|
*/
|
|
11
11
|
class EC2InstanceRunningScheduleStack extends aws_cdk_lib_1.Stack {
|
|
12
12
|
/**
|
|
13
|
-
* Creates the stack and
|
|
13
|
+
* Creates the stack and wires {@link EC2InstanceRunningScheduler}.
|
|
14
14
|
*
|
|
15
|
-
* @param scope - Parent construct.
|
|
15
|
+
* @param scope - Parent construct or app.
|
|
16
16
|
* @param id - Stack id.
|
|
17
|
-
* @param props -
|
|
17
|
+
* @param props - Target resource, schedules, secrets, and standard stack props.
|
|
18
18
|
*/
|
|
19
19
|
constructor(scope, id, props) {
|
|
20
20
|
super(scope, id, props);
|
|
@@ -29,5 +29,5 @@ class EC2InstanceRunningScheduleStack extends aws_cdk_lib_1.Stack {
|
|
|
29
29
|
}
|
|
30
30
|
exports.EC2InstanceRunningScheduleStack = EC2InstanceRunningScheduleStack;
|
|
31
31
|
_a = JSII_RTTI_SYMBOL_1;
|
|
32
|
-
EC2InstanceRunningScheduleStack[_a] = { fqn: "ec2-instance-running-scheduler.EC2InstanceRunningScheduleStack", version: "0.
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
EC2InstanceRunningScheduleStack[_a] = { fqn: "ec2-instance-running-scheduler.EC2InstanceRunningScheduleStack", version: "0.2.0" };
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWMyLWluc3RhbmNlLXJ1bm5pbmctc2NoZWR1bGUtc3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RhY2tzL2VjMi1pbnN0YW5jZS1ydW5uaW5nLXNjaGVkdWxlLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQWdEO0FBRWhELGlHQUE4SDtBQW9COUg7O0dBRUc7QUFDSCxNQUFhLCtCQUFnQyxTQUFRLG1CQUFLO0lBQ3hEOzs7Ozs7T0FNRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMkM7UUFDbkYsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsSUFBSSw0REFBMkIsQ0FBQyxJQUFJLEVBQUUsNkJBQTZCLEVBQUU7WUFDbkUsY0FBYyxFQUFFLEtBQUssQ0FBQyxjQUFjO1lBQ3BDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7WUFDeEMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtZQUNoQyxhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWE7U0FDbkMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFsQkgsMEVBbUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2ssIFN0YWNrUHJvcHMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEVDMkluc3RhbmNlUnVubmluZ1NjaGVkdWxlciwgVGFyZ2V0UmVzb3VyY2UsIFNlY3JldHMsIFNjaGVkdWxlIH0gZnJvbSAnLi4vY29uc3RydWN0cy9lYzItaW5zdGFuY2UtcnVubmluZy1zY2hlZHVsZXInO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgRUMyIGluc3RhbmNlIHJ1bm5pbmcgc2NoZWR1bGUgQ0RLIHN0YWNrLlxuICpcbiAqIEBzZWUge0BsaW5rIEVDMkluc3RhbmNlUnVubmluZ1NjaGVkdWxlclByb3BzfSBmb3IgY29uc3RydWN0LWxldmVsIG9wdGlvbnMgbm90IGV4cG9zZWQgaGVyZSAoZS5nLiBgcmVzb3VyY2VQb2xsaW5nYCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVTdGFja1Byb3BzIGV4dGVuZHMgU3RhY2tQcm9wcyB7XG4gIC8qKiBUYWctYmFzZWQgdGFyZ2V0IHJlc291cmNlIGZvciBFQzIgaW5zdGFuY2VzIHRvIHN0YXJ0L3N0b3AuICovXG4gIHJlYWRvbmx5IHRhcmdldFJlc291cmNlOiBUYXJnZXRSZXNvdXJjZTtcbiAgLyoqIFdoZXRoZXIgc2NoZWR1bGluZyBpcyBlbmFibGVkLiBEZWZhdWx0cyB0byB0cnVlIGlmIG9taXR0ZWQuICovXG4gIHJlYWRvbmx5IGVuYWJsZVNjaGVkdWxpbmc/OiBib29sZWFuO1xuICAvKiogU2VjcmV0cyAoZS5nLiBTbGFjaykgZm9yIHRoZSBzY2hlZHVsZXIuICovXG4gIHJlYWRvbmx5IHNlY3JldHM6IFNlY3JldHM7XG4gIC8qKiBDcm9uIHNjaGVkdWxlIGZvciBzdG9wcGluZyBpbnN0YW5jZXMuICovXG4gIHJlYWRvbmx5IHN0b3BTY2hlZHVsZT86IFNjaGVkdWxlO1xuICAvKiogQ3JvbiBzY2hlZHVsZSBmb3Igc3RhcnRpbmcgaW5zdGFuY2VzLiAqL1xuICByZWFkb25seSBzdGFydFNjaGVkdWxlPzogU2NoZWR1bGU7XG59XG5cbi8qKlxuICogQ0RLIHN0YWNrIHRoYXQgZGVwbG95cyB0aGUgRUMyIGluc3RhbmNlIHJ1bm5pbmcgc2NoZWR1bGVyIChFdmVudEJyaWRnZSBTY2hlZHVsZXIgKyBEdXJhYmxlIExhbWJkYSkuXG4gKi9cbmV4cG9ydCBjbGFzcyBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZVN0YWNrIGV4dGVuZHMgU3RhY2sge1xuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgc3RhY2sgYW5kIHdpcmVzIHtAbGluayBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXJ9LlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBQYXJlbnQgY29uc3RydWN0IG9yIGFwcC5cbiAgICogQHBhcmFtIGlkIC0gU3RhY2sgaWQuXG4gICAqIEBwYXJhbSBwcm9wcyAtIFRhcmdldCByZXNvdXJjZSwgc2NoZWR1bGVzLCBzZWNyZXRzLCBhbmQgc3RhbmRhcmQgc3RhY2sgcHJvcHMuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVTdGFja1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICBuZXcgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyKHRoaXMsICdFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXInLCB7XG4gICAgICB0YXJnZXRSZXNvdXJjZTogcHJvcHMudGFyZ2V0UmVzb3VyY2UsXG4gICAgICBlbmFibGVTY2hlZHVsaW5nOiBwcm9wcy5lbmFibGVTY2hlZHVsaW5nLFxuICAgICAgc2VjcmV0czogcHJvcHMuc2VjcmV0cyxcbiAgICAgIHN0b3BTY2hlZHVsZTogcHJvcHMuc3RvcFNjaGVkdWxlLFxuICAgICAgc3RhcnRTY2hlZHVsZTogcHJvcHMuc3RhcnRTY2hlZHVsZSxcbiAgICB9KTtcbiAgfVxufSJdfQ==
|
package/package.json
CHANGED
|
@@ -64,8 +64,8 @@
|
|
|
64
64
|
"jsii-docgen": "^10.5.0",
|
|
65
65
|
"jsii-pacmak": "^1.132.0",
|
|
66
66
|
"jsii-rosetta": "5.9.x",
|
|
67
|
-
"projen": "^0.99.
|
|
68
|
-
"safe-env-getter": "^0.
|
|
67
|
+
"projen": "^0.99.70",
|
|
68
|
+
"safe-env-getter": "^0.3.3",
|
|
69
69
|
"ts-jest": "^29.4.11",
|
|
70
70
|
"ts-node": "^10.9.2",
|
|
71
71
|
"typescript": "5.9.x"
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
"publishConfig": {
|
|
93
93
|
"access": "public"
|
|
94
94
|
},
|
|
95
|
-
"version": "0.
|
|
95
|
+
"version": "0.2.0",
|
|
96
96
|
"jest": {
|
|
97
97
|
"coverageProvider": "v8",
|
|
98
98
|
"testMatch": [
|