@dbx-tools/appkit-mastra 0.9.117 → 0.9.119

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/lib/src/model.js CHANGED
@@ -21,10 +21,12 @@
21
21
  *
22
22
  * @module
23
23
  */
24
- import { getExecutionContext } from "@databricks/appkit";
24
+ import { createWorkspaceClient } from "@databricks/appkit";
25
+ import { appkit } from "@dbx-tools/appkit";
25
26
  import { classes, policy, resolve } from "@dbx-tools/model";
26
27
  import { createDatabricksLanguageModel } from "@dbx-tools/model-protocol/provider";
27
28
  import { log } from "@dbx-tools/shared-core";
29
+ import { RequestContext } from "@mastra/core/request-context";
28
30
  import { MASTRA_USER_KEY } from "./config.js";
29
31
  import { MASTRA_MODEL_OVERRIDE_KEY, MASTRA_RESOLVED_MODEL_KEY, resolveServingConfig, } from "./serving.js";
30
32
  import { recordActiveTraceAuth, recordActiveTraceModel } from "./telemetry.js";
@@ -40,6 +42,22 @@ export const RESPONSES_PROVIDER_OPTIONS = {
40
42
  export function servingApi(modelId) {
41
43
  return policy.modelServingApi(modelId);
42
44
  }
45
+ /** Resolve an OBO workspace client when present, else a service-principal client. */
46
+ function resolveModelWorkspaceContext(requestContext) {
47
+ const user = requestContext?.get(MASTRA_USER_KEY);
48
+ const executionContext = user?.executionContext ?? appkit.tryGetExecutionContext();
49
+ if (executionContext?.client.config) {
50
+ return {
51
+ client: executionContext.client,
52
+ auth: "isUserContext" in executionContext ? "obo" : "service-principal",
53
+ };
54
+ }
55
+ return { client: createWorkspaceClient(), auth: "service-principal" };
56
+ }
57
+ /** Resolve the workspace client used for model discovery and inference. */
58
+ export function resolveModelWorkspaceClient(requestContext) {
59
+ return resolveModelWorkspaceContext(requestContext).client;
60
+ }
43
61
  function selectionInput(config, requested, defaultClass, serving = resolveServingConfig(config)) {
44
62
  const requestedClass = requested !== undefined ? parseModelClass(requested) : null;
45
63
  const explicit = requestedClass === null ? requested : undefined;
@@ -80,21 +98,21 @@ export function resolveDefaultModelId(config, endpoints, overrides = {}) {
80
98
  * endpoint.
81
99
  */
82
100
  export async function buildModel(config, requestContext, overrides = {}) {
101
+ const context = requestContext ?? new RequestContext();
83
102
  // The chat path stamps the AppKit user on the request context via
84
103
  // `MastraServer`. The MCP transport routes don't thread that context
85
104
  // into tool execution, so fall back to the ambient execution context
86
105
  // (the active OBO scope, or the service principal) when it's absent.
87
- const user = requestContext.get(MASTRA_USER_KEY);
88
- const executionContext = user?.executionContext ?? getExecutionContext();
89
- recordActiveTraceAuth("isUserContext" in executionContext ? "obo" : "service-principal");
90
- const clientConfig = executionContext.client.config;
106
+ const { client, auth } = resolveModelWorkspaceContext(context);
107
+ recordActiveTraceAuth(auth);
108
+ const clientConfig = client.config;
91
109
  const host = (await clientConfig.getHost()).toString();
92
110
  const headers = new Headers();
93
111
  await clientConfig.authenticate(headers);
94
112
  const logger = log.logger(config);
95
113
  const serving = resolveServingConfig(config);
96
114
  const override = serving.allowOverride
97
- ? requestContext.get(MASTRA_MODEL_OVERRIDE_KEY)
115
+ ? context.get(MASTRA_MODEL_OVERRIDE_KEY)
98
116
  : undefined;
99
117
  // The override / agent default / env value can be either a concrete
100
118
  // endpoint name or a model class slug ("chat-thinking" /
@@ -104,9 +122,9 @@ export async function buildModel(config, requestContext, overrides = {}) {
104
122
  // internal `overrides.modelClass` (e.g. the chart planner) is the
105
123
  // floor when nothing was requested.
106
124
  const requested = override ?? overrides.modelId ?? process.env.DATABRICKS_SERVING_ENDPOINT_NAME;
107
- const { modelId, source } = await selectModel(executionContext.client, host, selectionInput(config, requested, overrides.modelClass, serving));
125
+ const { modelId, source } = await selectModel(client, host, selectionInput(config, requested, overrides.modelClass, serving));
108
126
  logger.debug("model selected", { modelId, source, requested });
109
- requestContext.set(MASTRA_RESOLVED_MODEL_KEY, modelId);
127
+ context.set(MASTRA_RESOLVED_MODEL_KEY, modelId);
110
128
  recordActiveTraceModel(modelId);
111
129
  return createDatabricksLanguageModel({
112
130
  modelId,
@@ -116,4 +134,4 @@ export async function buildModel(config, requestContext, overrides = {}) {
116
134
  providerName: config.providerId ?? "openai",
117
135
  });
118
136
  }
119
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFFSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFLN0MsT0FBTyxFQUFFLGVBQWUsRUFBc0MsTUFBTSxhQUFhLENBQUM7QUFDbEYsT0FBTyxFQUNMLHlCQUF5QixFQUN6Qix5QkFBeUIsRUFDekIsb0JBQW9CLEdBQ3JCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRy9FLE1BQU0sRUFBRSxlQUFlLEVBQUUsR0FBRyxPQUFPLENBQUM7QUFDcEMsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FBQztBQUVoQyw4RkFBOEY7QUFDOUYsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUc7SUFDeEMsTUFBTSxFQUFFO1FBQ04sS0FBSyxFQUFFLEtBQUs7S0FDYjtDQUNPLENBQUM7QUFFWCxpRkFBaUY7QUFDakYsTUFBTSxVQUFVLFVBQVUsQ0FBQyxPQUFlO0lBQ3hDLE9BQU8sTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBcUJELFNBQVMsY0FBYyxDQUNyQixNQUEwQixFQUMxQixTQUE2QixFQUM3QixZQUFvQyxFQUNwQyxPQUFPLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxDQUFDO0lBRXRDLE1BQU0sY0FBYyxHQUFHLFNBQVMsS0FBSyxT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RSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxXQUFXLENBQzNDLGdCQUFnQixDQUFDLE1BQU0sRUFDdkIsSUFBSSxFQUNKLGNBQWMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQ2pFLENBQUM7SUFDRixNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQy9ELGNBQWMsQ0FBQyxHQUFHLENBQUMseUJBQXlCLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdkQsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFaEMsT0FBTyw2QkFBNkIsQ0FBQztRQUNuQyxPQUFPO1FBQ1AsUUFBUSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDN0IsSUFBSTtRQUNKLE9BQU8sRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM5QyxZQUFZLEVBQUUsTUFBTSxDQUFDLFVBQVUsSUFBSSxRQUFRO0tBQzVDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERhdGFicmlja3MgTW9kZWwgU2VydmluZyByZXNvbHZlciBmb3IgTWFzdHJhIGFnZW50cy5cbiAqXG4gKiBFYWNoIGFnZW50IHN0ZXAgY2FsbHMge0BsaW5rIGJ1aWxkTW9kZWx9IHdpdGggdGhlIGFjdGl2ZVxuICogYFJlcXVlc3RDb250ZXh0YC4gVGhlIHVzZXIgc3RhbXBlZCBieSBgTWFzdHJhU2VydmVyYCBjYXJyaWVzIGFuXG4gKiBBcHBLaXQgYFdvcmtzcGFjZUNsaWVudGA7IHdlIGFzayBpdCBmb3IgdGhlIHdvcmtzcGFjZSBob3N0IGFuZCBhXG4gKiBmcmVzaCBiZWFyZXIgaGVhZGVyLCB0aGVuIGNvbnN0cnVjdCBhIHJlcXVlc3Qtc2NvcGVkIFZlcmNlbCBBSSBTREsgcHJvdmlkZXJcbiAqIGZvciB0aGUgZW5kcG9pbnQncyBuYXRpdmUgRGF0YWJyaWNrcyBzZXJ2aW5nIHByb3RvY29sLlxuICpcbiAqIFRoaXMgbW9kdWxlIG9ubHkgYWRkcyB0aGUgTWFzdHJhLXNwZWNpZmljIGdsdWUuIFRoZSBhY3R1YWwgbW9kZWxcbiAqIHNlbGVjdGlvbiAtIGxpc3RpbmcgdGhlIHdvcmtzcGFjZSBjYXRhbG9ndWUgYW5kIHJlc29sdmluZyBhblxuICogZXhwbGljaXQgbmFtZSAvIGNsYXNzIC8gZmFsbGJhY2sgY2hhaW4gdG8gYSByZWFsIGVuZHBvaW50IGlkIC0gbGl2ZXNcbiAqIGluIGBAZGJ4LXRvb2xzL21vZGVsYCAoe0BsaW5rIHNlbGVjdE1vZGVsfSkgc28gbm9uLU1hc3RyYSBjb25zdW1lcnNcbiAqIChlLmcuIGEgam9iIHRoYXQganVzdCBuZWVkcyBhIG1vZGVsIG5hbWUpIGNhbiByZXVzZSBpdC4gSGVyZSB3ZVxuICogYXNzZW1ibGUgdGhlIGV4cGxpY2l0IGFzayBmcm9tIE1hc3RyYSdzIHJlcXVlc3QgY29udGV4dCAodGhlXG4gKiBwZXItcmVxdWVzdCBvdmVycmlkZSB1bmRlciB7QGxpbmsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWX0sIHRoZVxuICogYWdlbnQgLyBwbHVnaW4gYG1vZGVsSWRgLCBvciBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgKSxcbiAqIHBhc3MgdGhlIHBsdWdpbidzIGZ1enp5IC8gY2xhc3MgLyBmYWxsYmFjayBrbm9icyB0aHJvdWdoLCBhbmQgd3JhcFxuICogdGhlIHJlc29sdmVkIGlkIGluIHRoZSBQcm92aWRlclY0IG1vZGVsIE1hc3RyYSBhY2NlcHRzLiBDYXRhbG9ndWUgZmV0Y2hlcyBmYWlsIGxvdWQ6IG5ldHdvcmsgLyBhdXRoIGVycm9yc1xuICogcHJvcGFnYXRlIHNvIGNhbGxlcnMgc2VlIHRoZSByZWFsIFNESyBtZXNzYWdlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBnZXRFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY2xhc3NlcywgcG9saWN5LCByZXNvbHZlIH0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmltcG9ydCB7IGNyZWF0ZURhdGFicmlja3NMYW5ndWFnZU1vZGVsIH0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWwtcHJvdG9jb2wvcHJvdmlkZXJcIjtcbmltcG9ydCB7IGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IE1hc3RyYU1vZGVsQ29uZmlnIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9sbG1cIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuXG5pbXBvcnQgeyBNQVNUUkFfVVNFUl9LRVksIHR5cGUgTWFzdHJhUGx1Z2luQ29uZmlnLCB0eXBlIFVzZXIgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7XG4gIE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVksXG4gIE1BU1RSQV9SRVNPTFZFRF9NT0RFTF9LRVksXG4gIHJlc29sdmVTZXJ2aW5nQ29uZmlnLFxufSBmcm9tIFwiLi9zZXJ2aW5nLnRzXCI7XG5pbXBvcnQgeyByZWNvcmRBY3RpdmVUcmFjZUF1dGgsIHJlY29yZEFjdGl2ZVRyYWNlTW9kZWwgfSBmcm9tIFwiLi90ZWxlbWV0cnkudHNcIjtcblxudHlwZSBNb2RlbENsYXNzID0gbW9kZWwuTW9kZWxDbGFzcztcbmNvbnN0IHsgcGFyc2VNb2RlbENsYXNzIH0gPSBjbGFzc2VzO1xuY29uc3QgeyBzZWxlY3RNb2RlbCB9ID0gcmVzb2x2ZTtcblxuLyoqIEtlZXAgUmVzcG9uc2VzIHR1cm5zIHN0YXRlbGVzcyBzbyB0b29sIGNvbnRpbnVhdGlvbnMgcmVwbGF5IGVuY3J5cHRlZCByZWFzb25pbmcgaW5saW5lLiAqL1xuZXhwb3J0IGNvbnN0IFJFU1BPTlNFU19QUk9WSURFUl9PUFRJT05TID0ge1xuICBvcGVuYWk6IHtcbiAgICBzdG9yZTogZmFsc2UsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG4vKiogUGljayB0aGUgbmF0aXZlIERhdGFicmlja3MgaW5mZXJlbmNlIHN1cmZhY2UgcmVxdWlyZWQgYnkgYSByZXNvbHZlZCBtb2RlbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2aW5nQXBpKG1vZGVsSWQ6IHN0cmluZyk6IFwiY2hhdFwiIHwgXCJyZXNwb25zZXNcIiB7XG4gIHJldHVybiBwb2xpY3kubW9kZWxTZXJ2aW5nQXBpKG1vZGVsSWQpO1xufVxuXG4vKiogT3B0aW9uYWwgb3ZlcnJpZGVzIGFjY2VwdGVkIGJ5IHtAbGluayBidWlsZE1vZGVsfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRNb2RlbE92ZXJyaWRlcyB7XG4gIC8qKlxuICAgKiBTdGF0aWMgbW9kZWwgaWQgZnJvbSB0aGUgYWdlbnQgLyBwbHVnaW4gY29uZmlnIChzdHJpbmcgc3VnYXIgb25cbiAgICogYGRlZi5tb2RlbGAgb3IgYGNvbmZpZy5kZWZhdWx0TW9kZWxgKS4gTG9zZXMgdG8gdGhlIHBlci1yZXF1ZXN0XG4gICAqIG92ZXJyaWRlIGJ1dCB3aW5zIG92ZXIgZW52IC8gY2xhc3MgLyBmYWxsYmFjay5cbiAgICovXG4gIG1vZGVsSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDaGF0IGNhcGFiaWxpdHkgY2xhc3MgdG8gcmVzb2x2ZSB3aGVuIG5vIGV4cGxpY2l0IG1vZGVsIGlkIGlzXG4gICAqIHN1cHBsaWVkLiBVc2VkIGJ5IGludGVybmFsIGFnZW50cyAoZS5nLiB0aGUgY2hhcnQgcGxhbm5lciBhc2tzIGZvclxuICAgKiB7QGxpbmsgbW9kZWwuTW9kZWxDbGFzcy5DaGF0RmFzdH0pIHRvIGV4cHJlc3MgaW50ZW50IHdpdGhvdXQgcGlubmluZyBhblxuICAgKiBlbmRwb2ludCBuYW1lOyB0aGUgbGl2ZSBjYXRhbG9ndWUgaXMgY2xhc3NpZmllZCBhbmQgdGhlIHRvcFxuICAgKiBhdmFpbGFibGUgbW9kZWwgaW4gdGhlIGNsYXNzIGlzIGNob3NlbiwgZmFsbGluZyBiYWNrIHRvIHRoZVxuICAgKiBjbGFzcydzIHN0YXRpYyBsaXN0IHdoZW4gdGhlIHdvcmtzcGFjZSBoYXMgbm9uZS5cbiAgICovXG4gIG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25JbnB1dChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIHJlcXVlc3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBkZWZhdWx0Q2xhc3M6IE1vZGVsQ2xhc3MgfCB1bmRlZmluZWQsXG4gIHNlcnZpbmcgPSByZXNvbHZlU2VydmluZ0NvbmZpZyhjb25maWcpLFxuKSB7XG4gIGNvbnN0IHJlcXVlc3RlZENsYXNzID0gcmVxdWVzdGVkICE9PSB1bmRlZmluZWQgPyBwYXJzZU1vZGVsQ2xhc3MocmVxdWVzdGVkKSA6IG51bGw7XG4gIGNvbnN0IGV4cGxpY2l0ID0gcmVxdWVzdGVkQ2xhc3MgPT09IG51bGwgPyByZXF1ZXN0ZWQgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IG1vZGVsQ2xhc3MgPSByZXF1ZXN0ZWRDbGFzcyA/PyBkZWZhdWx0Q2xhc3M7XG4gIHJldHVybiB7XG4gICAgLi4uKGV4cGxpY2l0ICE9PSB1bmRlZmluZWQgPyB7IGV4cGxpY2l0IH0gOiB7fSksXG4gICAgZnV6enk6IHNlcnZpbmcuZnV6enksXG4gICAgdGhyZXNob2xkOiBzZXJ2aW5nLnRocmVzaG9sZCxcbiAgICAuLi4obW9kZWxDbGFzcyAhPT0gdW5kZWZpbmVkID8geyBtb2RlbENsYXNzIH0gOiB7fSksXG4gICAgZmFsbGJhY2tzOiBzZXJ2aW5nLmZhbGxiYWNrcy5zbGljZSgpLFxuICAgIGxpdmVPbmx5OiByZXF1ZXN0ZWQgPT09IHVuZGVmaW5lZCxcbiAgICB0dGxNczogc2VydmluZy50dGxNcyxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGFuIGFnZW50J3MgdW5waW5uZWQgZGVmYXVsdCBhZ2FpbnN0IGFuIGFscmVhZHktbG9hZGVkIGxpdmUgY2F0YWxvZ3VlLlxuICpcbiAqIFdpdGggbm8gY29uZmlndXJlZCBpZC9jbGFzcy9mYWxsYmFjaywgdGhlIGdlbmVyaWMgbW9kZWwgcmFua2VyIHNlbGVjdHMgdGhlXG4gKiBoaWdoZXN0LXJhbmtlZCBjdXJyZW50bHkgYXZhaWxhYmxlIEdQVCwgdGhlbiBmYWxscyBiYWNrIHRvIHRoZSBoaWdoZXN0LXJhbmtlZFxuICogbGl2ZSBjaGF0IGVuZHBvaW50IHdoZW4gdGhlIHdvcmtzcGFjZSBoYXMgbm8gR1BULlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURlZmF1bHRNb2RlbElkKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIG92ZXJyaWRlczogQnVpbGRNb2RlbE92ZXJyaWRlcyA9IHt9LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgcmVxdWVzdGVkID0gb3ZlcnJpZGVzLm1vZGVsSWQgPz8gcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUU7XG4gIHJldHVybiByZXNvbHZlLnJlc29sdmVNb2RlbChlbmRwb2ludHMsIHNlbGVjdGlvbklucHV0KGNvbmZpZywgcmVxdWVzdGVkLCBvdmVycmlkZXMubW9kZWxDbGFzcykpXG4gICAgLm1vZGVsSWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGBNYXN0cmFNb2RlbENvbmZpZ2AgZm9yIHRoZSBjdXJyZW50IGFnZW50IHN0ZXAuIFJ1bnNcbiAqIHdoaWxlIGBhZ2VudC5zdHJlYW1gIGlzIGluc2lkZSB0aGUgYGFzVXNlcihyZXEpYCBzY29wZSBzbyB0b2tlbnNcbiAqIGFyZSB1c2VyLXNjb3BlZDsgb3V0c2lkZSBhbiBhY3RpdmUgdXNlciBjb250ZXh0IHRoZSB3b3Jrc3BhY2VcbiAqIGNsaWVudCBmYWxscyBiYWNrIHRvIHRoZSBzZXJ2aWNlIHByaW5jaXBhbC5cbiAqXG4gKiBFbmRwb2ludCBwcmVjZWRlbmNlOiB0aGUgcGVyLXJlcXVlc3Qgb3ZlcnJpZGVcbiAqICh7QGxpbmsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWX0sIG9ubHkgd2hlbiBgY29uZmlnLm1vZGVsT3ZlcnJpZGVgIGFsbG93c1xuICogaXQpLCB0aGVuIHtAbGluayBCdWlsZE1vZGVsT3ZlcnJpZGVzLm1vZGVsSWR9IGZyb20gdGhlIGFnZW50IC8gcGx1Z2luXG4gKiBjb25maWcsIHRoZW4gYERBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FYC4gV2l0aCBub25lIG9mIHRob3NlIHNldCB0aGVcbiAqIGNhcGFiaWxpdHkgY2xhc3MgYW5kIGZhbGxiYWNrIGxhZGRlciBpbiBgQGRieC10b29scy9tb2RlbGAgY2hvb3NlIHRoZVxuICogZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZE1vZGVsKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICBvdmVycmlkZXM6IEJ1aWxkTW9kZWxPdmVycmlkZXMgPSB7fSxcbik6IFByb21pc2U8TWFzdHJhTW9kZWxDb25maWc+IHtcbiAgLy8gVGhlIGNoYXQgcGF0aCBzdGFtcHMgdGhlIEFwcEtpdCB1c2VyIG9uIHRoZSByZXF1ZXN0IGNvbnRleHQgdmlhXG4gIC8vIGBNYXN0cmFTZXJ2ZXJgLiBUaGUgTUNQIHRyYW5zcG9ydCByb3V0ZXMgZG9uJ3QgdGhyZWFkIHRoYXQgY29udGV4dFxuICAvLyBpbnRvIHRvb2wgZXhlY3V0aW9uLCBzbyBmYWxsIGJhY2sgdG8gdGhlIGFtYmllbnQgZXhlY3V0aW9uIGNvbnRleHRcbiAgLy8gKHRoZSBhY3RpdmUgT0JPIHNjb3BlLCBvciB0aGUgc2VydmljZSBwcmluY2lwYWwpIHdoZW4gaXQncyBhYnNlbnQuXG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBleGVjdXRpb25Db250ZXh0ID0gdXNlcj8uZXhlY3V0aW9uQ29udGV4dCA/PyBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gIHJlY29yZEFjdGl2ZVRyYWNlQXV0aChcImlzVXNlckNvbnRleHRcIiBpbiBleGVjdXRpb25Db250ZXh0ID8gXCJvYm9cIiA6IFwic2VydmljZS1wcmluY2lwYWxcIik7XG4gIGNvbnN0IGNsaWVudENvbmZpZyA9IGV4ZWN1dGlvbkNvbnRleHQuY2xpZW50LmNvbmZpZztcbiAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnRDb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgYXdhaXQgY2xpZW50Q29uZmlnLmF1dGhlbnRpY2F0ZShoZWFkZXJzKTtcbiAgY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihjb25maWcpO1xuICBjb25zdCBzZXJ2aW5nID0gcmVzb2x2ZVNlcnZpbmdDb25maWcoY29uZmlnKTtcbiAgY29uc3Qgb3ZlcnJpZGUgPSBzZXJ2aW5nLmFsbG93T3ZlcnJpZGVcbiAgICA/IChyZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKVxuICAgIDogdW5kZWZpbmVkO1xuXG4gIC8vIFRoZSBvdmVycmlkZSAvIGFnZW50IGRlZmF1bHQgLyBlbnYgdmFsdWUgY2FuIGJlIGVpdGhlciBhIGNvbmNyZXRlXG4gIC8vIGVuZHBvaW50IG5hbWUgb3IgYSBtb2RlbCBjbGFzcyBzbHVnIChcImNoYXQtdGhpbmtpbmdcIiAvXG4gIC8vIFwiY2hhdC1iYWxhbmNlZFwiIC8gXCJjaGF0LWZhc3RcIikuIEEgY2xhc3Mgc2x1ZyBiZWNvbWVzIGEgY2xhc3MgaW50ZW50XG4gIC8vIChsZXQgdGhlIGxpdmUgY2F0YWxvZ3VlIHBpY2sgdGhlIGJlc3QgbW9kZWwgaW4gdGhhdCBiYW5kKTsgYW55dGhpbmdcbiAgLy8gZWxzZSBpcyBhbiBleHBsaWNpdCBuYW1lIGZ1enp5LW1hdGNoZWQgYWdhaW5zdCB0aGUgY2F0YWxvZ3VlLiBBblxuICAvLyBpbnRlcm5hbCBgb3ZlcnJpZGVzLm1vZGVsQ2xhc3NgIChlLmcuIHRoZSBjaGFydCBwbGFubmVyKSBpcyB0aGVcbiAgLy8gZmxvb3Igd2hlbiBub3RoaW5nIHdhcyByZXF1ZXN0ZWQuXG4gIGNvbnN0IHJlcXVlc3RlZCA9IG92ZXJyaWRlID8/IG92ZXJyaWRlcy5tb2RlbElkID8/IHByb2Nlc3MuZW52LkRBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FO1xuXG4gIGNvbnN0IHsgbW9kZWxJZCwgc291cmNlIH0gPSBhd2FpdCBzZWxlY3RNb2RlbChcbiAgICBleGVjdXRpb25Db250ZXh0LmNsaWVudCxcbiAgICBob3N0LFxuICAgIHNlbGVjdGlvbklucHV0KGNvbmZpZywgcmVxdWVzdGVkLCBvdmVycmlkZXMubW9kZWxDbGFzcywgc2VydmluZyksXG4gICk7XG4gIGxvZ2dlci5kZWJ1ZyhcIm1vZGVsIHNlbGVjdGVkXCIsIHsgbW9kZWxJZCwgc291cmNlLCByZXF1ZXN0ZWQgfSk7XG4gIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVTT0xWRURfTU9ERUxfS0VZLCBtb2RlbElkKTtcbiAgcmVjb3JkQWN0aXZlVHJhY2VNb2RlbChtb2RlbElkKTtcblxuICByZXR1cm4gY3JlYXRlRGF0YWJyaWNrc0xhbmd1YWdlTW9kZWwoe1xuICAgIG1vZGVsSWQsXG4gICAgcHJvdG9jb2w6IHNlcnZpbmdBcGkobW9kZWxJZCksXG4gICAgaG9zdCxcbiAgICBoZWFkZXJzOiBPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycy5lbnRyaWVzKCkpLFxuICAgIHByb3ZpZGVyTmFtZTogY29uZmlnLnByb3ZpZGVySWQgPz8gXCJvcGVuYWlcIixcbiAgfSk7XG59XG4iXX0=
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFFSCxPQUFPLEVBQUUscUJBQXFCLEVBQXdCLE1BQU0sb0JBQW9CLENBQUM7QUFDakYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUc3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFOUQsT0FBTyxFQUFFLGVBQWUsRUFBc0MsTUFBTSxhQUFhLENBQUM7QUFDbEYsT0FBTyxFQUNMLHlCQUF5QixFQUN6Qix5QkFBeUIsRUFDekIsb0JBQW9CLEdBQ3JCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRy9FLE1BQU0sRUFBRSxlQUFlLEVBQUUsR0FBRyxPQUFPLENBQUM7QUFDcEMsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FBQztBQUVoQyw4RkFBOEY7QUFDOUYsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUc7SUFDeEMsTUFBTSxFQUFFO1FBQ04sS0FBSyxFQUFFLEtBQUs7S0FDYjtDQUNPLENBQUM7QUFFWCxpRkFBaUY7QUFDakYsTUFBTSxVQUFVLFVBQVUsQ0FBQyxPQUFlO0lBQ3hDLE9BQU8sTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBMkJELHFGQUFxRjtBQUNyRixTQUFTLDRCQUE0QixDQUNu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UUFDUCxRQUFRLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUM3QixJQUFJO1FBQ0osT0FBTyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzlDLFlBQVksRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLFFBQVE7S0FDNUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGF0YWJyaWNrcyBNb2RlbCBTZXJ2aW5nIHJlc29sdmVyIGZvciBNYXN0cmEgYWdlbnRzLlxuICpcbiAqIEVhY2ggYWdlbnQgc3RlcCBjYWxscyB7QGxpbmsgYnVpbGRNb2RlbH0gd2l0aCB0aGUgYWN0aXZlXG4gKiBgUmVxdWVzdENvbnRleHRgLiBUaGUgdXNlciBzdGFtcGVkIGJ5IGBNYXN0cmFTZXJ2ZXJgIGNhcnJpZXMgYW5cbiAqIEFwcEtpdCBgV29ya3NwYWNlQ2xpZW50YDsgd2UgYXNrIGl0IGZvciB0aGUgd29ya3NwYWNlIGhvc3QgYW5kIGFcbiAqIGZyZXNoIGJlYXJlciBoZWFkZXIsIHRoZW4gY29uc3RydWN0IGEgcmVxdWVzdC1zY29wZWQgVmVyY2VsIEFJIFNESyBwcm92aWRlclxuICogZm9yIHRoZSBlbmRwb2ludCdzIG5hdGl2ZSBEYXRhYnJpY2tzIHNlcnZpbmcgcHJvdG9jb2wuXG4gKlxuICogVGhpcyBtb2R1bGUgb25seSBhZGRzIHRoZSBNYXN0cmEtc3BlY2lmaWMgZ2x1ZS4gVGhlIGFjdHVhbCBtb2RlbFxuICogc2VsZWN0aW9uIC0gbGlzdGluZyB0aGUgd29ya3NwYWNlIGNhdGFsb2d1ZSBhbmQgcmVzb2x2aW5nIGFuXG4gKiBleHBsaWNpdCBuYW1lIC8gY2xhc3MgLyBmYWxsYmFjayBjaGFpbiB0byBhIHJlYWwgZW5kcG9pbnQgaWQgLSBsaXZlc1xuICogaW4gYEBkYngtdG9vbHMvbW9kZWxgICh7QGxpbmsgc2VsZWN0TW9kZWx9KSBzbyBub24tTWFzdHJhIGNvbnN1bWVyc1xuICogKGUuZy4gYSBqb2IgdGhhdCBqdXN0IG5lZWRzIGEgbW9kZWwgbmFtZSkgY2FuIHJldXNlIGl0LiBIZXJlIHdlXG4gKiBhc3NlbWJsZSB0aGUgZXhwbGljaXQgYXNrIGZyb20gTWFzdHJhJ3MgcmVxdWVzdCBjb250ZXh0ICh0aGVcbiAqIHBlci1yZXF1ZXN0IG92ZXJyaWRlIHVuZGVyIHtAbGluayBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZfSwgdGhlXG4gKiBhZ2VudCAvIHBsdWdpbiBgbW9kZWxJZGAsIG9yIGBEQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRWApLFxuICogcGFzcyB0aGUgcGx1Z2luJ3MgZnV6enkgLyBjbGFzcyAvIGZhbGxiYWNrIGtub2JzIHRocm91Z2gsIGFuZCB3cmFwXG4gKiB0aGUgcmVzb2x2ZWQgaWQgaW4gdGhlIFByb3ZpZGVyVjQgbW9kZWwgTWFzdHJhIGFjY2VwdHMuIENhdGFsb2d1ZSBmZXRjaGVzIGZhaWwgbG91ZDogbmV0d29yayAvIGF1dGggZXJyb3JzXG4gKiBwcm9wYWdhdGUgc28gY2FsbGVycyBzZWUgdGhlIHJlYWwgU0RLIG1lc3NhZ2UuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCwgdHlwZSBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGNsYXNzZXMsIHBvbGljeSwgcmVzb2x2ZSB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBjcmVhdGVEYXRhYnJpY2tzTGFuZ3VhZ2VNb2RlbCB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsLXByb3RvY29sL3Byb3ZpZGVyXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFNb2RlbENvbmZpZyB9IGZyb20gXCJAbWFzdHJhL2NvcmUvbGxtXCI7XG5pbXBvcnQgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5cbmltcG9ydCB7IE1BU1RSQV9VU0VSX0tFWSwgdHlwZSBNYXN0cmFQbHVnaW5Db25maWcsIHR5cGUgVXNlciB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHtcbiAgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSxcbiAgTUFTVFJBX1JFU09MVkVEX01PREVMX0tFWSxcbiAgcmVzb2x2ZVNlcnZpbmdDb25maWcsXG59IGZyb20gXCIuL3NlcnZpbmcudHNcIjtcbmltcG9ydCB7IHJlY29yZEFjdGl2ZVRyYWNlQXV0aCwgcmVjb3JkQWN0aXZlVHJhY2VNb2RlbCB9IGZyb20gXCIuL3RlbGVtZXRyeS50c1wiO1xuXG50eXBlIE1vZGVsQ2xhc3MgPSBtb2RlbC5Nb2RlbENsYXNzO1xuY29uc3QgeyBwYXJzZU1vZGVsQ2xhc3MgfSA9IGNsYXNzZXM7XG5jb25zdCB7IHNlbGVjdE1vZGVsIH0gPSByZXNvbHZlO1xuXG4vKiogS2VlcCBSZXNwb25zZXMgdHVybnMgc3RhdGVsZXNzIHNvIHRvb2wgY29udGludWF0aW9ucyByZXBsYXkgZW5jcnlwdGVkIHJlYXNvbmluZyBpbmxpbmUuICovXG5leHBvcnQgY29uc3QgUkVTUE9OU0VTX1BST1ZJREVSX09QVElPTlMgPSB7XG4gIG9wZW5haToge1xuICAgIHN0b3JlOiBmYWxzZSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbi8qKiBQaWNrIHRoZSBuYXRpdmUgRGF0YWJyaWNrcyBpbmZlcmVuY2Ugc3VyZmFjZSByZXF1aXJlZCBieSBhIHJlc29sdmVkIG1vZGVsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpbmdBcGkobW9kZWxJZDogc3RyaW5nKTogXCJjaGF0XCIgfCBcInJlc3BvbnNlc1wiIHtcbiAgcmV0dXJuIHBvbGljeS5tb2RlbFNlcnZpbmdBcGkobW9kZWxJZCk7XG59XG5cbi8qKiBPcHRpb25hbCBvdmVycmlkZXMgYWNjZXB0ZWQgYnkge0BsaW5rIGJ1aWxkTW9kZWx9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZE1vZGVsT3ZlcnJpZGVzIHtcbiAgLyoqXG4gICAqIFN0YXRpYyBtb2RlbCBpZCBmcm9tIHRoZSBhZ2VudCAvIHBsdWdpbiBjb25maWcgKHN0cmluZyBzdWdhciBvblxuICAgKiBgZGVmLm1vZGVsYCBvciBgY29uZmlnLmRlZmF1bHRNb2RlbGApLiBMb3NlcyB0byB0aGUgcGVyLXJlcXVlc3RcbiAgICogb3ZlcnJpZGUgYnV0IHdpbnMgb3ZlciBlbnYgLyBjbGFzcyAvIGZhbGxiYWNrLlxuICAgKi9cbiAgbW9kZWxJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIENoYXQgY2FwYWJpbGl0eSBjbGFzcyB0byByZXNvbHZlIHdoZW4gbm8gZXhwbGljaXQgbW9kZWwgaWQgaXNcbiAgICogc3VwcGxpZWQuIFVzZWQgYnkgaW50ZXJuYWwgYWdlbnRzIChlLmcuIHRoZSBjaGFydCBwbGFubmVyIGFza3MgZm9yXG4gICAqIHtAbGluayBtb2RlbC5Nb2RlbENsYXNzLkNoYXRGYXN0fSkgdG8gZXhwcmVzcyBpbnRlbnQgd2l0aG91dCBwaW5uaW5nIGFuXG4gICAqIGVuZHBvaW50IG5hbWU7IHRoZSBsaXZlIGNhdGFsb2d1ZSBpcyBjbGFzc2lmaWVkIGFuZCB0aGUgdG9wXG4gICAqIGF2YWlsYWJsZSBtb2RlbCBpbiB0aGUgY2xhc3MgaXMgY2hvc2VuLCBmYWxsaW5nIGJhY2sgdG8gdGhlXG4gICAqIGNsYXNzJ3Mgc3RhdGljIGxpc3Qgd2hlbiB0aGUgd29ya3NwYWNlIGhhcyBub25lLlxuICAgKi9cbiAgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3M7XG59XG5cbi8qKiBSZXNvbHZlZCB3b3Jrc3BhY2UgY2xpZW50IGFuZCB0aGUgYXV0aGVudGljYXRpb24gbW9kZSBiYWNraW5nIGl0LiAqL1xuaW50ZXJmYWNlIFJlc29sdmVkTW9kZWxXb3Jrc3BhY2VDbGllbnQge1xuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudDtcbiAgYXV0aDogXCJvYm9cIiB8IFwic2VydmljZS1wcmluY2lwYWxcIjtcbn1cblxuLyoqIFJlc29sdmUgYW4gT0JPIHdvcmtzcGFjZSBjbGllbnQgd2hlbiBwcmVzZW50LCBlbHNlIGEgc2VydmljZS1wcmluY2lwYWwgY2xpZW50LiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU1vZGVsV29ya3NwYWNlQ29udGV4dChcbiAgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dCxcbik6IFJlc29sdmVkTW9kZWxXb3Jrc3BhY2VDbGllbnQge1xuICBjb25zdCB1c2VyID0gcmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfVVNFUl9LRVkpIGFzIFVzZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGV4ZWN1dGlvbkNvbnRleHQgPSB1c2VyPy5leGVjdXRpb25Db250ZXh0ID8/IGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gIGlmIChleGVjdXRpb25Db250ZXh0Py5jbGllbnQuY29uZmlnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsaWVudDogZXhlY3V0aW9uQ29udGV4dC5jbGllbnQsXG4gICAgICBhdXRoOiBcImlzVXNlckNvbnRleHRcIiBpbiBleGVjdXRpb25Db250ZXh0ID8gXCJvYm9cIiA6IFwic2VydmljZS1wcmluY2lwYWxcIixcbiAgICB9O1xuICB9XG4gIHJldHVybiB7IGNsaWVudDogY3JlYXRlV29ya3NwYWNlQ2xpZW50KCksIGF1dGg6IFwic2VydmljZS1wcmluY2lwYWxcIiB9O1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgd29ya3NwYWNlIGNsaWVudCB1c2VkIGZvciBtb2RlbCBkaXNjb3ZlcnkgYW5kIGluZmVyZW5jZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTW9kZWxXb3Jrc3BhY2VDbGllbnQocmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dCk6IFdvcmtzcGFjZUNsaWVudCB7XG4gIHJldHVybiByZXNvbHZlTW9kZWxXb3Jrc3BhY2VDb250ZXh0KHJlcXVlc3RDb250ZXh0KS5jbGllbnQ7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdGlvbklucHV0KFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgcmVxdWVzdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGRlZmF1bHRDbGFzczogTW9kZWxDbGFzcyB8IHVuZGVmaW5lZCxcbiAgc2VydmluZyA9IHJlc29sdmVTZXJ2aW5nQ29uZmlnKGNvbmZpZyksXG4pIHtcbiAgY29uc3QgcmVxdWVzdGVkQ2xhc3MgPSByZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZCA/IHBhcnNlTW9kZWxDbGFzcyhyZXF1ZXN0ZWQpIDogbnVsbDtcbiAgY29uc3QgZXhwbGljaXQgPSByZXF1ZXN0ZWRDbGFzcyA9PT0gbnVsbCA/IHJlcXVlc3RlZCA6IHVuZGVmaW5lZDtcbiAgY29uc3QgbW9kZWxDbGFzcyA9IHJlcXVlc3RlZENsYXNzID8/IGRlZmF1bHRDbGFzcztcbiAgcmV0dXJuIHtcbiAgICAuLi4oZXhwbGljaXQgIT09IHVuZGVmaW5lZCA/IHsgZXhwbGljaXQgfSA6IHt9KSxcbiAgICBmdXp6eTogc2VydmluZy5mdXp6eSxcbiAgICB0aHJlc2hvbGQ6IHNlcnZpbmcudGhyZXNob2xkLFxuICAgIC4uLihtb2RlbENsYXNzICE9PSB1bmRlZmluZWQgPyB7IG1vZGVsQ2xhc3MgfSA6IHt9KSxcbiAgICBmYWxsYmFja3M6IHNlcnZpbmcuZmFsbGJhY2tzLnNsaWNlKCksXG4gICAgbGl2ZU9ubHk6IHJlcXVlc3RlZCA9PT0gdW5kZWZpbmVkLFxuICAgIHR0bE1zOiBzZXJ2aW5nLnR0bE1zLFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYW4gYWdlbnQncyB1bnBpbm5lZCBkZWZhdWx0IGFnYWluc3QgYW4gYWxyZWFkeS1sb2FkZWQgbGl2ZSBjYXRhbG9ndWUuXG4gKlxuICogV2l0aCBubyBjb25maWd1cmVkIGlkL2NsYXNzL2ZhbGxiYWNrLCB0aGUgZ2VuZXJpYyBtb2RlbCByYW5rZXIgc2VsZWN0cyB0aGVcbiAqIGhpZ2hlc3QtcmFua2VkIGN1cnJlbnRseSBhdmFpbGFibGUgR1BULCB0aGVuIGZhbGxzIGJhY2sgdG8gdGhlIGhpZ2hlc3QtcmFua2VkXG4gKiBsaXZlIGNoYXQgZW5kcG9pbnQgd2hlbiB0aGUgd29ya3NwYWNlIGhhcyBubyBHUFQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRGVmYXVsdE1vZGVsSWQoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbiAgb3ZlcnJpZGVzOiBCdWlsZE1vZGVsT3ZlcnJpZGVzID0ge30sXG4pOiBzdHJpbmcge1xuICBjb25zdCByZXF1ZXN0ZWQgPSBvdmVycmlkZXMubW9kZWxJZCA/PyBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRTtcbiAgcmV0dXJuIHJlc29sdmUucmVzb2x2ZU1vZGVsKGVuZHBvaW50cywgc2VsZWN0aW9uSW5wdXQoY29uZmlnLCByZXF1ZXN0ZWQsIG92ZXJyaWRlcy5tb2RlbENsYXNzKSlcbiAgICAubW9kZWxJZDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgYE1hc3RyYU1vZGVsQ29uZmlnYCBmb3IgdGhlIGN1cnJlbnQgYWdlbnQgc3RlcC4gUnVuc1xuICogd2hpbGUgYGFnZW50LnN0cmVhbWAgaXMgaW5zaWRlIHRoZSBgYXNVc2VyKHJlcSlgIHNjb3BlIHNvIHRva2Vuc1xuICogYXJlIHVzZXItc2NvcGVkOyBvdXRzaWRlIGFuIGFjdGl2ZSB1c2VyIGNvbnRleHQgdGhlIHdvcmtzcGFjZVxuICogY2xpZW50IGZhbGxzIGJhY2sgdG8gdGhlIHNlcnZpY2UgcHJpbmNpcGFsLlxuICpcbiAqIEVuZHBvaW50IHByZWNlZGVuY2U6IHRoZSBwZXItcmVxdWVzdCBvdmVycmlkZVxuICogKHtAbGluayBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZfSwgb25seSB3aGVuIGBjb25maWcubW9kZWxPdmVycmlkZWAgYWxsb3dzXG4gKiBpdCksIHRoZW4ge0BsaW5rIEJ1aWxkTW9kZWxPdmVycmlkZXMubW9kZWxJZH0gZnJvbSB0aGUgYWdlbnQgLyBwbHVnaW5cbiAqIGNvbmZpZywgdGhlbiBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgLiBXaXRoIG5vbmUgb2YgdGhvc2Ugc2V0IHRoZVxuICogY2FwYWJpbGl0eSBjbGFzcyBhbmQgZmFsbGJhY2sgbGFkZGVyIGluIGBAZGJ4LXRvb2xzL21vZGVsYCBjaG9vc2UgdGhlXG4gKiBlbmRwb2ludC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkTW9kZWwoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0LFxuICBvdmVycmlkZXM6IEJ1aWxkTW9kZWxPdmVycmlkZXMgPSB7fSxcbik6IFByb21pc2U8TWFzdHJhTW9kZWxDb25maWc+IHtcbiAgY29uc3QgY29udGV4dCA9IHJlcXVlc3RDb250ZXh0ID8/IG5ldyBSZXF1ZXN0Q29udGV4dCgpO1xuICAvLyBUaGUgY2hhdCBwYXRoIHN0YW1wcyB0aGUgQXBwS2l0IHVzZXIgb24gdGhlIHJlcXVlc3QgY29udGV4dCB2aWFcbiAgLy8gYE1hc3RyYVNlcnZlcmAuIFRoZSBNQ1AgdHJhbnNwb3J0IHJvdXRlcyBkb24ndCB0aHJlYWQgdGhhdCBjb250ZXh0XG4gIC8vIGludG8gdG9vbCBleGVjdXRpb24sIHNvIGZhbGwgYmFjayB0byB0aGUgYW1iaWVudCBleGVjdXRpb24gY29udGV4dFxuICAvLyAodGhlIGFjdGl2ZSBPQk8gc2NvcGUsIG9yIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCkgd2hlbiBpdCdzIGFic2VudC5cbiAgY29uc3QgeyBjbGllbnQsIGF1dGggfSA9IHJlc29sdmVNb2RlbFdvcmtzcGFjZUNvbnRleHQoY29udGV4dCk7XG4gIHJlY29yZEFjdGl2ZVRyYWNlQXV0aChhdXRoKTtcbiAgY29uc3QgY2xpZW50Q29uZmlnID0gY2xpZW50LmNvbmZpZztcbiAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnRDb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgYXdhaXQgY2xpZW50Q29uZmlnLmF1dGhlbnRpY2F0ZShoZWFkZXJzKTtcbiAgY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihjb25maWcpO1xuICBjb25zdCBzZXJ2aW5nID0gcmVzb2x2ZVNlcnZpbmdDb25maWcoY29uZmlnKTtcbiAgY29uc3Qgb3ZlcnJpZGUgPSBzZXJ2aW5nLmFsbG93T3ZlcnJpZGVcbiAgICA/IChjb250ZXh0LmdldChNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIG92ZXJyaWRlIC8gYWdlbnQgZGVmYXVsdCAvIGVudiB2YWx1ZSBjYW4gYmUgZWl0aGVyIGEgY29uY3JldGVcbiAgLy8gZW5kcG9pbnQgbmFtZSBvciBhIG1vZGVsIGNsYXNzIHNsdWcgKFwiY2hhdC10aGlua2luZ1wiIC9cbiAgLy8gXCJjaGF0LWJhbGFuY2VkXCIgLyBcImNoYXQtZmFzdFwiKS4gQSBjbGFzcyBzbHVnIGJlY29tZXMgYSBjbGFzcyBpbnRlbnRcbiAgLy8gKGxldCB0aGUgbGl2ZSBjYXRhbG9ndWUgcGljayB0aGUgYmVzdCBtb2RlbCBpbiB0aGF0IGJhbmQpOyBhbnl0aGluZ1xuICAvLyBlbHNlIGlzIGFuIGV4cGxpY2l0IG5hbWUgZnV6enktbWF0Y2hlZCBhZ2FpbnN0IHRoZSBjYXRhbG9ndWUuIEFuXG4gIC8vIGludGVybmFsIGBvdmVycmlkZXMubW9kZWxDbGFzc2AgKGUuZy4gdGhlIGNoYXJ0IHBsYW5uZXIpIGlzIHRoZVxuICAvLyBmbG9vciB3aGVuIG5vdGhpbmcgd2FzIHJlcXVlc3RlZC5cbiAgY29uc3QgcmVxdWVzdGVkID0gb3ZlcnJpZGUgPz8gb3ZlcnJpZGVzLm1vZGVsSWQgPz8gcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUU7XG5cbiAgY29uc3QgeyBtb2RlbElkLCBzb3VyY2UgfSA9IGF3YWl0IHNlbGVjdE1vZGVsKFxuICAgIGNsaWVudCxcbiAgICBob3N0LFxuICAgIHNlbGVjdGlvbklucHV0KGNvbmZpZywgcmVxdWVzdGVkLCBvdmVycmlkZXMubW9kZWxDbGFzcywgc2VydmluZyksXG4gICk7XG4gIGxvZ2dlci5kZWJ1ZyhcIm1vZGVsIHNlbGVjdGVkXCIsIHsgbW9kZWxJZCwgc291cmNlLCByZXF1ZXN0ZWQgfSk7XG4gIGNvbnRleHQuc2V0KE1BU1RSQV9SRVNPTFZFRF9NT0RFTF9LRVksIG1vZGVsSWQpO1xuICByZWNvcmRBY3RpdmVUcmFjZU1vZGVsKG1vZGVsSWQpO1xuXG4gIHJldHVybiBjcmVhdGVEYXRhYnJpY2tzTGFuZ3VhZ2VNb2RlbCh7XG4gICAgbW9kZWxJZCxcbiAgICBwcm90b2NvbDogc2VydmluZ0FwaShtb2RlbElkKSxcbiAgICBob3N0LFxuICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhoZWFkZXJzLmVudHJpZXMoKSksXG4gICAgcHJvdmlkZXJOYW1lOiBjb25maWcucHJvdmlkZXJJZCA/PyBcIm9wZW5haVwiLFxuICB9KTtcbn1cbiJdfQ==