@dbx-tools/appkit-mastra 0.9.58 → 0.9.60
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 +5 -1
- package/index.ts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -2
- package/lib/src/config.d.ts +4 -3
- package/lib/src/config.js +2 -2
- package/lib/src/memory.js +3 -2
- package/lib/src/mlflow.d.ts +12 -0
- package/lib/src/mlflow.js +134 -1
- package/lib/src/plugin.d.ts +7 -0
- package/lib/src/plugin.js +28 -2
- package/lib/src/remote-skills.js +2 -2
- package/lib/src/validation.d.ts +0 -11
- package/lib/src/validation.js +9 -3
- package/package.json +14 -13
- package/src/config.ts +5 -4
- package/src/memory.ts +2 -1
- package/src/mlflow.ts +169 -0
- package/src/plugin.ts +34 -1
- package/src/remote-skills.ts +1 -1
- package/src/validation.ts +8 -2
package/lib/src/plugin.js
CHANGED
|
@@ -60,7 +60,7 @@ import { collectSpaceSuggestions, resolveGenieSpaces } from "./genie.js";
|
|
|
60
60
|
import { requestUserId, resolveIdentityMode, useServicePrincipal, } from "./identity.js";
|
|
61
61
|
import { buildMcpServer } from "./mcp.js";
|
|
62
62
|
import { createMemoryBuilder, createServicePrincipalPool, needsLakebase } from "./memory.js";
|
|
63
|
-
import { logFeedback, resolveFeedbackEnabled } from "./mlflow.js";
|
|
63
|
+
import { logFeedback, mlflowExperimentManagerUrl, resolveFeedbackEnabled, validateFeedbackConfig, } from "./mlflow.js";
|
|
64
64
|
import { resolveDefaultModelId } from "./model.js";
|
|
65
65
|
import { buildObservability, configureOtelPropagation } from "./observability.js";
|
|
66
66
|
import { provisionRemoteSkills } from "./remote-skills.js";
|
|
@@ -193,6 +193,7 @@ export class MastraPlugin extends Plugin {
|
|
|
193
193
|
// Resolve the identity mode up front so an invalid `genieIdentity` fails the
|
|
194
194
|
// app boot with a clear message rather than 500-ing the first chat request.
|
|
195
195
|
this.identityMode = resolveIdentityMode(this.config.genieIdentity);
|
|
196
|
+
validateFeedbackConfig(this.config.feedback);
|
|
196
197
|
// Wait until sibling plugins (e.g. `lakebase`) finish `setup()` so
|
|
197
198
|
// the lakebase pool is valid when storage/memory are enabled.
|
|
198
199
|
this.context?.onLifecycle("setup:complete", async () => {
|
|
@@ -394,6 +395,7 @@ export class MastraPlugin extends Plugin {
|
|
|
394
395
|
this.registerEmbedRoutes(router);
|
|
395
396
|
this.registerSuggestionRoutes(router);
|
|
396
397
|
this.registerFeedbackRoutes(router);
|
|
398
|
+
this.registerMlflowExperimentRoute(router);
|
|
397
399
|
this.registerAgentRoutes(router);
|
|
398
400
|
}
|
|
399
401
|
/** Register URL aliases for Mastra's MCP transports. */
|
|
@@ -687,6 +689,22 @@ export class MastraPlugin extends Plugin {
|
|
|
687
689
|
},
|
|
688
690
|
});
|
|
689
691
|
}
|
|
692
|
+
/** Register the best-effort per-viewer MLflow experiment debug link. */
|
|
693
|
+
registerMlflowExperimentRoute(router) {
|
|
694
|
+
this.route(router, {
|
|
695
|
+
name: "mlflowExperiment",
|
|
696
|
+
method: "get",
|
|
697
|
+
path: routes.MASTRA_ROUTES.mlflowExperiment,
|
|
698
|
+
handler: async (req, res) => {
|
|
699
|
+
if (!this.feedbackEnabled()) {
|
|
700
|
+
res.json({ url: null });
|
|
701
|
+
return;
|
|
702
|
+
}
|
|
703
|
+
const result = await this.scopedSelf(req).fetchMlflowExperimentUrl();
|
|
704
|
+
res.json({ url: result.ok ? (result.data ?? null) : null });
|
|
705
|
+
},
|
|
706
|
+
});
|
|
707
|
+
}
|
|
690
708
|
/** Register the gated Mastra catch-all after every explicit route. */
|
|
691
709
|
registerAgentRoutes(router) {
|
|
692
710
|
// Middleware rather than `this.route`: this is the catch-all that hands
|
|
@@ -816,6 +834,14 @@ export class MastraPlugin extends Plugin {
|
|
|
816
834
|
...(sourceId ? { sourceId } : {}),
|
|
817
835
|
}), feedbackWriteDefaults);
|
|
818
836
|
}
|
|
837
|
+
/**
|
|
838
|
+
* Resolve an experiment link under the active request identity. The helper
|
|
839
|
+
* returns no URL unless the viewer has effective `CAN_MANAGE` permission.
|
|
840
|
+
*/
|
|
841
|
+
async fetchMlflowExperimentUrl() {
|
|
842
|
+
const client = getExecutionContext().client;
|
|
843
|
+
return this.execute(() => mlflowExperimentManagerUrl(client), feedbackWriteDefaults);
|
|
844
|
+
}
|
|
819
845
|
/**
|
|
820
846
|
* Implementation backing the `data` embed resolver
|
|
821
847
|
* (`GET /embed/data/:id`). Runs inside the AppKit user-context proxy so
|
|
@@ -1110,4 +1136,4 @@ function parseStatementLimit(raw) {
|
|
|
1110
1136
|
* ```
|
|
1111
1137
|
*/
|
|
1112
1138
|
export const mastra = toPlugin(MastraPlugin);
|
|
1113
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q0c7QUFFSCxPQUFPLEVBQ0wsY0FBYyxFQUNkLEtBQUssRUFDTCxtQkFBbUIsRUFDbkIsUUFBUSxFQUNSLE1BQU0sRUFDTixRQUFRLEdBS1QsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUYsT0FBTyxFQUNMLFFBQVEsRUFDUixNQUFNLEdBS1AsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUErQixNQUFNLHlCQUF5QixDQUFDO0FBRS9FLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QyxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFHOUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBb0IsTUFBTSxhQUFhLENBQUM7QUFDL0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzVDLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsc0JBQXNCLEVBQ3RCLG9CQUFvQixHQUVyQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsc0JBQXNCLEVBQ3RCLHFCQUFxQixHQUN0QixNQUFNLGVBQWUsQ0FBQztBQUN2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Iiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcHBLaXQgcGx1Z2luIHRoYXQgYnVpbGRzIG9uZSBvciBtb3JlIE1hc3RyYSBgQWdlbnRgIGluc3RhbmNlcyBhbmRcbiAqIG1vdW50cyB0aGUgYEBtYXN0cmEvZXhwcmVzc2Agc2VydmVyLiBDbGllbnRzIGRyaXZlIHRoZSBjb252ZXJzYXRpb25cbiAqIG92ZXIgdGhlIHN0YW5kYXJkIE1hc3RyYSBhZ2VudCBzdHJlYW0gKGBAbWFzdHJhL2NsaWVudC1qc2Anc1xuICogYGdldEFnZW50KGlkKS5zdHJlYW0oKWApLCBzbyB0aGVyZSdzIG5vIGJlc3Bva2UgY2hhdCB0cmFuc3BvcnQgdG9cbiAqIGtlZXAgaW4gc3luYy5cbiAqXG4gKiAtIEFnZW50czogcmVnaXN0ZXJlZCB0aHJvdWdoIGBjb25maWcuYWdlbnRzYCBhdCBwbHVnaW4gY3JlYXRpb25cbiAqICAgKHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb259KS4gRWFjaCBlbnRyeSdzIGB0b29sc2AgZmllbGQgYWNjZXB0c1xuICogICBlaXRoZXIgYSBwbGFpbiByZWNvcmQgb3IgYSBgKHBsdWdpbnMpID0+IHRvb2xzYCBjYWxsYmFjayB0aGF0IGdldHNcbiAqICAgYSB0eXBlZCBzaWJsaW5nLXBsdWdpbiBpbmRleCAoe0BsaW5rIE1hc3RyYVBsdWdpbnN9KS4gT21pdFxuICogICBgY29uZmlnLmFnZW50c2AgdG8gZ2V0IGEgc2luZ2xlIGJ1aWx0LWluIGBkZWZhdWx0YCBhbmFseXN0LlxuICogLSBNb2RlbDogZWFjaCBhZ2VudCBjYWxsIHJlc29sdmVzIGEgYE1hc3RyYU1vZGVsQ29uZmlnYCB2aWFcbiAqICAge0BsaW5rIGJ1aWxkTW9kZWx9IGZyb20gYC4vbW9kZWwuanNgLiBQZXItYWdlbnQgYG1vZGVsYCBvdmVycmlkZXNcbiAqICAgKGBBZ2VudENvbmZpZ1tcIm1vZGVsXCJdYCBvciBhIGBtb2RlbElkYCBzdHJpbmcpIGZsb3cgdGhyb3VnaFxuICogICB7QGxpbmsgYnVpbGRBZ2VudHN9LlxuICogLSBNZW1vcnkgLyBzdG9yYWdlOiBwZXItYWdlbnQsIGJ1aWx0IGJ5IHtAbGluayBjcmVhdGVNZW1vcnlCdWlsZGVyfVxuICogICBmcm9tIGAuL21lbW9yeS5qc2AuIEJvdGggYXV0by1kZWZhdWx0IHRvIGB0cnVlYCB3aGVuIHRoZVxuICogICBgbGFrZWJhc2VgIHBsdWdpbiBpcyByZWdpc3RlcmVkICh1bmxlc3MgdGhlIGNhbGxlciBwYXNzZWRcbiAqICAgYGZhbHNlYCBvciBhIGN1c3RvbSBjb25maWcpLiBTdG9yYWdlIG5hbWVzcGFjZXMgcGVyIGFnZW50IHZpYVxuICogICB7QGxpbmsgYWdlbnRTdG9yYWdlU2NoZW1hTmFtZX0gcGVyIGFnZW50OyB0aGUgdmVjdG9yIHN0b3JlIGlzIGEgc2luZ2xlXG4gKiAgIHNoYXJlZCBzaW5nbGV0b24gYWNyb3NzIGV2ZXJ5IGFnZW50LlxuICogLSBTZXJ2ZXI6IHRoZSBFeHByZXNzIHN1YmFwcCB3aXJpbmcgbGl2ZXMgaW4gYC4vc2VydmVyLmpzYC5cbiAqIC0gSFRUUDogQXBwS2l0IG1vdW50cyB0aGlzIHBsdWdpbiB1bmRlciBgL2FwaS9tYXN0cmFgLiBBbG9uZ3NpZGUgdGhlXG4gKiAgIE1hc3RyYSBhZ2VudCByb3V0ZXMsIHRoZSBwbHVnaW4gcmVnaXN0ZXJzIGAvcm91dGUvaGlzdG9yeWBcbiAqICAgKGxvYWQgKyBjbGVhciBhIHRocmVhZCdzIG1lc3NhZ2VzKSwgYC9yb3V0ZS90aHJlYWRzYCAobGlzdCB0aGVcbiAqICAgY2FsbGVyJ3MgY29udmVyc2F0aW9ucyArIGRlbGV0ZSBvbmUpLCBgL21vZGVsc2AsIGAvZGVmYXVsdC1tb2RlbGAsXG4gKiAgIGAvc3VnZ2VzdGlvbnNgLCBgL3JvdXRlL2ZlZWRiYWNrYCAobG9nIGEgdGh1bWJzIC8gY29tbWVudCB0byBNTGZsb3dcbiAqICAgd2hlbiBmZWVkYmFjayBpcyBlbmFibGVkKSwgYW5kIHRoZSBnZW5lcmljIGAvZW1iZWQvOnR5cGUvOmlkYFxuICogICByZXNvbHZlciBmb3IgaW5saW5lIGNoYXJ0IC8gZGF0YSBtYXJrZXJzLiBFYWNoIGlzIHJlZ2lzdGVyZWQgdGhyb3VnaFxuICogICBBcHBLaXQncyBgcm91dGUoKWAgc28gaXQgbGFuZHMgaW4gdGhlIHBsdWdpbidzIGVuZHBvaW50IG1hcCwgYW5kXG4gKiAgIGV2ZXJ5IG91dGJvdW5kIGNhbGwgb25lIG1ha2VzIHJ1bnMgdGhyb3VnaCBgZXhlY3V0ZSgpYCAoc2VlXG4gKiAgIGAuL2RlZmF1bHRzLmpzYCkuIFRoZSBzdG9jayBgQG1hc3RyYS9leHByZXNzYCBzdXJmYWNlIGlzIGdhdGVkXG4gKiAgIGJ5IGBjb25maWcuYXBpQWNjZXNzYCAoZGVmYXVsdCBgXCJzY29wZWRcImApOiBvbmx5IGFnZW50IGluZmVyZW5jZSxcbiAqICAgcmVhZC1vbmx5IGFnZW50IG1ldGFkYXRhLCB0aGUgYC9yb3V0ZS8qYCByb3V0ZXMsIGFuZCAod2hlbiBlbmFibGVkKVxuICogICBNQ1AgYXJlIGRpc3BhdGNoZWQgdG8gTWFzdHJhOyBhZG1pbiAvIG11dGF0aW5nIC8gYnVsay1leHBvcnQgcm91dGVzXG4gKiAgIGFyZSByZWZ1c2VkIHdpdGggYDQwM2AuIFNlZSB7QGxpbmsgaXNNYXN0cmFSZXF1ZXN0QWxsb3dlZH0uXG4gKiAtIE1DUDogb3B0IGluIHdpdGggYGNvbmZpZy5tY3BgIHRvIGV4cG9zZSB0aGUgYWdlbnRzIChhbmQgb3B0aW9uYWxseVxuICogICB0b29scykgYXMgYSBNYXN0cmEgYE1DUFNlcnZlcmAuIEl0IGlzIHJlZ2lzdGVyZWQgb24gdGhlIGBNYXN0cmFgXG4gKiAgIGluc3RhbmNlIHZpYSBgbWNwU2VydmVyc2AsIHNvIGBAbWFzdHJhL2V4cHJlc3NgIHNlcnZlcyB0aGUgc3RvY2tcbiAqICAgTUNQIHRyYW5zcG9ydCByb3V0ZXMgKGAvbWNwLzxzZXJ2ZXJJZD4vLi4uYCkgdW5kZXIgdGhlIG1vdW50LiBTZWVcbiAqICAgYC4vbWNwLmpzYC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgRXhlY3V0aW9uRXJyb3IsXG4gIGdlbmllLFxuICBnZXRFeGVjdXRpb25Db250ZXh0LFxuICBsYWtlYmFzZSxcbiAgUGx1Z2luLFxuICB0b1BsdWdpbixcbiAgdHlwZSBFeGVjdXRpb25SZXN1bHQsXG4gIHR5cGUgSUFwcFJvdXRlcixcbiAgdHlwZSBQbHVnaW5NYW5pZmVzdCxcbiAgdHlwZSBSZXNvdXJjZVJlcXVpcmVtZW50LFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBwbHVnaW5SZWdpc3RyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgbW9kZWxDYXRhbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmltcG9ydCB7IGFzeW5jVXRpbHMsIGVycm9yVXRpbHMsIGxvZywgb2JqZWN0LCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBmZWVkYmFjayxcbiAgcm91dGVzLFxuICB0eXBlIENoYXJ0LFxuICB0eXBlIE1hc3RyYUNsaWVudENvbmZpZyxcbiAgdHlwZSBNYXN0cmFGZWVkYmFja1JlcXVlc3QsXG4gIHR5cGUgU3RhdGVtZW50RGF0YSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHsgZGlzcGxheSwgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IEFnZW50IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHsgTWFzdHJhIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9tYXN0cmFcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSBcImV4cHJlc3NcIjtcbmltcG9ydCB0eXBlIHsgUG9vbCB9IGZyb20gXCJwZ1wiO1xuXG5pbXBvcnQgeyBidWlsZEFnZW50cywgRkFMTEJBQ0tfQUdFTlRfSUQsIHR5cGUgQnVpbHRBZ2VudHMgfSBmcm9tIFwiLi9hZ2VudHMudHNcIjtcbmltcG9ydCB7IGZldGNoQ2hhcnQgfSBmcm9tIFwiLi9jaGFydC50c1wiO1xuaW1wb3J0IHsgYWdlbnRDaGF0Um91dGVzIH0gZnJvbSBcIi4vY2hhdC50c1wiO1xuaW1wb3J0IHtcbiAgYXR0cmlidXRlZFVzZXJJZCxcbiAgZXhlY3V0aW9uQ29udGV4dFVzZXJJZCxcbiAgTUFTVFJBX0NPTkZJR19TQ0hFTUEsXG4gIHR5cGUgTWFzdHJhUGx1Z2luQ29uZmlnLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7XG4gIGNoYXJ0RmV0Y2hEZWZhdWx0cyxcbiAgZmVlZGJhY2tXcml0ZURlZmF1bHRzLFxuICBnZW5pZVN1Z2dlc3Rpb25EZWZhdWx0cyxcbiAgbW9kZWxDYXRhbG9ndWVEZWZhdWx0cyxcbiAgc3RhdGVtZW50RGF0YURlZmF1bHRzLFxufSBmcm9tIFwiLi9kZWZhdWx0cy50c1wiO1xuaW1wb3J0IHsgY29sbGVjdFNwYWNlU3VnZ2VzdGlvbnMsIHJlc29sdmVHZW5pZVNwYWNlcyB9IGZyb20gXCIuL2dlbmllLnRzXCI7XG5pbXBvcnQge1xuICByZXF1ZXN0VXNlcklkLFxuICByZXNvbHZlSWRlbnRpdHlNb2RlLFxuICB1c2VTZXJ2aWNlUHJpbmNpcGFsLFxuICB0eXBlIE1hc3RyYUlkZW50aXR5TW9kZSxcbn0gZnJvbSBcIi4vaWRlbnRpdHkudHNcIjtcbmltcG9ydCB7IGJ1aWxkTWNwU2VydmVyLCB0eXBlIFJlc29sdmVkTWNwIH0gZnJvbSBcIi4vbWNwLnRzXCI7XG5pbXBvcnQgeyBjcmVhdGVNZW1vcnlCdWlsZGVyLCBjcmVhdGVTZXJ2aWNlUHJpbmNpcGFsUG9vbCwgbmVlZHNMYWtlYmFzZSB9IGZyb20gXCIuL21lbW9yeS50c1wiO1xuaW1wb3J0IHsgbG9nRmVlZGJhY2ssIHJlc29sdmVGZWVkYmFja0VuYWJsZWQgfSBmcm9tIFwiLi9tbGZsb3cudHNcIjtcbmltcG9ydCB7IHJlc29sdmVEZWZhdWx0TW9kZWxJZCB9IGZyb20gXCIuL21vZGVsLnRzXCI7XG5pbXBvcnQgeyBidWlsZE9ic2VydmFiaWxpdHksIGNvbmZpZ3VyZU90ZWxQcm9wYWdhdGlvbiB9IGZyb20gXCIuL29ic2VydmFiaWxpdHkudHNcIjtcbmltcG9ydCB7IHByb3Zpc2lvblJlbW90ZVNraWxscyB9IGZyb20gXCIuL3JlbW90ZS1za2lsbHMudHNcIjtcbmltcG9ydCB7XG4gIGF0dGFjaFJvdXRlUGF0Y2hNaWRkbGV3YXJlLFxuICBjcmVhdGVSZXF1ZXN0Q29udGV4dCxcbiAgaXNNYXN0cmFSZXF1ZXN0QWxsb3dlZCxcbiAgTWFzdHJhU2VydmVyLFxufSBmcm9tIFwiLi9zZXJ2ZXIudHNcIjtcbmltcG9ydCB7IHJlc29sdmVTZXJ2aW5nQ29uZmlnIH0gZnJvbSBcIi4vc2VydmluZy50c1wiO1xuaW1wb3J0IHsgZmV0Y2hTdGF0ZW1lbnREYXRhLCBTVEFURU1FTlRfUk9XX0NBUCB9IGZyb20gXCIuL3N0YXRlbWVudC50c1wiO1xuaW1wb3J0IHsgYXR0YWNoQ2hhdFR1cm5UZWxlbWV0cnkgfSBmcm9tIFwiLi90ZWxlbWV0cnkudHNcIjtcbmltcG9ydCB7IGludmFsaWRGaWVsZHMgfSBmcm9tIFwiLi92YWxpZGF0aW9uLnRzXCI7XG5cbmNvbnN0IEdFTklFX01BTklGRVNUID0gcGx1Z2luUmVnaXN0cnkuZGF0YShnZW5pZSkucGx1Z2luLm1hbmlmZXN0O1xuY29uc3QgTEFLRUJBU0VfTUFOSUZFU1QgPSBwbHVnaW5SZWdpc3RyeS5kYXRhKGxha2ViYXNlKS5wbHVnaW4ubWFuaWZlc3Q7XG5cbi8qKlxuICogQnVkZ2V0IGZvciBkcmFpbmluZyB0aGUgbWVtb3J5IHNlcnZpY2UtcHJpbmNpcGFsIHBvb2wgb24gc2h1dGRvd24uIFdlbGxcbiAqIGluc2lkZSBBcHBLaXQncyAxNXMgZ3JhY2VmdWwtc2h1dGRvd24gd2luZG93LCBzbyBhIHN0dWNrIGNvbm5lY3Rpb24gY2FuXG4gKiBuZXZlciBiZSB3aGF0IGhvbGRzIHRoZSBwcm9jZXNzIG9wZW4uXG4gKi9cbmNvbnN0IFBPT0xfRFJBSU5fVElNRU9VVF9NUyA9IDVfMDAwO1xuXG4vKiogQ2VpbGluZyBvbiB0aGUgYD90aW1lb3V0TXM9YCBsb25nLXBvbGwgYnVkZ2V0IGEgY2xpZW50IG1heSByZXF1ZXN0LiAqL1xuY29uc3QgTUFYX0VNQkVEX1BPTExfVElNRU9VVF9NUyA9IDUgKiA2MF8wMDA7XG5cbi8qKiBTdGFibGUgY2xpZW50IG1lc3NhZ2Ugd2hlbiB0aGUgd29ya3NwYWNlJ3MgbW9kZWwgY2F0YWxvZ3VlIGNhbid0IGJlIHJlYWQuICovXG5jb25zdCBNT0RFTF9DQVRBTE9HVUVfRkFJTEVEX01FU1NBR0UgPSBcIkNvdWxkIG5vdCByZWFkIHRoZSB3b3Jrc3BhY2UncyBtb2RlbCBjYXRhbG9ndWVcIjtcblxuLyoqIFN0YWJsZSBjbGllbnQgbWVzc2FnZSBmb3IgYSBmZWVkYmFjayBib2R5IHRoYXQgZmFpbHMgc2NoZW1hIHZhbGlkYXRpb24uICovXG5jb25zdCBJTlZBTElEX0ZFRURCQUNLX01FU1NBR0UgPSBcIkludmFsaWQgZmVlZGJhY2sgcmVxdWVzdFwiO1xuXG4vKiogQ2FjaGUgbmFtZXNwYWNlIGZvciBzdGF0ZW1lbnQgcmVzdWx0IHNldHMsIG1hdGNoaW5nIHRoZSBjaGFydCBjYWNoZSdzIGZvcm0uICovXG5jb25zdCBTVEFURU1FTlRfQ0FDSEVfTkFNRVNQQUNFID0gXCJtYXN0cmE6c3RhdGVtZW50XCI7XG5cbi8qKlxuICogQXBwS2l0IHBsdWdpbiAocmVnaXN0ZXJlZCBuYW1lOiBgbWFzdHJhYCkgdGhhdCBob3N0cyBNYXN0cmEgYWdlbnRzXG4gKiB3aXRoIG9wdGlvbmFsIExha2ViYXNlLWJhY2tlZCBtZW1vcnkgYW5kIEFJIFNESyBjaGF0IHJvdXRlcyB1bmRlclxuICogdGhlIHBsdWdpbiBtb3VudCAodHlwaWNhbGx5IGAvYXBpL21hc3RyYWApLlxuICpcbiAqIEBleGFtcGxlIFJlZ2lzdGVyIHRoZSBwbHVnaW5cbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAsIGxha2ViYXNlIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgY3JlYXRlQWdlbnQsIG1hc3RyYSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqXG4gKiAvLyBgbGFrZWJhc2VgIGZpcnN0OiByZWdpc3RlcmluZyBpdCBhdXRvLWVuYWJsZXMgTWFzdHJhIHN0b3JhZ2UgKyBtZW1vcnkuXG4gKiBjb25zdCBhcHAgPSBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgbGFrZWJhc2UoKSxcbiAqICAgICBtYXN0cmEoe1xuICogICAgICAgZ2VuaWVTcGFjZXM6IHsgZGVmYXVsdDogcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRCEgfSxcbiAqICAgICAgIGFnZW50czogY3JlYXRlQWdlbnQoe1xuICogICAgICAgICBuYW1lOiBcImFuYWx5c3RcIixcbiAqICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBcIllvdSBhbnN3ZXIgcXVlc3Rpb25zIGFib3V0IHJldmVudWUgYW5kIHJldHVybnMuXCIsXG4gKiAgICAgICAgIGFzeW5jIHRvb2xzKHBsdWdpbnMpIHtcbiAqICAgICAgICAgICByZXR1cm4geyAuLi4oYXdhaXQgcGx1Z2lucy5nZW5pZT8udG9vbGtpdCgpKSB9O1xuICogICAgICAgICB9LFxuICogICAgICAgfSksXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFJlYWQgdGhlIGFnZW50cyBiYWNrIG9mZiB0aGUgQXBwS2l0IGluc3RhbmNlXG4gKiBgYGB0c1xuICogY29uc3QgYWdlbnRJZHMgPSBhcHAubWFzdHJhLmxpc3QoKTtcbiAqIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IGFwcC5tYXN0cmEubGlzdE1vZGVscygpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBNYXN0cmFQbHVnaW4gZXh0ZW5kcyBQbHVnaW48TWFzdHJhUGx1Z2luQ29uZmlnPiB7XG4gIC8vIEFubm90YXRlZCByYXRoZXIgdGhhbiBsZWZ0IHRvIGBzYXRpc2ZpZXNgOiB0aGUgY29uZmlnIHNjaGVtYSdzIHR5cGUgY29tZXNcbiAgLy8gZnJvbSBgQHR5cGVzL2pzb24tc2NoZW1hYCwgd2hpY2ggdGhpcyBwYWNrYWdlIGRvZXMgbm90IGRlcGVuZCBvbiwgc28gYW5cbiAgLy8gaW5mZXJyZWQgbWFuaWZlc3QgdHlwZSBjYW5ub3QgYmUgbmFtZWQgaW4gdGhlIGVtaXR0ZWQgZGVjbGFyYXRpb24uIFRoZVxuICAvLyBgUGx1Z2luTWFuaWZlc3Q8XCJtYXN0cmFcIj5gIHBhcmFtZXRlciBzdGlsbCBjYXJyaWVzIHRoZSBsaXRlcmFsIG5hbWUgaW50b1xuICAvLyBgdG9QbHVnaW4oKWAncyBmYWN0b3J5IHR5cGUuXG4gIHN0YXRpYyBtYW5pZmVzdDogUGx1Z2luTWFuaWZlc3Q8XCJtYXN0cmFcIj4gPSB7XG4gICAgbmFtZTogXCJtYXN0cmFcIixcbiAgICBkaXNwbGF5TmFtZTogXCJNYXN0cmFcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiQnVpbGRzIGEgTWFzdHJhIEFnZW50IHdpdGggdXNlci1zY29wZWQgd29ya3NwYWNlIGF1dGggKGFzVXNlcikgXCIgK1xuICAgICAgXCJhbmQgb3B0aW9uYWwgUG9zdGdyZXMtYmFja2VkIE1hc3RyYSBNZW1vcnkgdmlhIHRoZSBgbGFrZWJhc2VgIHBsdWdpbi5cIixcbiAgICBzdGFiaWxpdHk6IFwiYmV0YVwiLFxuICAgIHJlc291cmNlczoge1xuICAgICAgcmVxdWlyZWQ6IFtdLFxuICAgICAgb3B0aW9uYWw6IFtcbiAgICAgICAgLy8gUmV1c2UgdGhlIEdlbmllIHNwYWNlLWlkIGJpbmRpbmcgZGVjbGFyZWQgYnkgQXBwS2l0J3MgYGdlbmllYFxuICAgICAgICAvLyBtYW5pZmVzdCBzbyB0aGUgcmVzb3VyY2UtYmluZGluZyBzaGFwZSBpcyBpZGVudGljYWwgdG8gQXBwS2l0J3MgYW5kXG4gICAgICAgIC8vIGFuIGV4aXN0aW5nIGBhcHAueWFtbGAgLyBgZ2VuaWUoeyBzcGFjZXMgfSlgIHdpcmluZyBrZWVwcyB3b3JraW5nLlxuICAgICAgICAvLyBUaGUgYnVpbHQtaW4gR2VuaWUgdG9vbHMgdGFsayB0byBHZW5pZSBkaXJlY3RseSB0aHJvdWdoXG4gICAgICAgIC8vIGBAZGJ4LXRvb2xzL2dlbmllYCwgc28gb25seSB0aGUgYmluZGluZyBpcyBzaGFyZWQsIG5vdCB0aGUgcGx1Z2luJ3NcbiAgICAgICAgLy8gdG9vbHMuXG4gICAgICAgIC4uLkdFTklFX01BTklGRVNULnJlc291cmNlcy5yZXF1aXJlZCxcbiAgICAgICAgLi4uTEFLRUJBU0VfTUFOSUZFU1QucmVzb3VyY2VzLnJlcXVpcmVkLFxuICAgICAgXSxcbiAgICB9LFxuICAgIGNvbmZpZzogeyBzY2hlbWE6IE1BU1RSQV9DT05GSUdfU0NIRU1BIH0sXG4gIH07XG5cbiAgLyoqXG4gICAqIFRpZ2h0ZW4gcmVzb3VyY2UgcmVxdWlyZW1lbnRzIGJhc2VkIG9uIHdoaWNoIGZlYXR1cmVzIGFyZSBlbmFibGVkLlxuICAgKiBBcHBLaXQgY2FsbHMgdGhpcyBhdCByZWdpc3RyYXRpb24gdGltZSAoY29uZmlnLWF3YXJlKSBzbyBkaXNhYmxlZFxuICAgKiBmZWF0dXJlcyBkb24ndCBzdXJmYWNlIHRoZWlyIHJlc291cmNlIGFza3MgdG8gdGhlIGhvc3QgYXBwLlxuICAgKi9cbiAgc3RhdGljIGdldFJlc291cmNlUmVxdWlyZW1lbnRzKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogUmVzb3VyY2VSZXF1aXJlbWVudFtdIHtcbiAgICBjb25zdCByZXNvdXJjZXM6IFJlc291cmNlUmVxdWlyZW1lbnRbXSA9IFtdO1xuICAgIGNvbnN0IGVuYWJsZWRNYW5pZmVzdHM6IFBsdWdpbk1hbmlmZXN0PHN0cmluZz5bXSA9IFtdO1xuXG4gICAgaWYgKG5lZWRzTGFrZWJhc2UoY29uZmlnKSkge1xuICAgICAgZW5hYmxlZE1hbmlmZXN0cy5wdXNoKExBS0VCQVNFX01BTklGRVNUKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtIG9mIGVuYWJsZWRNYW5pZmVzdHMpIHtcbiAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgbS5yZXNvdXJjZXMucmVxdWlyZWQpIHtcbiAgICAgICAgcmVzb3VyY2VzLnB1c2goeyAuLi5yZXNvdXJjZSwgcmVxdWlyZWQ6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXNvdXJjZXM7XG4gIH1cblxuICBwcml2YXRlIGxvZ2dlciA9IGxvZy5sb2dnZXIodGhpcyk7XG4gIHByaXZhdGUgYnVpbHQ6IEJ1aWx0QWdlbnRzIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWFzdHJhOiBNYXN0cmEgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtYXN0cmFBcHA6IGV4cHJlc3MuRXhwcmVzcyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1hc3RyYVNlcnZlcjogTWFzdHJhU2VydmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgb3B0aW9uYWwgTUNQIHNlcnZlciBleHBvc2luZyB0aGlzIHBsdWdpbidzIGFnZW50cyAvIHRvb2xzLCBvclxuICAgKiBgbnVsbGAgd2hlbiBgY29uZmlnLm1jcGAgaXMgZGlzYWJsZWQgKHRoZSBkZWZhdWx0KS4gQnVpbHQgaW5cbiAgICoge0BsaW5rIGJ1aWxkQWdlbnRBbmRTZXJ2ZXJ9IGFuZCByZWdpc3RlcmVkIG9uIHRoZSBNYXN0cmEgaW5zdGFuY2UuXG4gICAqL1xuICBwcml2YXRlIG1jcDogUmVzb2x2ZWRNY3AgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFJlc29sdmVkIHtAbGluayBNYXN0cmFJZGVudGl0eU1vZGV9OiB0aGUgaWRlbnRpdHkgdGhlIGNoYXQgcGF0aCdzIERhdGFicmlja3NcbiAgICogY2FsbHMgcnVuIGFzLiBSZWFkIG9uY2UgYXQgc2V0dXAgc28gYW4gaW52YWxpZCBgZ2VuaWVJZGVudGl0eWAgZmFpbHMgdGhlIGFwcFxuICAgKiBib290IHJhdGhlciB0aGFuIHRoZSBmaXJzdCByZXF1ZXN0LCBhbmQgc28gZXZlcnkgcmVxdWVzdCBhZ3JlZXMuXG4gICAqL1xuICBwcml2YXRlIGlkZW50aXR5TW9kZTogTWFzdHJhSWRlbnRpdHlNb2RlID0gXCJ1c2VyXCI7XG4gIC8qKlxuICAgKiBEZWRpY2F0ZWQgc2VydmljZS1wcmluY2lwYWwgTGFrZWJhc2UgcG9vbCBiYWNraW5nIE1hc3RyYSBtZW1vcnkgL1xuICAgKiBzdG9yYWdlLiBCdWlsdCBvbmNlIGluIHtAbGluayBidWlsZEFnZW50QW5kU2VydmVyfSAob3V0c2lkZSBhbnlcbiAgICogYGFzVXNlcmAgc2NvcGUsIHNvIGl0IG5ldmVyIGluaGVyaXRzIGEgcmVxdWVzdCdzIE9CTyBpZGVudGl0eSkgYW5kXG4gICAqIGRyYWluZWQgaW4ge0BsaW5rIHNodXRkb3dufS4gYG51bGxgIHVudGlsIHNldHVwIHJ1bnMgb3Igd2hlblxuICAgKiBMYWtlYmFzZSBpc24ndCBuZWVkZWQuXG4gICAqL1xuICBwcml2YXRlIHNlcnZpY2VQcmluY2lwYWxQb29sOiBQb29sIHwgbnVsbCA9IG51bGw7XG5cbiAgb3ZlcnJpZGUgYXN5bmMgc2V0dXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gUmVzb2x2ZSB0aGUgaWRlbnRpdHkgbW9kZSB1cCBmcm9udCBzbyBhbiBpbnZhbGlkIGBnZW5pZUlkZW50aXR5YCBmYWlscyB0aGVcbiAgICAvLyBhcHAgYm9vdCB3aXRoIGEgY2xlYXIgbWVzc2FnZSByYXRoZXIgdGhhbiA1MDAtaW5nIHRoZSBmaXJzdCBjaGF0IHJlcXVlc3QuXG4gICAgdGhpcy5pZGVudGl0eU1vZGUgPSByZXNvbHZlSWRlbnRpdHlNb2RlKHRoaXMuY29uZmlnLmdlbmllSWRlbnRpdHkpO1xuICAgIC8vIFdhaXQgdW50aWwgc2libGluZyBwbHVnaW5zIChlLmcuIGBsYWtlYmFzZWApIGZpbmlzaCBgc2V0dXAoKWAgc29cbiAgICAvLyB0aGUgbGFrZWJhc2UgcG9vbCBpcyB2YWxpZCB3aGVuIHN0b3JhZ2UvbWVtb3J5IGFyZSBlbmFibGVkLlxuICAgIHRoaXMuY29udGV4dD8ub25MaWZlY3ljbGUoXCJzZXR1cDpjb21wbGV0ZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25maWd1cmVPdGVsUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuYXBwbHlMYWtlYmFzZUF1dG9EZWZhdWx0cygpO1xuICAgICAgYXdhaXQgdGhpcy5idWlsZEFnZW50QW5kU2VydmVyKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGUgY2hhdCBwYXRoJ3MgRGF0YWJyaWNrcyBjYWxscyBzaG91bGQgcnVuIHRocm91Z2ggZm9yXG4gICAqIGByZXFgLCBob25vcmluZyB7QGxpbmsgaWRlbnRpdHlNb2RlfS5cbiAgICpcbiAgICogSW4gYFwidXNlclwiYCBtb2RlICh0aGUgZGVmYXVsdCkgdGhpcyBpcyBgdGhpcy5hc1VzZXIocmVxKWAgLSBBcHBLaXQncyBvd25cbiAgICogcHJveHkgdGhhdCBydW5zIGV2ZXJ5IGNhbGwgaW5zaWRlIGBydW5JblVzZXJDb250ZXh0YCwgc28gYGdldEV4ZWN1dGlvbkNvbnRleHQoKWBcbiAgICogcmV0dXJucyB0aGUgY2FsbGVyJ3MgT0JPIGNsaWVudC4gSW4gYFwic2VydmljZS1wcmluY2lwYWxcImAgbW9kZSBpdCBpcyBgdGhpc2BcbiAgICogdW53cmFwcGVkLCBzbyB0aGUgc2FtZSBtZXRob2RzIHJ1biBpbiB0aGUgYW1iaWVudCBzZXJ2aWNlIGNvbnRleHQgYW5kXG4gICAqIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlIGFwcCBzZXJ2aWNlIHByaW5jaXBhbCdzIGNsaWVudCAtIHRoZSBzYW1lXG4gICAqIFwianVzdCBkb24ndCBlbnRlciBgYXNVc2VyYFwiIHBhdHRlcm4gQXBwS2l0J3Mgb3duIHNlcnZpY2UtY29udGV4dCBjYWxscyB1c2UuIE9uZVxuICAgKiBoZWxwZXIgY292ZXJzIGV2ZXJ5IHdvcmtzcGFjZSBjYWxsIHRoZSBjaGF0IHBhdGggbWFrZXMgKHNlcnZpbmcgY2F0YWxvZ3VlLFxuICAgKiBHZW5pZSBzdWdnZXN0aW9ucywgYGFza19nZW5pZWAgdmlhIHRoZSBkaXNwYXRjaGVkIGFnZW50IHR1cm4sIHN0YXRlbWVudCBmZXRjaCxcbiAgICogZmVlZGJhY2spLCBzbyB0aGUgaWRlbnRpdHkgZGVjaXNpb24gbGl2ZXMgaW4gb25lIHBsYWNlLlxuICAgKi9cbiAgcHJpdmF0ZSBzY29wZWRTZWxmKHJlcTogZXhwcmVzcy5SZXF1ZXN0KTogdGhpcyB7XG4gICAgcmV0dXJuIHVzZVNlcnZpY2VQcmluY2lwYWwodGhpcy5pZGVudGl0eU1vZGUsIHJlcSkgPyB0aGlzIDogdGhpcy5hc1VzZXIocmVxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBgbGFrZWJhc2VgIHBsdWdpbiBpcyByZWdpc3RlcmVkLCBhdXRvLWVuYWJsZSBgc3RvcmFnZWBcbiAgICogYW5kIGBtZW1vcnlgIHVubGVzcyB0aGUgY2FsbGVyIG9wdGVkIG91dCBleHBsaWNpdGx5IChgZmFsc2VgIG9yIGFcbiAgICogY3VzdG9tIGNvbmZpZyBvYmplY3QpLiBSdW4gYWZ0ZXIgYHNldHVwOmNvbXBsZXRlYCBzbyB0aGUgbG9va3VwXG4gICAqIGlzIHJlbGlhYmxlOiBhbnkgcGx1Z2luIHRoYXQgcmVnaXN0ZXJzIGl0c2VsZiBzeW5jaHJvbm91c2x5IGlzXG4gICAqIGFscmVhZHkgaW4gdGhlIHJlZ2lzdHJ5IGJ5IHRoZSB0aW1lIHRoaXMgZmlyZXMuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5TGFrZWJhc2VBdXRvRGVmYXVsdHMoKTogdm9pZCB7XG4gICAgY29uc3QgaGFzTGFrZWJhc2UgPSBwbHVnaW5SZWdpc3RyeS5pbnN0YW5jZSh0aGlzLmNvbnRleHQsIGxha2ViYXNlKSAhPT0gdW5kZWZpbmVkO1xuICAgIGlmICghaGFzTGFrZWJhc2UpIHJldHVybjtcbiAgICBpZiAodGhpcy5jb25maWcuc3RvcmFnZSA9PT0gdW5kZWZpbmVkKSB0aGlzLmNvbmZpZy5zdG9yYWdlID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5jb25maWcubWVtb3J5ID09PSB1bmRlZmluZWQpIHRoaXMuY29uZmlnLm1lbW9yeSA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRHJhaW4gdGhlIG1lbW9yeSBzZXJ2aWNlLXByaW5jaXBhbCBwb29sLiBJZGVtcG90ZW50OiB0aGUgaGFuZGxlIGlzXG4gICAqIGNsZWFyZWQgYmVmb3JlIHRoZSBkcmFpbiBzdGFydHMsIHNvIGEgc2Vjb25kIGNhbGwgaXMgYSBuby1vcCBhbmQgYVxuICAgKiBsYXRlciBgc2V0dXAoKWAgcmVidWlsZHMgdGhlIHBvb2wuIEJvdW5kZWQgYnlcbiAgICoge0BsaW5rIFBPT0xfRFJBSU5fVElNRU9VVF9NU30gdG8gc3RheSB3ZWxsIGluc2lkZSB0aGUgMTVzIGdyYWNlZnVsXG4gICAqIHNodXRkb3duIGJ1ZGdldC5cbiAgICovXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBvb2wgPSB0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sO1xuICAgIGlmICghcG9vbCkgcmV0dXJuO1xuICAgIHRoaXMuc2VydmljZVByaW5jaXBhbFBvb2wgPSBudWxsO1xuICAgIHRoaXMubG9nZ2VyLmluZm8oXCJjbG9zaW5nIG1lbW9yeSBTUCBwb29sXCIpO1xuICAgIC8vIFRoZSBidWRnZXQgdGltZXIgaXMgY2FuY2VsbGVkIG9uIHRoZSB3YXkgb3V0IHNvIGEgZHJhaW4gdGhhdCBmaW5pc2hlZFxuICAgIC8vIGVhcmx5IGNhbm5vdCBob2xkIHRoZSBldmVudCBsb29wIG9wZW4gZm9yIHRoZSByZXN0IG9mIHRoZSB3aW5kb3cuXG4gICAgY29uc3QgYnVkZ2V0ID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLnJhY2UoW3Bvb2wuZW5kKCksIGFzeW5jVXRpbHMuc2xlZXAoUE9PTF9EUkFJTl9USU1FT1VUX01TLCBidWRnZXQuc2lnbmFsKV0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXCJlcnJvciBjbG9zaW5nIG1lbW9yeSBTUCBwb29sXCIsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYnVkZ2V0LmFib3J0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFib3J0IGluLWZsaWdodCB3b3JrLiBBcHBLaXQncyBncmFjZWZ1bCBzaHV0ZG93biBjYWxscyB0aGlzIGhvb2tcbiAgICogc3luY2hyb25vdXNseSBhbmQgbmV2ZXIgYXdhaXRzIHtAbGluayBzaHV0ZG93bn0sIHNvIHRoZSBwb29sIGRyYWluIGlzXG4gICAqIHN0YXJ0ZWQgaGVyZSB0b287IGl0IGNhbm5vdCBiZSBhd2FpdGVkIGZyb20gYSBgdm9pZGAgaG9vaywgYW5kXG4gICAqIHtAbGluayBzaHV0ZG93bn0gaXMgaWRlbXBvdGVudCBzbyB0aGUgZHVwbGljYXRlIGNhbGwgaXMgZnJlZS5cbiAgICovXG4gIG92ZXJyaWRlIGFib3J0QWN0aXZlT3BlcmF0aW9ucygpOiB2b2lkIHtcbiAgICBzdXBlci5hYm9ydEFjdGl2ZU9wZXJhdGlvbnMoKTtcbiAgICB2b2lkIHRoaXMuc2h1dGRvd24oKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogSWRzIG9mIGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnQgaW4gcmVnaXN0cmF0aW9uIG9yZGVyLiBNYXRjaGVzXG4gICAgICAgKiBBcHBLaXQgYGFnZW50cy5saXN0KClgIHNvIGNhbGxlcnMgY2FuIGl0ZXJhdGUgdGhlIHJlZ2lzdHJ5IHRoZVxuICAgICAgICogc2FtZSB3YXkgdW5kZXIgYm90aCBwbHVnaW5zLlxuICAgICAgICovXG4gICAgICBsaXN0OiAoKTogc3RyaW5nW10gPT4gT2JqZWN0LmtleXModGhpcy5idWlsdD8uYWdlbnRzID8/IHt9KSxcbiAgICAgIC8qKlxuICAgICAgICogTG9vayB1cCBhIHJlZ2lzdGVyZWQgYWdlbnQgYnkgaWQuIFJldHVybnMgYG51bGxgIChub3RcbiAgICAgICAqIHVuZGVmaW5lZCkgd2hlbiB1bmtub3duIHNvIGNhbGwgc2l0ZXMgY2FuIGVhcmx5LXJldHVybiB3aXRob3V0XG4gICAgICAgKiBhIHNlcGFyYXRlIGBpbmAgY2hlY2suXG4gICAgICAgKi9cbiAgICAgIGdldDogKGlkOiBzdHJpbmcpOiBBZ2VudCB8IG51bGwgPT4gdGhpcy5idWlsdD8uYWdlbnRzW2lkXSA/PyBudWxsLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgYWdlbnQgdGhlIGNsaWVudCBjb252ZXJzZXMgd2l0aCB3aGVuIGl0IGRvZXNuJ3QgbmFtZSBvbmUuXG4gICAgICAgKiBSZXNvbHZlcyB0byBgY29uZmlnLmRlZmF1bHRBZ2VudGAsIHRoZSBmaXJzdCByZWdpc3RlcmVkIGlkLCBvclxuICAgICAgICogdGhlIGJ1aWx0LWluIGBkZWZhdWx0YCBmYWxsYmFjay5cbiAgICAgICAqL1xuICAgICAgZ2V0RGVmYXVsdDogKCk6IEFnZW50IHwgbnVsbCA9PlxuICAgICAgICAodGhpcy5idWlsdCAmJiB0aGlzLmJ1aWx0LmFnZW50c1t0aGlzLmJ1aWx0LmRlZmF1bHRBZ2VudElkXSkgPz8gbnVsbCxcbiAgICAgIC8qKiBVbmRlcmx5aW5nIE1hc3RyYSBpbnN0YW5jZSBmb3IgYWR2YW5jZWQgdXNlIChjdXN0b20gcm91dGVzIGV0Yy4pLiAqL1xuICAgICAgZ2V0TWFzdHJhOiAoKSA9PiB0aGlzLm1hc3RyYSxcbiAgICAgIC8qKlxuICAgICAgICogQnVpbGQgdGhlIGBSZXF1ZXN0Q29udGV4dGAgYW4gYWdlbnQgdHVybiBkcml2ZW4gZnJvbSBPVVRTSURFIHRoaXNcbiAgICAgICAqIHBsdWdpbidzIHJvdXRlcyBuZWVkcyAoYSBUZWFtcyBhY3Rpdml0eSBvbiBhbm90aGVyIHBsdWdpbidzIGVuZHBvaW50LCBhXG4gICAgICAgKiBzY2hlZHVsZWQgam9iKS5cbiAgICAgICAqXG4gICAgICAgKiBNYXN0cmEncyB1c2VyLXNjb3BlZCB0b29scyAtIGBhc2tfZ2VuaWVgIG1vc3QgdmlzaWJseSAtIHJlYWQgdGhlIEFwcEtpdFxuICAgICAgICogdXNlciBvZmYgdGhlIHJlcXVlc3QgY29udGV4dCwgd2hpY2ggb25seSB0aGUgSFRUUCBtaWRkbGV3YXJlIHN0YW1wcy5cbiAgICAgICAqIENhbGxpbmcgYGFnZW50LmdlbmVyYXRlYCB3aXRoIGEgcmF3IHByb21wdCB0aGVyZWZvcmUgYW5zd2VycyBcInRoZSBkYXRhXG4gICAgICAgKiBzb3VyY2UgaXMgdW5yZWFjaGFibGVcIiB3aGVyZSB0aGUgY2hhdCByb3V0ZXMgYW5zd2VyIHdpdGggcmVhbCBkYXRhLlxuICAgICAgICogUGFzc2luZyB0aGlzIGFzIGByZXF1ZXN0Q29udGV4dGAgY2xvc2VzIHRoYXQgZ2FwLCBzbyBhbiBvdXQtb2YtYmFuZCB0dXJuXG4gICAgICAgKiBoYXMgZXhhY3RseSB0aGUgY2FwYWJpbGl0aWVzIGEgY2hhdCB0dXJuIGhhcy5cbiAgICAgICAqXG4gICAgICAgKiBNdXN0IGJlIGNhbGxlZCBJTlNJREUgYW4gYGFzVXNlcihyZXEpYCBzY29wZSB0byBpbmhlcml0IHRoZSBjYWxsZXInc1xuICAgICAgICogT0JPIGlkZW50aXR5OyBvdXRzaWRlIG9uZSBpdCByZXNvbHZlcyB0byB0aGUgc2VydmljZSBwcmluY2lwYWwuXG4gICAgICAgKi9cbiAgICAgIGNyZWF0ZVJlcXVlc3RDb250ZXh0OiAoXG4gICAgICAgIG9wdGlvbnM6IHsgdGhyZWFkSWQ/OiBzdHJpbmc7IHJlc291cmNlSWQ/OiBzdHJpbmc7IHJlcXVlc3RJZD86IHN0cmluZyB9ID0ge30sXG4gICAgICApOiBQcm9taXNlPFJlcXVlc3RDb250ZXh0PiA9PiBjcmVhdGVSZXF1ZXN0Q29udGV4dChvcHRpb25zKSxcbiAgICAgIC8qKlxuICAgICAgICogTUNQIGVuZHBvaW50IGluZm8gd2hlbiBgY29uZmlnLm1jcGAgaXMgZW5hYmxlZCwgZWxzZSBgbnVsbGAuXG4gICAgICAgKiBTdHJlYW1hYmxlIEhUVFAgaXMgYGh0dHBgOyB0aGUgU1NFIHBhaXIgaXMgdGhlIGxlZ2FjeSB0cmFuc3BvcnQuXG4gICAgICAgKlxuICAgICAgICogRWFjaCBwYXRoIGlzIGdpdmVuIHR3aWNlOiBtb3VudC1yZWxhdGl2ZSAoYGh0dHBQYXRoYCwgYHNzZVBhdGhgLFxuICAgICAgICogYG1lc3NhZ2VQYXRoYCkgZm9yIGFueXRoaW5nIHRoYXQgYWxyZWFkeSBrbm93cyB3aGVyZSB0aGUgcGx1Z2luIGlzXG4gICAgICAgKiBtb3VudGVkLCBhbmQgYWJzb2x1dGUgKGBodHRwYCwgYHNzZWAsIGBtZXNzYWdlc2ApIGZvciBNQ1AgY2xpZW50cyxcbiAgICAgICAqIHdoaWNoIHRha2UgYSBzaW5nbGUgVVJMIGFuZCBjYW5ub3QgY29tcG9zZSBvbmUuIFRoZSBhYnNvbHV0ZSBmb3JtIGlzXG4gICAgICAgKiBidWlsdCBmcm9tIHtAbGluayBiYXNlUGF0aH0sIHNvIGl0IGhvbm9ycyBhIGBjb25maWcubmFtZWAgb3ZlcnJpZGUgYnV0XG4gICAgICAgKiBzdGlsbCBhc3N1bWVzIEFwcEtpdCdzIGRlZmF1bHQgYC9hcGkvPG5hbWU+YCBtb3VudC5cbiAgICAgICAqL1xuICAgICAgZ2V0TWNwOiAoKToge1xuICAgICAgICBzZXJ2ZXJJZDogc3RyaW5nO1xuICAgICAgICBodHRwUGF0aDogc3RyaW5nO1xuICAgICAgICBzc2VQYXRoOiBzdHJpbmc7XG4gICAgICAgIG1lc3NhZ2VQYXRoOiBzdHJpbmc7XG4gICAgICAgIGh0dHA6IHN0cmluZztcbiAgICAgICAgc3NlOiBzdHJpbmc7XG4gICAgICAgIG1lc3NhZ2VzOiBzdHJpbmc7XG4gICAgICB9IHwgbnVsbCA9PlxuICAgICAgICB0aGlzLm1jcFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBzZXJ2ZXJJZDogdGhpcy5tY3Auc2VydmVySWQsXG4gICAgICAgICAgICAgIGh0dHBQYXRoOiB0aGlzLm1jcC5odHRwUGF0aCxcbiAgICAgICAgICAgICAgc3NlUGF0aDogdGhpcy5tY3Auc3NlUGF0aCxcbiAgICAgICAgICAgICAgbWVzc2FnZVBhdGg6IHRoaXMubWNwLm1lc3NhZ2VQYXRoLFxuICAgICAgICAgICAgICBodHRwOiBgJHt0aGlzLmJhc2VQYXRofSR7dGhpcy5tY3AuaHR0cFBhdGh9YCxcbiAgICAgICAgICAgICAgc3NlOiBgJHt0aGlzLmJhc2VQYXRofSR7dGhpcy5tY3Auc3NlUGF0aH1gLFxuICAgICAgICAgICAgICBtZXNzYWdlczogYCR7dGhpcy5iYXNlUGF0aH0ke3RoaXMubWNwLm1lc3NhZ2VQYXRofWAsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiBudWxsLFxuICAgICAgLyoqIEV4cHJlc3Mgc3ViYXBwIE1hc3RyYSBpcyBtb3VudGVkIG9uOyBtb3N0bHkgZm9yIHRlc3RzLiAqL1xuICAgICAgZ2V0TWFzdHJhU2VydmVyOiAoKSA9PiB0aGlzLm1hc3RyYVNlcnZlcixcbiAgICAgIC8qKlxuICAgICAgICogRmV0Y2ggdGhlIHdvcmtzcGFjZSdzIE1vZGVsIFNlcnZpbmcgZW5kcG9pbnRzIChjYWNoZWQpLiBTYW1lXG4gICAgICAgKiBwYXlsb2FkIHRoZSBgR0VUIC9tb2RlbHNgIHJvdXRlIHJldHVybnM7IHN1cmZhY2VkIGhlcmUgc29cbiAgICAgICAqIG90aGVyIHBsdWdpbnMgLyBzY3JpcHRzIGNhbiBpbnRyb3NwZWN0IHRoZSBjYXRhbG9ndWUgd2l0aG91dFxuICAgICAgICogYW4gSFRUUCByb3VuZC10cmlwLiBBcHBLaXQgd3JhcHMgdGhpcyB3aXRoIGBhc1VzZXIocmVxKWAgZm9yXG4gICAgICAgKiBPQk8gc2NvcGluZyBhdXRvbWF0aWNhbGx5LiBUaHJvd3Mgd2hlbiB0aGUgbGlzdGluZyBmYWlscywgc2luY2VcbiAgICAgICAqIHRoZXJlIGlzIG5vIHN0YXR1cyBjb2RlIHRvIGhhbmQgYmFjayBvbiB0aGlzIHN1cmZhY2UuXG4gICAgICAgKi9cbiAgICAgIGxpc3RNb2RlbHM6ICgpOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4gPT4gdGhpcy5saXN0TW9kZWxzKCksXG4gICAgICAvKipcbiAgICAgICAqIEZvcmNlLWV2aWN0IGNhY2hlZCBlbmRwb2ludCBsaXN0aW5ncyB2aWEgQXBwS2l0J3NcbiAgICAgICAqIGBDYWNoZU1hbmFnZXJgLiBVc2VmdWwgaW4gdGVzdHMgb3IgcmlnaHQgYWZ0ZXIgYW4gYWRtaW5cbiAgICAgICAqIGRlcGxveXMgYSBuZXcgZW5kcG9pbnQgYW5kIGRvZXNuJ3Qgd2FudCB0byB3YWl0IGZvciB0aGUgVFRMLlxuICAgICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBgQ2FjaGVNYW5hZ2VyLmRlbGV0ZWAvYGNsZWFyYCBwcm9taXNlLlxuICAgICAgICovXG4gICAgICBjbGVhck1vZGVsc0NhY2hlOiAoaG9zdD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT5cbiAgICAgICAgbW9kZWxDYXRhbG9nLmNsZWFyU2VydmluZ0VuZHBvaW50c0NhY2hlKGhvc3QpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQWJzb2x1dGUgbW91bnQgdGhpcyBwbHVnaW4ncyByb3V0ZXMgYW5zd2VyIG9uLiBBcHBLaXQgbW91bnRzIGV2ZXJ5IHBsdWdpblxuICAgKiBhdCBgL2FwaS88cGx1Z2luLm5hbWU+YCBhbmQgYHRoaXMubmFtZWAgaG9ub3JzIGEgYGNvbmZpZy5uYW1lYCBvdmVycmlkZSxcbiAgICogc28gdGhlIHBlci1yb3V0ZSBzZWdtZW50cyAoYHJvdXRlcy5NQVNUUkFfUk9VVEVTYCkgaGFuZyBvZmYgdGhpcy5cbiAgICovXG4gIHByaXZhdGUgZ2V0IGJhc2VQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvYXBpLyR7dGhpcy5uYW1lfWA7XG4gIH1cblxuICBvdmVycmlkZSBjbGllbnRDb25maWcoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIC8vIFB1Ymxpc2hpbmcgYGJhc2VQYXRoYCBpcyBlbm91Z2ggZm9yIHRoZSBjbGllbnQgdG8gc3RheSBjb3JyZWN0IHVuZGVyIGFcbiAgICAvLyBjdXN0b20gbW91bnQgaWQ6IHRoZSBwZXItcm91dGUgc2VnbWVudHMgYXJlIGZpeGVkXG4gICAgLy8gKGByb3V0ZXMuTUFTVFJBX1JPVVRFU2ApIGFuZCB0aGUgY2xpZW50IChgTWFzdHJhUGx1Z2luQ2xpZW50YCkgZGVyaXZlc1xuICAgIC8vIGV2ZXJ5IGVuZHBvaW50IGZyb20gYGJhc2VQYXRoYC5cbiAgICAvLyBSZXR1cm4gd2lkZW5zIHRvIGBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPmAgdG8gc2F0aXNmeSB0aGVcbiAgICAvLyBiYXNlLWNsYXNzIHNpZ25hdHVyZTsgY29uc3VtZXJzIHJlYWQgaXQgdGhyb3VnaCB0aGUgdHlwZWRcbiAgICAvLyBgTWFzdHJhQ2xpZW50Q29uZmlnYCBzaGFwZSB2aWEgYHVzZVBsdWdpbkNsaWVudENvbmZpZzwuLi4+KC4uLilgLlxuICAgIGNvbnN0IGNvbmZpZzogTWFzdHJhQ2xpZW50Q29uZmlnID0ge1xuICAgICAgYmFzZVBhdGg6IHRoaXMuYmFzZVBhdGgsXG4gICAgICBkZWZhdWx0QWdlbnQ6IHRoaXMuYnVpbHQ/LmRlZmF1bHRBZ2VudElkID8/IEZBTExCQUNLX0FHRU5UX0lELFxuICAgICAgYWdlbnRzOiBPYmplY3Qua2V5cyh0aGlzLmJ1aWx0Py5hZ2VudHMgPz8ge30pLFxuICAgICAgZmVlZGJhY2tFbmFibGVkOiB0aGlzLmZlZWRiYWNrRW5hYmxlZCgpLFxuICAgICAgLy8gSW4gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIHRoZSBjaGF0IHdvcmtzIGZvciBhbnkgY2FsbGVyIHdobyBjYW4gb3BlblxuICAgICAgLy8gdGhlIGFwcCwgc28gYSBVSSB0aGF0IGhpZGVzIGNoYXQgYmVoaW5kIGFuIE9CTy10b2tlbiBwcm9iZSBzaG91bGQgc2hvd1xuICAgICAgLy8gaXQgcmVnYXJkbGVzcy4gYFwidXNlclwiYCBtb2RlIGtlZXBzIHRoZSBPQk8tZ2F0ZWQgYmVoYXZpb3IuXG4gICAgICBjaGF0QWx3YXlzQXZhaWxhYmxlOiB0aGlzLmlkZW50aXR5TW9kZSA9PT0gXCJzZXJ2aWNlLXByaW5jaXBhbFwiLFxuICAgIH07XG4gICAgcmV0dXJuIGNvbmZpZyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdXNlciBmZWVkYmFjayBjYW4gYmUgbG9nZ2VkIHRvIE1MZmxvdy4gRGVsZWdhdGVzIHRvXG4gICAqIHtAbGluayByZXNvbHZlRmVlZGJhY2tFbmFibGVkfSBzbyB0aGUgY2xpZW50LWNvbmZpZyBmbGFnIGFuZCB0aGVcbiAgICogZmVlZGJhY2sgcm91dGUgc2hhcmUgdGhlIHNhbWUgZ2F0ZSBhcyB0aGUgc2VydmVyJ3MgdHJhY2UtaWQgaGVhZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBmZWVkYmFja0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlc29sdmVGZWVkYmFja0VuYWJsZWQodGhpcy5jb25maWcuZmVlZGJhY2spO1xuICB9XG5cbiAgb3ZlcnJpZGUgaW5qZWN0Um91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJNY3BSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyTW9kZWxSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyRW1iZWRSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyU3VnZ2VzdGlvblJvdXRlcyhyb3V0ZXIpO1xuICAgIHRoaXMucmVnaXN0ZXJGZWVkYmFja1JvdXRlcyhyb3V0ZXIpO1xuICAgIHRoaXMucmVnaXN0ZXJBZ2VudFJvdXRlcyhyb3V0ZXIpO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIFVSTCBhbGlhc2VzIGZvciBNYXN0cmEncyBNQ1AgdHJhbnNwb3J0cy4gKi9cbiAgcHJpdmF0ZSByZWdpc3Rlck1jcFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICAvLyBFeHBvc2UgdGhlIE1DUCB0cmFuc3BvcnQgYXQgdGhlIGNsZWFuIGAvbWNwYCAocGx1cyB0aGUgbGVnYWN5XG4gICAgLy8gYC9zc2VgICsgYC9tZXNzYWdlc2ApIHVuZGVyIHRoZSBwbHVnaW4gbW91bnQuIGBAbWFzdHJhL2V4cHJlc3NgXG4gICAgLy8gbW91bnRzIE1DUCB1bmRlciBgL21jcC88c2VydmVySWQ+Lzx0cmFuc3BvcnQ+YCwgYW5kIHRoZSBzZXJ2ZXJJZFxuICAgIC8vIGRlZmF1bHRzIHRvIHRoZSBwbHVnaW4gbmFtZSwgc28gdGhlIHJhdyByb3V0ZSByZWFkc1xuICAgIC8vIGAvYXBpL21hc3RyYS9tY3AvbWFzdHJhL21jcGAgKGRvdWJsZWQgc2VnbWVudCkuIFRoaXMgcnVucyBiZWZvcmVcbiAgICAvLyB0aGUgY2F0Y2gtYWxsIGFuZCByZXdyaXRlcyB0aGUgYWxpYXMgdG8gdGhlIHVuZGVybHlpbmcgcm91dGUsIHNvXG4gICAgLy8gdGhlIHB1YmxpYyBwYXRoIGlzIGp1c3QgYC9hcGkvPHBsdWdpbj4vbWNwYDsgdGhlIHF1ZXJ5IHN0cmluZ1xuICAgIC8vIChlLmcuIHRoZSBTU0UgYHNlc3Npb25JZGApIGlzIHByZXNlcnZlZC5cbiAgICAvL1xuICAgIC8vIE1pZGRsZXdhcmUgcmF0aGVyIHRoYW4gYHRoaXMucm91dGVgOiBpdCByZXdyaXRlcyB0aGUgVVJMIGZvciByb3V0ZXNcbiAgICAvLyBgQG1hc3RyYS9leHByZXNzYCBvd25zIGZ1cnRoZXIgZG93biB0aGUgY2hhaW4gaW5zdGVhZCBvZiBhbnN3ZXJpbmcgdGhlXG4gICAgLy8gcmVxdWVzdCwgd2hpY2ggYFJvdXRlQ29uZmlnYCBoYXMgbm8gc2hhcGUgZm9yLlxuICAgIHJvdXRlci51c2UoKHJlcSwgX3JlcywgbmV4dCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5tY3BSb3V0ZUFsaWFzKHJlcS5wYXRoKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgY29uc3QgcSA9IHJlcS51cmwuaW5kZXhPZihcIj9cIik7XG4gICAgICAgIHJlcS51cmwgPSBxID49IDAgPyB0YXJnZXQgKyByZXEudXJsLnNsaWNlKHEpIDogdGFyZ2V0O1xuICAgICAgfVxuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIG1vZGVsIGNhdGFsb2d1ZSBhbmQgcGVyLWFnZW50IGRlZmF1bHQtbW9kZWwgcm91dGVzLiAqL1xuICBwcml2YXRlIHJlZ2lzdGVyTW9kZWxSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgLy8gYEdFVCAvbW9kZWxzYCBleHBvc2VzIHRoZSBjYWNoZWQgZW5kcG9pbnQgbGlzdCBzbyBjbGllbnRzIGNhblxuICAgIC8vIHBvcHVsYXRlIG1vZGVsIHBpY2tlcnMsIHZhbGlkYXRlIGA/bW9kZWw9YCBjaG9pY2VzLCBldGMuIE11c3RcbiAgICAvLyBiZSByZWdpc3RlcmVkIGJlZm9yZSB0aGUgY2F0Y2gtYWxsIHRoYXQgZm9yd2FyZHMgZXZlcnl0aGluZyB0b1xuICAgIC8vIHRoZSBNYXN0cmEgc3ViYXBwLlxuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcIm1vZGVsc1wiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogcm91dGVzLk1BU1RSQV9ST1VURVMubW9kZWxzLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2NvcGVkU2VsZihyZXEpLmxpc3RNb2RlbHNSZXN1bHQoKTtcbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBcIm1vZGVsc1wiLCBNT0RFTF9DQVRBTE9HVUVfRkFJTEVEX01FU1NBR0UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXMuanNvbih7IGVuZHBvaW50czogcmVzdWx0LmRhdGEgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gYEdFVCAvZGVmYXVsdC1tb2RlbGAgKGFuZCBgL2RlZmF1bHQtbW9kZWwvOmFnZW50SWRgKSByZXBvcnRzIHdoYXQgYW5cbiAgICAvLyB1bnBpbm5lZCB0dXJuIHdpbGwgdXNlLiBBIGNvbmZpZ3VyZWQgc3RyaW5nIGlzIHJldHVybmVkIGRpcmVjdGx5OyBhblxuICAgIC8vIGF1dG9tYXRpYyBkZWZhdWx0IHJlc29sdmVzIHRoZSBoaWdoZXN0LXJhbmtlZCBjdXJyZW50bHkgYXZhaWxhYmxlIEdQVFxuICAgIC8vIChvciBnZW5lcmFsIGNoYXQgZmFsbGJhY2spIGZyb20gdGhlIHNhbWUgT0JPLXNjb3BlZCBsaXZlIGNhdGFsb2d1ZSBhc1xuICAgIC8vIGAvbW9kZWxzYDsgYSBjdXN0b20gZHluYW1pYyByZXNvbHZlciByZW1haW5zIG51bGwgYmVjYXVzZSBpdCBpcyBjYWxsLXRpbWVcbiAgICAvLyBhcHBsaWNhdGlvbiBjb2RlLlxuICAgIGNvbnN0IGhhbmRsZURlZmF1bHRNb2RlbCA9IGFzeW5jIChcbiAgICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgICAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICAgICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdGVkID0gc3RyaW5nVXRpbHMuZmlyc3ROb25FbXB0eShyZXEucGFyYW1zLmFnZW50SWQpO1xuICAgICAgaWYgKHJlcXVlc3RlZCAhPT0gbnVsbCAmJiAhdGhpcy5idWlsdD8uYWdlbnRzW3JlcXVlc3RlZF0pIHtcbiAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogdGhpcy51bmtub3duQWdlbnRNZXNzYWdlKHJlcXVlc3RlZCkgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFnZW50SWQgPSByZXF1ZXN0ZWQgPz8gdGhpcy5idWlsdD8uZGVmYXVsdEFnZW50SWQgPz8gRkFMTEJBQ0tfQUdFTlRfSUQ7XG4gICAgICBjb25zdCBpbnRlbnQgPSB0aGlzLmJ1aWx0Py5kZWZhdWx0TW9kZWxzW2FnZW50SWRdO1xuICAgICAgbGV0IG1vZGVsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgIGlmIChpbnRlbnQ/LmtpbmQgPT09IFwiY29uZmlndXJlZFwiKSB7XG4gICAgICAgIG1vZGVsID0gaW50ZW50Lm1vZGVsO1xuICAgICAgfSBlbHNlIGlmIChpbnRlbnQ/LmtpbmQgPT09IFwiYXV0b1wiKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2NvcGVkU2VsZihyZXEpLmxpc3RNb2RlbHNSZXN1bHQoKTtcbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBcImRlZmF1bHQtbW9kZWxcIiwgTU9ERUxfQ0FUQUxPR1VFX0ZBSUxFRF9NRVNTQUdFKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBtb2RlbCA9IHJlc29sdmVEZWZhdWx0TW9kZWxJZCh0aGlzLmNvbmZpZywgcmVzdWx0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXMuanNvbih7XG4gICAgICAgIGFnZW50SWQsXG4gICAgICAgIG1vZGVsLFxuICAgICAgICBkaXNwbGF5TmFtZTogbW9kZWwgPyBkaXNwbGF5LnRvTW9kZWxEaXNwbGF5TmFtZShtb2RlbCkgOiBudWxsLFxuICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJkZWZhdWx0TW9kZWxcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IHJvdXRlcy5NQVNUUkFfUk9VVEVTLmRlZmF1bHRNb2RlbCxcbiAgICAgIGhhbmRsZXI6IGhhbmRsZURlZmF1bHRNb2RlbCxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJkZWZhdWx0TW9kZWxCeUFnZW50XCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBgJHtyb3V0ZXMuTUFTVFJBX1JPVVRFUy5kZWZhdWx0TW9kZWx9LzphZ2VudElkYCxcbiAgICAgIGhhbmRsZXI6IGhhbmRsZURlZmF1bHRNb2RlbCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciB0aGUgZ2VuZXJpYyBjaGFydCBhbmQgc3RhdGVtZW50IGVtYmVkIHJlc29sdmVyLiAqL1xuICBwcml2YXRlIHJlZ2lzdGVyRW1iZWRSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgLy8gYEdFVCAvZW1iZWQvOnR5cGUvOmlkYCBpcyB0aGUgc2luZ2xlIHJlc29sdmVyIGZvciBldmVyeSBlbWJlZFxuICAgIC8vIG1hcmtlciB0aGUgYWdlbnQgZW1pdHMgaW4gcHJvc2UgKGBbY2hhcnQ6PGlkPl1gLFxuICAgIC8vIGBbZGF0YTo8aWQ+XWAsIC4uLikuIGA6dHlwZWAgc2VsZWN0cyBhIHJlc29sdmVyIGZyb20gdGhlXG4gICAgLy8gcmVnaXN0cnkgYmVsb3c7IGA6aWRgIGlzIHRoYXQgcmVzb2x2ZXIncyBsb29rdXAga2V5LiBUaGVcbiAgICAvLyBncmFtbWFyIChzZWUgYG1hcmtlci50c2ApIGlzIHR5cGUtYWdub3N0aWMgb24gcHVycG9zZSAtIG5ld1xuICAgIC8vIGVtYmVkIGtpbmRzIGFyZSBhZGRlZCBieSByZWdpc3RlcmluZyBhIHJlc29sdmVyIGhlcmUsIHdpdGggbm9cbiAgICAvLyBjbGllbnQgb3IgZ3JhbW1hciBjaGFuZ2UuXG4gICAgLy9cbiAgICAvLyBTdGF0dXMgY29kZXM6XG4gICAgLy8gICAtIDIwMCB3aXRoIHRoZSByZXNvbHZlcidzIEpTT04gYm9keSB3aGVuIHRoZSBpZCByZXNvbHZlcy5cbiAgICAvLyAgIC0gNDA0IHdoZW4gYDp0eXBlYCBpc24ndCByZWdpc3RlcmVkICh1bnN1cHBvcnRlZCBlbWJlZFxuICAgIC8vICAgICB0eXBlKSBPUiBhIHJlZ2lzdGVyZWQgcmVzb2x2ZXIgY2FuJ3QgZmluZCBgOmlkYCAodW5rbm93blxuICAgIC8vICAgICAvIGV4cGlyZWQgLSBlLmcuIGEgY2hhcnQgcGFzdCBpdHMgMWggVFRMIG9yIGEgZmFicmljYXRlZFxuICAgIC8vICAgICBpZCB0aGUgbW9kZWwgbmV2ZXIgbWludGVkKS5cbiAgICAvLyAgIC0gNDAwIHdoZW4gYDppZGAgaXMgZW1wdHkuXG4gICAgLy9cbiAgICAvLyBQZXItdHlwZSBxdWVyeSBrbm9icyBhbmQgYmVoYXZpb3I6XG4gICAgLy8gICAtIGBjaGFydGA6IGxvbmctcG9sbHMgdGhlIGNoYXJ0IGNhY2hlIHVudGlsIHRoZSBlbnRyeVxuICAgIC8vICAgICBzZXR0bGVzIChgcmVzdWx0YCAvIGBlcnJvcmApIG9yIHRoZSBidWRnZXQgZWxhcHNlcyAodGhlblxuICAgIC8vICAgICByZXR1cm5zIHRoZSBzdGlsbC1wcm9jZXNzaW5nIGVudHJ5IHRvIHBvbGwgYWdhaW4pLlxuICAgIC8vICAgICBgP3RpbWVvdXRNcz08bj5gIChkZWZhdWx0IDYwcywgY2FwcGVkIDVtaW4pIHR1bmVzIGl0LlxuICAgIC8vICAgLSBgZGF0YWA6IG9uZSBPQk8tc2NvcGVkIFN0YXRlbWVudCBFeGVjdXRpb24gZmV0Y2guXG4gICAgLy8gICAgIGA/bGltaXQ9PG4+YCBjYXBzIHJvd3MgKGNsYW1wZWQgdG8gU1RBVEVNRU5UX1JPV19DQVApLlxuICAgIC8vXG4gICAgLy8gQnVpbHQgb25jZSAodGhpcyBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgb25jZSkgYW5kIGtleWVkIGJ5IHRoZVxuICAgIC8vIHJhdyBgOnR5cGVgIHRva2VuLiBFYWNoIHJlc29sdmVyIGdldHMgdGhlIHJlcXVlc3QgKGZvciBxdWVyeVxuICAgIC8vIHBhcnNpbmcgKyBPQk8gc2NvcGluZykgYW5kIGFuIGBBYm9ydFNpZ25hbGAgYnJpZGdlZCBvZmYgdGhlXG4gICAgLy8gY29ubmVjdGlvbiBgY2xvc2VgIGV2ZW50IHNvIGEgbG9uZy1wb2xsIHVuYmxvY2tzIHRoZSBpbnN0YW50XG4gICAgLy8gdGhlIGNsaWVudCBkaXNjb25uZWN0cy4gYHVuZGVmaW5lZGAgZnJvbSBhIHJlc29sdmVyIG1hcHMgdG8gYVxuICAgIC8vIGNsZWFuIDQwNDsgdGhyb3duIGVycm9ycyBidWJibGUgdGhyb3VnaCBgbmV4dChlcnIpYC5cbiAgICBjb25zdCBlbWJlZFJlc29sdmVyczogUmVjb3JkPHN0cmluZywgRW1iZWRSZXNvbHZlcj4gPSB7XG4gICAgICBjaGFydDogKHJlcSwgaWQsIHNpZ25hbCkgPT4ge1xuICAgICAgICBjb25zdCB0aW1lb3V0TXMgPSBwYXJzZVRpbWVvdXRNcyhyZXEucXVlcnkudGltZW91dE1zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGVkU2VsZihyZXEpLmZldGNoQ2hhcnRFbnRyeShyZXEsIGlkLCB7XG4gICAgICAgICAgLi4uKHRpbWVvdXRNcyAhPT0gdW5kZWZpbmVkID8geyB0aW1lb3V0TXMgfSA6IHt9KSxcbiAgICAgICAgICBzaWduYWwsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGRhdGE6IChyZXEsIGlkLCBzaWduYWwpID0+IHtcbiAgICAgICAgY29uc3QgbGltaXQgPSBwYXJzZVN0YXRlbWVudExpbWl0KHJlcS5xdWVyeS5saW1pdCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNjb3BlZFNlbGYocmVxKS5mZXRjaFN0YXRlbWVudChpZCwge1xuICAgICAgICAgIC4uLihsaW1pdCAhPT0gdW5kZWZpbmVkID8geyBsaW1pdCB9IDoge30pLFxuICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJlbWJlZFwiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogYCR7cm91dGVzLk1BU1RSQV9ST1VURVMuZW1iZWR9Lzp0eXBlLzppZGAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHN0cmluZ1V0aWxzLmZpcnN0Tm9uRW1wdHkocmVxLnBhcmFtcy50eXBlKSA/PyBcIlwiO1xuICAgICAgICBjb25zdCBpZCA9IHN0cmluZ1V0aWxzLmZpcnN0Tm9uRW1wdHkocmVxLnBhcmFtcy5pZCk7XG4gICAgICAgIGNvbnN0IHJlc29sdmUgPSBlbWJlZFJlc29sdmVyc1t0eXBlXTtcbiAgICAgICAgaWYgKCFyZXNvbHZlKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcImVtYmVkOnVuc3VwcG9ydGVkXCIsIHtcbiAgICAgICAgICAgIHN0YXR1czogNDA0LFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgbWV0aG9kOiByZXEubWV0aG9kLFxuICAgICAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogYHVuc3VwcG9ydGVkIGVtYmVkIHR5cGU6ICR7dHlwZX1gIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcImVtYmVkOmludmFsaWRcIiwge1xuICAgICAgICAgICAgc3RhdHVzOiA0MDAsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgbWV0aG9kOiByZXEubWV0aG9kLFxuICAgICAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgICAgICBlcnJvcjogXCJpZCBpcyByZXF1aXJlZFwiLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgZXJyb3I6IFwiaWQgaXMgcmVxdWlyZWRcIiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXhwcmVzcydzIGByZXFgIHByZWRhdGVzIGBBYm9ydFNpZ25hbGA7IGJyaWRnZSB0aGUgYGNsb3NlYFxuICAgICAgICAvLyBldmVudCBvbnRvIGFuIGBBYm9ydENvbnRyb2xsZXJgIHNvIGEgY2xvc2VkIGNvbm5lY3Rpb25cbiAgICAgICAgLy8gdW5ibG9ja3MgYW55IGxvbmctcG9sbCBpbW1lZGlhdGVseSBhbmQgZnJlZXMgdGhlIHJlcXVlc3RcbiAgICAgICAgLy8gdGhyZWFkLiBUaGUgbGlzdGVuZXIgaXMgR0MnZCB3aXRoIHRoZSByZXF1ZXN0IG9uIG5vcm1hbFxuICAgICAgICAvLyBjb21wbGV0aW9uLlxuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICByZXEub24oXCJjbG9zZVwiLCAoKSA9PiBjb250cm9sbGVyLmFib3J0KCkpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNvbHZlKHJlcSwgaWQsIGNvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgICAgaWYgKGNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBgZW1iZWQ6JHt0eXBlfWAsIGBDb3VsZCBub3QgcmVzb2x2ZSB0aGUgJHt0eXBlfSBlbWJlZGApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIEEgY2FjaGUgbWlzcyBpcyBzZWN1cml0eS1kZWxpYmVyYXRlbHkgYW1iaWd1b3VzOiB1bmtub3duLCBleHBpcmVkLFxuICAgICAgICAgIC8vIG9yIG93bmVkIGJ5IGFub3RoZXIgaWRlbnRpdHkgYWxsIG1hcCB0byB0aGUgc2FtZSA0MDQuIExvZyB0aGVcbiAgICAgICAgICAvLyBvcGFxdWUgaWQgYW5kIHRob3NlIHBvc3NpYmxlIGNhdXNlcyBzbyBhIGZhYnJpY2F0ZWQgbWFya2VyIGlzXG4gICAgICAgICAgLy8gZGlhZ25vc2FibGUgZnJvbSB0aGUgc2VydmVyIHdpdGhvdXQgZGlzY2xvc2luZyB3aGljaCBjYXVzZSBhcHBsaWVkLlxuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYGVtYmVkOiR7dHlwZX06bm90LWZvdW5kYCwge1xuICAgICAgICAgICAgc3RhdHVzOiA0MDQsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgICAgICBwYXRoOiByZXEucGF0aCxcbiAgICAgICAgICAgIHJlYXNvbjogXCJ1bmtub3duLCBleHBpcmVkLCBvciBvd25lZCBieSBhbm90aGVyIGlkZW50aXR5XCIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogYCR7dHlwZX0gbm90IGZvdW5kYCB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzLmpzb24ocmVzdWx0LmRhdGEpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciBkZWZhdWx0IGFuZCBhZ2VudC1xdWFsaWZpZWQgc3VnZ2VzdGlvbiByb3V0ZXMuICovXG4gIHByaXZhdGUgcmVnaXN0ZXJTdWdnZXN0aW9uUm91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIC8vIGBHRVQgL3N1Z2dlc3Rpb25zYCAoYW5kIGAvc3VnZ2VzdGlvbnMvOmFnZW50SWRgKSByZXR1cm5zIHRoZVxuICAgIC8vIGN1cmF0ZWQgc3RhcnRlciBxdWVzdGlvbnMgZm9yIHRoZSBhZ2VudCdzIEdlbmllIHNwYWNlKHMpIC0gdGhlXG4gICAgLy8gYXV0aG9yLWNvbmZpZ3VyZWQgYHNhbXBsZV9xdWVzdGlvbnNgLCBzdXJmYWNlZCBhcyBvbmUtdGFwXG4gICAgLy8gcHJvbXB0cyBvbiB0aGUgY2hhdCBlbXB0eSBzdGF0ZS4gUmV0dXJucyBgeyBxdWVzdGlvbnM6IFtdIH1gXG4gICAgLy8gd2hlbiBubyBHZW5pZSBzcGFjZSBpcyB3aXJlZCBzbyB0aGUgY2xpZW50IHJlbmRlcnMgYSBiYXJlXG4gICAgLy8gZW1wdHkgc3RhdGUgKG5vIGJ1aWx0LWluIGV4YW1wbGUgcHJvbXB0cykuIFRoZSBgOmFnZW50SWRgXG4gICAgLy8gc2VnbWVudCBpcyBhY2NlcHRlZCBmb3IgVVJMIHN5bW1ldHJ5IHdpdGggdGhlIGNoYXQgLyBoaXN0b3J5XG4gICAgLy8gcm91dGVzOyBHZW5pZSBzcGFjZXMgYXJlIHJlc29sdmVkIHBlci1wbHVnaW4sIG5vdCBwZXItYWdlbnQsXG4gICAgLy8gc28gaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHJlc3VsdC4gT0JPLXNjb3BlZCBsaWtlIHRoZSBvdGhlclxuICAgIC8vIGRhdGEgcm91dGVzIHNvIHRoZSBzcGFjZSBsb29rdXAgcnVucyBhcyB0aGUgY2FsbGluZyB1c2VyLlxuICAgIGNvbnN0IGhhbmRsZVN1Z2dlc3Rpb25zID0gYXN5bmMgKFxuICAgICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgcmVxLm9uKFwiY2xvc2VcIiwgKCkgPT4gY29udHJvbGxlci5hYm9ydCgpKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2NvcGVkU2VsZihyZXEpLmZldGNoU3VnZ2VzdGlvbnMoY29udHJvbGxlci5zaWduYWwpO1xuICAgICAgaWYgKGNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgIC8vIFN1Z2dlc3Rpb25zIGFyZSBhIG5vbi1jcml0aWNhbCBlbmhhbmNlbWVudDsgYSBsb29rdXAgZmFpbHVyZSBzaG91bGRcbiAgICAgICAgLy8gbGVhdmUgdGhlIGNoYXQgdXNhYmxlIHdpdGggYSBiYXJlIGVtcHR5IHN0YXRlIHJhdGhlciB0aGFuIHN1cmZhY2luZ1xuICAgICAgICAvLyB0aGUgdXBzdHJlYW0gc3RhdHVzLiBMb2cgYW5kIGRlZ3JhZGUuXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJzdWdnZXN0aW9uczplcnJvclwiLCB7XG4gICAgICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgICAgIGVycm9yOiByZXN1bHQubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcy5qc29uKHsgcXVlc3Rpb25zOiBbXSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzLmpzb24oeyBxdWVzdGlvbnM6IHJlc3VsdC5kYXRhIH0pO1xuICAgIH07XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwic3VnZ2VzdGlvbnNcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IHJvdXRlcy5NQVNUUkFfUk9VVEVTLnN1Z2dlc3Rpb25zLFxuICAgICAgaGFuZGxlcjogaGFuZGxlU3VnZ2VzdGlvbnMsXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwic3VnZ2VzdGlvbnNCeUFnZW50XCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBgJHtyb3V0ZXMuTUFTVFJBX1JPVVRFUy5zdWdnZXN0aW9uc30vOmFnZW50SWRgLFxuICAgICAgaGFuZGxlcjogaGFuZGxlU3VnZ2VzdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgTUxmbG93IGZlZWRiYWNrIHN1Ym1pc3Npb24gd2hlbiBjb25maWd1cmVkLiAqL1xuICBwcml2YXRlIHJlZ2lzdGVyRmVlZGJhY2tSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgLy8gYFBPU1QgL3JvdXRlL2ZlZWRiYWNrYCBsb2dzIGEgdGh1bWJzIC8gY29tbWVudCBhc3Nlc3NtZW50IGFnYWluc3RcbiAgICAvLyBhIHR1cm4ncyBNTGZsb3cgdHJhY2UgKHRoZSBgdHJhY2VJZGAgdGhlIGNsaWVudCBjYXB0dXJlZCBmcm9tIHRoZVxuICAgIC8vIHN0cmVhbSByZXNwb25zZSdzIHRyYWNlLWlkIGhlYWRlcikuIFJlZ2lzdGVyZWQgb24gdGhlIEFwcEtpdFxuICAgIC8vIHJvdXRlciAobGlrZSBgL21vZGVsc2ApIHJhdGhlciB0aGFuIHRoZSBNYXN0cmEgc3ViYXBwIHNvIGl0IHJ1bnNcbiAgICAvLyB1bmRlciB0aGUgc2FtZSBPQk8gc2NvcGUgLSB0aGUgZmVlZGJhY2sgaXMgYXR0cmlidXRlZCB0byB0aGVcbiAgICAvLyBzaWduZWQtaW4gdXNlci4gUmV0dXJucyA0MDQgd2hlbiBmZWVkYmFjayBpcyBkaXNhYmxlZCBzbyB0aGVcbiAgICAvLyBjbGllbnQgdHJlYXRzIHRoZSBjYXBhYmlsaXR5IGFzIGFic2VudDsgNDAwIG9uIGEgbWFsZm9ybWVkIGJvZHkuXG4gICAgLy8gQSByZWNvcmRlZCBhc3Nlc3NtZW50IHlpZWxkcyBgeyBvazogdHJ1ZSB9YDsgYSBzb2Z0IGZhaWx1cmUgKG1vc3RcbiAgICAvLyBvZnRlbiB0aGUgdHJhY2UgaGFzbid0IGZpbmlzaGVkIGV4cG9ydGluZyB0byBNTGZsb3cgeWV0KSB5aWVsZHNcbiAgICAvLyBgeyBvazogZmFsc2UgfWAgd2l0aG91dCBhIDV4eCBzbyB0aGUgVUkgY2FuIHByb21wdCBhIHJldHJ5LlxuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImZlZWRiYWNrXCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogcm91dGVzLk1BU1RSQV9ST1VURVMuZmVlZGJhY2ssXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmZlZWRiYWNrRW5hYmxlZCgpKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBvazogZmFsc2UgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGZlZWRiYWNrLk1hc3RyYUZlZWRiYWNrUmVxdWVzdFNjaGVtYS5zYWZlUGFyc2UocmVxLmJvZHkpO1xuICAgICAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICAgICAgLy8gQSBab2QgaXNzdWUgc3RyaW5nIHF1b3RlcyB0aGUgcmVjZWl2ZWQgYm9keSBiYWNrLCBzbyBvbmx5IHRoZVxuICAgICAgICAgIC8vIG9mZmVuZGluZyBmaWVsZCBuYW1lcyB0cmF2ZWw7IHRoZSBmdWxsIGlzc3VlIGxpc3QgaXMgbG9nZ2VkLlxuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJmZWVkYmFjazppbnZhbGlkXCIsIHsgZXJyb3I6IHBhcnNlZC5lcnJvci5tZXNzYWdlIH0pO1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtcbiAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBJTlZBTElEX0ZFRURCQUNLX01FU1NBR0UsXG4gICAgICAgICAgICBmaWVsZHM6IGludmFsaWRGaWVsZHMocGFyc2VkLmVycm9yKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zY29wZWRTZWxmKHJlcSkubG9nRmVlZGJhY2socGFyc2VkLmRhdGEpO1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgIHRoaXMuc2VuZEZhaWx1cmUocmVzLCByZXN1bHQsIFwiZmVlZGJhY2tcIiwgXCJGZWVkYmFjayBjb3VsZCBub3QgYmUgcmVjb3JkZWRcIik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFzc2Vzc21lbnRJZCA9IHJlc3VsdC5kYXRhO1xuICAgICAgICByZXMuanNvbih7XG4gICAgICAgICAgb2s6IGFzc2Vzc21lbnRJZCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgIC4uLihhc3Nlc3NtZW50SWQgPyB7IGFzc2Vzc21lbnRJZCB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgdGhlIGdhdGVkIE1hc3RyYSBjYXRjaC1hbGwgYWZ0ZXIgZXZlcnkgZXhwbGljaXQgcm91dGUuICovXG4gIHByaXZhdGUgcmVnaXN0ZXJBZ2VudFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICAvLyBNaWRkbGV3YXJlIHJhdGhlciB0aGFuIGB0aGlzLnJvdXRlYDogdGhpcyBpcyB0aGUgY2F0Y2gtYWxsIHRoYXQgaGFuZHNcbiAgICAvLyBldmVyeSByZW1haW5pbmcgbWV0aG9kIC8gcGF0aCBwYWlyIHRvIHRoZSBNYXN0cmEgc3ViLWFwcCwgc28gaXQgaGFzIG5vXG4gICAgLy8gc2luZ2xlIG1ldGhvZCBvciBwYXRoIHRvIHJlZ2lzdGVyIHVuZGVyLlxuICAgIHJvdXRlci51c2UoKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICBpZiAoIXRoaXMubWFzdHJhQXBwKSByZXR1cm4gcmVzLnN0YXR1cyg1MDMpLmVuZCgpO1xuICAgICAgLy8gR2F0ZSB0aGUgc3RvY2sgTWFzdHJhIHN1cmZhY2UgYmVmb3JlIGRpc3BhdGNoLiBJbiB0aGUgZGVmYXVsdFxuICAgICAgLy8gXCJzY29wZWRcIiBtb2RlIG9ubHkgYWdlbnQgaW5mZXJlbmNlLCByZWFkLW9ubHkgYWdlbnQgbWV0YWRhdGEsIHRoaXNcbiAgICAgIC8vIHBsdWdpbidzIG93biBgL3JvdXRlLypgIHJvdXRlcywgYW5kICh3aGVuIGVuYWJsZWQpIE1DUCByZWFjaCBNYXN0cmE7XG4gICAgICAvLyBhZG1pbiAvIG11dGF0aW5nIC8gYnVsay1leHBvcnQgcm91dGVzIGFyZSByZWZ1c2VkIGhlcmUuIGByZXEucGF0aGBcbiAgICAgIC8vIGlzIG1vdW50LXJlbGF0aXZlIHVuZGVyIHRoZSBwbHVnaW4gbW91bnQuIFNlZSBgc2VydmVyLnRzYC5cbiAgICAgIGlmIChcbiAgICAgICAgIWlzTWFzdHJhUmVxdWVzdEFsbG93ZWQocmVxLm1ldGhvZCwgcmVxLnBhdGgsIHtcbiAgICAgICAgICBhY2Nlc3M6IHRoaXMuY29uZmlnLmFwaUFjY2VzcyA/PyBcInNjb3BlZFwiLFxuICAgICAgICAgIC8vIFJlZmxlY3QgdGhlICpyZXNvbHZlZCogTUNQIHN0YXRlLCBub3QgcmF3IGBjb25maWcubWNwYDogTUNQIGlzXG4gICAgICAgICAgLy8gb24gYnkgZGVmYXVsdCAoYGNvbmZpZy5tY3BgIHVuZGVmaW5lZCksIHNvIGdhdGUgb24gd2hldGhlciB0aGVcbiAgICAgICAgICAvLyBzZXJ2ZXIgd2FzIGFjdHVhbGx5IGJ1aWx0IGFuZCBtb3VudGVkLlxuICAgICAgICAgIG1jcEVuYWJsZWQ6IHRoaXMubWNwICE9PSBudWxsLFxuICAgICAgICB9KVxuICAgICAgKSB7XG4gICAgICAgIHJlcy5zdGF0dXMoNDAzKS5qc29uKHsgZXJyb3I6IFwiRW5kcG9pbnQgbm90IGV4cG9zZWQgdG8gdGhlIGNsaWVudCAoYXBpQWNjZXNzPXNjb3BlZClcIiB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gRGlzcGF0Y2ggdGhyb3VnaCBhIHJlYWwgbWV0aG9kLCBOT1QgdGhlIGBtYXN0cmFBcHBgIHByb3BlcnR5LiBUaGVcbiAgICAgIC8vIEFwcEtpdCBgYXNVc2VyKHJlcSlgIHByb3h5IHdyYXBzIGZ1bmN0aW9uLXZhbHVlZCBwcm9wcyB3aXRoXG4gICAgICAvLyBgdmFsdWUuYmluZCh0YXJnZXQpYC4gYG1hc3RyYUFwcGAgaXMgYW4gZXhwcmVzcyBhcHAgd2hvc2UgYC5iaW5kYCBpc1xuICAgICAgLy8gdGhlIEhUVFAgQklORCByb3V0ZSByZWdpc3RyYXIgKGV4cHJlc3MgZGVmaW5lcyBhIG1ldGhvZCBwZXIgSFRUUCB2ZXJiLFxuICAgICAgLy8gYW5kIEJJTkQgaXMgb25lKSwgbm90IGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgLSBzbyBiaW5kaW5nIGl0IHRocm91Z2hcbiAgICAgIC8vIHRoZSBwcm94eSByZWdpc3RlcnMgYSBib2d1cyByb3V0ZSBhbmQgY3Jhc2hlcyBgcGF0aFRvUmVnZXhwYFxuICAgICAgLy8gKFwicGF0aCBtdXN0IGJlIGEgc3RyaW5nIC4uLlwiKS4gVGhpcyBvbmx5IG1hbmlmZXN0cyBpbiBwcm9kdWN0aW9uIHdoZXJlXG4gICAgICAvLyBhbiBPQk8gdG9rZW4gbWFrZXMgYHNjb3BlZFNlbGZgIHJldHVybiB0aGUgcHJveHkuIGBkaXNwYXRjaE1hc3RyYWBcbiAgICAgIC8vIGlzIGEgcGxhaW4gbWV0aG9kIChpdHMgYC5iaW5kYCBpcyB0aGUgbm9ybWFsIG9uZSkgYW5kIGludm9rZXNcbiAgICAgIC8vIGB0aGlzLm1hc3RyYUFwcGAgb2ZmIHRoZSByZWFsIHRhcmdldCwga2VlcGluZyB0aGUgT0JPIHNjb3BlIGFjdGl2ZS5cbiAgICAgIHJldHVybiB0aGlzLnNjb3BlZFNlbGYocmVxKS5kaXNwYXRjaE1hc3RyYShyZXEsIHJlcywgbmV4dCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFwIGEgZmFpbGVkIHtAbGluayBFeGVjdXRpb25SZXN1bHR9IG9udG8gdGhlIHJlc3BvbnNlOiB0aGUgc3RhdHVzIHRoZVxuICAgKiBleGVjdXRpb24gcGlwZWxpbmUgcmVzb2x2ZWQsIHBhaXJlZCB3aXRoIGBjbGllbnRNZXNzYWdlYCByYXRoZXIgdGhhbiB0aGVcbiAgICogcmVzdWx0J3Mgb3duIHRleHQsIHdoaWNoIGNhbiBjYXJyeSB1cHN0cmVhbSBkZXRhaWwuIFRoZSBmdWxsIG1lc3NhZ2UgaXNcbiAgICogbG9nZ2VkIHVuZGVyIGA8b3BlcmF0aW9uPjplcnJvcmAuXG4gICAqL1xuICBwcml2YXRlIHNlbmRGYWlsdXJlKFxuICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICByZXN1bHQ6IHsgc3RhdHVzOiBudW1iZXI7IG1lc3NhZ2U6IHN0cmluZyB9LFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIGNsaWVudE1lc3NhZ2U6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5sb2dnZXIud2FybihgJHtvcGVyYXRpb259OmVycm9yYCwge1xuICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgZXJyb3I6IHJlc3VsdC5tZXNzYWdlLFxuICAgIH0pO1xuICAgIGlmIChyZXMuaGVhZGVyc1NlbnQpIHJldHVybjtcbiAgICByZXMuc3RhdHVzKHJlc3VsdC5zdGF0dXMpLmpzb24oeyBlcnJvcjogY2xpZW50TWVzc2FnZSB9KTtcbiAgfVxuXG4gIC8qKiA0MDQgYm9keSBmb3IgYSByZXF1ZXN0IG5hbWluZyBhbiBhZ2VudCB0aGF0IGlzbid0IHJlZ2lzdGVyZWQuICovXG4gIHByaXZhdGUgdW5rbm93bkFnZW50TWVzc2FnZShhZ2VudElkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBPYmplY3Qua2V5cyh0aGlzLmJ1aWx0Py5hZ2VudHMgPz8ge30pO1xuICAgIHJldHVybiBgVW5rbm93biBhZ2VudCBcIiR7YWdlbnRJZH1cIi4gUmVnaXN0ZXJlZCBhZ2VudHM6ICR7cmVnaXN0ZXJlZC5qb2luKFwiLCBcIikgfHwgXCJub25lXCJ9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2UgdGhlIE1hc3RyYSBleHByZXNzIHN1Yi1hcHAuIEV4aXN0cyBhcyBhIG1ldGhvZCAoaW5zdGVhZCBvZiByZWFkaW5nXG4gICAqIGB0aGlzLm1hc3RyYUFwcGAgdGhyb3VnaCB0aGUgYGFzVXNlcihyZXEpYCBwcm94eSBhdCB0aGUgY2FsbCBzaXRlKSBzbyB0aGVcbiAgICogcHJveHkgYmluZHMgdGhpcyBwbGFpbiBtZXRob2QgLSB3aG9zZSBgLmJpbmRgIGlzIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGBcbiAgICogLSByYXRoZXIgdGhhbiB0aGUgZXhwcmVzcyBhcHAsIHdob3NlIGAuYmluZGAgaXMgdGhlIEhUVFAgQklORCByb3V0ZVxuICAgKiByZWdpc3RyYXIgKHNlZSB0aGUgbm90ZSBpbiBgaW5qZWN0Um91dGVzYCkuIFJ1bnMgaW5zaWRlIHRoZSB1c2VyIHNjb3BlIHNvXG4gICAqIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlIE9CTyBjbGllbnQgZm9yIHRoZSBhZ2VudC9tb2RlbFxuICAgKiByZXNvbHZlcnMuXG4gICAqL1xuICBwcml2YXRlIGRpc3BhdGNoTWFzdHJhKFxuICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICBuZXh0OiBleHByZXNzLk5leHRGdW5jdGlvbixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5tYXN0cmFBcHAhKHJlcSwgcmVzLCBuZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXAgYSBjbGVhbiwgbW91bnQtcmVsYXRpdmUgTUNQIGFsaWFzIHBhdGggdG8gdGhlIHVuZGVybHlpbmdcbiAgICogYEBtYXN0cmEvZXhwcmVzc2Agcm91dGUuIFJldHVybnMgYG51bGxgIHdoZW4gTUNQIGlzIG9mZiBvciB0aGUgcGF0aFxuICAgKiBpc24ndCBhbiBhbGlhcy4gQ29sbGFwc2VzIHRoZSBzdG9jayBgL21jcC88c2VydmVySWQ+Lzx0cmFuc3BvcnQ+YFxuICAgKiBsYXlvdXQgKHNlcnZlcklkIGRlZmF1bHRzIHRvIHRoZSBwbHVnaW4gbmFtZSkgZG93biB0byBgL21jcGAsXG4gICAqIGAvc3NlYCwgYW5kIGAvbWVzc2FnZXNgLlxuICAgKi9cbiAgcHJpdmF0ZSBtY3BSb3V0ZUFsaWFzKHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5tY3ApIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGlkID0gdGhpcy5tY3Auc2VydmVySWQ7XG4gICAgaWYgKHBhdGggPT09IFwiL21jcFwiKSByZXR1cm4gYC9tY3AvJHtpZH0vbWNwYDtcbiAgICBpZiAocGF0aCA9PT0gXCIvc3NlXCIpIHJldHVybiBgL21jcC8ke2lkfS9zc2VgO1xuICAgIGlmIChwYXRoID09PSBcIi9tZXNzYWdlc1wiKSByZXR1cm4gYC9tY3AvJHtpZH0vbWVzc2FnZXNgO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIGJhY2tpbmcgdGhlIGAvc3VnZ2VzdGlvbnNgIHJvdXRlLiBSdW5zIGluc2lkZSB0aGVcbiAgICogQXBwS2l0IHVzZXItY29udGV4dCBwcm94eSBzbyBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYCByZXR1cm5zIHRoZVxuICAgKiBPQk8tc2NvcGVkIGNsaWVudC4gUmVzb2x2ZXMgdGhlIHBsdWdpbidzIEdlbmllIHNwYWNlcyBhbmQgbWVyZ2VzXG4gICAqIHRoZWlyIGN1cmF0ZWQgYHNhbXBsZV9xdWVzdGlvbnNgIChzZWUge0BsaW5rIGNvbGxlY3RTcGFjZVN1Z2dlc3Rpb25zfSkuXG4gICAqIFJldHVybnMgYFtdYCB3aGVuIG5vIEdlbmllIHNwYWNlIGlzIGNvbmZpZ3VyZWQgc28gdGhlIGNsaWVudFxuICAgKiBzaG93cyBhIGJhcmUgZW1wdHkgc3RhdGUgaW5zdGVhZCBvZiBidWlsdC1pbiBleGFtcGxlIHByb21wdHMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoU3VnZ2VzdGlvbnMoc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxzdHJpbmdbXT4+IHtcbiAgICBjb25zdCBzcGFjZXMgPSByZXNvbHZlR2VuaWVTcGFjZXModGhpcy5jb25maWcsIHRoaXMuY29udGV4dCk7XG4gICAgaWYgKE9iamVjdC5rZXlzKHNwYWNlcykubGVuZ3RoID09PSAwKSByZXR1cm4geyBvazogdHJ1ZSwgZGF0YTogW10gfTtcbiAgICBjb25zdCBjbGllbnQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoKGV4ZWN1dGVTaWduYWwpID0+IHtcbiAgICAgIGNvbnN0IGNvbWJpbmVkID0gYXN5bmNVdGlscy5jb21iaW5lQWJvcnRTaWduYWxzKHNpZ25hbCwgZXhlY3V0ZVNpZ25hbCk7XG4gICAgICByZXR1cm4gY29sbGVjdFNwYWNlU3VnZ2VzdGlvbnMoe1xuICAgICAgICBzcGFjZXMsXG4gICAgICAgIGNsaWVudCxcbiAgICAgICAgLi4uKGNvbWJpbmVkID8geyBzaWduYWw6IGNvbWJpbmVkIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICB9LCBnZW5pZVN1Z2dlc3Rpb25EZWZhdWx0cyk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gYmFja2luZyB0aGUgYC9yb3V0ZS9mZWVkYmFja2Agcm91dGUuIFJ1bnMgaW5zaWRlIHRoZVxuICAgKiBBcHBLaXQgdXNlci1jb250ZXh0IHByb3h5IHNvIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlXG4gICAqIE9CTy1zY29wZWQgY2xpZW50IGFuZCB0aGUgYXNzZXNzbWVudCBpcyBhdHRyaWJ1dGVkIHRvIHRoZSBzaWduZWQtaW5cbiAgICogdXNlciAodGhlaXIgZW1haWwgLyBpZCBhcyB0aGUgYXNzZXNzbWVudCBzb3VyY2UpLiBSZXR1cm5zIHRoZVxuICAgKiBjcmVhdGVkIGFzc2Vzc21lbnQgaWQgb24gc3VjY2Vzcywgb3IgYHVuZGVmaW5lZGAgb24gYSBzb2Z0IGZhaWx1cmVcbiAgICogKHNlZSB7QGxpbmsgbG9nRmVlZGJhY2t9IGluIGAuL21sZmxvdy5qc2ApLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2dGZWVkYmFjayhcbiAgICBmZWVkYmFjazogTWFzdHJhRmVlZGJhY2tSZXF1ZXN0LFxuICApOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxzdHJpbmcgfCB1bmRlZmluZWQ+PiB7XG4gICAgY29uc3QgY3R4ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICAgIGNvbnN0IHNvdXJjZUlkID1cbiAgICAgIFwidXNlckVtYWlsXCIgaW4gY3R4ICYmIGN0eC51c2VyRW1haWxcbiAgICAgICAgPyBjdHgudXNlckVtYWlsXG4gICAgICAgIDogXCJ1c2VySWRcIiBpbiBjdHhcbiAgICAgICAgICA/IGN0eC51c2VySWRcbiAgICAgICAgICA6IGN0eC5zZXJ2aWNlVXNlcklkO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoXG4gICAgICAoKSA9PlxuICAgICAgICBsb2dGZWVkYmFjayhjdHguY2xpZW50LCB7XG4gICAgICAgICAgLi4uZmVlZGJhY2ssXG4gICAgICAgICAgLi4uKHNvdXJjZUlkID8geyBzb3VyY2VJZCB9IDoge30pLFxuICAgICAgICB9KSxcbiAgICAgIGZlZWRiYWNrV3JpdGVEZWZhdWx0cyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIGJhY2tpbmcgdGhlIGBkYXRhYCBlbWJlZCByZXNvbHZlclxuICAgKiAoYEdFVCAvZW1iZWQvZGF0YS86aWRgKS4gUnVucyBpbnNpZGUgdGhlIEFwcEtpdCB1c2VyLWNvbnRleHQgcHJveHkgc29cbiAgICogYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgcmV0dXJucyB0aGUgT0JPLXNjb3BlZCB3b3Jrc3BhY2VcbiAgICogY2xpZW50LCB0aGVuIHJldXNlcyB0aGUgc2FtZSBgZmV0Y2hTdGF0ZW1lbnREYXRhYCBwaXBlbGluZVxuICAgKiB0aGUgYGdldF9zdGF0ZW1lbnRgIHRvb2wgcnVucyBzbyB0aGUgTExNIGFuZCB0aGUgVUkgc2VlIHRoZVxuICAgKiBleGFjdCBzYW1lIHNoYXBlIGZvciB0aGUgc2FtZSBzdGF0ZW1lbnQuXG4gICAqXG4gICAqIFJlc29sdmVzIHRvIGB1bmRlZmluZWRgIGRhdGEgZm9yIHVwc3RyZWFtIDQwNHMgc28gdGhlIHJvdXRlIGNhbiBtYXAgdGhlbVxuICAgKiB0byBhIGNsZWFuIEhUVFAgNDA0OyBhbnkgb3RoZXIgZmFpbHVyZSBjb21lcyBiYWNrIGFzIGEgbm9uLWBva2AgcmVzdWx0XG4gICAqIGNhcnJ5aW5nIHRoZSBzdGF0dXMgdG8gYW5zd2VyIHdpdGguXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoU3RhdGVtZW50KFxuICAgIHN0YXRlbWVudElkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogeyBsaW1pdD86IG51bWJlcjsgc2lnbmFsPzogQWJvcnRTaWduYWwgfSA9IHt9LFxuICApOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxTdGF0ZW1lbnREYXRhIHwgdW5kZWZpbmVkPj4ge1xuICAgIGNvbnN0IGNsaWVudCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQ7XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLm1pbihvcHRpb25zLmxpbWl0ID8/IFNUQVRFTUVOVF9ST1dfQ0FQLCBTVEFURU1FTlRfUk9XX0NBUCk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShcbiAgICAgIGFzeW5jIChleGVjdXRlU2lnbmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkID0gYXN5bmNVdGlscy5jb21iaW5lQWJvcnRTaWduYWxzKG9wdGlvbnMuc2lnbmFsLCBleGVjdXRlU2lnbmFsKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgZmV0Y2hTdGF0ZW1lbnREYXRhKGNsaWVudCwgc3RhdGVtZW50SWQsIHtcbiAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgLi4uKGNvbWJpbmVkID8geyBzaWduYWw6IGNvbWJpbmVkIH0gOiB7fSksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbHVtbnM6IGRhdGEuY29sdW1ucyxcbiAgICAgICAgICAgIHJvd3M6IGRhdGEucm93cyxcbiAgICAgICAgICAgIHJvd0NvdW50OiBkYXRhLnJvd0NvdW50LFxuICAgICAgICAgICAgdHJ1bmNhdGVkOiBkYXRhLnJvd3MubGVuZ3RoIDwgZGF0YS5yb3dDb3VudCxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAvLyBUaGUgRGF0YWJyaWNrcyBTREsgdGhyb3dzIG9uIDQwNDsgc3VyZmFjZSBhcyBgdW5kZWZpbmVkYFxuICAgICAgICAgIC8vIHNvIHRoZSByb3V0ZSBtYXBzIHRvIGEgY2xlYW4gSFRUUCA0MDQgaW5zdGVhZCBvZiBhIDUwMC5cbiAgICAgICAgICBpZiAoZXJyb3JVdGlscy5lcnJvckNvbnRleHQoZXJyKS5ub3RBY2Nlc3NpYmxlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIC4uLnN0YXRlbWVudERhdGFEZWZhdWx0cy5kZWZhdWx0LFxuICAgICAgICAgIC8vIE5hbWVzcGFjZWQgc28gdGhlIGtleSBjYW4ndCBjb2xsaWRlIHdpdGggYW5vdGhlciBjYWNoZSBzaGFyaW5nIHRoZVxuICAgICAgICAgIC8vIG1hbmFnZXIsIGFuZCBrZXllZCBvbiBgbGltaXRgIGJlY2F1c2UgdGhlIHNsaWNlIGlzIHBhcnQgb2YgdGhlXG4gICAgICAgICAgLy8gcGF5bG9hZC5cbiAgICAgICAgICBjYWNoZToge1xuICAgICAgICAgICAgLi4uc3RhdGVtZW50RGF0YURlZmF1bHRzLmRlZmF1bHQuY2FjaGUsXG4gICAgICAgICAgICBjYWNoZUtleTogW1NUQVRFTUVOVF9DQUNIRV9OQU1FU1BBQ0UsIHN0YXRlbWVudElkLCBsaW1pdF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBiYWNraW5nIHRoZSBgY2hhcnRgIGVtYmVkIHJlc29sdmVyXG4gICAqIChgR0VUIC9lbWJlZC9jaGFydC86aWRgKS4gUnVucyBpbnNpZGUgdGhlIEFwcEtpdCB1c2VyLWNvbnRleHQgcHJveHkgc28gdGhlXG4gICAqIGxvb2t1cCBpcyBuYW1lc3BhY2VkIHRvIHRoZSBjYWxsaW5nIGlkZW50aXR5OiBhIGNoYXJ0IG1pbnRlZCBmb3IgYW5vdGhlclxuICAgKiB1c2VyIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW4gdW5rbm93biBpZCwgYW5kIHRoZSByb3V0ZSBhbnN3ZXJzIDQwNC5cbiAgICpcbiAgICogVGhlIGtleSBpcyBidWlsdCBmcm9tIHtAbGluayBhdHRyaWJ1dGVkVXNlcklkfSAtIHRoZSBzYW1lIHJ1bGUgdGhhdCBuYW1lZFxuICAgKiB0aGUgaWRlbnRpdHkgdGhlIGNoYXJ0IHdhcyB3cml0dGVuIHVuZGVyIC0gcmF0aGVyIHRoYW4gZnJvbSB0aGUgYW1iaWVudFxuICAgKiBleGVjdXRpb24gY29udGV4dCBhbG9uZS4gSW4gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIHRoZSBhbWJpZW50IGNvbnRleHQgaXNcbiAgICogdGhlIFNQIGZvciBldmVyeSBjYWxsZXIsIHNvIGtleWluZyBvZmYgaXQgYWxvbmUgbWlzc2VkIGV2ZXJ5IGNoYXJ0IHRoZVxuICAgKiB0dXJuIGhhZCB3cml0dGVuIHVuZGVyIHRoZSBmb3J3YXJkZWQgdXNlciBhbmQgdGhlIFVJIHNob3dlZCBlYWNoIG9uZSBhc1xuICAgKiBleHBpcmVkLiBgcmVxYCBpcyByZWFkIGluc2lkZSB0aGUgbWV0aG9kLCBub3QgYXQgdGhlIGNhbGwgc2l0ZSwgc28gdGhlXG4gICAqIGV4ZWN1dGlvbiBjb250ZXh0IGlzIHRoZSBzY29wZWQgb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaENoYXJ0RW50cnkoXG4gICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgY2hhcnRJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgdGltZW91dE1zPzogbnVtYmVyOyBzaWduYWw6IEFib3J0U2lnbmFsIH0sXG4gICk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PENoYXJ0IHwgdW5kZWZpbmVkPj4ge1xuICAgIGNvbnN0IHVzZXJLZXkgPSBhdHRyaWJ1dGVkVXNlcklkKGdldEV4ZWN1dGlvbkNvbnRleHQoKSwgcmVxdWVzdFVzZXJJZChyZXEpKTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFxuICAgICAgKGV4ZWN1dGVTaWduYWwpID0+XG4gICAgICAgIGZldGNoQ2hhcnQoY2hhcnRJZCwge1xuICAgICAgICAgIHVzZXJLZXksXG4gICAgICAgICAgLi4uKG9wdGlvbnMudGltZW91dE1zICE9PSB1bmRlZmluZWQgPyB7IHRpbWVvdXRNczogb3B0aW9ucy50aW1lb3V0TXMgfSA6IHt9KSxcbiAgICAgICAgICBzaWduYWw6IGFzeW5jVXRpbHMuY29tYmluZUFib3J0U2lnbmFscyhvcHRpb25zLnNpZ25hbCwgZXhlY3V0ZVNpZ25hbCkgPz8gb3B0aW9ucy5zaWduYWwsXG4gICAgICAgIH0pLFxuICAgICAgY2hhcnRGZXRjaERlZmF1bHRzLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gYmFja2luZyB0aGUgYC9tb2RlbHNgIHJvdXRlLiBSdW5zIGluc2lkZSB0aGUgQXBwS2l0XG4gICAqIHVzZXItY29udGV4dCBwcm94eSBzbyBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYCByZXR1cm5zIHRoZSBPQk8tc2NvcGVkXG4gICAqIGNsaWVudCBhbmQgdGhlIGNhdGFsb2d1ZSByZWZsZWN0cyB3aGF0IHRoZSBjYWxsZXIgY2FuIGludm9rZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbGlzdE1vZGVsc1Jlc3VsdCgpOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+PiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICAgICAgY29uc3QgY2xpZW50ID0gY29udGV4dC5jbGllbnQ7XG4gICAgICBjb25zdCBjYWNoZUlkZW50aXR5ID0gZXhlY3V0aW9uQ29udGV4dFVzZXJJZChjb250ZXh0KTtcbiAgICAgIGNvbnN0IGhvc3QgPSAoYXdhaXQgY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBzZXJ2aW5nID0gcmVzb2x2ZVNlcnZpbmdDb25maWcodGhpcy5jb25maWcpO1xuICAgICAgcmV0dXJuIG1vZGVsQ2F0YWxvZy5saXN0U2VydmluZ0VuZHBvaW50cyhjbGllbnQsIGhvc3QsIHtcbiAgICAgICAgdHRsTXM6IHNlcnZpbmcudHRsTXMsXG4gICAgICAgIGNhY2hlSWRlbnRpdHksXG4gICAgICB9KTtcbiAgICB9LCBtb2RlbENhdGFsb2d1ZURlZmF1bHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBiYWNraW5nIHRoZSBgbGlzdE1vZGVsc2AgZXhwb3J0LiBUaGUgcHJvZ3JhbW1hdGljIHN1cmZhY2VcbiAgICogY2FycmllcyBubyBzdGF0dXMgY29kZSwgc28gYSBmYWlsZWQgZXhlY3V0aW9uIGJlY29tZXMgYSB0aHJvdyB3aXRoIGFcbiAgICogc3RhYmxlIG1lc3NhZ2U7IHRoZSByb3V0ZXMgYnJhbmNoIG9uIHRoZSB7QGxpbmsgRXhlY3V0aW9uUmVzdWx0fSBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsaXN0TW9kZWxzKCk6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5saXN0TW9kZWxzUmVzdWx0KCk7XG4gICAgaWYgKHJlc3VsdC5vaykgcmV0dXJuIHJlc3VsdC5kYXRhO1xuICAgIHRoaXMubG9nZ2VyLndhcm4oXCJsaXN0TW9kZWxzOmVycm9yXCIsIHtcbiAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcbiAgICAgIGVycm9yOiByZXN1bHQubWVzc2FnZSxcbiAgICB9KTtcbiAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoTU9ERUxfQ0FUQUxPR1VFX0ZBSUxFRF9NRVNTQUdFKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRBZ2VudEFuZFNlcnZlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBQZXItYWdlbnQgbWVtb3J5IGZhY3RvcnkuIFdoZW4gYW55IHN0b3JhZ2UgLyBtZW1vcnkgc2V0dGluZyBuZWVkc1xuICAgIC8vIFBvc3RncmVzLCBzdGFuZCB1cCBhIGRlZGljYXRlZCBzZXJ2aWNlLXByaW5jaXBhbCBwb29sIGZpcnN0IHNvXG4gICAgLy8gbWVtb3J5IGFjdHMgYXMgdGhlIGFwcCBTUCAob3duZXIgb2YgdGhlIGBtYXN0cmFfKmAgc2NoZW1hcyksXG4gICAgLy8gbmV2ZXIgdGhlIHBlci1yZXF1ZXN0IE9CTyBpZGVudGl0eSB0aGUgY2hhdCB0dXJuIHJ1bnMgdW5kZXIuXG4gICAgLy8gYGdldFBnQ29uZmlnKClgIGlzIHJlYWQgaGVyZSwgb3V0c2lkZSBhbnkgYGFzVXNlcmAgc2NvcGUsIHNvIGl0XG4gICAgLy8gcmV0dXJucyB0aGUgU1AgY29ubmVjdGlvbiB0YXJnZXQgKyB0b2tlbiByZWZyZXNoIHBsdXMgYW55XG4gICAgLy8gYGxha2ViYXNlKHsgcG9vbCB9KWAgb3ZlcnJpZGVzOyBgcmVxdWlyZWAgdHVybnMgYSBtaXNzaW5nXG4gICAgLy8gc2libGluZyBpbnRvIGEgY2xlYXIgd2lyaW5nIGVycm9yLiBUaGUgYnVpbGRlciBjYWNoZXMgdGhlIHNoYXJlZFxuICAgIC8vIGBQZ1ZlY3RvcmAgc2luZ2xldG9uIHNvIHJlZ2lzdGVyaW5nIE4gYWdlbnRzIHN0YXlzIGNoZWFwLiBTZWVcbiAgICAvLyBgLi9tZW1vcnkuanNgLlxuICAgIGlmIChuZWVkc0xha2ViYXNlKHRoaXMuY29uZmlnKSkge1xuICAgICAgY29uc3Qgc3BQZ0NvbmZpZyA9IHBsdWdpblJlZ2lzdHJ5XG4gICAgICAgIC5yZXF1aXJlKHRoaXMuY29udGV4dCwgbGFrZWJhc2UsIHRoaXMuY29uZmlnKVxuICAgICAgICAuZXhwb3J0cygpXG4gICAgICAgIC5nZXRQZ0NvbmZpZygpO1xuICAgICAgdGhpcy5zZXJ2aWNlUHJpbmNpcGFsUG9vbCA9IGF3YWl0IGNyZWF0ZVNlcnZpY2VQcmluY2lwYWxQb29sKHNwUGdDb25maWcpO1xuICAgIH1cbiAgICBjb25zdCBtZW1vcnlCdWlsZGVyID0gdGhpcy5zZXJ2aWNlUHJpbmNpcGFsUG9vbFxuICAgICAgPyBjcmVhdGVNZW1vcnlCdWlsZGVyKHRoaXMuY29uZmlnLCB0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBCdWlsZCBldmVyeSBhZ2VudCBkZWNsYXJlZCBpbiBgY29uZmlnLmFnZW50c2AgKG9yIHRoZSBidWlsdC1pblxuICAgIC8vIGZhbGxiYWNrIHdoZW4gbm9uZSBhcmUgZGVjbGFyZWQpLiBFYWNoIGFnZW50J3MgYG1vZGVsYCByZXNvbHZlc1xuICAgIC8vIHdvcmtzcGFjZSBVUkwgKyBiZWFyZXIgYXQgY2FsbCB0aW1lIHNvIGNvbmN1cnJlbnQgcmVxdWVzdHMgZ2V0XG4gICAgLy8gZGlzdGluY3QgdXNlciBpZGVudGl0aWVzOyB0aGUgYGFzVXNlcihyZXEpYCBzY29wZSBhcm91bmRcbiAgICAvLyBgaGFuZGxlQ2hhdGAgaXMgd2hhdCBsZXRzIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybiB0aGVcbiAgICAvLyByaWdodCB1c2VyIGluc2lkZSB0aGUgcmVzb2x2ZXIuXG4gICAgLy8gTWF0ZXJpYWxpemUgYW55IHJlbW90ZSBBZ2VudC1Ta2lsbCBzb3VyY2VzIE9OQ0UgYXQgc3RhcnR1cC4gUnVuc1xuICAgIC8vIG91dHNpZGUgYSByZXF1ZXN0IHNjb3BlLCBzbyBpdCB1c2VzIHRoZSBhcHAgc2VydmljZSBwcmluY2lwYWwncyBjbGllbnRcbiAgICAvLyBhbmQgZGVmYXVsdHMgdG8gdGhlIHNoYXJlZCB3b3Jrc3BhY2UgQXNzaXN0YW50IHNraWxscyB0cmVlOyBhIHNvdXJjZVxuICAgIC8vIHRoYXQgbGFuZHMgb24gYSBsb2NhbCB0ZW1wIGRpciAobm8gd3JpdGFibGUgd29ya3NwYWNlKSBpcyBmb2xkZWQgaW50b1xuICAgIC8vIGV2ZXJ5IGRlZmF1bHQtd29ya3NwYWNlIGFnZW50IHZpYSBgZXh0cmFTa2lsbFBhdGhzYC5cbiAgICBjb25zdCBwcm92aXNpb25lZCA9IGF3YWl0IHByb3Zpc2lvblJlbW90ZVNraWxscyh0aGlzLmNvbmZpZy5yZW1vdGVTa2lsbHMpO1xuICAgIGlmIChwcm92aXNpb25lZC5za2lsbE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oXCJyZW1vdGUgc2tpbGxzIGNvbmZpZ3VyZWRcIiwge1xuICAgICAgICBza2lsbHM6IHByb3Zpc2lvbmVkLnNraWxsTmFtZXMsXG4gICAgICAgIGRhdGFicmlja3NCYXNlUGF0aDogcHJvdmlzaW9uZWQuZGF0YWJyaWNrc0Jhc2VQYXRoLFxuICAgICAgICBsb2NhbFNraWxsUGF0aHM6IHByb3Zpc2lvbmVkLmxvY2FsU2tpbGxQYXRocy5sZW5ndGgsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmJ1aWx0ID0gYXdhaXQgYnVpbGRBZ2VudHMoe1xuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIGNvbnRleHQ6IHRoaXMuY29udGV4dCxcbiAgICAgIG1lbW9yeUJ1aWxkZXIsXG4gICAgICBsb2c6IHRoaXMubG9nZ2VyLFxuICAgICAgZXh0cmFTa2lsbFBhdGhzOiBwcm92aXNpb25lZC5sb2NhbFNraWxsUGF0aHMsXG4gICAgfSk7XG5cbiAgICAvLyBgbWFzdHJhLnNlcnZlci5hcGlSb3V0ZXNgIGlzIG9ubHkgaG9ub3JlZCBieSBNYXN0cmEncyBzdGFuZGFsb25lXG4gICAgLy8gZGV2IHNlcnZlci4gU2luY2Ugd2UncmUgaG9zdGluZyBNYXN0cmEgaW5zaWRlIG91ciBvd24gRXhwcmVzc1xuICAgIC8vIHN1YmFwcCB2aWEgYEBtYXN0cmEvZXhwcmVzc2AsIGN1c3RvbSByb3V0ZXMgbXVzdCBiZSBwYXNzZWQgdG9cbiAgICAvLyB0aGUgYE1hc3RyYVNlcnZlcmAgY29uc3RydWN0b3IgZGlyZWN0bHkuXG4gICAgLy9cbiAgICAvLyBgc3RvcmFnZWAgaGVyZSBpcyAqTWFzdHJhLWluc3RhbmNlLWxldmVsKiBhbmQgcGVyc2lzdHMgd29ya2Zsb3dcbiAgICAvLyBzbmFwc2hvdHMgKHdoZXJlIHN1c3BlbmRlZCBgcmVxdWlyZUFwcHJvdmFsYCB0b29sIGNhbGxzIGxpdmUpLlxuICAgIC8vIEl0J3Mgc2VwYXJhdGUgZnJvbSBlYWNoIGFnZW50J3MgYE1lbW9yeS5zdG9yYWdlYCwgd2hpY2ggb25seVxuICAgIC8vIGNvdmVycyB0aHJlYWQgLyBtZXNzYWdlIGhpc3RvcnkuIFdpdGhvdXQgaXQsXG4gICAgLy8gYGFnZW50LnJlc3VtZVN0cmVhbSgpYCBlcnJvcnMgd2l0aCBcImNvdWxkIG5vdCBmaW5kIGEgc3VzcGVuZGVkXG4gICAgLy8gcnVuXCIgYW5kIHRoZSBhcHByb3ZhbCBVSSBoYW5ncyBhZnRlciB0aGUgdXNlciBjbGlja3MgQXBwcm92ZS5cbiAgICBjb25zdCBpbnN0YW5jZVN0b3JhZ2UgPSBtZW1vcnlCdWlsZGVyPy5pbnN0YW5jZVN0b3JhZ2UoKTtcbiAgICAvLyBXaXJlIE1hc3RyYSdzIHRyYWNlciBpbnRvIEFwcEtpdCdzIGdsb2JhbCBPVGVsIHBpcGVsaW5lIHZpYVxuICAgIC8vIGBAbWFzdHJhL290ZWwtYnJpZGdlYC4gTWFzdHJhIHNwYW5zIGJlY29tZSBuYXRpdmUgT1RlbCBzcGFucyBvblxuICAgIC8vIHdoYXRldmVyIHRyYWNlciBwcm92aWRlciBgVGVsZW1ldHJ5TWFuYWdlcmAgcmVnaXN0ZXJlZCBkdXJpbmdcbiAgICAvLyBgY3JlYXRlQXBwYCwgc28gdGhlIE9UTFAgZW5kcG9pbnQgLyBoZWFkZXJzIC8gc2FtcGxpbmcgYXJlXG4gICAgLy8gZW52LWRyaXZlbiBhbmQgc2hhcmVkIHdpdGggZXZlcnkgb3RoZXIgQXBwS2l0IHBsdWdpbi5cbiAgICBjb25zdCBvYnNlcnZhYmlsaXR5ID0gYXdhaXQgYnVpbGRPYnNlcnZhYmlsaXR5KHtcbiAgICAgIHNlcnZpY2VOYW1lOiB0aGlzLm5hbWUsXG4gICAgICBlbmFibGVkOiB0aGlzLmNvbmZpZy5vYnNlcnZhYmlsaXR5LFxuICAgIH0pO1xuICAgIC8vIE9wdGlvbmFsIE1DUCBleHBvc3VyZTogYnVpbGQgYSBNYXN0cmEgTUNQIHNlcnZlciBmcm9tIHRoZVxuICAgIC8vIHJlZ2lzdGVyZWQgYWdlbnRzIChhbmQsIG9wdC1pbiwgdGhlIGFtYmllbnQgdG9vbHMpIGFuZCByZWdpc3RlclxuICAgIC8vIGl0IG9uIHRoZSBNYXN0cmEgaW5zdGFuY2UuIGBAbWFzdHJhL2V4cHJlc3NgIHNlcnZlcyB0aGUgc3RvY2sgTUNQXG4gICAgLy8gdHJhbnNwb3J0IHJvdXRlcyAoYC9tY3AvPHNlcnZlcklkPi8uLi5gKSBvZmYgYG1jcFNlcnZlcnNgLCBzbyB0aGVcbiAgICAvLyBjYXRjaC1hbGwgZGlzcGF0Y2ggYmVsb3cgYWxyZWFkeSByb3V0ZXMgTUNQIHJlcXVlc3RzIHVuZGVyIE9CTyAtXG4gICAgLy8gbm8gYmVzcG9rZSByb3V0ZSBuZWVkZWQuIFNlZSBgLi9tY3AuanNgLlxuICAgIHRoaXMubWNwID0gYnVpbGRNY3BTZXJ2ZXIoe1xuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIHBsdWdpbk5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGRpc3BsYXlOYW1lOiBNYXN0cmFQbHVnaW4ubWFuaWZlc3QuZGlzcGxheU5hbWUsXG4gICAgICBhZ2VudHM6IHRoaXMuYnVpbHQuYWdlbnRzLFxuICAgICAgYW1iaWVudFRvb2xzOiB0aGlzLmJ1aWx0LmFtYmllbnRUb29scyxcbiAgICB9KTtcbiAgICB0aGlzLm1hc3RyYSA9IG5ldyBNYXN0cmEoe1xuICAgICAgYWdlbnRzOiB0aGlzLmJ1aWx0LmFnZW50cyxcbiAgICAgIC4uLihpbnN0YW5jZVN0b3JhZ2UgPyB7IHN0b3JhZ2U6IGluc3RhbmNlU3RvcmFnZSB9IDoge30pLFxuICAgICAgLi4uKG9ic2VydmFiaWxpdHkgPyB7IG9ic2VydmFiaWxpdHkgfSA6IHt9KSxcbiAgICAgIC4uLih0aGlzLm1jcCA/IHsgbWNwU2VydmVyczogeyBbdGhpcy5tY3Auc2VydmVySWRdOiB0aGlzLm1jcC5zZXJ2ZXIgfSB9IDoge30pLFxuICAgIH0pO1xuICAgIHRoaXMubWFzdHJhQXBwID0gZXhwcmVzcygpO1xuICAgIGF0dGFjaFJvdXRlUGF0Y2hNaWRkbGV3YXJlKHRoaXMubWFzdHJhQXBwKTtcbiAgICAvLyBTdGFtcCBjaGF0IHJlcXVlc3QvcmVzcG9uc2Ugb250byB0aGUgSFRUUCByb290IHNwYW4gc28gTUxmbG93J3NcbiAgICAvLyBVQyBgKl90cmFjZV91bmlmaWVkYCB2aWV3IGNhbiBzdXJmYWNlIHRoZW0gKE1hc3RyYSdzIG93blxuICAgIC8vIGBtYXN0cmEuYWdlbnRfcnVuLipgIGF0dHJpYnV0ZXMgc2l0IG9uIGEgY2hpbGQgc3BhbiB0aGUgdmlld1xuICAgIC8vIG5ldmVyIHJlYWRzKS4gTXVzdCBydW4gYmVmb3JlIGBNYXN0cmFTZXJ2ZXIuaW5pdGAgc28gdGhlIGxheWVyXG4gICAgLy8gc2l0cyBhaGVhZCBvZiB0aGUgYWdlbnQgcm91dGVzLlxuICAgIGF0dGFjaENoYXRUdXJuVGVsZW1ldHJ5KHRoaXMubWFzdHJhQXBwLCB7XG4gICAgICBpZGVudGl0eTogKHJlcXVlc3QpID0+XG4gICAgICAgIHVzZVNlcnZpY2VQcmluY2lwYWwodGhpcy5pZGVudGl0eU1vZGUsIHJlcXVlc3QpID8gXCJzZXJ2aWNlLXByaW5jaXBhbFwiIDogXCJvYm9cIixcbiAgICB9KTtcbiAgICB0aGlzLm1hc3RyYVNlcnZlciA9IG5ldyBNYXN0cmFTZXJ2ZXIodGhpcy5jb25maWcsIHtcbiAgICAgIGFwcDogdGhpcy5tYXN0cmFBcHAsXG4gICAgICBtYXN0cmE6IHRoaXMubWFzdHJhLFxuICAgICAgcHJlZml4OiBcIlwiLFxuICAgICAgY3VzdG9tQXBpUm91dGVzOiBhZ2VudENoYXRSb3V0ZXMoKSxcbiAgICB9KTtcbiAgICBhd2FpdCB0aGlzLm1hc3RyYVNlcnZlci5pbml0KCk7XG4gICAgdGhpcy5sb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICAgIGFnZW50czogT2JqZWN0LmtleXModGhpcy5idWlsdC5hZ2VudHMpLFxuICAgICAgZGVmYXVsdEFnZW50OiB0aGlzLmJ1aWx0LmRlZmF1bHRBZ2VudElkLFxuICAgICAgYXBpQWNjZXNzOiB0aGlzLmNvbmZpZy5hcGlBY2Nlc3MgPz8gXCJzY29wZWRcIixcbiAgICAgIG1jcDogdGhpcy5tY3AgPyBgJHt0aGlzLmJhc2VQYXRofSR7dGhpcy5tY3AuaHR0cFBhdGh9YCA6IFwib2ZmXCIsXG4gICAgICBsYWtlYmFzZTogbWVtb3J5QnVpbGRlciAhPT0gdW5kZWZpbmVkLFxuICAgICAgZmVlZGJhY2s6IHRoaXMuZmVlZGJhY2tFbmFibGVkKCksXG4gICAgICBvYnNlcnZhYmlsaXR5OiBvYnNlcnZhYmlsaXR5ICE9PSB1bmRlZmluZWQgPyBcIm1sZmxvd1wiIDogXCJvZmZcIixcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVyIGZvciBvbmUgZW1iZWQgYDx0eXBlPmAgYmVoaW5kIHRoZSBnZW5lcmljXG4gKiBgR0VUIC9lbWJlZC86dHlwZS86aWRgIHJvdXRlLiBSZXR1cm5zIHRoZSBKU09OIGJvZHkgdG8gc2VuZCBvblxuICogc3VjY2Vzcywgb3IgYHVuZGVmaW5lZGAgdG8gc2lnbmFsIGEgNDA0ICh1bmtub3duIC8gZXhwaXJlZCBpZCkuXG4gKiBgc2lnbmFsYCBhYm9ydHMgd2hlbiB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzIHNvIGxvbmctcG9sbGluZ1xuICogcmVzb2x2ZXJzIChlLmcuIGBjaGFydGApIHVuYmxvY2sgaW1tZWRpYXRlbHkuXG4gKi9cbnR5cGUgRW1iZWRSZXNvbHZlciA9IChcbiAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gIGlkOiBzdHJpbmcsXG4gIHNpZ25hbDogQWJvcnRTaWduYWwsXG4pID0+IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PHVua25vd24+PjtcblxuLyoqXG4gKiBQYXJzZSB0aGUgb3B0aW9uYWwgYD90aW1lb3V0TXM9PG4+YCBxdWVyeSBwYXJhbWV0ZXIgZnJvbSBhXG4gKiBgR0VUIC9lbWJlZC9jaGFydC86aWRgIHJlcXVlc3QuIEFjY2VwdHMgYSBwb3NpdGl2ZSBpbnRlZ2VyIHVwXG4gKiB0byB7QGxpbmsgTUFYX0VNQkVEX1BPTExfVElNRU9VVF9NU30gKGNsYW1wZWQpIGFuZCByZWplY3RzIGV2ZXJ5dGhpbmcgZWxzZVxuICogYXMgYHVuZGVmaW5lZGAgc28ge0BsaW5rIGZldGNoQ2hhcnR9IGZhbGxzIGJhY2sgdG8gaXRzIGRlZmF1bHQuXG4gKiBFeHByZXNzIHByb2R1Y2VzIGBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZGA7IHdlIG5vcm1hbGl6ZVxuICogdG8gdGhlIGZpcnN0IHNjYWxhciBiZWZvcmUgcGFyc2luZy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VUaW1lb3V0TXMocmF3OiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdiA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhd1swXSA6IHJhdztcbiAgaWYgKHR5cGVvZiB2ICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBuID0gb2JqZWN0LnRvTnVtYmVyKHYpO1xuICBpZiAobiA9PT0gdW5kZWZpbmVkIHx8IG4gPD0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE1hdGgubWluKE1hdGguZmxvb3IobiksIE1BWF9FTUJFRF9QT0xMX1RJTUVPVVRfTVMpO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBvcHRpb25hbCBgP2xpbWl0PTxuPmAgcXVlcnkgcGFyYW1ldGVyIGZyb20gYVxuICogYEdFVCAvZW1iZWQvZGF0YS86aWRgIHJlcXVlc3QuIEFjY2VwdHMgYSBub24tbmVnYXRpdmVcbiAqIGludGVnZXIgYW5kIGxldHMgdGhlIHJvdXRlIGNsYW1wIHRvIGBTVEFURU1FTlRfUk9XX0NBUGA7XG4gKiByZWplY3RzIGFueXRoaW5nIGVsc2UgYXMgYHVuZGVmaW5lZGAgc28gdGhlIHJvdXRlIGZhbGxzIGJhY2tcbiAqIHRvIHRoZSBzZXJ2ZXItc2lkZSBjYXAuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3RhdGVtZW50TGltaXQocmF3OiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdiA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhd1swXSA6IHJhdztcbiAgaWYgKHR5cGVvZiB2ICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBuID0gb2JqZWN0LnRvTnVtYmVyKHYpO1xuICBpZiAobiA9PT0gdW5kZWZpbmVkIHx8IG4gPCAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gTWF0aC5mbG9vcihuKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciB0aGUgTWFzdHJhIHBsdWdpbiBvbiBhbiBBcHBLaXQgYXBwLiBNb3VudHMgdGhlIGFnZW50cywgdGhlXG4gKiBgL3JvdXRlLypgIGNoYXQgc3VyZmFjZSwgYW5kICh1bmxlc3MgZGlzYWJsZWQpIHRoZSBNQ1AgdHJhbnNwb3J0IHVuZGVyXG4gKiBgL2FwaS9tYXN0cmFgLlxuICpcbiAqIEBleGFtcGxlIE1pbmltYWwgYXBwXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY3JlYXRlQXBwIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgbWFzdHJhIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuICpcbiAqIC8vIE5vIGBhZ2VudHNgOiBhIHNpbmdsZSBidWlsdC1pbiBgZGVmYXVsdGAgYW5hbHlzdCBpcyByZWdpc3RlcmVkLCBzbyB0aGVcbiAqIC8vIGNoYXQgZW5kcG9pbnQgd29ya3Mgb3V0IG9mIHRoZSBib3guXG4gKiBjb25zdCBhcHAgPSBhd2FpdCBjcmVhdGVBcHAoeyBwbHVnaW5zOiBbbWFzdHJhKCldIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGUgVHdvIGFnZW50cywgYSBwaW5uZWQgbW9kZWwsIGFuZCBHZW5pZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgbGFrZWJhc2UgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBjcmVhdGVBZ2VudCwgbWFzdHJhIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuICpcbiAqIGNvbnN0IGFwcCA9IGF3YWl0IGNyZWF0ZUFwcCh7XG4gKiAgIHBsdWdpbnM6IFtcbiAqICAgICBsYWtlYmFzZSgpLFxuICogICAgIG1hc3RyYSh7XG4gKiAgICAgICBkZWZhdWx0TW9kZWw6IFwiZGF0YWJyaWNrcy1jbGF1ZGUtc29ubmV0LTQtNlwiLFxuICogICAgICAgZGVmYXVsdEFnZW50OiBcImFuYWx5c3RcIixcbiAqICAgICAgIGdlbmllU3BhY2VzOiB7IHNhbGVzOiB7IHNwYWNlSWQ6IFwiMDFlZi4uLlwiLCBoaW50OiBcIm9yZGVycywgcmV0dXJuc1wiIH0gfSxcbiAqICAgICAgIGFnZW50czoge1xuICogICAgICAgICBhbmFseXN0OiBjcmVhdGVBZ2VudCh7XG4gKiAgICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBcIllvdSBhbnN3ZXIgcXVlc3Rpb25zIGFib3V0IHNhbGVzLlwiLFxuICogICAgICAgICAgIGFzeW5jIHRvb2xzKHBsdWdpbnMpIHtcbiAqICAgICAgICAgICAgIHJldHVybiB7IC4uLihhd2FpdCBwbHVnaW5zLmdlbmllPy50b29sa2l0KCkpIH07XG4gKiAgICAgICAgICAgfSxcbiAqICAgICAgICAgfSksXG4gKiAgICAgICAgIGhlbHBlcjogY3JlYXRlQWdlbnQoeyBpbnN0cnVjdGlvbnM6IFwiWW91IGV4cGxhaW4gdGhlIGFuYWx5c3QncyBhbnN3ZXJzLlwiIH0pLFxuICogICAgICAgfSxcbiAqICAgICB9KSxcbiAqICAgXSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBtYXN0cmEgPSB0b1BsdWdpbihNYXN0cmFQbHVnaW4pO1xuIl19
|
|
1139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q0c7QUFFSCxPQUFPLEVBQ0wsY0FBYyxFQUNkLEtBQUssRUFDTCxtQkFBbUIsRUFDbkIsUUFBUSxFQUNSLE1BQU0sRUFDTixRQUFRLEdBS1QsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUYsT0FBTyxFQUNMLFFBQVEsRUFDUixNQUFNLEdBS1AsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUErQixNQUFNLHlCQUF5QixDQUFDO0FBRS9FLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QyxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFHOUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBb0IsTUFBTSxhQUFhLENBQUM7QUFDL0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzVDLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsc0JBQXNCLEVBQ3RCLG9CQUFvQixHQUVyQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsc0JBQXNCLEVBQ3RCLHFCQUFxQixHQUN0QixNQUFNLGVBQWUsQ0FBQztBQUN2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QUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcHBLaXQgcGx1Z2luIHRoYXQgYnVpbGRzIG9uZSBvciBtb3JlIE1hc3RyYSBgQWdlbnRgIGluc3RhbmNlcyBhbmRcbiAqIG1vdW50cyB0aGUgYEBtYXN0cmEvZXhwcmVzc2Agc2VydmVyLiBDbGllbnRzIGRyaXZlIHRoZSBjb252ZXJzYXRpb25cbiAqIG92ZXIgdGhlIHN0YW5kYXJkIE1hc3RyYSBhZ2VudCBzdHJlYW0gKGBAbWFzdHJhL2NsaWVudC1qc2Anc1xuICogYGdldEFnZW50KGlkKS5zdHJlYW0oKWApLCBzbyB0aGVyZSdzIG5vIGJlc3Bva2UgY2hhdCB0cmFuc3BvcnQgdG9cbiAqIGtlZXAgaW4gc3luYy5cbiAqXG4gKiAtIEFnZW50czogcmVnaXN0ZXJlZCB0aHJvdWdoIGBjb25maWcuYWdlbnRzYCBhdCBwbHVnaW4gY3JlYXRpb25cbiAqICAgKHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb259KS4gRWFjaCBlbnRyeSdzIGB0b29sc2AgZmllbGQgYWNjZXB0c1xuICogICBlaXRoZXIgYSBwbGFpbiByZWNvcmQgb3IgYSBgKHBsdWdpbnMpID0+IHRvb2xzYCBjYWxsYmFjayB0aGF0IGdldHNcbiAqICAgYSB0eXBlZCBzaWJsaW5nLXBsdWdpbiBpbmRleCAoe0BsaW5rIE1hc3RyYVBsdWdpbnN9KS4gT21pdFxuICogICBgY29uZmlnLmFnZW50c2AgdG8gZ2V0IGEgc2luZ2xlIGJ1aWx0LWluIGBkZWZhdWx0YCBhbmFseXN0LlxuICogLSBNb2RlbDogZWFjaCBhZ2VudCBjYWxsIHJlc29sdmVzIGEgYE1hc3RyYU1vZGVsQ29uZmlnYCB2aWFcbiAqICAge0BsaW5rIGJ1aWxkTW9kZWx9IGZyb20gYC4vbW9kZWwuanNgLiBQZXItYWdlbnQgYG1vZGVsYCBvdmVycmlkZXNcbiAqICAgKGBBZ2VudENvbmZpZ1tcIm1vZGVsXCJdYCBvciBhIGBtb2RlbElkYCBzdHJpbmcpIGZsb3cgdGhyb3VnaFxuICogICB7QGxpbmsgYnVpbGRBZ2VudHN9LlxuICogLSBNZW1vcnkgLyBzdG9yYWdlOiBwZXItYWdlbnQsIGJ1aWx0IGJ5IHtAbGluayBjcmVhdGVNZW1vcnlCdWlsZGVyfVxuICogICBmcm9tIGAuL21lbW9yeS5qc2AuIEJvdGggYXV0by1kZWZhdWx0IHRvIGB0cnVlYCB3aGVuIHRoZVxuICogICBgbGFrZWJhc2VgIHBsdWdpbiBpcyByZWdpc3RlcmVkICh1bmxlc3MgdGhlIGNhbGxlciBwYXNzZWRcbiAqICAgYGZhbHNlYCBvciBhIGN1c3RvbSBjb25maWcpLiBTdG9yYWdlIG5hbWVzcGFjZXMgcGVyIGFnZW50IHZpYVxuICogICB7QGxpbmsgYWdlbnRTdG9yYWdlU2NoZW1hTmFtZX0gcGVyIGFnZW50OyB0aGUgdmVjdG9yIHN0b3JlIGlzIGEgc2luZ2xlXG4gKiAgIHNoYXJlZCBzaW5nbGV0b24gYWNyb3NzIGV2ZXJ5IGFnZW50LlxuICogLSBTZXJ2ZXI6IHRoZSBFeHByZXNzIHN1YmFwcCB3aXJpbmcgbGl2ZXMgaW4gYC4vc2VydmVyLmpzYC5cbiAqIC0gSFRUUDogQXBwS2l0IG1vdW50cyB0aGlzIHBsdWdpbiB1bmRlciBgL2FwaS9tYXN0cmFgLiBBbG9uZ3NpZGUgdGhlXG4gKiAgIE1hc3RyYSBhZ2VudCByb3V0ZXMsIHRoZSBwbHVnaW4gcmVnaXN0ZXJzIGAvcm91dGUvaGlzdG9yeWBcbiAqICAgKGxvYWQgKyBjbGVhciBhIHRocmVhZCdzIG1lc3NhZ2VzKSwgYC9yb3V0ZS90aHJlYWRzYCAobGlzdCB0aGVcbiAqICAgY2FsbGVyJ3MgY29udmVyc2F0aW9ucyArIGRlbGV0ZSBvbmUpLCBgL21vZGVsc2AsIGAvZGVmYXVsdC1tb2RlbGAsXG4gKiAgIGAvc3VnZ2VzdGlvbnNgLCBgL3JvdXRlL2ZlZWRiYWNrYCAobG9nIGEgdGh1bWJzIC8gY29tbWVudCB0byBNTGZsb3dcbiAqICAgd2hlbiBmZWVkYmFjayBpcyBlbmFibGVkKSwgYW5kIHRoZSBnZW5lcmljIGAvZW1iZWQvOnR5cGUvOmlkYFxuICogICByZXNvbHZlciBmb3IgaW5saW5lIGNoYXJ0IC8gZGF0YSBtYXJrZXJzLiBFYWNoIGlzIHJlZ2lzdGVyZWQgdGhyb3VnaFxuICogICBBcHBLaXQncyBgcm91dGUoKWAgc28gaXQgbGFuZHMgaW4gdGhlIHBsdWdpbidzIGVuZHBvaW50IG1hcCwgYW5kXG4gKiAgIGV2ZXJ5IG91dGJvdW5kIGNhbGwgb25lIG1ha2VzIHJ1bnMgdGhyb3VnaCBgZXhlY3V0ZSgpYCAoc2VlXG4gKiAgIGAuL2RlZmF1bHRzLmpzYCkuIFRoZSBzdG9jayBgQG1hc3RyYS9leHByZXNzYCBzdXJmYWNlIGlzIGdhdGVkXG4gKiAgIGJ5IGBjb25maWcuYXBpQWNjZXNzYCAoZGVmYXVsdCBgXCJzY29wZWRcImApOiBvbmx5IGFnZW50IGluZmVyZW5jZSxcbiAqICAgcmVhZC1vbmx5IGFnZW50IG1ldGFkYXRhLCB0aGUgYC9yb3V0ZS8qYCByb3V0ZXMsIGFuZCAod2hlbiBlbmFibGVkKVxuICogICBNQ1AgYXJlIGRpc3BhdGNoZWQgdG8gTWFzdHJhOyBhZG1pbiAvIG11dGF0aW5nIC8gYnVsay1leHBvcnQgcm91dGVzXG4gKiAgIGFyZSByZWZ1c2VkIHdpdGggYDQwM2AuIFNlZSB7QGxpbmsgaXNNYXN0cmFSZXF1ZXN0QWxsb3dlZH0uXG4gKiAtIE1DUDogb3B0IGluIHdpdGggYGNvbmZpZy5tY3BgIHRvIGV4cG9zZSB0aGUgYWdlbnRzIChhbmQgb3B0aW9uYWxseVxuICogICB0b29scykgYXMgYSBNYXN0cmEgYE1DUFNlcnZlcmAuIEl0IGlzIHJlZ2lzdGVyZWQgb24gdGhlIGBNYXN0cmFgXG4gKiAgIGluc3RhbmNlIHZpYSBgbWNwU2VydmVyc2AsIHNvIGBAbWFzdHJhL2V4cHJlc3NgIHNlcnZlcyB0aGUgc3RvY2tcbiAqICAgTUNQIHRyYW5zcG9ydCByb3V0ZXMgKGAvbWNwLzxzZXJ2ZXJJZD4vLi4uYCkgdW5kZXIgdGhlIG1vdW50LiBTZWVcbiAqICAgYC4vbWNwLmpzYC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgRXhlY3V0aW9uRXJyb3IsXG4gIGdlbmllLFxuICBnZXRFeGVjdXRpb25Db250ZXh0LFxuICBsYWtlYmFzZSxcbiAgUGx1Z2luLFxuICB0b1BsdWdpbixcbiAgdHlwZSBFeGVjdXRpb25SZXN1bHQsXG4gIHR5cGUgSUFwcFJvdXRlcixcbiAgdHlwZSBQbHVnaW5NYW5pZmVzdCxcbiAgdHlwZSBSZXNvdXJjZVJlcXVpcmVtZW50LFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBwbHVnaW5SZWdpc3RyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgbW9kZWxDYXRhbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmltcG9ydCB7IGFzeW5jVXRpbHMsIGVycm9yVXRpbHMsIGxvZywgb2JqZWN0LCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBmZWVkYmFjayxcbiAgcm91dGVzLFxuICB0eXBlIENoYXJ0LFxuICB0eXBlIE1hc3RyYUNsaWVudENvbmZpZyxcbiAgdHlwZSBNYXN0cmFGZWVkYmFja1JlcXVlc3QsXG4gIHR5cGUgU3RhdGVtZW50RGF0YSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHsgZGlzcGxheSwgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IEFnZW50IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHsgTWFzdHJhIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9tYXN0cmFcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSBcImV4cHJlc3NcIjtcbmltcG9ydCB0eXBlIHsgUG9vbCB9IGZyb20gXCJwZ1wiO1xuXG5pbXBvcnQgeyBidWlsZEFnZW50cywgRkFMTEJBQ0tfQUdFTlRfSUQsIHR5cGUgQnVpbHRBZ2VudHMgfSBmcm9tIFwiLi9hZ2VudHMudHNcIjtcbmltcG9ydCB7IGZldGNoQ2hhcnQgfSBmcm9tIFwiLi9jaGFydC50c1wiO1xuaW1wb3J0IHsgYWdlbnRDaGF0Um91dGVzIH0gZnJvbSBcIi4vY2hhdC50c1wiO1xuaW1wb3J0IHtcbiAgYXR0cmlidXRlZFVzZXJJZCxcbiAgZXhlY3V0aW9uQ29udGV4dFVzZXJJZCxcbiAgTUFTVFJBX0NPTkZJR19TQ0hFTUEsXG4gIHR5cGUgTWFzdHJhUGx1Z2luQ29uZmlnLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7XG4gIGNoYXJ0RmV0Y2hEZWZhdWx0cyxcbiAgZmVlZGJhY2tXcml0ZURlZmF1bHRzLFxuICBnZW5pZVN1Z2dlc3Rpb25EZWZhdWx0cyxcbiAgbW9kZWxDYXRhbG9ndWVEZWZhdWx0cyxcbiAgc3RhdGVtZW50RGF0YURlZmF1bHRzLFxufSBmcm9tIFwiLi9kZWZhdWx0cy50c1wiO1xuaW1wb3J0IHsgY29sbGVjdFNwYWNlU3VnZ2VzdGlvbnMsIHJlc29sdmVHZW5pZVNwYWNlcyB9IGZyb20gXCIuL2dlbmllLnRzXCI7XG5pbXBvcnQge1xuICByZXF1ZXN0VXNlcklkLFxuICByZXNvbHZlSWRlbnRpdHlNb2RlLFxuICB1c2VTZXJ2aWNlUHJpbmNpcGFsLFxuICB0eXBlIE1hc3RyYUlkZW50aXR5TW9kZSxcbn0gZnJvbSBcIi4vaWRlbnRpdHkudHNcIjtcbmltcG9ydCB7IGJ1aWxkTWNwU2VydmVyLCB0eXBlIFJlc29sdmVkTWNwIH0gZnJvbSBcIi4vbWNwLnRzXCI7XG5pbXBvcnQgeyBjcmVhdGVNZW1vcnlCdWlsZGVyLCBjcmVhdGVTZXJ2aWNlUHJpbmNpcGFsUG9vbCwgbmVlZHNMYWtlYmFzZSB9IGZyb20gXCIuL21lbW9yeS50c1wiO1xuaW1wb3J0IHtcbiAgbG9nRmVlZGJhY2ssXG4gIG1sZmxvd0V4cGVyaW1lbnRNYW5hZ2VyVXJsLFxuICByZXNvbHZlRmVlZGJhY2tFbmFibGVkLFxuICB2YWxpZGF0ZUZlZWRiYWNrQ29uZmlnLFxufSBmcm9tIFwiLi9tbGZsb3cudHNcIjtcbmltcG9ydCB7IHJlc29sdmVEZWZhdWx0TW9kZWxJZCB9IGZyb20gXCIuL21vZGVsLnRzXCI7XG5pbXBvcnQgeyBidWlsZE9ic2VydmFiaWxpdHksIGNvbmZpZ3VyZU90ZWxQcm9wYWdhdGlvbiB9IGZyb20gXCIuL29ic2VydmFiaWxpdHkudHNcIjtcbmltcG9ydCB7IHByb3Zpc2lvblJlbW90ZVNraWxscyB9IGZyb20gXCIuL3JlbW90ZS1za2lsbHMudHNcIjtcbmltcG9ydCB7XG4gIGF0dGFjaFJvdXRlUGF0Y2hNaWRkbGV3YXJlLFxuICBjcmVhdGVSZXF1ZXN0Q29udGV4dCxcbiAgaXNNYXN0cmFSZXF1ZXN0QWxsb3dlZCxcbiAgTWFzdHJhU2VydmVyLFxufSBmcm9tIFwiLi9zZXJ2ZXIudHNcIjtcbmltcG9ydCB7IHJlc29sdmVTZXJ2aW5nQ29uZmlnIH0gZnJvbSBcIi4vc2VydmluZy50c1wiO1xuaW1wb3J0IHsgZmV0Y2hTdGF0ZW1lbnREYXRhLCBTVEFURU1FTlRfUk9XX0NBUCB9IGZyb20gXCIuL3N0YXRlbWVudC50c1wiO1xuaW1wb3J0IHsgYXR0YWNoQ2hhdFR1cm5UZWxlbWV0cnkgfSBmcm9tIFwiLi90ZWxlbWV0cnkudHNcIjtcbmltcG9ydCB7IGludmFsaWRGaWVsZHMgfSBmcm9tIFwiLi92YWxpZGF0aW9uLnRzXCI7XG5cbmNvbnN0IEdFTklFX01BTklGRVNUID0gcGx1Z2luUmVnaXN0cnkuZGF0YShnZW5pZSkucGx1Z2luLm1hbmlmZXN0O1xuY29uc3QgTEFLRUJBU0VfTUFOSUZFU1QgPSBwbHVnaW5SZWdpc3RyeS5kYXRhKGxha2ViYXNlKS5wbHVnaW4ubWFuaWZlc3Q7XG5cbi8qKlxuICogQnVkZ2V0IGZvciBkcmFpbmluZyB0aGUgbWVtb3J5IHNlcnZpY2UtcHJpbmNpcGFsIHBvb2wgb24gc2h1dGRvd24uIFdlbGxcbiAqIGluc2lkZSBBcHBLaXQncyAxNXMgZ3JhY2VmdWwtc2h1dGRvd24gd2luZG93LCBzbyBhIHN0dWNrIGNvbm5lY3Rpb24gY2FuXG4gKiBuZXZlciBiZSB3aGF0IGhvbGRzIHRoZSBwcm9jZXNzIG9wZW4uXG4gKi9cbmNvbnN0IFBPT0xfRFJBSU5fVElNRU9VVF9NUyA9IDVfMDAwO1xuXG4vKiogQ2VpbGluZyBvbiB0aGUgYD90aW1lb3V0TXM9YCBsb25nLXBvbGwgYnVkZ2V0IGEgY2xpZW50IG1heSByZXF1ZXN0LiAqL1xuY29uc3QgTUFYX0VNQkVEX1BPTExfVElNRU9VVF9NUyA9IDUgKiA2MF8wMDA7XG5cbi8qKiBTdGFibGUgY2xpZW50IG1lc3NhZ2Ugd2hlbiB0aGUgd29ya3NwYWNlJ3MgbW9kZWwgY2F0YWxvZ3VlIGNhbid0IGJlIHJlYWQuICovXG5jb25zdCBNT0RFTF9DQVRBTE9HVUVfRkFJTEVEX01FU1NBR0UgPSBcIkNvdWxkIG5vdCByZWFkIHRoZSB3b3Jrc3BhY2UncyBtb2RlbCBjYXRhbG9ndWVcIjtcblxuLyoqIFN0YWJsZSBjbGllbnQgbWVzc2FnZSBmb3IgYSBmZWVkYmFjayBib2R5IHRoYXQgZmFpbHMgc2NoZW1hIHZhbGlkYXRpb24uICovXG5jb25zdCBJTlZBTElEX0ZFRURCQUNLX01FU1NBR0UgPSBcIkludmFsaWQgZmVlZGJhY2sgcmVxdWVzdFwiO1xuXG4vKiogQ2FjaGUgbmFtZXNwYWNlIGZvciBzdGF0ZW1lbnQgcmVzdWx0IHNldHMsIG1hdGNoaW5nIHRoZSBjaGFydCBjYWNoZSdzIGZvcm0uICovXG5jb25zdCBTVEFURU1FTlRfQ0FDSEVfTkFNRVNQQUNFID0gXCJtYXN0cmE6c3RhdGVtZW50XCI7XG5cbi8qKlxuICogQXBwS2l0IHBsdWdpbiAocmVnaXN0ZXJlZCBuYW1lOiBgbWFzdHJhYCkgdGhhdCBob3N0cyBNYXN0cmEgYWdlbnRzXG4gKiB3aXRoIG9wdGlvbmFsIExha2ViYXNlLWJhY2tlZCBtZW1vcnkgYW5kIEFJIFNESyBjaGF0IHJvdXRlcyB1bmRlclxuICogdGhlIHBsdWdpbiBtb3VudCAodHlwaWNhbGx5IGAvYXBpL21hc3RyYWApLlxuICpcbiAqIEBleGFtcGxlIFJlZ2lzdGVyIHRoZSBwbHVnaW5cbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAsIGxha2ViYXNlIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgY3JlYXRlQWdlbnQsIG1hc3RyYSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqXG4gKiAvLyBgbGFrZWJhc2VgIGZpcnN0OiByZWdpc3RlcmluZyBpdCBhdXRvLWVuYWJsZXMgTWFzdHJhIHN0b3JhZ2UgKyBtZW1vcnkuXG4gKiBjb25zdCBhcHAgPSBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgbGFrZWJhc2UoKSxcbiAqICAgICBtYXN0cmEoe1xuICogICAgICAgZ2VuaWVTcGFjZXM6IHsgZGVmYXVsdDogcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRCEgfSxcbiAqICAgICAgIGFnZW50czogY3JlYXRlQWdlbnQoe1xuICogICAgICAgICBuYW1lOiBcImFuYWx5c3RcIixcbiAqICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBcIllvdSBhbnN3ZXIgcXVlc3Rpb25zIGFib3V0IHJldmVudWUgYW5kIHJldHVybnMuXCIsXG4gKiAgICAgICAgIGFzeW5jIHRvb2xzKHBsdWdpbnMpIHtcbiAqICAgICAgICAgICByZXR1cm4geyAuLi4oYXdhaXQgcGx1Z2lucy5nZW5pZT8udG9vbGtpdCgpKSB9O1xuICogICAgICAgICB9LFxuICogICAgICAgfSksXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFJlYWQgdGhlIGFnZW50cyBiYWNrIG9mZiB0aGUgQXBwS2l0IGluc3RhbmNlXG4gKiBgYGB0c1xuICogY29uc3QgYWdlbnRJZHMgPSBhcHAubWFzdHJhLmxpc3QoKTtcbiAqIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IGFwcC5tYXN0cmEubGlzdE1vZGVscygpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBNYXN0cmFQbHVnaW4gZXh0ZW5kcyBQbHVnaW48TWFzdHJhUGx1Z2luQ29uZmlnPiB7XG4gIC8vIEFubm90YXRlZCByYXRoZXIgdGhhbiBsZWZ0IHRvIGBzYXRpc2ZpZXNgOiB0aGUgY29uZmlnIHNjaGVtYSdzIHR5cGUgY29tZXNcbiAgLy8gZnJvbSBgQHR5cGVzL2pzb24tc2NoZW1hYCwgd2hpY2ggdGhpcyBwYWNrYWdlIGRvZXMgbm90IGRlcGVuZCBvbiwgc28gYW5cbiAgLy8gaW5mZXJyZWQgbWFuaWZlc3QgdHlwZSBjYW5ub3QgYmUgbmFtZWQgaW4gdGhlIGVtaXR0ZWQgZGVjbGFyYXRpb24uIFRoZVxuICAvLyBgUGx1Z2luTWFuaWZlc3Q8XCJtYXN0cmFcIj5gIHBhcmFtZXRlciBzdGlsbCBjYXJyaWVzIHRoZSBsaXRlcmFsIG5hbWUgaW50b1xuICAvLyBgdG9QbHVnaW4oKWAncyBmYWN0b3J5IHR5cGUuXG4gIHN0YXRpYyBtYW5pZmVzdDogUGx1Z2luTWFuaWZlc3Q8XCJtYXN0cmFcIj4gPSB7XG4gICAgbmFtZTogXCJtYXN0cmFcIixcbiAgICBkaXNwbGF5TmFtZTogXCJNYXN0cmFcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiQnVpbGRzIGEgTWFzdHJhIEFnZW50IHdpdGggdXNlci1zY29wZWQgd29ya3NwYWNlIGF1dGggKGFzVXNlcikgXCIgK1xuICAgICAgXCJhbmQgb3B0aW9uYWwgUG9zdGdyZXMtYmFja2VkIE1hc3RyYSBNZW1vcnkgdmlhIHRoZSBgbGFrZWJhc2VgIHBsdWdpbi5cIixcbiAgICBzdGFiaWxpdHk6IFwiYmV0YVwiLFxuICAgIHJlc291cmNlczoge1xuICAgICAgcmVxdWlyZWQ6IFtdLFxuICAgICAgb3B0aW9uYWw6IFtcbiAgICAgICAgLy8gUmV1c2UgdGhlIEdlbmllIHNwYWNlLWlkIGJpbmRpbmcgZGVjbGFyZWQgYnkgQXBwS2l0J3MgYGdlbmllYFxuICAgICAgICAvLyBtYW5pZmVzdCBzbyB0aGUgcmVzb3VyY2UtYmluZGluZyBzaGFwZSBpcyBpZGVudGljYWwgdG8gQXBwS2l0J3MgYW5kXG4gICAgICAgIC8vIGFuIGV4aXN0aW5nIGBhcHAueWFtbGAgLyBgZ2VuaWUoeyBzcGFjZXMgfSlgIHdpcmluZyBrZWVwcyB3b3JraW5nLlxuICAgICAgICAvLyBUaGUgYnVpbHQtaW4gR2VuaWUgdG9vbHMgdGFsayB0byBHZW5pZSBkaXJlY3RseSB0aHJvdWdoXG4gICAgICAgIC8vIGBAZGJ4LXRvb2xzL2dlbmllYCwgc28gb25seSB0aGUgYmluZGluZyBpcyBzaGFyZWQsIG5vdCB0aGUgcGx1Z2luJ3NcbiAgICAgICAgLy8gdG9vbHMuXG4gICAgICAgIC4uLkdFTklFX01BTklGRVNULnJlc291cmNlcy5yZXF1aXJlZCxcbiAgICAgICAgLi4uTEFLRUJBU0VfTUFOSUZFU1QucmVzb3VyY2VzLnJlcXVpcmVkLFxuICAgICAgXSxcbiAgICB9LFxuICAgIGNvbmZpZzogeyBzY2hlbWE6IE1BU1RSQV9DT05GSUdfU0NIRU1BIH0sXG4gIH07XG5cbiAgLyoqXG4gICAqIFRpZ2h0ZW4gcmVzb3VyY2UgcmVxdWlyZW1lbnRzIGJhc2VkIG9uIHdoaWNoIGZlYXR1cmVzIGFyZSBlbmFibGVkLlxuICAgKiBBcHBLaXQgY2FsbHMgdGhpcyBhdCByZWdpc3RyYXRpb24gdGltZSAoY29uZmlnLWF3YXJlKSBzbyBkaXNhYmxlZFxuICAgKiBmZWF0dXJlcyBkb24ndCBzdXJmYWNlIHRoZWlyIHJlc291cmNlIGFza3MgdG8gdGhlIGhvc3QgYXBwLlxuICAgKi9cbiAgc3RhdGljIGdldFJlc291cmNlUmVxdWlyZW1lbnRzKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogUmVzb3VyY2VSZXF1aXJlbWVudFtdIHtcbiAgICBjb25zdCByZXNvdXJjZXM6IFJlc291cmNlUmVxdWlyZW1lbnRbXSA9IFtdO1xuICAgIGNvbnN0IGVuYWJsZWRNYW5pZmVzdHM6IFBsdWdpbk1hbmlmZXN0PHN0cmluZz5bXSA9IFtdO1xuXG4gICAgaWYgKG5lZWRzTGFrZWJhc2UoY29uZmlnKSkge1xuICAgICAgZW5hYmxlZE1hbmlmZXN0cy5wdXNoKExBS0VCQVNFX01BTklGRVNUKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtIG9mIGVuYWJsZWRNYW5pZmVzdHMpIHtcbiAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgbS5yZXNvdXJjZXMucmVxdWlyZWQpIHtcbiAgICAgICAgcmVzb3VyY2VzLnB1c2goeyAuLi5yZXNvdXJjZSwgcmVxdWlyZWQ6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXNvdXJjZXM7XG4gIH1cblxuICBwcml2YXRlIGxvZ2dlciA9IGxvZy5sb2dnZXIodGhpcyk7XG4gIHByaXZhdGUgYnVpbHQ6IEJ1aWx0QWdlbnRzIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWFzdHJhOiBNYXN0cmEgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtYXN0cmFBcHA6IGV4cHJlc3MuRXhwcmVzcyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1hc3RyYVNlcnZlcjogTWFzdHJhU2VydmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgb3B0aW9uYWwgTUNQIHNlcnZlciBleHBvc2luZyB0aGlzIHBsdWdpbidzIGFnZW50cyAvIHRvb2xzLCBvclxuICAgKiBgbnVsbGAgd2hlbiBgY29uZmlnLm1jcGAgaXMgZGlzYWJsZWQgKHRoZSBkZWZhdWx0KS4gQnVpbHQgaW5cbiAgICoge0BsaW5rIGJ1aWxkQWdlbnRBbmRTZXJ2ZXJ9IGFuZCByZWdpc3RlcmVkIG9uIHRoZSBNYXN0cmEgaW5zdGFuY2UuXG4gICAqL1xuICBwcml2YXRlIG1jcDogUmVzb2x2ZWRNY3AgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFJlc29sdmVkIHtAbGluayBNYXN0cmFJZGVudGl0eU1vZGV9OiB0aGUgaWRlbnRpdHkgdGhlIGNoYXQgcGF0aCdzIERhdGFicmlja3NcbiAgICogY2FsbHMgcnVuIGFzLiBSZWFkIG9uY2UgYXQgc2V0dXAgc28gYW4gaW52YWxpZCBgZ2VuaWVJZGVudGl0eWAgZmFpbHMgdGhlIGFwcFxuICAgKiBib290IHJhdGhlciB0aGFuIHRoZSBmaXJzdCByZXF1ZXN0LCBhbmQgc28gZXZlcnkgcmVxdWVzdCBhZ3JlZXMuXG4gICAqL1xuICBwcml2YXRlIGlkZW50aXR5TW9kZTogTWFzdHJhSWRlbnRpdHlNb2RlID0gXCJ1c2VyXCI7XG4gIC8qKlxuICAgKiBEZWRpY2F0ZWQgc2VydmljZS1wcmluY2lwYWwgTGFrZWJhc2UgcG9vbCBiYWNraW5nIE1hc3RyYSBtZW1vcnkgL1xuICAgKiBzdG9yYWdlLiBCdWlsdCBvbmNlIGluIHtAbGluayBidWlsZEFnZW50QW5kU2VydmVyfSAob3V0c2lkZSBhbnlcbiAgICogYGFzVXNlcmAgc2NvcGUsIHNvIGl0IG5ldmVyIGluaGVyaXRzIGEgcmVxdWVzdCdzIE9CTyBpZGVudGl0eSkgYW5kXG4gICAqIGRyYWluZWQgaW4ge0BsaW5rIHNodXRkb3dufS4gYG51bGxgIHVudGlsIHNldHVwIHJ1bnMgb3Igd2hlblxuICAgKiBMYWtlYmFzZSBpc24ndCBuZWVkZWQuXG4gICAqL1xuICBwcml2YXRlIHNlcnZpY2VQcmluY2lwYWxQb29sOiBQb29sIHwgbnVsbCA9IG51bGw7XG5cbiAgb3ZlcnJpZGUgYXN5bmMgc2V0dXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gUmVzb2x2ZSB0aGUgaWRlbnRpdHkgbW9kZSB1cCBmcm9udCBzbyBhbiBpbnZhbGlkIGBnZW5pZUlkZW50aXR5YCBmYWlscyB0aGVcbiAgICAvLyBhcHAgYm9vdCB3aXRoIGEgY2xlYXIgbWVzc2FnZSByYXRoZXIgdGhhbiA1MDAtaW5nIHRoZSBmaXJzdCBjaGF0IHJlcXVlc3QuXG4gICAgdGhpcy5pZGVudGl0eU1vZGUgPSByZXNvbHZlSWRlbnRpdHlNb2RlKHRoaXMuY29uZmlnLmdlbmllSWRlbnRpdHkpO1xuICAgIHZhbGlkYXRlRmVlZGJhY2tDb25maWcodGhpcy5jb25maWcuZmVlZGJhY2spO1xuICAgIC8vIFdhaXQgdW50aWwgc2libGluZyBwbHVnaW5zIChlLmcuIGBsYWtlYmFzZWApIGZpbmlzaCBgc2V0dXAoKWAgc29cbiAgICAvLyB0aGUgbGFrZWJhc2UgcG9vbCBpcyB2YWxpZCB3aGVuIHN0b3JhZ2UvbWVtb3J5IGFyZSBlbmFibGVkLlxuICAgIHRoaXMuY29udGV4dD8ub25MaWZlY3ljbGUoXCJzZXR1cDpjb21wbGV0ZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25maWd1cmVPdGVsUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuYXBwbHlMYWtlYmFzZUF1dG9EZWZhdWx0cygpO1xuICAgICAgYXdhaXQgdGhpcy5idWlsZEFnZW50QW5kU2VydmVyKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGUgY2hhdCBwYXRoJ3MgRGF0YWJyaWNrcyBjYWxscyBzaG91bGQgcnVuIHRocm91Z2ggZm9yXG4gICAqIGByZXFgLCBob25vcmluZyB7QGxpbmsgaWRlbnRpdHlNb2RlfS5cbiAgICpcbiAgICogSW4gYFwidXNlclwiYCBtb2RlICh0aGUgZGVmYXVsdCkgdGhpcyBpcyBgdGhpcy5hc1VzZXIocmVxKWAgLSBBcHBLaXQncyBvd25cbiAgICogcHJveHkgdGhhdCBydW5zIGV2ZXJ5IGNhbGwgaW5zaWRlIGBydW5JblVzZXJDb250ZXh0YCwgc28gYGdldEV4ZWN1dGlvbkNvbnRleHQoKWBcbiAgICogcmV0dXJucyB0aGUgY2FsbGVyJ3MgT0JPIGNsaWVudC4gSW4gYFwic2VydmljZS1wcmluY2lwYWxcImAgbW9kZSBpdCBpcyBgdGhpc2BcbiAgICogdW53cmFwcGVkLCBzbyB0aGUgc2FtZSBtZXRob2RzIHJ1biBpbiB0aGUgYW1iaWVudCBzZXJ2aWNlIGNvbnRleHQgYW5kXG4gICAqIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlIGFwcCBzZXJ2aWNlIHByaW5jaXBhbCdzIGNsaWVudCAtIHRoZSBzYW1lXG4gICAqIFwianVzdCBkb24ndCBlbnRlciBgYXNVc2VyYFwiIHBhdHRlcm4gQXBwS2l0J3Mgb3duIHNlcnZpY2UtY29udGV4dCBjYWxscyB1c2UuIE9uZVxuICAgKiBoZWxwZXIgY292ZXJzIGV2ZXJ5IHdvcmtzcGFjZSBjYWxsIHRoZSBjaGF0IHBhdGggbWFrZXMgKHNlcnZpbmcgY2F0YWxvZ3VlLFxuICAgKiBHZW5pZSBzdWdnZXN0aW9ucywgYGFza19nZW5pZWAgdmlhIHRoZSBkaXNwYXRjaGVkIGFnZW50IHR1cm4sIHN0YXRlbWVudCBmZXRjaCxcbiAgICogZmVlZGJhY2spLCBzbyB0aGUgaWRlbnRpdHkgZGVjaXNpb24gbGl2ZXMgaW4gb25lIHBsYWNlLlxuICAgKi9cbiAgcHJpdmF0ZSBzY29wZWRTZWxmKHJlcTogZXhwcmVzcy5SZXF1ZXN0KTogdGhpcyB7XG4gICAgcmV0dXJuIHVzZVNlcnZpY2VQcmluY2lwYWwodGhpcy5pZGVudGl0eU1vZGUsIHJlcSkgPyB0aGlzIDogdGhpcy5hc1VzZXIocmVxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBgbGFrZWJhc2VgIHBsdWdpbiBpcyByZWdpc3RlcmVkLCBhdXRvLWVuYWJsZSBgc3RvcmFnZWBcbiAgICogYW5kIGBtZW1vcnlgIHVubGVzcyB0aGUgY2FsbGVyIG9wdGVkIG91dCBleHBsaWNpdGx5IChgZmFsc2VgIG9yIGFcbiAgICogY3VzdG9tIGNvbmZpZyBvYmplY3QpLiBSdW4gYWZ0ZXIgYHNldHVwOmNvbXBsZXRlYCBzbyB0aGUgbG9va3VwXG4gICAqIGlzIHJlbGlhYmxlOiBhbnkgcGx1Z2luIHRoYXQgcmVnaXN0ZXJzIGl0c2VsZiBzeW5jaHJvbm91c2x5IGlzXG4gICAqIGFscmVhZHkgaW4gdGhlIHJlZ2lzdHJ5IGJ5IHRoZSB0aW1lIHRoaXMgZmlyZXMuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5TGFrZWJhc2VBdXRvRGVmYXVsdHMoKTogdm9pZCB7XG4gICAgY29uc3QgaGFzTGFrZWJhc2UgPSBwbHVnaW5SZWdpc3RyeS5pbnN0YW5jZSh0aGlzLmNvbnRleHQsIGxha2ViYXNlKSAhPT0gdW5kZWZpbmVkO1xuICAgIGlmICghaGFzTGFrZWJhc2UpIHJldHVybjtcbiAgICBpZiAodGhpcy5jb25maWcuc3RvcmFnZSA9PT0gdW5kZWZpbmVkKSB0aGlzLmNvbmZpZy5zdG9yYWdlID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5jb25maWcubWVtb3J5ID09PSB1bmRlZmluZWQpIHRoaXMuY29uZmlnLm1lbW9yeSA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRHJhaW4gdGhlIG1lbW9yeSBzZXJ2aWNlLXByaW5jaXBhbCBwb29sLiBJZGVtcG90ZW50OiB0aGUgaGFuZGxlIGlzXG4gICAqIGNsZWFyZWQgYmVmb3JlIHRoZSBkcmFpbiBzdGFydHMsIHNvIGEgc2Vjb25kIGNhbGwgaXMgYSBuby1vcCBhbmQgYVxuICAgKiBsYXRlciBgc2V0dXAoKWAgcmVidWlsZHMgdGhlIHBvb2wuIEJvdW5kZWQgYnlcbiAgICoge0BsaW5rIFBPT0xfRFJBSU5fVElNRU9VVF9NU30gdG8gc3RheSB3ZWxsIGluc2lkZSB0aGUgMTVzIGdyYWNlZnVsXG4gICAqIHNodXRkb3duIGJ1ZGdldC5cbiAgICovXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBvb2wgPSB0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sO1xuICAgIGlmICghcG9vbCkgcmV0dXJuO1xuICAgIHRoaXMuc2VydmljZVByaW5jaXBhbFBvb2wgPSBudWxsO1xuICAgIHRoaXMubG9nZ2VyLmluZm8oXCJjbG9zaW5nIG1lbW9yeSBTUCBwb29sXCIpO1xuICAgIC8vIFRoZSBidWRnZXQgdGltZXIgaXMgY2FuY2VsbGVkIG9uIHRoZSB3YXkgb3V0IHNvIGEgZHJhaW4gdGhhdCBmaW5pc2hlZFxuICAgIC8vIGVhcmx5IGNhbm5vdCBob2xkIHRoZSBldmVudCBsb29wIG9wZW4gZm9yIHRoZSByZXN0IG9mIHRoZSB3aW5kb3cuXG4gICAgY29uc3QgYnVkZ2V0ID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLnJhY2UoW3Bvb2wuZW5kKCksIGFzeW5jVXRpbHMuc2xlZXAoUE9PTF9EUkFJTl9USU1FT1VUX01TLCBidWRnZXQuc2lnbmFsKV0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXCJlcnJvciBjbG9zaW5nIG1lbW9yeSBTUCBwb29sXCIsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYnVkZ2V0LmFib3J0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFib3J0IGluLWZsaWdodCB3b3JrLiBBcHBLaXQncyBncmFjZWZ1bCBzaHV0ZG93biBjYWxscyB0aGlzIGhvb2tcbiAgICogc3luY2hyb25vdXNseSBhbmQgbmV2ZXIgYXdhaXRzIHtAbGluayBzaHV0ZG93bn0sIHNvIHRoZSBwb29sIGRyYWluIGlzXG4gICAqIHN0YXJ0ZWQgaGVyZSB0b287IGl0IGNhbm5vdCBiZSBhd2FpdGVkIGZyb20gYSBgdm9pZGAgaG9vaywgYW5kXG4gICAqIHtAbGluayBzaHV0ZG93bn0gaXMgaWRlbXBvdGVudCBzbyB0aGUgZHVwbGljYXRlIGNhbGwgaXMgZnJlZS5cbiAgICovXG4gIG92ZXJyaWRlIGFib3J0QWN0aXZlT3BlcmF0aW9ucygpOiB2b2lkIHtcbiAgICBzdXBlci5hYm9ydEFjdGl2ZU9wZXJhdGlvbnMoKTtcbiAgICB2b2lkIHRoaXMuc2h1dGRvd24oKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogSWRzIG9mIGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnQgaW4gcmVnaXN0cmF0aW9uIG9yZGVyLiBNYXRjaGVzXG4gICAgICAgKiBBcHBLaXQgYGFnZW50cy5saXN0KClgIHNvIGNhbGxlcnMgY2FuIGl0ZXJhdGUgdGhlIHJlZ2lzdHJ5IHRoZVxuICAgICAgICogc2FtZSB3YXkgdW5kZXIgYm90aCBwbHVnaW5zLlxuICAgICAgICovXG4gICAgICBsaXN0OiAoKTogc3RyaW5nW10gPT4gT2JqZWN0LmtleXModGhpcy5idWlsdD8uYWdlbnRzID8/IHt9KSxcbiAgICAgIC8qKlxuICAgICAgICogTG9vayB1cCBhIHJlZ2lzdGVyZWQgYWdlbnQgYnkgaWQuIFJldHVybnMgYG51bGxgIChub3RcbiAgICAgICAqIHVuZGVmaW5lZCkgd2hlbiB1bmtub3duIHNvIGNhbGwgc2l0ZXMgY2FuIGVhcmx5LXJldHVybiB3aXRob3V0XG4gICAgICAgKiBhIHNlcGFyYXRlIGBpbmAgY2hlY2suXG4gICAgICAgKi9cbiAgICAgIGdldDogKGlkOiBzdHJpbmcpOiBBZ2VudCB8IG51bGwgPT4gdGhpcy5idWlsdD8uYWdlbnRzW2lkXSA/PyBudWxsLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgYWdlbnQgdGhlIGNsaWVudCBjb252ZXJzZXMgd2l0aCB3aGVuIGl0IGRvZXNuJ3QgbmFtZSBvbmUuXG4gICAgICAgKiBSZXNvbHZlcyB0byBgY29uZmlnLmRlZmF1bHRBZ2VudGAsIHRoZSBmaXJzdCByZWdpc3RlcmVkIGlkLCBvclxuICAgICAgICogdGhlIGJ1aWx0LWluIGBkZWZhdWx0YCBmYWxsYmFjay5cbiAgICAgICAqL1xuICAgICAgZ2V0RGVmYXVsdDogKCk6IEFnZW50IHwgbnVsbCA9PlxuICAgICAgICAodGhpcy5idWlsdCAmJiB0aGlzLmJ1aWx0LmFnZW50c1t0aGlzLmJ1aWx0LmRlZmF1bHRBZ2VudElkXSkgPz8gbnVsbCxcbiAgICAgIC8qKiBVbmRlcmx5aW5nIE1hc3RyYSBpbnN0YW5jZSBmb3IgYWR2YW5jZWQgdXNlIChjdXN0b20gcm91dGVzIGV0Yy4pLiAqL1xuICAgICAgZ2V0TWFzdHJhOiAoKSA9PiB0aGlzLm1hc3RyYSxcbiAgICAgIC8qKlxuICAgICAgICogQnVpbGQgdGhlIGBSZXF1ZXN0Q29udGV4dGAgYW4gYWdlbnQgdHVybiBkcml2ZW4gZnJvbSBPVVRTSURFIHRoaXNcbiAgICAgICAqIHBsdWdpbidzIHJvdXRlcyBuZWVkcyAoYSBUZWFtcyBhY3Rpdml0eSBvbiBhbm90aGVyIHBsdWdpbidzIGVuZHBvaW50LCBhXG4gICAgICAgKiBzY2hlZHVsZWQgam9iKS5cbiAgICAgICAqXG4gICAgICAgKiBNYXN0cmEncyB1c2VyLXNjb3BlZCB0b29scyAtIGBhc2tfZ2VuaWVgIG1vc3QgdmlzaWJseSAtIHJlYWQgdGhlIEFwcEtpdFxuICAgICAgICogdXNlciBvZmYgdGhlIHJlcXVlc3QgY29udGV4dCwgd2hpY2ggb25seSB0aGUgSFRUUCBtaWRkbGV3YXJlIHN0YW1wcy5cbiAgICAgICAqIENhbGxpbmcgYGFnZW50LmdlbmVyYXRlYCB3aXRoIGEgcmF3IHByb21wdCB0aGVyZWZvcmUgYW5zd2VycyBcInRoZSBkYXRhXG4gICAgICAgKiBzb3VyY2UgaXMgdW5yZWFjaGFibGVcIiB3aGVyZSB0aGUgY2hhdCByb3V0ZXMgYW5zd2VyIHdpdGggcmVhbCBkYXRhLlxuICAgICAgICogUGFzc2luZyB0aGlzIGFzIGByZXF1ZXN0Q29udGV4dGAgY2xvc2VzIHRoYXQgZ2FwLCBzbyBhbiBvdXQtb2YtYmFuZCB0dXJuXG4gICAgICAgKiBoYXMgZXhhY3RseSB0aGUgY2FwYWJpbGl0aWVzIGEgY2hhdCB0dXJuIGhhcy5cbiAgICAgICAqXG4gICAgICAgKiBNdXN0IGJlIGNhbGxlZCBJTlNJREUgYW4gYGFzVXNlcihyZXEpYCBzY29wZSB0byBpbmhlcml0IHRoZSBjYWxsZXInc1xuICAgICAgICogT0JPIGlkZW50aXR5OyBvdXRzaWRlIG9uZSBpdCByZXNvbHZlcyB0byB0aGUgc2VydmljZSBwcmluY2lwYWwuXG4gICAgICAgKi9cbiAgICAgIGNyZWF0ZVJlcXVlc3RDb250ZXh0OiAoXG4gICAgICAgIG9wdGlvbnM6IHsgdGhyZWFkSWQ/OiBzdHJpbmc7IHJlc291cmNlSWQ/OiBzdHJpbmc7IHJlcXVlc3RJZD86IHN0cmluZyB9ID0ge30sXG4gICAgICApOiBQcm9taXNlPFJlcXVlc3RDb250ZXh0PiA9PiBjcmVhdGVSZXF1ZXN0Q29udGV4dChvcHRpb25zKSxcbiAgICAgIC8qKlxuICAgICAgICogTUNQIGVuZHBvaW50IGluZm8gd2hlbiBgY29uZmlnLm1jcGAgaXMgZW5hYmxlZCwgZWxzZSBgbnVsbGAuXG4gICAgICAgKiBTdHJlYW1hYmxlIEhUVFAgaXMgYGh0dHBgOyB0aGUgU1NFIHBhaXIgaXMgdGhlIGxlZ2FjeSB0cmFuc3BvcnQuXG4gICAgICAgKlxuICAgICAgICogRWFjaCBwYXRoIGlzIGdpdmVuIHR3aWNlOiBtb3VudC1yZWxhdGl2ZSAoYGh0dHBQYXRoYCwgYHNzZVBhdGhgLFxuICAgICAgICogYG1lc3NhZ2VQYXRoYCkgZm9yIGFueXRoaW5nIHRoYXQgYWxyZWFkeSBrbm93cyB3aGVyZSB0aGUgcGx1Z2luIGlzXG4gICAgICAgKiBtb3VudGVkLCBhbmQgYWJzb2x1dGUgKGBodHRwYCwgYHNzZWAsIGBtZXNzYWdlc2ApIGZvciBNQ1AgY2xpZW50cyxcbiAgICAgICAqIHdoaWNoIHRha2UgYSBzaW5nbGUgVVJMIGFuZCBjYW5ub3QgY29tcG9zZSBvbmUuIFRoZSBhYnNvbHV0ZSBmb3JtIGlzXG4gICAgICAgKiBidWlsdCBmcm9tIHtAbGluayBiYXNlUGF0aH0sIHNvIGl0IGhvbm9ycyBhIGBjb25maWcubmFtZWAgb3ZlcnJpZGUgYnV0XG4gICAgICAgKiBzdGlsbCBhc3N1bWVzIEFwcEtpdCdzIGRlZmF1bHQgYC9hcGkvPG5hbWU+YCBtb3VudC5cbiAgICAgICAqL1xuICAgICAgZ2V0TWNwOiAoKToge1xuICAgICAgICBzZXJ2ZXJJZDogc3RyaW5nO1xuICAgICAgICBodHRwUGF0aDogc3RyaW5nO1xuICAgICAgICBzc2VQYXRoOiBzdHJpbmc7XG4gICAgICAgIG1lc3NhZ2VQYXRoOiBzdHJpbmc7XG4gICAgICAgIGh0dHA6IHN0cmluZztcbiAgICAgICAgc3NlOiBzdHJpbmc7XG4gICAgICAgIG1lc3NhZ2VzOiBzdHJpbmc7XG4gICAgICB9IHwgbnVsbCA9PlxuICAgICAgICB0aGlzLm1jcFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBzZXJ2ZXJJZDogdGhpcy5tY3Auc2VydmVySWQsXG4gICAgICAgICAgICAgIGh0dHBQYXRoOiB0aGlzLm1jcC5odHRwUGF0aCxcbiAgICAgICAgICAgICAgc3NlUGF0aDogdGhpcy5tY3Auc3NlUGF0aCxcbiAgICAgICAgICAgICAgbWVzc2FnZVBhdGg6IHRoaXMubWNwLm1lc3NhZ2VQYXRoLFxuICAgICAgICAgICAgICBodHRwOiBgJHt0aGlzLmJhc2VQYXRofSR7dGhpcy5tY3AuaHR0cFBhdGh9YCxcbiAgICAgICAgICAgICAgc3NlOiBgJHt0aGlzLmJhc2VQYXRofSR7dGhpcy5tY3Auc3NlUGF0aH1gLFxuICAgICAgICAgICAgICBtZXNzYWdlczogYCR7dGhpcy5iYXNlUGF0aH0ke3RoaXMubWNwLm1lc3NhZ2VQYXRofWAsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiBudWxsLFxuICAgICAgLyoqIEV4cHJlc3Mgc3ViYXBwIE1hc3RyYSBpcyBtb3VudGVkIG9uOyBtb3N0bHkgZm9yIHRlc3RzLiAqL1xuICAgICAgZ2V0TWFzdHJhU2VydmVyOiAoKSA9PiB0aGlzLm1hc3RyYVNlcnZlcixcbiAgICAgIC8qKlxuICAgICAgICogRmV0Y2ggdGhlIHdvcmtzcGFjZSdzIE1vZGVsIFNlcnZpbmcgZW5kcG9pbnRzIChjYWNoZWQpLiBTYW1lXG4gICAgICAgKiBwYXlsb2FkIHRoZSBgR0VUIC9tb2RlbHNgIHJvdXRlIHJldHVybnM7IHN1cmZhY2VkIGhlcmUgc29cbiAgICAgICAqIG90aGVyIHBsdWdpbnMgLyBzY3JpcHRzIGNhbiBpbnRyb3NwZWN0IHRoZSBjYXRhbG9ndWUgd2l0aG91dFxuICAgICAgICogYW4gSFRUUCByb3VuZC10cmlwLiBBcHBLaXQgd3JhcHMgdGhpcyB3aXRoIGBhc1VzZXIocmVxKWAgZm9yXG4gICAgICAgKiBPQk8gc2NvcGluZyBhdXRvbWF0aWNhbGx5LiBUaHJvd3Mgd2hlbiB0aGUgbGlzdGluZyBmYWlscywgc2luY2VcbiAgICAgICAqIHRoZXJlIGlzIG5vIHN0YXR1cyBjb2RlIHRvIGhhbmQgYmFjayBvbiB0aGlzIHN1cmZhY2UuXG4gICAgICAgKi9cbiAgICAgIGxpc3RNb2RlbHM6ICgpOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4gPT4gdGhpcy5saXN0TW9kZWxzKCksXG4gICAgICAvKipcbiAgICAgICAqIEZvcmNlLWV2aWN0IGNhY2hlZCBlbmRwb2ludCBsaXN0aW5ncyB2aWEgQXBwS2l0J3NcbiAgICAgICAqIGBDYWNoZU1hbmFnZXJgLiBVc2VmdWwgaW4gdGVzdHMgb3IgcmlnaHQgYWZ0ZXIgYW4gYWRtaW5cbiAgICAgICAqIGRlcGxveXMgYSBuZXcgZW5kcG9pbnQgYW5kIGRvZXNuJ3Qgd2FudCB0byB3YWl0IGZvciB0aGUgVFRMLlxuICAgICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBgQ2FjaGVNYW5hZ2VyLmRlbGV0ZWAvYGNsZWFyYCBwcm9taXNlLlxuICAgICAgICovXG4gICAgICBjbGVhck1vZGVsc0NhY2hlOiAoaG9zdD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT5cbiAgICAgICAgbW9kZWxDYXRhbG9nLmNsZWFyU2VydmluZ0VuZHBvaW50c0NhY2hlKGhvc3QpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQWJzb2x1dGUgbW91bnQgdGhpcyBwbHVnaW4ncyByb3V0ZXMgYW5zd2VyIG9uLiBBcHBLaXQgbW91bnRzIGV2ZXJ5IHBsdWdpblxuICAgKiBhdCBgL2FwaS88cGx1Z2luLm5hbWU+YCBhbmQgYHRoaXMubmFtZWAgaG9ub3JzIGEgYGNvbmZpZy5uYW1lYCBvdmVycmlkZSxcbiAgICogc28gdGhlIHBlci1yb3V0ZSBzZWdtZW50cyAoYHJvdXRlcy5NQVNUUkFfUk9VVEVTYCkgaGFuZyBvZmYgdGhpcy5cbiAgICovXG4gIHByaXZhdGUgZ2V0IGJhc2VQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvYXBpLyR7dGhpcy5uYW1lfWA7XG4gIH1cblxuICBvdmVycmlkZSBjbGllbnRDb25maWcoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIC8vIFB1Ymxpc2hpbmcgYGJhc2VQYXRoYCBpcyBlbm91Z2ggZm9yIHRoZSBjbGllbnQgdG8gc3RheSBjb3JyZWN0IHVuZGVyIGFcbiAgICAvLyBjdXN0b20gbW91bnQgaWQ6IHRoZSBwZXItcm91dGUgc2VnbWVudHMgYXJlIGZpeGVkXG4gICAgLy8gKGByb3V0ZXMuTUFTVFJBX1JPVVRFU2ApIGFuZCB0aGUgY2xpZW50IChgTWFzdHJhUGx1Z2luQ2xpZW50YCkgZGVyaXZlc1xuICAgIC8vIGV2ZXJ5IGVuZHBvaW50IGZyb20gYGJhc2VQYXRoYC5cbiAgICAvLyBSZXR1cm4gd2lkZW5zIHRvIGBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPmAgdG8gc2F0aXNmeSB0aGVcbiAgICAvLyBiYXNlLWNsYXNzIHNpZ25hdHVyZTsgY29uc3VtZXJzIHJlYWQgaXQgdGhyb3VnaCB0aGUgdHlwZWRcbiAgICAvLyBgTWFzdHJhQ2xpZW50Q29uZmlnYCBzaGFwZSB2aWEgYHVzZVBsdWdpbkNsaWVudENvbmZpZzwuLi4+KC4uLilgLlxuICAgIGNvbnN0IGNvbmZpZzogTWFzdHJhQ2xpZW50Q29uZmlnID0ge1xuICAgICAgYmFzZVBhdGg6IHRoaXMuYmFzZVBhdGgsXG4gICAgICBkZWZhdWx0QWdlbnQ6IHRoaXMuYnVpbHQ/LmRlZmF1bHRBZ2VudElkID8/IEZBTExCQUNLX0FHRU5UX0lELFxuICAgICAgYWdlbnRzOiBPYmplY3Qua2V5cyh0aGlzLmJ1aWx0Py5hZ2VudHMgPz8ge30pLFxuICAgICAgZmVlZGJhY2tFbmFibGVkOiB0aGlzLmZlZWRiYWNrRW5hYmxlZCgpLFxuICAgICAgLy8gSW4gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIHRoZSBjaGF0IHdvcmtzIGZvciBhbnkgY2FsbGVyIHdobyBjYW4gb3BlblxuICAgICAgLy8gdGhlIGFwcCwgc28gYSBVSSB0aGF0IGhpZGVzIGNoYXQgYmVoaW5kIGFuIE9CTy10b2tlbiBwcm9iZSBzaG91bGQgc2hvd1xuICAgICAgLy8gaXQgcmVnYXJkbGVzcy4gYFwidXNlclwiYCBtb2RlIGtlZXBzIHRoZSBPQk8tZ2F0ZWQgYmVoYXZpb3IuXG4gICAgICBjaGF0QWx3YXlzQXZhaWxhYmxlOiB0aGlzLmlkZW50aXR5TW9kZSA9PT0gXCJzZXJ2aWNlLXByaW5jaXBhbFwiLFxuICAgIH07XG4gICAgcmV0dXJuIGNvbmZpZyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdXNlciBmZWVkYmFjayBjYW4gYmUgbG9nZ2VkIHRvIE1MZmxvdy4gRGVsZWdhdGVzIHRvXG4gICAqIHtAbGluayByZXNvbHZlRmVlZGJhY2tFbmFibGVkfSBzbyB0aGUgY2xpZW50LWNvbmZpZyBmbGFnIGFuZCB0aGVcbiAgICogZmVlZGJhY2sgcm91dGUgc2hhcmUgdGhlIHNhbWUgZ2F0ZSBhcyB0aGUgc2VydmVyJ3MgdHJhY2UtaWQgaGVhZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBmZWVkYmFja0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlc29sdmVGZWVkYmFja0VuYWJsZWQodGhpcy5jb25maWcuZmVlZGJhY2spO1xuICB9XG5cbiAgb3ZlcnJpZGUgaW5qZWN0Um91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJNY3BSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyTW9kZWxSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyRW1iZWRSb3V0ZXMocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyU3VnZ2VzdGlvblJvdXRlcyhyb3V0ZXIpO1xuICAgIHRoaXMucmVnaXN0ZXJGZWVkYmFja1JvdXRlcyhyb3V0ZXIpO1xuICAgIHRoaXMucmVnaXN0ZXJNbGZsb3dFeHBlcmltZW50Um91dGUocm91dGVyKTtcbiAgICB0aGlzLnJlZ2lzdGVyQWdlbnRSb3V0ZXMocm91dGVyKTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciBVUkwgYWxpYXNlcyBmb3IgTWFzdHJhJ3MgTUNQIHRyYW5zcG9ydHMuICovXG4gIHByaXZhdGUgcmVnaXN0ZXJNY3BSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgLy8gRXhwb3NlIHRoZSBNQ1AgdHJhbnNwb3J0IGF0IHRoZSBjbGVhbiBgL21jcGAgKHBsdXMgdGhlIGxlZ2FjeVxuICAgIC8vIGAvc3NlYCArIGAvbWVzc2FnZXNgKSB1bmRlciB0aGUgcGx1Z2luIG1vdW50LiBgQG1hc3RyYS9leHByZXNzYFxuICAgIC8vIG1vdW50cyBNQ1AgdW5kZXIgYC9tY3AvPHNlcnZlcklkPi88dHJhbnNwb3J0PmAsIGFuZCB0aGUgc2VydmVySWRcbiAgICAvLyBkZWZhdWx0cyB0byB0aGUgcGx1Z2luIG5hbWUsIHNvIHRoZSByYXcgcm91dGUgcmVhZHNcbiAgICAvLyBgL2FwaS9tYXN0cmEvbWNwL21hc3RyYS9tY3BgIChkb3VibGVkIHNlZ21lbnQpLiBUaGlzIHJ1bnMgYmVmb3JlXG4gICAgLy8gdGhlIGNhdGNoLWFsbCBhbmQgcmV3cml0ZXMgdGhlIGFsaWFzIHRvIHRoZSB1bmRlcmx5aW5nIHJvdXRlLCBzb1xuICAgIC8vIHRoZSBwdWJsaWMgcGF0aCBpcyBqdXN0IGAvYXBpLzxwbHVnaW4+L21jcGA7IHRoZSBxdWVyeSBzdHJpbmdcbiAgICAvLyAoZS5nLiB0aGUgU1NFIGBzZXNzaW9uSWRgKSBpcyBwcmVzZXJ2ZWQuXG4gICAgLy9cbiAgICAvLyBNaWRkbGV3YXJlIHJhdGhlciB0aGFuIGB0aGlzLnJvdXRlYDogaXQgcmV3cml0ZXMgdGhlIFVSTCBmb3Igcm91dGVzXG4gICAgLy8gYEBtYXN0cmEvZXhwcmVzc2Agb3ducyBmdXJ0aGVyIGRvd24gdGhlIGNoYWluIGluc3RlYWQgb2YgYW5zd2VyaW5nIHRoZVxuICAgIC8vIHJlcXVlc3QsIHdoaWNoIGBSb3V0ZUNvbmZpZ2AgaGFzIG5vIHNoYXBlIGZvci5cbiAgICByb3V0ZXIudXNlKChyZXEsIF9yZXMsIG5leHQpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMubWNwUm91dGVBbGlhcyhyZXEucGF0aCk7XG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIGNvbnN0IHEgPSByZXEudXJsLmluZGV4T2YoXCI/XCIpO1xuICAgICAgICByZXEudXJsID0gcSA+PSAwID8gdGFyZ2V0ICsgcmVxLnVybC5zbGljZShxKSA6IHRhcmdldDtcbiAgICAgIH1cbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciBtb2RlbCBjYXRhbG9ndWUgYW5kIHBlci1hZ2VudCBkZWZhdWx0LW1vZGVsIHJvdXRlcy4gKi9cbiAgcHJpdmF0ZSByZWdpc3Rlck1vZGVsUm91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIC8vIGBHRVQgL21vZGVsc2AgZXhwb3NlcyB0aGUgY2FjaGVkIGVuZHBvaW50IGxpc3Qgc28gY2xpZW50cyBjYW5cbiAgICAvLyBwb3B1bGF0ZSBtb2RlbCBwaWNrZXJzLCB2YWxpZGF0ZSBgP21vZGVsPWAgY2hvaWNlcywgZXRjLiBNdXN0XG4gICAgLy8gYmUgcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIGNhdGNoLWFsbCB0aGF0IGZvcndhcmRzIGV2ZXJ5dGhpbmcgdG9cbiAgICAvLyB0aGUgTWFzdHJhIHN1YmFwcC5cbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJtb2RlbHNcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IHJvdXRlcy5NQVNUUkFfUk9VVEVTLm1vZGVscyxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNjb3BlZFNlbGYocmVxKS5saXN0TW9kZWxzUmVzdWx0KCk7XG4gICAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgICAgdGhpcy5zZW5kRmFpbHVyZShyZXMsIHJlc3VsdCwgXCJtb2RlbHNcIiwgTU9ERUxfQ0FUQUxPR1VFX0ZBSUxFRF9NRVNTQUdFKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzLmpzb24oeyBlbmRwb2ludHM6IHJlc3VsdC5kYXRhIH0pO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIGBHRVQgL2RlZmF1bHQtbW9kZWxgIChhbmQgYC9kZWZhdWx0LW1vZGVsLzphZ2VudElkYCkgcmVwb3J0cyB3aGF0IGFuXG4gICAgLy8gdW5waW5uZWQgdHVybiB3aWxsIHVzZS4gQSBjb25maWd1cmVkIHN0cmluZyBpcyByZXR1cm5lZCBkaXJlY3RseTsgYW5cbiAgICAvLyBhdXRvbWF0aWMgZGVmYXVsdCByZXNvbHZlcyB0aGUgaGlnaGVzdC1yYW5rZWQgY3VycmVudGx5IGF2YWlsYWJsZSBHUFRcbiAgICAvLyAob3IgZ2VuZXJhbCBjaGF0IGZhbGxiYWNrKSBmcm9tIHRoZSBzYW1lIE9CTy1zY29wZWQgbGl2ZSBjYXRhbG9ndWUgYXNcbiAgICAvLyBgL21vZGVsc2A7IGEgY3VzdG9tIGR5bmFtaWMgcmVzb2x2ZXIgcmVtYWlucyBudWxsIGJlY2F1c2UgaXQgaXMgY2FsbC10aW1lXG4gICAgLy8gYXBwbGljYXRpb24gY29kZS5cbiAgICBjb25zdCBoYW5kbGVEZWZhdWx0TW9kZWwgPSBhc3luYyAoXG4gICAgICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RlZCA9IHN0cmluZ1V0aWxzLmZpcnN0Tm9uRW1wdHkocmVxLnBhcmFtcy5hZ2VudElkKTtcbiAgICAgIGlmIChyZXF1ZXN0ZWQgIT09IG51bGwgJiYgIXRoaXMuYnVpbHQ/LmFnZW50c1tyZXF1ZXN0ZWRdKSB7XG4gICAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHsgZXJyb3I6IHRoaXMudW5rbm93bkFnZW50TWVzc2FnZShyZXF1ZXN0ZWQpIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBhZ2VudElkID0gcmVxdWVzdGVkID8/IHRoaXMuYnVpbHQ/LmRlZmF1bHRBZ2VudElkID8/IEZBTExCQUNLX0FHRU5UX0lEO1xuICAgICAgY29uc3QgaW50ZW50ID0gdGhpcy5idWlsdD8uZGVmYXVsdE1vZGVsc1thZ2VudElkXTtcbiAgICAgIGxldCBtb2RlbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgICBpZiAoaW50ZW50Py5raW5kID09PSBcImNvbmZpZ3VyZWRcIikge1xuICAgICAgICBtb2RlbCA9IGludGVudC5tb2RlbDtcbiAgICAgIH0gZWxzZSBpZiAoaW50ZW50Py5raW5kID09PSBcImF1dG9cIikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNjb3BlZFNlbGYocmVxKS5saXN0TW9kZWxzUmVzdWx0KCk7XG4gICAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgICAgdGhpcy5zZW5kRmFpbHVyZShyZXMsIHJlc3VsdCwgXCJkZWZhdWx0LW1vZGVsXCIsIE1PREVMX0NBVEFMT0dVRV9GQUlMRURfTUVTU0FHRSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbW9kZWwgPSByZXNvbHZlRGVmYXVsdE1vZGVsSWQodGhpcy5jb25maWcsIHJlc3VsdC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzLmpzb24oe1xuICAgICAgICBhZ2VudElkLFxuICAgICAgICBtb2RlbCxcbiAgICAgICAgZGlzcGxheU5hbWU6IG1vZGVsID8gZGlzcGxheS50b01vZGVsRGlzcGxheU5hbWUobW9kZWwpIDogbnVsbCxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiZGVmYXVsdE1vZGVsXCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiByb3V0ZXMuTUFTVFJBX1JPVVRFUy5kZWZhdWx0TW9kZWwsXG4gICAgICBoYW5kbGVyOiBoYW5kbGVEZWZhdWx0TW9kZWwsXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiZGVmYXVsdE1vZGVsQnlBZ2VudFwiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogYCR7cm91dGVzLk1BU1RSQV9ST1VURVMuZGVmYXVsdE1vZGVsfS86YWdlbnRJZGAsXG4gICAgICBoYW5kbGVyOiBoYW5kbGVEZWZhdWx0TW9kZWwsXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgdGhlIGdlbmVyaWMgY2hhcnQgYW5kIHN0YXRlbWVudCBlbWJlZCByZXNvbHZlci4gKi9cbiAgcHJpdmF0ZSByZWdpc3RlckVtYmVkUm91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIC8vIGBHRVQgL2VtYmVkLzp0eXBlLzppZGAgaXMgdGhlIHNpbmdsZSByZXNvbHZlciBmb3IgZXZlcnkgZW1iZWRcbiAgICAvLyBtYXJrZXIgdGhlIGFnZW50IGVtaXRzIGluIHByb3NlIChgW2NoYXJ0OjxpZD5dYCxcbiAgICAvLyBgW2RhdGE6PGlkPl1gLCAuLi4pLiBgOnR5cGVgIHNlbGVjdHMgYSByZXNvbHZlciBmcm9tIHRoZVxuICAgIC8vIHJlZ2lzdHJ5IGJlbG93OyBgOmlkYCBpcyB0aGF0IHJlc29sdmVyJ3MgbG9va3VwIGtleS4gVGhlXG4gICAgLy8gZ3JhbW1hciAoc2VlIGBtYXJrZXIudHNgKSBpcyB0eXBlLWFnbm9zdGljIG9uIHB1cnBvc2UgLSBuZXdcbiAgICAvLyBlbWJlZCBraW5kcyBhcmUgYWRkZWQgYnkgcmVnaXN0ZXJpbmcgYSByZXNvbHZlciBoZXJlLCB3aXRoIG5vXG4gICAgLy8gY2xpZW50IG9yIGdyYW1tYXIgY2hhbmdlLlxuICAgIC8vXG4gICAgLy8gU3RhdHVzIGNvZGVzOlxuICAgIC8vICAgLSAyMDAgd2l0aCB0aGUgcmVzb2x2ZXIncyBKU09OIGJvZHkgd2hlbiB0aGUgaWQgcmVzb2x2ZXMuXG4gICAgLy8gICAtIDQwNCB3aGVuIGA6dHlwZWAgaXNuJ3QgcmVnaXN0ZXJlZCAodW5zdXBwb3J0ZWQgZW1iZWRcbiAgICAvLyAgICAgdHlwZSkgT1IgYSByZWdpc3RlcmVkIHJlc29sdmVyIGNhbid0IGZpbmQgYDppZGAgKHVua25vd25cbiAgICAvLyAgICAgLyBleHBpcmVkIC0gZS5nLiBhIGNoYXJ0IHBhc3QgaXRzIDFoIFRUTCBvciBhIGZhYnJpY2F0ZWRcbiAgICAvLyAgICAgaWQgdGhlIG1vZGVsIG5ldmVyIG1pbnRlZCkuXG4gICAgLy8gICAtIDQwMCB3aGVuIGA6aWRgIGlzIGVtcHR5LlxuICAgIC8vXG4gICAgLy8gUGVyLXR5cGUgcXVlcnkga25vYnMgYW5kIGJlaGF2aW9yOlxuICAgIC8vICAgLSBgY2hhcnRgOiBsb25nLXBvbGxzIHRoZSBjaGFydCBjYWNoZSB1bnRpbCB0aGUgZW50cnlcbiAgICAvLyAgICAgc2V0dGxlcyAoYHJlc3VsdGAgLyBgZXJyb3JgKSBvciB0aGUgYnVkZ2V0IGVsYXBzZXMgKHRoZW5cbiAgICAvLyAgICAgcmV0dXJucyB0aGUgc3RpbGwtcHJvY2Vzc2luZyBlbnRyeSB0byBwb2xsIGFnYWluKS5cbiAgICAvLyAgICAgYD90aW1lb3V0TXM9PG4+YCAoZGVmYXVsdCA2MHMsIGNhcHBlZCA1bWluKSB0dW5lcyBpdC5cbiAgICAvLyAgIC0gYGRhdGFgOiBvbmUgT0JPLXNjb3BlZCBTdGF0ZW1lbnQgRXhlY3V0aW9uIGZldGNoLlxuICAgIC8vICAgICBgP2xpbWl0PTxuPmAgY2FwcyByb3dzIChjbGFtcGVkIHRvIFNUQVRFTUVOVF9ST1dfQ0FQKS5cbiAgICAvL1xuICAgIC8vIEJ1aWx0IG9uY2UgKHRoaXMgaGFuZGxlciBpcyByZWdpc3RlcmVkIG9uY2UpIGFuZCBrZXllZCBieSB0aGVcbiAgICAvLyByYXcgYDp0eXBlYCB0b2tlbi4gRWFjaCByZXNvbHZlciBnZXRzIHRoZSByZXF1ZXN0IChmb3IgcXVlcnlcbiAgICAvLyBwYXJzaW5nICsgT0JPIHNjb3BpbmcpIGFuZCBhbiBgQWJvcnRTaWduYWxgIGJyaWRnZWQgb2ZmIHRoZVxuICAgIC8vIGNvbm5lY3Rpb24gYGNsb3NlYCBldmVudCBzbyBhIGxvbmctcG9sbCB1bmJsb2NrcyB0aGUgaW5zdGFudFxuICAgIC8vIHRoZSBjbGllbnQgZGlzY29ubmVjdHMuIGB1bmRlZmluZWRgIGZyb20gYSByZXNvbHZlciBtYXBzIHRvIGFcbiAgICAvLyBjbGVhbiA0MDQ7IHRocm93biBlcnJvcnMgYnViYmxlIHRocm91Z2ggYG5leHQoZXJyKWAuXG4gICAgY29uc3QgZW1iZWRSZXNvbHZlcnM6IFJlY29yZDxzdHJpbmcsIEVtYmVkUmVzb2x2ZXI+ID0ge1xuICAgICAgY2hhcnQ6IChyZXEsIGlkLCBzaWduYWwpID0+IHtcbiAgICAgICAgY29uc3QgdGltZW91dE1zID0gcGFyc2VUaW1lb3V0TXMocmVxLnF1ZXJ5LnRpbWVvdXRNcyk7XG4gICAgICAgIHJldHVybiB0aGlzLnNjb3BlZFNlbGYocmVxKS5mZXRjaENoYXJ0RW50cnkocmVxLCBpZCwge1xuICAgICAgICAgIC4uLih0aW1lb3V0TXMgIT09IHVuZGVmaW5lZCA/IHsgdGltZW91dE1zIH0gOiB7fSksXG4gICAgICAgICAgc2lnbmFsLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBkYXRhOiAocmVxLCBpZCwgc2lnbmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gcGFyc2VTdGF0ZW1lbnRMaW1pdChyZXEucXVlcnkubGltaXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zY29wZWRTZWxmKHJlcSkuZmV0Y2hTdGF0ZW1lbnQoaWQsIHtcbiAgICAgICAgICAuLi4obGltaXQgIT09IHVuZGVmaW5lZCA/IHsgbGltaXQgfSA6IHt9KSxcbiAgICAgICAgICBzaWduYWwsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiZW1iZWRcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IGAke3JvdXRlcy5NQVNUUkFfUk9VVEVTLmVtYmVkfS86dHlwZS86aWRgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBzdHJpbmdVdGlscy5maXJzdE5vbkVtcHR5KHJlcS5wYXJhbXMudHlwZSkgPz8gXCJcIjtcbiAgICAgICAgY29uc3QgaWQgPSBzdHJpbmdVdGlscy5maXJzdE5vbkVtcHR5KHJlcS5wYXJhbXMuaWQpO1xuICAgICAgICBjb25zdCByZXNvbHZlID0gZW1iZWRSZXNvbHZlcnNbdHlwZV07XG4gICAgICAgIGlmICghcmVzb2x2ZSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJlbWJlZDp1bnN1cHBvcnRlZFwiLCB7XG4gICAgICAgICAgICBzdGF0dXM6IDQwNCxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCxcbiAgICAgICAgICAgIHBhdGg6IHJlcS5wYXRoLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHsgZXJyb3I6IGB1bnN1cHBvcnRlZCBlbWJlZCB0eXBlOiAke3R5cGV9YCB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJlbWJlZDppbnZhbGlkXCIsIHtcbiAgICAgICAgICAgIHN0YXR1czogNDAwLFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCxcbiAgICAgICAgICAgIHBhdGg6IHJlcS5wYXRoLFxuICAgICAgICAgICAgZXJyb3I6IFwiaWQgaXMgcmVxdWlyZWRcIixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7IGVycm9yOiBcImlkIGlzIHJlcXVpcmVkXCIgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEV4cHJlc3MncyBgcmVxYCBwcmVkYXRlcyBgQWJvcnRTaWduYWxgOyBicmlkZ2UgdGhlIGBjbG9zZWBcbiAgICAgICAgLy8gZXZlbnQgb250byBhbiBgQWJvcnRDb250cm9sbGVyYCBzbyBhIGNsb3NlZCBjb25uZWN0aW9uXG4gICAgICAgIC8vIHVuYmxvY2tzIGFueSBsb25nLXBvbGwgaW1tZWRpYXRlbHkgYW5kIGZyZWVzIHRoZSByZXF1ZXN0XG4gICAgICAgIC8vIHRocmVhZC4gVGhlIGxpc3RlbmVyIGlzIEdDJ2Qgd2l0aCB0aGUgcmVxdWVzdCBvbiBub3JtYWxcbiAgICAgICAgLy8gY29tcGxldGlvbi5cbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgcmVxLm9uKFwiY2xvc2VcIiwgKCkgPT4gY29udHJvbGxlci5hYm9ydCgpKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzb2x2ZShyZXEsIGlkLCBjb250cm9sbGVyLnNpZ25hbCk7XG4gICAgICAgIGlmIChjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgICAgdGhpcy5zZW5kRmFpbHVyZShyZXMsIHJlc3VsdCwgYGVtYmVkOiR7dHlwZX1gLCBgQ291bGQgbm90IHJlc29sdmUgdGhlICR7dHlwZX0gZW1iZWRgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5kYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBBIGNhY2hlIG1pc3MgaXMgc2VjdXJpdHktZGVsaWJlcmF0ZWx5IGFtYmlndW91czogdW5rbm93biwgZXhwaXJlZCxcbiAgICAgICAgICAvLyBvciBvd25lZCBieSBhbm90aGVyIGlkZW50aXR5IGFsbCBtYXAgdG8gdGhlIHNhbWUgNDA0LiBMb2cgdGhlXG4gICAgICAgICAgLy8gb3BhcXVlIGlkIGFuZCB0aG9zZSBwb3NzaWJsZSBjYXVzZXMgc28gYSBmYWJyaWNhdGVkIG1hcmtlciBpc1xuICAgICAgICAgIC8vIGRpYWdub3NhYmxlIGZyb20gdGhlIHNlcnZlciB3aXRob3V0IGRpc2Nsb3Npbmcgd2hpY2ggY2F1c2UgYXBwbGllZC5cbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBlbWJlZDoke3R5cGV9Om5vdC1mb3VuZGAsIHtcbiAgICAgICAgICAgIHN0YXR1czogNDA0LFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgbWV0aG9kOiByZXEubWV0aG9kLFxuICAgICAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgICAgICByZWFzb246IFwidW5rbm93biwgZXhwaXJlZCwgb3Igb3duZWQgYnkgYW5vdGhlciBpZGVudGl0eVwiLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHsgZXJyb3I6IGAke3R5cGV9IG5vdCBmb3VuZGAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlcy5qc29uKHJlc3VsdC5kYXRhKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgZGVmYXVsdCBhbmQgYWdlbnQtcXVhbGlmaWVkIHN1Z2dlc3Rpb24gcm91dGVzLiAqL1xuICBwcml2YXRlIHJlZ2lzdGVyU3VnZ2VzdGlvblJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICAvLyBgR0VUIC9zdWdnZXN0aW9uc2AgKGFuZCBgL3N1Z2dlc3Rpb25zLzphZ2VudElkYCkgcmV0dXJucyB0aGVcbiAgICAvLyBjdXJhdGVkIHN0YXJ0ZXIgcXVlc3Rpb25zIGZvciB0aGUgYWdlbnQncyBHZW5pZSBzcGFjZShzKSAtIHRoZVxuICAgIC8vIGF1dGhvci1jb25maWd1cmVkIGBzYW1wbGVfcXVlc3Rpb25zYCwgc3VyZmFjZWQgYXMgb25lLXRhcFxuICAgIC8vIHByb21wdHMgb24gdGhlIGNoYXQgZW1wdHkgc3RhdGUuIFJldHVybnMgYHsgcXVlc3Rpb25zOiBbXSB9YFxuICAgIC8vIHdoZW4gbm8gR2VuaWUgc3BhY2UgaXMgd2lyZWQgc28gdGhlIGNsaWVudCByZW5kZXJzIGEgYmFyZVxuICAgIC8vIGVtcHR5IHN0YXRlIChubyBidWlsdC1pbiBleGFtcGxlIHByb21wdHMpLiBUaGUgYDphZ2VudElkYFxuICAgIC8vIHNlZ21lbnQgaXMgYWNjZXB0ZWQgZm9yIFVSTCBzeW1tZXRyeSB3aXRoIHRoZSBjaGF0IC8gaGlzdG9yeVxuICAgIC8vIHJvdXRlczsgR2VuaWUgc3BhY2VzIGFyZSByZXNvbHZlZCBwZXItcGx1Z2luLCBub3QgcGVyLWFnZW50LFxuICAgIC8vIHNvIGl0IGRvZXNuJ3QgY2hhbmdlIHRoZSByZXN1bHQuIE9CTy1zY29wZWQgbGlrZSB0aGUgb3RoZXJcbiAgICAvLyBkYXRhIHJvdXRlcyBzbyB0aGUgc3BhY2UgbG9va3VwIHJ1bnMgYXMgdGhlIGNhbGxpbmcgdXNlci5cbiAgICBjb25zdCBoYW5kbGVTdWdnZXN0aW9ucyA9IGFzeW5jIChcbiAgICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgICAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICAgICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIHJlcS5vbihcImNsb3NlXCIsICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNjb3BlZFNlbGYocmVxKS5mZXRjaFN1Z2dlc3Rpb25zKGNvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgIGlmIChjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAvLyBTdWdnZXN0aW9ucyBhcmUgYSBub24tY3JpdGljYWwgZW5oYW5jZW1lbnQ7IGEgbG9va3VwIGZhaWx1cmUgc2hvdWxkXG4gICAgICAgIC8vIGxlYXZlIHRoZSBjaGF0IHVzYWJsZSB3aXRoIGEgYmFyZSBlbXB0eSBzdGF0ZSByYXRoZXIgdGhhbiBzdXJmYWNpbmdcbiAgICAgICAgLy8gdGhlIHVwc3RyZWFtIHN0YXR1cy4gTG9nIGFuZCBkZWdyYWRlLlxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwic3VnZ2VzdGlvbnM6ZXJyb3JcIiwge1xuICAgICAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcbiAgICAgICAgICBlcnJvcjogcmVzdWx0Lm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICByZXMuanNvbih7IHF1ZXN0aW9uczogW10gfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlcy5qc29uKHsgcXVlc3Rpb25zOiByZXN1bHQuZGF0YSB9KTtcbiAgICB9O1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcInN1Z2dlc3Rpb25zXCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiByb3V0ZXMuTUFTVFJBX1JPVVRFUy5zdWdnZXN0aW9ucyxcbiAgICAgIGhhbmRsZXI6IGhhbmRsZVN1Z2dlc3Rpb25zLFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcInN1Z2dlc3Rpb25zQnlBZ2VudFwiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogYCR7cm91dGVzLk1BU1RSQV9ST1VURVMuc3VnZ2VzdGlvbnN9LzphZ2VudElkYCxcbiAgICAgIGhhbmRsZXI6IGhhbmRsZVN1Z2dlc3Rpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIE1MZmxvdyBmZWVkYmFjayBzdWJtaXNzaW9uIHdoZW4gY29uZmlndXJlZC4gKi9cbiAgcHJpdmF0ZSByZWdpc3RlckZlZWRiYWNrUm91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIC8vIGBQT1NUIC9yb3V0ZS9mZWVkYmFja2AgbG9ncyBhIHRodW1icyAvIGNvbW1lbnQgYXNzZXNzbWVudCBhZ2FpbnN0XG4gICAgLy8gYSB0dXJuJ3MgTUxmbG93IHRyYWNlICh0aGUgYHRyYWNlSWRgIHRoZSBjbGllbnQgY2FwdHVyZWQgZnJvbSB0aGVcbiAgICAvLyBzdHJlYW0gcmVzcG9uc2UncyB0cmFjZS1pZCBoZWFkZXIpLiBSZWdpc3RlcmVkIG9uIHRoZSBBcHBLaXRcbiAgICAvLyByb3V0ZXIgKGxpa2UgYC9tb2RlbHNgKSByYXRoZXIgdGhhbiB0aGUgTWFzdHJhIHN1YmFwcCBzbyBpdCBydW5zXG4gICAgLy8gdW5kZXIgdGhlIHNhbWUgT0JPIHNjb3BlIC0gdGhlIGZlZWRiYWNrIGlzIGF0dHJpYnV0ZWQgdG8gdGhlXG4gICAgLy8gc2lnbmVkLWluIHVzZXIuIFJldHVybnMgNDA0IHdoZW4gZmVlZGJhY2sgaXMgZGlzYWJsZWQgc28gdGhlXG4gICAgLy8gY2xpZW50IHRyZWF0cyB0aGUgY2FwYWJpbGl0eSBhcyBhYnNlbnQ7IDQwMCBvbiBhIG1hbGZvcm1lZCBib2R5LlxuICAgIC8vIEEgcmVjb3JkZWQgYXNzZXNzbWVudCB5aWVsZHMgYHsgb2s6IHRydWUgfWA7IGEgc29mdCBmYWlsdXJlIChtb3N0XG4gICAgLy8gb2Z0ZW4gdGhlIHRyYWNlIGhhc24ndCBmaW5pc2hlZCBleHBvcnRpbmcgdG8gTUxmbG93IHlldCkgeWllbGRzXG4gICAgLy8gYHsgb2s6IGZhbHNlIH1gIHdpdGhvdXQgYSA1eHggc28gdGhlIFVJIGNhbiBwcm9tcHQgYSByZXRyeS5cbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJmZWVkYmFja1wiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IHJvdXRlcy5NQVNUUkFfUk9VVEVTLmZlZWRiYWNrLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5mZWVkYmFja0VuYWJsZWQoKSkge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHsgb2s6IGZhbHNlIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWQgPSBmZWVkYmFjay5NYXN0cmFGZWVkYmFja1JlcXVlc3RTY2hlbWEuc2FmZVBhcnNlKHJlcS5ib2R5KTtcbiAgICAgICAgaWYgKCFwYXJzZWQuc3VjY2Vzcykge1xuICAgICAgICAgIC8vIEEgWm9kIGlzc3VlIHN0cmluZyBxdW90ZXMgdGhlIHJlY2VpdmVkIGJvZHkgYmFjaywgc28gb25seSB0aGVcbiAgICAgICAgICAvLyBvZmZlbmRpbmcgZmllbGQgbmFtZXMgdHJhdmVsOyB0aGUgZnVsbCBpc3N1ZSBsaXN0IGlzIGxvZ2dlZC5cbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiZmVlZGJhY2s6aW52YWxpZFwiLCB7IGVycm9yOiBwYXJzZWQuZXJyb3IubWVzc2FnZSB9KTtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7XG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogSU5WQUxJRF9GRUVEQkFDS19NRVNTQUdFLFxuICAgICAgICAgICAgZmllbGRzOiBpbnZhbGlkRmllbGRzKHBhcnNlZC5lcnJvciksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2NvcGVkU2VsZihyZXEpLmxvZ0ZlZWRiYWNrKHBhcnNlZC5kYXRhKTtcbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBcImZlZWRiYWNrXCIsIFwiRmVlZGJhY2sgY291bGQgbm90IGJlIHJlY29yZGVkXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhc3Nlc3NtZW50SWQgPSByZXN1bHQuZGF0YTtcbiAgICAgICAgcmVzLmpzb24oe1xuICAgICAgICAgIG9rOiBhc3Nlc3NtZW50SWQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAuLi4oYXNzZXNzbWVudElkID8geyBhc3Nlc3NtZW50SWQgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIHRoZSBiZXN0LWVmZm9ydCBwZXItdmlld2VyIE1MZmxvdyBleHBlcmltZW50IGRlYnVnIGxpbmsuICovXG4gIHByaXZhdGUgcmVnaXN0ZXJNbGZsb3dFeHBlcmltZW50Um91dGUocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwibWxmbG93RXhwZXJpbWVudFwiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogcm91dGVzLk1BU1RSQV9ST1VURVMubWxmbG93RXhwZXJpbWVudCxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuZmVlZGJhY2tFbmFibGVkKCkpIHtcbiAgICAgICAgICByZXMuanNvbih7IHVybDogbnVsbCB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zY29wZWRTZWxmKHJlcSkuZmV0Y2hNbGZsb3dFeHBlcmltZW50VXJsKCk7XG4gICAgICAgIHJlcy5qc29uKHsgdXJsOiByZXN1bHQub2sgPyAocmVzdWx0LmRhdGEgPz8gbnVsbCkgOiBudWxsIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciB0aGUgZ2F0ZWQgTWFzdHJhIGNhdGNoLWFsbCBhZnRlciBldmVyeSBleHBsaWNpdCByb3V0ZS4gKi9cbiAgcHJpdmF0ZSByZWdpc3RlckFnZW50Um91dGVzKHJvdXRlcjogSUFwcFJvdXRlcik6IHZvaWQge1xuICAgIC8vIE1pZGRsZXdhcmUgcmF0aGVyIHRoYW4gYHRoaXMucm91dGVgOiB0aGlzIGlzIHRoZSBjYXRjaC1hbGwgdGhhdCBoYW5kc1xuICAgIC8vIGV2ZXJ5IHJlbWFpbmluZyBtZXRob2QgLyBwYXRoIHBhaXIgdG8gdGhlIE1hc3RyYSBzdWItYXBwLCBzbyBpdCBoYXMgbm9cbiAgICAvLyBzaW5nbGUgbWV0aG9kIG9yIHBhdGggdG8gcmVnaXN0ZXIgdW5kZXIuXG4gICAgcm91dGVyLnVzZSgocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgIGlmICghdGhpcy5tYXN0cmFBcHApIHJldHVybiByZXMuc3RhdHVzKDUwMykuZW5kKCk7XG4gICAgICAvLyBHYXRlIHRoZSBzdG9jayBNYXN0cmEgc3VyZmFjZSBiZWZvcmUgZGlzcGF0Y2guIEluIHRoZSBkZWZhdWx0XG4gICAgICAvLyBcInNjb3BlZFwiIG1vZGUgb25seSBhZ2VudCBpbmZlcmVuY2UsIHJlYWQtb25seSBhZ2VudCBtZXRhZGF0YSwgdGhpc1xuICAgICAgLy8gcGx1Z2luJ3Mgb3duIGAvcm91dGUvKmAgcm91dGVzLCBhbmQgKHdoZW4gZW5hYmxlZCkgTUNQIHJlYWNoIE1hc3RyYTtcbiAgICAgIC8vIGFkbWluIC8gbXV0YXRpbmcgLyBidWxrLWV4cG9ydCByb3V0ZXMgYXJlIHJlZnVzZWQgaGVyZS4gYHJlcS5wYXRoYFxuICAgICAgLy8gaXMgbW91bnQtcmVsYXRpdmUgdW5kZXIgdGhlIHBsdWdpbiBtb3VudC4gU2VlIGBzZXJ2ZXIudHNgLlxuICAgICAgaWYgKFxuICAgICAgICAhaXNNYXN0cmFSZXF1ZXN0QWxsb3dlZChyZXEubWV0aG9kLCByZXEucGF0aCwge1xuICAgICAgICAgIGFjY2VzczogdGhpcy5jb25maWcuYXBpQWNjZXNzID8/IFwic2NvcGVkXCIsXG4gICAgICAgICAgLy8gUmVmbGVjdCB0aGUgKnJlc29sdmVkKiBNQ1Agc3RhdGUsIG5vdCByYXcgYGNvbmZpZy5tY3BgOiBNQ1AgaXNcbiAgICAgICAgICAvLyBvbiBieSBkZWZhdWx0IChgY29uZmlnLm1jcGAgdW5kZWZpbmVkKSwgc28gZ2F0ZSBvbiB3aGV0aGVyIHRoZVxuICAgICAgICAgIC8vIHNlcnZlciB3YXMgYWN0dWFsbHkgYnVpbHQgYW5kIG1vdW50ZWQuXG4gICAgICAgICAgbWNwRW5hYmxlZDogdGhpcy5tY3AgIT09IG51bGwsXG4gICAgICAgIH0pXG4gICAgICApIHtcbiAgICAgICAgcmVzLnN0YXR1cyg0MDMpLmpzb24oeyBlcnJvcjogXCJFbmRwb2ludCBub3QgZXhwb3NlZCB0byB0aGUgY2xpZW50IChhcGlBY2Nlc3M9c2NvcGVkKVwiIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBEaXNwYXRjaCB0aHJvdWdoIGEgcmVhbCBtZXRob2QsIE5PVCB0aGUgYG1hc3RyYUFwcGAgcHJvcGVydHkuIFRoZVxuICAgICAgLy8gQXBwS2l0IGBhc1VzZXIocmVxKWAgcHJveHkgd3JhcHMgZnVuY3Rpb24tdmFsdWVkIHByb3BzIHdpdGhcbiAgICAgIC8vIGB2YWx1ZS5iaW5kKHRhcmdldClgLiBgbWFzdHJhQXBwYCBpcyBhbiBleHByZXNzIGFwcCB3aG9zZSBgLmJpbmRgIGlzXG4gICAgICAvLyB0aGUgSFRUUCBCSU5EIHJvdXRlIHJlZ2lzdHJhciAoZXhwcmVzcyBkZWZpbmVzIGEgbWV0aG9kIHBlciBIVFRQIHZlcmIsXG4gICAgICAvLyBhbmQgQklORCBpcyBvbmUpLCBub3QgYEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kYCAtIHNvIGJpbmRpbmcgaXQgdGhyb3VnaFxuICAgICAgLy8gdGhlIHByb3h5IHJlZ2lzdGVycyBhIGJvZ3VzIHJvdXRlIGFuZCBjcmFzaGVzIGBwYXRoVG9SZWdleHBgXG4gICAgICAvLyAoXCJwYXRoIG11c3QgYmUgYSBzdHJpbmcgLi4uXCIpLiBUaGlzIG9ubHkgbWFuaWZlc3RzIGluIHByb2R1Y3Rpb24gd2hlcmVcbiAgICAgIC8vIGFuIE9CTyB0b2tlbiBtYWtlcyBgc2NvcGVkU2VsZmAgcmV0dXJuIHRoZSBwcm94eS4gYGRpc3BhdGNoTWFzdHJhYFxuICAgICAgLy8gaXMgYSBwbGFpbiBtZXRob2QgKGl0cyBgLmJpbmRgIGlzIHRoZSBub3JtYWwgb25lKSBhbmQgaW52b2tlc1xuICAgICAgLy8gYHRoaXMubWFzdHJhQXBwYCBvZmYgdGhlIHJlYWwgdGFyZ2V0LCBrZWVwaW5nIHRoZSBPQk8gc2NvcGUgYWN0aXZlLlxuICAgICAgcmV0dXJuIHRoaXMuc2NvcGVkU2VsZihyZXEpLmRpc3BhdGNoTWFzdHJhKHJlcSwgcmVzLCBuZXh0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXAgYSBmYWlsZWQge0BsaW5rIEV4ZWN1dGlvblJlc3VsdH0gb250byB0aGUgcmVzcG9uc2U6IHRoZSBzdGF0dXMgdGhlXG4gICAqIGV4ZWN1dGlvbiBwaXBlbGluZSByZXNvbHZlZCwgcGFpcmVkIHdpdGggYGNsaWVudE1lc3NhZ2VgIHJhdGhlciB0aGFuIHRoZVxuICAgKiByZXN1bHQncyBvd24gdGV4dCwgd2hpY2ggY2FuIGNhcnJ5IHVwc3RyZWFtIGRldGFpbC4gVGhlIGZ1bGwgbWVzc2FnZSBpc1xuICAgKiBsb2dnZWQgdW5kZXIgYDxvcGVyYXRpb24+OmVycm9yYC5cbiAgICovXG4gIHByaXZhdGUgc2VuZEZhaWx1cmUoXG4gICAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICAgIHJlc3VsdDogeyBzdGF0dXM6IG51bWJlcjsgbWVzc2FnZTogc3RyaW5nIH0sXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgY2xpZW50TWVzc2FnZTogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci53YXJuKGAke29wZXJhdGlvbn06ZXJyb3JgLCB7XG4gICAgICBzdGF0dXM6IHJlc3VsdC5zdGF0dXMsXG4gICAgICBlcnJvcjogcmVzdWx0Lm1lc3NhZ2UsXG4gICAgfSk7XG4gICAgaWYgKHJlcy5oZWFkZXJzU2VudCkgcmV0dXJuO1xuICAgIHJlcy5zdGF0dXMocmVzdWx0LnN0YXR1cykuanNvbih7IGVycm9yOiBjbGllbnRNZXNzYWdlIH0pO1xuICB9XG5cbiAgLyoqIDQwNCBib2R5IGZvciBhIHJlcXVlc3QgbmFtaW5nIGFuIGFnZW50IHRoYXQgaXNuJ3QgcmVnaXN0ZXJlZC4gKi9cbiAgcHJpdmF0ZSB1bmtub3duQWdlbnRNZXNzYWdlKGFnZW50SWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVnaXN0ZXJlZCA9IE9iamVjdC5rZXlzKHRoaXMuYnVpbHQ/LmFnZW50cyA/PyB7fSk7XG4gICAgcmV0dXJuIGBVbmtub3duIGFnZW50IFwiJHthZ2VudElkfVwiLiBSZWdpc3RlcmVkIGFnZW50czogJHtyZWdpc3RlcmVkLmpvaW4oXCIsIFwiKSB8fCBcIm5vbmVcIn1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEludm9rZSB0aGUgTWFzdHJhIGV4cHJlc3Mgc3ViLWFwcC4gRXhpc3RzIGFzIGEgbWV0aG9kIChpbnN0ZWFkIG9mIHJlYWRpbmdcbiAgICogYHRoaXMubWFzdHJhQXBwYCB0aHJvdWdoIHRoZSBgYXNVc2VyKHJlcSlgIHByb3h5IGF0IHRoZSBjYWxsIHNpdGUpIHNvIHRoZVxuICAgKiBwcm94eSBiaW5kcyB0aGlzIHBsYWluIG1ldGhvZCAtIHdob3NlIGAuYmluZGAgaXMgYEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kYFxuICAgKiAtIHJhdGhlciB0aGFuIHRoZSBleHByZXNzIGFwcCwgd2hvc2UgYC5iaW5kYCBpcyB0aGUgSFRUUCBCSU5EIHJvdXRlXG4gICAqIHJlZ2lzdHJhciAoc2VlIHRoZSBub3RlIGluIGBpbmplY3RSb3V0ZXNgKS4gUnVucyBpbnNpZGUgdGhlIHVzZXIgc2NvcGUgc29cbiAgICogYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgcmV0dXJucyB0aGUgT0JPIGNsaWVudCBmb3IgdGhlIGFnZW50L21vZGVsXG4gICAqIHJlc29sdmVycy5cbiAgICovXG4gIHByaXZhdGUgZGlzcGF0Y2hNYXN0cmEoXG4gICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICAgIG5leHQ6IGV4cHJlc3MuTmV4dEZ1bmN0aW9uLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLm1hc3RyYUFwcCEocmVxLCByZXMsIG5leHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcCBhIGNsZWFuLCBtb3VudC1yZWxhdGl2ZSBNQ1AgYWxpYXMgcGF0aCB0byB0aGUgdW5kZXJseWluZ1xuICAgKiBgQG1hc3RyYS9leHByZXNzYCByb3V0ZS4gUmV0dXJucyBgbnVsbGAgd2hlbiBNQ1AgaXMgb2ZmIG9yIHRoZSBwYXRoXG4gICAqIGlzbid0IGFuIGFsaWFzLiBDb2xsYXBzZXMgdGhlIHN0b2NrIGAvbWNwLzxzZXJ2ZXJJZD4vPHRyYW5zcG9ydD5gXG4gICAqIGxheW91dCAoc2VydmVySWQgZGVmYXVsdHMgdG8gdGhlIHBsdWdpbiBuYW1lKSBkb3duIHRvIGAvbWNwYCxcbiAgICogYC9zc2VgLCBhbmQgYC9tZXNzYWdlc2AuXG4gICAqL1xuICBwcml2YXRlIG1jcFJvdXRlQWxpYXMocGF0aDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLm1jcCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgaWQgPSB0aGlzLm1jcC5zZXJ2ZXJJZDtcbiAgICBpZiAocGF0aCA9PT0gXCIvbWNwXCIpIHJldHVybiBgL21jcC8ke2lkfS9tY3BgO1xuICAgIGlmIChwYXRoID09PSBcIi9zc2VcIikgcmV0dXJuIGAvbWNwLyR7aWR9L3NzZWA7XG4gICAgaWYgKHBhdGggPT09IFwiL21lc3NhZ2VzXCIpIHJldHVybiBgL21jcC8ke2lkfS9tZXNzYWdlc2A7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gYmFja2luZyB0aGUgYC9zdWdnZXN0aW9uc2Agcm91dGUuIFJ1bnMgaW5zaWRlIHRoZVxuICAgKiBBcHBLaXQgdXNlci1jb250ZXh0IHByb3h5IHNvIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlXG4gICAqIE9CTy1zY29wZWQgY2xpZW50LiBSZXNvbHZlcyB0aGUgcGx1Z2luJ3MgR2VuaWUgc3BhY2VzIGFuZCBtZXJnZXNcbiAgICogdGhlaXIgY3VyYXRlZCBgc2FtcGxlX3F1ZXN0aW9uc2AgKHNlZSB7QGxpbmsgY29sbGVjdFNwYWNlU3VnZ2VzdGlvbnN9KS5cbiAgICogUmV0dXJucyBgW11gIHdoZW4gbm8gR2VuaWUgc3BhY2UgaXMgY29uZmlndXJlZCBzbyB0aGUgY2xpZW50XG4gICAqIHNob3dzIGEgYmFyZSBlbXB0eSBzdGF0ZSBpbnN0ZWFkIG9mIGJ1aWx0LWluIGV4YW1wbGUgcHJvbXB0cy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hTdWdnZXN0aW9ucyhzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PHN0cmluZ1tdPj4ge1xuICAgIGNvbnN0IHNwYWNlcyA9IHJlc29sdmVHZW5pZVNwYWNlcyh0aGlzLmNvbmZpZywgdGhpcy5jb250ZXh0KTtcbiAgICBpZiAoT2JqZWN0LmtleXMoc3BhY2VzKS5sZW5ndGggPT09IDApIHJldHVybiB7IG9rOiB0cnVlLCBkYXRhOiBbXSB9O1xuICAgIGNvbnN0IGNsaWVudCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQ7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSgoZXhlY3V0ZVNpZ25hbCkgPT4ge1xuICAgICAgY29uc3QgY29tYmluZWQgPSBhc3luY1V0aWxzLmNvbWJpbmVBYm9ydFNpZ25hbHMoc2lnbmFsLCBleGVjdXRlU2lnbmFsKTtcbiAgICAgIHJldHVybiBjb2xsZWN0U3BhY2VTdWdnZXN0aW9ucyh7XG4gICAgICAgIHNwYWNlcyxcbiAgICAgICAgY2xpZW50LFxuICAgICAgICAuLi4oY29tYmluZWQgPyB7IHNpZ25hbDogY29tYmluZWQgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH0sIGdlbmllU3VnZ2VzdGlvbkRlZmF1bHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBiYWNraW5nIHRoZSBgL3JvdXRlL2ZlZWRiYWNrYCByb3V0ZS4gUnVucyBpbnNpZGUgdGhlXG4gICAqIEFwcEtpdCB1c2VyLWNvbnRleHQgcHJveHkgc28gYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgcmV0dXJucyB0aGVcbiAgICogT0JPLXNjb3BlZCBjbGllbnQgYW5kIHRoZSBhc3Nlc3NtZW50IGlzIGF0dHJpYnV0ZWQgdG8gdGhlIHNpZ25lZC1pblxuICAgKiB1c2VyICh0aGVpciBlbWFpbCAvIGlkIGFzIHRoZSBhc3Nlc3NtZW50IHNvdXJjZSkuIFJldHVybnMgdGhlXG4gICAqIGNyZWF0ZWQgYXNzZXNzbWVudCBpZCBvbiBzdWNjZXNzLCBvciBgdW5kZWZpbmVkYCBvbiBhIHNvZnQgZmFpbHVyZVxuICAgKiAoc2VlIHtAbGluayBsb2dGZWVkYmFja30gaW4gYC4vbWxmbG93LmpzYCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvZ0ZlZWRiYWNrKFxuICAgIGZlZWRiYWNrOiBNYXN0cmFGZWVkYmFja1JlcXVlc3QsXG4gICk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PHN0cmluZyB8IHVuZGVmaW5lZD4+IHtcbiAgICBjb25zdCBjdHggPSBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gICAgY29uc3Qgc291cmNlSWQgPVxuICAgICAgXCJ1c2VyRW1haWxcIiBpbiBjdHggJiYgY3R4LnVzZXJFbWFpbFxuICAgICAgICA/IGN0eC51c2VyRW1haWxcbiAgICAgICAgOiBcInVzZXJJZFwiIGluIGN0eFxuICAgICAgICAgID8gY3R4LnVzZXJJZFxuICAgICAgICAgIDogY3R4LnNlcnZpY2VVc2VySWQ7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShcbiAgICAgICgpID0+XG4gICAgICAgIGxvZ0ZlZWRiYWNrKGN0eC5jbGllbnQsIHtcbiAgICAgICAgICAuLi5mZWVkYmFjayxcbiAgICAgICAgICAuLi4oc291cmNlSWQgPyB7IHNvdXJjZUlkIH0gOiB7fSksXG4gICAgICAgIH0pLFxuICAgICAgZmVlZGJhY2tXcml0ZURlZmF1bHRzLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhbiBleHBlcmltZW50IGxpbmsgdW5kZXIgdGhlIGFjdGl2ZSByZXF1ZXN0IGlkZW50aXR5LiBUaGUgaGVscGVyXG4gICAqIHJldHVybnMgbm8gVVJMIHVubGVzcyB0aGUgdmlld2VyIGhhcyBlZmZlY3RpdmUgYENBTl9NQU5BR0VgIHBlcm1pc3Npb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoTWxmbG93RXhwZXJpbWVudFVybCgpOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxzdHJpbmcgfCB1bmRlZmluZWQ+PiB7XG4gICAgY29uc3QgY2xpZW50ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpLmNsaWVudDtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKCgpID0+IG1sZmxvd0V4cGVyaW1lbnRNYW5hZ2VyVXJsKGNsaWVudCksIGZlZWRiYWNrV3JpdGVEZWZhdWx0cyk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gYmFja2luZyB0aGUgYGRhdGFgIGVtYmVkIHJlc29sdmVyXG4gICAqIChgR0VUIC9lbWJlZC9kYXRhLzppZGApLiBSdW5zIGluc2lkZSB0aGUgQXBwS2l0IHVzZXItY29udGV4dCBwcm94eSBzb1xuICAgKiBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYCByZXR1cm5zIHRoZSBPQk8tc2NvcGVkIHdvcmtzcGFjZVxuICAgKiBjbGllbnQsIHRoZW4gcmV1c2VzIHRoZSBzYW1lIGBmZXRjaFN0YXRlbWVudERhdGFgIHBpcGVsaW5lXG4gICAqIHRoZSBgZ2V0X3N0YXRlbWVudGAgdG9vbCBydW5zIHNvIHRoZSBMTE0gYW5kIHRoZSBVSSBzZWUgdGhlXG4gICAqIGV4YWN0IHNhbWUgc2hhcGUgZm9yIHRoZSBzYW1lIHN0YXRlbWVudC5cbiAgICpcbiAgICogUmVzb2x2ZXMgdG8gYHVuZGVmaW5lZGAgZGF0YSBmb3IgdXBzdHJlYW0gNDA0cyBzbyB0aGUgcm91dGUgY2FuIG1hcCB0aGVtXG4gICAqIHRvIGEgY2xlYW4gSFRUUCA0MDQ7IGFueSBvdGhlciBmYWlsdXJlIGNvbWVzIGJhY2sgYXMgYSBub24tYG9rYCByZXN1bHRcbiAgICogY2FycnlpbmcgdGhlIHN0YXR1cyB0byBhbnN3ZXIgd2l0aC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hTdGF0ZW1lbnQoXG4gICAgc3RhdGVtZW50SWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7IGxpbWl0PzogbnVtYmVyOyBzaWduYWw/OiBBYm9ydFNpZ25hbCB9ID0ge30sXG4gICk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PFN0YXRlbWVudERhdGEgfCB1bmRlZmluZWQ+PiB7XG4gICAgY29uc3QgY2xpZW50ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpLmNsaWVudDtcbiAgICBjb25zdCBsaW1pdCA9IE1hdGgubWluKG9wdGlvbnMubGltaXQgPz8gU1RBVEVNRU5UX1JPV19DQVAsIFNUQVRFTUVOVF9ST1dfQ0FQKTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFxuICAgICAgYXN5bmMgKGV4ZWN1dGVTaWduYWwpID0+IHtcbiAgICAgICAgY29uc3QgY29tYmluZWQgPSBhc3luY1V0aWxzLmNvbWJpbmVBYm9ydFNpZ25hbHMob3B0aW9ucy5zaWduYWwsIGV4ZWN1dGVTaWduYWwpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaFN0YXRlbWVudERhdGEoY2xpZW50LCBzdGF0ZW1lbnRJZCwge1xuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICAuLi4oY29tYmluZWQgPyB7IHNpZ25hbDogY29tYmluZWQgfSA6IHt9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29sdW1uczogZGF0YS5jb2x1bW5zLFxuICAgICAgICAgICAgcm93czogZGF0YS5yb3dzLFxuICAgICAgICAgICAgcm93Q291bnQ6IGRhdGEucm93Q291bnQsXG4gICAgICAgICAgICB0cnVuY2F0ZWQ6IGRhdGEucm93cy5sZW5ndGggPCBkYXRhLnJvd0NvdW50LFxuICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIC8vIFRoZSBEYXRhYnJpY2tzIFNESyB0aHJvd3Mgb24gNDA0OyBzdXJmYWNlIGFzIGB1bmRlZmluZWRgXG4gICAgICAgICAgLy8gc28gdGhlIHJvdXRlIG1hcHMgdG8gYSBjbGVhbiBIVFRQIDQwNCBpbnN0ZWFkIG9mIGEgNTAwLlxuICAgICAgICAgIGlmIChlcnJvclV0aWxzLmVycm9yQ29udGV4dChlcnIpLm5vdEFjY2Vzc2libGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgLi4uc3RhdGVtZW50RGF0YURlZmF1bHRzLmRlZmF1bHQsXG4gICAgICAgICAgLy8gTmFtZXNwYWNlZCBzbyB0aGUga2V5IGNhbid0IGNvbGxpZGUgd2l0aCBhbm90aGVyIGNhY2hlIHNoYXJpbmcgdGhlXG4gICAgICAgICAgLy8gbWFuYWdlciwgYW5kIGtleWVkIG9uIGBsaW1pdGAgYmVjYXVzZSB0aGUgc2xpY2UgaXMgcGFydCBvZiB0aGVcbiAgICAgICAgICAvLyBwYXlsb2FkLlxuICAgICAgICAgIGNhY2hlOiB7XG4gICAgICAgICAgICAuLi5zdGF0ZW1lbnREYXRhRGVmYXVsdHMuZGVmYXVsdC5jYWNoZSxcbiAgICAgICAgICAgIGNhY2hlS2V5OiBbU1RBVEVNRU5UX0NBQ0hFX05BTUVTUEFDRSwgc3RhdGVtZW50SWQsIGxpbWl0XSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIGJhY2tpbmcgdGhlIGBjaGFydGAgZW1iZWQgcmVzb2x2ZXJcbiAgICogKGBHRVQgL2VtYmVkL2NoYXJ0LzppZGApLiBSdW5zIGluc2lkZSB0aGUgQXBwS2l0IHVzZXItY29udGV4dCBwcm94eSBzbyB0aGVcbiAgICogbG9va3VwIGlzIG5hbWVzcGFjZWQgdG8gdGhlIGNhbGxpbmcgaWRlbnRpdHk6IGEgY2hhcnQgbWludGVkIGZvciBhbm90aGVyXG4gICAqIHVzZXIgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhbiB1bmtub3duIGlkLCBhbmQgdGhlIHJvdXRlIGFuc3dlcnMgNDA0LlxuICAgKlxuICAgKiBUaGUga2V5IGlzIGJ1aWx0IGZyb20ge0BsaW5rIGF0dHJpYnV0ZWRVc2VySWR9IC0gdGhlIHNhbWUgcnVsZSB0aGF0IG5hbWVkXG4gICAqIHRoZSBpZGVudGl0eSB0aGUgY2hhcnQgd2FzIHdyaXR0ZW4gdW5kZXIgLSByYXRoZXIgdGhhbiBmcm9tIHRoZSBhbWJpZW50XG4gICAqIGV4ZWN1dGlvbiBjb250ZXh0IGFsb25lLiBJbiBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgdGhlIGFtYmllbnQgY29udGV4dCBpc1xuICAgKiB0aGUgU1AgZm9yIGV2ZXJ5IGNhbGxlciwgc28ga2V5aW5nIG9mZiBpdCBhbG9uZSBtaXNzZWQgZXZlcnkgY2hhcnQgdGhlXG4gICAqIHR1cm4gaGFkIHdyaXR0ZW4gdW5kZXIgdGhlIGZvcndhcmRlZCB1c2VyIGFuZCB0aGUgVUkgc2hvd2VkIGVhY2ggb25lIGFzXG4gICAqIGV4cGlyZWQuIGByZXFgIGlzIHJlYWQgaW5zaWRlIHRoZSBtZXRob2QsIG5vdCBhdCB0aGUgY2FsbCBzaXRlLCBzbyB0aGVcbiAgICogZXhlY3V0aW9uIGNvbnRleHQgaXMgdGhlIHNjb3BlZCBvbmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoQ2hhcnRFbnRyeShcbiAgICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgICBjaGFydElkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogeyB0aW1lb3V0TXM/OiBudW1iZXI7IHNpZ25hbDogQWJvcnRTaWduYWwgfSxcbiAgKTogUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8Q2hhcnQgfCB1bmRlZmluZWQ+PiB7XG4gICAgY29uc3QgdXNlcktleSA9IGF0dHJpYnV0ZWRVc2VySWQoZ2V0RXhlY3V0aW9uQ29udGV4dCgpLCByZXF1ZXN0VXNlcklkKHJlcSkpO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoXG4gICAgICAoZXhlY3V0ZVNpZ25hbCkgPT5cbiAgICAgICAgZmV0Y2hDaGFydChjaGFydElkLCB7XG4gICAgICAgICAgdXNlcktleSxcbiAgICAgICAgICAuLi4ob3B0aW9ucy50aW1lb3V0TXMgIT09IHVuZGVmaW5lZCA/IHsgdGltZW91dE1zOiBvcHRpb25zLnRpbWVvdXRNcyB9IDoge30pLFxuICAgICAgICAgIHNpZ25hbDogYXN5bmNVdGlscy5jb21iaW5lQWJvcnRTaWduYWxzKG9wdGlvbnMuc2lnbmFsLCBleGVjdXRlU2lnbmFsKSA/PyBvcHRpb25zLnNpZ25hbCxcbiAgICAgICAgfSksXG4gICAgICBjaGFydEZldGNoRGVmYXVsdHMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBiYWNraW5nIHRoZSBgL21vZGVsc2Agcm91dGUuIFJ1bnMgaW5zaWRlIHRoZSBBcHBLaXRcbiAgICogdXNlci1jb250ZXh0IHByb3h5IHNvIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlIE9CTy1zY29wZWRcbiAgICogY2xpZW50IGFuZCB0aGUgY2F0YWxvZ3VlIHJlZmxlY3RzIHdoYXQgdGhlIGNhbGxlciBjYW4gaW52b2tlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsaXN0TW9kZWxzUmVzdWx0KCk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gICAgICBjb25zdCBjbGllbnQgPSBjb250ZXh0LmNsaWVudDtcbiAgICAgIGNvbnN0IGNhY2hlSWRlbnRpdHkgPSBleGVjdXRpb25Db250ZXh0VXNlcklkKGNvbnRleHQpO1xuICAgICAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHNlcnZpbmcgPSByZXNvbHZlU2VydmluZ0NvbmZpZyh0aGlzLmNvbmZpZyk7XG4gICAgICByZXR1cm4gbW9kZWxDYXRhbG9nLmxpc3RTZXJ2aW5nRW5kcG9pbnRzKGNsaWVudCwgaG9zdCwge1xuICAgICAgICB0dGxNczogc2VydmluZy50dGxNcyxcbiAgICAgICAgY2FjaGVJZGVudGl0eSxcbiAgICAgIH0pO1xuICAgIH0sIG1vZGVsQ2F0YWxvZ3VlRGVmYXVsdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIGJhY2tpbmcgdGhlIGBsaXN0TW9kZWxzYCBleHBvcnQuIFRoZSBwcm9ncmFtbWF0aWMgc3VyZmFjZVxuICAgKiBjYXJyaWVzIG5vIHN0YXR1cyBjb2RlLCBzbyBhIGZhaWxlZCBleGVjdXRpb24gYmVjb21lcyBhIHRocm93IHdpdGggYVxuICAgKiBzdGFibGUgbWVzc2FnZTsgdGhlIHJvdXRlcyBicmFuY2ggb24gdGhlIHtAbGluayBFeGVjdXRpb25SZXN1bHR9IGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxpc3RNb2RlbHMoKTogUHJvbWlzZTxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmxpc3RNb2RlbHNSZXN1bHQoKTtcbiAgICBpZiAocmVzdWx0Lm9rKSByZXR1cm4gcmVzdWx0LmRhdGE7XG4gICAgdGhpcy5sb2dnZXIud2FybihcImxpc3RNb2RlbHM6ZXJyb3JcIiwge1xuICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgZXJyb3I6IHJlc3VsdC5tZXNzYWdlLFxuICAgIH0pO1xuICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihNT0RFTF9DQVRBTE9HVUVfRkFJTEVEX01FU1NBR0UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZEFnZW50QW5kU2VydmVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFBlci1hZ2VudCBtZW1vcnkgZmFjdG9yeS4gV2hlbiBhbnkgc3RvcmFnZSAvIG1lbW9yeSBzZXR0aW5nIG5lZWRzXG4gICAgLy8gUG9zdGdyZXMsIHN0YW5kIHVwIGEgZGVkaWNhdGVkIHNlcnZpY2UtcHJpbmNpcGFsIHBvb2wgZmlyc3Qgc29cbiAgICAvLyBtZW1vcnkgYWN0cyBhcyB0aGUgYXBwIFNQIChvd25lciBvZiB0aGUgYG1hc3RyYV8qYCBzY2hlbWFzKSxcbiAgICAvLyBuZXZlciB0aGUgcGVyLXJlcXVlc3QgT0JPIGlkZW50aXR5IHRoZSBjaGF0IHR1cm4gcnVucyB1bmRlci5cbiAgICAvLyBgZ2V0UGdDb25maWcoKWAgaXMgcmVhZCBoZXJlLCBvdXRzaWRlIGFueSBgYXNVc2VyYCBzY29wZSwgc28gaXRcbiAgICAvLyByZXR1cm5zIHRoZSBTUCBjb25uZWN0aW9uIHRhcmdldCArIHRva2VuIHJlZnJlc2ggcGx1cyBhbnlcbiAgICAvLyBgbGFrZWJhc2UoeyBwb29sIH0pYCBvdmVycmlkZXM7IGByZXF1aXJlYCB0dXJucyBhIG1pc3NpbmdcbiAgICAvLyBzaWJsaW5nIGludG8gYSBjbGVhciB3aXJpbmcgZXJyb3IuIFRoZSBidWlsZGVyIGNhY2hlcyB0aGUgc2hhcmVkXG4gICAgLy8gYFBnVmVjdG9yYCBzaW5nbGV0b24gc28gcmVnaXN0ZXJpbmcgTiBhZ2VudHMgc3RheXMgY2hlYXAuIFNlZVxuICAgIC8vIGAuL21lbW9yeS5qc2AuXG4gICAgaWYgKG5lZWRzTGFrZWJhc2UodGhpcy5jb25maWcpKSB7XG4gICAgICBjb25zdCBzcFBnQ29uZmlnID0gcGx1Z2luUmVnaXN0cnlcbiAgICAgICAgLnJlcXVpcmUodGhpcy5jb250ZXh0LCBsYWtlYmFzZSwgdGhpcy5jb25maWcpXG4gICAgICAgIC5leHBvcnRzKClcbiAgICAgICAgLmdldFBnQ29uZmlnKCk7XG4gICAgICB0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sID0gYXdhaXQgY3JlYXRlU2VydmljZVByaW5jaXBhbFBvb2woc3BQZ0NvbmZpZyk7XG4gICAgfVxuICAgIGNvbnN0IG1lbW9yeUJ1aWxkZXIgPSB0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sXG4gICAgICA/IGNyZWF0ZU1lbW9yeUJ1aWxkZXIodGhpcy5jb25maWcsIHRoaXMuc2VydmljZVByaW5jaXBhbFBvb2wpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIC8vIEJ1aWxkIGV2ZXJ5IGFnZW50IGRlY2xhcmVkIGluIGBjb25maWcuYWdlbnRzYCAob3IgdGhlIGJ1aWx0LWluXG4gICAgLy8gZmFsbGJhY2sgd2hlbiBub25lIGFyZSBkZWNsYXJlZCkuIEVhY2ggYWdlbnQncyBgbW9kZWxgIHJlc29sdmVzXG4gICAgLy8gd29ya3NwYWNlIFVSTCArIGJlYXJlciBhdCBjYWxsIHRpbWUgc28gY29uY3VycmVudCByZXF1ZXN0cyBnZXRcbiAgICAvLyBkaXN0aW5jdCB1c2VyIGlkZW50aXRpZXM7IHRoZSBgYXNVc2VyKHJlcSlgIHNjb3BlIGFyb3VuZFxuICAgIC8vIGBoYW5kbGVDaGF0YCBpcyB3aGF0IGxldHMgYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgcmV0dXJuIHRoZVxuICAgIC8vIHJpZ2h0IHVzZXIgaW5zaWRlIHRoZSByZXNvbHZlci5cbiAgICAvLyBNYXRlcmlhbGl6ZSBhbnkgcmVtb3RlIEFnZW50LVNraWxsIHNvdXJjZXMgT05DRSBhdCBzdGFydHVwLiBSdW5zXG4gICAgLy8gb3V0c2lkZSBhIHJlcXVlc3Qgc2NvcGUsIHNvIGl0IHVzZXMgdGhlIGFwcCBzZXJ2aWNlIHByaW5jaXBhbCdzIGNsaWVudFxuICAgIC8vIGFuZCBkZWZhdWx0cyB0byB0aGUgc2hhcmVkIHdvcmtzcGFjZSBBc3Npc3RhbnQgc2tpbGxzIHRyZWU7IGEgc291cmNlXG4gICAgLy8gdGhhdCBsYW5kcyBvbiBhIGxvY2FsIHRlbXAgZGlyIChubyB3cml0YWJsZSB3b3Jrc3BhY2UpIGlzIGZvbGRlZCBpbnRvXG4gICAgLy8gZXZlcnkgZGVmYXVsdC13b3Jrc3BhY2UgYWdlbnQgdmlhIGBleHRyYVNraWxsUGF0aHNgLlxuICAgIGNvbnN0IHByb3Zpc2lvbmVkID0gYXdhaXQgcHJvdmlzaW9uUmVtb3RlU2tpbGxzKHRoaXMuY29uZmlnLnJlbW90ZVNraWxscyk7XG4gICAgaWYgKHByb3Zpc2lvbmVkLnNraWxsTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcInJlbW90ZSBza2lsbHMgY29uZmlndXJlZFwiLCB7XG4gICAgICAgIHNraWxsczogcHJvdmlzaW9uZWQuc2tpbGxOYW1lcyxcbiAgICAgICAgZGF0YWJyaWNrc0Jhc2VQYXRoOiBwcm92aXNpb25lZC5kYXRhYnJpY2tzQmFzZVBhdGgsXG4gICAgICAgIGxvY2FsU2tpbGxQYXRoczogcHJvdmlzaW9uZWQubG9jYWxTa2lsbFBhdGhzLmxlbmd0aCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuYnVpbHQgPSBhd2FpdCBidWlsZEFnZW50cyh7XG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgY29udGV4dDogdGhpcy5jb250ZXh0LFxuICAgICAgbWVtb3J5QnVpbGRlcixcbiAgICAgIGxvZzogdGhpcy5sb2dnZXIsXG4gICAgICBleHRyYVNraWxsUGF0aHM6IHByb3Zpc2lvbmVkLmxvY2FsU2tpbGxQYXRocyxcbiAgICB9KTtcblxuICAgIC8vIGBtYXN0cmEuc2VydmVyLmFwaVJvdXRlc2AgaXMgb25seSBob25vcmVkIGJ5IE1hc3RyYSdzIHN0YW5kYWxvbmVcbiAgICAvLyBkZXYgc2VydmVyLiBTaW5jZSB3ZSdyZSBob3N0aW5nIE1hc3RyYSBpbnNpZGUgb3VyIG93biBFeHByZXNzXG4gICAgLy8gc3ViYXBwIHZpYSBgQG1hc3RyYS9leHByZXNzYCwgY3VzdG9tIHJvdXRlcyBtdXN0IGJlIHBhc3NlZCB0b1xuICAgIC8vIHRoZSBgTWFzdHJhU2VydmVyYCBjb25zdHJ1Y3RvciBkaXJlY3RseS5cbiAgICAvL1xuICAgIC8vIGBzdG9yYWdlYCBoZXJlIGlzICpNYXN0cmEtaW5zdGFuY2UtbGV2ZWwqIGFuZCBwZXJzaXN0cyB3b3JrZmxvd1xuICAgIC8vIHNuYXBzaG90cyAod2hlcmUgc3VzcGVuZGVkIGByZXF1aXJlQXBwcm92YWxgIHRvb2wgY2FsbHMgbGl2ZSkuXG4gICAgLy8gSXQncyBzZXBhcmF0ZSBmcm9tIGVhY2ggYWdlbnQncyBgTWVtb3J5LnN0b3JhZ2VgLCB3aGljaCBvbmx5XG4gICAgLy8gY292ZXJzIHRocmVhZCAvIG1lc3NhZ2UgaGlzdG9yeS4gV2l0aG91dCBpdCxcbiAgICAvLyBgYWdlbnQucmVzdW1lU3RyZWFtKClgIGVycm9ycyB3aXRoIFwiY291bGQgbm90IGZpbmQgYSBzdXNwZW5kZWRcbiAgICAvLyBydW5cIiBhbmQgdGhlIGFwcHJvdmFsIFVJIGhhbmdzIGFmdGVyIHRoZSB1c2VyIGNsaWNrcyBBcHByb3ZlLlxuICAgIGNvbnN0IGluc3RhbmNlU3RvcmFnZSA9IG1lbW9yeUJ1aWxkZXI/Lmluc3RhbmNlU3RvcmFnZSgpO1xuICAgIC8vIFdpcmUgTWFzdHJhJ3MgdHJhY2VyIGludG8gQXBwS2l0J3MgZ2xvYmFsIE9UZWwgcGlwZWxpbmUgdmlhXG4gICAgLy8gYEBtYXN0cmEvb3RlbC1icmlkZ2VgLiBNYXN0cmEgc3BhbnMgYmVjb21lIG5hdGl2ZSBPVGVsIHNwYW5zIG9uXG4gICAgLy8gd2hhdGV2ZXIgdHJhY2VyIHByb3ZpZGVyIGBUZWxlbWV0cnlNYW5hZ2VyYCByZWdpc3RlcmVkIGR1cmluZ1xuICAgIC8vIGBjcmVhdGVBcHBgLCBzbyB0aGUgT1RMUCBlbmRwb2ludCAvIGhlYWRlcnMgLyBzYW1wbGluZyBhcmVcbiAgICAvLyBlbnYtZHJpdmVuIGFuZCBzaGFyZWQgd2l0aCBldmVyeSBvdGhlciBBcHBLaXQgcGx1Z2luLlxuICAgIGNvbnN0IG9ic2VydmFiaWxpdHkgPSBhd2FpdCBidWlsZE9ic2VydmFiaWxpdHkoe1xuICAgICAgc2VydmljZU5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGVuYWJsZWQ6IHRoaXMuY29uZmlnLm9ic2VydmFiaWxpdHksXG4gICAgfSk7XG4gICAgLy8gT3B0aW9uYWwgTUNQIGV4cG9zdXJlOiBidWlsZCBhIE1hc3RyYSBNQ1Agc2VydmVyIGZyb20gdGhlXG4gICAgLy8gcmVnaXN0ZXJlZCBhZ2VudHMgKGFuZCwgb3B0LWluLCB0aGUgYW1iaWVudCB0b29scykgYW5kIHJlZ2lzdGVyXG4gICAgLy8gaXQgb24gdGhlIE1hc3RyYSBpbnN0YW5jZS4gYEBtYXN0cmEvZXhwcmVzc2Agc2VydmVzIHRoZSBzdG9jayBNQ1BcbiAgICAvLyB0cmFuc3BvcnQgcm91dGVzIChgL21jcC88c2VydmVySWQ+Ly4uLmApIG9mZiBgbWNwU2VydmVyc2AsIHNvIHRoZVxuICAgIC8vIGNhdGNoLWFsbCBkaXNwYXRjaCBiZWxvdyBhbHJlYWR5IHJvdXRlcyBNQ1AgcmVxdWVzdHMgdW5kZXIgT0JPIC1cbiAgICAvLyBubyBiZXNwb2tlIHJvdXRlIG5lZWRlZC4gU2VlIGAuL21jcC5qc2AuXG4gICAgdGhpcy5tY3AgPSBidWlsZE1jcFNlcnZlcih7XG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgcGx1Z2luTmFtZTogdGhpcy5uYW1lLFxuICAgICAgZGlzcGxheU5hbWU6IE1hc3RyYVBsdWdpbi5tYW5pZmVzdC5kaXNwbGF5TmFtZSxcbiAgICAgIGFnZW50czogdGhpcy5idWlsdC5hZ2VudHMsXG4gICAgICBhbWJpZW50VG9vbHM6IHRoaXMuYnVpbHQuYW1iaWVudFRvb2xzLFxuICAgIH0pO1xuICAgIHRoaXMubWFzdHJhID0gbmV3IE1hc3RyYSh7XG4gICAgICBhZ2VudHM6IHRoaXMuYnVpbHQuYWdlbnRzLFxuICAgICAgLi4uKGluc3RhbmNlU3RvcmFnZSA/IHsgc3RvcmFnZTogaW5zdGFuY2VTdG9yYWdlIH0gOiB7fSksXG4gICAgICAuLi4ob2JzZXJ2YWJpbGl0eSA/IHsgb2JzZXJ2YWJpbGl0eSB9IDoge30pLFxuICAgICAgLi4uKHRoaXMubWNwID8geyBtY3BTZXJ2ZXJzOiB7IFt0aGlzLm1jcC5zZXJ2ZXJJZF06IHRoaXMubWNwLnNlcnZlciB9IH0gOiB7fSksXG4gICAgfSk7XG4gICAgdGhpcy5tYXN0cmFBcHAgPSBleHByZXNzKCk7XG4gICAgYXR0YWNoUm91dGVQYXRjaE1pZGRsZXdhcmUodGhpcy5tYXN0cmFBcHApO1xuICAgIC8vIFN0YW1wIGNoYXQgcmVxdWVzdC9yZXNwb25zZSBvbnRvIHRoZSBIVFRQIHJvb3Qgc3BhbiBzbyBNTGZsb3cnc1xuICAgIC8vIFVDIGAqX3RyYWNlX3VuaWZpZWRgIHZpZXcgY2FuIHN1cmZhY2UgdGhlbSAoTWFzdHJhJ3Mgb3duXG4gICAgLy8gYG1hc3RyYS5hZ2VudF9ydW4uKmAgYXR0cmlidXRlcyBzaXQgb24gYSBjaGlsZCBzcGFuIHRoZSB2aWV3XG4gICAgLy8gbmV2ZXIgcmVhZHMpLiBNdXN0IHJ1biBiZWZvcmUgYE1hc3RyYVNlcnZlci5pbml0YCBzbyB0aGUgbGF5ZXJcbiAgICAvLyBzaXRzIGFoZWFkIG9mIHRoZSBhZ2VudCByb3V0ZXMuXG4gICAgYXR0YWNoQ2hhdFR1cm5UZWxlbWV0cnkodGhpcy5tYXN0cmFBcHAsIHtcbiAgICAgIGlkZW50aXR5OiAocmVxdWVzdCkgPT5cbiAgICAgICAgdXNlU2VydmljZVByaW5jaXBhbCh0aGlzLmlkZW50aXR5TW9kZSwgcmVxdWVzdCkgPyBcInNlcnZpY2UtcHJpbmNpcGFsXCIgOiBcIm9ib1wiLFxuICAgIH0pO1xuICAgIHRoaXMubWFzdHJhU2VydmVyID0gbmV3IE1hc3RyYVNlcnZlcih0aGlzLmNvbmZpZywge1xuICAgICAgYXBwOiB0aGlzLm1hc3RyYUFwcCxcbiAgICAgIG1hc3RyYTogdGhpcy5tYXN0cmEsXG4gICAgICBwcmVmaXg6IFwiXCIsXG4gICAgICBjdXN0b21BcGlSb3V0ZXM6IGFnZW50Q2hhdFJvdXRlcygpLFxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMubWFzdHJhU2VydmVyLmluaXQoKTtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKFwicmVhZHlcIiwge1xuICAgICAgYWdlbnRzOiBPYmplY3Qua2V5cyh0aGlzLmJ1aWx0LmFnZW50cyksXG4gICAgICBkZWZhdWx0QWdlbnQ6IHRoaXMuYnVpbHQuZGVmYXVsdEFnZW50SWQsXG4gICAgICBhcGlBY2Nlc3M6IHRoaXMuY29uZmlnLmFwaUFjY2VzcyA/PyBcInNjb3BlZFwiLFxuICAgICAgbWNwOiB0aGlzLm1jcCA/IGAke3RoaXMuYmFzZVBhdGh9JHt0aGlzLm1jcC5odHRwUGF0aH1gIDogXCJvZmZcIixcbiAgICAgIGxha2ViYXNlOiBtZW1vcnlCdWlsZGVyICE9PSB1bmRlZmluZWQsXG4gICAgICBmZWVkYmFjazogdGhpcy5mZWVkYmFja0VuYWJsZWQoKSxcbiAgICAgIG9ic2VydmFiaWxpdHk6IG9ic2VydmFiaWxpdHkgIT09IHVuZGVmaW5lZCA/IFwibWxmbG93XCIgOiBcIm9mZlwiLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXIgZm9yIG9uZSBlbWJlZCBgPHR5cGU+YCBiZWhpbmQgdGhlIGdlbmVyaWNcbiAqIGBHRVQgL2VtYmVkLzp0eXBlLzppZGAgcm91dGUuIFJldHVybnMgdGhlIEpTT04gYm9keSB0byBzZW5kIG9uXG4gKiBzdWNjZXNzLCBvciBgdW5kZWZpbmVkYCB0byBzaWduYWwgYSA0MDQgKHVua25vd24gLyBleHBpcmVkIGlkKS5cbiAqIGBzaWduYWxgIGFib3J0cyB3aGVuIHRoZSBjbGllbnQgZGlzY29ubmVjdHMgc28gbG9uZy1wb2xsaW5nXG4gKiByZXNvbHZlcnMgKGUuZy4gYGNoYXJ0YCkgdW5ibG9jayBpbW1lZGlhdGVseS5cbiAqL1xudHlwZSBFbWJlZFJlc29sdmVyID0gKFxuICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgaWQ6IHN0cmluZyxcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbikgPT4gUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8dW5rbm93bj4+O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBvcHRpb25hbCBgP3RpbWVvdXRNcz08bj5gIHF1ZXJ5IHBhcmFtZXRlciBmcm9tIGFcbiAqIGBHRVQgL2VtYmVkL2NoYXJ0LzppZGAgcmVxdWVzdC4gQWNjZXB0cyBhIHBvc2l0aXZlIGludGVnZXIgdXBcbiAqIHRvIHtAbGluayBNQVhfRU1CRURfUE9MTF9USU1FT1VUX01TfSAoY2xhbXBlZCkgYW5kIHJlamVjdHMgZXZlcnl0aGluZyBlbHNlXG4gKiBhcyBgdW5kZWZpbmVkYCBzbyB7QGxpbmsgZmV0Y2hDaGFydH0gZmFsbHMgYmFjayB0byBpdHMgZGVmYXVsdC5cbiAqIEV4cHJlc3MgcHJvZHVjZXMgYHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkYDsgd2Ugbm9ybWFsaXplXG4gKiB0byB0aGUgZmlyc3Qgc2NhbGFyIGJlZm9yZSBwYXJzaW5nLlxuICovXG5mdW5jdGlvbiBwYXJzZVRpbWVvdXRNcyhyYXc6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCB2ID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3WzBdIDogcmF3O1xuICBpZiAodHlwZW9mIHYgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG4gPSBvYmplY3QudG9OdW1iZXIodik7XG4gIGlmIChuID09PSB1bmRlZmluZWQgfHwgbiA8PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gTWF0aC5taW4oTWF0aC5mbG9vcihuKSwgTUFYX0VNQkVEX1BPTExfVElNRU9VVF9NUyk7XG59XG5cbi8qKlxuICogUGFyc2UgdGhlIG9wdGlvbmFsIGA/bGltaXQ9PG4+YCBxdWVyeSBwYXJhbWV0ZXIgZnJvbSBhXG4gKiBgR0VUIC9lbWJlZC9kYXRhLzppZGAgcmVxdWVzdC4gQWNjZXB0cyBhIG5vbi1uZWdhdGl2ZVxuICogaW50ZWdlciBhbmQgbGV0cyB0aGUgcm91dGUgY2xhbXAgdG8gYFNUQVRFTUVOVF9ST1dfQ0FQYDtcbiAqIHJlamVjdHMgYW55dGhpbmcgZWxzZSBhcyBgdW5kZWZpbmVkYCBzbyB0aGUgcm91dGUgZmFsbHMgYmFja1xuICogdG8gdGhlIHNlcnZlci1zaWRlIGNhcC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGF0ZW1lbnRMaW1pdChyYXc6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCB2ID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3WzBdIDogcmF3O1xuICBpZiAodHlwZW9mIHYgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG4gPSBvYmplY3QudG9OdW1iZXIodik7XG4gIGlmIChuID09PSB1bmRlZmluZWQgfHwgbiA8IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBNYXRoLmZsb29yKG4pO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBNYXN0cmEgcGx1Z2luIG9uIGFuIEFwcEtpdCBhcHAuIE1vdW50cyB0aGUgYWdlbnRzLCB0aGVcbiAqIGAvcm91dGUvKmAgY2hhdCBzdXJmYWNlLCBhbmQgKHVubGVzcyBkaXNhYmxlZCkgdGhlIE1DUCB0cmFuc3BvcnQgdW5kZXJcbiAqIGAvYXBpL21hc3RyYWAuXG4gKlxuICogQGV4YW1wbGUgTWluaW1hbCBhcHBcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBtYXN0cmEgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG4gKlxuICogLy8gTm8gYGFnZW50c2A6IGEgc2luZ2xlIGJ1aWx0LWluIGBkZWZhdWx0YCBhbmFseXN0IGlzIHJlZ2lzdGVyZWQsIHNvIHRoZVxuICogLy8gY2hhdCBlbmRwb2ludCB3b3JrcyBvdXQgb2YgdGhlIGJveC5cbiAqIGNvbnN0IGFwcCA9IGF3YWl0IGNyZWF0ZUFwcCh7IHBsdWdpbnM6IFttYXN0cmEoKV0gfSk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBUd28gYWdlbnRzLCBhIHBpbm5lZCBtb2RlbCwgYW5kIEdlbmllXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY3JlYXRlQXBwLCBsYWtlYmFzZSB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IGNyZWF0ZUFnZW50LCBtYXN0cmEgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG4gKlxuICogY29uc3QgYXBwID0gYXdhaXQgY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW1xuICogICAgIGxha2ViYXNlKCksXG4gKiAgICAgbWFzdHJhKHtcbiAqICAgICAgIGRlZmF1bHRNb2RlbDogXCJkYXRhYnJpY2tzLWNsYXVkZS1zb25uZXQtNC02XCIsXG4gKiAgICAgICBkZWZhdWx0QWdlbnQ6IFwiYW5hbHlzdFwiLFxuICogICAgICAgZ2VuaWVTcGFjZXM6IHsgc2FsZXM6IHsgc3BhY2VJZDogXCIwMWVmLi4uXCIsIGhpbnQ6IFwib3JkZXJzLCByZXR1cm5zXCIgfSB9LFxuICogICAgICAgYWdlbnRzOiB7XG4gKiAgICAgICAgIGFuYWx5c3Q6IGNyZWF0ZUFnZW50KHtcbiAqICAgICAgICAgICBpbnN0cnVjdGlvbnM6IFwiWW91IGFuc3dlciBxdWVzdGlvbnMgYWJvdXQgc2FsZXMuXCIsXG4gKiAgICAgICAgICAgYXN5bmMgdG9vbHMocGx1Z2lucykge1xuICogICAgICAgICAgICAgcmV0dXJuIHsgLi4uKGF3YWl0IHBsdWdpbnMuZ2VuaWU/LnRvb2xraXQoKSkgfTtcbiAqICAgICAgICAgICB9LFxuICogICAgICAgICB9KSxcbiAqICAgICAgICAgaGVscGVyOiBjcmVhdGVBZ2VudCh7IGluc3RydWN0aW9uczogXCJZb3UgZXhwbGFpbiB0aGUgYW5hbHlzdCdzIGFuc3dlcnMuXCIgfSksXG4gKiAgICAgICB9LFxuICogICAgIH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IG1hc3RyYSA9IHRvUGx1Z2luKE1hc3RyYVBsdWdpbik7XG4iXX0=
|