@dbx-tools/appkit-mastra 0.9.153 → 0.9.157
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/README.md +4 -3
- package/index.ts +32 -24
- package/lib/index.d.ts +32 -24
- package/lib/index.js +32 -23
- package/lib/src/agents.d.ts +5 -6
- package/lib/src/agents.js +12 -15
- package/lib/src/chart.js +33 -33
- package/lib/src/chat.js +10 -13
- package/lib/src/config.d.ts +12 -13
- package/lib/src/config.js +4 -4
- package/lib/src/evaluation.js +7 -9
- package/lib/src/feedback-mode.d.ts +1 -1
- package/lib/src/feedback-mode.js +1 -1
- package/lib/src/filesystems.js +6 -6
- package/lib/src/follow-up-suggestions.js +10 -10
- package/lib/src/genie-chat.js +27 -29
- package/lib/src/genie.d.ts +2 -2
- package/lib/src/genie.js +29 -29
- package/lib/src/identity.d.ts +3 -30
- package/lib/src/identity.js +2 -27
- package/lib/src/memory.d.ts +1 -1
- package/lib/src/memory.js +24 -6
- package/lib/src/mlflow.d.ts +4 -4
- package/lib/src/mlflow.js +15 -18
- package/lib/src/model.d.ts +3 -3
- package/lib/src/model.js +6 -6
- package/lib/src/monty-sandbox.js +8 -8
- package/lib/src/observability.d.ts +6 -5
- package/lib/src/observability.js +8 -6
- package/lib/src/plugin.d.ts +1 -1
- package/lib/src/plugin.js +49 -51
- package/lib/src/remote-skills.d.ts +3 -4
- package/lib/src/remote-skills.js +46 -46
- package/lib/src/rest.d.ts +2 -2
- package/lib/src/rest.js +3 -3
- package/lib/src/server.js +17 -20
- package/lib/src/serving.js +10 -11
- package/lib/src/statement.js +7 -7
- package/lib/src/storage-schema.js +4 -4
- package/lib/src/summarize.js +5 -5
- package/lib/src/telemetry.d.ts +0 -6
- package/lib/src/telemetry.js +34 -41
- package/lib/src/validation.js +3 -4
- package/lib/src/workspaces.d.ts +2 -2
- package/lib/src/workspaces.js +34 -36
- package/lib/src/writer.d.ts +2 -2
- package/lib/src/writer.js +3 -3
- package/package.json +17 -305
- package/src/agents.ts +27 -21
- package/src/chart.ts +43 -37
- package/src/chat.ts +10 -12
- package/src/config.ts +14 -15
- package/src/evaluation.ts +6 -8
- package/src/feedback-mode.ts +1 -1
- package/src/filesystems.ts +5 -5
- package/src/follow-up-suggestions.ts +9 -9
- package/src/genie-chat.ts +32 -31
- package/src/genie.ts +29 -29
- package/src/identity.ts +3 -38
- package/src/memory.ts +24 -6
- package/src/mlflow.ts +21 -21
- package/src/model.ts +7 -7
- package/src/monty-sandbox.ts +7 -7
- package/src/observability.ts +8 -6
- package/src/plugin.ts +78 -65
- package/src/remote-skills.ts +63 -55
- package/src/rest.ts +4 -4
- package/src/server.ts +32 -20
- package/src/serving.ts +14 -11
- package/src/statement.ts +10 -6
- package/src/storage-schema.ts +3 -3
- package/src/summarize.ts +4 -4
- package/src/telemetry.ts +49 -55
- package/src/validation.ts +2 -3
- package/src/workspaces.ts +52 -42
- package/src/writer.ts +3 -3
package/lib/src/plugin.js
CHANGED
|
@@ -44,12 +44,12 @@
|
|
|
44
44
|
* @module
|
|
45
45
|
*/
|
|
46
46
|
import { ExecutionError, genie, getExecutionContext, lakebase, Plugin, toPlugin, } from "@databricks/appkit";
|
|
47
|
-
import {
|
|
48
|
-
import { sendGenieMessageFeedback } from "@dbx-tools/genie
|
|
47
|
+
import { pluginRegistry, instance, require, configureNativeHttpTelemetry, excludeUnparentedOutgoingHttpTelemetry, deferredNativeTracerProvider, requestUserId, useServicePrincipal, } from "@dbx-tools/appkit";
|
|
48
|
+
import { sendGenieMessageFeedback } from "@dbx-tools/genie";
|
|
49
49
|
import { modelCatalog } from "@dbx-tools/model";
|
|
50
|
-
import {
|
|
51
|
-
import {
|
|
52
|
-
import {
|
|
50
|
+
import { combineAbortSignals, toError, errorContext, logger, toNumber, firstNonEmpty, } from "@dbx-tools/shared-core";
|
|
51
|
+
import { MastraFeedbackRequestSchema, MASTRA_ROUTES, genieRoutePath, GenieChatRequestSchema, } from "@dbx-tools/shared-mastra";
|
|
52
|
+
import { toModelDisplayName } from "@dbx-tools/shared-model";
|
|
53
53
|
import { workflowRoute } from "@mastra/ai-sdk";
|
|
54
54
|
import { Mastra } from "@mastra/core/mastra";
|
|
55
55
|
import { RequestContext } from "@mastra/core/request-context";
|
|
@@ -64,9 +64,9 @@ import { resolveFeedbackMode } from "./feedback-mode.js";
|
|
|
64
64
|
import { resolveFollowUpSuggestionsConfig } from "./follow-up-suggestions.js";
|
|
65
65
|
import { deleteGenieThread, deleteGenieThreadMessage, genieChatStream, listGenieThreadMessages, listGenieThreads, } from "./genie-chat.js";
|
|
66
66
|
import { collectSpaceSuggestions, resolveGenieSpaces } from "./genie.js";
|
|
67
|
-
import {
|
|
67
|
+
import { resolveIdentityMode } from "./identity.js";
|
|
68
68
|
import { buildMcpServer } from "./mcp.js";
|
|
69
|
-
import { createMemoryBuilder, needsLakebase } from "./memory.js";
|
|
69
|
+
import { createMastraLakebasePool, createMemoryBuilder, needsLakebase } from "./memory.js";
|
|
70
70
|
import { flushDirectMlflowTracing, logFeedback, mlflowEnabled, mlflowExperimentManagerUrl, } from "./mlflow.js";
|
|
71
71
|
import { resolveDefaultModelId } from "./model.js";
|
|
72
72
|
import { buildObservability, configureOtelPropagation } from "./observability.js";
|
|
@@ -166,7 +166,7 @@ export class MastraPlugin extends Plugin {
|
|
|
166
166
|
}
|
|
167
167
|
return resources;
|
|
168
168
|
}
|
|
169
|
-
logger =
|
|
169
|
+
logger = logger(this);
|
|
170
170
|
built = null;
|
|
171
171
|
mastra = null;
|
|
172
172
|
mastraApp = null;
|
|
@@ -185,7 +185,7 @@ export class MastraPlugin extends Plugin {
|
|
|
185
185
|
/** Resolved feedback destination published to server and browser clients. */
|
|
186
186
|
resolvedFeedbackMode = "none";
|
|
187
187
|
/**
|
|
188
|
-
* Resolved
|
|
188
|
+
* Resolved AppKit identity mode: the identity the chat path's Databricks
|
|
189
189
|
* calls run as. Read once at setup so an invalid `genieIdentity` fails the app
|
|
190
190
|
* boot rather than the first request, and so every request agrees.
|
|
191
191
|
*/
|
|
@@ -201,10 +201,10 @@ export class MastraPlugin extends Plugin {
|
|
|
201
201
|
});
|
|
202
202
|
this.config.feedbackMode = this.resolvedFeedbackMode;
|
|
203
203
|
if (this.config.observability !== false) {
|
|
204
|
-
await
|
|
204
|
+
await configureNativeHttpTelemetry({
|
|
205
205
|
// A low-level request without an active semantic span becomes a noisy
|
|
206
206
|
// standalone trace. Requests inside an agent/tool span remain visible.
|
|
207
|
-
outgoingFilter:
|
|
207
|
+
outgoingFilter: excludeUnparentedOutgoingHttpTelemetry,
|
|
208
208
|
});
|
|
209
209
|
await registerAppMlflowTraceInfoProcessor();
|
|
210
210
|
}
|
|
@@ -242,7 +242,7 @@ export class MastraPlugin extends Plugin {
|
|
|
242
242
|
* already in the registry by the time this fires.
|
|
243
243
|
*/
|
|
244
244
|
applyLakebaseAutoDefaults() {
|
|
245
|
-
const hasLakebase =
|
|
245
|
+
const hasLakebase = instance(this.context, lakebase) !== undefined;
|
|
246
246
|
if (!hasLakebase)
|
|
247
247
|
return;
|
|
248
248
|
if (this.config.storage === undefined)
|
|
@@ -261,7 +261,7 @@ export class MastraPlugin extends Plugin {
|
|
|
261
261
|
}
|
|
262
262
|
catch (err) {
|
|
263
263
|
this.logger.warn("error flushing direct MLflow traces", {
|
|
264
|
-
error:
|
|
264
|
+
error: toError(err),
|
|
265
265
|
});
|
|
266
266
|
}
|
|
267
267
|
}
|
|
@@ -448,7 +448,7 @@ export class MastraPlugin extends Plugin {
|
|
|
448
448
|
this.route(router, {
|
|
449
449
|
name: "models",
|
|
450
450
|
method: "get",
|
|
451
|
-
path:
|
|
451
|
+
path: MASTRA_ROUTES.models,
|
|
452
452
|
handler: async (req, res) => {
|
|
453
453
|
const result = await this.scopedSelf(req).listModelsResult();
|
|
454
454
|
if (!result.ok) {
|
|
@@ -465,7 +465,7 @@ export class MastraPlugin extends Plugin {
|
|
|
465
465
|
// `/models`; a custom dynamic resolver remains null because it is call-time
|
|
466
466
|
// application code.
|
|
467
467
|
const handleDefaultModel = async (req, res) => {
|
|
468
|
-
const requested =
|
|
468
|
+
const requested = firstNonEmpty(req.params.agentId);
|
|
469
469
|
if (requested !== null && !this.built?.agents[requested]) {
|
|
470
470
|
res.status(404).json({ error: this.unknownAgentMessage(requested) });
|
|
471
471
|
return;
|
|
@@ -489,19 +489,19 @@ export class MastraPlugin extends Plugin {
|
|
|
489
489
|
res.json({
|
|
490
490
|
agentId,
|
|
491
491
|
model,
|
|
492
|
-
displayName: model ?
|
|
492
|
+
displayName: model ? toModelDisplayName(model) : null,
|
|
493
493
|
});
|
|
494
494
|
};
|
|
495
495
|
this.route(router, {
|
|
496
496
|
name: "defaultModel",
|
|
497
497
|
method: "get",
|
|
498
|
-
path:
|
|
498
|
+
path: MASTRA_ROUTES.defaultModel,
|
|
499
499
|
handler: handleDefaultModel,
|
|
500
500
|
});
|
|
501
501
|
this.route(router, {
|
|
502
502
|
name: "defaultModelByAgent",
|
|
503
503
|
method: "get",
|
|
504
|
-
path: `${
|
|
504
|
+
path: `${MASTRA_ROUTES.defaultModel}/:agentId`,
|
|
505
505
|
handler: handleDefaultModel,
|
|
506
506
|
});
|
|
507
507
|
}
|
|
@@ -564,10 +564,10 @@ export class MastraPlugin extends Plugin {
|
|
|
564
564
|
this.route(router, {
|
|
565
565
|
name: "embed",
|
|
566
566
|
method: "get",
|
|
567
|
-
path: `${
|
|
567
|
+
path: `${MASTRA_ROUTES.embed}/:type/:id`,
|
|
568
568
|
handler: async (req, res) => {
|
|
569
|
-
const type =
|
|
570
|
-
const id =
|
|
569
|
+
const type = firstNonEmpty(req.params.type) ?? "";
|
|
570
|
+
const id = firstNonEmpty(req.params.id);
|
|
571
571
|
const resolve = embedResolvers[type];
|
|
572
572
|
if (!resolve) {
|
|
573
573
|
this.logger.warn("embed:unsupported", {
|
|
@@ -646,7 +646,7 @@ export class MastraPlugin extends Plugin {
|
|
|
646
646
|
// the upstream status. Log and degrade.
|
|
647
647
|
this.logger.warn("suggestions:error", {
|
|
648
648
|
status: result.status,
|
|
649
|
-
error:
|
|
649
|
+
error: toError(result.message),
|
|
650
650
|
});
|
|
651
651
|
res.json({ questions: [] });
|
|
652
652
|
return;
|
|
@@ -656,13 +656,13 @@ export class MastraPlugin extends Plugin {
|
|
|
656
656
|
this.route(router, {
|
|
657
657
|
name: "suggestions",
|
|
658
658
|
method: "get",
|
|
659
|
-
path:
|
|
659
|
+
path: MASTRA_ROUTES.suggestions,
|
|
660
660
|
handler: handleSuggestions,
|
|
661
661
|
});
|
|
662
662
|
this.route(router, {
|
|
663
663
|
name: "suggestionsByAgent",
|
|
664
664
|
method: "get",
|
|
665
|
-
path: `${
|
|
665
|
+
path: `${MASTRA_ROUTES.suggestions}/:agentId`,
|
|
666
666
|
handler: handleSuggestions,
|
|
667
667
|
});
|
|
668
668
|
}
|
|
@@ -674,11 +674,11 @@ export class MastraPlugin extends Plugin {
|
|
|
674
674
|
* written to Mastra Memory.
|
|
675
675
|
*/
|
|
676
676
|
registerGenieChatRoutes(router) {
|
|
677
|
-
const path = (...parts) =>
|
|
678
|
-
const { chat: chatSegment, messages, suggestions, threads } =
|
|
677
|
+
const path = (...parts) => genieRoutePath(":alias", ...parts);
|
|
678
|
+
const { chat: chatSegment, messages, suggestions, threads } = MASTRA_ROUTES;
|
|
679
679
|
/** Resolve the route's alias, answering 404 when no such space is configured. */
|
|
680
680
|
const spaceFor = (req, res) => {
|
|
681
|
-
const alias =
|
|
681
|
+
const alias = firstNonEmpty(req.params.alias) ?? "";
|
|
682
682
|
const configured = resolveGenieSpaces(this.config, this.context)[alias];
|
|
683
683
|
if (configured)
|
|
684
684
|
return { alias, spaceId: configured.spaceId };
|
|
@@ -699,7 +699,7 @@ export class MastraPlugin extends Plugin {
|
|
|
699
699
|
const space = spaceFor(req, res);
|
|
700
700
|
if (!space)
|
|
701
701
|
return;
|
|
702
|
-
const parsed =
|
|
702
|
+
const parsed = GenieChatRequestSchema.safeParse(req.body);
|
|
703
703
|
if (!parsed.success) {
|
|
704
704
|
res
|
|
705
705
|
.status(400)
|
|
@@ -733,7 +733,7 @@ export class MastraPlugin extends Plugin {
|
|
|
733
733
|
const space = spaceFor(req, res);
|
|
734
734
|
if (!space)
|
|
735
735
|
return;
|
|
736
|
-
const threadId =
|
|
736
|
+
const threadId = firstNonEmpty(req.params.threadId) ?? "";
|
|
737
737
|
const result = await this.asUser(req).genieConversationRead((client) => listGenieThreadMessages({
|
|
738
738
|
client,
|
|
739
739
|
space,
|
|
@@ -754,7 +754,7 @@ export class MastraPlugin extends Plugin {
|
|
|
754
754
|
const space = spaceFor(req, res);
|
|
755
755
|
if (!space)
|
|
756
756
|
return;
|
|
757
|
-
const threadId =
|
|
757
|
+
const threadId = firstNonEmpty(req.params.threadId) ?? "";
|
|
758
758
|
const result = await this.asUser(req).genieConversationWrite((client) => deleteGenieThread(client, space, threadId));
|
|
759
759
|
if (!result.ok) {
|
|
760
760
|
this.sendFailure(res, result, "genie-thread-delete", "Could not delete the Genie conversation");
|
|
@@ -771,8 +771,8 @@ export class MastraPlugin extends Plugin {
|
|
|
771
771
|
const space = spaceFor(req, res);
|
|
772
772
|
if (!space)
|
|
773
773
|
return;
|
|
774
|
-
const threadId =
|
|
775
|
-
const messageId =
|
|
774
|
+
const threadId = firstNonEmpty(req.params.threadId) ?? "";
|
|
775
|
+
const messageId = firstNonEmpty(req.params.messageId) ?? "";
|
|
776
776
|
const result = await this.asUser(req).genieConversationWrite((client) => deleteGenieThreadMessage(client, space, threadId, messageId));
|
|
777
777
|
if (!result.ok) {
|
|
778
778
|
this.sendFailure(res, result, "genie-message-delete", "Could not delete the Genie message");
|
|
@@ -844,14 +844,14 @@ export class MastraPlugin extends Plugin {
|
|
|
844
844
|
this.route(router, {
|
|
845
845
|
name: "feedback",
|
|
846
846
|
method: "post",
|
|
847
|
-
path:
|
|
847
|
+
path: MASTRA_ROUTES.feedback,
|
|
848
848
|
handler: async (req, res) => {
|
|
849
849
|
const mode = this.feedbackMode();
|
|
850
850
|
if (mode === "none") {
|
|
851
851
|
res.status(404).json({ ok: false });
|
|
852
852
|
return;
|
|
853
853
|
}
|
|
854
|
-
const parsed =
|
|
854
|
+
const parsed = MastraFeedbackRequestSchema.safeParse(req.body);
|
|
855
855
|
if (!parsed.success) {
|
|
856
856
|
// A Zod issue string quotes the received body back, so only the
|
|
857
857
|
// offending field names travel; the full issue list is logged.
|
|
@@ -894,7 +894,7 @@ export class MastraPlugin extends Plugin {
|
|
|
894
894
|
this.route(router, {
|
|
895
895
|
name: "mlflowExperiment",
|
|
896
896
|
method: "get",
|
|
897
|
-
path:
|
|
897
|
+
path: MASTRA_ROUTES.mlflowExperiment,
|
|
898
898
|
handler: async (req, res) => {
|
|
899
899
|
if (this.feedbackMode() !== "mlflow") {
|
|
900
900
|
res.json({ url: null });
|
|
@@ -950,7 +950,7 @@ export class MastraPlugin extends Plugin {
|
|
|
950
950
|
sendFailure(res, result, operation, clientMessage) {
|
|
951
951
|
this.logger.warn(`${operation}:error`, {
|
|
952
952
|
status: result.status,
|
|
953
|
-
error:
|
|
953
|
+
error: toError(result.message),
|
|
954
954
|
});
|
|
955
955
|
if (res.headersSent)
|
|
956
956
|
return;
|
|
@@ -1007,7 +1007,7 @@ export class MastraPlugin extends Plugin {
|
|
|
1007
1007
|
return { ok: true, data: [] };
|
|
1008
1008
|
const client = getExecutionContext().client;
|
|
1009
1009
|
return this.execute((executeSignal) => {
|
|
1010
|
-
const combined =
|
|
1010
|
+
const combined = combineAbortSignals(signal, executeSignal);
|
|
1011
1011
|
return collectSpaceSuggestions({
|
|
1012
1012
|
spaces,
|
|
1013
1013
|
client,
|
|
@@ -1073,7 +1073,7 @@ export class MastraPlugin extends Plugin {
|
|
|
1073
1073
|
const client = getExecutionContext().client;
|
|
1074
1074
|
const limit = Math.min(options.limit ?? STATEMENT_ROW_CAP, STATEMENT_ROW_CAP);
|
|
1075
1075
|
return this.execute(async (executeSignal) => {
|
|
1076
|
-
const combined =
|
|
1076
|
+
const combined = combineAbortSignals(options.signal, executeSignal);
|
|
1077
1077
|
try {
|
|
1078
1078
|
const { data, visualization } = await fetchStatementEmbedData(client, statementId, {
|
|
1079
1079
|
limit,
|
|
@@ -1090,7 +1090,7 @@ export class MastraPlugin extends Plugin {
|
|
|
1090
1090
|
catch (err) {
|
|
1091
1091
|
// The Databricks SDK throws on 404; surface as `undefined`
|
|
1092
1092
|
// so the route maps to a clean HTTP 404 instead of a 500.
|
|
1093
|
-
if (
|
|
1093
|
+
if (errorContext(err).notAccessible)
|
|
1094
1094
|
return undefined;
|
|
1095
1095
|
throw err;
|
|
1096
1096
|
}
|
|
@@ -1126,7 +1126,7 @@ export class MastraPlugin extends Plugin {
|
|
|
1126
1126
|
return this.execute((executeSignal) => fetchChart(chartId, {
|
|
1127
1127
|
userKey,
|
|
1128
1128
|
...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),
|
|
1129
|
-
signal:
|
|
1129
|
+
signal: combineAbortSignals(options.signal, executeSignal) ?? options.signal,
|
|
1130
1130
|
}), chartFetchDefaults);
|
|
1131
1131
|
}
|
|
1132
1132
|
/**
|
|
@@ -1158,13 +1158,13 @@ export class MastraPlugin extends Plugin {
|
|
|
1158
1158
|
return result.data;
|
|
1159
1159
|
this.logger.warn("listModels:error", {
|
|
1160
1160
|
status: result.status,
|
|
1161
|
-
error:
|
|
1161
|
+
error: toError(result.message),
|
|
1162
1162
|
});
|
|
1163
1163
|
throw new ExecutionError(MODEL_CATALOGUE_FAILED_MESSAGE);
|
|
1164
1164
|
}
|
|
1165
1165
|
async buildAgentAndServer() {
|
|
1166
1166
|
const memoryPool = needsLakebase(this.config)
|
|
1167
|
-
?
|
|
1167
|
+
? createMastraLakebasePool(require(this.context, lakebase, this.config).exports().getPgConfig())
|
|
1168
1168
|
: undefined;
|
|
1169
1169
|
const memoryBuilder = createMemoryBuilder(this.config, memoryPool);
|
|
1170
1170
|
// Build every agent declared in `config.agents` (or the built-in
|
|
@@ -1217,15 +1217,13 @@ export class MastraPlugin extends Plugin {
|
|
|
1217
1217
|
// `agent.resumeStream()` errors with "could not find a suspended
|
|
1218
1218
|
// run" and the approval UI hangs after the user clicks Approve.
|
|
1219
1219
|
const instanceStorage = memoryBuilder?.instanceStorage();
|
|
1220
|
-
// Wire Mastra's tracer into
|
|
1221
|
-
//
|
|
1222
|
-
//
|
|
1223
|
-
// `createApp`, so the OTLP endpoint / headers / sampling are
|
|
1224
|
-
// env-driven and shared with every other AppKit plugin.
|
|
1220
|
+
// Wire Mastra's tracer into OTel through `@mastra/otel-bridge`. Deployed
|
|
1221
|
+
// Apps use the provider AppKit registered during `createApp`; local direct
|
|
1222
|
+
// MLflow tracing uses its own global provider when no OTLP exporter exists.
|
|
1225
1223
|
const observability = await buildObservability({
|
|
1226
1224
|
serviceName: this.name,
|
|
1227
1225
|
enabled: this.config.observability,
|
|
1228
|
-
tracerProvider: await
|
|
1226
|
+
tracerProvider: await deferredNativeTracerProvider(),
|
|
1229
1227
|
});
|
|
1230
1228
|
// Optional MCP exposure: build a Mastra MCP server from the
|
|
1231
1229
|
// registered agents (and, opt-in, the ambient tools) and register
|
|
@@ -1296,7 +1294,7 @@ function parseTimeoutMs(raw) {
|
|
|
1296
1294
|
const v = Array.isArray(raw) ? raw[0] : raw;
|
|
1297
1295
|
if (typeof v !== "string")
|
|
1298
1296
|
return undefined;
|
|
1299
|
-
const n =
|
|
1297
|
+
const n = toNumber(v);
|
|
1300
1298
|
if (n === undefined || n <= 0)
|
|
1301
1299
|
return undefined;
|
|
1302
1300
|
return Math.min(Math.floor(n), MAX_EMBED_POLL_TIMEOUT_MS);
|
|
@@ -1312,7 +1310,7 @@ function parseStatementLimit(raw) {
|
|
|
1312
1310
|
const v = Array.isArray(raw) ? raw[0] : raw;
|
|
1313
1311
|
if (typeof v !== "string")
|
|
1314
1312
|
return undefined;
|
|
1315
|
-
const n =
|
|
1313
|
+
const n = toNumber(v);
|
|
1316
1314
|
if (n === undefined || n < 0)
|
|
1317
1315
|
return undefined;
|
|
1318
1316
|
return Math.floor(n);
|
|
@@ -1359,4 +1357,4 @@ function parseStatementLimit(raw) {
|
|
|
1359
1357
|
* ```
|
|
1360
1358
|
*/
|
|
1361
1359
|
export const mastra = toPlugin(MastraPlugin);
|
|
1362
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q0c7QUFFSCxPQUFPLEVBQ0wsY0FBYyxFQUNkLEtBQUssRUFDTCxtQkFBbUIsRUFDbkIsUUFBUSxFQUNSLE1BQU0sRUFDTixRQUFRLEdBS1QsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLFNBQVMsSUFBSSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRixPQUFPLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDTixJQUFJLEdBS0wsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUErQixNQUFNLHlCQUF5QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTlELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLElBQUksQ0FBQztBQUNuRCxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFHOUIsT0FBTyxFQUNMLFdBQVcsRUFDWCxpQkFBaUIsR0FHbEIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVks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Q0FBQyxDQUFDO0lBQzdCLElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQy9DLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Q0c7QUFDSCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcHBLaXQgcGx1Z2luIHRoYXQgYnVpbGRzIG9uZSBvciBtb3JlIE1hc3RyYSBgQWdlbnRgIGluc3RhbmNlcyBhbmRcbiAqIG1vdW50cyB0aGUgYEBtYXN0cmEvZXhwcmVzc2Agc2VydmVyLiBDbGllbnRzIGRyaXZlIHRoZSBjb252ZXJzYXRpb25cbiAqIG92ZXIgdGhlIHN0YW5kYXJkIE1hc3RyYSBhZ2VudCBzdHJlYW0gKGBAbWFzdHJhL2NsaWVudC1qc2Anc1xuICogYGdldEFnZW50KGlkKS5zdHJlYW0oKWApLCBzbyB0aGVyZSdzIG5vIGJlc3Bva2UgY2hhdCB0cmFuc3BvcnQgdG9cbiAqIGtlZXAgaW4gc3luYy5cbiAqXG4gKiAtIEFnZW50czogcmVnaXN0ZXJlZCB0aHJvdWdoIGBjb25maWcuYWdlbnRzYCBhdCBwbHVnaW4gY3JlYXRpb25cbiAqICAgKHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb259KS4gRWFjaCBlbnRyeSdzIGB0b29sc2AgZmllbGQgYWNjZXB0c1xuICogICBlaXRoZXIgYSBwbGFpbiByZWNvcmQgb3IgYSBgKHBsdWdpbnMpID0+IHRvb2xzYCBjYWxsYmFjayB0aGF0IGdldHNcbiAqICAgYSB0eXBlZCBzaWJsaW5nLXBsdWdpbiBpbmRleCAoe0BsaW5rIE1hc3RyYVBsdWdpbnN9KS4gT21pdFxuICogICBgY29uZmlnLmFnZW50c2AgdG8gZ2V0IGEgc2luZ2xlIGJ1aWx0LWluIGBkZWZhdWx0YCBhbmFseXN0LlxuICogLSBNb2RlbDogZWFjaCBhZ2VudCBjYWxsIHJlc29sdmVzIGEgYE1hc3RyYU1vZGVsQ29uZmlnYCB2aWFcbiAqICAge0BsaW5rIGJ1aWxkTW9kZWx9IGZyb20gYC4vbW9kZWwuanNgLiBQZXItYWdlbnQgYG1vZGVsYCBvdmVycmlkZXNcbiAqICAgKGBBZ2VudENvbmZpZ1tcIm1vZGVsXCJdYCBvciBhIGBtb2RlbElkYCBzdHJpbmcpIGZsb3cgdGhyb3VnaFxuICogICB7QGxpbmsgYnVpbGRBZ2VudHN9LlxuICogLSBNZW1vcnkgLyBzdG9yYWdlOiBwZXItYWdlbnQsIGJ1aWx0IGJ5IHtAbGluayBjcmVhdGVNZW1vcnlCdWlsZGVyfVxuICogICBmcm9tIGAuL21lbW9yeS5qc2AuIEJvdGggYXV0by1kZWZhdWx0IHRvIGB0cnVlYCB3aGVuIHRoZVxuICogICBgbGFrZWJhc2VgIHBsdWdpbiBpcyByZWdpc3RlcmVkICh1bmxlc3MgdGhlIGNhbGxlciBwYXNzZWRcbiAqICAgYGZhbHNlYCBvciBhIGN1c3RvbSBjb25maWcpLiBTdG9yYWdlIG5hbWVzcGFjZXMgcGVyIGFnZW50IHZpYVxuICogICB7QGxpbmsgYWdlbnRTdG9yYWdlU2NoZW1hTmFtZX0gcGVyIGFnZW50OyB0aGUgdmVjdG9yIHN0b3JlIGlzIGEgc2luZ2xlXG4gKiAgIHNoYXJlZCBzaW5nbGV0b24gYWNyb3NzIGV2ZXJ5IGFnZW50LlxuICogLSBTZXJ2ZXI6IHRoZSBFeHByZXNzIHN1YmFwcCB3aXJpbmcgbGl2ZXMgaW4gYC4vc2VydmVyLmpzYC5cbiAqIC0gSFRUUDogQXBwS2l0IG1vdW50cyB0aGlzIHBsdWdpbiB1bmRlciBgL2FwaS9tYXN0cmFgLiBBbG9uZ3NpZGUgdGhlXG4gKiAgIE1hc3RyYSBhZ2VudCByb3V0ZXMsIHRoZSBwbHVnaW4gcmVnaXN0ZXJzIGAvcm91dGUvaGlzdG9yeWBcbiAqICAgKGxvYWQgKyBjbGVhciBhIHRocmVhZCdzIG1lc3NhZ2VzKSwgYC9yb3V0ZS90aHJlYWRzYCAobGlzdCB0aGVcbiAqICAgY2FsbGVyJ3MgY29udmVyc2F0aW9ucyArIGRlbGV0ZSBvbmUpLCBgL21vZGVsc2AsIGAvZGVmYXVsdC1tb2RlbGAsXG4gKiAgIGAvc3VnZ2VzdGlvbnNgLCBgL3JvdXRlL2ZlZWRiYWNrYCAobG9nIGEgdGh1bWJzIC8gY29tbWVudCB0byBNTGZsb3dcbiAqICAgd2hlbiBmZWVkYmFjayBpcyBlbmFibGVkKSwgYW5kIHRoZSBnZW5lcmljIGAvZW1iZWQvOnR5cGUvOmlkYFxuICogICByZXNvbHZlciBmb3IgaW5saW5lIGNoYXJ0IC8gZGF0YSBtYXJrZXJzLiBFYWNoIGlzIHJlZ2lzdGVyZWQgdGhyb3VnaFxuICogICBBcHBLaXQncyBgcm91dGUoKWAgc28gaXQgbGFuZHMgaW4gdGhlIHBsdWdpbidzIGVuZHBvaW50IG1hcCwgYW5kXG4gKiAgIGV2ZXJ5IG91dGJvdW5kIGNhbGwgb25lIG1ha2VzIHJ1bnMgdGhyb3VnaCBgZXhlY3V0ZSgpYCAoc2VlXG4gKiAgIGAuL2RlZmF1bHRzLmpzYCkuIFRoZSBzdG9jayBgQG1hc3RyYS9leHByZXNzYCBzdXJmYWNlIGlzIGdhdGVkXG4gKiAgIGJ5IGBjb25maWcuYXBpQWNjZXNzYCAoZGVmYXVsdCBgXCJzY29wZWRcImApOiBvbmx5IGFnZW50IGluZmVyZW5jZSxcbiAqICAgcmVhZC1vbmx5IGFnZW50IG1ldGFkYXRhLCB0aGUgYC9yb3V0ZS8qYCByb3V0ZXMsIGFuZCAod2hlbiBlbmFibGVkKVxuICogICBNQ1AgYXJlIGRpc3BhdGNoZWQgdG8gTWFzdHJhOyBhZG1pbiAvIG11dGF0aW5nIC8gYnVsay1leHBvcnQgcm91dGVzXG4gKiAgIGFyZSByZWZ1c2VkIHdpdGggYDQwM2AuIFNlZSB7QGxpbmsgaXNNYXN0cmFSZXF1ZXN0QWxsb3dlZH0uXG4gKiAtIE1DUDogb3B0IGluIHdpdGggYGNvbmZpZy5tY3BgIHRvIGV4cG9zZSB0aGUgYWdlbnRzIChhbmQgb3B0aW9uYWxseVxuICogICB0b29scykgYXMgYSBNYXN0cmEgYE1DUFNlcnZlcmAuIEl0IGlzIHJlZ2lzdGVyZWQgb24gdGhlIGBNYXN0cmFgXG4gKiAgIGluc3RhbmNlIHZpYSBgbWNwU2VydmVyc2AsIHNvIGBAbWFzdHJhL2V4cHJlc3NgIHNlcnZlcyB0aGUgc3RvY2tcbiAqICAgTUNQIHRyYW5zcG9ydCByb3V0ZXMgKGAvbWNwLzxzZXJ2ZXJJZD4vLi4uYCkgdW5kZXIgdGhlIG1vdW50LiBTZWVcbiAqICAgYC4vbWNwLmpzYC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgRXhlY3V0aW9uRXJyb3IsXG4gIGdlbmllLFxuICBnZXRFeGVjdXRpb25Db250ZXh0LFxuICBsYWtlYmFzZSxcbiAgUGx1Z2luLFxuICB0b1BsdWdpbixcbiAgdHlwZSBFeGVjdXRpb25SZXN1bHQsXG4gIHR5cGUgSUFwcFJvdXRlcixcbiAgdHlwZSBQbHVnaW5NYW5pZmVzdCxcbiAgdHlwZSBSZXNvdXJjZVJlcXVpcmVtZW50LFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBsYWtlYmFzZVJlc29sdmVyLCBwbHVnaW5SZWdpc3RyeSwgdGVsZW1ldHJ5IGFzIGFwcGtpdFRlbGVtZXRyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgc2VuZEdlbmllTWVzc2FnZUZlZWRiYWNrIH0gZnJvbSBcIkBkYngtdG9vbHMvZ2VuaWUvZmVlZGJhY2tcIjtcbmltcG9ydCB7IG1vZGVsQ2F0YWxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBhc3luY1V0aWxzLCBlcnJvclV0aWxzLCBsb2csIG9iamVjdCwgc3RyaW5nVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgZmVlZGJhY2ssXG4gIHJvdXRlcyxcbiAgd2lyZSxcbiAgdHlwZSBDaGFydCxcbiAgdHlwZSBHZW5pZUNoYXRSZXF1ZXN0LFxuICB0eXBlIE1hc3RyYUNsaWVudENvbmZpZyxcbiAgdHlwZSBTdGF0ZW1lbnREYXRhLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQgeyBkaXNwbGF5LCB0eXBlIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB7IHdvcmtmbG93Um91dGUgfSBmcm9tIFwiQG1hc3RyYS9haS1zZGtcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQgeyBNYXN0cmEgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL21hc3RyYVwiO1xuaW1wb3J0IHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBBbnlXb3JrZmxvdyB9IGZyb20gXCJAbWFzdHJhL2NvcmUvd29ya2Zsb3dzXCI7XG5pbXBvcnQgeyBwaXBlVUlNZXNzYWdlU3RyZWFtVG9SZXNwb25zZSB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSBcImV4cHJlc3NcIjtcbmltcG9ydCB0eXBlIHsgUG9vbCB9IGZyb20gXCJwZ1wiO1xuXG5pbXBvcnQge1xuICBidWlsZEFnZW50cyxcbiAgRkFMTEJBQ0tfQUdFTlRfSUQsXG4gIHR5cGUgQnVpbHRBZ2VudHMsXG4gIHR5cGUgTWFzdHJhT3V0cHV0UHJvY2Vzc29yRmFjdG9yeSxcbn0gZnJvbSBcIi4vYWdlbnRzLnRzXCI7XG5pbXBvcnQgeyBmZXRjaENoYXJ0IH0gZnJvbSBcIi4vY2hhcnQudHNcIjtcbmltcG9ydCB7IGFnZW50Q2hhdFJvdXRlcyB9IGZyb20gXCIuL2NoYXQudHNcIjtcbmltcG9ydCB7XG4gIGF0dHJpYnV0ZWRVc2VySWQsXG4gIGV4ZWN1dGlvbkNvbnRleHRVc2VySWQsXG4gIE1BU1RSQV9DT05GSUdfU0NIRU1BLFxuICB0eXBlIE1hc3RyYVBsdWdpbkNvbmZpZyxcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQge1xuICBjaGFydEZldGNoRGVmYXVsdHMsXG4gIGZlZWRiYWNrV3JpdGVEZWZhdWx0cyxcbiAgZ2VuaWVDb252ZXJzYXRpb25SZWFkRGVmYXVsdHMsXG4gIGdlbmllQ29udmVyc2F0aW9uV3JpdGVEZWZhdWx0cyxcbiAgZ2VuaWVTdWdnZXN0aW9uRGVmYXVsdHMsXG4gIG1vZGVsQ2F0YWxvZ3VlRGVmYXVsdHMsXG4gIHN0YXRlbWVudERhdGFEZWZhdWx0cyxcbn0gZnJvbSBcIi4vZGVmYXVsdHMudHNcIjtcbmltcG9ydCB7IHJlc29sdmVGZWVkYmFja01vZGUgfSBmcm9tIFwiLi9mZWVkYmFjay1tb2RlLnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlRm9sbG93VXBTdWdnZXN0aW9uc0NvbmZpZyB9IGZyb20gXCIuL2ZvbGxvdy11cC1zdWdnZXN0aW9ucy50c1wiO1xuaW1wb3J0IHtcbiAgZGVsZXRlR2VuaWVUaHJlYWQsXG4gIGRlbGV0ZUdlbmllVGhyZWFkTWVzc2FnZSxcbiAgZ2VuaWVDaGF0U3RyZWFtLFxuICBsaXN0R2VuaWVUaHJlYWRNZXNzYWdlcyxcbiAgbGlzdEdlbmllVGhyZWFkcyxcbiAgdHlwZSBHZW5pZUNoYXRTcGFjZSxcbn0gZnJvbSBcIi4vZ2VuaWUtY2hhdC50c1wiO1xuaW1wb3J0IHsgY29sbGVjdFNwYWNlU3VnZ2VzdGlvbnMsIHJlc29sdmVHZW5pZVNwYWNlcywgdHlwZSBHZW5pZVNwYWNlQ29uZmlnIH0gZnJvbSBcIi4vZ2VuaWUudHNcIjtcbmltcG9ydCB7XG4gIHJlcXVlc3RVc2VySWQsXG4gIHJlc29sdmVJZGVudGl0eU1vZGUsXG4gIHVzZVNlcnZpY2VQcmluY2lwYWwsXG4gIHR5cGUgTWFzdHJhSWRlbnRpdHlNb2RlLFxufSBmcm9tIFwiLi9pZGVudGl0eS50c1wiO1xuaW1wb3J0IHsgYnVpbGRNY3BTZXJ2ZXIsIHR5cGUgUmVzb2x2ZWRNY3AgfSBmcm9tIFwiLi9tY3AudHNcIjtcbmltcG9ydCB7IGNyZWF0ZU1lbW9yeUJ1aWxkZXIsIG5lZWRzTGFrZWJhc2UgfSBmcm9tIFwiLi9tZW1vcnkudHNcIjtcbmltcG9ydCB7XG4gIGZsdXNoRGlyZWN0TWxmbG93VHJhY2luZyxcbiAgbG9nRmVlZGJhY2ssXG4gIG1sZmxvd0VuYWJsZWQsXG4gIG1sZmxvd0V4cGVyaW1lbnRNYW5hZ2VyVXJsLFxufSBmcm9tIFwiLi9tbGZsb3cudHNcIjtcbmltcG9ydCB7IHJlc29sdmVEZWZhdWx0TW9kZWxJZCB9IGZyb20gXCIuL21vZGVsLnRzXCI7XG5pbXBvcnQgeyBidWlsZE9ic2VydmFiaWxpdHksIGNvbmZpZ3VyZU90ZWxQcm9wYWdhdGlvbiB9IGZyb20gXCIuL29ic2VydmFiaWxpdHkudHNcIjtcbmltcG9ydCB7IHByb3Zpc2lvblJlbW90ZVNraWxscyB9IGZyb20gXCIuL3JlbW90ZS1za2lsbHMudHNcIjtcbmltcG9ydCB7XG4gIGF0dGFjaFJvdXRlUGF0Y2hNaWRkbGV3YXJlLFxuICBhdHRhY2hTdGFsZVJlc3VtZVJlY292ZXJ5LFxuICBjbGVhclRydXN0ZWRSZXF1ZXN0Q29udGV4dCxcbiAgY3JlYXRlUmVxdWVzdENvbnRleHQsXG4gIGlzTWFzdHJhUmVxdWVzdEFsbG93ZWQsXG4gIE1hc3RyYVNlcnZlcixcbiAgc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXIsXG59IGZyb20gXCIuL3NlcnZlci50c1wiO1xuaW1wb3J0IHsgcmVzb2x2ZVNlcnZpbmdDb25maWcgfSBmcm9tIFwiLi9zZXJ2aW5nLnRzXCI7XG5pbXBvcnQgeyBmZXRjaFN0YXRlbWVudEVtYmVkRGF0YSwgU1RBVEVNRU5UX1JPV19DQVAgfSBmcm9tIFwiLi9zdGF0ZW1lbnQudHNcIjtcbmltcG9ydCB7IGF0dGFjaENoYXRUdXJuVGVsZW1ldHJ5LCByZWdpc3RlckFwcE1sZmxvd1RyYWNlSW5mb1Byb2Nlc3NvciB9IGZyb20gXCIuL3RlbGVtZXRyeS50c1wiO1xuaW1wb3J0IHsgaW52YWxpZEZpZWxkcyB9IGZyb20gXCIuL3ZhbGlkYXRpb24udHNcIjtcbmltcG9ydCB7IGlubGluZVNraWxsc0Zyb21Mb2NhbE1vdW50cyB9IGZyb20gXCIuL3dvcmtzcGFjZXMudHNcIjtcblxuY29uc3QgR0VOSUVfTUFOSUZFU1QgPSBwbHVnaW5SZWdpc3RyeS5kYXRhKGdlbmllKS5wbHVnaW4ubWFuaWZlc3Q7XG5jb25zdCBMQUtFQkFTRV9NQU5JRkVTVCA9IHBsdWdpblJlZ2lzdHJ5LmRhdGEobGFrZWJhc2UpLnBsdWdpbi5tYW5pZmVzdDtcblxuLyoqIENlaWxpbmcgb24gdGhlIGA/dGltZW91dE1zPWAgbG9uZy1wb2xsIGJ1ZGdldCBhIGNsaWVudCBtYXkgcmVxdWVzdC4gKi9cbmNvbnN0IE1BWF9FTUJFRF9QT0xMX1RJTUVPVVRfTVMgPSA1ICogNjBfMDAwO1xuXG4vKiogU3RhYmxlIGNsaWVudCBtZXNzYWdlIHdoZW4gdGhlIHdvcmtzcGFjZSdzIG1vZGVsIGNhdGFsb2d1ZSBjYW4ndCBiZSByZWFkLiAqL1xuY29uc3QgTU9ERUxfQ0FUQUxPR1VFX0ZBSUxFRF9NRVNTQUdFID0gXCJDb3VsZCBub3QgcmVhZCB0aGUgd29ya3NwYWNlJ3MgbW9kZWwgY2F0YWxvZ3VlXCI7XG5cbi8qKiBTdGFibGUgY2xpZW50IG1lc3NhZ2UgZm9yIGEgZmVlZGJhY2sgYm9keSB0aGF0IGZhaWxzIHNjaGVtYSB2YWxpZGF0aW9uLiAqL1xuY29uc3QgSU5WQUxJRF9GRUVEQkFDS19NRVNTQUdFID0gXCJJbnZhbGlkIGZlZWRiYWNrIHJlcXVlc3RcIjtcblxuLyoqIENhY2hlIG5hbWVzcGFjZSBmb3Igc3RhdGVtZW50IHJlc3VsdCBzZXRzLCBtYXRjaGluZyB0aGUgY2hhcnQgY2FjaGUncyBmb3JtLiAqL1xuY29uc3QgU1RBVEVNRU5UX0NBQ0hFX05BTUVTUEFDRSA9IFwibWFzdHJhOnN0YXRlbWVudFwiO1xuXG4vKipcbiAqIEFwcEtpdCBwbHVnaW4gKHJlZ2lzdGVyZWQgbmFtZTogYG1hc3RyYWApIHRoYXQgaG9zdHMgTWFzdHJhIGFnZW50c1xuICogd2l0aCBvcHRpb25hbCBMYWtlYmFzZS1iYWNrZWQgbWVtb3J5IGFuZCBBSSBTREsgY2hhdCByb3V0ZXMgdW5kZXJcbiAqIHRoZSBwbHVnaW4gbW91bnQgKHR5cGljYWxseSBgL2FwaS9tYXN0cmFgKS5cbiAqXG4gKiBAZXhhbXBsZSBSZWdpc3RlciB0aGUgcGx1Z2luXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY3JlYXRlQXBwLCBsYWtlYmFzZSB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IGNyZWF0ZUFnZW50LCBtYXN0cmEgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG4gKlxuICogLy8gYGxha2ViYXNlYCBmaXJzdDogcmVnaXN0ZXJpbmcgaXQgYXV0by1lbmFibGVzIE1hc3RyYSBzdG9yYWdlICsgbWVtb3J5LlxuICogY29uc3QgYXBwID0gYXdhaXQgY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW1xuICogICAgIGxha2ViYXNlKCksXG4gKiAgICAgbWFzdHJhKHtcbiAqICAgICAgIGdlbmllU3BhY2VzOiB7IGRlZmF1bHQ6IHByb2Nlc3MuZW52LkRBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSUQhIH0sXG4gKiAgICAgICBhZ2VudHM6IGNyZWF0ZUFnZW50KHtcbiAqICAgICAgICAgbmFtZTogXCJhbmFseXN0XCIsXG4gKiAgICAgICAgIGluc3RydWN0aW9uczogXCJZb3UgYW5zd2VyIHF1ZXN0aW9ucyBhYm91dCByZXZlbnVlIGFuZCByZXR1cm5zLlwiLFxuICogICAgICAgICBhc3luYyB0b29scyhwbHVnaW5zKSB7XG4gKiAgICAgICAgICAgcmV0dXJuIHsgLi4uKGF3YWl0IHBsdWdpbnMuZ2VuaWU/LnRvb2xraXQoKSkgfTtcbiAqICAgICAgICAgfSxcbiAqICAgICAgIH0pLFxuICogICAgIH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBSZWFkIHRoZSBhZ2VudHMgYmFjayBvZmYgdGhlIEFwcEtpdCBpbnN0YW5jZVxuICogYGBgdHNcbiAqIGNvbnN0IGFnZW50SWRzID0gYXBwLm1hc3RyYS5saXN0KCk7XG4gKiBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBhcHAubWFzdHJhLmxpc3RNb2RlbHMoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTWFzdHJhUGx1Z2luIGV4dGVuZHMgUGx1Z2luPE1hc3RyYVBsdWdpbkNvbmZpZz4ge1xuICAvLyBBbm5vdGF0ZWQgcmF0aGVyIHRoYW4gbGVmdCB0byBgc2F0aXNmaWVzYDogdGhlIGNvbmZpZyBzY2hlbWEncyB0eXBlIGNvbWVzXG4gIC8vIGZyb20gYEB0eXBlcy9qc29uLXNjaGVtYWAsIHdoaWNoIHRoaXMgcGFja2FnZSBkb2VzIG5vdCBkZXBlbmQgb24sIHNvIGFuXG4gIC8vIGluZmVycmVkIG1hbmlmZXN0IHR5cGUgY2Fubm90IGJlIG5hbWVkIGluIHRoZSBlbWl0dGVkIGRlY2xhcmF0aW9uLiBUaGVcbiAgLy8gYFBsdWdpbk1hbmlmZXN0PFwibWFzdHJhXCI+YCBwYXJhbWV0ZXIgc3RpbGwgY2FycmllcyB0aGUgbGl0ZXJhbCBuYW1lIGludG9cbiAgLy8gYHRvUGx1Z2luKClgJ3MgZmFjdG9yeSB0eXBlLlxuICBzdGF0aWMgbWFuaWZlc3Q6IFBsdWdpbk1hbmlmZXN0PFwibWFzdHJhXCI+ID0ge1xuICAgIG5hbWU6IFwibWFzdHJhXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiTWFzdHJhXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkJ1aWxkcyBhIE1hc3RyYSBBZ2VudCB3aXRoIHVzZXItc2NvcGVkIHdvcmtzcGFjZSBhdXRoIChhc1VzZXIpIFwiICtcbiAgICAgIFwiYW5kIG9wdGlvbmFsIFBvc3RncmVzLWJhY2tlZCBNYXN0cmEgTWVtb3J5IHZpYSB0aGUgYGxha2ViYXNlYCBwbHVnaW4uXCIsXG4gICAgc3RhYmlsaXR5OiBcImJldGFcIixcbiAgICByZXNvdXJjZXM6IHtcbiAgICAgIHJlcXVpcmVkOiBbXSxcbiAgICAgIG9wdGlvbmFsOiBbXG4gICAgICAgIC8vIFJldXNlIHRoZSBHZW5pZSBzcGFjZS1pZCBiaW5kaW5nIGRlY2xhcmVkIGJ5IEFwcEtpdCdzIGBnZW5pZWBcbiAgICAgICAgLy8gbWFuaWZlc3Qgc28gdGhlIHJlc291cmNlLWJpbmRpbmcgc2hhcGUgaXMgaWRlbnRpY2FsIHRvIEFwcEtpdCdzIGFuZFxuICAgICAgICAvLyBhbiBleGlzdGluZyBgYXBwLnlhbWxgIC8gYGdlbmllKHsgc3BhY2VzIH0pYCB3aXJpbmcga2VlcHMgd29ya2luZy5cbiAgICAgICAgLy8gVGhlIGJ1aWx0LWluIEdlbmllIHRvb2xzIHRhbGsgdG8gR2VuaWUgZGlyZWN0bHkgdGhyb3VnaFxuICAgICAgICAvLyBgQGRieC10b29scy9nZW5pZWAsIHNvIG9ubHkgdGhlIGJpbmRpbmcgaXMgc2hhcmVkLCBub3QgdGhlIHBsdWdpbidzXG4gICAgICAgIC8vIHRvb2xzLlxuICAgICAgICAuLi5HRU5JRV9NQU5JRkVTVC5yZXNvdXJjZXMucmVxdWlyZWQsXG4gICAgICAgIC4uLkxBS0VCQVNFX01BTklGRVNULnJlc291cmNlcy5yZXF1aXJlZCxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBjb25maWc6IHsgc2NoZW1hOiBNQVNUUkFfQ09ORklHX1NDSEVNQSB9LFxuICB9O1xuXG4gIC8qKlxuICAgKiBUaWdodGVuIHJlc291cmNlIHJlcXVpcmVtZW50cyBiYXNlZCBvbiB3aGljaCBmZWF0dXJlcyBhcmUgZW5hYmxlZC5cbiAgICogQXBwS2l0IGNhbGxzIHRoaXMgYXQgcmVnaXN0cmF0aW9uIHRpbWUgKGNvbmZpZy1hd2FyZSkgc28gZGlzYWJsZWRcbiAgICogZmVhdHVyZXMgZG9uJ3Qgc3VyZmFjZSB0aGVpciByZXNvdXJjZSBhc2tzIHRvIHRoZSBob3N0IGFwcC5cbiAgICovXG4gIHN0YXRpYyBnZXRSZXNvdXJjZVJlcXVpcmVtZW50cyhjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyk6IFJlc291cmNlUmVxdWlyZW1lbnRbXSB7XG4gICAgY29uc3QgcmVzb3VyY2VzOiBSZXNvdXJjZVJlcXVpcmVtZW50W10gPSBbXTtcbiAgICBjb25zdCBlbmFibGVkTWFuaWZlc3RzOiBQbHVnaW5NYW5pZmVzdDxzdHJpbmc+W10gPSBbXTtcblxuICAgIGlmIChuZWVkc0xha2ViYXNlKGNvbmZpZykpIHtcbiAgICAgIGVuYWJsZWRNYW5pZmVzdHMucHVzaChMQUtFQkFTRV9NQU5JRkVTVCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbSBvZiBlbmFibGVkTWFuaWZlc3RzKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIG0ucmVzb3VyY2VzLnJlcXVpcmVkKSB7XG4gICAgICAgIHJlc291cmNlcy5wdXNoKHsgLi4ucmVzb3VyY2UsIHJlcXVpcmVkOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzb3VyY2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dnZXIgPSBsb2cubG9nZ2VyKHRoaXMpO1xuICBwcml2YXRlIGJ1aWx0OiBCdWlsdEFnZW50cyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1hc3RyYTogTWFzdHJhIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWFzdHJhQXBwOiBleHByZXNzLkV4cHJlc3MgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtYXN0cmFTZXJ2ZXI6IE1hc3RyYVNlcnZlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IG91dHB1dFByb2Nlc3NvckZhY3RvcmllczogTWFzdHJhT3V0cHV0UHJvY2Vzc29yRmFjdG9yeVtdID0gW107XG4gIC8qKiBDb2RlLWRlZmluZWQgd29ya2Zsb3dzIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBNYXN0cmEgaW5zdGFuY2UgaXMgYnVpbHQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgd29ya2Zsb3dzOiBSZWNvcmQ8c3RyaW5nLCBBbnlXb3JrZmxvdz4gPSB7XG4gICAgLi4uKHRoaXMuY29uZmlnLndvcmtmbG93cyA/PyB7fSksXG4gIH07XG4gIC8qKlxuICAgKiBUaGUgb3B0aW9uYWwgTUNQIHNlcnZlciBleHBvc2luZyB0aGlzIHBsdWdpbidzIGFnZW50cyAvIHRvb2xzLCBvclxuICAgKiBgbnVsbGAgd2hlbiBgY29uZmlnLm1jcGAgaXMgZGlzYWJsZWQgKHRoZSBkZWZhdWx0KS4gQnVpbHQgaW5cbiAgICoge0BsaW5rIGJ1aWxkQWdlbnRBbmRTZXJ2ZXJ9IGFuZCByZWdpc3RlcmVkIG9uIHRoZSBNYXN0cmEgaW5zdGFuY2UuXG4gICAqL1xuICBwcml2YXRlIG1jcDogUmVzb2x2ZWRNY3AgfCBudWxsID0gbnVsbDtcbiAgLyoqIFJlc29sdmVkIGZlZWRiYWNrIGRlc3RpbmF0aW9uIHB1Ymxpc2hlZCB0byBzZXJ2ZXIgYW5kIGJyb3dzZXIgY2xpZW50cy4gKi9cbiAgcHJpdmF0ZSByZXNvbHZlZEZlZWRiYWNrTW9kZTogZmVlZGJhY2suRmVlZGJhY2tNb2RlID0gXCJub25lXCI7XG4gIC8qKlxuICAgKiBSZXNvbHZlZCB7QGxpbmsgTWFzdHJhSWRlbnRpdHlNb2RlfTogdGhlIGlkZW50aXR5IHRoZSBjaGF0IHBhdGgncyBEYXRhYnJpY2tzXG4gICAqIGNhbGxzIHJ1biBhcy4gUmVhZCBvbmNlIGF0IHNldHVwIHNvIGFuIGludmFsaWQgYGdlbmllSWRlbnRpdHlgIGZhaWxzIHRoZSBhcHBcbiAgICogYm9vdCByYXRoZXIgdGhhbiB0aGUgZmlyc3QgcmVxdWVzdCwgYW5kIHNvIGV2ZXJ5IHJlcXVlc3QgYWdyZWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBpZGVudGl0eU1vZGU6IE1hc3RyYUlkZW50aXR5TW9kZSA9IFwidXNlclwiO1xuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBSZXNvbHZlIHRoZSBpZGVudGl0eSBtb2RlIHVwIGZyb250IHNvIGFuIGludmFsaWQgYGdlbmllSWRlbnRpdHlgIGZhaWxzIHRoZVxuICAgIC8vIGFwcCBib290IHdpdGggYSBjbGVhciBtZXNzYWdlIHJhdGhlciB0aGFuIDUwMC1pbmcgdGhlIGZpcnN0IGNoYXQgcmVxdWVzdC5cbiAgICB0aGlzLmlkZW50aXR5TW9kZSA9IHJlc29sdmVJZGVudGl0eU1vZGUodGhpcy5jb25maWcuZ2VuaWVJZGVudGl0eSk7XG4gICAgY29uc3Qgc3BhY2VzID0gcmVzb2x2ZUdlbmllU3BhY2VzKHRoaXMuY29uZmlnLCB0aGlzLmNvbnRleHQpO1xuICAgIHRoaXMucmVzb2x2ZWRGZWVkYmFja01vZGUgPSByZXNvbHZlRmVlZGJhY2tNb2RlKHRoaXMuY29uZmlnLmZlZWRiYWNrTW9kZSwge1xuICAgICAgZ2VuaWU6IHRoaXMuY29uZmlnLmdlbmllQWdlbnRNb2RlICE9PSBmYWxzZSAmJiBPYmplY3Qua2V5cyhzcGFjZXMpLmxlbmd0aCA+IDAsXG4gICAgICBtbGZsb3c6IG1sZmxvd0VuYWJsZWQoKSxcbiAgICB9KTtcbiAgICB0aGlzLmNvbmZpZy5mZWVkYmFja01vZGUgPSB0aGlzLnJlc29sdmVkRmVlZGJhY2tNb2RlO1xuICAgIGlmICh0aGlzLmNvbmZpZy5vYnNlcnZhYmlsaXR5ICE9PSBmYWxzZSkge1xuICAgICAgYXdhaXQgYXBwa2l0VGVsZW1ldHJ5LmNvbmZpZ3VyZU5hdGl2ZUh0dHBUZWxlbWV0cnkoe1xuICAgICAgICAvLyBBIGxvdy1sZXZlbCByZXF1ZXN0IHdpdGhvdXQgYW4gYWN0aXZlIHNlbWFudGljIHNwYW4gYmVjb21lcyBhIG5vaXN5XG4gICAgICAgIC8vIHN0YW5kYWxvbmUgdHJhY2UuIFJlcXVlc3RzIGluc2lkZSBhbiBhZ2VudC90b29sIHNwYW4gcmVtYWluIHZpc2libGUuXG4gICAgICAgIG91dGdvaW5nRmlsdGVyOiBhcHBraXRUZWxlbWV0cnkuZXhjbHVkZVVucGFyZW50ZWRPdXRnb2luZ0h0dHBUZWxlbWV0cnksXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyQXBwTWxmbG93VHJhY2VJbmZvUHJvY2Vzc29yKCk7XG4gICAgfVxuICAgIC8vIFdhaXQgdW50aWwgc2libGluZyBwbHVnaW5zIChlLmcuIGBsYWtlYmFzZWApIGZpbmlzaCBgc2V0dXAoKWAgc29cbiAgICAvLyB0aGUgbGFrZWJhc2UgcG9vbCBpcyB2YWxpZCB3aGVuIHN0b3JhZ2UvbWVtb3J5IGFyZSBlbmFibGVkLlxuICAgIHRoaXMuY29udGV4dD8ub25MaWZlY3ljbGUoXCJzZXR1cDpjb21wbGV0ZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25maWd1cmVPdGVsUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuYXBwbHlMYWtlYmFzZUF1dG9EZWZhdWx0cygpO1xuICAgICAgYXdhaXQgdGhpcy5idWlsZEFnZW50QW5kU2VydmVyKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBpbnN0YW5jZSBhZ2VudC1iYWNrZWQgRGF0YWJyaWNrcyBjYWxscyBzaG91bGQgcnVuIHRocm91Z2ggZm9yXG4gICAqIGByZXFgLCBob25vcmluZyB7QGxpbmsgaWRlbnRpdHlNb2RlfS4gRGlyZWN0IEdlbmllIGNvbnZlcnNhdGlvbiByb3V0ZXMgdXNlXG4gICAqIEFwcEtpdCBPQk8gdGhyb3VnaCBgYXNVc2VyKHJlcSlgIGluc3RlYWQuXG4gICAqXG4gICAqIEluIGBcInVzZXJcImAgbW9kZSAodGhlIGRlZmF1bHQpIHRoaXMgaXMgYHRoaXMuYXNVc2VyKHJlcSlgIC0gQXBwS2l0J3Mgb3duXG4gICAqIHByb3h5IHRoYXQgcnVucyBldmVyeSBjYWxsIGluc2lkZSBgcnVuSW5Vc2VyQ29udGV4dGAsIHNvIGBnZXRFeGVjdXRpb25Db250ZXh0KClgXG4gICAqIHJldHVybnMgdGhlIGNhbGxlcidzIE9CTyBjbGllbnQuIEluIGBcInNlcnZpY2UtcHJpbmNpcGFsXCJgIG1vZGUgaXQgaXMgYHRoaXNgXG4gICAqIHVud3JhcHBlZCwgc28gdGhlIHNhbWUgbWV0aG9kcyBydW4gaW4gdGhlIGFtYmllbnQgc2VydmljZSBjb250ZXh0IGFuZFxuICAgKiBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYCByZXR1cm5zIHRoZSBhcHAgc2VydmljZSBwcmluY2lwYWwncyBjbGllbnQgLSB0aGUgc2FtZVxuICAgKiBcImp1c3QgZG9uJ3QgZW50ZXIgYGFzVXNlcmBcIiBwYXR0ZXJuIEFwcEtpdCdzIG93biBzZXJ2aWNlLWNvbnRleHQgY2FsbHMgdXNlLiBPbmVcbiAgICogaGVscGVyIGNvdmVycyB0aGUgYWdlbnQtYmFja2VkIHdvcmtzcGFjZSBjYWxscyAoc2VydmluZyBjYXRhbG9ndWUsIGdlbmVyYWxcbiAgICogc3VnZ2VzdGlvbnMsIGRpc3BhdGNoZWQgYGFza19nZW5pZWAsIHN0YXRlbWVudCBmZXRjaCwgZmVlZGJhY2spLCBzbyB0aGVcbiAgICogaWRlbnRpdHkgZGVjaXNpb24gbGl2ZXMgaW4gb25lIHBsYWNlLlxuICAgKi9cbiAgcHJpdmF0ZSBzY29wZWRTZWxmKHJlcTogZXhwcmVzcy5SZXF1ZXN0KTogdGhpcyB7XG4gICAgcmV0dXJuIHVzZVNlcnZpY2VQcmluY2lwYWwodGhpcy5pZGVudGl0eU1vZGUsIHJlcSkgPyB0aGlzIDogdGhpcy5hc1VzZXIocmVxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBgbGFrZWJhc2VgIHBsdWdpbiBpcyByZWdpc3RlcmVkLCBhdXRvLWVuYWJsZSBgc3RvcmFnZWBcbiAgICogYW5kIGBtZW1vcnlgIHVubGVzcyB0aGUgY2FsbGVyIG9wdGVkIG91dCBleHBsaWNpdGx5IChgZmFsc2VgIG9yIGFcbiAgICogY3VzdG9tIGNvbmZpZyBvYmplY3QpLiBSdW4gYWZ0ZXIgYHNldHVwOmNvbXBsZXRlYCBzbyB0aGUgbG9va3VwXG4gICAqIGlzIHJlbGlhYmxlOiBhbnkgcGx1Z2luIHRoYXQgcmVnaXN0ZXJzIGl0c2VsZiBzeW5jaHJvbm91c2x5IGlzXG4gICAqIGFscmVhZHkgaW4gdGhlIHJlZ2lzdHJ5IGJ5IHRoZSB0aW1lIHRoaXMgZmlyZXMuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5TGFrZWJhc2VBdXRvRGVmYXVsdHMoKTogdm9pZCB7XG4gICAgY29uc3QgaGFzTGFrZWJhc2UgPSBwbHVnaW5SZWdpc3RyeS5pbnN0YW5jZSh0aGlzLmNvbnRleHQsIGxha2ViYXNlKSAhPT0gdW5kZWZpbmVkO1xuICAgIGlmICghaGFzTGFrZWJhc2UpIHJldHVybjtcbiAgICBpZiAodGhpcy5jb25maWcuc3RvcmFnZSA9PT0gdW5kZWZpbmVkKSB0aGlzLmNvbmZpZy5zdG9yYWdlID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5jb25maWcubWVtb3J5ID09PSB1bmRlZmluZWQpIHRoaXMuY29uZmlnLm1lbW9yeSA9IHRydWU7XG4gIH1cblxuICAvKiogRHJhaW4gTWFzdHJhIHJlc291cmNlcywgdGhlbiBmbHVzaCBwZW5kaW5nIGRpcmVjdCBNTGZsb3cgdHJhY2VzLiAqL1xuICBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5tYXN0cmE/LnNodXRkb3duKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZsdXNoRGlyZWN0TWxmbG93VHJhY2luZygpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJlcnJvciBmbHVzaGluZyBkaXJlY3QgTUxmbG93IHRyYWNlc1wiLCB7XG4gICAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnIpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBleHBvcnRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAvKipcbiAgICAgICAqIElkcyBvZiBldmVyeSByZWdpc3RlcmVkIGFnZW50IGluIHJlZ2lzdHJhdGlvbiBvcmRlci4gTWF0Y2hlc1xuICAgICAgICogQXBwS2l0IGBhZ2VudHMubGlzdCgpYCBzbyBjYWxsZXJzIGNhbiBpdGVyYXRlIHRoZSByZWdpc3RyeSB0aGVcbiAgICAgICAqIHNhbWUgd2F5IHVuZGVyIGJvdGggcGx1Z2lucy5cbiAgICAgICAqL1xuICAgICAgbGlzdDogKCk6IHN0cmluZ1tdID0+IE9iamVjdC5rZXlzKHRoaXMuYnVpbHQ/LmFnZW50cyA/PyB7fSksXG4gICAgICAvKipcbiAgICAgICAqIExvb2sgdXAgYSByZWdpc3RlcmVkIGFnZW50IGJ5IGlkLiBSZXR1cm5zIGBudWxsYCAobm90XG4gICAgICAgKiB1bmRlZmluZWQpIHdoZW4gdW5rbm93biBzbyBjYWxsIHNpdGVzIGNhbiBlYXJseS1yZXR1cm4gd2l0aG91dFxuICAgICAgICogYSBzZXBhcmF0ZSBgaW5gIGNoZWNrLlxuICAgICAgICovXG4gICAgICBnZXQ6IChpZDogc3RyaW5nKTogQWdlbnQgfCBudWxsID0+IHRoaXMuYnVpbHQ/LmFnZW50c1tpZF0gPz8gbnVsbCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGFnZW50IHRoZSBjbGllbnQgY29udmVyc2VzIHdpdGggd2hlbiBpdCBkb2Vzbid0IG5hbWUgb25lLlxuICAgICAgICogUmVzb2x2ZXMgdG8gYGNvbmZpZy5kZWZhdWx0QWdlbnRgLCB0aGUgZmlyc3QgcmVnaXN0ZXJlZCBpZCwgb3JcbiAgICAgICAqIHRoZSBidWlsdC1pbiBgZGVmYXVsdGAgZmFsbGJhY2suXG4gICAgICAgKi9cbiAgICAgIGdldERlZmF1bHQ6ICgpOiBBZ2VudCB8IG51bGwgPT5cbiAgICAgICAgKHRoaXMuYnVpbHQgJiYgdGhpcy5idWlsdC5hZ2VudHNbdGhpcy5idWlsdC5kZWZhdWx0QWdlbnRJZF0pID8/IG51bGwsXG4gICAgICAvKipcbiAgICAgICAqIFJlZ2lzdGVyIGFuIG91dHB1dC1wcm9jZXNzb3IgZmFjdG9yeSBiZWZvcmUgYWdlbnRzIGFyZSBidWlsdC5cbiAgICAgICAqXG4gICAgICAgKiBEZWZlcnJlZCBzaWJsaW5nIHBsdWdpbnMgdXNlIHRoaXMgZ2VuZXJpYyBleHRlbnNpb24gcG9pbnQgd2l0aG91dFxuICAgICAgICogYWRkaW5nIHByb3ZpZGVyLXNwZWNpZmljIGJlaGF2aW9yIHRvIHRoZSBNYXN0cmEgcGx1Z2luLlxuICAgICAgICovXG4gICAgICByZWdpc3Rlck91dHB1dFByb2Nlc3NvcjogKGZhY3Rvcnk6IE1hc3RyYU91dHB1dFByb2Nlc3NvckZhY3RvcnkpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMuYnVpbHQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNYXN0cmEgb3V0cHV0IHByb2Nlc3NvcnMgbXVzdCBiZSByZWdpc3RlcmVkIGJlZm9yZSBhZ2VudHMgYXJlIGJ1aWx0XCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3V0cHV0UHJvY2Vzc29yRmFjdG9yaWVzLnB1c2goZmFjdG9yeSk7XG4gICAgICB9LFxuICAgICAgLyoqIFJlZ2lzdGVyIGEgd29ya2Zsb3cgYmVmb3JlIHRoZSBob3N0ZWQgTWFzdHJhIGluc3RhbmNlIGlzIGJ1aWx0LiAqL1xuICAgICAgcmVnaXN0ZXJXb3JrZmxvdzogKGtleTogc3RyaW5nLCB3b3JrZmxvdzogQW55V29ya2Zsb3cpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMubWFzdHJhKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWFzdHJhIHdvcmtmbG93cyBtdXN0IGJlIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBpbnN0YW5jZSBpcyBidWlsdFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy53b3JrZmxvd3Nba2V5XSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWFzdHJhIHdvcmtmbG93IGtleSBcIiR7a2V5fVwiIGlzIGFscmVhZHkgcmVnaXN0ZXJlZGApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMud29ya2Zsb3dzW2tleV0gPSB3b3JrZmxvdztcbiAgICAgIH0sXG4gICAgICAvKiogUmVnaXN0ZXJlZCB3b3JrZmxvdyBrZXlzIGluIGluc2VydGlvbiBvcmRlci4gKi9cbiAgICAgIGxpc3RXb3JrZmxvd3M6ICgpOiBzdHJpbmdbXSA9PiBPYmplY3Qua2V5cyh0aGlzLndvcmtmbG93cyksXG4gICAgICAvKiogVW5kZXJseWluZyBNYXN0cmEgaW5zdGFuY2UgZm9yIGFkdmFuY2VkIHVzZSAoY3VzdG9tIHJvdXRlcyBldGMuKS4gKi9cbiAgICAgIGdldE1hc3RyYTogKCkgPT4gdGhpcy5tYXN0cmEsXG4gICAgICAvKipcbiAgICAgICAqIEJ1aWxkIHRoZSBgUmVxdWVzdENvbnRleHRgIGFuIGFnZW50IHR1cm4gZHJpdmVuIGZyb20gT1VUU0lERSB0aGlzXG4gICAgICAgKiBwbHVnaW4ncyByb3V0ZXMgbmVlZHMsIHN1Y2ggYXMgYW5vdGhlciBwbHVnaW4ncyBlbmRwb2ludCBvciBhIHNjaGVkdWxlZFxuICAgICAgICogam9iLlxuICAgICAgICpcbiAgICAgICAqIE1hc3RyYSdzIHVzZXItc2NvcGVkIHRvb2xzIC0gYGFza19nZW5pZWAgbW9zdCB2aXNpYmx5IC0gcmVhZCB0aGUgQXBwS2l0XG4gICAgICAgKiB1c2VyIG9mZiB0aGUgcmVxdWVzdCBjb250ZXh0LCB3aGljaCBvbmx5IHRoZSBIVFRQIG1pZGRsZXdhcmUgc3RhbXBzLlxuICAgICAgICogQ2FsbGluZyBgYWdlbnQuZ2VuZXJhdGVgIHdpdGggYSByYXcgcHJvbXB0IHRoZXJlZm9yZSBhbnN3ZXJzIFwidGhlIGRhdGFcbiAgICAgICAqIHNvdXJjZSBpcyB1bnJlYWNoYWJsZVwiIHdoZXJlIHRoZSBjaGF0IHJvdXRlcyBhbnN3ZXIgd2l0aCByZWFsIGRhdGEuXG4gICAgICAgKiBQYXNzaW5nIHRoaXMgYXMgYHJlcXVlc3RDb250ZXh0YCBjbG9zZXMgdGhhdCBnYXAsIHNvIGFuIG91dC1vZi1iYW5kIHR1cm5cbiAgICAgICAqIGhhcyBleGFjdGx5IHRoZSBjYXBhYmlsaXRpZXMgYSBjaGF0IHR1cm4gaGFzLlxuICAgICAgICpcbiAgICAgICAqIE11c3QgYmUgY2FsbGVkIElOU0lERSBhbiBgYXNVc2VyKHJlcSlgIHNjb3BlIHRvIGluaGVyaXQgdGhlIGNhbGxlcidzXG4gICAgICAgKiBPQk8gaWRlbnRpdHk7IG91dHNpZGUgb25lIGl0IHJlc29sdmVzIHRvIHRoZSBzZXJ2aWNlIHByaW5jaXBhbC5cbiAgICAgICAqL1xuICAgICAgY3JlYXRlUmVxdWVzdENvbnRleHQ6IChcbiAgICAgICAgb3B0aW9uczogeyB0aHJlYWRJZD86IHN0cmluZzsgcmVzb3VyY2VJZD86IHN0cmluZzsgcmVxdWVzdElkPzogc3RyaW5nIH0gPSB7fSxcbiAgICAgICk6IFByb21pc2U8UmVxdWVzdENvbnRleHQ+ID0+IGNyZWF0ZVJlcXVlc3RDb250ZXh0KG9wdGlvbnMpLFxuICAgICAgLyoqXG4gICAgICAgKiBNQ1AgZW5kcG9pbnQgaW5mbyB3aGVuIGBjb25maWcubWNwYCBpcyBlbmFibGVkLCBlbHNlIGBudWxsYC5cbiAgICAgICAqIFN0cmVhbWFibGUgSFRUUCBpcyBgaHR0cGA7IHRoZSBTU0UgcGFpciBpcyB0aGUgbGVnYWN5IHRyYW5zcG9ydC5cbiAgICAgICAqXG4gICAgICAgKiBFYWNoIHBhdGggaXMgZ2l2ZW4gdHdpY2U6IG1vdW50LXJlbGF0aXZlIChgaHR0cFBhdGhgLCBgc3NlUGF0aGAsXG4gICAgICAgKiBgbWVzc2FnZVBhdGhgKSBmb3IgYW55dGhpbmcgdGhhdCBhbHJlYWR5IGtub3dzIHdoZXJlIHRoZSBwbHVnaW4gaXNcbiAgICAgICAqIG1vdW50ZWQsIGFuZCBhYnNvbHV0ZSAoYGh0dHBgLCBgc3NlYCwgYG1lc3NhZ2VzYCkgZm9yIE1DUCBjbGllbnRzLFxuICAgICAgICogd2hpY2ggdGFrZSBhIHNpbmdsZSBVUkwgYW5kIGNhbm5vdCBjb21wb3NlIG9uZS4gVGhlIGFic29sdXRlIGZvcm0gaXNcbiAgICAgICAqIGJ1aWx0IGZyb20ge0BsaW5rIGJhc2VQYXRofSwgc28gaXQgaG9ub3JzIGEgYGNvbmZpZy5uYW1lYCBvdmVycmlkZSBidXRcbiAgICAgICAqIHN0aWxsIGFzc3VtZXMgQXBwS2l0J3MgZGVmYXVsdCBgL2FwaS88bmFtZT5gIG1vdW50LlxuICAgICAgICovXG4gICAgICBnZXRNY3A6ICgpOiB7XG4gICAgICAgIHNlcnZlcklkOiBzdHJpbmc7XG4gICAgICAgIGh0dHBQYXRoOiBzdHJpbmc7XG4gICAgICAgIHNzZVBhdGg6IHN0cmluZztcbiAgICAgICAgbWVzc2FnZVBhdGg6IHN0cmluZztcbiAgICAgICAgaHR0cDogc3RyaW5nO1xuICAgICAgICBzc2U6IHN0cmluZztcbiAgICAgICAgbWVzc2FnZXM6IHN0cmluZztcbiAgICAgIH0gfCBudWxsID0+XG4gICAgICAgIHRoaXMubWNwXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHNlcnZlcklkOiB0aGlzLm1jcC5zZXJ2ZXJJZCxcbiAgICAgICAgICAgICAgaHR0cFBhdGg6IHRoaXMubWNwLmh0dHBQYXRoLFxuICAgICAgICAgICAgICBzc2VQYXRoOiB0aGlzLm1jcC5zc2VQYXRoLFxuICAgICAgICAgICAgICBtZXNzYWdlUGF0aDogdGhpcy5tY3AubWVzc2FnZVBhdGgsXG4gICAgICAgICAgICAgIGh0dHA6IGAke3RoaXMuYmFzZVBhdGh9JHt0aGlzLm1jcC5odHRwUGF0aH1gLFxuICAgICAgICAgICAgICBzc2U6IGAke3RoaXMuYmFzZVBhdGh9JHt0aGlzLm1jcC5zc2VQYXRofWAsXG4gICAgICAgICAgICAgIG1lc3NhZ2VzOiBgJHt0aGlzLmJhc2VQYXRofSR7dGhpcy5tY3AubWVzc2FnZVBhdGh9YCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IG51bGwsXG4gICAgICAvKiogRXhwcmVzcyBzdWJhcHAgTWFzdHJhIGlzIG1vdW50ZWQgb247IG1vc3RseSBmb3IgdGVzdHMuICovXG4gICAgICBnZXRNYXN0cmFTZXJ2ZXI6ICgpID0+IHRoaXMubWFzdHJhU2VydmVyLFxuICAgICAgLyoqXG4gICAgICAgKiBGZXRjaCB0aGUgd29ya3NwYWNlJ3MgTW9kZWwgU2VydmluZyBlbmRwb2ludHMgKGNhY2hlZCkuIFNhbWVcbiAgICAgICAqIHBheWxvYWQgdGhlIGBHRVQgL21vZGVsc2Agcm91dGUgcmV0dXJuczsgc3VyZmFjZWQgaGVyZSBzb1xuICAgICAgICogb3RoZXIgcGx1Z2lucyAvIHNjcmlwdHMgY2FuIGludHJvc3BlY3QgdGhlIGNhdGFsb2d1ZSB3aXRob3V0XG4gICAgICAgKiBhbiBIVFRQIHJvdW5kLXRyaXAuIEFwcEtpdCB3cmFwcyB0aGlzIHdpdGggYGFzVXNlcihyZXEpYCBmb3JcbiAgICAgICAqIE9CTyBzY29waW5nIGF1dG9tYXRpY2FsbHkuIFRocm93cyB3aGVuIHRoZSBsaXN0aW5nIGZhaWxzLCBzaW5jZVxuICAgICAgICogdGhlcmUgaXMgbm8gc3RhdHVzIGNvZGUgdG8gaGFuZCBiYWNrIG9uIHRoaXMgc3VyZmFjZS5cbiAgICAgICAqL1xuICAgICAgbGlzdE1vZGVsczogKCk6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiA9PiB0aGlzLmxpc3RNb2RlbHMoKSxcbiAgICAgIC8qKlxuICAgICAgICogRm9yY2UtZXZpY3QgY2FjaGVkIGVuZHBvaW50IGxpc3RpbmdzIHZpYSBBcHBLaXQnc1xuICAgICAgICogYENhY2hlTWFuYWdlcmAuIFVzZWZ1bCBpbiB0ZXN0cyBvciByaWdodCBhZnRlciBhbiBhZG1pblxuICAgICAgICogZGVwbG95cyBhIG5ldyBlbmRwb2ludCBhbmQgZG9lc24ndCB3YW50IHRvIHdhaXQgZm9yIHRoZSBUVEwuXG4gICAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGBDYWNoZU1hbmFnZXIuZGVsZXRlYC9gY2xlYXJgIHByb21pc2UuXG4gICAgICAgKi9cbiAgICAgIGNsZWFyTW9kZWxzQ2FjaGU6IChob3N0Pzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PlxuICAgICAgICBtb2RlbENhdGFsb2cuY2xlYXJTZXJ2aW5nRW5kcG9pbnRzQ2FjaGUoaG9zdCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBtb3VudCB0aGlzIHBsdWdpbidzIHJvdXRlcyBhbnN3ZXIgb24uIEFwcEtpdCBtb3VudHMgZXZlcnkgcGx1Z2luXG4gICAqIGF0IGAvYXBpLzxwbHVnaW4ubmFtZT5gIGFuZCBgdGhpcy5uYW1lYCBob25vcnMgYSBgY29uZmlnLm5hbWVgIG92ZXJyaWRlLFxuICAgKiBzbyB0aGUgcGVyLXJvdXRlIHNlZ21lbnRzIChgcm91dGVzLk1BU1RSQV9ST1VURVNgKSBoYW5nIG9mZiB0aGlzLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgYmFzZVBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC9hcGkvJHt0aGlzLm5hbWV9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNsaWVudENvbmZpZygpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgLy8gUHVibGlzaGluZyBgYmFzZVBhdGhgIGlzIGVub3VnaCBmb3IgdGhlIGNsaWVudCB0byBzdGF5IGNvcnJlY3QgdW5kZXIgYVxuICAgIC8vIGN1c3RvbSBtb3VudCBpZDogdGhlIHBlci1yb3V0ZSBzZWdtZW50cyBhcmUgZml4ZWRcbiAgICAvLyAoYHJvdXRlcy5NQVNUUkFfUk9VVEVTYCkgYW5kIHRoZSBjbGllbnQgKGBNYXN0cmFQbHVnaW5DbGllbnRgKSBkZXJpdmVzXG4gICAgLy8gZXZlcnkgZW5kcG9pbnQgZnJvbSBgYmFzZVBhdGhgLlxuICAgIC8vIFJldHVybiB3aWRlbnMgdG8gYFJlY29yZDxzdHJpbmcsIHVua25vd24+YCB0byBzYXRpc2Z5IHRoZVxuICAgIC8vIGJhc2UtY2xhc3Mgc2lnbmF0dXJlOyBjb25zdW1lcnMgcmVhZCBpdCB0aHJvdWdoIHRoZSB0eXBlZFxuICAgIC8vIGBNYXN0cmFDbGllbnRDb25maWdgIHNoYXBlIHZpYSBgdXNlUGx1Z2luQ2xpZW50Q29uZmlnPC4uLj4oLi4uKWAuXG4gICAgY29uc3QgZm9sbG93VXBzID0gcmVzb2x2ZUZvbGxvd1VwU3VnZ2VzdGlvbnNDb25maWcodGhpcy5jb25maWcuZm9sbG93VXBTdWdnZXN0aW9ucyk7XG4gICAgY29uc3QgY29uZmlnOiBNYXN0cmFDbGllbnRDb25maWcgPSB7XG4gICAgICBiYXNlUGF0aDogdGhpcy5iYXNlUGF0aCxcbiAgICAgIGRlZmF1bHRBZ2VudDogdGhpcy5idWlsdD8uZGVmYXVsdEFnZW50SWQgPz8gRkFMTEJBQ0tfQUdFTlRfSUQsXG4gICAgICBhZ2VudHM6IE9iamVjdC5rZXlzKHRoaXMuYnVpbHQ/LmFnZW50cyA/PyB7fSksXG4gICAgICBmZWVkYmFja01vZGU6IHRoaXMuZmVlZGJhY2tNb2RlKCksXG4gICAgICBiYWNrZ3JvdW5kVHVybnM6IHRoaXMuY29uZmlnLmJhY2tncm91bmRUdXJucyAhPT0gZmFsc2UsXG4gICAgICBmb2xsb3dVcFN1Z2dlc3Rpb25zOiBmb2xsb3dVcHM/Lm1vZGUgPz8gXCJub25lXCIsXG4gICAgICBmb2xsb3dVcFN1Z2dlc3Rpb25MaW1pdDogZm9sbG93VXBzPy5saW1pdCA/PyAzLFxuICAgICAgLy8gSW4gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIHRoZSBjaGF0IHdvcmtzIGZvciBhbnkgY2FsbGVyIHdobyBjYW4gb3BlblxuICAgICAgLy8gdGhlIGFwcCwgc28gYSBVSSB0aGF0IGhpZGVzIGNoYXQgYmVoaW5kIGFuIE9CTy10b2tlbiBwcm9iZSBzaG91bGQgc2hvd1xuICAgICAgLy8gaXQgcmVnYXJkbGVzcy4gYFwidXNlclwiYCBtb2RlIGtlZXBzIHRoZSBPQk8tZ2F0ZWQgYmVoYXZpb3IuXG4gICAgICBjaGF0QWx3YXlzQXZhaWxhYmxlOiB0aGlzLmlkZW50aXR5TW9kZSA9PT0gXCJzZXJ2aWNlLXByaW5jaXBhbFwiLFxuICAgIH07XG4gICAgcmV0dXJuIGNvbmZpZyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgLyoqIFJlc29sdmUgdGhlIG9ubHkgZmVlZGJhY2sgZGVzdGluYXRpb24gZXhwb3NlZCBmb3IgdGhpcyBwbHVnaW4gbW9kZS4gKi9cbiAgcHJpdmF0ZSBmZWVkYmFja01vZGUoKTogZmVlZGJhY2suRmVlZGJhY2tNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZEZlZWRiYWNrTW9kZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGluamVjdFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyTWNwUm91dGVzKHJvdXRlcik7XG4gICAgdGhpcy5yZWdpc3Rlck1vZGVsUm91dGVzKHJvdXRlcik7XG4gICAgdGhpcy5yZWdpc3RlckVtYmVkUm91dGVzKHJvdXRlcik7XG4gICAgdGhpcy5yZWdpc3RlclN1Z2dlc3Rpb25Sb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyR2VuaWVDaGF0Um91dGVzKHJvdXRlcik7XG4gICAgdGhpcy5yZWdpc3RlckZlZWRiYWNrUm91dGVzKHJvdXRlcik7XG4gICAgdGhpcy5yZWdpc3Rlck1sZmxvd0V4cGVyaW1lbnRSb3V0ZShyb3V0ZXIpO1xuICAgIHRoaXMucmVnaXN0ZXJBZ2VudFJvdXRlcyhyb3V0ZXIpO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIFVSTCBhbGlhc2VzIGZvciBNYXN0cmEncyBNQ1AgdHJhbnNwb3J0cy4gKi9cbiAgcHJpdmF0ZSByZWdpc3Rlck1jcFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICAvLyBFeHBvc2UgdGhlIE1DUCB0cmFuc3BvcnQgYXQgdGhlIGNsZWFuIGAvbWNwYCAocGx1cyB0aGUgbGVnYWN5XG4gICAgLy8gYC9zc2VgICsgYC9tZXNzYWdlc2ApIHVuZGVyIHRoZSBwbHVnaW4gbW91bnQuIGBAbWFzdHJhL2V4cHJlc3NgXG4gICAgLy8gbW91bnRzIE1DUCB1bmRlciBgL21jcC88c2VydmVySWQ+Lzx0cmFuc3BvcnQ+YCwgYW5kIHRoZSBzZXJ2ZXJJZFxuICAgIC8vIGRlZmF1bHRzIHRvIHRoZSBwbHVnaW4gbmFtZSwgc28gdGhlIHJhdyByb3V0ZSByZWFkc1xuICAgIC8vIGAvYXBpL21hc3RyYS9tY3AvbWFzdHJhL21jcGAgKGRvdWJsZWQgc2VnbWVudCkuIFRoaXMgcnVucyBiZWZvcmVcbiAgICAvLyB0aGUgY2F0Y2gtYWxsIGFuZCByZXdyaXRlcyB0aGUgYWxpYXMgdG8gdGhlIHVuZGVybHlpbmcgcm91dGUsIHNvXG4gICAgLy8gdGhlIHB1YmxpYyBwYXRoIGlzIGp1c3QgYC9hcGkvPHBsdWdpbj4vbWNwYDsgdGhlIHF1ZXJ5IHN0cmluZ1xuICAgIC8vIChlLmcuIHRoZSBTU0UgYHNlc3Npb25JZGApIGlzIHByZXNlcnZlZC5cbiAgICAvL1xuICAgIC8vIE1pZGRsZXdhcmUgcmF0aGVyIHRoYW4gYHRoaXMucm91dGVgOiBpdCByZXdyaXRlcyB0aGUgVVJMIGZvciByb3V0ZXNcbiAgICAvLyBgQG1hc3RyYS9leHByZXNzYCBvd25zIGZ1cnRoZXIgZG93biB0aGUgY2hhaW4gaW5zdGVhZCBvZiBhbnN3ZXJpbmcgdGhlXG4gICAgLy8gcmVxdWVzdCwgd2hpY2ggYFJvdXRlQ29uZmlnYCBoYXMgbm8gc2hhcGUgZm9yLlxuICAgIHJvdXRlci51c2UoKHJlcSwgX3JlcywgbmV4dCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5tY3BSb3V0ZUFsaWFzKHJlcS5wYXRoKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgY29uc3QgcSA9IHJlcS51cmwuaW5kZXhPZihcIj9cIik7XG4gICAgICAgIHJlcS51cmwgPSBxID49IDAgPyB0YXJnZXQgKyByZXEudXJsLnNsaWNlKHEpIDogdGFyZ2V0O1xuICAgICAgfVxuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIG1vZGVsIGNhdGFsb2d1ZSBhbmQgcGVyLWFnZW50IGRlZmF1bHQtbW9kZWwgcm91dGVzLiAqL1xuICBwcml2YXRlIHJlZ2lzdGVyTW9kZWxSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgLy8gYEdFVCAvbW9kZWxzYCBleHBvc2VzIHRoZSBjYWNoZWQgZW5kcG9pbnQgbGlzdCBzbyBjbGllbnRzIGNhblxuICAgIC8vIHBvcHVsYXRlIG1vZGVsIHBpY2tlcnMsIHZhbGlkYXRlIGA/bW9kZWw9YCBjaG9pY2VzLCBldGMuIE11c3RcbiAgICAvLyBiZSByZWdpc3RlcmVkIGJlZm9yZSB0aGUgY2F0Y2gtYWxsIHRoYXQgZm9yd2FyZHMgZXZlcnl0aGluZyB0b1xuICAgIC8vIHRoZSBNYXN0cmEgc3ViYXBwLlxuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcIm1vZGVsc1wiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogcm91dGVzLk1BU1RSQV9ST1VURVMubW9kZWxzLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2NvcGVkU2VsZihyZXEpLmxpc3RNb2RlbHNSZXN1bHQoKTtcbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBcIm1vZGVsc1wiLCBNT0RFTF9DQVRBTE9HVUVfRkFJTEVEX01FU1NBR0UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXMuanNvbih7IGVuZHBvaW50czogcmVzdWx0LmRhdGEgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gYEdFVCAvZGVmYXVsdC1tb2RlbGAgKGFuZCBgL2RlZmF1bHQtbW9kZWwvOmFnZW50SWRgKSByZXBvcnRzIHdoYXQgYW5cbiAgICAvLyB1bnBpbm5lZCB0dXJuIHdpbGwgdXNlLiBBIGNvbmZpZ3VyZWQgc3RyaW5nIGlzIHJldHVybmVkIGRpcmVjdGx5OyBhblxuICAgIC8vIGF1dG9tYXRpYyBkZWZhdWx0IHJlc29sdmVzIHRoZSBoaWdoZXN0LXJhbmtlZCBjdXJyZW50bHkgYXZhaWxhYmxlIEdQVFxuICAgIC8vIChvciBnZW5lcmFsIGNoYXQgZmFsbGJhY2spIGZyb20gdGhlIHNhbWUgT0JPLXNjb3BlZCBsaXZlIGNhdGFsb2d1ZSBhc1xuICAgIC8vIGAvbW9kZWxzYDsgYSBjdXN0b20gZHluYW1pYyByZXNvbHZlciByZW1haW5zIG51bGwgYmVjYXVzZSBpdCBpcyBjYWxsLXRpbWVcbiAgICAvLyBhcHBsaWNhdGlvbiBjb2RlLlxuICAgIGNvbnN0IGhhbmRsZURlZmF1bHRNb2RlbCA9IGFzeW5jIChcbiAgICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgICAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICAgICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdGVkID0gc3RyaW5nVXRpbHMuZmlyc3ROb25FbXB0eShyZXEucGFyYW1zLmFnZW50SWQpO1xuICAgICAgaWYgKHJlcXVlc3RlZCAhPT0gbnVsbCAmJiAhdGhpcy5idWlsdD8uYWdlbnRzW3JlcXVlc3RlZF0pIHtcbiAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogdGhpcy51bmtub3duQWdlbnRNZXNzYWdlKHJlcXVlc3RlZCkgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFnZW50SWQgPSByZXF1ZXN0ZWQgPz8gdGhpcy5idWlsdD8uZGVmYXVsdEFnZW50SWQgPz8gRkFMTEJBQ0tfQUdFTlRfSUQ7XG4gICAgICBjb25zdCBpbnRlbnQgPSB0aGlzLmJ1aWx0Py5kZWZhdWx0TW9kZWxzW2FnZW50SWRdO1xuICAgICAgbGV0IG1vZGVsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgIGlmIChpbnRlbnQ/LmtpbmQgPT09IFwiY29uZmlndXJlZFwiKSB7XG4gICAgICAgIG1vZGVsID0gaW50ZW50Lm1vZGVsO1xuICAgICAgfSBlbHNlIGlmIChpbnRlbnQ/LmtpbmQgPT09IFwiYXV0b1wiKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2NvcGVkU2VsZihyZXEpLmxpc3RNb2RlbHNSZXN1bHQoKTtcbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBcImRlZmF1bHQtbW9kZWxcIiwgTU9ERUxfQ0FUQUxPR1VFX0ZBSUxFRF9NRVNTQUdFKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBtb2RlbCA9IHJlc29sdmVEZWZhdWx0TW9kZWxJZCh0aGlzLmNvbmZpZywgcmVzdWx0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXMuanNvbih7XG4gICAgICAgIGFnZW50SWQsXG4gICAgICAgIG1vZGVsLFxuICAgICAgICBkaXNwbGF5TmFtZTogbW9kZWwgPyBkaXNwbGF5LnRvTW9kZWxEaXNwbGF5TmFtZShtb2RlbCkgOiBudWxsLFxuICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJkZWZhdWx0TW9kZWxcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IHJvdXRlcy5NQVNUUkFfUk9VVEVTLmRlZmF1bHRNb2RlbCxcbiAgICAgIGhhbmRsZXI6IGhhbmRsZURlZmF1bHRNb2RlbCxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJkZWZhdWx0TW9kZWxCeUFnZW50XCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBgJHtyb3V0ZXMuTUFTVFJBX1JPVVRFUy5kZWZhdWx0TW9kZWx9LzphZ2VudElkYCxcbiAgICAgIGhhbmRsZXI6IGhhbmRsZURlZmF1bHRNb2RlbCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciB0aGUgZ2VuZXJpYyBjaGFydCBhbmQgc3RhdGVtZW50IGVtYmVkIHJlc29sdmVyLiAqL1xuICBwcml2YXRlIHJlZ2lzdGVyRW1iZWRSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgLy8gYEdFVCAvZW1iZWQvOnR5cGUvOmlkYCBpcyB0aGUgc2luZ2xlIHJlc29sdmVyIGZvciBldmVyeSBlbWJlZFxuICAgIC8vIG1hcmtlciB0aGUgYWdlbnQgZW1pdHMgaW4gcHJvc2UgKGBbY2hhcnQ6PGlkPl1gLFxuICAgIC8vIGBbZGF0YTo8aWQ+XWAsIC4uLikuIGA6dHlwZWAgc2VsZWN0cyBhIHJlc29sdmVyIGZyb20gdGhlXG4gICAgLy8gcmVnaXN0cnkgYmVsb3c7IGA6aWRgIGlzIHRoYXQgcmVzb2x2ZXIncyBsb29rdXAga2V5LiBUaGUgbWFya2VyIGdyYW1tYXJcbiAgICAvLyBpcyB0eXBlLWFnbm9zdGljOyB0aGUgY2xpZW50IHN0aWxsIGNob29zZXMgaG93IGVhY2ggcmVnaXN0ZXJlZCB0eXBlXG4gICAgLy8gcmVuZGVycy5cbiAgICAvL1xuICAgIC8vIFN0YXR1cyBjb2RlczpcbiAgICAvLyAgIC0gMjAwIHdpdGggdGhlIHJlc29sdmVyJ3MgSlNPTiBib2R5IHdoZW4gdGhlIGlkIHJlc29sdmVzLlxuICAgIC8vICAgLSA0MDQgd2hlbiBgOnR5cGVgIGlzbid0IHJlZ2lzdGVyZWQgKHVuc3VwcG9ydGVkIGVtYmVkXG4gICAgLy8gICAgIHR5cGUpIE9SIGEgcmVnaXN0ZXJlZCByZXNvbHZlciBjYW4ndCBmaW5kIGA6aWRgICh1bmtub3duXG4gICAgLy8gICAgIC8gZXhwaXJlZCAtIGUuZy4gYSBjaGFydCBwYXN0IGl0cyAxaCBUVEwgb3IgYSBmYWJyaWNhdGVkXG4gICAgLy8gICAgIGlkIHRoZSBtb2RlbCBuZXZlciBtaW50ZWQpLlxuICAgIC8vICAgLSA0MDAgd2hlbiBgOmlkYCBpcyBlbXB0eS5cbiAgICAvL1xuICAgIC8vIFBlci10eXBlIHF1ZXJ5IGtub2JzIGFuZCBiZWhhdmlvcjpcbiAgICAvLyAgIC0gYGNoYXJ0YDogbG9uZy1wb2xscyB0aGUgY2hhcnQgY2FjaGUgdW50aWwgdGhlIGVudHJ5XG4gICAgLy8gICAgIHNldHRsZXMgKGByZXN1bHRgIC8gYGVycm9yYCkgb3IgdGhlIGJ1ZGdldCBlbGFwc2VzICh0aGVuXG4gICAgLy8gICAgIHJldHVybnMgdGhlIHN0aWxsLXByb2Nlc3NpbmcgZW50cnkgdG8gcG9sbCBhZ2FpbikuXG4gICAgLy8gICAgIGA/dGltZW91dE1zPTxuPmAgKGRlZmF1bHQgNjBzLCBjYXBwZWQgNW1pbikgdHVuZXMgaXQuXG4gICAgLy8gICAtIGBkYXRhYDogb25lIFN0YXRlbWVudCBFeGVjdXRpb24gZmV0Y2ggdW5kZXIgYGdlbmllSWRlbnRpdHlgLlxuICAgIC8vICAgLSBgdmlzdWFsaXphdGlvbmA6IHRoZSBzYW1lIHBheWxvYWQgdW5kZXIgbWFuZGF0b3J5IE9CTyBpZGVudGl0eSBmb3JcbiAgICAvLyAgICAgZGlyZWN0IEdlbmllIGNoYXQsIHdob3NlIGNvbnZlcnNhdGlvbnMgYmVsb25nIHRvIHRoZSBzaWduZWQtaW4gdXNlci5cbiAgICAvLyAgICAgYD9saW1pdD08bj5gIGNhcHMgcm93cyAoY2xhbXBlZCB0byBTVEFURU1FTlRfUk9XX0NBUCkuXG4gICAgLy9cbiAgICAvLyBCdWlsdCBvbmNlICh0aGlzIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCBvbmNlKSBhbmQga2V5ZWQgYnkgdGhlXG4gICAgLy8gcmF3IGA6dHlwZWAgdG9rZW4uIEVhY2ggcmVzb2x2ZXIgZ2V0cyB0aGUgcmVxdWVzdCAoZm9yIHF1ZXJ5XG4gICAgLy8gcGFyc2luZyArIE9CTyBzY29waW5nKSBhbmQgYW4gYEFib3J0U2lnbmFsYCBicmlkZ2VkIG9mZiB0aGVcbiAgICAvLyBjb25uZWN0aW9uIGBjbG9zZWAgZXZlbnQgc28gYSBsb25nLXBvbGwgdW5ibG9ja3MgdGhlIGluc3RhbnRcbiAgICAvLyB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzLiBgdW5kZWZpbmVkYCBmcm9tIGEgcmVzb2x2ZXIgbWFwcyB0byBhXG4gICAgLy8gY2xlYW4gNDA0OyB0aHJvd24gZXJyb3JzIGJ1YmJsZSB0aHJvdWdoIGBuZXh0KGVycilgLlxuICAgIGNvbnN0IGVtYmVkUmVzb2x2ZXJzOiBSZWNvcmQ8c3RyaW5nLCBFbWJlZFJlc29sdmVyPiA9IHtcbiAgICAgIGNoYXJ0OiAocmVxLCBpZCwgc2lnbmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXRNcyA9IHBhcnNlVGltZW91dE1zKHJlcS5xdWVyeS50aW1lb3V0TXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5zY29wZWRTZWxmKHJlcSkuZmV0Y2hDaGFydEVudHJ5KHJlcSwgaWQsIHtcbiAgICAgICAgICAuLi4odGltZW91dE1zICE9PSB1bmRlZmluZWQgPyB7IHRpbWVvdXRNcyB9IDoge30pLFxuICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZGF0YTogKHJlcSwgaWQsIHNpZ25hbCkgPT4ge1xuICAgICAgICBjb25zdCBsaW1pdCA9IHBhcnNlU3RhdGVtZW50TGltaXQocmVxLnF1ZXJ5LmxpbWl0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGVkU2VsZihyZXEpLmZldGNoU3RhdGVtZW50KGlkLCB7XG4gICAgICAgICAgLi4uKGxpbWl0ICE9PSB1bmRlZmluZWQgPyB7IGxpbWl0IH0gOiB7fSksXG4gICAgICAgICAgc2lnbmFsLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICB2aXN1YWxpemF0aW9uOiAocmVxLCBpZCwgc2lnbmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gcGFyc2VTdGF0ZW1lbnRMaW1pdChyZXEucXVlcnkubGltaXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5hc1VzZXIocmVxKS5mZXRjaFN0YXRlbWVudChpZCwge1xuICAgICAgICAgIC4uLihsaW1pdCAhPT0gdW5kZWZpbmVkID8geyBsaW1pdCB9IDoge30pLFxuICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJlbWJlZFwiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogYCR7cm91dGVzLk1BU1RSQV9ST1VURVMuZW1iZWR9Lzp0eXBlLzppZGAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHN0cmluZ1V0aWxzLmZpcnN0Tm9uRW1wdHkocmVxLnBhcmFtcy50eXBlKSA/PyBcIlwiO1xuICAgICAgICBjb25zdCBpZCA9IHN0cmluZ1V0aWxzLmZpcnN0Tm9uRW1wdHkocmVxLnBhcmFtcy5pZCk7XG4gICAgICAgIGNvbnN0IHJlc29sdmUgPSBlbWJlZFJlc29sdmVyc1t0eXBlXTtcbiAgICAgICAgaWYgKCFyZXNvbHZlKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcImVtYmVkOnVuc3VwcG9ydGVkXCIsIHtcbiAgICAgICAgICAgIHN0YXR1czogNDA0LFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgbWV0aG9kOiByZXEubWV0aG9kLFxuICAgICAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogYHVuc3VwcG9ydGVkIGVtYmVkIHR5cGU6ICR7dHlwZX1gIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcImVtYmVkOmludmFsaWRcIiwge1xuICAgICAgICAgICAgc3RhdHVzOiA0MDAsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgbWV0aG9kOiByZXEubWV0aG9kLFxuICAgICAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgICAgICBlcnJvcjogXCJpZCBpcyByZXF1aXJlZFwiLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgZXJyb3I6IFwiaWQgaXMgcmVxdWlyZWRcIiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnJpZGdlIHJlc3BvbnNlIGNsb3NlIG9udG8gYW4gQWJvcnRTaWduYWwgc28gYSBjbGllbnQgZGlzY29ubmVjdFxuICAgICAgICAvLyByZWxlYXNlcyBsb25nLXBvbGwgYW5kIHdvcmtzcGFjZSBjYWxscyBpbW1lZGlhdGVseS5cbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgcmVzLm9uKFwiY2xvc2VcIiwgKCkgPT4gY29udHJvbGxlci5hYm9ydCgpKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzb2x2ZShyZXEsIGlkLCBjb250cm9sbGVyLnNpZ25hbCk7XG4gICAgICAgIGlmIChjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgICAgdGhpcy5zZW5kRmFpbHVyZShyZXMsIHJlc3VsdCwgYGVtYmVkOiR7dHlwZX1gLCBgQ291bGQgbm90IHJlc29sdmUgdGhlICR7dHlwZX0gZW1iZWRgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5kYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBBIGNhY2hlIG1pc3MgaXMgc2VjdXJpdHktZGVsaWJlcmF0ZWx5IGFtYmlndW91czogdW5rbm93biwgZXhwaXJlZCxcbiAgICAgICAgICAvLyBvciBvd25lZCBieSBhbm90aGVyIGlkZW50aXR5IGFsbCBtYXAgdG8gdGhlIHNhbWUgNDA0LiBMb2cgdGhlXG4gICAgICAgICAgLy8gb3BhcXVlIGlkIGFuZCB0aG9zZSBwb3NzaWJsZSBjYXVzZXMgc28gYSBmYWJyaWNhdGVkIG1hcmtlciBpc1xuICAgICAgICAgIC8vIGRpYWdub3NhYmxlIGZyb20gdGhlIHNlcnZlciB3aXRob3V0IGRpc2Nsb3Npbmcgd2hpY2ggY2F1c2UgYXBwbGllZC5cbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBlbWJlZDoke3R5cGV9Om5vdC1mb3VuZGAsIHtcbiAgICAgICAgICAgIHN0YXR1czogNDA0LFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgbWV0aG9kOiByZXEubWV0aG9kLFxuICAgICAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgICAgICByZWFzb246IFwidW5rbm93biwgZXhwaXJlZCwgb3Igb3duZWQgYnkgYW5vdGhlciBpZGVudGl0eVwiLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHsgZXJyb3I6IGAke3R5cGV9IG5vdCBmb3VuZGAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlcy5qc29uKHJlc3VsdC5kYXRhKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgZGVmYXVsdCBhbmQgYWdlbnQtcXVhbGlmaWVkIHN1Z2dlc3Rpb24gcm91dGVzLiAqL1xuICBwcml2YXRlIHJlZ2lzdGVyU3VnZ2VzdGlvblJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICAvLyBgR0VUIC9zdWdnZXN0aW9uc2AgKGFuZCBgL3N1Z2dlc3Rpb25zLzphZ2VudElkYCkgcmV0dXJucyB0aGVcbiAgICAvLyBjdXJhdGVkIHN0YXJ0ZXIgcXVlc3Rpb25zIGZvciB0aGUgYWdlbnQncyBHZW5pZSBzcGFjZShzKSAtIHRoZVxuICAgIC8vIGF1dGhvci1jb25maWd1cmVkIGBzYW1wbGVfcXVlc3Rpb25zYCwgc3VyZmFjZWQgYXMgb25lLXRhcFxuICAgIC8vIHByb21wdHMgb24gdGhlIGNoYXQgZW1wdHkgc3RhdGUuIFJldHVybnMgYHsgcXVlc3Rpb25zOiBbXSB9YFxuICAgIC8vIHdoZW4gbm8gR2VuaWUgc3BhY2UgaXMgd2lyZWQgc28gdGhlIGNsaWVudCByZW5kZXJzIGEgYmFyZVxuICAgIC8vIGVtcHR5IHN0YXRlIChubyBidWlsdC1pbiBleGFtcGxlIHByb21wdHMpLiBUaGUgYDphZ2VudElkYFxuICAgIC8vIHNlZ21lbnQgaXMgYWNjZXB0ZWQgZm9yIFVSTCBzeW1tZXRyeSB3aXRoIHRoZSBjaGF0IC8gaGlzdG9yeVxuICAgIC8vIHJvdXRlczsgR2VuaWUgc3BhY2VzIGFyZSByZXNvbHZlZCBwZXItcGx1Z2luLCBub3QgcGVyLWFnZW50LFxuICAgIC8vIHNvIGl0IGRvZXNuJ3QgY2hhbmdlIHRoZSByZXN1bHQuIFRoZSBzcGFjZSBsb29rdXAgdXNlcyB0aGUgY29uZmlndXJlZFxuICAgIC8vIGFnZW50LWJhY2tlZCBpZGVudGl0eS5cbiAgICBjb25zdCBoYW5kbGVTdWdnZXN0aW9ucyA9IGFzeW5jIChcbiAgICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgICAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICAgICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIHJlcy5vbihcImNsb3NlXCIsICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNjb3BlZFNlbGYocmVxKS5mZXRjaFN1Z2dlc3Rpb25zKGNvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgIGlmIChjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAvLyBTdWdnZXN0aW9ucyBhcmUgYSBub24tY3JpdGljYWwgZW5oYW5jZW1lbnQ7IGEgbG9va3VwIGZhaWx1cmUgc2hvdWxkXG4gICAgICAgIC8vIGxlYXZlIHRoZSBjaGF0IHVzYWJsZSB3aXRoIGEgYmFyZSBlbXB0eSBzdGF0ZSByYXRoZXIgdGhhbiBzdXJmYWNpbmdcbiAgICAgICAgLy8gdGhlIHVwc3RyZWFtIHN0YXR1cy4gTG9nIGFuZCBkZWdyYWRlLlxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwic3VnZ2VzdGlvbnM6ZXJyb3JcIiwge1xuICAgICAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcbiAgICAgICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKHJlc3VsdC5tZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcy5qc29uKHsgcXVlc3Rpb25zOiBbXSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzLmpzb24oeyBxdWVzdGlvbnM6IHJlc3VsdC5kYXRhIH0pO1xuICAgIH07XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwic3VnZ2VzdGlvbnNcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IHJvdXRlcy5NQVNUUkFfUk9VVEVTLnN1Z2dlc3Rpb25zLFxuICAgICAgaGFuZGxlcjogaGFuZGxlU3VnZ2VzdGlvbnMsXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwic3VnZ2VzdGlvbnNCeUFnZW50XCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBgJHtyb3V0ZXMuTUFTVFJBX1JPVVRFUy5zdWdnZXN0aW9uc30vOmFnZW50SWRgLFxuICAgICAgaGFuZGxlcjogaGFuZGxlU3VnZ2VzdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgdGhlIGRpcmVjdCBHZW5pZSBjaGF0IHJvdXRlcy4gRWFjaCByb3V0ZSBpcyBzY29wZWQgdG8gb25lIEdlbmllXG4gICAqIHNwYWNlIGFsaWFzIGFuZCBzaXRzIGRpcmVjdGx5IG9uIHRoZSBHZW5pZSBBUElzIHVuZGVyIEFwcEtpdCdzIE9CTyB1c2VyXG4gICAqIGNvbnRleHQ6IGNvbnZlcnNhdGlvbnMgYXJlIHRocmVhZHMsIEdlbmllIG1lc3NhZ2VzIGFyZSBoaXN0b3J5LCBhbmQgYSB0dXJuXG4gICAqIHN0cmVhbXMgdGhlIHNhbWUgQUkgU0RLIGNodW5rcyBhcyBhbiBhZ2VudCdzIGBhc2tfZ2VuaWVgIGNhbGwuIE5vdGhpbmcgaXNcbiAgICogd3JpdHRlbiB0byBNYXN0cmEgTWVtb3J5LlxuICAgKi9cbiAgcHJpdmF0ZSByZWdpc3RlckdlbmllQ2hhdFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICBjb25zdCBwYXRoID0gKC4uLnBhcnRzOiBzdHJpbmdbXSkgPT4gcm91dGVzLmdlbmllUm91dGVQYXRoKFwiOmFsaWFzXCIsIC4uLnBhcnRzKTtcbiAgICBjb25zdCB7IGNoYXQ6IGNoYXRTZWdtZW50LCBtZXNzYWdlcywgc3VnZ2VzdGlvbnMsIHRocmVhZHMgfSA9IHJvdXRlcy5NQVNUUkFfUk9VVEVTO1xuICAgIC8qKiBSZXNvbHZlIHRoZSByb3V0ZSdzIGFsaWFzLCBhbnN3ZXJpbmcgNDA0IHdoZW4gbm8gc3VjaCBzcGFjZSBpcyBjb25maWd1cmVkLiAqL1xuICAgIGNvbnN0IHNwYWNlRm9yID0gKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCByZXM6IGV4cHJlc3MuUmVzcG9uc2UpOiBHZW5pZUNoYXRTcGFjZSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICBjb25zdCBhbGlhcyA9IHN0cmluZ1V0aWxzLmZpcnN0Tm9uRW1wdHkocmVxLnBhcmFtcy5hbGlhcykgPz8gXCJcIjtcbiAgICAgIGNvbnN0IGNvbmZpZ3VyZWQgPSByZXNvbHZlR2VuaWVTcGFjZXModGhpcy5jb25maWcsIHRoaXMuY29udGV4dClbYWxpYXNdO1xuICAgICAgaWYgKGNvbmZpZ3VyZWQpIHJldHVybiB7IGFsaWFzLCBzcGFjZUlkOiBjb25maWd1cmVkLnNwYWNlSWQgfTtcbiAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHsgZXJyb3I6IGBVbmtub3duIEdlbmllIHNwYWNlIGFsaWFzIFwiJHthbGlhc31cImAgfSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqIEJyaWRnZSB0aGUgY29ubmVjdGlvbiBgY2xvc2VgIGV2ZW50IG9udG8gYW4gYWJvcnQgc2lnbmFsLiAqL1xuICAgIGNvbnN0IGNsb3NlU2lnbmFsID0gKHJlczogZXhwcmVzcy5SZXNwb25zZSk6IEFib3J0U2lnbmFsID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICByZXMub24oXCJjbG9zZVwiLCAoKSA9PiBjb250cm9sbGVyLmFib3J0KCkpO1xuICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuc2lnbmFsO1xuICAgIH07XG5cbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJnZW5pZUNoYXRcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBwYXRoKGNoYXRTZWdtZW50KSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCBzcGFjZSA9IHNwYWNlRm9yKHJlcSwgcmVzKTtcbiAgICAgICAgaWYgKCFzcGFjZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSB3aXJlLkdlbmllQ2hhdFJlcXVlc3RTY2hlbWEuc2FmZVBhcnNlKHJlcS5ib2R5KTtcbiAgICAgICAgaWYgKCFwYXJzZWQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc1xuICAgICAgICAgICAgLnN0YXR1cyg0MDApXG4gICAgICAgICAgICAuanNvbih7IGVycm9yOiBcInF1ZXN0aW9uIGlzIHJlcXVpcmVkXCIsIGZpZWxkczogaW52YWxpZEZpZWxkcyhwYXJzZWQuZXJyb3IpIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmFzVXNlcihyZXEpLnN0cmVhbUdlbmllQ2hhdChyZXMsIHNwYWNlLCBwYXJzZWQuZGF0YSwgY2xvc2VTaWduYWwocmVzKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImdlbmllVGhyZWFkc1wiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogcGF0aCh0aHJlYWRzKSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCBzcGFjZSA9IHNwYWNlRm9yKHJlcSwgcmVzKTtcbiAgICAgICAgaWYgKCFzcGFjZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFzVXNlcihyZXEpLmdlbmllQ29udmVyc2F0aW9uUmVhZCgoY2xpZW50KSA9PlxuICAgICAgICAgIGxpc3RHZW5pZVRocmVhZHMoY2xpZW50LCBzcGFjZSksXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgICAgdGhpcy5zZW5kRmFpbHVyZShyZXMsIHJlc3VsdCwgXCJnZW5pZS10aHJlYWRzXCIsIFwiQ291bGQgbm90IGxpc3QgR2VuaWUgY29udmVyc2F0aW9uc1wiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzLmpzb24oeyB0aHJlYWRzOiByZXN1bHQuZGF0YSB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiZ2VuaWVUaHJlYWRNZXNzYWdlc1wiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogcGF0aCh0aHJlYWRzLCBcIjp0aHJlYWRJZFwiLCBtZXNzYWdlcyksXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3Qgc3BhY2UgPSBzcGFjZUZvcihyZXEsIHJlcyk7XG4gICAgICAgIGlmICghc3BhY2UpIHJldHVybjtcbiAgICAgICAgY29uc3QgdGhyZWFkSWQgPSBzdHJpbmdVdGlscy5maXJzdE5vbkVtcHR5KHJlcS5wYXJhbXMudGhyZWFkSWQpID8/IFwiXCI7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXNVc2VyKHJlcSkuZ2VuaWVDb252ZXJzYXRpb25SZWFkKChjbGllbnQpID0+XG4gICAgICAgICAgbGlzdEdlbmllVGhyZWFkTWVzc2FnZXMoe1xuICAgICAgICAgICAgY2xpZW50LFxuICAgICAgICAgICAgc3BhY2UsXG4gICAgICAgICAgICBjb252ZXJzYXRpb25JZDogdGhyZWFkSWQsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgICAgdGhpcy5zZW5kRmFpbHVyZShyZXMsIHJlc3VsdCwgXCJnZW5pZS1tZXNzYWdlc1wiLCBcIkNvdWxkIG5vdCBsb2FkIHRoZSBHZW5pZSBjb252ZXJzYXRpb25cIik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlcy5qc29uKHsgbWVzc2FnZXM6IHJlc3VsdC5kYXRhIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJnZW5pZVRocmVhZERlbGV0ZVwiLFxuICAgICAgbWV0aG9kOiBcImRlbGV0ZVwiLFxuICAgICAgcGF0aDogcGF0aCh0aHJlYWRzLCBcIjp0aHJlYWRJZFwiKSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCBzcGFjZSA9IHNwYWNlRm9yKHJlcSwgcmVzKTtcbiAgICAgICAgaWYgKCFzcGFjZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCB0aHJlYWRJZCA9IHN0cmluZ1V0aWxzLmZpcnN0Tm9uRW1wdHkocmVxLnBhcmFtcy50aHJlYWRJZCkgPz8gXCJcIjtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hc1VzZXIocmVxKS5nZW5pZUNvbnZlcnNhdGlvbldyaXRlKChjbGllbnQpID0+XG4gICAgICAgICAgZGVsZXRlR2VuaWVUaHJlYWQoY2xpZW50LCBzcGFjZSwgdGhyZWFkSWQpLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgIHRoaXMuc2VuZEZhaWx1cmUoXG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICBcImdlbmllLXRocmVhZC1kZWxldGVcIixcbiAgICAgICAgICAgIFwiQ291bGQgbm90IGRlbGV0ZSB0aGUgR2VuaWUgY29udmVyc2F0aW9uXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnN0YXR1cygyMDQpLmVuZCgpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJnZW5pZVRocmVhZE1lc3NhZ2VEZWxldGVcIixcbiAgICAgIG1ldGhvZDogXCJkZWxldGVcIixcbiAgICAgIHBhdGg6IHBhdGgodGhyZWFkcywgXCI6dGhyZWFkSWRcIiwgbWVzc2FnZXMsIFwiOm1lc3NhZ2VJZFwiKSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCBzcGFjZSA9IHNwYWNlRm9yKHJlcSwgcmVzKTtcbiAgICAgICAgaWYgKCFzcGFjZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCB0aHJlYWRJZCA9IHN0cmluZ1V0aWxzLmZpcnN0Tm9uRW1wdHkocmVxLnBhcmFtcy50aHJlYWRJZCkgPz8gXCJcIjtcbiAgICAgICAgY29uc3QgbWVzc2FnZUlkID0gc3RyaW5nVXRpbHMuZmlyc3ROb25FbXB0eShyZXEucGFyYW1zLm1lc3NhZ2VJZCkgPz8gXCJcIjtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hc1VzZXIocmVxKS5nZW5pZUNvbnZlcnNhdGlvbldyaXRlKChjbGllbnQpID0+XG4gICAgICAgICAgZGVsZXRlR2VuaWVUaHJlYWRNZXNzYWdlKGNsaWVudCwgc3BhY2UsIHRocmVhZElkLCBtZXNzYWdlSWQpLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgIHRoaXMuc2VuZEZhaWx1cmUoXG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICBcImdlbmllLW1lc3NhZ2UtZGVsZXRlXCIsXG4gICAgICAgICAgICBcIkNvdWxkIG5vdCBkZWxldGUgdGhlIEdlbmllIG1lc3NhZ2VcIixcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXMuc3RhdHVzKDIwNCkuZW5kKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImdlbmllU3VnZ2VzdGlvbnNcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IHBhdGgoc3VnZ2VzdGlvbnMpLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNwYWNlID0gc3BhY2VGb3IocmVxLCByZXMpO1xuICAgICAgICBpZiAoIXNwYWNlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXNVc2VyKHJlcSkuZmV0Y2hTdWdnZXN0aW9ucyh1bmRlZmluZWQsIHtcbiAgICAgICAgICBbc3BhY2UuYWxpYXNdOiB7IHNwYWNlSWQ6IHNwYWNlLnNwYWNlSWQgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcy5qc29uKHsgcXVlc3Rpb25zOiByZXN1bHQub2sgPyByZXN1bHQuZGF0YSA6IFtdIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJlYW0gb25lIGRpcmVjdCBHZW5pZSB0dXJuIHRvIGByZXNgIHVuZGVyIEFwcEtpdCdzIE9CTyB1c2VyIGNvbnRleHQuXG4gICAqIERpcmVjdCBjb252ZXJzYXRpb25zIGNhbm5vdCB1c2UgdGhlIHNoYXJlZCBzZXJ2aWNlIHByaW5jaXBhbCBiZWNhdXNlIEdlbmllXG4gICAqIG93bnMgdGhlbSB1bmRlciB0aGUgRGF0YWJyaWNrcyBjYWxsZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHN0cmVhbUdlbmllQ2hhdChcbiAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgc3BhY2U6IEdlbmllQ2hhdFNwYWNlLFxuICAgIHJlcXVlc3Q6IEdlbmllQ2hhdFJlcXVlc3QsXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgICBjb25zdCBjbGllbnQgPSBjb250ZXh0LmNsaWVudDtcbiAgICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IG5ldyBSZXF1ZXN0Q29udGV4dDx1bmtub3duPihcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJlcXVlc3QucmVxdWVzdENvbnRleHQgPz8ge30pLFxuICAgICk7XG4gICAgY2xlYXJUcnVzdGVkUmVxdWVzdENvbnRleHQocmVxdWVzdENvbnRleHQpO1xuICAgIGNvbnN0IGFwcGxpY2F0aW9uQ29udGV4dCA9IHJlcXVlc3RDb250ZXh0LnRvSlNPTigpO1xuICAgIGF3YWl0IHN0YW1wUmVxdWVzdENvbnRleHRVc2VyKHJlcXVlc3RDb250ZXh0KTtcbiAgICBjb25zdCBtZW1vcnkgPSBhd2FpdCB0aGlzLmJ1aWx0Py5hZ2VudHNbdGhpcy5idWlsdC5kZWZhdWx0QWdlbnRJZF0/LmdldE1lbW9yeSh7XG4gICAgICByZXF1ZXN0Q29udGV4dCxcbiAgICB9KTtcbiAgICBhd2FpdCBwaXBlVUlNZXNzYWdlU3RyZWFtVG9SZXNwb25zZSh7XG4gICAgICByZXNwb25zZTogcmVzLFxuICAgICAgc3RyZWFtOiBnZW5pZUNoYXRTdHJlYW0oe1xuICAgICAgICBjbGllbnQsXG4gICAgICAgIHNwYWNlLFxuICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgcXVlc3Rpb246IHJlcXVlc3QucXVlc3Rpb24sXG4gICAgICAgICAgLi4uKHJlcXVlc3QuY29udmVyc2F0aW9uSWQgPyB7IGNvbnZlcnNhdGlvbklkOiByZXF1ZXN0LmNvbnZlcnNhdGlvbklkIH0gOiB7fSksXG4gICAgICAgICAgLi4uKE9iamVjdC5rZXlzKGFwcGxpY2F0aW9uQ29udGV4dCkubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyB7IHJlcXVlc3RDb250ZXh0OiBhcHBsaWNhdGlvbkNvbnRleHQgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0sXG4gICAgICAgIC4uLihtZW1vcnkgPyB7IG1lbW9yeSB9IDoge30pLFxuICAgICAgICByZXF1ZXN0Q29udGV4dCxcbiAgICAgICAgc2lnbmFsLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICAvKiogUnVuIG9uZSBHZW5pZSBjb252ZXJzYXRpb24gcmVhZCB1bmRlciB0aGUgYWN0aXZlIHJlcXVlc3QgaWRlbnRpdHkuICovXG4gIHByaXZhdGUgZ2VuaWVDb252ZXJzYXRpb25SZWFkPFQ+KFxuICAgIHJlYWQ6IChjbGllbnQ6IFJldHVyblR5cGU8dHlwZW9mIGdldEV4ZWN1dGlvbkNvbnRleHQ+W1wiY2xpZW50XCJdKSA9PiBQcm9taXNlPFQ+LFxuICApOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxUPj4ge1xuICAgIGNvbnN0IGNsaWVudCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQ7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSgoKSA9PiByZWFkKGNsaWVudCksIGdlbmllQ29udmVyc2F0aW9uUmVhZERlZmF1bHRzKTtcbiAgfVxuXG4gIC8qKiBSdW4gb25lIEdlbmllIGNvbnZlcnNhdGlvbiB3cml0ZSB1bmRlciB0aGUgYWN0aXZlIHJlcXVlc3QgaWRlbnRpdHkuICovXG4gIHByaXZhdGUgZ2VuaWVDb252ZXJzYXRpb25Xcml0ZShcbiAgICB3cml0ZTogKGNsaWVudDogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RXhlY3V0aW9uQ29udGV4dD5bXCJjbGllbnRcIl0pID0+IFByb21pc2U8dm9pZD4sXG4gICk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PHZvaWQ+PiB7XG4gICAgY29uc3QgY2xpZW50ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpLmNsaWVudDtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKCgpID0+IHdyaXRlKGNsaWVudCksIGdlbmllQ29udmVyc2F0aW9uV3JpdGVEZWZhdWx0cyk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgdGhlIHNpbmdsZSBmZWVkYmFjayBkZXN0aW5hdGlvbiBzZWxlY3RlZCBieSBwbHVnaW4gbW9kZS4gKi9cbiAgcHJpdmF0ZSByZWdpc3RlckZlZWRiYWNrUm91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImZlZWRiYWNrXCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogcm91dGVzLk1BU1RSQV9ST1VURVMuZmVlZGJhY2ssXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgbW9kZSA9IHRoaXMuZmVlZGJhY2tNb2RlKCk7XG4gICAgICAgIGlmIChtb2RlID09PSBcIm5vbmVcIikge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHsgb2s6IGZhbHNlIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWQgPSBmZWVkYmFjay5NYXN0cmFGZWVkYmFja1JlcXVlc3RTY2hlbWEuc2FmZVBhcnNlKHJlcS5ib2R5KTtcbiAgICAgICAgaWYgKCFwYXJzZWQuc3VjY2Vzcykge1xuICAgICAgICAgIC8vIEEgWm9kIGlzc3VlIHN0cmluZyBxdW90ZXMgdGhlIHJlY2VpdmVkIGJvZHkgYmFjaywgc28gb25seSB0aGVcbiAgICAgICAgICAvLyBvZmZlbmRpbmcgZmllbGQgbmFtZXMgdHJhdmVsOyB0aGUgZnVsbCBpc3N1ZSBsaXN0IGlzIGxvZ2dlZC5cbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiZmVlZGJhY2s6aW52YWxpZFwiLCB7IGVycm9yOiBwYXJzZWQuZXJyb3IgfSk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oe1xuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IElOVkFMSURfRkVFREJBQ0tfTUVTU0FHRSxcbiAgICAgICAgICAgIGZpZWxkczogaW52YWxpZEZpZWxkcyhwYXJzZWQuZXJyb3IpLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyc2VkLmRhdGEubW9kZSAhPT0gbW9kZSkge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgb2s6IGZhbHNlLCBlcnJvcjogSU5WQUxJRF9GRUVEQkFDS19NRVNTQUdFIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyc2VkLmRhdGEubW9kZSA9PT0gXCJnZW5pZVwiKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zY29wZWRTZWxmKHJlcSkuc2VuZEdlbmllRmVlZGJhY2socGFyc2VkLmRhdGEpO1xuICAgICAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBcImdlbmllLWZlZWRiYWNrXCIsIFwiRmVlZGJhY2sgY291bGQgbm90IGJlIHJlY29yZGVkXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXMuanNvbih7IG9rOiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNjb3BlZFNlbGYocmVxKS5sb2dGZWVkYmFjayhwYXJzZWQuZGF0YSk7XG4gICAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgICAgdGhpcy5zZW5kRmFpbHVyZShyZXMsIHJlc3VsdCwgXCJmZWVkYmFja1wiLCBcIkZlZWRiYWNrIGNvdWxkIG5vdCBiZSByZWNvcmRlZFwiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXNzZXNzbWVudElkID0gcmVzdWx0LmRhdGE7XG4gICAgICAgIHJlcy5qc29uKHtcbiAgICAgICAgICBvazogYXNzZXNzbWVudElkICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgLi4uKGFzc2Vzc21lbnRJZCA/IHsgYXNzZXNzbWVudElkIH0gOiB7fSksXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciB0aGUgYmVzdC1lZmZvcnQgcGVyLXZpZXdlciBNTGZsb3cgZXhwZXJpbWVudCBkZWJ1ZyBsaW5rLiAqL1xuICBwcml2YXRlIHJlZ2lzdGVyTWxmbG93RXhwZXJpbWVudFJvdXRlKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcIm1sZmxvd0V4cGVyaW1lbnRcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IHJvdXRlcy5NQVNUUkFfUk9VVEVTLm1sZmxvd0V4cGVyaW1lbnQsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZmVlZGJhY2tNb2RlKCkgIT09IFwibWxmbG93XCIpIHtcbiAgICAgICAgICByZXMuanNvbih7IHVybDogbnVsbCB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zY29wZWRTZWxmKHJlcSkuZmV0Y2hNbGZsb3dFeHBlcmltZW50VXJsKCk7XG4gICAgICAgIHJlcy5qc29uKHsgdXJsOiByZXN1bHQub2sgPyAocmVzdWx0LmRhdGEgPz8gbnVsbCkgOiBudWxsIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciB0aGUgZ2F0ZWQgTWFzdHJhIGNhdGNoLWFsbCBhZnRlciBldmVyeSBleHBsaWNpdCByb3V0ZS4gKi9cbiAgcHJpdmF0ZSByZWdpc3RlckFnZW50Um91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIC8vIE1pZGRsZXdhcmUgcmF0aGVyIHRoYW4gYHRoaXMucm91dGVgOiB0aGlzIGlzIHRoZSBjYXRjaC1hbGwgdGhhdCBoYW5kc1xuICAgIC8vIGV2ZXJ5IHJlbWFpbmluZyBtZXRob2QgLyBwYXRoIHBhaXIgdG8gdGhlIE1hc3RyYSBzdWItYXBwLCBzbyBpdCBoYXMgbm9cbiAgICAvLyBzaW5nbGUgbWV0aG9kIG9yIHBhdGggdG8gcmVnaXN0ZXIgdW5kZXIuXG4gICAgcm91dGVyLnVzZSgocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgIGlmICghdGhpcy5tYXN0cmFBcHApIHJldHVybiByZXMuc3RhdHVzKDUwMykuZW5kKCk7XG4gICAgICAvLyBHYXRlIHRoZSBzdG9jayBNYXN0cmEgc3VyZmFjZSBiZWZvcmUgZGlzcGF0Y2guIEluIHRoZSBkZWZhdWx0XG4gICAgICAvLyBcInNjb3BlZFwiIG1vZGUgb25seSBhZ2VudCBpbmZlcmVuY2UsIHJlYWQtb25seSBhZ2VudCBtZXRhZGF0YSwgdGhpc1xuICAgICAgLy8gcGx1Z2luJ3Mgb3duIGAvcm91dGUvKmAgcm91dGVzLCBhbmQgKHdoZW4gZW5hYmxlZCkgTUNQIHJlYWNoIE1hc3RyYTtcbiAgICAgIC8vIGFkbWluIC8gbXV0YXRpbmcgLyBidWxrLWV4cG9ydCByb3V0ZXMgYXJlIHJlZnVzZWQgaGVyZS4gYHJlcS5wYXRoYFxuICAgICAgLy8gaXMgbW91bnQtcmVsYXRpdmUgdW5kZXIgdGhlIHBsdWdpbiBtb3VudC4gU2VlIGBzZXJ2ZXIudHNgLlxuICAgICAgaWYgKFxuICAgICAgICAhaXNNYXN0cmFSZXF1ZXN0QWxsb3dlZChyZXEubWV0aG9kLCByZXEucGF0aCwge1xuICAgICAgICAgIGFjY2VzczogdGhpcy5jb25maWcuYXBpQWNjZXNzID8/IFwic2NvcGVkXCIsXG4gICAgICAgICAgLy8gUmVmbGVjdCB0aGUgKnJlc29sdmVkKiBNQ1Agc3RhdGUsIG5vdCByYXcgYGNvbmZpZy5tY3BgOiBNQ1AgaXNcbiAgICAgICAgICAvLyBvbiBieSBkZWZhdWx0IChgY29uZmlnLm1jcGAgdW5kZWZpbmVkKSwgc28gZ2F0ZSBvbiB3aGV0aGVyIHRoZVxuICAgICAgICAgIC8vIHNlcnZlciB3YXMgYWN0dWFsbHkgYnVpbHQgYW5kIG1vdW50ZWQuXG4gICAgICAgICAgbWNwRW5hYmxlZDogdGhpcy5tY3AgIT09IG51bGwsXG4gICAgICAgIH0pXG4gICAgICApIHtcbiAgICAgICAgcmVzLnN0YXR1cyg0MDMpLmpzb24oeyBlcnJvcjogXCJFbmRwb2ludCBub3QgZXhwb3NlZCB0byB0aGUgY2xpZW50IChhcGlBY2Nlc3M9c2NvcGVkKVwiIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBEaXNwYXRjaCB0aHJvdWdoIGEgcmVhbCBtZXRob2QsIE5PVCB0aGUgYG1hc3RyYUFwcGAgcHJvcGVydHkuIFRoZVxuICAgICAgLy8gQXBwS2l0IGBhc1VzZXIocmVxKWAgcHJveHkgd3JhcHMgZnVuY3Rpb24tdmFsdWVkIHByb3BzIHdpdGhcbiAgICAgIC8vIGB2YWx1ZS5iaW5kKHRhcmdldClgLiBgbWFzdHJhQXBwYCBpcyBhbiBleHByZXNzIGFwcCB3aG9zZSBgLmJpbmRgIGlzXG4gICAgICAvLyB0aGUgSFRUUCBCSU5EIHJvdXRlIHJlZ2lzdHJhciAoZXhwcmVzcyBkZWZpbmVzIGEgbWV0aG9kIHBlciBIVFRQIHZlcmIsXG4gICAgICAvLyBhbmQgQklORCBpcyBvbmUpLCBub3QgYEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kYCAtIHNvIGJpbmRpbmcgaXQgdGhyb3VnaFxuICAgICAgLy8gdGhlIHByb3h5IHJlZ2lzdGVycyBhIGJvZ3VzIHJvdXRlIGFuZCBjcmFzaGVzIGBwYXRoVG9SZWdleHBgXG4gICAgICAvLyAoXCJwYXRoIG11c3QgYmUgYSBzdHJpbmcgLi4uXCIpLiBUaGlzIG9ubHkgbWFuaWZlc3RzIGluIHByb2R1Y3Rpb24gd2hlcmVcbiAgICAgIC8vIGFuIE9CTyB0b2tlbiBtYWtlcyBgc2NvcGVkU2VsZmAgcmV0dXJuIHRoZSBwcm94eS4gYGRpc3BhdGNoTWFzdHJhYFxuICAgICAgLy8gaXMgYSBwbGFpbiBtZXRob2QgKGl0cyBgLmJpbmRgIGlzIHRoZSBub3JtYWwgb25lKSBhbmQgaW52b2tlc1xuICAgICAgLy8gYHRoaXMubWFzdHJhQXBwYCBvZmYgdGhlIHJlYWwgdGFyZ2V0LCBrZWVwaW5nIHRoZSBPQk8gc2NvcGUgYWN0aXZlLlxuICAgICAgcmV0dXJuIHRoaXMuc2NvcGVkU2VsZihyZXEpLmRpc3BhdGNoTWFzdHJhKHJlcSwgcmVzLCBuZXh0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXAgYSBmYWlsZWQge0BsaW5rIEV4ZWN1dGlvblJlc3VsdH0gb250byB0aGUgcmVzcG9uc2U6IHRoZSBzdGF0dXMgdGhlXG4gICAqIGV4ZWN1dGlvbiBwaXBlbGluZSByZXNvbHZlZCwgcGFpcmVkIHdpdGggYGNsaWVudE1lc3NhZ2VgIHJhdGhlciB0aGFuIHRoZVxuICAgKiByZXN1bHQncyBvd24gdGV4dCwgd2hpY2ggY2FuIGNhcnJ5IHVwc3RyZWFtIGRldGFpbC4gVGhlIGZ1bGwgbWVzc2FnZSBpc1xuICAgKiBsb2dnZWQgdW5kZXIgYDxvcGVyYXRpb24+OmVycm9yYC5cbiAgICovXG4gIHByaXZhdGUgc2VuZEZhaWx1cmUoXG4gICAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICAgIHJlc3VsdDogeyBzdGF0dXM6IG51bWJlcjsgbWVzc2FnZTogc3RyaW5nIH0sXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgY2xpZW50TWVzc2FnZTogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci53YXJuKGAke29wZXJhdGlvbn06ZXJyb3JgLCB7XG4gICAgICBzdGF0dXM6IHJlc3VsdC5zdGF0dXMsXG4gICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKHJlc3VsdC5tZXNzYWdlKSxcbiAgICB9KTtcbiAgICBpZiAocmVzLmhlYWRlcnNTZW50KSByZXR1cm47XG4gICAgcmVzLnN0YXR1cyhyZXN1bHQuc3RhdHVzKS5qc29uKHsgZXJyb3I6IGNsaWVudE1lc3NhZ2UgfSk7XG4gIH1cblxuICAvKiogNDA0IGJvZHkgZm9yIGEgcmVxdWVzdCBuYW1pbmcgYW4gYWdlbnQgdGhhdCBpc24ndCByZWdpc3RlcmVkLiAqL1xuICBwcml2YXRlIHVua25vd25BZ2VudE1lc3NhZ2UoYWdlbnRJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCByZWdpc3RlcmVkID0gT2JqZWN0LmtleXModGhpcy5idWlsdD8uYWdlbnRzID8/IHt9KTtcbiAgICByZXR1cm4gYFVua25vd24gYWdlbnQgXCIke2FnZW50SWR9XCIuIFJlZ2lzdGVyZWQgYWdlbnRzOiAke3JlZ2lzdGVyZWQuam9pbihcIiwgXCIpIHx8IFwibm9uZVwifWA7XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlIHRoZSBNYXN0cmEgZXhwcmVzcyBzdWItYXBwLiBFeGlzdHMgYXMgYSBtZXRob2QgKGluc3RlYWQgb2YgcmVhZGluZ1xuICAgKiBgdGhpcy5tYXN0cmFBcHBgIHRocm91Z2ggdGhlIGBhc1VzZXIocmVxKWAgcHJveHkgYXQgdGhlIGNhbGwgc2l0ZSkgc28gdGhlXG4gICAqIHByb3h5IGJpbmRzIHRoaXMgcGxhaW4gbWV0aG9kIC0gd2hvc2UgYC5iaW5kYCBpcyBgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRgXG4gICAqIC0gcmF0aGVyIHRoYW4gdGhlIGV4cHJlc3MgYXBwLCB3aG9zZSBgLmJpbmRgIGlzIHRoZSBIVFRQIEJJTkQgcm91dGVcbiAgICogcmVnaXN0cmFyIChzZWUgdGhlIG5vdGUgaW4gYGluamVjdFJvdXRlc2ApLiBSdW5zIGluc2lkZSB0aGUgdXNlciBzY29wZSBzb1xuICAgKiBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYCByZXR1cm5zIHRoZSBPQk8gY2xpZW50IGZvciB0aGUgYWdlbnQvbW9kZWxcbiAgICogcmVzb2x2ZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBkaXNwYXRjaE1hc3RyYShcbiAgICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgbmV4dDogZXhwcmVzcy5OZXh0RnVuY3Rpb24sXG4gICk6IHZvaWQge1xuICAgIHRoaXMubWFzdHJhQXBwIShyZXEsIHJlcywgbmV4dCk7XG4gIH1cblxuICAvKipcbiAgICogTWFwIGEgY2xlYW4sIG1vdW50LXJlbGF0aXZlIE1DUCBhbGlhcyBwYXRoIHRvIHRoZSB1bmRlcmx5aW5nXG4gICAqIGBAbWFzdHJhL2V4cHJlc3NgIHJvdXRlLiBSZXR1cm5zIGBudWxsYCB3aGVuIE1DUCBpcyBvZmYgb3IgdGhlIHBhdGhcbiAgICogaXNuJ3QgYW4gYWxpYXMuIENvbGxhcHNlcyB0aGUgc3RvY2sgYC9tY3AvPHNlcnZlcklkPi88dHJhbnNwb3J0PmBcbiAgICogbGF5b3V0IChzZXJ2ZXJJZCBkZWZhdWx0cyB0byB0aGUgcGx1Z2luIG5hbWUpIGRvd24gdG8gYC9tY3BgLFxuICAgKiBgL3NzZWAsIGFuZCBgL21lc3NhZ2VzYC5cbiAgICovXG4gIHByaXZhdGUgbWNwUm91dGVBbGlhcyhwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMubWNwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBpZCA9IHRoaXMubWNwLnNlcnZlcklkO1xuICAgIGlmIChwYXRoID09PSBcIi9tY3BcIikgcmV0dXJuIGAvbWNwLyR7aWR9L21jcGA7XG4gICAgaWYgKHBhdGggPT09IFwiL3NzZVwiKSByZXR1cm4gYC9tY3AvJHtpZH0vc3NlYDtcbiAgICBpZiAocGF0aCA9PT0gXCIvbWVzc2FnZXNcIikgcmV0dXJuIGAvbWNwLyR7aWR9L21lc3NhZ2VzYDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBiYWNraW5nIHRoZSBgL3N1Z2dlc3Rpb25zYCByb3V0ZS4gUnVucyBpbnNpZGUgdGhlXG4gICAqIEFwcEtpdCB1c2VyLWNvbnRleHQgcHJveHkgc28gYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgcmV0dXJucyB0aGVcbiAgICogT0JPLXNjb3BlZCBjbGllbnQuIFJlc29sdmVzIHRoZSBwbHVnaW4ncyBHZW5pZSBzcGFjZXMgYW5kIG1lcmdlc1xuICAgKiB0aGVpciBjdXJhdGVkIGBzYW1wbGVfcXVlc3Rpb25zYCAoc2VlIHtAbGluayBjb2xsZWN0U3BhY2VTdWdnZXN0aW9uc30pLlxuICAgKiBgb25seWAgbmFycm93cyB0aGUgbG9va3VwIHRvIHRoZSBnaXZlbiBzcGFjZXMgKHRoZSBkaXJlY3QgR2VuaWUgY2hhdFxuICAgKiBwYXNzZXMgaXRzIG93bikuIFJldHVybnMgYFtdYCB3aGVuIG5vIEdlbmllIHNwYWNlIGlzIGNvbmZpZ3VyZWQgc28gdGhlXG4gICAqIGNsaWVudCBzaG93cyBhIGJhcmUgZW1wdHkgc3RhdGUgaW5zdGVhZCBvZiBidWlsdC1pbiBleGFtcGxlIHByb21wdHMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoU3VnZ2VzdGlvbnMoXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgb25seT86IFJlY29yZDxzdHJpbmcsIEdlbmllU3BhY2VDb25maWc+LFxuICApOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxzdHJpbmdbXT4+IHtcbiAgICBjb25zdCBzcGFjZXMgPSBvbmx5ID8/IHJlc29sdmVHZW5pZVNwYWNlcyh0aGlzLmNvbmZpZywgdGhpcy5jb250ZXh0KTtcbiAgICBpZiAoT2JqZWN0LmtleXMoc3BhY2VzKS5sZW5ndGggPT09IDApIHJldHVybiB7IG9rOiB0cnVlLCBkYXRhOiBbXSB9O1xuICAgIGNvbnN0IGNsaWVudCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQ7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSgoZXhlY3V0ZVNpZ25hbCkgPT4ge1xuICAgICAgY29uc3QgY29tYmluZWQgPSBhc3luY1V0aWxzLmNvbWJpbmVBYm9ydFNpZ25hbHMoc2lnbmFsLCBleGVjdXRlU2lnbmFsKTtcbiAgICAgIHJldHVybiBjb2xsZWN0U3BhY2VTdWdnZXN0aW9ucyh7XG4gICAgICAgIHNwYWNlcyxcbiAgICAgICAgY2xpZW50LFxuICAgICAgICAuLi4oY29tYmluZWQgPyB7IHNpZ25hbDogY29tYmluZWQgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH0sIGdlbmllU3VnZ2VzdGlvbkRlZmF1bHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBiYWNraW5nIHRoZSBgL3JvdXRlL2ZlZWRiYWNrYCByb3V0ZS4gUnVucyBpbnNpZGUgdGhlXG4gICAqIEFwcEtpdCB1c2VyLWNvbnRleHQgcHJveHkgc28gYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgcmV0dXJucyB0aGVcbiAgICogT0JPLXNjb3BlZCBjbGllbnQgYW5kIHRoZSBhc3Nlc3NtZW50IGlzIGF0dHJpYnV0ZWQgdG8gdGhlIHNpZ25lZC1pblxuICAgKiB1c2VyICh0aGVpciBlbWFpbCAvIGlkIGFzIHRoZSBhc3Nlc3NtZW50IHNvdXJjZSkuIFJldHVybnMgdGhlXG4gICAqIGNyZWF0ZWQgYXNzZXNzbWVudCBpZCBvbiBzdWNjZXNzLCBvciBgdW5kZWZpbmVkYCBvbiBhIHNvZnQgZmFpbHVyZVxuICAgKiAoc2VlIHtAbGluayBsb2dGZWVkYmFja30gaW4gYC4vbWxmbG93LmpzYCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvZ0ZlZWRiYWNrKFxuICAgIGZlZWRiYWNrOiBmZWVkYmFjay5NbGZsb3dGZWVkYmFja1JlcXVlc3QsXG4gICk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PHN0cmluZyB8IHVuZGVmaW5lZD4+IHtcbiAgICBjb25zdCBjdHggPSBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gICAgY29uc3Qgc291cmNlSWQgPVxuICAgICAgXCJ1c2VyRW1haWxcIiBpbiBjdHggJiYgY3R4LnVzZXJFbWFpbFxuICAgICAgICA/IGN0eC51c2VyRW1haWxcbiAgICAgICAgOiBcInVzZXJJZFwiIGluIGN0eFxuICAgICAgICAgID8gY3R4LnVzZXJJZFxuICAgICAgICAgIDogY3R4LnNlcnZpY2VVc2VySWQ7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShcbiAgICAgICgpID0+XG4gICAgICAgIGxvZ0ZlZWRiYWNrKGN0eC5jbGllbnQsIHtcbiAgICAgICAgICAuLi5mZWVkYmFjayxcbiAgICAgICAgICAuLi4oc291cmNlSWQgPyB7IHNvdXJjZUlkIH0gOiB7fSksXG4gICAgICAgIH0pLFxuICAgICAgZmVlZGJhY2tXcml0ZURlZmF1bHRzLFxuICAgICk7XG4gIH1cblxuICAvKiogU2VuZCBBZ2VudCBNb2RlIHJhdGluZyBhbmQgY29tbWVudCBkaXJlY3RseSB0byB0aGUgb3JpZ2luYXRpbmcgR2VuaWUgbWVzc2FnZS4gKi9cbiAgcHJpdmF0ZSBzZW5kR2VuaWVGZWVkYmFjayhpbnB1dDogZmVlZGJhY2suR2VuaWVGZWVkYmFja1JlcXVlc3QpOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDx2b2lkPj4ge1xuICAgIGNvbnN0IGNsaWVudCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQ7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShcbiAgICAgIChzaWduYWwpID0+XG4gICAgICAgIHNlbmRHZW5pZU1lc3NhZ2VGZWVkYmFjayhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzcGFjZV9pZDogaW5wdXQuc3BhY2VJZCxcbiAgICAgICAgICAgIGNvbnZlcnNhdGlvbl9pZDogaW5wdXQuY29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgICBtZXNzYWdlX2lkOiBpbnB1dC5tZXNzYWdlSWQsXG4gICAgICAgICAgICByYXRpbmc6IGlucHV0LnJhdGluZyxcbiAgICAgICAgICAgIC4uLihpbnB1dC5jb21tZW50ID8geyBjb21tZW50OiBpbnB1dC5jb21tZW50IH0gOiB7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3Jrc3BhY2VDbGllbnQ6IGNsaWVudCxcbiAgICAgICAgICAgIC4uLihzaWduYWwgPyB7IGNvbnRleHQ6IHNpZ25hbCB9IDoge30pLFxuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICBmZWVkYmFja1dyaXRlRGVmYXVsdHMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGFuIGV4cGVyaW1lbnQgbGluayB1bmRlciB0aGUgYWN0aXZlIHJlcXVlc3QgaWRlbnRpdHkuIFRoZSBoZWxwZXJcbiAgICogcmV0dXJucyBubyBVUkwgdW5sZXNzIHRoZSB2aWV3ZXIgaGFzIGVmZmVjdGl2ZSBgQ0FOX01BTkFHRWAgcGVybWlzc2lvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hNbGZsb3dFeHBlcmltZW50VXJsKCk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PHN0cmluZyB8IHVuZGVmaW5lZD4+IHtcbiAgICBjb25zdCBjbGllbnQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoKCkgPT4gbWxmbG93RXhwZXJpbWVudE1hbmFnZXJVcmwoY2xpZW50KSwgZmVlZGJhY2tXcml0ZURlZmF1bHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBiYWNraW5nIHRoZSBgZGF0YWAgZW1iZWQgcmVzb2x2ZXJcbiAgICogKGBHRVQgL2VtYmVkL2RhdGEvOmlkYCkuIFJ1bnMgaW5zaWRlIHRoZSBBcHBLaXQgdXNlci1jb250ZXh0IHByb3h5IHNvXG4gICAqIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlIE9CTy1zY29wZWQgd29ya3NwYWNlXG4gICAqIGNsaWVudCwgdGhlbiByZXVzZXMgdGhlIHNhbWUgYGZldGNoU3RhdGVtZW50RGF0YWAgcGlwZWxpbmVcbiAgICogdGhlIGBnZXRfc3RhdGVtZW50YCB0b29sIHJ1bnMgc28gdGhlIExMTSBhbmQgdGhlIFVJIHNlZSB0aGVcbiAgICogZXhhY3Qgc2FtZSBzaGFwZSBmb3IgdGhlIHNhbWUgc3RhdGVtZW50LlxuICAgKlxuICAgKiBSZXNvbHZlcyB0byBgdW5kZWZpbmVkYCBkYXRhIGZvciB1cHN0cmVhbSA0MDRzIHNvIHRoZSByb3V0ZSBjYW4gbWFwIHRoZW1cbiAgICogdG8gYSBjbGVhbiBIVFRQIDQwNDsgYW55IG90aGVyIGZhaWx1cmUgY29tZXMgYmFjayBhcyBhIG5vbi1gb2tgIHJlc3VsdFxuICAgKiBjYXJyeWluZyB0aGUgc3RhdHVzIHRvIGFuc3dlciB3aXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFN0YXRlbWVudChcbiAgICBzdGF0ZW1lbnRJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgbGltaXQ/OiBudW1iZXI7IHNpZ25hbD86IEFib3J0U2lnbmFsIH0gPSB7fSxcbiAgKTogUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8U3RhdGVtZW50RGF0YSB8IHVuZGVmaW5lZD4+IHtcbiAgICBjb25zdCBjbGllbnQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xuICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4ob3B0aW9ucy5saW1pdCA/PyBTVEFURU1FTlRfUk9XX0NBUCwgU1RBVEVNRU5UX1JPV19DQVApO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoXG4gICAgICBhc3luYyAoZXhlY3V0ZVNpZ25hbCkgPT4ge1xuICAgICAgICBjb25zdCBjb21iaW5lZCA9IGFzeW5jVXRpbHMuY29tYmluZUFib3J0U2lnbmFscyhvcHRpb25zLnNpZ25hbCwgZXhlY3V0ZVNpZ25hbCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBkYXRhLCB2aXN1YWxpemF0aW9uIH0gPSBhd2FpdCBmZXRjaFN0YXRlbWVudEVtYmVkRGF0YShjbGllbnQsIHN0YXRlbWVudElkLCB7XG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIC4uLihjb21iaW5lZCA/IHsgc2lnbmFsOiBjb21iaW5lZCB9IDoge30pLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2x1bW5zOiBkYXRhLmNvbHVtbnMsXG4gICAgICAgICAgICByb3dzOiBkYXRhLnJvd3MsXG4gICAgICAgICAgICByb3dDb3VudDogZGF0YS5yb3dDb3VudCxcbiAgICAgICAgICAgIHRydW5jYXRlZDogZGF0YS5yb3dzLmxlbmd0aCA8IGRhdGEucm93Q291bnQsXG4gICAgICAgICAgICB2aXN1YWxpemF0aW9uLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIC8vIFRoZSBEYXRhYnJpY2tzIFNESyB0aHJvd3Mgb24gNDA0OyBzdXJmYWNlIGFzIGB1bmRlZmluZWRgXG4gICAgICAgICAgLy8gc28gdGhlIHJvdXRlIG1hcHMgdG8gYSBjbGVhbiBIVFRQIDQwNCBpbnN0ZWFkIG9mIGEgNTAwLlxuICAgICAgICAgIGlmIChlcnJvclV0aWxzLmVycm9yQ29udGV4dChlcnIpLm5vdEFjY2Vzc2libGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgLi4uc3RhdGVtZW50RGF0YURlZmF1bHRzLmRlZmF1bHQsXG4gICAgICAgICAgLy8gTmFtZXNwYWNlZCBzbyB0aGUga2V5IGNhbid0IGNvbGxpZGUgd2l0aCBhbm90aGVyIGNhY2hlIHNoYXJpbmcgdGhlXG4gICAgICAgICAgLy8gbWFuYWdlciwgYW5kIGtleWVkIG9uIGBsaW1pdGAgYmVjYXVzZSB0aGUgc2xpY2UgaXMgcGFydCBvZiB0aGVcbiAgICAgICAgICAvLyBwYXlsb2FkLlxuICAgICAgICAgIGNhY2hlOiB7XG4gICAgICAgICAgICAuLi5zdGF0ZW1lbnREYXRhRGVmYXVsdHMuZGVmYXVsdC5jYWNoZSxcbiAgICAgICAgICAgIGNhY2hlS2V5OiBbU1RBVEVNRU5UX0NBQ0hFX05BTUVTUEFDRSwgc3RhdGVtZW50SWQsIGxpbWl0XSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIGJhY2tpbmcgdGhlIGBjaGFydGAgZW1iZWQgcmVzb2x2ZXJcbiAgICogKGBHRVQgL2VtYmVkL2NoYXJ0LzppZGApLiBSdW5zIGluc2lkZSB0aGUgQXBwS2l0IHVzZXItY29udGV4dCBwcm94eSBzbyB0aGVcbiAgICogbG9va3VwIGlzIG5hbWVzcGFjZWQgdG8gdGhlIGNhbGxpbmcgaWRlbnRpdHk6IGEgY2hhcnQgbWludGVkIGZvciBhbm90aGVyXG4gICAqIHVzZXIgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhbiB1bmtub3duIGlkLCBhbmQgdGhlIHJvdXRlIGFuc3dlcnMgNDA0LlxuICAgKlxuICAgKiBUaGUga2V5IGlzIGJ1aWx0IGZyb20ge0BsaW5rIGF0dHJpYnV0ZWRVc2VySWR9IC0gdGhlIHNhbWUgcnVsZSB0aGF0IG5hbWVkXG4gICAqIHRoZSBpZGVudGl0eSB0aGUgY2hhcnQgd2FzIHdyaXR0ZW4gdW5kZXIgLSByYXRoZXIgdGhhbiBmcm9tIHRoZSBhbWJpZW50XG4gICAqIGV4ZWN1dGlvbiBjb250ZXh0IGFsb25lLiBJbiBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgdGhlIGFtYmllbnQgY29udGV4dCBpc1xuICAgKiB0aGUgU1AgZm9yIGV2ZXJ5IGNhbGxlciwgc28ga2V5aW5nIG9mZiBpdCBhbG9uZSBtaXNzZWQgZXZlcnkgY2hhcnQgdGhlXG4gICAqIHR1cm4gaGFkIHdyaXR0ZW4gdW5kZXIgdGhlIGZvcndhcmRlZCB1c2VyIGFuZCB0aGUgVUkgc2hvd2VkIGVhY2ggb25lIGFzXG4gICAqIGV4cGlyZWQuIGByZXFgIGlzIHJlYWQgaW5zaWRlIHRoZSBtZXRob2QsIG5vdCBhdCB0aGUgY2FsbCBzaXRlLCBzbyB0aGVcbiAgICogZXhlY3V0aW9uIGNvbnRleHQgaXMgdGhlIHNjb3BlZCBvbmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoQ2hhcnRFbnRyeShcbiAgICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgICBjaGFydElkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogeyB0aW1lb3V0TXM/OiBudW1iZXI7IHNpZ25hbDogQWJvcnRTaWduYWwgfSxcbiAgKTogUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8Q2hhcnQgfCB1bmRlZmluZWQ+PiB7XG4gICAgY29uc3QgdXNlcktleSA9IGF0dHJpYnV0ZWRVc2VySWQoZ2V0RXhlY3V0aW9uQ29udGV4dCgpLCByZXF1ZXN0VXNlcklkKHJlcSkpO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoXG4gICAgICAoZXhlY3V0ZVNpZ25hbCkgPT5cbiAgICAgICAgZmV0Y2hDaGFydChjaGFydElkLCB7XG4gICAgICAgICAgdXNlcktleSxcbiAgICAgICAgICAuLi4ob3B0aW9ucy50aW1lb3V0TXMgIT09IHVuZGVmaW5lZCA/IHsgdGltZW91dE1zOiBvcHRpb25zLnRpbWVvdXRNcyB9IDoge30pLFxuICAgICAgICAgIHNpZ25hbDogYXN5bmNVdGlscy5jb21iaW5lQWJvcnRTaWduYWxzKG9wdGlvbnMuc2lnbmFsLCBleGVjdXRlU2lnbmFsKSA/PyBvcHRpb25zLnNpZ25hbCxcbiAgICAgICAgfSksXG4gICAgICBjaGFydEZldGNoRGVmYXVsdHMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBiYWNraW5nIHRoZSBgL21vZGVsc2Agcm91dGUuIFJ1bnMgaW5zaWRlIHRoZSBBcHBLaXRcbiAgICogdXNlci1jb250ZXh0IHByb3h5IHNvIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlIE9CTy1zY29wZWRcbiAgICogY2xpZW50IGFuZCB0aGUgY2F0YWxvZ3VlIHJlZmxlY3RzIHdoYXQgdGhlIGNhbGxlciBjYW4gaW52b2tlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsaXN0TW9kZWxzUmVzdWx0KCk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gICAgICBjb25zdCBjbGllbnQgPSBjb250ZXh0LmNsaWVudDtcbiAgICAgIGNvbnN0IGNhY2hlSWRlbnRpdHkgPSBleGVjdXRpb25Db250ZXh0VXNlcklkKGNvbnRleHQpO1xuICAgICAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHNlcnZpbmcgPSByZXNvbHZlU2VydmluZ0NvbmZpZyh0aGlzLmNvbmZpZyk7XG4gICAgICByZXR1cm4gbW9kZWxDYXRhbG9nLmxpc3RTZXJ2aW5nRW5kcG9pbnRzKGNsaWVudCwgaG9zdCwge1xuICAgICAgICB0dGxNczogc2VydmluZy50dGxNcyxcbiAgICAgICAgY2FjaGVJZGVudGl0eSxcbiAgICAgIH0pO1xuICAgIH0sIG1vZGVsQ2F0YWxvZ3VlRGVmYXVsdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIGJhY2tpbmcgdGhlIGBsaXN0TW9kZWxzYCBleHBvcnQuIFRoZSBwcm9ncmFtbWF0aWMgc3VyZmFjZVxuICAgKiBjYXJyaWVzIG5vIHN0YXR1cyBjb2RlLCBzbyBhIGZhaWxlZCBleGVjdXRpb24gYmVjb21lcyBhIHRocm93IHdpdGggYVxuICAgKiBzdGFibGUgbWVzc2FnZTsgdGhlIHJvdXRlcyBicmFuY2ggb24gdGhlIHtAbGluayBFeGVjdXRpb25SZXN1bHR9IGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxpc3RNb2RlbHMoKTogUHJvbWlzZTxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmxpc3RNb2RlbHNSZXN1bHQoKTtcbiAgICBpZiAocmVzdWx0Lm9rKSByZXR1cm4gcmVzdWx0LmRhdGE7XG4gICAgdGhpcy5sb2dnZXIud2FybihcImxpc3RNb2RlbHM6ZXJyb3JcIiwge1xuICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihyZXN1bHQubWVzc2FnZSksXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKE1PREVMX0NBVEFMT0dVRV9GQUlMRURfTUVTU0FHRSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkQWdlbnRBbmRTZXJ2ZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWVtb3J5UG9vbCA9IG5lZWRzTGFrZWJhc2UodGhpcy5jb25maWcpXG4gICAgICA/IChsYWtlYmFzZVJlc29sdmVyLmNhcHR1cmVTZXJ2aWNlUHJpbmNpcGFsUG9vbChcbiAgICAgICAgICBwbHVnaW5SZWdpc3RyeS5yZXF1aXJlKHRoaXMuY29udGV4dCwgbGFrZWJhc2UsIHRoaXMuY29uZmlnKS5leHBvcnRzKCkucG9vbCxcbiAgICAgICAgKSBhcyBQb29sKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWVtb3J5QnVpbGRlciA9IGNyZWF0ZU1lbW9yeUJ1aWxkZXIodGhpcy5jb25maWcsIG1lbW9yeVBvb2wpO1xuXG4gICAgLy8gQnVpbGQgZXZlcnkgYWdlbnQgZGVjbGFyZWQgaW4gYGNvbmZpZy5hZ2VudHNgIChvciB0aGUgYnVpbHQtaW5cbiAgICAvLyBmYWxsYmFjayB3aGVuIG5vbmUgYXJlIGRlY2xhcmVkKS4gRWFjaCBhZ2VudCdzIGBtb2RlbGAgcmVzb2x2ZXNcbiAgICAvLyB3b3Jrc3BhY2UgVVJMICsgYmVhcmVyIGF0IGNhbGwgdGltZSBzbyBjb25jdXJyZW50IHJlcXVlc3RzIGdldFxuICAgIC8vIGRpc3RpbmN0IHVzZXIgaWRlbnRpdGllczsgdGhlIGBhc1VzZXIocmVxKWAgc2NvcGUgYXJvdW5kXG4gICAgLy8gYGhhbmRsZUNoYXRgIGlzIHdoYXQgbGV0cyBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYCByZXR1cm4gdGhlXG4gICAgLy8gcmlnaHQgdXNlciBpbnNpZGUgdGhlIHJlc29sdmVyLlxuICAgIC8vIE1hdGVyaWFsaXplIGFueSByZW1vdGUgQWdlbnQtU2tpbGwgc291cmNlcyBPTkNFIGF0IHN0YXJ0dXAuIFJ1bnNcbiAgICAvLyBvdXRzaWRlIGEgcmVxdWVzdCBzY29wZSwgc28gaXQgdXNlcyB0aGUgYXBwIHNlcnZpY2UgcHJpbmNpcGFsJ3MgY2xpZW50XG4gICAgLy8gYW5kIGRlZmF1bHRzIHRvIHRoZSBzaGFyZWQgd29ya3NwYWNlIEFzc2lzdGFudCBza2lsbHMgdHJlZTsgYSBzb3VyY2VcbiAgICAvLyBiYWNrZWQgYnkgbG9jYWwgb3IgbWVtb3J5IHN0b3JhZ2UgaXMgY29udmVydGVkIGludG8gbmF0aXZlIGFnZW50LWxldmVsXG4gICAgLy8gc2tpbGxzOyBEYXRhYnJpY2tzIHdvcmtzcGFjZSBkaXJlY3RvcmllcyByZW1haW4gc2VhcmNoLWRpc2NvdmVyZWQuXG4gICAgY29uc3QgcHJvdmlzaW9uZWQgPSBhd2FpdCBwcm92aXNpb25SZW1vdGVTa2lsbHModGhpcy5jb25maWcucmVtb3RlU2tpbGxzKTtcbiAgICBpZiAocHJvdmlzaW9uZWQuc2tpbGxOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKFwicmVtb3RlIHNraWxscyBjb25maWd1cmVkXCIsIHtcbiAgICAgICAgc2tpbGxzOiBwcm92aXNpb25lZC5za2lsbE5hbWVzLFxuICAgICAgICBkYXRhYnJpY2tzQmFzZVBhdGg6IHByb3Zpc2lvbmVkLmRhdGFicmlja3NCYXNlUGF0aCxcbiAgICAgICAgbG9jYWxTa2lsbE1vdW50czogcHJvdmlzaW9uZWQubG9jYWxTa2lsbE1vdW50cy5sZW5ndGgsXG4gICAgICAgIHN0YW5kYXJkU2tpbGxNb3VudHM6IHByb3Zpc2lvbmVkLnN0YW5kYXJkU2tpbGxNb3VudHMubGVuZ3RoLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgbG9jYWxTa2lsbE1vdW50cyA9IFtcbiAgICAgIC4uLih0aGlzLmNvbmZpZy5sb2NhbFNraWxsTW91bnRzID8/IFtdKSxcbiAgICAgIC4uLnByb3Zpc2lvbmVkLmxvY2FsU2tpbGxNb3VudHMsXG4gICAgXTtcbiAgICBjb25zdCBzdGFuZGFyZFNraWxscyA9IGF3YWl0IGlubGluZVNraWxsc0Zyb21Mb2NhbE1vdW50cyhbXG4gICAgICAuLi4odGhpcy5jb25maWcubG9jYWxTa2lsbE1vdW50cyA/PyBbXSksXG4gICAgICAuLi5wcm92aXNpb25lZC5zdGFuZGFyZFNraWxsTW91bnRzLFxuICAgIF0pO1xuICAgIHRoaXMuYnVpbHQgPSBhd2FpdCBidWlsZEFnZW50cyh7XG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgY29udGV4dDogdGhpcy5jb250ZXh0LFxuICAgICAgbWVtb3J5QnVpbGRlcixcbiAgICAgIG91dHB1dFByb2Nlc3NvckZhY3RvcmllczogdGhpcy5vdXRwdXRQcm9jZXNzb3JGYWN0b3JpZXMsXG4gICAgICBsb2c6IHRoaXMubG9nZ2VyLFxuICAgICAgZXh0cmFTa2lsbE1vdW50czogbG9jYWxTa2lsbE1vdW50cyxcbiAgICAgIHN0YW5kYXJkU2tpbGxzLFxuICAgICAgZXhjbHVkZWRXb3Jrc3BhY2VTa2lsbE5hbWVzOiBwcm92aXNpb25lZC5za2lsbE5hbWVzLFxuICAgIH0pO1xuXG4gICAgLy8gYG1hc3RyYS5zZXJ2ZXIuYXBpUm91dGVzYCBpcyBvbmx5IGhvbm9yZWQgYnkgTWFzdHJhJ3Mgc3RhbmRhbG9uZVxuICAgIC8vIGRldiBzZXJ2ZXIuIFNpbmNlIHdlJ3JlIGhvc3RpbmcgTWFzdHJhIGluc2lkZSBvdXIgb3duIEV4cHJlc3NcbiAgICAvLyBzdWJhcHAgdmlhIGBAbWFzdHJhL2V4cHJlc3NgLCBjdXN0b20gcm91dGVzIG11c3QgYmUgcGFzc2VkIHRvXG4gICAgLy8gdGhlIGBNYXN0cmFTZXJ2ZXJgIGNvbnN0cnVjdG9yIGRpcmVjdGx5LlxuICAgIC8vXG4gICAgLy8gYHN0b3JhZ2VgIGhlcmUgaXMgKk1hc3RyYS1pbnN0YW5jZS1sZXZlbCogYW5kIHBlcnNpc3RzIHdvcmtmbG93XG4gICAgLy8gc25hcHNob3RzICh3aGVyZSBzdXNwZW5kZWQgYHJlcXVpcmVBcHByb3ZhbGAgdG9vbCBjYWxscyBsaXZlKS5cbiAgICAvLyBJdCdzIHNlcGFyYXRlIGZyb20gZWFjaCBhZ2VudCdzIGBNZW1vcnkuc3RvcmFnZWAsIHdoaWNoIG9ubHlcbiAgICAvLyBjb3ZlcnMgdGhyZWFkIC8gbWVzc2FnZSBoaXN0b3J5LiBXaXRob3V0IGl0LFxuICAgIC8vIGBhZ2VudC5yZXN1bWVTdHJlYW0oKWAgZXJyb3JzIHdpdGggXCJjb3VsZCBub3QgZmluZCBhIHN1c3BlbmRlZFxuICAgIC8vIHJ1blwiIGFuZCB0aGUgYXBwcm92YWwgVUkgaGFuZ3MgYWZ0ZXIgdGhlIHVzZXIgY2xpY2tzIEFwcHJvdmUuXG4gICAgY29uc3QgaW5zdGFuY2VTdG9yYWdlID0gbWVtb3J5QnVpbGRlcj8uaW5zdGFuY2VTdG9yYWdlKCk7XG4gICAgLy8gV2lyZSBNYXN0cmEncyB0cmFjZXIgaW50byBBcHBLaXQncyBnbG9iYWwgT1RlbCBwaXBlbGluZSB2aWFcbiAgICAvLyBgQG1hc3RyYS9vdGVsLWJyaWRnZWAuIE1hc3RyYSBzcGFucyBiZWNvbWUgbmF0aXZlIE9UZWwgc3BhbnMgb25cbiAgICAvLyB3aGF0ZXZlciB0cmFjZXIgcHJvdmlkZXIgYFRlbGVtZXRyeU1hbmFnZXJgIHJlZ2lzdGVyZWQgZHVyaW5nXG4gICAgLy8gYGNyZWF0ZUFwcGAsIHNvIHRoZSBPVExQIGVuZHBvaW50IC8gaGVhZGVycyAvIHNhbXBsaW5nIGFyZVxuICAgIC8vIGVudi1kcml2ZW4gYW5kIHNoYXJlZCB3aXRoIGV2ZXJ5IG90aGVyIEFwcEtpdCBwbHVnaW4uXG4gICAgY29uc3Qgb2JzZXJ2YWJpbGl0eSA9IGF3YWl0IGJ1aWxkT2JzZXJ2YWJpbGl0eSh7XG4gICAgICBzZXJ2aWNlTmFtZTogdGhpcy5uYW1lLFxuICAgICAgZW5hYmxlZDogdGhpcy5jb25maWcub2JzZXJ2YWJpbGl0eSxcbiAgICAgIHRyYWNlclByb3ZpZGVyOiBhd2FpdCBhcHBraXRUZWxlbWV0cnkuZGVmZXJyZWROYXRpdmVUcmFjZXJQcm92aWRlcigpLFxuICAgIH0pO1xuICAgIC8vIE9wdGlvbmFsIE1DUCBleHBvc3VyZTogYnVpbGQgYSBNYXN0cmEgTUNQIHNlcnZlciBmcm9tIHRoZVxuICAgIC8vIHJlZ2lzdGVyZWQgYWdlbnRzIChhbmQsIG9wdC1pbiwgdGhlIGFtYmllbnQgdG9vbHMpIGFuZCByZWdpc3RlclxuICAgIC8vIGl0IG9uIHRoZSBNYXN0cmEgaW5zdGFuY2UuIGBAbWFzdHJhL2V4cHJlc3NgIHNlcnZlcyB0aGUgc3RvY2sgTUNQXG4gICAgLy8gdHJhbnNwb3J0IHJvdXRlcyAoYC9tY3AvPHNlcnZlcklkPi8uLi5gKSBvZmYgYG1jcFNlcnZlcnNgLCBzbyB0aGVcbiAgICAvLyBjYXRjaC1hbGwgZGlzcGF0Y2ggYmVsb3cgYWxyZWFkeSByb3V0ZXMgTUNQIHJlcXVlc3RzIHVuZGVyIE9CTyAtXG4gICAgLy8gbm8gYmVzcG9rZSByb3V0ZSBuZWVkZWQuIFNlZSBgLi9tY3AuanNgLlxuICAgIHRoaXMubWNwID0gYnVpbGRNY3BTZXJ2ZXIoe1xuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIHBsdWdpbk5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGRpc3BsYXlOYW1lOiBNYXN0cmFQbHVnaW4ubWFuaWZlc3QuZGlzcGxheU5hbWUsXG4gICAgICBhZ2VudHM6IHRoaXMuYnVpbHQuYWdlbnRzLFxuICAgICAgYW1iaWVudFRvb2xzOiB0aGlzLmJ1aWx0LmFtYmllbnRUb29scyxcbiAgICB9KTtcbiAgICB0aGlzLm1hc3RyYSA9IG5ldyBNYXN0cmEoe1xuICAgICAgYWdlbnRzOiB0aGlzLmJ1aWx0LmFnZW50cyxcbiAgICAgIC4uLihPYmplY3Qua2V5cyh0aGlzLndvcmtmbG93cykubGVuZ3RoID4gMCA/IHsgd29ya2Zsb3dzOiB0aGlzLndvcmtmbG93cyB9IDoge30pLFxuICAgICAgLi4uKGluc3RhbmNlU3RvcmFnZSA/IHsgc3RvcmFnZTogaW5zdGFuY2VTdG9yYWdlIH0gOiB7fSksXG4gICAgICAuLi4ob2JzZXJ2YWJpbGl0eSA/IHsgb2JzZXJ2YWJpbGl0eSB9IDoge30pLFxuICAgICAgLi4uKHRoaXMubWNwID8geyBtY3BTZXJ2ZXJzOiB7IFt0aGlzLm1jcC5zZXJ2ZXJJZF06IHRoaXMubWNwLnNlcnZlciB9IH0gOiB7fSksXG4gICAgfSk7XG4gICAgdGhpcy5tYXN0cmFBcHAgPSBleHByZXNzKCk7XG4gICAgYXR0YWNoUm91dGVQYXRjaE1pZGRsZXdhcmUodGhpcy5tYXN0cmFBcHApO1xuICAgIC8vIFN0YW1wIGNoYXQgcmVxdWVzdC9yZXNwb25zZSBvbnRvIHRoZSBIVFRQIHJvb3Qgc3BhbiBzbyBNTGZsb3cnc1xuICAgIC8vIFVDIGAqX3RyYWNlX3VuaWZpZWRgIHZpZXcgY2FuIHN1cmZhY2UgdGhlbSAoTWFzdHJhJ3Mgb3duXG4gICAgLy8gYG1hc3RyYS5hZ2VudF9ydW4uKmAgYXR0cmlidXRlcyBzaXQgb24gYSBjaGlsZCBzcGFuIHRoZSB2aWV3XG4gICAgLy8gbmV2ZXIgcmVhZHMpLiBNdXN0IHJ1biBiZWZvcmUgYE1hc3RyYVNlcnZlci5pbml0YCBzbyB0aGUgbGF5ZXJcbiAgICAvLyBzaXRzIGFoZWFkIG9mIHRoZSBhZ2VudCByb3V0ZXMuXG4gICAgYXR0YWNoQ2hhdFR1cm5UZWxlbWV0cnkodGhpcy5tYXN0cmFBcHAsIHtcbiAgICAgIGlkZW50aXR5OiAocmVxdWVzdCkgPT5cbiAgICAgICAgdXNlU2VydmljZVByaW5jaXBhbCh0aGlzLmlkZW50aXR5TW9kZSwgcmVxdWVzdCkgPyBcInNlcnZpY2UtcHJpbmNpcGFsXCIgOiBcIm9ib1wiLFxuICAgIH0pO1xuICAgIHRoaXMubWFzdHJhU2VydmVyID0gbmV3IE1hc3RyYVNlcnZlcih0aGlzLmNvbmZpZywge1xuICAgICAgYXBwOiB0aGlzLm1hc3RyYUFwcCxcbiAgICAgIG1hc3RyYTogdGhpcy5tYXN0cmEsXG4gICAgICBwcmVmaXg6IFwiXCIsXG4gICAgICBjdXN0b21BcGlSb3V0ZXM6IFtcbiAgICAgICAgLi4uYWdlbnRDaGF0Um91dGVzKHRoaXMuY29uZmlnKSxcbiAgICAgICAgd29ya2Zsb3dSb3V0ZSh7XG4gICAgICAgICAgcGF0aDogXCIvcm91dGUvd29ya2Zsb3dzLzp3b3JrZmxvd0lkL3N0cmVhbVwiLFxuICAgICAgICAgIHZlcnNpb246IFwidjdcIixcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMubWFzdHJhU2VydmVyLmluaXQoKTtcbiAgICBhdHRhY2hTdGFsZVJlc3VtZVJlY292ZXJ5KHRoaXMubWFzdHJhQXBwKTtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKFwicmVhZHlcIiwge1xuICAgICAgYWdlbnRzOiBPYmplY3Qua2V5cyh0aGlzLmJ1aWx0LmFnZW50cyksXG4gICAgICB3b3JrZmxvd3M6IE9iamVjdC5rZXlzKHRoaXMud29ya2Zsb3dzKSxcbiAgICAgIGRlZmF1bHRBZ2VudDogdGhpcy5idWlsdC5kZWZhdWx0QWdlbnRJZCxcbiAgICAgIGJhY2tncm91bmRUdXJuczogdGhpcy5jb25maWcuYmFja2dyb3VuZFR1cm5zICE9PSBmYWxzZSxcbiAgICAgIGFwaUFjY2VzczogdGhpcy5jb25maWcuYXBpQWNjZXNzID8/IFwic2NvcGVkXCIsXG4gICAgICBtY3A6IHRoaXMubWNwID8gYCR7dGhpcy5iYXNlUGF0aH0ke3RoaXMubWNwLmh0dHBQYXRofWAgOiBcIm9mZlwiLFxuICAgICAgbGFrZWJhc2U6IG1lbW9yeVBvb2wgIT09IHVuZGVmaW5lZCxcbiAgICAgIGZlZWRiYWNrOiB0aGlzLmZlZWRiYWNrTW9kZSgpLFxuICAgICAgb2JzZXJ2YWJpbGl0eTogb2JzZXJ2YWJpbGl0eSAhPT0gdW5kZWZpbmVkID8gXCJtbGZsb3dcIiA6IFwib2ZmXCIsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlciBmb3Igb25lIGVtYmVkIGA8dHlwZT5gIGJlaGluZCB0aGUgZ2VuZXJpY1xuICogYEdFVCAvZW1iZWQvOnR5cGUvOmlkYCByb3V0ZS4gUmV0dXJucyB0aGUgSlNPTiBib2R5IHRvIHNlbmQgb25cbiAqIHN1Y2Nlc3MsIG9yIGB1bmRlZmluZWRgIHRvIHNpZ25hbCBhIDQwNCAodW5rbm93biAvIGV4cGlyZWQgaWQpLlxuICogYHNpZ25hbGAgYWJvcnRzIHdoZW4gdGhlIGNsaWVudCBkaXNjb25uZWN0cyBzbyBsb25nLXBvbGxpbmdcbiAqIHJlc29sdmVycyAoZS5nLiBgY2hhcnRgKSB1bmJsb2NrIGltbWVkaWF0ZWx5LlxuICovXG50eXBlIEVtYmVkUmVzb2x2ZXIgPSAoXG4gIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICBpZDogc3RyaW5nLFxuICBzaWduYWw6IEFib3J0U2lnbmFsLFxuKSA9PiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDx1bmtub3duPj47XG5cbi8qKlxuICogUGFyc2UgdGhlIG9wdGlvbmFsIGA/dGltZW91dE1zPTxuPmAgcXVlcnkgcGFyYW1ldGVyIGZyb20gYVxuICogYEdFVCAvZW1iZWQvY2hhcnQvOmlkYCByZXF1ZXN0LiBBY2NlcHRzIGEgcG9zaXRpdmUgaW50ZWdlciB1cFxuICogdG8ge0BsaW5rIE1BWF9FTUJFRF9QT0xMX1RJTUVPVVRfTVN9IChjbGFtcGVkKSBhbmQgcmVqZWN0cyBldmVyeXRoaW5nIGVsc2VcbiAqIGFzIGB1bmRlZmluZWRgIHNvIHtAbGluayBmZXRjaENoYXJ0fSBmYWxscyBiYWNrIHRvIGl0cyBkZWZhdWx0LlxuICogRXhwcmVzcyBwcm9kdWNlcyBgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWRgOyB3ZSBub3JtYWxpemVcbiAqIHRvIHRoZSBmaXJzdCBzY2FsYXIgYmVmb3JlIHBhcnNpbmcuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlVGltZW91dE1zKHJhdzogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHYgPSBBcnJheS5pc0FycmF5KHJhdykgPyByYXdbMF0gOiByYXc7XG4gIGlmICh0eXBlb2YgdiAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbiA9IG9iamVjdC50b051bWJlcih2KTtcbiAgaWYgKG4gPT09IHVuZGVmaW5lZCB8fCBuIDw9IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBNYXRoLm1pbihNYXRoLmZsb29yKG4pLCBNQVhfRU1CRURfUE9MTF9USU1FT1VUX01TKTtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgb3B0aW9uYWwgYD9saW1pdD08bj5gIHF1ZXJ5IHBhcmFtZXRlciBmcm9tIGFcbiAqIGBHRVQgL2VtYmVkL2RhdGEvOmlkYCByZXF1ZXN0LiBBY2NlcHRzIGEgbm9uLW5lZ2F0aXZlXG4gKiBpbnRlZ2VyIGFuZCBsZXRzIHRoZSByb3V0ZSBjbGFtcCB0byBgU1RBVEVNRU5UX1JPV19DQVBgO1xuICogcmVqZWN0cyBhbnl0aGluZyBlbHNlIGFzIGB1bmRlZmluZWRgIHNvIHRoZSByb3V0ZSBmYWxscyBiYWNrXG4gKiB0byB0aGUgc2VydmVyLXNpZGUgY2FwLlxuICovXG5mdW5jdGlvbiBwYXJzZVN0YXRlbWVudExpbWl0KHJhdzogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHYgPSBBcnJheS5pc0FycmF5KHJhdykgPyByYXdbMF0gOiByYXc7XG4gIGlmICh0eXBlb2YgdiAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbiA9IG9iamVjdC50b051bWJlcih2KTtcbiAgaWYgKG4gPT09IHVuZGVmaW5lZCB8fCBuIDwgMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE1hdGguZmxvb3Iobik7XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIE1hc3RyYSBwbHVnaW4gb24gYW4gQXBwS2l0IGFwcC4gTW91bnRzIHRoZSBhZ2VudHMsIHRoZVxuICogYC9yb3V0ZS8qYCBjaGF0IHN1cmZhY2UsIGFuZCAodW5sZXNzIGRpc2FibGVkKSB0aGUgTUNQIHRyYW5zcG9ydCB1bmRlclxuICogYC9hcGkvbWFzdHJhYC5cbiAqXG4gKiBAZXhhbXBsZSBNaW5pbWFsIGFwcFxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IG1hc3RyYSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqXG4gKiAvLyBObyBgYWdlbnRzYDogYSBzaW5nbGUgYnVpbHQtaW4gYGRlZmF1bHRgIGFuYWx5c3QgaXMgcmVnaXN0ZXJlZCwgc28gdGhlXG4gKiAvLyBjaGF0IGVuZHBvaW50IHdvcmtzIG91dCBvZiB0aGUgYm94LlxuICogY29uc3QgYXBwID0gYXdhaXQgY3JlYXRlQXBwKHsgcGx1Z2luczogW21hc3RyYSgpXSB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFR3byBhZ2VudHMsIGEgcGlubmVkIG1vZGVsLCBhbmQgR2VuaWVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAsIGxha2ViYXNlIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgY3JlYXRlQWdlbnQsIG1hc3RyYSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqXG4gKiBjb25zdCBhcHAgPSBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgbGFrZWJhc2UoKSxcbiAqICAgICBtYXN0cmEoe1xuICogICAgICAgZGVmYXVsdE1vZGVsOiBcImRhdGFicmlja3MtY2xhdWRlLXNvbm5ldC00LTZcIixcbiAqICAgICAgIGRlZmF1bHRBZ2VudDogXCJhbmFseXN0XCIsXG4gKiAgICAgICBnZW5pZVNwYWNlczogeyBzYWxlczogeyBzcGFjZUlkOiBcIjAxZWYuLi5cIiwgaGludDogXCJvcmRlcnMsIHJldHVybnNcIiB9IH0sXG4gKiAgICAgICBhZ2VudHM6IHtcbiAqICAgICAgICAgYW5hbHlzdDogY3JlYXRlQWdlbnQoe1xuICogICAgICAgICAgIGluc3RydWN0aW9uczogXCJZb3UgYW5zd2VyIHF1ZXN0aW9ucyBhYm91dCBzYWxlcy5cIixcbiAqICAgICAgICAgICBhc3luYyB0b29scyhwbHVnaW5zKSB7XG4gKiAgICAgICAgICAgICByZXR1cm4geyAuLi4oYXdhaXQgcGx1Z2lucy5nZW5pZT8udG9vbGtpdCgpKSB9O1xuICogICAgICAgICAgIH0sXG4gKiAgICAgICAgIH0pLFxuICogICAgICAgICBoZWxwZXI6IGNyZWF0ZUFnZW50KHsgaW5zdHJ1Y3Rpb25zOiBcIllvdSBleHBsYWluIHRoZSBhbmFseXN0J3MgYW5zd2Vycy5cIiB9KSxcbiAqICAgICAgIH0sXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgbWFzdHJhID0gdG9QbHVnaW4oTWFzdHJhUGx1Z2luKTtcbiJdfQ==
|
|
1360
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q0c7QUFFSCxPQUFPLEVBQ0wsY0FBYyxFQUNkLEtBQUssRUFDTCxtQkFBbUIsRUFDbkIsUUFBUSxFQUNSLE1BQU0sRUFDTixRQUFRLEdBS1QsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsY0FBYyxFQUVkLFFBQVEsRUFDUixPQUFPLEVBQ1AsNEJBQTRCLEVBQzVCLHNDQUFzQyxFQUN0Qyw0QkFBNEIsRUFDNUIsYUFBYSxFQUNiLG1CQUFtQixHQUNwQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLE9BQU8sRUFDUCxZQUFZLEVBQ1osTUFBTSxFQUNOLFFBQVEsRUFDUixhQUFhLEdBQ2QsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBTUwsMkJBQTJCLEVBRzNCLGFBQWEsRUFDYixjQUFjLEVBQ2Qsc0JBQXNCLEdBQ3ZCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUErQixrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzFGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTlELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLElBQUksQ0FBQztBQUNuRCxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFFOUIsT0FB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QUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDNUMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDNUMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2hELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLHlCQUF5QixDQUFDLENBQUM7QUFDNUQsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsbUJBQW1CLENBQUMsR0FBWTtJQUN2QyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUM1QyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM1QyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEIsSUFBSSxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDL0MsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdDRztBQUNILE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFwcEtpdCBwbHVnaW4gdGhhdCBidWlsZHMgb25lIG9yIG1vcmUgTWFzdHJhIGBBZ2VudGAgaW5zdGFuY2VzIGFuZFxuICogbW91bnRzIHRoZSBgQG1hc3RyYS9leHByZXNzYCBzZXJ2ZXIuIENsaWVudHMgZHJpdmUgdGhlIGNvbnZlcnNhdGlvblxuICogb3ZlciB0aGUgc3RhbmRhcmQgTWFzdHJhIGFnZW50IHN0cmVhbSAoYEBtYXN0cmEvY2xpZW50LWpzYCdzXG4gKiBgZ2V0QWdlbnQoaWQpLnN0cmVhbSgpYCksIHNvIHRoZXJlJ3Mgbm8gYmVzcG9rZSBjaGF0IHRyYW5zcG9ydCB0b1xuICoga2VlcCBpbiBzeW5jLlxuICpcbiAqIC0gQWdlbnRzOiByZWdpc3RlcmVkIHRocm91Z2ggYGNvbmZpZy5hZ2VudHNgIGF0IHBsdWdpbiBjcmVhdGlvblxuICogICAoe0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbn0pLiBFYWNoIGVudHJ5J3MgYHRvb2xzYCBmaWVsZCBhY2NlcHRzXG4gKiAgIGVpdGhlciBhIHBsYWluIHJlY29yZCBvciBhIGAocGx1Z2lucykgPT4gdG9vbHNgIGNhbGxiYWNrIHRoYXQgZ2V0c1xuICogICBhIHR5cGVkIHNpYmxpbmctcGx1Z2luIGluZGV4ICh7QGxpbmsgTWFzdHJhUGx1Z2luc30pLiBPbWl0XG4gKiAgIGBjb25maWcuYWdlbnRzYCB0byBnZXQgYSBzaW5nbGUgYnVpbHQtaW4gYGRlZmF1bHRgIGFuYWx5c3QuXG4gKiAtIE1vZGVsOiBlYWNoIGFnZW50IGNhbGwgcmVzb2x2ZXMgYSBgTWFzdHJhTW9kZWxDb25maWdgIHZpYVxuICogICB7QGxpbmsgYnVpbGRNb2RlbH0gZnJvbSBgLi9tb2RlbC5qc2AuIFBlci1hZ2VudCBgbW9kZWxgIG92ZXJyaWRlc1xuICogICAoYEFnZW50Q29uZmlnW1wibW9kZWxcIl1gIG9yIGEgYG1vZGVsSWRgIHN0cmluZykgZmxvdyB0aHJvdWdoXG4gKiAgIHtAbGluayBidWlsZEFnZW50c30uXG4gKiAtIE1lbW9yeSAvIHN0b3JhZ2U6IHBlci1hZ2VudCwgYnVpbHQgYnkge0BsaW5rIGNyZWF0ZU1lbW9yeUJ1aWxkZXJ9XG4gKiAgIGZyb20gYC4vbWVtb3J5LmpzYC4gQm90aCBhdXRvLWRlZmF1bHQgdG8gYHRydWVgIHdoZW4gdGhlXG4gKiAgIGBsYWtlYmFzZWAgcGx1Z2luIGlzIHJlZ2lzdGVyZWQgKHVubGVzcyB0aGUgY2FsbGVyIHBhc3NlZFxuICogICBgZmFsc2VgIG9yIGEgY3VzdG9tIGNvbmZpZykuIFN0b3JhZ2UgbmFtZXNwYWNlcyBwZXIgYWdlbnQgdmlhXG4gKiAgIHtAbGluayBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lfSBwZXIgYWdlbnQ7IHRoZSB2ZWN0b3Igc3RvcmUgaXMgYSBzaW5nbGVcbiAqICAgc2hhcmVkIHNpbmdsZXRvbiBhY3Jvc3MgZXZlcnkgYWdlbnQuXG4gKiAtIFNlcnZlcjogdGhlIEV4cHJlc3Mgc3ViYXBwIHdpcmluZyBsaXZlcyBpbiBgLi9zZXJ2ZXIuanNgLlxuICogLSBIVFRQOiBBcHBLaXQgbW91bnRzIHRoaXMgcGx1Z2luIHVuZGVyIGAvYXBpL21hc3RyYWAuIEFsb25nc2lkZSB0aGVcbiAqICAgTWFzdHJhIGFnZW50IHJvdXRlcywgdGhlIHBsdWdpbiByZWdpc3RlcnMgYC9yb3V0ZS9oaXN0b3J5YFxuICogICAobG9hZCArIGNsZWFyIGEgdGhyZWFkJ3MgbWVzc2FnZXMpLCBgL3JvdXRlL3RocmVhZHNgIChsaXN0IHRoZVxuICogICBjYWxsZXIncyBjb252ZXJzYXRpb25zICsgZGVsZXRlIG9uZSksIGAvbW9kZWxzYCwgYC9kZWZhdWx0LW1vZGVsYCxcbiAqICAgYC9zdWdnZXN0aW9uc2AsIGAvcm91dGUvZmVlZGJhY2tgIChsb2cgYSB0aHVtYnMgLyBjb21tZW50IHRvIE1MZmxvd1xuICogICB3aGVuIGZlZWRiYWNrIGlzIGVuYWJsZWQpLCBhbmQgdGhlIGdlbmVyaWMgYC9lbWJlZC86dHlwZS86aWRgXG4gKiAgIHJlc29sdmVyIGZvciBpbmxpbmUgY2hhcnQgLyBkYXRhIG1hcmtlcnMuIEVhY2ggaXMgcmVnaXN0ZXJlZCB0aHJvdWdoXG4gKiAgIEFwcEtpdCdzIGByb3V0ZSgpYCBzbyBpdCBsYW5kcyBpbiB0aGUgcGx1Z2luJ3MgZW5kcG9pbnQgbWFwLCBhbmRcbiAqICAgZXZlcnkgb3V0Ym91bmQgY2FsbCBvbmUgbWFrZXMgcnVucyB0aHJvdWdoIGBleGVjdXRlKClgIChzZWVcbiAqICAgYC4vZGVmYXVsdHMuanNgKS4gVGhlIHN0b2NrIGBAbWFzdHJhL2V4cHJlc3NgIHN1cmZhY2UgaXMgZ2F0ZWRcbiAqICAgYnkgYGNvbmZpZy5hcGlBY2Nlc3NgIChkZWZhdWx0IGBcInNjb3BlZFwiYCk6IG9ubHkgYWdlbnQgaW5mZXJlbmNlLFxuICogICByZWFkLW9ubHkgYWdlbnQgbWV0YWRhdGEsIHRoZSBgL3JvdXRlLypgIHJvdXRlcywgYW5kICh3aGVuIGVuYWJsZWQpXG4gKiAgIE1DUCBhcmUgZGlzcGF0Y2hlZCB0byBNYXN0cmE7IGFkbWluIC8gbXV0YXRpbmcgLyBidWxrLWV4cG9ydCByb3V0ZXNcbiAqICAgYXJlIHJlZnVzZWQgd2l0aCBgNDAzYC4gU2VlIHtAbGluayBpc01hc3RyYVJlcXVlc3RBbGxvd2VkfS5cbiAqIC0gTUNQOiBvcHQgaW4gd2l0aCBgY29uZmlnLm1jcGAgdG8gZXhwb3NlIHRoZSBhZ2VudHMgKGFuZCBvcHRpb25hbGx5XG4gKiAgIHRvb2xzKSBhcyBhIE1hc3RyYSBgTUNQU2VydmVyYC4gSXQgaXMgcmVnaXN0ZXJlZCBvbiB0aGUgYE1hc3RyYWBcbiAqICAgaW5zdGFuY2UgdmlhIGBtY3BTZXJ2ZXJzYCwgc28gYEBtYXN0cmEvZXhwcmVzc2Agc2VydmVzIHRoZSBzdG9ja1xuICogICBNQ1AgdHJhbnNwb3J0IHJvdXRlcyAoYC9tY3AvPHNlcnZlcklkPi8uLi5gKSB1bmRlciB0aGUgbW91bnQuIFNlZVxuICogICBgLi9tY3AuanNgLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBFeGVjdXRpb25FcnJvcixcbiAgZ2VuaWUsXG4gIGdldEV4ZWN1dGlvbkNvbnRleHQsXG4gIGxha2ViYXNlLFxuICBQbHVnaW4sXG4gIHRvUGx1Z2luLFxuICB0eXBlIEV4ZWN1dGlvblJlc3VsdCxcbiAgdHlwZSBJQXBwUm91dGVyLFxuICB0eXBlIFBsdWdpbk1hbmlmZXN0LFxuICB0eXBlIFJlc291cmNlUmVxdWlyZW1lbnQsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIHBsdWdpblJlZ2lzdHJ5LFxuICB0eXBlIElkZW50aXR5TW9kZSxcbiAgaW5zdGFuY2UsXG4gIHJlcXVpcmUsXG4gIGNvbmZpZ3VyZU5hdGl2ZUh0dHBUZWxlbWV0cnksXG4gIGV4Y2x1ZGVVbnBhcmVudGVkT3V0Z29pbmdIdHRwVGVsZW1ldHJ5LFxuICBkZWZlcnJlZE5hdGl2ZVRyYWNlclByb3ZpZGVyLFxuICByZXF1ZXN0VXNlcklkLFxuICB1c2VTZXJ2aWNlUHJpbmNpcGFsLFxufSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IHNlbmRHZW5pZU1lc3NhZ2VGZWVkYmFjayB9IGZyb20gXCJAZGJ4LXRvb2xzL2dlbmllXCI7XG5pbXBvcnQgeyBtb2RlbENhdGFsb2cgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHtcbiAgY29tYmluZUFib3J0U2lnbmFscyxcbiAgdG9FcnJvcixcbiAgZXJyb3JDb250ZXh0LFxuICBsb2dnZXIsXG4gIHRvTnVtYmVyLFxuICBmaXJzdE5vbkVtcHR5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBDaGFydCxcbiAgdHlwZSBHZW5pZUNoYXRSZXF1ZXN0LFxuICB0eXBlIE1hc3RyYUNsaWVudENvbmZpZyxcbiAgdHlwZSBTdGF0ZW1lbnREYXRhLFxuICB0eXBlIEZlZWRiYWNrTW9kZSxcbiAgTWFzdHJhRmVlZGJhY2tSZXF1ZXN0U2NoZW1hLFxuICB0eXBlIE1sZmxvd0ZlZWRiYWNrUmVxdWVzdCxcbiAgdHlwZSBHZW5pZUZlZWRiYWNrUmVxdWVzdCxcbiAgTUFTVFJBX1JPVVRFUyxcbiAgZ2VuaWVSb3V0ZVBhdGgsXG4gIEdlbmllQ2hhdFJlcXVlc3RTY2hlbWEsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB7IHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSwgdG9Nb2RlbERpc3BsYXlOYW1lIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgeyB3b3JrZmxvd1JvdXRlIH0gZnJvbSBcIkBtYXN0cmEvYWktc2RrXCI7XG5pbXBvcnQgdHlwZSB7IEFnZW50IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHsgTWFzdHJhIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9tYXN0cmFcIjtcbmltcG9ydCB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgQW55V29ya2Zsb3cgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtmbG93c1wiO1xuaW1wb3J0IHsgcGlwZVVJTWVzc2FnZVN0cmVhbVRvUmVzcG9uc2UgfSBmcm9tIFwiYWlcIjtcbmltcG9ydCBleHByZXNzIGZyb20gXCJleHByZXNzXCI7XG5cbmltcG9ydCB7XG4gIGJ1aWxkQWdlbnRzLFxuICBGQUxMQkFDS19BR0VOVF9JRCxcbiAgdHlwZSBCdWlsdEFnZW50cyxcbiAgdHlwZSBNYXN0cmFPdXRwdXRQcm9jZXNzb3JGYWN0b3J5LFxufSBmcm9tIFwiLi9hZ2VudHMudHNcIjtcbmltcG9ydCB7IGZldGNoQ2hhcnQgfSBmcm9tIFwiLi9jaGFydC50c1wiO1xuaW1wb3J0IHsgYWdlbnRDaGF0Um91dGVzIH0gZnJvbSBcIi4vY2hhdC50c1wiO1xuaW1wb3J0IHtcbiAgYXR0cmlidXRlZFVzZXJJZCxcbiAgZXhlY3V0aW9uQ29udGV4dFVzZXJJZCxcbiAgTUFTVFJBX0NPTkZJR19TQ0hFTUEsXG4gIHR5cGUgTWFzdHJhUGx1Z2luQ29uZmlnLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7XG4gIGNoYXJ0RmV0Y2hEZWZhdWx0cyxcbiAgZmVlZGJhY2tXcml0ZURlZmF1bHRzLFxuICBnZW5pZUNvbnZlcnNhdGlvblJlYWREZWZhdWx0cyxcbiAgZ2VuaWVDb252ZXJzYXRpb25Xcml0ZURlZmF1bHRzLFxuICBnZW5pZVN1Z2dlc3Rpb25EZWZhdWx0cyxcbiAgbW9kZWxDYXRhbG9ndWVEZWZhdWx0cyxcbiAgc3RhdGVtZW50RGF0YURlZmF1bHRzLFxufSBmcm9tIFwiLi9kZWZhdWx0cy50c1wiO1xuaW1wb3J0IHsgcmVzb2x2ZUZlZWRiYWNrTW9kZSB9IGZyb20gXCIuL2ZlZWRiYWNrLW1vZGUudHNcIjtcbmltcG9ydCB7IHJlc29sdmVGb2xsb3dVcFN1Z2dlc3Rpb25zQ29uZmlnIH0gZnJvbSBcIi4vZm9sbG93LXVwLXN1Z2dlc3Rpb25zLnRzXCI7XG5pbXBvcnQge1xuICBkZWxldGVHZW5pZVRocmVhZCxcbiAgZGVsZXRlR2VuaWVUaHJlYWRNZXNzYWdlLFxuICBnZW5pZUNoYXRTdHJlYW0sXG4gIGxpc3RHZW5pZVRocmVhZE1lc3NhZ2VzLFxuICBsaXN0R2VuaWVUaHJlYWRzLFxuICB0eXBlIEdlbmllQ2hhdFNwYWNlLFxufSBmcm9tIFwiLi9nZW5pZS1jaGF0LnRzXCI7XG5pbXBvcnQgeyBjb2xsZWN0U3BhY2VTdWdnZXN0aW9ucywgcmVzb2x2ZUdlbmllU3BhY2VzLCB0eXBlIEdlbmllU3BhY2VDb25maWcgfSBmcm9tIFwiLi9nZW5pZS50c1wiO1xuaW1wb3J0IHsgcmVzb2x2ZUlkZW50aXR5TW9kZSB9IGZyb20gXCIuL2lkZW50aXR5LnRzXCI7XG5pbXBvcnQgeyBidWlsZE1jcFNlcnZlciwgdHlwZSBSZXNvbHZlZE1jcCB9IGZyb20gXCIuL21jcC50c1wiO1xuaW1wb3J0IHsgY3JlYXRlTWFzdHJhTGFrZWJhc2VQb29sLCBjcmVhdGVNZW1vcnlCdWlsZGVyLCBuZWVkc0xha2ViYXNlIH0gZnJvbSBcIi4vbWVtb3J5LnRzXCI7XG5pbXBvcnQge1xuICBmbHVzaERpcmVjdE1sZmxvd1RyYWNpbmcsXG4gIGxvZ0ZlZWRiYWNrLFxuICBtbGZsb3dFbmFibGVkLFxuICBtbGZsb3dFeHBlcmltZW50TWFuYWdlclVybCxcbn0gZnJvbSBcIi4vbWxmbG93LnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlRGVmYXVsdE1vZGVsSWQgfSBmcm9tIFwiLi9tb2RlbC50c1wiO1xuaW1wb3J0IHsgYnVpbGRPYnNlcnZhYmlsaXR5LCBjb25maWd1cmVPdGVsUHJvcGFnYXRpb24gfSBmcm9tIFwiLi9vYnNlcnZhYmlsaXR5LnRzXCI7XG5pbXBvcnQgeyBwcm92aXNpb25SZW1vdGVTa2lsbHMgfSBmcm9tIFwiLi9yZW1vdGUtc2tpbGxzLnRzXCI7XG5pbXBvcnQge1xuICBhdHRhY2hSb3V0ZVBhdGNoTWlkZGxld2FyZSxcbiAgYXR0YWNoU3RhbGVSZXN1bWVSZWNvdmVyeSxcbiAgY2xlYXJUcnVzdGVkUmVxdWVzdENvbnRleHQsXG4gIGNyZWF0ZVJlcXVlc3RDb250ZXh0LFxuICBpc01hc3RyYVJlcXVlc3RBbGxvd2VkLFxuICBNYXN0cmFTZXJ2ZXIsXG4gIHN0YW1wUmVxdWVzdENvbnRleHRVc2VyLFxufSBmcm9tIFwiLi9zZXJ2ZXIudHNcIjtcbmltcG9ydCB7IHJlc29sdmVTZXJ2aW5nQ29uZmlnIH0gZnJvbSBcIi4vc2VydmluZy50c1wiO1xuaW1wb3J0IHsgZmV0Y2hTdGF0ZW1lbnRFbWJlZERhdGEsIFNUQVRFTUVOVF9ST1dfQ0FQIH0gZnJvbSBcIi4vc3RhdGVtZW50LnRzXCI7XG5pbXBvcnQgeyBhdHRhY2hDaGF0VHVyblRlbGVtZXRyeSwgcmVnaXN0ZXJBcHBNbGZsb3dUcmFjZUluZm9Qcm9jZXNzb3IgfSBmcm9tIFwiLi90ZWxlbWV0cnkudHNcIjtcbmltcG9ydCB7IGludmFsaWRGaWVsZHMgfSBmcm9tIFwiLi92YWxpZGF0aW9uLnRzXCI7XG5pbXBvcnQgeyBpbmxpbmVTa2lsbHNGcm9tTG9jYWxNb3VudHMgfSBmcm9tIFwiLi93b3Jrc3BhY2VzLnRzXCI7XG5cbmNvbnN0IEdFTklFX01BTklGRVNUID0gcGx1Z2luUmVnaXN0cnkuZGF0YShnZW5pZSkucGx1Z2luLm1hbmlmZXN0O1xuY29uc3QgTEFLRUJBU0VfTUFOSUZFU1QgPSBwbHVnaW5SZWdpc3RyeS5kYXRhKGxha2ViYXNlKS5wbHVnaW4ubWFuaWZlc3Q7XG5cbi8qKiBDZWlsaW5nIG9uIHRoZSBgP3RpbWVvdXRNcz1gIGxvbmctcG9sbCBidWRnZXQgYSBjbGllbnQgbWF5IHJlcXVlc3QuICovXG5jb25zdCBNQVhfRU1CRURfUE9MTF9USU1FT1VUX01TID0gNSAqIDYwXzAwMDtcblxuLyoqIFN0YWJsZSBjbGllbnQgbWVzc2FnZSB3aGVuIHRoZSB3b3Jrc3BhY2UncyBtb2RlbCBjYXRhbG9ndWUgY2FuJ3QgYmUgcmVhZC4gKi9cbmNvbnN0IE1PREVMX0NBVEFMT0dVRV9GQUlMRURfTUVTU0FHRSA9IFwiQ291bGQgbm90IHJlYWQgdGhlIHdvcmtzcGFjZSdzIG1vZGVsIGNhdGFsb2d1ZVwiO1xuXG4vKiogU3RhYmxlIGNsaWVudCBtZXNzYWdlIGZvciBhIGZlZWRiYWNrIGJvZHkgdGhhdCBmYWlscyBzY2hlbWEgdmFsaWRhdGlvbi4gKi9cbmNvbnN0IElOVkFMSURfRkVFREJBQ0tfTUVTU0FHRSA9IFwiSW52YWxpZCBmZWVkYmFjayByZXF1ZXN0XCI7XG5cbi8qKiBDYWNoZSBuYW1lc3BhY2UgZm9yIHN0YXRlbWVudCByZXN1bHQgc2V0cywgbWF0Y2hpbmcgdGhlIGNoYXJ0IGNhY2hlJ3MgZm9ybS4gKi9cbmNvbnN0IFNUQVRFTUVOVF9DQUNIRV9OQU1FU1BBQ0UgPSBcIm1hc3RyYTpzdGF0ZW1lbnRcIjtcblxuLyoqXG4gKiBBcHBLaXQgcGx1Z2luIChyZWdpc3RlcmVkIG5hbWU6IGBtYXN0cmFgKSB0aGF0IGhvc3RzIE1hc3RyYSBhZ2VudHNcbiAqIHdpdGggb3B0aW9uYWwgTGFrZWJhc2UtYmFja2VkIG1lbW9yeSBhbmQgQUkgU0RLIGNoYXQgcm91dGVzIHVuZGVyXG4gKiB0aGUgcGx1Z2luIG1vdW50ICh0eXBpY2FsbHkgYC9hcGkvbWFzdHJhYCkuXG4gKlxuICogQGV4YW1wbGUgUmVnaXN0ZXIgdGhlIHBsdWdpblxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgbGFrZWJhc2UgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBjcmVhdGVBZ2VudCwgbWFzdHJhIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuICpcbiAqIC8vIGBsYWtlYmFzZWAgZmlyc3Q6IHJlZ2lzdGVyaW5nIGl0IGF1dG8tZW5hYmxlcyBNYXN0cmEgc3RvcmFnZSArIG1lbW9yeS5cbiAqIGNvbnN0IGFwcCA9IGF3YWl0IGNyZWF0ZUFwcCh7XG4gKiAgIHBsdWdpbnM6IFtcbiAqICAgICBsYWtlYmFzZSgpLFxuICogICAgIG1hc3RyYSh7XG4gKiAgICAgICBnZW5pZVNwYWNlczogeyBkZWZhdWx0OiBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEISB9LFxuICogICAgICAgYWdlbnRzOiBjcmVhdGVBZ2VudCh7XG4gKiAgICAgICAgIG5hbWU6IFwiYW5hbHlzdFwiLFxuICogICAgICAgICBpbnN0cnVjdGlvbnM6IFwiWW91IGFuc3dlciBxdWVzdGlvbnMgYWJvdXQgcmV2ZW51ZSBhbmQgcmV0dXJucy5cIixcbiAqICAgICAgICAgYXN5bmMgdG9vbHMocGx1Z2lucykge1xuICogICAgICAgICAgIHJldHVybiB7IC4uLihhd2FpdCBwbHVnaW5zLmdlbmllPy50b29sa2l0KCkpIH07XG4gKiAgICAgICAgIH0sXG4gKiAgICAgICB9KSxcbiAqICAgICB9KSxcbiAqICAgXSxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGUgUmVhZCB0aGUgYWdlbnRzIGJhY2sgb2ZmIHRoZSBBcHBLaXQgaW5zdGFuY2VcbiAqIGBgYHRzXG4gKiBjb25zdCBhZ2VudElkcyA9IGFwcC5tYXN0cmEubGlzdCgpO1xuICogY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgYXBwLm1hc3RyYS5saXN0TW9kZWxzKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE1hc3RyYVBsdWdpbiBleHRlbmRzIFBsdWdpbjxNYXN0cmFQbHVnaW5Db25maWc+IHtcbiAgLy8gQW5ub3RhdGVkIHJhdGhlciB0aGFuIGxlZnQgdG8gYHNhdGlzZmllc2A6IHRoZSBjb25maWcgc2NoZW1hJ3MgdHlwZSBjb21lc1xuICAvLyBmcm9tIGBAdHlwZXMvanNvbi1zY2hlbWFgLCB3aGljaCB0aGlzIHBhY2thZ2UgZG9lcyBub3QgZGVwZW5kIG9uLCBzbyBhblxuICAvLyBpbmZlcnJlZCBtYW5pZmVzdCB0eXBlIGNhbm5vdCBiZSBuYW1lZCBpbiB0aGUgZW1pdHRlZCBkZWNsYXJhdGlvbi4gVGhlXG4gIC8vIGBQbHVnaW5NYW5pZmVzdDxcIm1hc3RyYVwiPmAgcGFyYW1ldGVyIHN0aWxsIGNhcnJpZXMgdGhlIGxpdGVyYWwgbmFtZSBpbnRvXG4gIC8vIGB0b1BsdWdpbigpYCdzIGZhY3RvcnkgdHlwZS5cbiAgc3RhdGljIG1hbmlmZXN0OiBQbHVnaW5NYW5pZmVzdDxcIm1hc3RyYVwiPiA9IHtcbiAgICBuYW1lOiBcIm1hc3RyYVwiLFxuICAgIGRpc3BsYXlOYW1lOiBcIk1hc3RyYVwiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJCdWlsZHMgYSBNYXN0cmEgQWdlbnQgd2l0aCB1c2VyLXNjb3BlZCB3b3Jrc3BhY2UgYXV0aCAoYXNVc2VyKSBcIiArXG4gICAgICBcImFuZCBvcHRpb25hbCBQb3N0Z3Jlcy1iYWNrZWQgTWFzdHJhIE1lbW9yeSB2aWEgdGhlIGBsYWtlYmFzZWAgcGx1Z2luLlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgcmVzb3VyY2VzOiB7XG4gICAgICByZXF1aXJlZDogW10sXG4gICAgICBvcHRpb25hbDogW1xuICAgICAgICAvLyBSZXVzZSB0aGUgR2VuaWUgc3BhY2UtaWQgYmluZGluZyBkZWNsYXJlZCBieSBBcHBLaXQncyBgZ2VuaWVgXG4gICAgICAgIC8vIG1hbmlmZXN0IHNvIHRoZSByZXNvdXJjZS1iaW5kaW5nIHNoYXBlIGlzIGlkZW50aWNhbCB0byBBcHBLaXQncyBhbmRcbiAgICAgICAgLy8gYW4gZXhpc3RpbmcgYGFwcC55YW1sYCAvIGBnZW5pZSh7IHNwYWNlcyB9KWAgd2lyaW5nIGtlZXBzIHdvcmtpbmcuXG4gICAgICAgIC8vIFRoZSBidWlsdC1pbiBHZW5pZSB0b29scyB0YWxrIHRvIEdlbmllIGRpcmVjdGx5IHRocm91Z2hcbiAgICAgICAgLy8gYEBkYngtdG9vbHMvZ2VuaWVgLCBzbyBvbmx5IHRoZSBiaW5kaW5nIGlzIHNoYXJlZCwgbm90IHRoZSBwbHVnaW4nc1xuICAgICAgICAvLyB0b29scy5cbiAgICAgICAgLi4uR0VOSUVfTUFOSUZFU1QucmVzb3VyY2VzLnJlcXVpcmVkLFxuICAgICAgICAuLi5MQUtFQkFTRV9NQU5JRkVTVC5yZXNvdXJjZXMucmVxdWlyZWQsXG4gICAgICBdLFxuICAgIH0sXG4gICAgY29uZmlnOiB7IHNjaGVtYTogTUFTVFJBX0NPTkZJR19TQ0hFTUEgfSxcbiAgfTtcblxuICAvKipcbiAgICogVGlnaHRlbiByZXNvdXJjZSByZXF1aXJlbWVudHMgYmFzZWQgb24gd2hpY2ggZmVhdHVyZXMgYXJlIGVuYWJsZWQuXG4gICAqIEFwcEtpdCBjYWxscyB0aGlzIGF0IHJlZ2lzdHJhdGlvbiB0aW1lIChjb25maWctYXdhcmUpIHNvIGRpc2FibGVkXG4gICAqIGZlYXR1cmVzIGRvbid0IHN1cmZhY2UgdGhlaXIgcmVzb3VyY2UgYXNrcyB0byB0aGUgaG9zdCBhcHAuXG4gICAqL1xuICBzdGF0aWMgZ2V0UmVzb3VyY2VSZXF1aXJlbWVudHMoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBSZXNvdXJjZVJlcXVpcmVtZW50W10ge1xuICAgIGNvbnN0IHJlc291cmNlczogUmVzb3VyY2VSZXF1aXJlbWVudFtdID0gW107XG4gICAgY29uc3QgZW5hYmxlZE1hbmlmZXN0czogUGx1Z2luTWFuaWZlc3Q8c3RyaW5nPltdID0gW107XG5cbiAgICBpZiAobmVlZHNMYWtlYmFzZShjb25maWcpKSB7XG4gICAgICBlbmFibGVkTWFuaWZlc3RzLnB1c2goTEFLRUJBU0VfTUFOSUZFU1QpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG0gb2YgZW5hYmxlZE1hbmlmZXN0cykge1xuICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBtLnJlc291cmNlcy5yZXF1aXJlZCkge1xuICAgICAgICByZXNvdXJjZXMucHVzaCh7IC4uLnJlc291cmNlLCByZXF1aXJlZDogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc291cmNlcztcbiAgfVxuXG4gIHByaXZhdGUgbG9nZ2VyID0gbG9nZ2VyKHRoaXMpO1xuICBwcml2YXRlIGJ1aWx0OiBCdWlsdEFnZW50cyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1hc3RyYTogTWFzdHJhIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWFzdHJhQXBwOiBleHByZXNzLkV4cHJlc3MgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtYXN0cmFTZXJ2ZXI6IE1hc3RyYVNlcnZlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IG91dHB1dFByb2Nlc3NvckZhY3RvcmllczogTWFzdHJhT3V0cHV0UHJvY2Vzc29yRmFjdG9yeVtdID0gW107XG4gIC8qKiBDb2RlLWRlZmluZWQgd29ya2Zsb3dzIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBNYXN0cmEgaW5zdGFuY2UgaXMgYnVpbHQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgd29ya2Zsb3dzOiBSZWNvcmQ8c3RyaW5nLCBBbnlXb3JrZmxvdz4gPSB7XG4gICAgLi4uKHRoaXMuY29uZmlnLndvcmtmbG93cyA/PyB7fSksXG4gIH07XG4gIC8qKlxuICAgKiBUaGUgb3B0aW9uYWwgTUNQIHNlcnZlciBleHBvc2luZyB0aGlzIHBsdWdpbidzIGFnZW50cyAvIHRvb2xzLCBvclxuICAgKiBgbnVsbGAgd2hlbiBgY29uZmlnLm1jcGAgaXMgZGlzYWJsZWQgKHRoZSBkZWZhdWx0KS4gQnVpbHQgaW5cbiAgICoge0BsaW5rIGJ1aWxkQWdlbnRBbmRTZXJ2ZXJ9IGFuZCByZWdpc3RlcmVkIG9uIHRoZSBNYXN0cmEgaW5zdGFuY2UuXG4gICAqL1xuICBwcml2YXRlIG1jcDogUmVzb2x2ZWRNY3AgfCBudWxsID0gbnVsbDtcbiAgLyoqIFJlc29sdmVkIGZlZWRiYWNrIGRlc3RpbmF0aW9uIHB1Ymxpc2hlZCB0byBzZXJ2ZXIgYW5kIGJyb3dzZXIgY2xpZW50cy4gKi9cbiAgcHJpdmF0ZSByZXNvbHZlZEZlZWRiYWNrTW9kZTogRmVlZGJhY2tNb2RlID0gXCJub25lXCI7XG4gIC8qKlxuICAgKiBSZXNvbHZlZCBBcHBLaXQgaWRlbnRpdHkgbW9kZTogdGhlIGlkZW50aXR5IHRoZSBjaGF0IHBhdGgncyBEYXRhYnJpY2tzXG4gICAqIGNhbGxzIHJ1biBhcy4gUmVhZCBvbmNlIGF0IHNldHVwIHNvIGFuIGludmFsaWQgYGdlbmllSWRlbnRpdHlgIGZhaWxzIHRoZSBhcHBcbiAgICogYm9vdCByYXRoZXIgdGhhbiB0aGUgZmlyc3QgcmVxdWVzdCwgYW5kIHNvIGV2ZXJ5IHJlcXVlc3QgYWdyZWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBpZGVudGl0eU1vZGU6IElkZW50aXR5TW9kZSA9IFwidXNlclwiO1xuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBSZXNvbHZlIHRoZSBpZGVudGl0eSBtb2RlIHVwIGZyb250IHNvIGFuIGludmFsaWQgYGdlbmllSWRlbnRpdHlgIGZhaWxzIHRoZVxuICAgIC8vIGFwcCBib290IHdpdGggYSBjbGVhciBtZXNzYWdlIHJhdGhlciB0aGFuIDUwMC1pbmcgdGhlIGZpcnN0IGNoYXQgcmVxdWVzdC5cbiAgICB0aGlzLmlkZW50aXR5TW9kZSA9IHJlc29sdmVJZGVudGl0eU1vZGUodGhpcy5jb25maWcuZ2VuaWVJZGVudGl0eSk7XG4gICAgY29uc3Qgc3BhY2VzID0gcmVzb2x2ZUdlbmllU3BhY2VzKHRoaXMuY29uZmlnLCB0aGlzLmNvbnRleHQpO1xuICAgIHRoaXMucmVzb2x2ZWRGZWVkYmFja01vZGUgPSByZXNvbHZlRmVlZGJhY2tNb2RlKHRoaXMuY29uZmlnLmZlZWRiYWNrTW9kZSwge1xuICAgICAgZ2VuaWU6IHRoaXMuY29uZmlnLmdlbmllQWdlbnRNb2RlICE9PSBmYWxzZSAmJiBPYmplY3Qua2V5cyhzcGFjZXMpLmxlbmd0aCA+IDAsXG4gICAgICBtbGZsb3c6IG1sZmxvd0VuYWJsZWQoKSxcbiAgICB9KTtcbiAgICB0aGlzLmNvbmZpZy5mZWVkYmFja01vZGUgPSB0aGlzLnJlc29sdmVkRmVlZGJhY2tNb2RlO1xuICAgIGlmICh0aGlzLmNvbmZpZy5vYnNlcnZhYmlsaXR5ICE9PSBmYWxzZSkge1xuICAgICAgYXdhaXQgY29uZmlndXJlTmF0aXZlSHR0cFRlbGVtZXRyeSh7XG4gICAgICAgIC8vIEEgbG93LWxldmVsIHJlcXVlc3Qgd2l0aG91dCBhbiBhY3RpdmUgc2VtYW50aWMgc3BhbiBiZWNvbWVzIGEgbm9pc3lcbiAgICAgICAgLy8gc3RhbmRhbG9uZSB0cmFjZS4gUmVxdWVzdHMgaW5zaWRlIGFuIGFnZW50L3Rvb2wgc3BhbiByZW1haW4gdmlzaWJsZS5cbiAgICAgICAgb3V0Z29pbmdGaWx0ZXI6IGV4Y2x1ZGVVbnBhcmVudGVkT3V0Z29pbmdIdHRwVGVsZW1ldHJ5LFxuICAgICAgfSk7XG4gICAgICBhd2FpdCByZWdpc3RlckFwcE1sZmxvd1RyYWNlSW5mb1Byb2Nlc3NvcigpO1xuICAgIH1cbiAgICAvLyBXYWl0IHVudGlsIHNpYmxpbmcgcGx1Z2lucyAoZS5nLiBgbGFrZWJhc2VgKSBmaW5pc2ggYHNldHVwKClgIHNvXG4gICAgLy8gdGhlIGxha2ViYXNlIHBvb2wgaXMgdmFsaWQgd2hlbiBzdG9yYWdlL21lbW9yeSBhcmUgZW5hYmxlZC5cbiAgICB0aGlzLmNvbnRleHQ/Lm9uTGlmZWN5Y2xlKFwic2V0dXA6Y29tcGxldGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uZmlndXJlT3RlbFByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLmFwcGx5TGFrZWJhc2VBdXRvRGVmYXVsdHMoKTtcbiAgICAgIGF3YWl0IHRoaXMuYnVpbGRBZ2VudEFuZFNlcnZlcigpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaW5zdGFuY2UgYWdlbnQtYmFja2VkIERhdGFicmlja3MgY2FsbHMgc2hvdWxkIHJ1biB0aHJvdWdoIGZvclxuICAgKiBgcmVxYCwgaG9ub3Jpbmcge0BsaW5rIGlkZW50aXR5TW9kZX0uIERpcmVjdCBHZW5pZSBjb252ZXJzYXRpb24gcm91dGVzIHVzZVxuICAgKiBBcHBLaXQgT0JPIHRocm91Z2ggYGFzVXNlcihyZXEpYCBpbnN0ZWFkLlxuICAgKlxuICAgKiBJbiBgXCJ1c2VyXCJgIG1vZGUgKHRoZSBkZWZhdWx0KSB0aGlzIGlzIGB0aGlzLmFzVXNlcihyZXEpYCAtIEFwcEtpdCdzIG93blxuICAgKiBwcm94eSB0aGF0IHJ1bnMgZXZlcnkgY2FsbCBpbnNpZGUgYHJ1bkluVXNlckNvbnRleHRgLCBzbyBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYFxuICAgKiByZXR1cm5zIHRoZSBjYWxsZXIncyBPQk8gY2xpZW50LiBJbiBgXCJzZXJ2aWNlLXByaW5jaXBhbFwiYCBtb2RlIGl0IGlzIGB0aGlzYFxuICAgKiB1bndyYXBwZWQsIHNvIHRoZSBzYW1lIG1ldGhvZHMgcnVuIGluIHRoZSBhbWJpZW50IHNlcnZpY2UgY29udGV4dCBhbmRcbiAgICogYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgcmV0dXJucyB0aGUgYXBwIHNlcnZpY2UgcHJpbmNpcGFsJ3MgY2xpZW50IC0gdGhlIHNhbWVcbiAgICogXCJqdXN0IGRvbid0IGVudGVyIGBhc1VzZXJgXCIgcGF0dGVybiBBcHBLaXQncyBvd24gc2VydmljZS1jb250ZXh0IGNhbGxzIHVzZS4gT25lXG4gICAqIGhlbHBlciBjb3ZlcnMgdGhlIGFnZW50LWJhY2tlZCB3b3Jrc3BhY2UgY2FsbHMgKHNlcnZpbmcgY2F0YWxvZ3VlLCBnZW5lcmFsXG4gICAqIHN1Z2dlc3Rpb25zLCBkaXNwYXRjaGVkIGBhc2tfZ2VuaWVgLCBzdGF0ZW1lbnQgZmV0Y2gsIGZlZWRiYWNrKSwgc28gdGhlXG4gICAqIGlkZW50aXR5IGRlY2lzaW9uIGxpdmVzIGluIG9uZSBwbGFjZS5cbiAgICovXG4gIHByaXZhdGUgc2NvcGVkU2VsZihyZXE6IGV4cHJlc3MuUmVxdWVzdCk6IHRoaXMge1xuICAgIHJldHVybiB1c2VTZXJ2aWNlUHJpbmNpcGFsKHRoaXMuaWRlbnRpdHlNb2RlLCByZXEpID8gdGhpcyA6IHRoaXMuYXNVc2VyKHJlcSk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiB0aGUgYGxha2ViYXNlYCBwbHVnaW4gaXMgcmVnaXN0ZXJlZCwgYXV0by1lbmFibGUgYHN0b3JhZ2VgXG4gICAqIGFuZCBgbWVtb3J5YCB1bmxlc3MgdGhlIGNhbGxlciBvcHRlZCBvdXQgZXhwbGljaXRseSAoYGZhbHNlYCBvciBhXG4gICAqIGN1c3RvbSBjb25maWcgb2JqZWN0KS4gUnVuIGFmdGVyIGBzZXR1cDpjb21wbGV0ZWAgc28gdGhlIGxvb2t1cFxuICAgKiBpcyByZWxpYWJsZTogYW55IHBsdWdpbiB0aGF0IHJlZ2lzdGVycyBpdHNlbGYgc3luY2hyb25vdXNseSBpc1xuICAgKiBhbHJlYWR5IGluIHRoZSByZWdpc3RyeSBieSB0aGUgdGltZSB0aGlzIGZpcmVzLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseUxha2ViYXNlQXV0b0RlZmF1bHRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGhhc0xha2ViYXNlID0gaW5zdGFuY2UodGhpcy5jb250ZXh0LCBsYWtlYmFzZSkgIT09IHVuZGVmaW5lZDtcbiAgICBpZiAoIWhhc0xha2ViYXNlKSByZXR1cm47XG4gICAgaWYgKHRoaXMuY29uZmlnLnN0b3JhZ2UgPT09IHVuZGVmaW5lZCkgdGhpcy5jb25maWcuc3RvcmFnZSA9IHRydWU7XG4gICAgaWYgKHRoaXMuY29uZmlnLm1lbW9yeSA9PT0gdW5kZWZpbmVkKSB0aGlzLmNvbmZpZy5tZW1vcnkgPSB0cnVlO1xuICB9XG5cbiAgLyoqIERyYWluIE1hc3RyYSByZXNvdXJjZXMsIHRoZW4gZmx1c2ggcGVuZGluZyBkaXJlY3QgTUxmbG93IHRyYWNlcy4gKi9cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMubWFzdHJhPy5zaHV0ZG93bigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmbHVzaERpcmVjdE1sZmxvd1RyYWNpbmcoKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiZXJyb3IgZmx1c2hpbmcgZGlyZWN0IE1MZmxvdyB0cmFjZXNcIiwge1xuICAgICAgICAgIGVycm9yOiB0b0Vycm9yKGVyciksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogSWRzIG9mIGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnQgaW4gcmVnaXN0cmF0aW9uIG9yZGVyLiBNYXRjaGVzXG4gICAgICAgKiBBcHBLaXQgYGFnZW50cy5saXN0KClgIHNvIGNhbGxlcnMgY2FuIGl0ZXJhdGUgdGhlIHJlZ2lzdHJ5IHRoZVxuICAgICAgICogc2FtZSB3YXkgdW5kZXIgYm90aCBwbHVnaW5zLlxuICAgICAgICovXG4gICAgICBsaXN0OiAoKTogc3RyaW5nW10gPT4gT2JqZWN0LmtleXModGhpcy5idWlsdD8uYWdlbnRzID8/IHt9KSxcbiAgICAgIC8qKlxuICAgICAgICogTG9vayB1cCBhIHJlZ2lzdGVyZWQgYWdlbnQgYnkgaWQuIFJldHVybnMgYG51bGxgIChub3RcbiAgICAgICAqIHVuZGVmaW5lZCkgd2hlbiB1bmtub3duIHNvIGNhbGwgc2l0ZXMgY2FuIGVhcmx5LXJldHVybiB3aXRob3V0XG4gICAgICAgKiBhIHNlcGFyYXRlIGBpbmAgY2hlY2suXG4gICAgICAgKi9cbiAgICAgIGdldDogKGlkOiBzdHJpbmcpOiBBZ2VudCB8IG51bGwgPT4gdGhpcy5idWlsdD8uYWdlbnRzW2lkXSA/PyBudWxsLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgYWdlbnQgdGhlIGNsaWVudCBjb252ZXJzZXMgd2l0aCB3aGVuIGl0IGRvZXNuJ3QgbmFtZSBvbmUuXG4gICAgICAgKiBSZXNvbHZlcyB0byBgY29uZmlnLmRlZmF1bHRBZ2VudGAsIHRoZSBmaXJzdCByZWdpc3RlcmVkIGlkLCBvclxuICAgICAgICogdGhlIGJ1aWx0LWluIGBkZWZhdWx0YCBmYWxsYmFjay5cbiAgICAgICAqL1xuICAgICAgZ2V0RGVmYXVsdDogKCk6IEFnZW50IHwgbnVsbCA9PlxuICAgICAgICAodGhpcy5idWlsdCAmJiB0aGlzLmJ1aWx0LmFnZW50c1t0aGlzLmJ1aWx0LmRlZmF1bHRBZ2VudElkXSkgPz8gbnVsbCxcbiAgICAgIC8qKlxuICAgICAgICogUmVnaXN0ZXIgYW4gb3V0cHV0LXByb2Nlc3NvciBmYWN0b3J5IGJlZm9yZSBhZ2VudHMgYXJlIGJ1aWx0LlxuICAgICAgICpcbiAgICAgICAqIERlZmVycmVkIHNpYmxpbmcgcGx1Z2lucyB1c2UgdGhpcyBnZW5lcmljIGV4dGVuc2lvbiBwb2ludCB3aXRob3V0XG4gICAgICAgKiBhZGRpbmcgcHJvdmlkZXItc3BlY2lmaWMgYmVoYXZpb3IgdG8gdGhlIE1hc3RyYSBwbHVnaW4uXG4gICAgICAgKi9cbiAgICAgIHJlZ2lzdGVyT3V0cHV0UHJvY2Vzc29yOiAoZmFjdG9yeTogTWFzdHJhT3V0cHV0UHJvY2Vzc29yRmFjdG9yeSk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAodGhpcy5idWlsdCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1hc3RyYSBvdXRwdXQgcHJvY2Vzc29ycyBtdXN0IGJlIHJlZ2lzdGVyZWQgYmVmb3JlIGFnZW50cyBhcmUgYnVpbHRcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vdXRwdXRQcm9jZXNzb3JGYWN0b3JpZXMucHVzaChmYWN0b3J5KTtcbiAgICAgIH0sXG4gICAgICAvKiogUmVnaXN0ZXIgYSB3b3JrZmxvdyBiZWZvcmUgdGhlIGhvc3RlZCBNYXN0cmEgaW5zdGFuY2UgaXMgYnVpbHQuICovXG4gICAgICByZWdpc3RlcldvcmtmbG93OiAoa2V5OiBzdHJpbmcsIHdvcmtmbG93OiBBbnlXb3JrZmxvdyk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAodGhpcy5tYXN0cmEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNYXN0cmEgd29ya2Zsb3dzIG11c3QgYmUgcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIGluc3RhbmNlIGlzIGJ1aWx0XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLndvcmtmbG93c1trZXldKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNYXN0cmEgd29ya2Zsb3cga2V5IFwiJHtrZXl9XCIgaXMgYWxyZWFkeSByZWdpc3RlcmVkYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53b3JrZmxvd3Nba2V5XSA9IHdvcmtmbG93O1xuICAgICAgfSxcbiAgICAgIC8qKiBSZWdpc3RlcmVkIHdvcmtmbG93IGtleXMgaW4gaW5zZXJ0aW9uIG9yZGVyLiAqL1xuICAgICAgbGlzdFdvcmtmbG93czogKCk6IHN0cmluZ1tdID0+IE9iamVjdC5rZXlzKHRoaXMud29ya2Zsb3dzKSxcbiAgICAgIC8qKiBVbmRlcmx5aW5nIE1hc3RyYSBpbnN0YW5jZSBmb3IgYWR2YW5jZWQgdXNlIChjdXN0b20gcm91dGVzIGV0Yy4pLiAqL1xuICAgICAgZ2V0TWFzdHJhOiAoKSA9PiB0aGlzLm1hc3RyYSxcbiAgICAgIC8qKlxuICAgICAgICogQnVpbGQgdGhlIGBSZXF1ZXN0Q29udGV4dGAgYW4gYWdlbnQgdHVybiBkcml2ZW4gZnJvbSBPVVRTSURFIHRoaXNcbiAgICAgICAqIHBsdWdpbidzIHJvdXRlcyBuZWVkcywgc3VjaCBhcyBhbm90aGVyIHBsdWdpbidzIGVuZHBvaW50IG9yIGEgc2NoZWR1bGVkXG4gICAgICAgKiBqb2IuXG4gICAgICAgKlxuICAgICAgICogTWFzdHJhJ3MgdXNlci1zY29wZWQgdG9vbHMgLSBgYXNrX2dlbmllYCBtb3N0IHZpc2libHkgLSByZWFkIHRoZSBBcHBLaXRcbiAgICAgICAqIHVzZXIgb2ZmIHRoZSByZXF1ZXN0IGNvbnRleHQsIHdoaWNoIG9ubHkgdGhlIEhUVFAgbWlkZGxld2FyZSBzdGFtcHMuXG4gICAgICAgKiBDYWxsaW5nIGBhZ2VudC5nZW5lcmF0ZWAgd2l0aCBhIHJhdyBwcm9tcHQgdGhlcmVmb3JlIGFuc3dlcnMgXCJ0aGUgZGF0YVxuICAgICAgICogc291cmNlIGlzIHVucmVhY2hhYmxlXCIgd2hlcmUgdGhlIGNoYXQgcm91dGVzIGFuc3dlciB3aXRoIHJlYWwgZGF0YS5cbiAgICAgICAqIFBhc3NpbmcgdGhpcyBhcyBgcmVxdWVzdENvbnRleHRgIGNsb3NlcyB0aGF0IGdhcCwgc28gYW4gb3V0LW9mLWJhbmQgdHVyblxuICAgICAgICogaGFzIGV4YWN0bHkgdGhlIGNhcGFiaWxpdGllcyBhIGNoYXQgdHVybiBoYXMuXG4gICAgICAgKlxuICAgICAgICogTXVzdCBiZSBjYWxsZWQgSU5TSURFIGFuIGBhc1VzZXIocmVxKWAgc2NvcGUgdG8gaW5oZXJpdCB0aGUgY2FsbGVyJ3NcbiAgICAgICAqIE9CTyBpZGVudGl0eTsgb3V0c2lkZSBvbmUgaXQgcmVzb2x2ZXMgdG8gdGhlIHNlcnZpY2UgcHJpbmNpcGFsLlxuICAgICAgICovXG4gICAgICBjcmVhdGVSZXF1ZXN0Q29udGV4dDogKFxuICAgICAgICBvcHRpb25zOiB7IHRocmVhZElkPzogc3RyaW5nOyByZXNvdXJjZUlkPzogc3RyaW5nOyByZXF1ZXN0SWQ/OiBzdHJpbmcgfSA9IHt9LFxuICAgICAgKTogUHJvbWlzZTxSZXF1ZXN0Q29udGV4dD4gPT4gY3JlYXRlUmVxdWVzdENvbnRleHQob3B0aW9ucyksXG4gICAgICAvKipcbiAgICAgICAqIE1DUCBlbmRwb2ludCBpbmZvIHdoZW4gYGNvbmZpZy5tY3BgIGlzIGVuYWJsZWQsIGVsc2UgYG51bGxgLlxuICAgICAgICogU3RyZWFtYWJsZSBIVFRQIGlzIGBodHRwYDsgdGhlIFNTRSBwYWlyIGlzIHRoZSBsZWdhY3kgdHJhbnNwb3J0LlxuICAgICAgICpcbiAgICAgICAqIEVhY2ggcGF0aCBpcyBnaXZlbiB0d2ljZTogbW91bnQtcmVsYXRpdmUgKGBodHRwUGF0aGAsIGBzc2VQYXRoYCxcbiAgICAgICAqIGBtZXNzYWdlUGF0aGApIGZvciBhbnl0aGluZyB0aGF0IGFscmVhZHkga25vd3Mgd2hlcmUgdGhlIHBsdWdpbiBpc1xuICAgICAgICogbW91bnRlZCwgYW5kIGFic29sdXRlIChgaHR0cGAsIGBzc2VgLCBgbWVzc2FnZXNgKSBmb3IgTUNQIGNsaWVudHMsXG4gICAgICAgKiB3aGljaCB0YWtlIGEgc2luZ2xlIFVSTCBhbmQgY2Fubm90IGNvbXBvc2Ugb25lLiBUaGUgYWJzb2x1dGUgZm9ybSBpc1xuICAgICAgICogYnVpbHQgZnJvbSB7QGxpbmsgYmFzZVBhdGh9LCBzbyBpdCBob25vcnMgYSBgY29uZmlnLm5hbWVgIG92ZXJyaWRlIGJ1dFxuICAgICAgICogc3RpbGwgYXNzdW1lcyBBcHBLaXQncyBkZWZhdWx0IGAvYXBpLzxuYW1lPmAgbW91bnQuXG4gICAgICAgKi9cbiAgICAgIGdldE1jcDogKCk6IHtcbiAgICAgICAgc2VydmVySWQ6IHN0cmluZztcbiAgICAgICAgaHR0cFBhdGg6IHN0cmluZztcbiAgICAgICAgc3NlUGF0aDogc3RyaW5nO1xuICAgICAgICBtZXNzYWdlUGF0aDogc3RyaW5nO1xuICAgICAgICBodHRwOiBzdHJpbmc7XG4gICAgICAgIHNzZTogc3RyaW5nO1xuICAgICAgICBtZXNzYWdlczogc3RyaW5nO1xuICAgICAgfSB8IG51bGwgPT5cbiAgICAgICAgdGhpcy5tY3BcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgc2VydmVySWQ6IHRoaXMubWNwLnNlcnZlcklkLFxuICAgICAgICAgICAgICBodHRwUGF0aDogdGhpcy5tY3AuaHR0cFBhdGgsXG4gICAgICAgICAgICAgIHNzZVBhdGg6IHRoaXMubWNwLnNzZVBhdGgsXG4gICAgICAgICAgICAgIG1lc3NhZ2VQYXRoOiB0aGlzLm1jcC5tZXNzYWdlUGF0aCxcbiAgICAgICAgICAgICAgaHR0cDogYCR7dGhpcy5iYXNlUGF0aH0ke3RoaXMubWNwLmh0dHBQYXRofWAsXG4gICAgICAgICAgICAgIHNzZTogYCR7dGhpcy5iYXNlUGF0aH0ke3RoaXMubWNwLnNzZVBhdGh9YCxcbiAgICAgICAgICAgICAgbWVzc2FnZXM6IGAke3RoaXMuYmFzZVBhdGh9JHt0aGlzLm1jcC5tZXNzYWdlUGF0aH1gLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogbnVsbCxcbiAgICAgIC8qKiBFeHByZXNzIHN1YmFwcCBNYXN0cmEgaXMgbW91bnRlZCBvbjsgbW9zdGx5IGZvciB0ZXN0cy4gKi9cbiAgICAgIGdldE1hc3RyYVNlcnZlcjogKCkgPT4gdGhpcy5tYXN0cmFTZXJ2ZXIsXG4gICAgICAvKipcbiAgICAgICAqIEZldGNoIHRoZSB3b3Jrc3BhY2UncyBNb2RlbCBTZXJ2aW5nIGVuZHBvaW50cyAoY2FjaGVkKS4gU2FtZVxuICAgICAgICogcGF5bG9hZCB0aGUgYEdFVCAvbW9kZWxzYCByb3V0ZSByZXR1cm5zOyBzdXJmYWNlZCBoZXJlIHNvXG4gICAgICAgKiBvdGhlciBwbHVnaW5zIC8gc2NyaXB0cyBjYW4gaW50cm9zcGVjdCB0aGUgY2F0YWxvZ3VlIHdpdGhvdXRcbiAgICAgICAqIGFuIEhUVFAgcm91bmQtdHJpcC4gQXBwS2l0IHdyYXBzIHRoaXMgd2l0aCBgYXNVc2VyKHJlcSlgIGZvclxuICAgICAgICogT0JPIHNjb3BpbmcgYXV0b21hdGljYWxseS4gVGhyb3dzIHdoZW4gdGhlIGxpc3RpbmcgZmFpbHMsIHNpbmNlXG4gICAgICAgKiB0aGVyZSBpcyBubyBzdGF0dXMgY29kZSB0byBoYW5kIGJhY2sgb24gdGhpcyBzdXJmYWNlLlxuICAgICAgICovXG4gICAgICBsaXN0TW9kZWxzOiAoKTogUHJvbWlzZTxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+ID0+IHRoaXMubGlzdE1vZGVscygpLFxuICAgICAgLyoqXG4gICAgICAgKiBGb3JjZS1ldmljdCBjYWNoZWQgZW5kcG9pbnQgbGlzdGluZ3MgdmlhIEFwcEtpdCdzXG4gICAgICAgKiBgQ2FjaGVNYW5hZ2VyYC4gVXNlZnVsIGluIHRlc3RzIG9yIHJpZ2h0IGFmdGVyIGFuIGFkbWluXG4gICAgICAgKiBkZXBsb3lzIGEgbmV3IGVuZHBvaW50IGFuZCBkb2Vzbid0IHdhbnQgdG8gd2FpdCBmb3IgdGhlIFRUTC5cbiAgICAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgYENhY2hlTWFuYWdlci5kZWxldGVgL2BjbGVhcmAgcHJvbWlzZS5cbiAgICAgICAqL1xuICAgICAgY2xlYXJNb2RlbHNDYWNoZTogKGhvc3Q/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+XG4gICAgICAgIG1vZGVsQ2F0YWxvZy5jbGVhclNlcnZpbmdFbmRwb2ludHNDYWNoZShob3N0KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFic29sdXRlIG1vdW50IHRoaXMgcGx1Z2luJ3Mgcm91dGVzIGFuc3dlciBvbi4gQXBwS2l0IG1vdW50cyBldmVyeSBwbHVnaW5cbiAgICogYXQgYC9hcGkvPHBsdWdpbi5uYW1lPmAgYW5kIGB0aGlzLm5hbWVgIGhvbm9ycyBhIGBjb25maWcubmFtZWAgb3ZlcnJpZGUsXG4gICAqIHNvIHRoZSBwZXItcm91dGUgc2VnbWVudHMgKGByb3V0ZXMuTUFTVFJBX1JPVVRFU2ApIGhhbmcgb2ZmIHRoaXMuXG4gICAqL1xuICBwcml2YXRlIGdldCBiYXNlUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgL2FwaS8ke3RoaXMubmFtZX1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgY2xpZW50Q29uZmlnKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICAvLyBQdWJsaXNoaW5nIGBiYXNlUGF0aGAgaXMgZW5vdWdoIGZvciB0aGUgY2xpZW50IHRvIHN0YXkgY29ycmVjdCB1bmRlciBhXG4gICAgLy8gY3VzdG9tIG1vdW50IGlkOiB0aGUgcGVyLXJvdXRlIHNlZ21lbnRzIGFyZSBmaXhlZFxuICAgIC8vIChgcm91dGVzLk1BU1RSQV9ST1VURVNgKSBhbmQgdGhlIGNsaWVudCAoYE1hc3RyYVBsdWdpbkNsaWVudGApIGRlcml2ZXNcbiAgICAvLyBldmVyeSBlbmRwb2ludCBmcm9tIGBiYXNlUGF0aGAuXG4gICAgLy8gUmV0dXJuIHdpZGVucyB0byBgUmVjb3JkPHN0cmluZywgdW5rbm93bj5gIHRvIHNhdGlzZnkgdGhlXG4gICAgLy8gYmFzZS1jbGFzcyBzaWduYXR1cmU7IGNvbnN1bWVycyByZWFkIGl0IHRocm91Z2ggdGhlIHR5cGVkXG4gICAgLy8gYE1hc3RyYUNsaWVudENvbmZpZ2Agc2hhcGUgdmlhIGB1c2VQbHVnaW5DbGllbnRDb25maWc8Li4uPiguLi4pYC5cbiAgICBjb25zdCBmb2xsb3dVcHMgPSByZXNvbHZlRm9sbG93VXBTdWdnZXN0aW9uc0NvbmZpZyh0aGlzLmNvbmZpZy5mb2xsb3dVcFN1Z2dlc3Rpb25zKTtcbiAgICBjb25zdCBjb25maWc6IE1hc3RyYUNsaWVudENvbmZpZyA9IHtcbiAgICAgIGJhc2VQYXRoOiB0aGlzLmJhc2VQYXRoLFxuICAgICAgZGVmYXVsdEFnZW50OiB0aGlzLmJ1aWx0Py5kZWZhdWx0QWdlbnRJZCA/PyBGQUxMQkFDS19BR0VOVF9JRCxcbiAgICAgIGFnZW50czogT2JqZWN0LmtleXModGhpcy5idWlsdD8uYWdlbnRzID8/IHt9KSxcbiAgICAgIGZlZWRiYWNrTW9kZTogdGhpcy5mZWVkYmFja01vZGUoKSxcbiAgICAgIGJhY2tncm91bmRUdXJuczogdGhpcy5jb25maWcuYmFja2dyb3VuZFR1cm5zICE9PSBmYWxzZSxcbiAgICAgIGZvbGxvd1VwU3VnZ2VzdGlvbnM6IGZvbGxvd1Vwcz8ubW9kZSA/PyBcIm5vbmVcIixcbiAgICAgIGZvbGxvd1VwU3VnZ2VzdGlvbkxpbWl0OiBmb2xsb3dVcHM/LmxpbWl0ID8/IDMsXG4gICAgICAvLyBJbiBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgdGhlIGNoYXQgd29ya3MgZm9yIGFueSBjYWxsZXIgd2hvIGNhbiBvcGVuXG4gICAgICAvLyB0aGUgYXBwLCBzbyBhIFVJIHRoYXQgaGlkZXMgY2hhdCBiZWhpbmQgYW4gT0JPLXRva2VuIHByb2JlIHNob3VsZCBzaG93XG4gICAgICAvLyBpdCByZWdhcmRsZXNzLiBgXCJ1c2VyXCJgIG1vZGUga2VlcHMgdGhlIE9CTy1nYXRlZCBiZWhhdmlvci5cbiAgICAgIGNoYXRBbHdheXNBdmFpbGFibGU6IHRoaXMuaWRlbnRpdHlNb2RlID09PSBcInNlcnZpY2UtcHJpbmNpcGFsXCIsXG4gICAgfTtcbiAgICByZXR1cm4gY29uZmlnIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cblxuICAvKiogUmVzb2x2ZSB0aGUgb25seSBmZWVkYmFjayBkZXN0aW5hdGlvbiBleHBvc2VkIGZvciB0aGlzIHBsdWdpbiBtb2RlLiAqL1xuICBwcml2YXRlIGZlZWRiYWNrTW9kZSgpOiBGZWVkYmFja01vZGUge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkRmVlZGJhY2tNb2RlO1xuICB9XG5cbiAgb3ZlcnJpZGUgaW5qZWN0Um91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJNY3BSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyTW9kZWxSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyRW1iZWRSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyU3VnZ2VzdGlvblJvdXRlcyhyb3V0ZXIpO1xuICAgIHRoaXMucmVnaXN0ZXJHZW5pZUNoYXRSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyRmVlZGJhY2tSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyTWxmbG93RXhwZXJpbWVudFJvdXRlKHJvdXRlcik7XG4gICAgdGhpcy5yZWdpc3RlckFnZW50Um91dGVzKHJvdXRlcik7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgVVJMIGFsaWFzZXMgZm9yIE1hc3RyYSdzIE1DUCB0cmFuc3BvcnRzLiAqL1xuICBwcml2YXRlIHJlZ2lzdGVyTWNwUm91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIC8vIEV4cG9zZSB0aGUgTUNQIHRyYW5zcG9ydCBhdCB0aGUgY2xlYW4gYC9tY3BgIChwbHVzIHRoZSBsZWdhY3lcbiAgICAvLyBgL3NzZWAgKyBgL21lc3NhZ2VzYCkgdW5kZXIgdGhlIHBsdWdpbiBtb3VudC4gYEBtYXN0cmEvZXhwcmVzc2BcbiAgICAvLyBtb3VudHMgTUNQIHVuZGVyIGAvbWNwLzxzZXJ2ZXJJZD4vPHRyYW5zcG9ydD5gLCBhbmQgdGhlIHNlcnZlcklkXG4gICAgLy8gZGVmYXVsdHMgdG8gdGhlIHBsdWdpbiBuYW1lLCBzbyB0aGUgcmF3IHJvdXRlIHJlYWRzXG4gICAgLy8gYC9hcGkvbWFzdHJhL21jcC9tYXN0cmEvbWNwYCAoZG91YmxlZCBzZWdtZW50KS4gVGhpcyBydW5zIGJlZm9yZVxuICAgIC8vIHRoZSBjYXRjaC1hbGwgYW5kIHJld3JpdGVzIHRoZSBhbGlhcyB0byB0aGUgdW5kZXJseWluZyByb3V0ZSwgc29cbiAgICAvLyB0aGUgcHVibGljIHBhdGggaXMganVzdCBgL2FwaS88cGx1Z2luPi9tY3BgOyB0aGUgcXVlcnkgc3RyaW5nXG4gICAgLy8gKGUuZy4gdGhlIFNTRSBgc2Vzc2lvbklkYCkgaXMgcHJlc2VydmVkLlxuICAgIC8vXG4gICAgLy8gTWlkZGxld2FyZSByYXRoZXIgdGhhbiBgdGhpcy5yb3V0ZWA6IGl0IHJld3JpdGVzIHRoZSBVUkwgZm9yIHJvdXRlc1xuICAgIC8vIGBAbWFzdHJhL2V4cHJlc3NgIG93bnMgZnVydGhlciBkb3duIHRoZSBjaGFpbiBpbnN0ZWFkIG9mIGFuc3dlcmluZyB0aGVcbiAgICAvLyByZXF1ZXN0LCB3aGljaCBgUm91dGVDb25maWdgIGhhcyBubyBzaGFwZSBmb3IuXG4gICAgcm91dGVyLnVzZSgocmVxLCBfcmVzLCBuZXh0KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLm1jcFJvdXRlQWxpYXMocmVxLnBhdGgpO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBjb25zdCBxID0gcmVxLnVybC5pbmRleE9mKFwiP1wiKTtcbiAgICAgICAgcmVxLnVybCA9IHEgPj0gMCA/IHRhcmdldCArIHJlcS51cmwuc2xpY2UocSkgOiB0YXJnZXQ7XG4gICAgICB9XG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgbW9kZWwgY2F0YWxvZ3VlIGFuZCBwZXItYWdlbnQgZGVmYXVsdC1tb2RlbCByb3V0ZXMuICovXG4gIHByaXZhdGUgcmVnaXN0ZXJNb2RlbFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICAvLyBgR0VUIC9tb2RlbHNgIGV4cG9zZXMgdGhlIGNhY2hlZCBlbmRwb2ludCBsaXN0IHNvIGNsaWVudHMgY2FuXG4gICAgLy8gcG9wdWxhdGUgbW9kZWwgcGlja2VycywgdmFsaWRhdGUgYD9tb2RlbD1gIGNob2ljZXMsIGV0Yy4gTXVzdFxuICAgIC8vIGJlIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBjYXRjaC1hbGwgdGhhdCBmb3J3YXJkcyBldmVyeXRoaW5nIHRvXG4gICAgLy8gdGhlIE1hc3RyYSBzdWJhcHAuXG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwibW9kZWxzXCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBNQVNUUkFfUk9VVEVTLm1vZGVscyxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNjb3BlZFNlbGYocmVxKS5saXN0TW9kZWxzUmVzdWx0KCk7XG4gICAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgICAgdGhpcy5zZW5kRmFpbHVyZShyZXMsIHJlc3VsdCwgXCJtb2RlbHNcIiwgTU9ERUxfQ0FUQUxPR1VFX0ZBSUxFRF9NRVNTQUdFKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzLmpzb24oeyBlbmRwb2ludHM6IHJlc3VsdC5kYXRhIH0pO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIGBHRVQgL2RlZmF1bHQtbW9kZWxgIChhbmQgYC9kZWZhdWx0LW1vZGVsLzphZ2VudElkYCkgcmVwb3J0cyB3aGF0IGFuXG4gICAgLy8gdW5waW5uZWQgdHVybiB3aWxsIHVzZS4gQSBjb25maWd1cmVkIHN0cmluZyBpcyByZXR1cm5lZCBkaXJlY3RseTsgYW5cbiAgICAvLyBhdXRvbWF0aWMgZGVmYXVsdCByZXNvbHZlcyB0aGUgaGlnaGVzdC1yYW5rZWQgY3VycmVudGx5IGF2YWlsYWJsZSBHUFRcbiAgICAvLyAob3IgZ2VuZXJhbCBjaGF0IGZhbGxiYWNrKSBmcm9tIHRoZSBzYW1lIE9CTy1zY29wZWQgbGl2ZSBjYXRhbG9ndWUgYXNcbiAgICAvLyBgL21vZGVsc2A7IGEgY3VzdG9tIGR5bmFtaWMgcmVzb2x2ZXIgcmVtYWlucyBudWxsIGJlY2F1c2UgaXQgaXMgY2FsbC10aW1lXG4gICAgLy8gYXBwbGljYXRpb24gY29kZS5cbiAgICBjb25zdCBoYW5kbGVEZWZhdWx0TW9kZWwgPSBhc3luYyAoXG4gICAgICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RlZCA9IGZpcnN0Tm9uRW1wdHkocmVxLnBhcmFtcy5hZ2VudElkKTtcbiAgICAgIGlmIChyZXF1ZXN0ZWQgIT09IG51bGwgJiYgIXRoaXMuYnVpbHQ/LmFnZW50c1tyZXF1ZXN0ZWRdKSB7XG4gICAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHsgZXJyb3I6IHRoaXMudW5rbm93bkFnZW50TWVzc2FnZShyZXF1ZXN0ZWQpIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBhZ2VudElkID0gcmVxdWVzdGVkID8/IHRoaXMuYnVpbHQ/LmRlZmF1bHRBZ2VudElkID8/IEZBTExCQUNLX0FHRU5UX0lEO1xuICAgICAgY29uc3QgaW50ZW50ID0gdGhpcy5idWlsdD8uZGVmYXVsdE1vZGVsc1thZ2VudElkXTtcbiAgICAgIGxldCBtb2RlbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgICBpZiAoaW50ZW50Py5raW5kID09PSBcImNvbmZpZ3VyZWRcIikge1xuICAgICAgICBtb2RlbCA9IGludGVudC5tb2RlbDtcbiAgICAgIH0gZWxzZSBpZiAoaW50ZW50Py5raW5kID09PSBcImF1dG9cIikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNjb3BlZFNlbGYocmVxKS5saXN0TW9kZWxzUmVzdWx0KCk7XG4gICAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgICAgdGhpcy5zZW5kRmFpbHVyZShyZXMsIHJlc3VsdCwgXCJkZWZhdWx0LW1vZGVsXCIsIE1PREVMX0NBVEFMT0dVRV9GQUlMRURfTUVTU0FHRSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbW9kZWwgPSByZXNvbHZlRGVmYXVsdE1vZGVsSWQodGhpcy5jb25maWcsIHJlc3VsdC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzLmpzb24oe1xuICAgICAgICBhZ2VudElkLFxuICAgICAgICBtb2RlbCxcbiAgICAgICAgZGlzcGxheU5hbWU6IG1vZGVsID8gdG9Nb2RlbERpc3BsYXlOYW1lKG1vZGVsKSA6IG51bGwsXG4gICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImRlZmF1bHRNb2RlbFwiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogTUFTVFJBX1JPVVRFUy5kZWZhdWx0TW9kZWwsXG4gICAgICBoYW5kbGVyOiBoYW5kbGVEZWZhdWx0TW9kZWwsXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiZGVmYXVsdE1vZGVsQnlBZ2VudFwiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogYCR7TUFTVFJBX1JPVVRFUy5kZWZhdWx0TW9kZWx9LzphZ2VudElkYCxcbiAgICAgIGhhbmRsZXI6IGhhbmRsZURlZmF1bHRNb2RlbCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciB0aGUgZ2VuZXJpYyBjaGFydCBhbmQgc3RhdGVtZW50IGVtYmVkIHJlc29sdmVyLiAqL1xuICBwcml2YXRlIHJlZ2lzdGVyRW1iZWRSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgLy8gYEdFVCAvZW1iZWQvOnR5cGUvOmlkYCBpcyB0aGUgc2luZ2xlIHJlc29sdmVyIGZvciBldmVyeSBlbWJlZFxuICAgIC8vIG1hcmtlciB0aGUgYWdlbnQgZW1pdHMgaW4gcHJvc2UgKGBbY2hhcnQ6PGlkPl1gLFxuICAgIC8vIGBbZGF0YTo8aWQ+XWAsIC4uLikuIGA6dHlwZWAgc2VsZWN0cyBhIHJlc29sdmVyIGZyb20gdGhlXG4gICAgLy8gcmVnaXN0cnkgYmVsb3c7IGA6aWRgIGlzIHRoYXQgcmVzb2x2ZXIncyBsb29rdXAga2V5LiBUaGUgbWFya2VyIGdyYW1tYXJcbiAgICAvLyBpcyB0eXBlLWFnbm9zdGljOyB0aGUgY2xpZW50IHN0aWxsIGNob29zZXMgaG93IGVhY2ggcmVnaXN0ZXJlZCB0eXBlXG4gICAgLy8gcmVuZGVycy5cbiAgICAvL1xuICAgIC8vIFN0YXR1cyBjb2RlczpcbiAgICAvLyAgIC0gMjAwIHdpdGggdGhlIHJlc29sdmVyJ3MgSlNPTiBib2R5IHdoZW4gdGhlIGlkIHJlc29sdmVzLlxuICAgIC8vICAgLSA0MDQgd2hlbiBgOnR5cGVgIGlzbid0IHJlZ2lzdGVyZWQgKHVuc3VwcG9ydGVkIGVtYmVkXG4gICAgLy8gICAgIHR5cGUpIE9SIGEgcmVnaXN0ZXJlZCByZXNvbHZlciBjYW4ndCBmaW5kIGA6aWRgICh1bmtub3duXG4gICAgLy8gICAgIC8gZXhwaXJlZCAtIGUuZy4gYSBjaGFydCBwYXN0IGl0cyAxaCBUVEwgb3IgYSBmYWJyaWNhdGVkXG4gICAgLy8gICAgIGlkIHRoZSBtb2RlbCBuZXZlciBtaW50ZWQpLlxuICAgIC8vICAgLSA0MDAgd2hlbiBgOmlkYCBpcyBlbXB0eS5cbiAgICAvL1xuICAgIC8vIFBlci10eXBlIHF1ZXJ5IGtub2JzIGFuZCBiZWhhdmlvcjpcbiAgICAvLyAgIC0gYGNoYXJ0YDogbG9uZy1wb2xscyB0aGUgY2hhcnQgY2FjaGUgdW50aWwgdGhlIGVudHJ5XG4gICAgLy8gICAgIHNldHRsZXMgKGByZXN1bHRgIC8gYGVycm9yYCkgb3IgdGhlIGJ1ZGdldCBlbGFwc2VzICh0aGVuXG4gICAgLy8gICAgIHJldHVybnMgdGhlIHN0aWxsLXByb2Nlc3NpbmcgZW50cnkgdG8gcG9sbCBhZ2FpbikuXG4gICAgLy8gICAgIGA/dGltZW91dE1zPTxuPmAgKGRlZmF1bHQgNjBzLCBjYXBwZWQgNW1pbikgdHVuZXMgaXQuXG4gICAgLy8gICAtIGBkYXRhYDogb25lIFN0YXRlbWVudCBFeGVjdXRpb24gZmV0Y2ggdW5kZXIgYGdlbmllSWRlbnRpdHlgLlxuICAgIC8vICAgLSBgdmlzdWFsaXphdGlvbmA6IHRoZSBzYW1lIHBheWxvYWQgdW5kZXIgbWFuZGF0b3J5IE9CTyBpZGVudGl0eSBmb3JcbiAgICAvLyAgICAgZGlyZWN0IEdlbmllIGNoYXQsIHdob3NlIGNvbnZlcnNhdGlvbnMgYmVsb25nIHRvIHRoZSBzaWduZWQtaW4gdXNlci5cbiAgICAvLyAgICAgYD9saW1pdD08bj5gIGNhcHMgcm93cyAoY2xhbXBlZCB0byBTVEFURU1FTlRfUk9XX0NBUCkuXG4gICAgLy9cbiAgICAvLyBCdWlsdCBvbmNlICh0aGlzIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCBvbmNlKSBhbmQga2V5ZWQgYnkgdGhlXG4gICAgLy8gcmF3IGA6dHlwZWAgdG9rZW4uIEVhY2ggcmVzb2x2ZXIgZ2V0cyB0aGUgcmVxdWVzdCAoZm9yIHF1ZXJ5XG4gICAgLy8gcGFyc2luZyArIE9CTyBzY29waW5nKSBhbmQgYW4gYEFib3J0U2lnbmFsYCBicmlkZ2VkIG9mZiB0aGVcbiAgICAvLyBjb25uZWN0aW9uIGBjbG9zZWAgZXZlbnQgc28gYSBsb25nLXBvbGwgdW5ibG9ja3MgdGhlIGluc3RhbnRcbiAgICAvLyB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzLiBgdW5kZWZpbmVkYCBmcm9tIGEgcmVzb2x2ZXIgbWFwcyB0byBhXG4gICAgLy8gY2xlYW4gNDA0OyB0aHJvd24gZXJyb3JzIGJ1YmJsZSB0aHJvdWdoIGBuZXh0KGVycilgLlxuICAgIGNvbnN0IGVtYmVkUmVzb2x2ZXJzOiBSZWNvcmQ8c3RyaW5nLCBFbWJlZFJlc29sdmVyPiA9IHtcbiAgICAgIGNoYXJ0OiAocmVxLCBpZCwgc2lnbmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXRNcyA9IHBhcnNlVGltZW91dE1zKHJlcS5xdWVyeS50aW1lb3V0TXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5zY29wZWRTZWxmKHJlcSkuZmV0Y2hDaGFydEVudHJ5KHJlcSwgaWQsIHtcbiAgICAgICAgICAuLi4odGltZW91dE1zICE9PSB1bmRlZmluZWQgPyB7IHRpbWVvdXRNcyB9IDoge30pLFxuICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZGF0YTogKHJlcSwgaWQsIHNpZ25hbCkgPT4ge1xuICAgICAgICBjb25zdCBsaW1pdCA9IHBhcnNlU3RhdGVtZW50TGltaXQocmVxLnF1ZXJ5LmxpbWl0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGVkU2VsZihyZXEpLmZldGNoU3RhdGVtZW50KGlkLCB7XG4gICAgICAgICAgLi4uKGxpbWl0ICE9PSB1bmRlZmluZWQgPyB7IGxpbWl0IH0gOiB7fSksXG4gICAgICAgICAgc2lnbmFsLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICB2aXN1YWxpemF0aW9uOiAocmVxLCBpZCwgc2lnbmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gcGFyc2VTdGF0ZW1lbnRMaW1pdChyZXEucXVlcnkubGltaXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5hc1VzZXIocmVxKS5mZXRjaFN0YXRlbWVudChpZCwge1xuICAgICAgICAgIC4uLihsaW1pdCAhPT0gdW5kZWZpbmVkID8geyBsaW1pdCB9IDoge30pLFxuICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJlbWJlZFwiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogYCR7TUFTVFJBX1JPVVRFUy5lbWJlZH0vOnR5cGUvOmlkYCxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCB0eXBlID0gZmlyc3ROb25FbXB0eShyZXEucGFyYW1zLnR5cGUpID8/IFwiXCI7XG4gICAgICAgIGNvbnN0IGlkID0gZmlyc3ROb25FbXB0eShyZXEucGFyYW1zLmlkKTtcbiAgICAgICAgY29uc3QgcmVzb2x2ZSA9IGVtYmVkUmVzb2x2ZXJzW3R5cGVdO1xuICAgICAgICBpZiAoIXJlc29sdmUpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiZW1iZWQ6dW5zdXBwb3J0ZWRcIiwge1xuICAgICAgICAgICAgc3RhdHVzOiA0MDQsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgICAgICBwYXRoOiByZXEucGF0aCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiBgdW5zdXBwb3J0ZWQgZW1iZWQgdHlwZTogJHt0eXBlfWAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiZW1iZWQ6aW52YWxpZFwiLCB7XG4gICAgICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgICAgICBwYXRoOiByZXEucGF0aCxcbiAgICAgICAgICAgIGVycm9yOiBcImlkIGlzIHJlcXVpcmVkXCIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogXCJpZCBpcyByZXF1aXJlZFwiIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBCcmlkZ2UgcmVzcG9uc2UgY2xvc2Ugb250byBhbiBBYm9ydFNpZ25hbCBzbyBhIGNsaWVudCBkaXNjb25uZWN0XG4gICAgICAgIC8vIHJlbGVhc2VzIGxvbmctcG9sbCBhbmQgd29ya3NwYWNlIGNhbGxzIGltbWVkaWF0ZWx5LlxuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICByZXMub24oXCJjbG9zZVwiLCAoKSA9PiBjb250cm9sbGVyLmFib3J0KCkpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNvbHZlKHJlcSwgaWQsIGNvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgICAgaWYgKGNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBgZW1iZWQ6JHt0eXBlfWAsIGBDb3VsZCBub3QgcmVzb2x2ZSB0aGUgJHt0eXBlfSBlbWJlZGApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIEEgY2FjaGUgbWlzcyBpcyBzZWN1cml0eS1kZWxpYmVyYXRlbHkgYW1iaWd1b3VzOiB1bmtub3duLCBleHBpcmVkLFxuICAgICAgICAgIC8vIG9yIG93bmVkIGJ5IGFub3RoZXIgaWRlbnRpdHkgYWxsIG1hcCB0byB0aGUgc2FtZSA0MDQuIExvZyB0aGVcbiAgICAgICAgICAvLyBvcGFxdWUgaWQgYW5kIHRob3NlIHBvc3NpYmxlIGNhdXNlcyBzbyBhIGZhYnJpY2F0ZWQgbWFya2VyIGlzXG4gICAgICAgICAgLy8gZGlhZ25vc2FibGUgZnJvbSB0aGUgc2VydmVyIHdpdGhvdXQgZGlzY2xvc2luZyB3aGljaCBjYXVzZSBhcHBsaWVkLlxuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYGVtYmVkOiR7dHlwZX06bm90LWZvdW5kYCwge1xuICAgICAgICAgICAgc3RhdHVzOiA0MDQsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgICAgICBwYXRoOiByZXEucGF0aCxcbiAgICAgICAgICAgIHJlYXNvbjogXCJ1bmtub3duLCBleHBpcmVkLCBvciBvd25lZCBieSBhbm90aGVyIGlkZW50aXR5XCIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogYCR7dHlwZX0gbm90IGZvdW5kYCB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzLmpzb24ocmVzdWx0LmRhdGEpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciBkZWZhdWx0IGFuZCBhZ2VudC1xdWFsaWZpZWQgc3VnZ2VzdGlvbiByb3V0ZXMuICovXG4gIHByaXZhdGUgcmVnaXN0ZXJTdWdnZXN0aW9uUm91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIC8vIGBHRVQgL3N1Z2dlc3Rpb25zYCAoYW5kIGAvc3VnZ2VzdGlvbnMvOmFnZW50SWRgKSByZXR1cm5zIHRoZVxuICAgIC8vIGN1cmF0ZWQgc3RhcnRlciBxdWVzdGlvbnMgZm9yIHRoZSBhZ2VudCdzIEdlbmllIHNwYWNlKHMpIC0gdGhlXG4gICAgLy8gYXV0aG9yLWNvbmZpZ3VyZWQgYHNhbXBsZV9xdWVzdGlvbnNgLCBzdXJmYWNlZCBhcyBvbmUtdGFwXG4gICAgLy8gcHJvbXB0cyBvbiB0aGUgY2hhdCBlbXB0eSBzdGF0ZS4gUmV0dXJucyBgeyBxdWVzdGlvbnM6IFtdIH1gXG4gICAgLy8gd2hlbiBubyBHZW5pZSBzcGFjZSBpcyB3aXJlZCBzbyB0aGUgY2xpZW50IHJlbmRlcnMgYSBiYXJlXG4gICAgLy8gZW1wdHkgc3RhdGUgKG5vIGJ1aWx0LWluIGV4YW1wbGUgcHJvbXB0cykuIFRoZSBgOmFnZW50SWRgXG4gICAgLy8gc2VnbWVudCBpcyBhY2NlcHRlZCBmb3IgVVJMIHN5bW1ldHJ5IHdpdGggdGhlIGNoYXQgLyBoaXN0b3J5XG4gICAgLy8gcm91dGVzOyBHZW5pZSBzcGFjZXMgYXJlIHJlc29sdmVkIHBlci1wbHVnaW4sIG5vdCBwZXItYWdlbnQsXG4gICAgLy8gc28gaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHJlc3VsdC4gVGhlIHNwYWNlIGxvb2t1cCB1c2VzIHRoZSBjb25maWd1cmVkXG4gICAgLy8gYWdlbnQtYmFja2VkIGlkZW50aXR5LlxuICAgIGNvbnN0IGhhbmRsZVN1Z2dlc3Rpb25zID0gYXN5bmMgKFxuICAgICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgcmVzLm9uKFwiY2xvc2VcIiwgKCkgPT4gY29udHJvbGxlci5hYm9ydCgpKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2NvcGVkU2VsZihyZXEpLmZldGNoU3VnZ2VzdGlvbnMoY29udHJvbGxlci5zaWduYWwpO1xuICAgICAgaWYgKGNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgIC8vIFN1Z2dlc3Rpb25zIGFyZSBhIG5vbi1jcml0aWNhbCBlbmhhbmNlbWVudDsgYSBsb29rdXAgZmFpbHVyZSBzaG91bGRcbiAgICAgICAgLy8gbGVhdmUgdGhlIGNoYXQgdXNhYmxlIHdpdGggYSBiYXJlIGVtcHR5IHN0YXRlIHJhdGhlciB0aGFuIHN1cmZhY2luZ1xuICAgICAgICAvLyB0aGUgdXBzdHJlYW0gc3RhdHVzLiBMb2cgYW5kIGRlZ3JhZGUuXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJzdWdnZXN0aW9uczplcnJvclwiLCB7XG4gICAgICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgICAgIGVycm9yOiB0b0Vycm9yKHJlc3VsdC5tZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcy5qc29uKHsgcXVlc3Rpb25zOiBbXSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzLmpzb24oeyBxdWVzdGlvbnM6IHJlc3VsdC5kYXRhIH0pO1xuICAgIH07XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwic3VnZ2VzdGlvbnNcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IE1BU1RSQV9ST1VURVMuc3VnZ2VzdGlvbnMsXG4gICAgICBoYW5kbGVyOiBoYW5kbGVTdWdnZXN0aW9ucyxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJzdWdnZXN0aW9uc0J5QWdlbnRcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IGAke01BU1RSQV9ST1VURVMuc3VnZ2VzdGlvbnN9LzphZ2VudElkYCxcbiAgICAgIGhhbmRsZXI6IGhhbmRsZVN1Z2dlc3Rpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIHRoZSBkaXJlY3QgR2VuaWUgY2hhdCByb3V0ZXMuIEVhY2ggcm91dGUgaXMgc2NvcGVkIHRvIG9uZSBHZW5pZVxuICAgKiBzcGFjZSBhbGlhcyBhbmQgc2l0cyBkaXJlY3RseSBvbiB0aGUgR2VuaWUgQVBJcyB1bmRlciBBcHBLaXQncyBPQk8gdXNlclxuICAgKiBjb250ZXh0OiBjb252ZXJzYXRpb25zIGFyZSB0aHJlYWRzLCBHZW5pZSBtZXNzYWdlcyBhcmUgaGlzdG9yeSwgYW5kIGEgdHVyblxuICAgKiBzdHJlYW1zIHRoZSBzYW1lIEFJIFNESyBjaHVua3MgYXMgYW4gYWdlbnQncyBgYXNrX2dlbmllYCBjYWxsLiBOb3RoaW5nIGlzXG4gICAqIHdyaXR0ZW4gdG8gTWFzdHJhIE1lbW9yeS5cbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJHZW5pZUNoYXRSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgY29uc3QgcGF0aCA9ICguLi5wYXJ0czogc3RyaW5nW10pID0+IGdlbmllUm91dGVQYXRoKFwiOmFsaWFzXCIsIC4uLnBhcnRzKTtcbiAgICBjb25zdCB7IGNoYXQ6IGNoYXRTZWdtZW50LCBtZXNzYWdlcywgc3VnZ2VzdGlvbnMsIHRocmVhZHMgfSA9IE1BU1RSQV9ST1VURVM7XG4gICAgLyoqIFJlc29sdmUgdGhlIHJvdXRlJ3MgYWxpYXMsIGFuc3dlcmluZyA0MDQgd2hlbiBubyBzdWNoIHNwYWNlIGlzIGNvbmZpZ3VyZWQuICovXG4gICAgY29uc3Qgc3BhY2VGb3IgPSAocmVxOiBleHByZXNzLlJlcXVlc3QsIHJlczogZXhwcmVzcy5SZXNwb25zZSk6IEdlbmllQ2hhdFNwYWNlIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgIGNvbnN0IGFsaWFzID0gZmlyc3ROb25FbXB0eShyZXEucGFyYW1zLmFsaWFzKSA/PyBcIlwiO1xuICAgICAgY29uc3QgY29uZmlndXJlZCA9IHJlc29sdmVHZW5pZVNwYWNlcyh0aGlzLmNvbmZpZywgdGhpcy5jb250ZXh0KVthbGlhc107XG4gICAgICBpZiAoY29uZmlndXJlZCkgcmV0dXJuIHsgYWxpYXMsIHNwYWNlSWQ6IGNvbmZpZ3VyZWQuc3BhY2VJZCB9O1xuICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogYFVua25vd24gR2VuaWUgc3BhY2UgYWxpYXMgXCIke2FsaWFzfVwiYCB9KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICAvKiogQnJpZGdlIHRoZSBjb25uZWN0aW9uIGBjbG9zZWAgZXZlbnQgb250byBhbiBhYm9ydCBzaWduYWwuICovXG4gICAgY29uc3QgY2xvc2VTaWduYWwgPSAocmVzOiBleHByZXNzLlJlc3BvbnNlKTogQWJvcnRTaWduYWwgPT4ge1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIHJlcy5vbihcImNsb3NlXCIsICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgICByZXR1cm4gY29udHJvbGxlci5zaWduYWw7XG4gICAgfTtcblxuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImdlbmllQ2hhdFwiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IHBhdGgoY2hhdFNlZ21lbnQpLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNwYWNlID0gc3BhY2VGb3IocmVxLCByZXMpO1xuICAgICAgICBpZiAoIXNwYWNlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEdlbmllQ2hhdFJlcXVlc3RTY2hlbWEuc2FmZVBhcnNlKHJlcS5ib2R5KTtcbiAgICAgICAgaWYgKCFwYXJzZWQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc1xuICAgICAgICAgICAgLnN0YXR1cyg0MDApXG4gICAgICAgICAgICAuanNvbih7IGVycm9yOiBcInF1ZXN0aW9uIGlzIHJlcXVpcmVkXCIsIGZpZWxkczogaW52YWxpZEZpZWxkcyhwYXJzZWQuZXJyb3IpIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmFzVXNlcihyZXEpLnN0cmVhbUdlbmllQ2hhdChyZXMsIHNwYWNlLCBwYXJzZWQuZGF0YSwgY2xvc2VTaWduYWwocmVzKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImdlbmllVGhyZWFkc1wiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogcGF0aCh0aHJlYWRzKSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCBzcGFjZSA9IHNwYWNlRm9yKHJlcSwgcmVzKTtcbiAgICAgICAgaWYgKCFzcGFjZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFzVXNlcihyZXEpLmdlbmllQ29udmVyc2F0aW9uUmVhZCgoY2xpZW50KSA9PlxuICAgICAgICAgIGxpc3RHZW5pZVRocmVhZHMoY2xpZW50LCBzcGFjZSksXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgICAgdGhpcy5zZW5kRmFpbHVyZShyZXMsIHJlc3VsdCwgXCJnZW5pZS10aHJlYWRzXCIsIFwiQ291bGQgbm90IGxpc3QgR2VuaWUgY29udmVyc2F0aW9uc1wiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzLmpzb24oeyB0aHJlYWRzOiByZXN1bHQuZGF0YSB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiZ2VuaWVUaHJlYWRNZXNzYWdlc1wiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogcGF0aCh0aHJlYWRzLCBcIjp0aHJlYWRJZFwiLCBtZXNzYWdlcyksXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3Qgc3BhY2UgPSBzcGFjZUZvcihyZXEsIHJlcyk7XG4gICAgICAgIGlmICghc3BhY2UpIHJldHVybjtcbiAgICAgICAgY29uc3QgdGhyZWFkSWQgPSBmaXJzdE5vbkVtcHR5KHJlcS5wYXJhbXMudGhyZWFkSWQpID8/IFwiXCI7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXNVc2VyKHJlcSkuZ2VuaWVDb252ZXJzYXRpb25SZWFkKChjbGllbnQpID0+XG4gICAgICAgICAgbGlzdEdlbmllVGhyZWFkTWVzc2FnZXMoe1xuICAgICAgICAgICAgY2xpZW50LFxuICAgICAgICAgICAgc3BhY2UsXG4gICAgICAgICAgICBjb252ZXJzYXRpb25JZDogdGhyZWFkSWQsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgICAgdGhpcy5zZW5kRmFpbHVyZShyZXMsIHJlc3VsdCwgXCJnZW5pZS1tZXNzYWdlc1wiLCBcIkNvdWxkIG5vdCBsb2FkIHRoZSBHZW5pZSBjb252ZXJzYXRpb25cIik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlcy5qc29uKHsgbWVzc2FnZXM6IHJlc3VsdC5kYXRhIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJnZW5pZVRocmVhZERlbGV0ZVwiLFxuICAgICAgbWV0aG9kOiBcImRlbGV0ZVwiLFxuICAgICAgcGF0aDogcGF0aCh0aHJlYWRzLCBcIjp0aHJlYWRJZFwiKSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCBzcGFjZSA9IHNwYWNlRm9yKHJlcSwgcmVzKTtcbiAgICAgICAgaWYgKCFzcGFjZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCB0aHJlYWRJZCA9IGZpcnN0Tm9uRW1wdHkocmVxLnBhcmFtcy50aHJlYWRJZCkgPz8gXCJcIjtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hc1VzZXIocmVxKS5nZW5pZUNvbnZlcnNhdGlvbldyaXRlKChjbGllbnQpID0+XG4gICAgICAgICAgZGVsZXRlR2VuaWVUaHJlYWQoY2xpZW50LCBzcGFjZSwgdGhyZWFkSWQpLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgIHRoaXMuc2VuZEZhaWx1cmUoXG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICBcImdlbmllLXRocmVhZC1kZWxldGVcIixcbiAgICAgICAgICAgIFwiQ291bGQgbm90IGRlbGV0ZSB0aGUgR2VuaWUgY29udmVyc2F0aW9uXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnN0YXR1cygyMDQpLmVuZCgpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJnZW5pZVRocmVhZE1lc3NhZ2VEZWxldGVcIixcbiAgICAgIG1ldGhvZDogXCJkZWxldGVcIixcbiAgICAgIHBhdGg6IHBhdGgodGhyZWFkcywgXCI6dGhyZWFkSWRcIiwgbWVzc2FnZXMsIFwiOm1lc3NhZ2VJZFwiKSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCBzcGFjZSA9IHNwYWNlRm9yKHJlcSwgcmVzKTtcbiAgICAgICAgaWYgKCFzcGFjZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCB0aHJlYWRJZCA9IGZpcnN0Tm9uRW1wdHkocmVxLnBhcmFtcy50aHJlYWRJZCkgPz8gXCJcIjtcbiAgICAgICAgY29uc3QgbWVzc2FnZUlkID0gZmlyc3ROb25FbXB0eShyZXEucGFyYW1zLm1lc3NhZ2VJZCkgPz8gXCJcIjtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hc1VzZXIocmVxKS5nZW5pZUNvbnZlcnNhdGlvbldyaXRlKChjbGllbnQpID0+XG4gICAgICAgICAgZGVsZXRlR2VuaWVUaHJlYWRNZXNzYWdlKGNsaWVudCwgc3BhY2UsIHRocmVhZElkLCBtZXNzYWdlSWQpLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgIHRoaXMuc2VuZEZhaWx1cmUoXG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICBcImdlbmllLW1lc3NhZ2UtZGVsZXRlXCIsXG4gICAgICAgICAgICBcIkNvdWxkIG5vdCBkZWxldGUgdGhlIEdlbmllIG1lc3NhZ2VcIixcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXMuc3RhdHVzKDIwNCkuZW5kKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImdlbmllU3VnZ2VzdGlvbnNcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IHBhdGgoc3VnZ2VzdGlvbnMpLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNwYWNlID0gc3BhY2VGb3IocmVxLCByZXMpO1xuICAgICAgICBpZiAoIXNwYWNlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXNVc2VyKHJlcSkuZmV0Y2hTdWdnZXN0aW9ucyh1bmRlZmluZWQsIHtcbiAgICAgICAgICBbc3BhY2UuYWxpYXNdOiB7IHNwYWNlSWQ6IHNwYWNlLnNwYWNlSWQgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcy5qc29uKHsgcXVlc3Rpb25zOiByZXN1bHQub2sgPyByZXN1bHQuZGF0YSA6IFtdIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJlYW0gb25lIGRpcmVjdCBHZW5pZSB0dXJuIHRvIGByZXNgIHVuZGVyIEFwcEtpdCdzIE9CTyB1c2VyIGNvbnRleHQuXG4gICAqIERpcmVjdCBjb252ZXJzYXRpb25zIGNhbm5vdCB1c2UgdGhlIHNoYXJlZCBzZXJ2aWNlIHByaW5jaXBhbCBiZWNhdXNlIEdlbmllXG4gICAqIG93bnMgdGhlbSB1bmRlciB0aGUgRGF0YWJyaWNrcyBjYWxsZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHN0cmVhbUdlbmllQ2hhdChcbiAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgc3BhY2U6IEdlbmllQ2hhdFNwYWNlLFxuICAgIHJlcXVlc3Q6IEdlbmllQ2hhdFJlcXVlc3QsXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgICBjb25zdCBjbGllbnQgPSBjb250ZXh0LmNsaWVudDtcbiAgICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IG5ldyBSZXF1ZXN0Q29udGV4dDx1bmtub3duPihcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJlcXVlc3QucmVxdWVzdENvbnRleHQgPz8ge30pLFxuICAgICk7XG4gICAgY2xlYXJUcnVzdGVkUmVxdWVzdENvbnRleHQocmVxdWVzdENvbnRleHQpO1xuICAgIGNvbnN0IGFwcGxpY2F0aW9uQ29udGV4dCA9IHJlcXVlc3RDb250ZXh0LnRvSlNPTigpO1xuICAgIGF3YWl0IHN0YW1wUmVxdWVzdENvbnRleHRVc2VyKHJlcXVlc3RDb250ZXh0KTtcbiAgICBjb25zdCBtZW1vcnkgPSBhd2FpdCB0aGlzLmJ1aWx0Py5hZ2VudHNbdGhpcy5idWlsdC5kZWZhdWx0QWdlbnRJZF0/LmdldE1lbW9yeSh7XG4gICAgICByZXF1ZXN0Q29udGV4dCxcbiAgICB9KTtcbiAgICBhd2FpdCBwaXBlVUlNZXNzYWdlU3RyZWFtVG9SZXNwb25zZSh7XG4gICAgICByZXNwb25zZTogcmVzLFxuICAgICAgc3RyZWFtOiBnZW5pZUNoYXRTdHJlYW0oe1xuICAgICAgICBjbGllbnQsXG4gICAgICAgIHNwYWNlLFxuICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgcXVlc3Rpb246IHJlcXVlc3QucXVlc3Rpb24sXG4gICAgICAgICAgLi4uKHJlcXVlc3QuY29udmVyc2F0aW9uSWQgPyB7IGNvbnZlcnNhdGlvbklkOiByZXF1ZXN0LmNvbnZlcnNhdGlvbklkIH0gOiB7fSksXG4gICAgICAgICAgLi4uKE9iamVjdC5rZXlzKGFwcGxpY2F0aW9uQ29udGV4dCkubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyB7IHJlcXVlc3RDb250ZXh0OiBhcHBsaWNhdGlvbkNvbnRleHQgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0sXG4gICAgICAgIC4uLihtZW1vcnkgPyB7IG1lbW9yeSB9IDoge30pLFxuICAgICAgICByZXF1ZXN0Q29udGV4dCxcbiAgICAgICAgc2lnbmFsLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICAvKiogUnVuIG9uZSBHZW5pZSBjb252ZXJzYXRpb24gcmVhZCB1bmRlciB0aGUgYWN0aXZlIHJlcXVlc3QgaWRlbnRpdHkuICovXG4gIHByaXZhdGUgZ2VuaWVDb252ZXJzYXRpb25SZWFkPFQ+KFxuICAgIHJlYWQ6IChjbGllbnQ6IFJldHVyblR5cGU8dHlwZW9mIGdldEV4ZWN1dGlvbkNvbnRleHQ+W1wiY2xpZW50XCJdKSA9PiBQcm9taXNlPFQ+LFxuICApOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxUPj4ge1xuICAgIGNvbnN0IGNsaWVudCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQ7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSgoKSA9PiByZWFkKGNsaWVudCksIGdlbmllQ29udmVyc2F0aW9uUmVhZERlZmF1bHRzKTtcbiAgfVxuXG4gIC8qKiBSdW4gb25lIEdlbmllIGNvbnZlcnNhdGlvbiB3cml0ZSB1bmRlciB0aGUgYWN0aXZlIHJlcXVlc3QgaWRlbnRpdHkuICovXG4gIHByaXZhdGUgZ2VuaWVDb252ZXJzYXRpb25Xcml0ZShcbiAgICB3cml0ZTogKGNsaWVudDogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RXhlY3V0aW9uQ29udGV4dD5bXCJjbGllbnRcIl0pID0+IFByb21pc2U8dm9pZD4sXG4gICk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PHZvaWQ+PiB7XG4gICAgY29uc3QgY2xpZW50ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpLmNsaWVudDtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKCgpID0+IHdyaXRlKGNsaWVudCksIGdlbmllQ29udmVyc2F0aW9uV3JpdGVEZWZhdWx0cyk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgdGhlIHNpbmdsZSBmZWVkYmFjayBkZXN0aW5hdGlvbiBzZWxlY3RlZCBieSBwbHVnaW4gbW9kZS4gKi9cbiAgcHJpdmF0ZSByZWdpc3RlckZlZWRiYWNrUm91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImZlZWRiYWNrXCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogTUFTVFJBX1JPVVRFUy5mZWVkYmFjayxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCBtb2RlID0gdGhpcy5mZWVkYmFja01vZGUoKTtcbiAgICAgICAgaWYgKG1vZGUgPT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBvazogZmFsc2UgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IE1hc3RyYUZlZWRiYWNrUmVxdWVzdFNjaGVtYS5zYWZlUGFyc2UocmVxLmJvZHkpO1xuICAgICAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICAgICAgLy8gQSBab2QgaXNzdWUgc3RyaW5nIHF1b3RlcyB0aGUgcmVjZWl2ZWQgYm9keSBiYWNrLCBzbyBvbmx5IHRoZVxuICAgICAgICAgIC8vIG9mZmVuZGluZyBmaWVsZCBuYW1lcyB0cmF2ZWw7IHRoZSBmdWxsIGlzc3VlIGxpc3QgaXMgbG9nZ2VkLlxuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJmZWVkYmFjazppbnZhbGlkXCIsIHsgZXJyb3I6IHBhcnNlZC5lcnJvciB9KTtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7XG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogSU5WQUxJRF9GRUVEQkFDS19NRVNTQUdFLFxuICAgICAgICAgICAgZmllbGRzOiBpbnZhbGlkRmllbGRzKHBhcnNlZC5lcnJvciksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJzZWQuZGF0YS5tb2RlICE9PSBtb2RlKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBvazogZmFsc2UsIGVycm9yOiBJTlZBTElEX0ZFRURCQUNLX01FU1NBR0UgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJzZWQuZGF0YS5tb2RlID09PSBcImdlbmllXCIpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNjb3BlZFNlbGYocmVxKS5zZW5kR2VuaWVGZWVkYmFjayhwYXJzZWQuZGF0YSk7XG4gICAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZEZhaWx1cmUocmVzLCByZXN1bHQsIFwiZ2VuaWUtZmVlZGJhY2tcIiwgXCJGZWVkYmFjayBjb3VsZCBub3QgYmUgcmVjb3JkZWRcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlcy5qc29uKHsgb2s6IHRydWUgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2NvcGVkU2VsZihyZXEpLmxvZ0ZlZWRiYWNrKHBhcnNlZC5kYXRhKTtcbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBcImZlZWRiYWNrXCIsIFwiRmVlZGJhY2sgY291bGQgbm90IGJlIHJlY29yZGVkXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhc3Nlc3NtZW50SWQgPSByZXN1bHQuZGF0YTtcbiAgICAgICAgcmVzLmpzb24oe1xuICAgICAgICAgIG9rOiBhc3Nlc3NtZW50SWQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAuLi4oYXNzZXNzbWVudElkID8geyBhc3Nlc3NtZW50SWQgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIHRoZSBiZXN0LWVmZm9ydCBwZXItdmlld2VyIE1MZmxvdyBleHBlcmltZW50IGRlYnVnIGxpbmsuICovXG4gIHByaXZhdGUgcmVnaXN0ZXJNbGZsb3dFeHBlcmltZW50Um91dGUocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwibWxmbG93RXhwZXJpbWVudFwiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogTUFTVFJBX1JPVVRFUy5tbGZsb3dFeHBlcmltZW50LFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmZlZWRiYWNrTW9kZSgpICE9PSBcIm1sZmxvd1wiKSB7XG4gICAgICAgICAgcmVzLmpzb24oeyB1cmw6IG51bGwgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2NvcGVkU2VsZihyZXEpLmZldGNoTWxmbG93RXhwZXJpbWVudFVybCgpO1xuICAgICAgICByZXMuanNvbih7IHVybDogcmVzdWx0Lm9rID8gKHJlc3VsdC5kYXRhID8/IG51bGwpIDogbnVsbCB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgdGhlIGdhdGVkIE1hc3RyYSBjYXRjaC1hbGwgYWZ0ZXIgZXZlcnkgZXhwbGljaXQgcm91dGUuICovXG4gIHByaXZhdGUgcmVnaXN0ZXJBZ2VudFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICAvLyBNaWRkbGV3YXJlIHJhdGhlciB0aGFuIGB0aGlzLnJvdXRlYDogdGhpcyBpcyB0aGUgY2F0Y2gtYWxsIHRoYXQgaGFuZHNcbiAgICAvLyBldmVyeSByZW1haW5pbmcgbWV0aG9kIC8gcGF0aCBwYWlyIHRvIHRoZSBNYXN0cmEgc3ViLWFwcCwgc28gaXQgaGFzIG5vXG4gICAgLy8gc2luZ2xlIG1ldGhvZCBvciBwYXRoIHRvIHJlZ2lzdGVyIHVuZGVyLlxuICAgIHJvdXRlci51c2UoKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICBpZiAoIXRoaXMubWFzdHJhQXBwKSByZXR1cm4gcmVzLnN0YXR1cyg1MDMpLmVuZCgpO1xuICAgICAgLy8gR2F0ZSB0aGUgc3RvY2sgTWFzdHJhIHN1cmZhY2UgYmVmb3JlIGRpc3BhdGNoLiBJbiB0aGUgZGVmYXVsdFxuICAgICAgLy8gXCJzY29wZWRcIiBtb2RlIG9ubHkgYWdlbnQgaW5mZXJlbmNlLCByZWFkLW9ubHkgYWdlbnQgbWV0YWRhdGEsIHRoaXNcbiAgICAgIC8vIHBsdWdpbidzIG93biBgL3JvdXRlLypgIHJvdXRlcywgYW5kICh3aGVuIGVuYWJsZWQpIE1DUCByZWFjaCBNYXN0cmE7XG4gICAgICAvLyBhZG1pbiAvIG11dGF0aW5nIC8gYnVsay1leHBvcnQgcm91dGVzIGFyZSByZWZ1c2VkIGhlcmUuIGByZXEucGF0aGBcbiAgICAgIC8vIGlzIG1vdW50LXJlbGF0aXZlIHVuZGVyIHRoZSBwbHVnaW4gbW91bnQuIFNlZSBgc2VydmVyLnRzYC5cbiAgICAgIGlmIChcbiAgICAgICAgIWlzTWFzdHJhUmVxdWVzdEFsbG93ZWQocmVxLm1ldGhvZCwgcmVxLnBhdGgsIHtcbiAgICAgICAgICBhY2Nlc3M6IHRoaXMuY29uZmlnLmFwaUFjY2VzcyA/PyBcInNjb3BlZFwiLFxuICAgICAgICAgIC8vIFJlZmxlY3QgdGhlICpyZXNvbHZlZCogTUNQIHN0YXRlLCBub3QgcmF3IGBjb25maWcubWNwYDogTUNQIGlzXG4gICAgICAgICAgLy8gb24gYnkgZGVmYXVsdCAoYGNvbmZpZy5tY3BgIHVuZGVmaW5lZCksIHNvIGdhdGUgb24gd2hldGhlciB0aGVcbiAgICAgICAgICAvLyBzZXJ2ZXIgd2FzIGFjdHVhbGx5IGJ1aWx0IGFuZCBtb3VudGVkLlxuICAgICAgICAgIG1jcEVuYWJsZWQ6IHRoaXMubWNwICE9PSBudWxsLFxuICAgICAgICB9KVxuICAgICAgKSB7XG4gICAgICAgIHJlcy5zdGF0dXMoNDAzKS5qc29uKHsgZXJyb3I6IFwiRW5kcG9pbnQgbm90IGV4cG9zZWQgdG8gdGhlIGNsaWVudCAoYXBpQWNjZXNzPXNjb3BlZClcIiB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gRGlzcGF0Y2ggdGhyb3VnaCBhIHJlYWwgbWV0aG9kLCBOT1QgdGhlIGBtYXN0cmFBcHBgIHByb3BlcnR5LiBUaGVcbiAgICAgIC8vIEFwcEtpdCBgYXNVc2VyKHJlcSlgIHByb3h5IHdyYXBzIGZ1bmN0aW9uLXZhbHVlZCBwcm9wcyB3aXRoXG4gICAgICAvLyBgdmFsdWUuYmluZCh0YXJnZXQpYC4gYG1hc3RyYUFwcGAgaXMgYW4gZXhwcmVzcyBhcHAgd2hvc2UgYC5iaW5kYCBpc1xuICAgICAgLy8gdGhlIEhUVFAgQklORCByb3V0ZSByZWdpc3RyYXIgKGV4cHJlc3MgZGVmaW5lcyBhIG1ldGhvZCBwZXIgSFRUUCB2ZXJiLFxuICAgICAgLy8gYW5kIEJJTkQgaXMgb25lKSwgbm90IGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgLSBzbyBiaW5kaW5nIGl0IHRocm91Z2hcbiAgICAgIC8vIHRoZSBwcm94eSByZWdpc3RlcnMgYSBib2d1cyByb3V0ZSBhbmQgY3Jhc2hlcyBgcGF0aFRvUmVnZXhwYFxuICAgICAgLy8gKFwicGF0aCBtdXN0IGJlIGEgc3RyaW5nIC4uLlwiKS4gVGhpcyBvbmx5IG1hbmlmZXN0cyBpbiBwcm9kdWN0aW9uIHdoZXJlXG4gICAgICAvLyBhbiBPQk8gdG9rZW4gbWFrZXMgYHNjb3BlZFNlbGZgIHJldHVybiB0aGUgcHJveHkuIGBkaXNwYXRjaE1hc3RyYWBcbiAgICAgIC8vIGlzIGEgcGxhaW4gbWV0aG9kIChpdHMgYC5iaW5kYCBpcyB0aGUgbm9ybWFsIG9uZSkgYW5kIGludm9rZXNcbiAgICAgIC8vIGB0aGlzLm1hc3RyYUFwcGAgb2ZmIHRoZSByZWFsIHRhcmdldCwga2VlcGluZyB0aGUgT0JPIHNjb3BlIGFjdGl2ZS5cbiAgICAgIHJldHVybiB0aGlzLnNjb3BlZFNlbGYocmVxKS5kaXNwYXRjaE1hc3RyYShyZXEsIHJlcywgbmV4dCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFwIGEgZmFpbGVkIHtAbGluayBFeGVjdXRpb25SZXN1bHR9IG9udG8gdGhlIHJlc3BvbnNlOiB0aGUgc3RhdHVzIHRoZVxuICAgKiBleGVjdXRpb24gcGlwZWxpbmUgcmVzb2x2ZWQsIHBhaXJlZCB3aXRoIGBjbGllbnRNZXNzYWdlYCByYXRoZXIgdGhhbiB0aGVcbiAgICogcmVzdWx0J3Mgb3duIHRleHQsIHdoaWNoIGNhbiBjYXJyeSB1cHN0cmVhbSBkZXRhaWwuIFRoZSBmdWxsIG1lc3NhZ2UgaXNcbiAgICogbG9nZ2VkIHVuZGVyIGA8b3BlcmF0aW9uPjplcnJvcmAuXG4gICAqL1xuICBwcml2YXRlIHNlbmRGYWlsdXJlKFxuICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICByZXN1bHQ6IHsgc3RhdHVzOiBudW1iZXI7IG1lc3NhZ2U6IHN0cmluZyB9LFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIGNsaWVudE1lc3NhZ2U6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5sb2dnZXIud2FybihgJHtvcGVyYXRpb259OmVycm9yYCwge1xuICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgZXJyb3I6IHRvRXJyb3IocmVzdWx0Lm1lc3NhZ2UpLFxuICAgIH0pO1xuICAgIGlmIChyZXMuaGVhZGVyc1NlbnQpIHJldHVybjtcbiAgICByZXMuc3RhdHVzKHJlc3VsdC5zdGF0dXMpLmpzb24oeyBlcnJvcjogY2xpZW50TWVzc2FnZSB9KTtcbiAgfVxuXG4gIC8qKiA0MDQgYm9keSBmb3IgYSByZXF1ZXN0IG5hbWluZyBhbiBhZ2VudCB0aGF0IGlzbid0IHJlZ2lzdGVyZWQuICovXG4gIHByaXZhdGUgdW5rbm93bkFnZW50TWVzc2FnZShhZ2VudElkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBPYmplY3Qua2V5cyh0aGlzLmJ1aWx0Py5hZ2VudHMgPz8ge30pO1xuICAgIHJldHVybiBgVW5rbm93biBhZ2VudCBcIiR7YWdlbnRJZH1cIi4gUmVnaXN0ZXJlZCBhZ2VudHM6ICR7cmVnaXN0ZXJlZC5qb2luKFwiLCBcIikgfHwgXCJub25lXCJ9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2UgdGhlIE1hc3RyYSBleHByZXNzIHN1Yi1hcHAuIEV4aXN0cyBhcyBhIG1ldGhvZCAoaW5zdGVhZCBvZiByZWFkaW5nXG4gICAqIGB0aGlzLm1hc3RyYUFwcGAgdGhyb3VnaCB0aGUgYGFzVXNlcihyZXEpYCBwcm94eSBhdCB0aGUgY2FsbCBzaXRlKSBzbyB0aGVcbiAgICogcHJveHkgYmluZHMgdGhpcyBwbGFpbiBtZXRob2QgLSB3aG9zZSBgLmJpbmRgIGlzIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGBcbiAgICogLSByYXRoZXIgdGhhbiB0aGUgZXhwcmVzcyBhcHAsIHdob3NlIGAuYmluZGAgaXMgdGhlIEhUVFAgQklORCByb3V0ZVxuICAgKiByZWdpc3RyYXIgKHNlZSB0aGUgbm90ZSBpbiBgaW5qZWN0Um91dGVzYCkuIFJ1bnMgaW5zaWRlIHRoZSB1c2VyIHNjb3BlIHNvXG4gICAqIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlIE9CTyBjbGllbnQgZm9yIHRoZSBhZ2VudC9tb2RlbFxuICAgKiByZXNvbHZlcnMuXG4gICAqL1xuICBwcml2YXRlIGRpc3BhdGNoTWFzdHJhKFxuICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICBuZXh0OiBleHByZXNzLk5leHRGdW5jdGlvbixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5tYXN0cmFBcHAhKHJlcSwgcmVzLCBuZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXAgYSBjbGVhbiwgbW91bnQtcmVsYXRpdmUgTUNQIGFsaWFzIHBhdGggdG8gdGhlIHVuZGVybHlpbmdcbiAgICogYEBtYXN0cmEvZXhwcmVzc2Agcm91dGUuIFJldHVybnMgYG51bGxgIHdoZW4gTUNQIGlzIG9mZiBvciB0aGUgcGF0aFxuICAgKiBpc24ndCBhbiBhbGlhcy4gQ29sbGFwc2VzIHRoZSBzdG9jayBgL21jcC88c2VydmVySWQ+Lzx0cmFuc3BvcnQ+YFxuICAgKiBsYXlvdXQgKHNlcnZlcklkIGRlZmF1bHRzIHRvIHRoZSBwbHVnaW4gbmFtZSkgZG93biB0byBgL21jcGAsXG4gICAqIGAvc3NlYCwgYW5kIGAvbWVzc2FnZXNgLlxuICAgKi9cbiAgcHJpdmF0ZSBtY3BSb3V0ZUFsaWFzKHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5tY3ApIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGlkID0gdGhpcy5tY3Auc2VydmVySWQ7XG4gICAgaWYgKHBhdGggPT09IFwiL21jcFwiKSByZXR1cm4gYC9tY3AvJHtpZH0vbWNwYDtcbiAgICBpZiAocGF0aCA9PT0gXCIvc3NlXCIpIHJldHVybiBgL21jcC8ke2lkfS9zc2VgO1xuICAgIGlmIChwYXRoID09PSBcIi9tZXNzYWdlc1wiKSByZXR1cm4gYC9tY3AvJHtpZH0vbWVzc2FnZXNgO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIGJhY2tpbmcgdGhlIGAvc3VnZ2VzdGlvbnNgIHJvdXRlLiBSdW5zIGluc2lkZSB0aGVcbiAgICogQXBwS2l0IHVzZXItY29udGV4dCBwcm94eSBzbyBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYCByZXR1cm5zIHRoZVxuICAgKiBPQk8tc2NvcGVkIGNsaWVudC4gUmVzb2x2ZXMgdGhlIHBsdWdpbidzIEdlbmllIHNwYWNlcyBhbmQgbWVyZ2VzXG4gICAqIHRoZWlyIGN1cmF0ZWQgYHNhbXBsZV9xdWVzdGlvbnNgIChzZWUge0BsaW5rIGNvbGxlY3RTcGFjZVN1Z2dlc3Rpb25zfSkuXG4gICAqIGBvbmx5YCBuYXJyb3dzIHRoZSBsb29rdXAgdG8gdGhlIGdpdmVuIHNwYWNlcyAodGhlIGRpcmVjdCBHZW5pZSBjaGF0XG4gICAqIHBhc3NlcyBpdHMgb3duKS4gUmV0dXJucyBgW11gIHdoZW4gbm8gR2VuaWUgc3BhY2UgaXMgY29uZmlndXJlZCBzbyB0aGVcbiAgICogY2xpZW50IHNob3dzIGEgYmFyZSBlbXB0eSBzdGF0ZSBpbnN0ZWFkIG9mIGJ1aWx0LWluIGV4YW1wbGUgcHJvbXB0cy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hTdWdnZXN0aW9ucyhcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgICBvbmx5PzogUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz4sXG4gICk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PHN0cmluZ1tdPj4ge1xuICAgIGNvbnN0IHNwYWNlcyA9IG9ubHkgPz8gcmVzb2x2ZUdlbmllU3BhY2VzKHRoaXMuY29uZmlnLCB0aGlzLmNvbnRleHQpO1xuICAgIGlmIChPYmplY3Qua2V5cyhzcGFjZXMpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgb2s6IHRydWUsIGRhdGE6IFtdIH07XG4gICAgY29uc3QgY2xpZW50ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpLmNsaWVudDtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKChleGVjdXRlU2lnbmFsKSA9PiB7XG4gICAgICBjb25zdCBjb21iaW5lZCA9IGNvbWJpbmVBYm9ydFNpZ25hbHMoc2lnbmFsLCBleGVjdXRlU2lnbmFsKTtcbiAgICAgIHJldHVybiBjb2xsZWN0U3BhY2VTdWdnZXN0aW9ucyh7XG4gICAgICAgIHNwYWNlcyxcbiAgICAgICAgY2xpZW50LFxuICAgICAgICAuLi4oY29tYmluZWQgPyB7IHNpZ25hbDogY29tYmluZWQgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH0sIGdlbmllU3VnZ2VzdGlvbkRlZmF1bHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBiYWNraW5nIHRoZSBgL3JvdXRlL2ZlZWRiYWNrYCByb3V0ZS4gUnVucyBpbnNpZGUgdGhlXG4gICAqIEFwcEtpdCB1c2VyLWNvbnRleHQgcHJveHkgc28gYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgcmV0dXJucyB0aGVcbiAgICogT0JPLXNjb3BlZCBjbGllbnQgYW5kIHRoZSBhc3Nlc3NtZW50IGlzIGF0dHJpYnV0ZWQgdG8gdGhlIHNpZ25lZC1pblxuICAgKiB1c2VyICh0aGVpciBlbWFpbCAvIGlkIGFzIHRoZSBhc3Nlc3NtZW50IHNvdXJjZSkuIFJldHVybnMgdGhlXG4gICAqIGNyZWF0ZWQgYXNzZXNzbWVudCBpZCBvbiBzdWNjZXNzLCBvciBgdW5kZWZpbmVkYCBvbiBhIHNvZnQgZmFpbHVyZVxuICAgKiAoc2VlIHtAbGluayBsb2dGZWVkYmFja30gaW4gYC4vbWxmbG93LmpzYCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvZ0ZlZWRiYWNrKFxuICAgIGZlZWRiYWNrOiBNbGZsb3dGZWVkYmFja1JlcXVlc3QsXG4gICk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PHN0cmluZyB8IHVuZGVmaW5lZD4+IHtcbiAgICBjb25zdCBjdHggPSBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gICAgY29uc3Qgc291cmNlSWQgPVxuICAgICAgXCJ1c2VyRW1haWxcIiBpbiBjdHggJiYgY3R4LnVzZXJFbWFpbFxuICAgICAgICA/IGN0eC51c2VyRW1haWxcbiAgICAgICAgOiBcInVzZXJJZFwiIGluIGN0eFxuICAgICAgICAgID8gY3R4LnVzZXJJZFxuICAgICAgICAgIDogY3R4LnNlcnZpY2VVc2VySWQ7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShcbiAgICAgICgpID0+XG4gICAgICAgIGxvZ0ZlZWRiYWNrKGN0eC5jbGllbnQsIHtcbiAgICAgICAgICAuLi5mZWVkYmFjayxcbiAgICAgICAgICAuLi4oc291cmNlSWQgPyB7IHNvdXJjZUlkIH0gOiB7fSksXG4gICAgICAgIH0pLFxuICAgICAgZmVlZGJhY2tXcml0ZURlZmF1bHRzLFxuICAgICk7XG4gIH1cblxuICAvKiogU2VuZCBBZ2VudCBNb2RlIHJhdGluZyBhbmQgY29tbWVudCBkaXJlY3RseSB0byB0aGUgb3JpZ2luYXRpbmcgR2VuaWUgbWVzc2FnZS4gKi9cbiAgcHJpdmF0ZSBzZW5kR2VuaWVGZWVkYmFjayhpbnB1dDogR2VuaWVGZWVkYmFja1JlcXVlc3QpOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDx2b2lkPj4ge1xuICAgIGNvbnN0IGNsaWVudCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQ7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShcbiAgICAgIChzaWduYWwpID0+XG4gICAgICAgIHNlbmRHZW5pZU1lc3NhZ2VGZWVkYmFjayhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzcGFjZV9pZDogaW5wdXQuc3BhY2VJZCxcbiAgICAgICAgICAgIGNvbnZlcnNhdGlvbl9pZDogaW5wdXQuY29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgICBtZXNzYWdlX2lkOiBpbnB1dC5tZXNzYWdlSWQsXG4gICAgICAgICAgICByYXRpbmc6IGlucHV0LnJhdGluZyxcbiAgICAgICAgICAgIC4uLihpbnB1dC5jb21tZW50ID8geyBjb21tZW50OiBpbnB1dC5jb21tZW50IH0gOiB7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3Jrc3BhY2VDbGllbnQ6IGNsaWVudCxcbiAgICAgICAgICAgIC4uLihzaWduYWwgPyB7IGNvbnRleHQ6IHNpZ25hbCB9IDoge30pLFxuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICBmZWVkYmFja1dyaXRlRGVmYXVsdHMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGFuIGV4cGVyaW1lbnQgbGluayB1bmRlciB0aGUgYWN0aXZlIHJlcXVlc3QgaWRlbnRpdHkuIFRoZSBoZWxwZXJcbiAgICogcmV0dXJucyBubyBVUkwgdW5sZXNzIHRoZSB2aWV3ZXIgaGFzIGVmZmVjdGl2ZSBgQ0FOX01BTkFHRWAgcGVybWlzc2lvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hNbGZsb3dFeHBlcmltZW50VXJsKCk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PHN0cmluZyB8IHVuZGVmaW5lZD4+IHtcbiAgICBjb25zdCBjbGllbnQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoKCkgPT4gbWxmbG93RXhwZXJpbWVudE1hbmFnZXJVcmwoY2xpZW50KSwgZmVlZGJhY2tXcml0ZURlZmF1bHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBiYWNraW5nIHRoZSBgZGF0YWAgZW1iZWQgcmVzb2x2ZXJcbiAgICogKGBHRVQgL2VtYmVkL2RhdGEvOmlkYCkuIFJ1bnMgaW5zaWRlIHRoZSBBcHBLaXQgdXNlci1jb250ZXh0IHByb3h5IHNvXG4gICAqIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlIE9CTy1zY29wZWQgd29ya3NwYWNlXG4gICAqIGNsaWVudCwgdGhlbiByZXVzZXMgdGhlIHNhbWUgYGZldGNoU3RhdGVtZW50RGF0YWAgcGlwZWxpbmVcbiAgICogdGhlIGBnZXRfc3RhdGVtZW50YCB0b29sIHJ1bnMgc28gdGhlIExMTSBhbmQgdGhlIFVJIHNlZSB0aGVcbiAgICogZXhhY3Qgc2FtZSBzaGFwZSBmb3IgdGhlIHNhbWUgc3RhdGVtZW50LlxuICAgKlxuICAgKiBSZXNvbHZlcyB0byBgdW5kZWZpbmVkYCBkYXRhIGZvciB1cHN0cmVhbSA0MDRzIHNvIHRoZSByb3V0ZSBjYW4gbWFwIHRoZW1cbiAgICogdG8gYSBjbGVhbiBIVFRQIDQwNDsgYW55IG90aGVyIGZhaWx1cmUgY29tZXMgYmFjayBhcyBhIG5vbi1gb2tgIHJlc3VsdFxuICAgKiBjYXJyeWluZyB0aGUgc3RhdHVzIHRvIGFuc3dlciB3aXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFN0YXRlbWVudChcbiAgICBzdGF0ZW1lbnRJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgbGltaXQ/OiBudW1iZXI7IHNpZ25hbD86IEFib3J0U2lnbmFsIH0gPSB7fSxcbiAgKTogUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8U3RhdGVtZW50RGF0YSB8IHVuZGVmaW5lZD4+IHtcbiAgICBjb25zdCBjbGllbnQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xuICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4ob3B0aW9ucy5saW1pdCA/PyBTVEFURU1FTlRfUk9XX0NBUCwgU1RBVEVNRU5UX1JPV19DQVApO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoXG4gICAgICBhc3luYyAoZXhlY3V0ZVNpZ25hbCkgPT4ge1xuICAgICAgICBjb25zdCBjb21iaW5lZCA9IGNvbWJpbmVBYm9ydFNpZ25hbHMob3B0aW9ucy5zaWduYWwsIGV4ZWN1dGVTaWduYWwpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgZGF0YSwgdmlzdWFsaXphdGlvbiB9ID0gYXdhaXQgZmV0Y2hTdGF0ZW1lbnRFbWJlZERhdGEoY2xpZW50LCBzdGF0ZW1lbnRJZCwge1xuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICAuLi4oY29tYmluZWQgPyB7IHNpZ25hbDogY29tYmluZWQgfSA6IHt9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29sdW1uczogZGF0YS5jb2x1bW5zLFxuICAgICAgICAgICAgcm93czogZGF0YS5yb3dzLFxuICAgICAgICAgICAgcm93Q291bnQ6IGRhdGEucm93Q291bnQsXG4gICAgICAgICAgICB0cnVuY2F0ZWQ6IGRhdGEucm93cy5sZW5ndGggPCBkYXRhLnJvd0NvdW50LFxuICAgICAgICAgICAgdmlzdWFsaXphdGlvbixcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAvLyBUaGUgRGF0YWJyaWNrcyBTREsgdGhyb3dzIG9uIDQwNDsgc3VyZmFjZSBhcyBgdW5kZWZpbmVkYFxuICAgICAgICAgIC8vIHNvIHRoZSByb3V0ZSBtYXBzIHRvIGEgY2xlYW4gSFRUUCA0MDQgaW5zdGVhZCBvZiBhIDUwMC5cbiAgICAgICAgICBpZiAoZXJyb3JDb250ZXh0KGVycikubm90QWNjZXNzaWJsZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAuLi5zdGF0ZW1lbnREYXRhRGVmYXVsdHMuZGVmYXVsdCxcbiAgICAgICAgICAvLyBOYW1lc3BhY2VkIHNvIHRoZSBrZXkgY2FuJ3QgY29sbGlkZSB3aXRoIGFub3RoZXIgY2FjaGUgc2hhcmluZyB0aGVcbiAgICAgICAgICAvLyBtYW5hZ2VyLCBhbmQga2V5ZWQgb24gYGxpbWl0YCBiZWNhdXNlIHRoZSBzbGljZSBpcyBwYXJ0IG9mIHRoZVxuICAgICAgICAgIC8vIHBheWxvYWQuXG4gICAgICAgICAgY2FjaGU6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlbWVudERhdGFEZWZhdWx0cy5kZWZhdWx0LmNhY2hlLFxuICAgICAgICAgICAgY2FjaGVLZXk6IFtTVEFURU1FTlRfQ0FDSEVfTkFNRVNQQUNFLCBzdGF0ZW1lbnRJZCwgbGltaXRdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gYmFja2luZyB0aGUgYGNoYXJ0YCBlbWJlZCByZXNvbHZlclxuICAgKiAoYEdFVCAvZW1iZWQvY2hhcnQvOmlkYCkuIFJ1bnMgaW5zaWRlIHRoZSBBcHBLaXQgdXNlci1jb250ZXh0IHByb3h5IHNvIHRoZVxuICAgKiBsb29rdXAgaXMgbmFtZXNwYWNlZCB0byB0aGUgY2FsbGluZyBpZGVudGl0eTogYSBjaGFydCBtaW50ZWQgZm9yIGFub3RoZXJcbiAgICogdXNlciBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFuIHVua25vd24gaWQsIGFuZCB0aGUgcm91dGUgYW5zd2VycyA0MDQuXG4gICAqXG4gICAqIFRoZSBrZXkgaXMgYnVpbHQgZnJvbSB7QGxpbmsgYXR0cmlidXRlZFVzZXJJZH0gLSB0aGUgc2FtZSBydWxlIHRoYXQgbmFtZWRcbiAgICogdGhlIGlkZW50aXR5IHRoZSBjaGFydCB3YXMgd3JpdHRlbiB1bmRlciAtIHJhdGhlciB0aGFuIGZyb20gdGhlIGFtYmllbnRcbiAgICogZXhlY3V0aW9uIGNvbnRleHQgYWxvbmUuIEluIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSB0aGUgYW1iaWVudCBjb250ZXh0IGlzXG4gICAqIHRoZSBTUCBmb3IgZXZlcnkgY2FsbGVyLCBzbyBrZXlpbmcgb2ZmIGl0IGFsb25lIG1pc3NlZCBldmVyeSBjaGFydCB0aGVcbiAgICogdHVybiBoYWQgd3JpdHRlbiB1bmRlciB0aGUgZm9yd2FyZGVkIHVzZXIgYW5kIHRoZSBVSSBzaG93ZWQgZWFjaCBvbmUgYXNcbiAgICogZXhwaXJlZC4gYHJlcWAgaXMgcmVhZCBpbnNpZGUgdGhlIG1ldGhvZCwgbm90IGF0IHRoZSBjYWxsIHNpdGUsIHNvIHRoZVxuICAgKiBleGVjdXRpb24gY29udGV4dCBpcyB0aGUgc2NvcGVkIG9uZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hDaGFydEVudHJ5KFxuICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgIGNoYXJ0SWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7IHRpbWVvdXRNcz86IG51bWJlcjsgc2lnbmFsOiBBYm9ydFNpZ25hbCB9LFxuICApOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxDaGFydCB8IHVuZGVmaW5lZD4+IHtcbiAgICBjb25zdCB1c2VyS2V5ID0gYXR0cmlidXRlZFVzZXJJZChnZXRFeGVjdXRpb25Db250ZXh0KCksIHJlcXVlc3RVc2VySWQocmVxKSk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShcbiAgICAgIChleGVjdXRlU2lnbmFsKSA9PlxuICAgICAgICBmZXRjaENoYXJ0KGNoYXJ0SWQsIHtcbiAgICAgICAgICB1c2VyS2V5LFxuICAgICAgICAgIC4uLihvcHRpb25zLnRpbWVvdXRNcyAhPT0gdW5kZWZpbmVkID8geyB0aW1lb3V0TXM6IG9wdGlvbnMudGltZW91dE1zIH0gOiB7fSksXG4gICAgICAgICAgc2lnbmFsOiBjb21iaW5lQWJvcnRTaWduYWxzKG9wdGlvbnMuc2lnbmFsLCBleGVjdXRlU2lnbmFsKSA/PyBvcHRpb25zLnNpZ25hbCxcbiAgICAgICAgfSksXG4gICAgICBjaGFydEZldGNoRGVmYXVsdHMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBiYWNraW5nIHRoZSBgL21vZGVsc2Agcm91dGUuIFJ1bnMgaW5zaWRlIHRoZSBBcHBLaXRcbiAgICogdXNlci1jb250ZXh0IHByb3h5IHNvIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlIE9CTy1zY29wZWRcbiAgICogY2xpZW50IGFuZCB0aGUgY2F0YWxvZ3VlIHJlZmxlY3RzIHdoYXQgdGhlIGNhbGxlciBjYW4gaW52b2tlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsaXN0TW9kZWxzUmVzdWx0KCk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gICAgICBjb25zdCBjbGllbnQgPSBjb250ZXh0LmNsaWVudDtcbiAgICAgIGNvbnN0IGNhY2hlSWRlbnRpdHkgPSBleGVjdXRpb25Db250ZXh0VXNlcklkKGNvbnRleHQpO1xuICAgICAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHNlcnZpbmcgPSByZXNvbHZlU2VydmluZ0NvbmZpZyh0aGlzLmNvbmZpZyk7XG4gICAgICByZXR1cm4gbW9kZWxDYXRhbG9nLmxpc3RTZXJ2aW5nRW5kcG9pbnRzKGNsaWVudCwgaG9zdCwge1xuICAgICAgICB0dGxNczogc2VydmluZy50dGxNcyxcbiAgICAgICAgY2FjaGVJZGVudGl0eSxcbiAgICAgIH0pO1xuICAgIH0sIG1vZGVsQ2F0YWxvZ3VlRGVmYXVsdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIGJhY2tpbmcgdGhlIGBsaXN0TW9kZWxzYCBleHBvcnQuIFRoZSBwcm9ncmFtbWF0aWMgc3VyZmFjZVxuICAgKiBjYXJyaWVzIG5vIHN0YXR1cyBjb2RlLCBzbyBhIGZhaWxlZCBleGVjdXRpb24gYmVjb21lcyBhIHRocm93IHdpdGggYVxuICAgKiBzdGFibGUgbWVzc2FnZTsgdGhlIHJvdXRlcyBicmFuY2ggb24gdGhlIHtAbGluayBFeGVjdXRpb25SZXN1bHR9IGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxpc3RNb2RlbHMoKTogUHJvbWlzZTxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmxpc3RNb2RlbHNSZXN1bHQoKTtcbiAgICBpZiAocmVzdWx0Lm9rKSByZXR1cm4gcmVzdWx0LmRhdGE7XG4gICAgdGhpcy5sb2dnZXIud2FybihcImxpc3RNb2RlbHM6ZXJyb3JcIiwge1xuICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgZXJyb3I6IHRvRXJyb3IocmVzdWx0Lm1lc3NhZ2UpLFxuICAgIH0pO1xuICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihNT0RFTF9DQVRBTE9HVUVfRkFJTEVEX01FU1NBR0UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZEFnZW50QW5kU2VydmVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1lbW9yeVBvb2wgPSBuZWVkc0xha2ViYXNlKHRoaXMuY29uZmlnKVxuICAgICAgPyBjcmVhdGVNYXN0cmFMYWtlYmFzZVBvb2woXG4gICAgICAgICAgcmVxdWlyZSh0aGlzLmNvbnRleHQsIGxha2ViYXNlLCB0aGlzLmNvbmZpZykuZXhwb3J0cygpLmdldFBnQ29uZmlnKCksXG4gICAgICAgIClcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1lbW9yeUJ1aWxkZXIgPSBjcmVhdGVNZW1vcnlCdWlsZGVyKHRoaXMuY29uZmlnLCBtZW1vcnlQb29sKTtcblxuICAgIC8vIEJ1aWxkIGV2ZXJ5IGFnZW50IGRlY2xhcmVkIGluIGBjb25maWcuYWdlbnRzYCAob3IgdGhlIGJ1aWx0LWluXG4gICAgLy8gZmFsbGJhY2sgd2hlbiBub25lIGFyZSBkZWNsYXJlZCkuIEVhY2ggYWdlbnQncyBgbW9kZWxgIHJlc29sdmVzXG4gICAgLy8gd29ya3NwYWNlIFVSTCArIGJlYXJlciBhdCBjYWxsIHRpbWUgc28gY29uY3VycmVudCByZXF1ZXN0cyBnZXRcbiAgICAvLyBkaXN0aW5jdCB1c2VyIGlkZW50aXRpZXM7IHRoZSBgYXNVc2VyKHJlcSlgIHNjb3BlIGFyb3VuZFxuICAgIC8vIGBoYW5kbGVDaGF0YCBpcyB3aGF0IGxldHMgYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgcmV0dXJuIHRoZVxuICAgIC8vIHJpZ2h0IHVzZXIgaW5zaWRlIHRoZSByZXNvbHZlci5cbiAgICAvLyBNYXRlcmlhbGl6ZSBhbnkgcmVtb3RlIEFnZW50LVNraWxsIHNvdXJjZXMgT05DRSBhdCBzdGFydHVwLiBSdW5zXG4gICAgLy8gb3V0c2lkZSBhIHJlcXVlc3Qgc2NvcGUsIHNvIGl0IHVzZXMgdGhlIGFwcCBzZXJ2aWNlIHByaW5jaXBhbCdzIGNsaWVudFxuICAgIC8vIGFuZCBkZWZhdWx0cyB0byB0aGUgc2hhcmVkIHdvcmtzcGFjZSBBc3Npc3RhbnQgc2tpbGxzIHRyZWU7IGEgc291cmNlXG4gICAgLy8gYmFja2VkIGJ5IGxvY2FsIG9yIG1lbW9yeSBzdG9yYWdlIGlzIGNvbnZlcnRlZCBpbnRvIG5hdGl2ZSBhZ2VudC1sZXZlbFxuICAgIC8vIHNraWxsczsgRGF0YWJyaWNrcyB3b3Jrc3BhY2UgZGlyZWN0b3JpZXMgcmVtYWluIHNlYXJjaC1kaXNjb3ZlcmVkLlxuICAgIGNvbnN0IHByb3Zpc2lvbmVkID0gYXdhaXQgcHJvdmlzaW9uUmVtb3RlU2tpbGxzKHRoaXMuY29uZmlnLnJlbW90ZVNraWxscyk7XG4gICAgaWYgKHByb3Zpc2lvbmVkLnNraWxsTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcInJlbW90ZSBza2lsbHMgY29uZmlndXJlZFwiLCB7XG4gICAgICAgIHNraWxsczogcHJvdmlzaW9uZWQuc2tpbGxOYW1lcyxcbiAgICAgICAgZGF0YWJyaWNrc0Jhc2VQYXRoOiBwcm92aXNpb25lZC5kYXRhYnJpY2tzQmFzZVBhdGgsXG4gICAgICAgIGxvY2FsU2tpbGxNb3VudHM6IHByb3Zpc2lvbmVkLmxvY2FsU2tpbGxNb3VudHMubGVuZ3RoLFxuICAgICAgICBzdGFuZGFyZFNraWxsTW91bnRzOiBwcm92aXNpb25lZC5zdGFuZGFyZFNraWxsTW91bnRzLmxlbmd0aCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGxvY2FsU2tpbGxNb3VudHMgPSBbXG4gICAgICAuLi4odGhpcy5jb25maWcubG9jYWxTa2lsbE1vdW50cyA/PyBbXSksXG4gICAgICAuLi5wcm92aXNpb25lZC5sb2NhbFNraWxsTW91bnRzLFxuICAgIF07XG4gICAgY29uc3Qgc3RhbmRhcmRTa2lsbHMgPSBhd2FpdCBpbmxpbmVTa2lsbHNGcm9tTG9jYWxNb3VudHMoW1xuICAgICAgLi4uKHRoaXMuY29uZmlnLmxvY2FsU2tpbGxNb3VudHMgPz8gW10pLFxuICAgICAgLi4ucHJvdmlzaW9uZWQuc3RhbmRhcmRTa2lsbE1vdW50cyxcbiAgICBdKTtcbiAgICB0aGlzLmJ1aWx0ID0gYXdhaXQgYnVpbGRBZ2VudHMoe1xuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIGNvbnRleHQ6IHRoaXMuY29udGV4dCxcbiAgICAgIG1lbW9yeUJ1aWxkZXIsXG4gICAgICBvdXRwdXRQcm9jZXNzb3JGYWN0b3JpZXM6IHRoaXMub3V0cHV0UHJvY2Vzc29yRmFjdG9yaWVzLFxuICAgICAgbG9nOiB0aGlzLmxvZ2dlcixcbiAgICAgIGV4dHJhU2tpbGxNb3VudHM6IGxvY2FsU2tpbGxNb3VudHMsXG4gICAgICBzdGFuZGFyZFNraWxscyxcbiAgICAgIGV4Y2x1ZGVkV29ya3NwYWNlU2tpbGxOYW1lczogcHJvdmlzaW9uZWQuc2tpbGxOYW1lcyxcbiAgICB9KTtcblxuICAgIC8vIGBtYXN0cmEuc2VydmVyLmFwaVJvdXRlc2AgaXMgb25seSBob25vcmVkIGJ5IE1hc3RyYSdzIHN0YW5kYWxvbmVcbiAgICAvLyBkZXYgc2VydmVyLiBTaW5jZSB3ZSdyZSBob3N0aW5nIE1hc3RyYSBpbnNpZGUgb3VyIG93biBFeHByZXNzXG4gICAgLy8gc3ViYXBwIHZpYSBgQG1hc3RyYS9leHByZXNzYCwgY3VzdG9tIHJvdXRlcyBtdXN0IGJlIHBhc3NlZCB0b1xuICAgIC8vIHRoZSBgTWFzdHJhU2VydmVyYCBjb25zdHJ1Y3RvciBkaXJlY3RseS5cbiAgICAvL1xuICAgIC8vIGBzdG9yYWdlYCBoZXJlIGlzICpNYXN0cmEtaW5zdGFuY2UtbGV2ZWwqIGFuZCBwZXJzaXN0cyB3b3JrZmxvd1xuICAgIC8vIHNuYXBzaG90cyAod2hlcmUgc3VzcGVuZGVkIGByZXF1aXJlQXBwcm92YWxgIHRvb2wgY2FsbHMgbGl2ZSkuXG4gICAgLy8gSXQncyBzZXBhcmF0ZSBmcm9tIGVhY2ggYWdlbnQncyBgTWVtb3J5LnN0b3JhZ2VgLCB3aGljaCBvbmx5XG4gICAgLy8gY292ZXJzIHRocmVhZCAvIG1lc3NhZ2UgaGlzdG9yeS4gV2l0aG91dCBpdCxcbiAgICAvLyBgYWdlbnQucmVzdW1lU3RyZWFtKClgIGVycm9ycyB3aXRoIFwiY291bGQgbm90IGZpbmQgYSBzdXNwZW5kZWRcbiAgICAvLyBydW5cIiBhbmQgdGhlIGFwcHJvdmFsIFVJIGhhbmdzIGFmdGVyIHRoZSB1c2VyIGNsaWNrcyBBcHByb3ZlLlxuICAgIGNvbnN0IGluc3RhbmNlU3RvcmFnZSA9IG1lbW9yeUJ1aWxkZXI/Lmluc3RhbmNlU3RvcmFnZSgpO1xuICAgIC8vIFdpcmUgTWFzdHJhJ3MgdHJhY2VyIGludG8gT1RlbCB0aHJvdWdoIGBAbWFzdHJhL290ZWwtYnJpZGdlYC4gRGVwbG95ZWRcbiAgICAvLyBBcHBzIHVzZSB0aGUgcHJvdmlkZXIgQXBwS2l0IHJlZ2lzdGVyZWQgZHVyaW5nIGBjcmVhdGVBcHBgOyBsb2NhbCBkaXJlY3RcbiAgICAvLyBNTGZsb3cgdHJhY2luZyB1c2VzIGl0cyBvd24gZ2xvYmFsIHByb3ZpZGVyIHdoZW4gbm8gT1RMUCBleHBvcnRlciBleGlzdHMuXG4gICAgY29uc3Qgb2JzZXJ2YWJpbGl0eSA9IGF3YWl0IGJ1aWxkT2JzZXJ2YWJpbGl0eSh7XG4gICAgICBzZXJ2aWNlTmFtZTogdGhpcy5uYW1lLFxuICAgICAgZW5hYmxlZDogdGhpcy5jb25maWcub2JzZXJ2YWJpbGl0eSxcbiAgICAgIHRyYWNlclByb3ZpZGVyOiBhd2FpdCBkZWZlcnJlZE5hdGl2ZVRyYWNlclByb3ZpZGVyKCksXG4gICAgfSk7XG4gICAgLy8gT3B0aW9uYWwgTUNQIGV4cG9zdXJlOiBidWlsZCBhIE1hc3RyYSBNQ1Agc2VydmVyIGZyb20gdGhlXG4gICAgLy8gcmVnaXN0ZXJlZCBhZ2VudHMgKGFuZCwgb3B0LWluLCB0aGUgYW1iaWVudCB0b29scykgYW5kIHJlZ2lzdGVyXG4gICAgLy8gaXQgb24gdGhlIE1hc3RyYSBpbnN0YW5jZS4gYEBtYXN0cmEvZXhwcmVzc2Agc2VydmVzIHRoZSBzdG9jayBNQ1BcbiAgICAvLyB0cmFuc3BvcnQgcm91dGVzIChgL21jcC88c2VydmVySWQ+Ly4uLmApIG9mZiBgbWNwU2VydmVyc2AsIHNvIHRoZVxuICAgIC8vIGNhdGNoLWFsbCBkaXNwYXRjaCBiZWxvdyBhbHJlYWR5IHJvdXRlcyBNQ1AgcmVxdWVzdHMgdW5kZXIgT0JPIC1cbiAgICAvLyBubyBiZXNwb2tlIHJvdXRlIG5lZWRlZC4gU2VlIGAuL21jcC5qc2AuXG4gICAgdGhpcy5tY3AgPSBidWlsZE1jcFNlcnZlcih7XG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgcGx1Z2luTmFtZTogdGhpcy5uYW1lLFxuICAgICAgZGlzcGxheU5hbWU6IE1hc3RyYVBsdWdpbi5tYW5pZmVzdC5kaXNwbGF5TmFtZSxcbiAgICAgIGFnZW50czogdGhpcy5idWlsdC5hZ2VudHMsXG4gICAgICBhbWJpZW50VG9vbHM6IHRoaXMuYnVpbHQuYW1iaWVudFRvb2xzLFxuICAgIH0pO1xuICAgIHRoaXMubWFzdHJhID0gbmV3IE1hc3RyYSh7XG4gICAgICBhZ2VudHM6IHRoaXMuYnVpbHQuYWdlbnRzLFxuICAgICAgLi4uKE9iamVjdC5rZXlzKHRoaXMud29ya2Zsb3dzKS5sZW5ndGggPiAwID8geyB3b3JrZmxvd3M6IHRoaXMud29ya2Zsb3dzIH0gOiB7fSksXG4gICAgICAuLi4oaW5zdGFuY2VTdG9yYWdlID8geyBzdG9yYWdlOiBpbnN0YW5jZVN0b3JhZ2UgfSA6IHt9KSxcbiAgICAgIC4uLihvYnNlcnZhYmlsaXR5ID8geyBvYnNlcnZhYmlsaXR5IH0gOiB7fSksXG4gICAgICAuLi4odGhpcy5tY3AgPyB7IG1jcFNlcnZlcnM6IHsgW3RoaXMubWNwLnNlcnZlcklkXTogdGhpcy5tY3Auc2VydmVyIH0gfSA6IHt9KSxcbiAgICB9KTtcbiAgICB0aGlzLm1hc3RyYUFwcCA9IGV4cHJlc3MoKTtcbiAgICBhdHRhY2hSb3V0ZVBhdGNoTWlkZGxld2FyZSh0aGlzLm1hc3RyYUFwcCk7XG4gICAgLy8gU3RhbXAgY2hhdCByZXF1ZXN0L3Jlc3BvbnNlIG9udG8gdGhlIEhUVFAgcm9vdCBzcGFuIHNvIE1MZmxvdydzXG4gICAgLy8gVUMgYCpfdHJhY2VfdW5pZmllZGAgdmlldyBjYW4gc3VyZmFjZSB0aGVtIChNYXN0cmEncyBvd25cbiAgICAvLyBgbWFzdHJhLmFnZW50X3J1bi4qYCBhdHRyaWJ1dGVzIHNpdCBvbiBhIGNoaWxkIHNwYW4gdGhlIHZpZXdcbiAgICAvLyBuZXZlciByZWFkcykuIE11c3QgcnVuIGJlZm9yZSBgTWFzdHJhU2VydmVyLmluaXRgIHNvIHRoZSBsYXllclxuICAgIC8vIHNpdHMgYWhlYWQgb2YgdGhlIGFnZW50IHJvdXRlcy5cbiAgICBhdHRhY2hDaGF0VHVyblRlbGVtZXRyeSh0aGlzLm1hc3RyYUFwcCwge1xuICAgICAgaWRlbnRpdHk6IChyZXF1ZXN0KSA9PlxuICAgICAgICB1c2VTZXJ2aWNlUHJpbmNpcGFsKHRoaXMuaWRlbnRpdHlNb2RlLCByZXF1ZXN0KSA/IFwic2VydmljZS1wcmluY2lwYWxcIiA6IFwib2JvXCIsXG4gICAgfSk7XG4gICAgdGhpcy5tYXN0cmFTZXJ2ZXIgPSBuZXcgTWFzdHJhU2VydmVyKHRoaXMuY29uZmlnLCB7XG4gICAgICBhcHA6IHRoaXMubWFzdHJhQXBwLFxuICAgICAgbWFzdHJhOiB0aGlzLm1hc3RyYSxcbiAgICAgIHByZWZpeDogXCJcIixcbiAgICAgIGN1c3RvbUFwaVJvdXRlczogW1xuICAgICAgICAuLi5hZ2VudENoYXRSb3V0ZXModGhpcy5jb25maWcpLFxuICAgICAgICB3b3JrZmxvd1JvdXRlKHtcbiAgICAgICAgICBwYXRoOiBcIi9yb3V0ZS93b3JrZmxvd3MvOndvcmtmbG93SWQvc3RyZWFtXCIsXG4gICAgICAgICAgdmVyc2lvbjogXCJ2N1wiLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5tYXN0cmFTZXJ2ZXIuaW5pdCgpO1xuICAgIGF0dGFjaFN0YWxlUmVzdW1lUmVjb3ZlcnkodGhpcy5tYXN0cmFBcHApO1xuICAgIHRoaXMubG9nZ2VyLmluZm8oXCJyZWFkeVwiLCB7XG4gICAgICBhZ2VudHM6IE9iamVjdC5rZXlzKHRoaXMuYnVpbHQuYWdlbnRzKSxcbiAgICAgIHdvcmtmbG93czogT2JqZWN0LmtleXModGhpcy53b3JrZmxvd3MpLFxuICAgICAgZGVmYXVsdEFnZW50OiB0aGlzLmJ1aWx0LmRlZmF1bHRBZ2VudElkLFxuICAgICAgYmFja2dyb3VuZFR1cm5zOiB0aGlzLmNvbmZpZy5iYWNrZ3JvdW5kVHVybnMgIT09IGZhbHNlLFxuICAgICAgYXBpQWNjZXNzOiB0aGlzLmNvbmZpZy5hcGlBY2Nlc3MgPz8gXCJzY29wZWRcIixcbiAgICAgIG1jcDogdGhpcy5tY3AgPyBgJHt0aGlzLmJhc2VQYXRofSR7dGhpcy5tY3AuaHR0cFBhdGh9YCA6IFwib2ZmXCIsXG4gICAgICBsYWtlYmFzZTogbWVtb3J5UG9vbCAhPT0gdW5kZWZpbmVkLFxuICAgICAgZmVlZGJhY2s6IHRoaXMuZmVlZGJhY2tNb2RlKCksXG4gICAgICBvYnNlcnZhYmlsaXR5OiBvYnNlcnZhYmlsaXR5ICE9PSB1bmRlZmluZWQgPyBcIm1sZmxvd1wiIDogXCJvZmZcIixcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVyIGZvciBvbmUgZW1iZWQgYDx0eXBlPmAgYmVoaW5kIHRoZSBnZW5lcmljXG4gKiBgR0VUIC9lbWJlZC86dHlwZS86aWRgIHJvdXRlLiBSZXR1cm5zIHRoZSBKU09OIGJvZHkgdG8gc2VuZCBvblxuICogc3VjY2Vzcywgb3IgYHVuZGVmaW5lZGAgdG8gc2lnbmFsIGEgNDA0ICh1bmtub3duIC8gZXhwaXJlZCBpZCkuXG4gKiBgc2lnbmFsYCBhYm9ydHMgd2hlbiB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzIHNvIGxvbmctcG9sbGluZ1xuICogcmVzb2x2ZXJzIChlLmcuIGBjaGFydGApIHVuYmxvY2sgaW1tZWRpYXRlbHkuXG4gKi9cbnR5cGUgRW1iZWRSZXNvbHZlciA9IChcbiAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gIGlkOiBzdHJpbmcsXG4gIHNpZ25hbDogQWJvcnRTaWduYWwsXG4pID0+IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PHVua25vd24+PjtcblxuLyoqXG4gKiBQYXJzZSB0aGUgb3B0aW9uYWwgYD90aW1lb3V0TXM9PG4+YCBxdWVyeSBwYXJhbWV0ZXIgZnJvbSBhXG4gKiBgR0VUIC9lbWJlZC9jaGFydC86aWRgIHJlcXVlc3QuIEFjY2VwdHMgYSBwb3NpdGl2ZSBpbnRlZ2VyIHVwXG4gKiB0byB7QGxpbmsgTUFYX0VNQkVEX1BPTExfVElNRU9VVF9NU30gKGNsYW1wZWQpIGFuZCByZWplY3RzIGV2ZXJ5dGhpbmcgZWxzZVxuICogYXMgYHVuZGVmaW5lZGAgc28ge0BsaW5rIGZldGNoQ2hhcnR9IGZhbGxzIGJhY2sgdG8gaXRzIGRlZmF1bHQuXG4gKiBFeHByZXNzIHByb2R1Y2VzIGBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZGA7IHdlIG5vcm1hbGl6ZVxuICogdG8gdGhlIGZpcnN0IHNjYWxhciBiZWZvcmUgcGFyc2luZy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VUaW1lb3V0TXMocmF3OiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdiA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhd1swXSA6IHJhdztcbiAgaWYgKHR5cGVvZiB2ICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBuID0gdG9OdW1iZXIodik7XG4gIGlmIChuID09PSB1bmRlZmluZWQgfHwgbiA8PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gTWF0aC5taW4oTWF0aC5mbG9vcihuKSwgTUFYX0VNQkVEX1BPTExfVElNRU9VVF9NUyk7XG59XG5cbi8qKlxuICogUGFyc2UgdGhlIG9wdGlvbmFsIGA/bGltaXQ9PG4+YCBxdWVyeSBwYXJhbWV0ZXIgZnJvbSBhXG4gKiBgR0VUIC9lbWJlZC9kYXRhLzppZGAgcmVxdWVzdC4gQWNjZXB0cyBhIG5vbi1uZWdhdGl2ZVxuICogaW50ZWdlciBhbmQgbGV0cyB0aGUgcm91dGUgY2xhbXAgdG8gYFNUQVRFTUVOVF9ST1dfQ0FQYDtcbiAqIHJlamVjdHMgYW55dGhpbmcgZWxzZSBhcyBgdW5kZWZpbmVkYCBzbyB0aGUgcm91dGUgZmFsbHMgYmFja1xuICogdG8gdGhlIHNlcnZlci1zaWRlIGNhcC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGF0ZW1lbnRMaW1pdChyYXc6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCB2ID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3WzBdIDogcmF3O1xuICBpZiAodHlwZW9mIHYgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG4gPSB0b051bWJlcih2KTtcbiAgaWYgKG4gPT09IHVuZGVmaW5lZCB8fCBuIDwgMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE1hdGguZmxvb3Iobik7XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIE1hc3RyYSBwbHVnaW4gb24gYW4gQXBwS2l0IGFwcC4gTW91bnRzIHRoZSBhZ2VudHMsIHRoZVxuICogYC9yb3V0ZS8qYCBjaGF0IHN1cmZhY2UsIGFuZCAodW5sZXNzIGRpc2FibGVkKSB0aGUgTUNQIHRyYW5zcG9ydCB1bmRlclxuICogYC9hcGkvbWFzdHJhYC5cbiAqXG4gKiBAZXhhbXBsZSBNaW5pbWFsIGFwcFxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IG1hc3RyYSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqXG4gKiAvLyBObyBgYWdlbnRzYDogYSBzaW5nbGUgYnVpbHQtaW4gYGRlZmF1bHRgIGFuYWx5c3QgaXMgcmVnaXN0ZXJlZCwgc28gdGhlXG4gKiAvLyBjaGF0IGVuZHBvaW50IHdvcmtzIG91dCBvZiB0aGUgYm94LlxuICogY29uc3QgYXBwID0gYXdhaXQgY3JlYXRlQXBwKHsgcGx1Z2luczogW21hc3RyYSgpXSB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFR3byBhZ2VudHMsIGEgcGlubmVkIG1vZGVsLCBhbmQgR2VuaWVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAsIGxha2ViYXNlIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgY3JlYXRlQWdlbnQsIG1hc3RyYSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqXG4gKiBjb25zdCBhcHAgPSBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgbGFrZWJhc2UoKSxcbiAqICAgICBtYXN0cmEoe1xuICogICAgICAgZGVmYXVsdE1vZGVsOiBcImRhdGFicmlja3MtY2xhdWRlLXNvbm5ldC00LTZcIixcbiAqICAgICAgIGRlZmF1bHRBZ2VudDogXCJhbmFseXN0XCIsXG4gKiAgICAgICBnZW5pZVNwYWNlczogeyBzYWxlczogeyBzcGFjZUlkOiBcIjAxZWYuLi5cIiwgaGludDogXCJvcmRlcnMsIHJldHVybnNcIiB9IH0sXG4gKiAgICAgICBhZ2VudHM6IHtcbiAqICAgICAgICAgYW5hbHlzdDogY3JlYXRlQWdlbnQoe1xuICogICAgICAgICAgIGluc3RydWN0aW9uczogXCJZb3UgYW5zd2VyIHF1ZXN0aW9ucyBhYm91dCBzYWxlcy5cIixcbiAqICAgICAgICAgICBhc3luYyB0b29scyhwbHVnaW5zKSB7XG4gKiAgICAgICAgICAgICByZXR1cm4geyAuLi4oYXdhaXQgcGx1Z2lucy5nZW5pZT8udG9vbGtpdCgpKSB9O1xuICogICAgICAgICAgIH0sXG4gKiAgICAgICAgIH0pLFxuICogICAgICAgICBoZWxwZXI6IGNyZWF0ZUFnZW50KHsgaW5zdHJ1Y3Rpb25zOiBcIllvdSBleHBsYWluIHRoZSBhbmFseXN0J3MgYW5zd2Vycy5cIiB9KSxcbiAqICAgICAgIH0sXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgbWFzdHJhID0gdG9QbHVnaW4oTWFzdHJhUGx1Z2luKTtcbiJdfQ==
|