@dbx-tools/appkit-mastra 0.9.70 → 0.9.71

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
@@ -27,7 +27,7 @@ import { classes, invoke, policy, resolve } from "@dbx-tools/model";
27
27
  import { functionUtils, json, log, net } from "@dbx-tools/shared-core";
28
28
  import { MASTRA_USER_KEY } from "./config.js";
29
29
  import { rewriteServingRequest, rewriteServingResponseBody, rewriteServingResponseStream, } from "./serving-sanitize.js";
30
- import { MASTRA_MODEL_OVERRIDE_KEY, resolveServingConfig } from "./serving.js";
30
+ import { MASTRA_MODEL_OVERRIDE_KEY, MASTRA_RESOLVED_MODEL_KEY, resolveServingConfig, } from "./serving.js";
31
31
  import { recordActiveTraceAuth, recordActiveTraceModel } from "./telemetry.js";
32
32
  const { parseModelClass } = classes;
33
33
  const { selectModel } = resolve;
@@ -112,6 +112,7 @@ export async function buildModel(config, requestContext, overrides = {}) {
112
112
  const requested = override ?? overrides.modelId ?? process.env.DATABRICKS_SERVING_ENDPOINT_NAME;
113
113
  const { modelId, source } = await selectModel(executionContext.client, host, selectionInput(config, requested, overrides.modelClass, serving));
114
114
  logger.debug("model selected", { modelId, source, requested });
115
+ requestContext.set(MASTRA_RESOLVED_MODEL_KEY, modelId);
115
116
  recordActiveTraceModel(modelId);
116
117
  return {
117
118
  providerId: config.providerId ?? "databricks",
@@ -198,4 +199,4 @@ function rebuildServingResponse(response, body) {
198
199
  headers,
199
200
  });
200
201
  }
201
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUt2RSxPQUFPLEVBQUUsZUFBZSxFQUFzQyxNQUFNLGFBQWEsQ0FBQztBQUNsRixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLDBCQUEwQixFQUMxQiw0QkFBNEIsR0FDN0IsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUseUJBQXlCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHL0UsTUFBTSxFQUFFLGVBQWUsRUFBRSxHQUFHLE9BQU8sQ0FBQztBQUNwQyxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUFDO0FBRWhDLDhGQUE4RjtBQUM5RixNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRztJQUN4QyxNQUFNLEVBQUU7UUFDTixLQUFLLEVBQUUsS0FBSztLQUNiO0NBQ08sQ0FBQztBQUVYLGlGQUFpRjtBQUNqRixNQUFNLFVBQVUsVUFBVSxDQUFDLE9BQWU7SUFDeEMsT0FBTyxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFxQkQsU0FBUyxjQUFjLENBQ3JCLE1BQTBCLEVBQzFCLFNBQTZCLEVBQzdCLFlBQW9DLEVBQ3BDLE9BQU8sR0FBRyxv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a0JBQWtCLENBQUMsQ0FBQztJQUNuQyxPQUFPLElBQUksUUFBUSxDQUFDLElBQUksRUFBRTtRQUN4QixNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07UUFDdkIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO1FBQy9CLE9BQU87S0FDUixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgcmVzb2x2ZXIgZm9yIE1hc3RyYSBhZ2VudHMuXG4gKlxuICogRWFjaCBhZ2VudCBzdGVwIGNhbGxzIHtAbGluayBidWlsZE1vZGVsfSB3aXRoIHRoZSBhY3RpdmVcbiAqIGBSZXF1ZXN0Q29udGV4dGAuIFRoZSB1c2VyIHN0YW1wZWQgYnkgYE1hc3RyYVNlcnZlcmAgY2FycmllcyBhblxuICogQXBwS2l0IGBXb3Jrc3BhY2VDbGllbnRgOyB3ZSBhc2sgaXQgZm9yIHRoZSB3b3Jrc3BhY2UgaG9zdCBhbmQgYVxuICogZnJlc2ggYmVhcmVyIGhlYWRlciwgdGhlbiBwb2ludCBNYXN0cmEncyBPcGVuQUktY29tcGF0aWJsZSBwcm92aWRlclxuICogYXQgYC9zZXJ2aW5nLWVuZHBvaW50c2Agb24gdGhhdCBob3N0LlxuICpcbiAqIFRoaXMgbW9kdWxlIG9ubHkgYWRkcyB0aGUgTWFzdHJhLXNwZWNpZmljIGdsdWUuIFRoZSBhY3R1YWwgbW9kZWxcbiAqIHNlbGVjdGlvbiAtIGxpc3RpbmcgdGhlIHdvcmtzcGFjZSBjYXRhbG9ndWUgYW5kIHJlc29sdmluZyBhblxuICogZXhwbGljaXQgbmFtZSAvIGNsYXNzIC8gZmFsbGJhY2sgY2hhaW4gdG8gYSByZWFsIGVuZHBvaW50IGlkIC0gbGl2ZXNcbiAqIGluIGBAZGJ4LXRvb2xzL21vZGVsYCAoe0BsaW5rIHNlbGVjdE1vZGVsfSkgc28gbm9uLU1hc3RyYSBjb25zdW1lcnNcbiAqIChlLmcuIGEgam9iIHRoYXQganVzdCBuZWVkcyBhIG1vZGVsIG5hbWUpIGNhbiByZXVzZSBpdC4gSGVyZSB3ZVxuICogYXNzZW1ibGUgdGhlIGV4cGxpY2l0IGFzayBmcm9tIE1hc3RyYSdzIHJlcXVlc3QgY29udGV4dCAodGhlXG4gKiBwZXItcmVxdWVzdCBvdmVycmlkZSB1bmRlciB7QGxpbmsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWX0sIHRoZVxuICogYWdlbnQgLyBwbHVnaW4gYG1vZGVsSWRgLCBvciBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgKSxcbiAqIHBhc3MgdGhlIHBsdWdpbidzIGZ1enp5IC8gY2xhc3MgLyBmYWxsYmFjayBrbm9icyB0aHJvdWdoLCBhbmQgd3JhcFxuICogdGhlIHJlc29sdmVkIGlkIGluIHRoZSBPcGVuQUktY29tcGF0aWJsZSBwcm92aWRlciBjb25maWcgTWFzdHJhXG4gKiBleHBlY3RzLiBDYXRhbG9ndWUgZmV0Y2hlcyBmYWlsIGxvdWQ6IG5ldHdvcmsgLyBhdXRoIGVycm9yc1xuICogcHJvcGFnYXRlIHNvIGNhbGxlcnMgc2VlIHRoZSByZWFsIFNESyBtZXNzYWdlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBnZXRFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY2xhc3NlcywgaW52b2tlLCBwb2xpY3ksIHJlc29sdmUgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgZnVuY3Rpb25VdGlscywganNvbiwgbG9nLCBuZXQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFNb2RlbENvbmZpZyB9IGZyb20gXCJAbWFzdHJhL2NvcmUvbGxtXCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcblxuaW1wb3J0IHsgTUFTVFJBX1VTRVJfS0VZLCB0eXBlIE1hc3RyYVBsdWdpbkNvbmZpZywgdHlwZSBVc2VyIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQge1xuICByZXdyaXRlU2VydmluZ1JlcXVlc3QsXG4gIHJld3JpdGVTZXJ2aW5nUmVzcG9uc2VCb2R5LFxuICByZXdyaXRlU2VydmluZ1Jlc3BvbnNlU3RyZWFtLFxufSBmcm9tIFwiLi9zZXJ2aW5nLXNhbml0aXplLnRzXCI7XG5pbXBvcnQgeyBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZLCByZXNvbHZlU2VydmluZ0NvbmZpZyB9IGZyb20gXCIuL3NlcnZpbmcudHNcIjtcbmltcG9ydCB7IHJlY29yZEFjdGl2ZVRyYWNlQXV0aCwgcmVjb3JkQWN0aXZlVHJhY2VNb2RlbCB9IGZyb20gXCIuL3RlbGVtZXRyeS50c1wiO1xuXG50eXBlIE1vZGVsQ2xhc3MgPSBtb2RlbC5Nb2RlbENsYXNzO1xuY29uc3QgeyBwYXJzZU1vZGVsQ2xhc3MgfSA9IGNsYXNzZXM7XG5jb25zdCB7IHNlbGVjdE1vZGVsIH0gPSByZXNvbHZlO1xuXG4vKiogS2VlcCBSZXNwb25zZXMgdHVybnMgc3RhdGVsZXNzIHNvIHRvb2wgY29udGludWF0aW9ucyByZXBsYXkgZW5jcnlwdGVkIHJlYXNvbmluZyBpbmxpbmUuICovXG5leHBvcnQgY29uc3QgUkVTUE9OU0VTX1BST1ZJREVSX09QVElPTlMgPSB7XG4gIG9wZW5haToge1xuICAgIHN0b3JlOiBmYWxzZSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbi8qKiBQaWNrIHRoZSBuYXRpdmUgRGF0YWJyaWNrcyBpbmZlcmVuY2Ugc3VyZmFjZSByZXF1aXJlZCBieSBhIHJlc29sdmVkIG1vZGVsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpbmdBcGkobW9kZWxJZDogc3RyaW5nKTogXCJjaGF0XCIgfCBcInJlc3BvbnNlc1wiIHtcbiAgcmV0dXJuIHBvbGljeS5tb2RlbFNlcnZpbmdBcGkobW9kZWxJZCk7XG59XG5cbi8qKiBPcHRpb25hbCBvdmVycmlkZXMgYWNjZXB0ZWQgYnkge0BsaW5rIGJ1aWxkTW9kZWx9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZE1vZGVsT3ZlcnJpZGVzIHtcbiAgLyoqXG4gICAqIFN0YXRpYyBtb2RlbCBpZCBmcm9tIHRoZSBhZ2VudCAvIHBsdWdpbiBjb25maWcgKHN0cmluZyBzdWdhciBvblxuICAgKiBgZGVmLm1vZGVsYCBvciBgY29uZmlnLmRlZmF1bHRNb2RlbGApLiBMb3NlcyB0byB0aGUgcGVyLXJlcXVlc3RcbiAgICogb3ZlcnJpZGUgYnV0IHdpbnMgb3ZlciBlbnYgLyBjbGFzcyAvIGZhbGxiYWNrLlxuICAgKi9cbiAgbW9kZWxJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIENoYXQgY2FwYWJpbGl0eSBjbGFzcyB0byByZXNvbHZlIHdoZW4gbm8gZXhwbGljaXQgbW9kZWwgaWQgaXNcbiAgICogc3VwcGxpZWQuIFVzZWQgYnkgaW50ZXJuYWwgYWdlbnRzIChlLmcuIHRoZSBjaGFydCBwbGFubmVyIGFza3MgZm9yXG4gICAqIHtAbGluayBtb2RlbC5Nb2RlbENsYXNzLkNoYXRGYXN0fSkgdG8gZXhwcmVzcyBpbnRlbnQgd2l0aG91dCBwaW5uaW5nIGFuXG4gICAqIGVuZHBvaW50IG5hbWU7IHRoZSBsaXZlIGNhdGFsb2d1ZSBpcyBjbGFzc2lmaWVkIGFuZCB0aGUgdG9wXG4gICAqIGF2YWlsYWJsZSBtb2RlbCBpbiB0aGUgY2xhc3MgaXMgY2hvc2VuLCBmYWxsaW5nIGJhY2sgdG8gdGhlXG4gICAqIGNsYXNzJ3Mgc3RhdGljIGxpc3Qgd2hlbiB0aGUgd29ya3NwYWNlIGhhcyBub25lLlxuICAgKi9cbiAgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3M7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdGlvbklucHV0KFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgcmVxdWVzdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGRlZmF1bHRDbGFzczogTW9kZWxDbGFzcyB8IHVuZGVmaW5lZCxcbiAgc2VydmluZyA9IHJlc29sdmVTZXJ2aW5nQ29uZmlnKGNvbmZpZyksXG4pIHtcbiAgY29uc3QgcmVxdWVzdGVkQ2xhc3MgPSByZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZCA/IHBhcnNlTW9kZWxDbGFzcyhyZXF1ZXN0ZWQpIDogbnVsbDtcbiAgY29uc3QgZXhwbGljaXQgPSByZXF1ZXN0ZWRDbGFzcyA9PT0gbnVsbCA/IHJlcXVlc3RlZCA6IHVuZGVmaW5lZDtcbiAgY29uc3QgbW9kZWxDbGFzcyA9IHJlcXVlc3RlZENsYXNzID8/IGRlZmF1bHRDbGFzcztcbiAgcmV0dXJuIHtcbiAgICAuLi4oZXhwbGljaXQgIT09IHVuZGVmaW5lZCA/IHsgZXhwbGljaXQgfSA6IHt9KSxcbiAgICBmdXp6eTogc2VydmluZy5mdXp6eSxcbiAgICB0aHJlc2hvbGQ6IHNlcnZpbmcudGhyZXNob2xkLFxuICAgIC4uLihtb2RlbENsYXNzICE9PSB1bmRlZmluZWQgPyB7IG1vZGVsQ2xhc3MgfSA6IHt9KSxcbiAgICBmYWxsYmFja3M6IHNlcnZpbmcuZmFsbGJhY2tzLnNsaWNlKCksXG4gICAgbGl2ZU9ubHk6IHJlcXVlc3RlZCA9PT0gdW5kZWZpbmVkLFxuICAgIHR0bE1zOiBzZXJ2aW5nLnR0bE1zLFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYW4gYWdlbnQncyB1bnBpbm5lZCBkZWZhdWx0IGFnYWluc3QgYW4gYWxyZWFkeS1sb2FkZWQgbGl2ZSBjYXRhbG9ndWUuXG4gKlxuICogV2l0aCBubyBjb25maWd1cmVkIGlkL2NsYXNzL2ZhbGxiYWNrLCB0aGUgZ2VuZXJpYyBtb2RlbCByYW5rZXIgc2VsZWN0cyB0aGVcbiAqIGhpZ2hlc3QtcmFua2VkIGN1cnJlbnRseSBhdmFpbGFibGUgR1BULCB0aGVuIGZhbGxzIGJhY2sgdG8gdGhlIGhpZ2hlc3QtcmFua2VkXG4gKiBsaXZlIGNoYXQgZW5kcG9pbnQgd2hlbiB0aGUgd29ya3NwYWNlIGhhcyBubyBHUFQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRGVmYXVsdE1vZGVsSWQoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbiAgb3ZlcnJpZGVzOiBCdWlsZE1vZGVsT3ZlcnJpZGVzID0ge30sXG4pOiBzdHJpbmcge1xuICBjb25zdCByZXF1ZXN0ZWQgPSBvdmVycmlkZXMubW9kZWxJZCA/PyBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRTtcbiAgcmV0dXJuIHJlc29sdmUucmVzb2x2ZU1vZGVsKGVuZHBvaW50cywgc2VsZWN0aW9uSW5wdXQoY29uZmlnLCByZXF1ZXN0ZWQsIG92ZXJyaWRlcy5tb2RlbENsYXNzKSlcbiAgICAubW9kZWxJZDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgYE1hc3RyYU1vZGVsQ29uZmlnYCBmb3IgdGhlIGN1cnJlbnQgYWdlbnQgc3RlcC4gUnVuc1xuICogd2hpbGUgYGFnZW50LnN0cmVhbWAgaXMgaW5zaWRlIHRoZSBgYXNVc2VyKHJlcSlgIHNjb3BlIHNvIHRva2Vuc1xuICogYXJlIHVzZXItc2NvcGVkOyBvdXRzaWRlIGFuIGFjdGl2ZSB1c2VyIGNvbnRleHQgdGhlIHdvcmtzcGFjZVxuICogY2xpZW50IGZhbGxzIGJhY2sgdG8gdGhlIHNlcnZpY2UgcHJpbmNpcGFsLlxuICpcbiAqIEVuZHBvaW50IHByZWNlZGVuY2U6IHRoZSBwZXItcmVxdWVzdCBvdmVycmlkZVxuICogKHtAbGluayBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZfSwgb25seSB3aGVuIGBjb25maWcubW9kZWxPdmVycmlkZWAgYWxsb3dzXG4gKiBpdCksIHRoZW4ge0BsaW5rIEJ1aWxkTW9kZWxPdmVycmlkZXMubW9kZWxJZH0gZnJvbSB0aGUgYWdlbnQgLyBwbHVnaW5cbiAqIGNvbmZpZywgdGhlbiBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgLiBXaXRoIG5vbmUgb2YgdGhvc2Ugc2V0IHRoZVxuICogY2FwYWJpbGl0eSBjbGFzcyBhbmQgZmFsbGJhY2sgbGFkZGVyIGluIGBAZGJ4LXRvb2xzL21vZGVsYCBjaG9vc2UgdGhlXG4gKiBlbmRwb2ludC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkTW9kZWwoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQsXG4gIG92ZXJyaWRlczogQnVpbGRNb2RlbE92ZXJyaWRlcyA9IHt9LFxuKTogUHJvbWlzZTxNYXN0cmFNb2RlbENvbmZpZz4ge1xuICB2b2lkIHNldHVwRmV0Y2hJbnRlcmNlcHRvcigpO1xuICAvLyBUaGUgY2hhdCBwYXRoIHN0YW1wcyB0aGUgQXBwS2l0IHVzZXIgb24gdGhlIHJlcXVlc3QgY29udGV4dCB2aWFcbiAgLy8gYE1hc3RyYVNlcnZlcmAuIFRoZSBNQ1AgdHJhbnNwb3J0IHJvdXRlcyBkb24ndCB0aHJlYWQgdGhhdCBjb250ZXh0XG4gIC8vIGludG8gdG9vbCBleGVjdXRpb24sIHNvIGZhbGwgYmFjayB0byB0aGUgYW1iaWVudCBleGVjdXRpb24gY29udGV4dFxuICAvLyAodGhlIGFjdGl2ZSBPQk8gc2NvcGUsIG9yIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCkgd2hlbiBpdCdzIGFic2VudC5cbiAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9LRVkpIGFzIFVzZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGV4ZWN1dGlvbkNvbnRleHQgPSB1c2VyPy5leGVjdXRpb25Db250ZXh0ID8/IGdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgcmVjb3JkQWN0aXZlVHJhY2VBdXRoKFwiaXNVc2VyQ29udGV4dFwiIGluIGV4ZWN1dGlvbkNvbnRleHQgPyBcIm9ib1wiIDogXCJzZXJ2aWNlLXByaW5jaXBhbFwiKTtcbiAgY29uc3QgY2xpZW50Q29uZmlnID0gZXhlY3V0aW9uQ29udGV4dC5jbGllbnQuY29uZmlnO1xuICBjb25zdCBob3N0ID0gKGF3YWl0IGNsaWVudENvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICBhd2FpdCBjbGllbnRDb25maWcuYXV0aGVudGljYXRlKGhlYWRlcnMpO1xuICAvLyBUaGUgT3BlbkFJIE5vZGUgU0RLIGFwcGVuZHMgcGF0aHMgbGlrZSBgL2NoYXQvY29tcGxldGlvbnNgIHRvIHdoYXRldmVyXG4gIC8vIFVSTCB3ZSBoYW5kIGl0LiBEcm9wIHRoZSB0cmFpbGluZyBzbGFzaCBzbyB0aGUgcmVzdWx0aW5nIFVSTCBzdGF5c1xuICAvLyB3ZWxsLWZvcm1lZCAoYC9zZXJ2aW5nLWVuZHBvaW50cy9jaGF0L2NvbXBsZXRpb25zYCkuXG4gIGNvbnN0IHVybCA9IG5ldyBVUkwoXCIvc2VydmluZy1lbmRwb2ludHNcIiwgaG9zdCkudG9TdHJpbmcoKS5yZXBsYWNlKC9cXC8kLywgXCJcIik7XG5cbiAgY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihjb25maWcpO1xuICBjb25zdCBzZXJ2aW5nID0gcmVzb2x2ZVNlcnZpbmdDb25maWcoY29uZmlnKTtcbiAgY29uc3Qgb3ZlcnJpZGUgPSBzZXJ2aW5nLmFsbG93T3ZlcnJpZGVcbiAgICA/IChyZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKVxuICAgIDogdW5kZWZpbmVkO1xuXG4gIC8vIFRoZSBvdmVycmlkZSAvIGFnZW50IGRlZmF1bHQgLyBlbnYgdmFsdWUgY2FuIGJlIGVpdGhlciBhIGNvbmNyZXRlXG4gIC8vIGVuZHBvaW50IG5hbWUgb3IgYSBtb2RlbCBjbGFzcyBzbHVnIChcImNoYXQtdGhpbmtpbmdcIiAvXG4gIC8vIFwiY2hhdC1iYWxhbmNlZFwiIC8gXCJjaGF0LWZhc3RcIikuIEEgY2xhc3Mgc2x1ZyBiZWNvbWVzIGEgY2xhc3MgaW50ZW50XG4gIC8vIChsZXQgdGhlIGxpdmUgY2F0YWxvZ3VlIHBpY2sgdGhlIGJlc3QgbW9kZWwgaW4gdGhhdCBiYW5kKTsgYW55dGhpbmdcbiAgLy8gZWxzZSBpcyBhbiBleHBsaWNpdCBuYW1lIGZ1enp5LW1hdGNoZWQgYWdhaW5zdCB0aGUgY2F0YWxvZ3VlLiBBblxuICAvLyBpbnRlcm5hbCBgb3ZlcnJpZGVzLm1vZGVsQ2xhc3NgIChlLmcuIHRoZSBjaGFydCBwbGFubmVyKSBpcyB0aGVcbiAgLy8gZmxvb3Igd2hlbiBub3RoaW5nIHdhcyByZXF1ZXN0ZWQuXG4gIGNvbnN0IHJlcXVlc3RlZCA9IG92ZXJyaWRlID8/IG92ZXJyaWRlcy5tb2RlbElkID8/IHByb2Nlc3MuZW52LkRBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FO1xuXG4gIGNvbnN0IHsgbW9kZWxJZCwgc291cmNlIH0gPSBhd2FpdCBzZWxlY3RNb2RlbChcbiAgICBleGVjdXRpb25Db250ZXh0LmNsaWVudCxcbiAgICBob3N0LFxuICAgIHNlbGVjdGlvbklucHV0KGNvbmZpZywgcmVxdWVzdGVkLCBvdmVycmlkZXMubW9kZWxDbGFzcywgc2VydmluZyksXG4gICk7XG4gIGxvZ2dlci5kZWJ1ZyhcIm1vZGVsIHNlbGVjdGVkXCIsIHsgbW9kZWxJZCwgc291cmNlLCByZXF1ZXN0ZWQgfSk7XG4gIHJlY29yZEFjdGl2ZVRyYWNlTW9kZWwobW9kZWxJZCk7XG5cbiAgcmV0dXJuIHtcbiAgICBwcm92aWRlcklkOiBjb25maWcucHJvdmlkZXJJZCA/PyBcImRhdGFicmlja3NcIixcbiAgICBtb2RlbElkLFxuICAgIHVybCxcbiAgICBoZWFkZXJzOiBPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycy5lbnRyaWVzKCkpLFxuICAgIGFwaTogc2VydmluZ0FwaShtb2RlbElkKSxcbiAgfTtcbn1cblxuLyoqIENoYXQgQ29tcGxldGlvbnMgcm91dGUgd2hvc2UgcHJvdmlkZXItc3BlY2lmaWMgd2lyZSBzaGFwZXMgYXJlIG5vcm1hbGl6ZWQgaGVyZS4gKi9cbmNvbnN0IENIQVRfQ09NUExFVElPTlNfUEFUSCA9IGAvJHtpbnZva2UuQ0hBVF9DT01QTEVUSU9OU19QQVRIfWA7XG5cbi8qKlxuICogSW5zdGFsbCBhIHNpbmdsZSBzaGFyZWQgYGdsb2JhbFRoaXMuZmV0Y2hgIHdyYXBwZXIgZm9yIENoYXQgQ29tcGxldGlvbnNcbiAqIHJlcXVlc3RzLiBUaGUgd3JhcHBlciBkb2VzIHRocmVlIHRoaW5nczpcbiAqXG4gKiAgIDEuIFJld3JpdGVzIG91dGdvaW5nIEpTT04gZnJvbSBlaXRoZXIgYGluaXQuYm9keWAgb3IgYSBgUmVxdWVzdGAgdG8gcmVwYWlyXG4gKiAgICAgIHByb3ZpZGVyLXNwZWNpZmljIHJlcXVlc3QgY29uc3RyYWludHMgKHNlZSB7QGxpbmsgcmV3cml0ZVNlcnZpbmdSZXF1ZXN0fVxuICogICAgICBpbiBgLi9zZXJ2aW5nLXNhbml0aXplLmpzYCkuXG4gKiAgIDIuIEF0IGBMT0dfTEVWRUw9ZGVidWdgLCBkdW1wcyB0aGUgKHBvc3Qtc2FuaXRpemUpIEpTT04gYm9keSBzb1xuICogICAgICA0eHggZGVidWdnaW5nIGRvZXNuJ3QgaGF2ZSB0byBmaWdodCBBSSBTREsncyBgW0FycmF5XWBcbiAqICAgICAgZm9ybWF0dGVyLlxuICogICAzLiBSZXBhaXJzIGJ1ZmZlcmVkIGFuZCBzdHJlYW1pbmcgcmVzcG9uc2VzIHdoZXJlIGEgcHJvdmlkZXIgcmV0dXJuc1xuICogICAgICBgY2hvaWNlc1tdLm1lc3NhZ2UuY29udGVudGAgb3IgYGNob2ljZXNbXS5kZWx0YS5jb250ZW50YCBhcyBhIHBhcnRzXG4gKiAgICAgIGFycmF5IHRoYXQgdGhlIEFJIFNESydzIE9wZW5BSSBzY2hlbWEgcmVqZWN0cy5cbiAqXG4gKiBTYWZlIHRvIGNhbGwgZnJvbSBhbnkgaG90IHBhdGg6IHtAbGluayBmdW5jdGlvblV0aWxzLm1lbW9pemV9IGVuc3VyZXNcbiAqIHRoZSB3cmFwcGVyIGlzIGluc3RhbGxlZCBhdCBtb3N0IG9uY2UgcGVyIHByb2Nlc3MsIHNvIHN1YnNlcXVlbnRcbiAqIGNhbGxzIGFyZSBhIG5vLW9wIGV2ZW4gd2hlbiB7QGxpbmsgYnVpbGRNb2RlbH0gZmlyZXMgb24gZXZlcnkgYWdlbnRcbiAqIHN0ZXAuXG4gKi9cbmNvbnN0IHNldHVwRmV0Y2hJbnRlcmNlcHRvciA9IGZ1bmN0aW9uVXRpbHMubWVtb2l6ZSgoKTogdm9pZCA9PiB7XG4gIGdsb2JhbFRoaXMuZmV0Y2ggPSBjcmVhdGVTZXJ2aW5nRmV0Y2hJbnRlcmNlcHRvcihnbG9iYWxUaGlzLmZldGNoLmJpbmQoZ2xvYmFsVGhpcykpO1xufSk7XG5cbi8qKiBCdWlsZCB0aGUgc2VydmluZyBmZXRjaCB3cmFwcGVyOyBleHBvcnRlZCBmb3IgdHJhbnNwb3J0LWxldmVsIHJlZ3Jlc3Npb24gdGVzdHMuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VydmluZ0ZldGNoSW50ZXJjZXB0b3Iob3JpZ2luYWw6IHR5cGVvZiBmZXRjaCk6IHR5cGVvZiBmZXRjaCB7XG4gIGNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvbGxtXCIpO1xuICByZXR1cm4gKGFzeW5jIChpbnB1dCwgaW5pdCkgPT4ge1xuICAgIGNvbnN0IHVybCA9IG5ldC51cmxCdWlsZGVyKGlucHV0KTtcbiAgICBjb25zdCBtZXRob2QgPSBpbml0Py5tZXRob2QgPz8gKGlucHV0IGluc3RhbmNlb2YgUmVxdWVzdCA/IGlucHV0Lm1ldGhvZCA6IFwiR0VUXCIpO1xuICAgIGlmICghdXJsIHx8IHVybC5wYXRobmFtZSAhPT0gQ0hBVF9DT01QTEVUSU9OU19QQVRIIHx8IG1ldGhvZC50b1VwcGVyQ2FzZSgpICE9PSBcIlBPU1RcIikge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsKGlucHV0LCBpbml0KTtcbiAgICB9XG4gICAgY29uc3QgcmV3cml0dGVuID0gYXdhaXQgcmV3cml0ZVNlcnZpbmdSZXF1ZXN0KGlucHV0LCBpbml0KTtcbiAgICBjb25zdCBwYXJzZWQgPSBqc29uLnBhcnNlPHVua25vd24+KHJld3JpdHRlbi5ib2R5KTtcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBcIlBPU1RcIixcbiAgICAgIHBhcnNlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8geyB1cmw6IHVybC50b1N0cmluZygpLCBib2R5VHlwZTogXCJub24tSlNPTlwiIH1cbiAgICAgICAgOiB7IHVybDogdXJsLnRvU3RyaW5nKCksIGJvZHk6IHBhcnNlZCB9LFxuICAgICk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvcmlnaW5hbChyZXdyaXR0ZW4uaW5wdXQsIHJld3JpdHRlbi5pbml0KTtcbiAgICByZXR1cm4gcmVwYWlyU2VydmluZ1Jlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfSkgYXMgdHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2g7XG59XG5cbi8qKlxuICogUmV3cml0ZSBhIHNlcnZpbmcgcmVzcG9uc2Ugd2hvc2UgYm9keSBuZWVkcyByZXBhaXIsIGxlYXZpbmcgdW5zdXBwb3J0ZWRcbiAqIGNvbnRlbnQgdHlwZXMgYnl0ZS1pZGVudGljYWwuXG4gKlxuICogU1NFIHJlbWFpbnMgYSBsaXZlIHN0cmVhbTogYSBUcmFuc2Zvcm1TdHJlYW0gcmVwYWlycyBjb21wbGV0ZSBgZGF0YTpgIGxpbmVzXG4gKiBhcyBieXRlcyBhcnJpdmUgYW5kIHByZXNlcnZlcyBwYXJ0aWFsIGxpbmVzIGFjcm9zcyBuZXR3b3JrIGNodW5rcy4gSlNPTiBpc1xuICogYnVmZmVyZWQgdGhyb3VnaCB0aGUgZXhpc3RpbmcgcmVzcG9uc2UtYm9keSByZXBhaXIuIEEgbm9uLUpTT04vbm9uLVNTRSBib2R5XG4gKiBpcyByZXR1cm5lZCB1bnRvdWNoZWQgc28gdGhlIGNhbGxlciBzdGlsbCBzZWVzIHRoZSBvcmlnaW5hbCByZXNwb25zZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVwYWlyU2VydmluZ1Jlc3BvbnNlKHJlc3BvbnNlOiBSZXNwb25zZSk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSA/PyBcIlwiO1xuICBpZiAoY29udGVudFR5cGUuaW5jbHVkZXMoXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiKSAmJiByZXNwb25zZS5ib2R5KSB7XG4gICAgcmV0dXJuIHJlYnVpbGRTZXJ2aW5nUmVzcG9uc2UocmVzcG9uc2UsIHJld3JpdGVTZXJ2aW5nUmVzcG9uc2VTdHJlYW0ocmVzcG9uc2UuYm9keSkpO1xuICB9XG4gIGlmICghY29udGVudFR5cGUuaW5jbHVkZXMoXCJhcHBsaWNhdGlvbi9qc29uXCIpKSByZXR1cm4gcmVzcG9uc2U7XG5cbiAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3BvbnNlLmNsb25lKCkudGV4dCgpO1xuICBjb25zdCByZXdyaXR0ZW4gPSByZXdyaXRlU2VydmluZ1Jlc3BvbnNlQm9keShib2R5KTtcbiAgaWYgKHJld3JpdHRlbiA9PT0gYm9keSkgcmV0dXJuIHJlc3BvbnNlO1xuICByZXR1cm4gcmVidWlsZFNlcnZpbmdSZXNwb25zZShyZXNwb25zZSwgcmV3cml0dGVuKTtcbn1cblxuLyoqIFJlYnVpbGQgYSB0cmFuc2Zvcm1lZCByZXNwb25zZSB3aXRob3V0IHN0YWxlIGJ5dGUtbGVuZ3RoL2VuY29kaW5nIGhlYWRlcnMuICovXG5mdW5jdGlvbiByZWJ1aWxkU2VydmluZ1Jlc3BvbnNlKFxuICByZXNwb25zZTogUmVzcG9uc2UsXG4gIGJvZHk6IHN0cmluZyB8IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+LFxuKTogUmVzcG9uc2Uge1xuICAvLyBgY29udGVudC1sZW5ndGhgIC8gYGNvbnRlbnQtZW5jb2RpbmdgIGRlc2NyaWJlIHRoZSBPUklHSU5BTCBieXRlcywgc28gdGhleVxuICAvLyBhcmUgZHJvcHBlZDogdGhlIHJld3JpdHRlbiBib2R5IGlzIGEgZGlmZmVyZW50IGxlbmd0aCBhbmQgYWxyZWFkeSBkZWNvZGVkLlxuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyk7XG4gIGhlYWRlcnMuZGVsZXRlKFwiY29udGVudC1sZW5ndGhcIik7XG4gIGhlYWRlcnMuZGVsZXRlKFwiY29udGVudC1lbmNvZGluZ1wiKTtcbiAgcmV0dXJuIG5ldyBSZXNwb25zZShib2R5LCB7XG4gICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICBoZWFkZXJzLFxuICB9KTtcbn1cbiJdfQ==
202
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUt2RSxPQUFPLEVBQUUsZUFBZSxFQUFzQyxNQUFNLGFBQWEsQ0FBQztBQUNsRixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLDBCQUEwQixFQUMxQiw0QkFBNEIsR0FDN0IsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixvQkFBb0IsR0FDckIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHL0UsTUFBTSxFQUFFLGVBQWUsRUFBRSxHQUFHLE9BQU8sQ0FBQztBQUNwQyxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUFDO0FBRWhDLDhGQUE4RjtBQUM5RixNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRztJQUN4QyxNQUFNLEVBQUU7UUFDTixLQUFLLEVBQUUsS0FBSztLQUNiO0NBQ08sQ0FBQztBQUVYLGlGQUFpRjtBQUNqRixNQUFNLFVBQVUsVUFBVSxDQUFDLE9BQWU7SUFDeEMsT0FBTyxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFxQkQsU0FBUyxjQUFjLENBQ3JCLE1BQTBCLEVBQzFCLFNBQTZCLEVBQzdCLFlBQW9DLEVB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QUM5QyxPQUFPLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDakMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFO1FBQ3hCLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtRQUN2QixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7UUFDL0IsT0FBTztLQUNSLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERhdGFicmlja3MgTW9kZWwgU2VydmluZyByZXNvbHZlciBmb3IgTWFzdHJhIGFnZW50cy5cbiAqXG4gKiBFYWNoIGFnZW50IHN0ZXAgY2FsbHMge0BsaW5rIGJ1aWxkTW9kZWx9IHdpdGggdGhlIGFjdGl2ZVxuICogYFJlcXVlc3RDb250ZXh0YC4gVGhlIHVzZXIgc3RhbXBlZCBieSBgTWFzdHJhU2VydmVyYCBjYXJyaWVzIGFuXG4gKiBBcHBLaXQgYFdvcmtzcGFjZUNsaWVudGA7IHdlIGFzayBpdCBmb3IgdGhlIHdvcmtzcGFjZSBob3N0IGFuZCBhXG4gKiBmcmVzaCBiZWFyZXIgaGVhZGVyLCB0aGVuIHBvaW50IE1hc3RyYSdzIE9wZW5BSS1jb21wYXRpYmxlIHByb3ZpZGVyXG4gKiBhdCBgL3NlcnZpbmctZW5kcG9pbnRzYCBvbiB0aGF0IGhvc3QuXG4gKlxuICogVGhpcyBtb2R1bGUgb25seSBhZGRzIHRoZSBNYXN0cmEtc3BlY2lmaWMgZ2x1ZS4gVGhlIGFjdHVhbCBtb2RlbFxuICogc2VsZWN0aW9uIC0gbGlzdGluZyB0aGUgd29ya3NwYWNlIGNhdGFsb2d1ZSBhbmQgcmVzb2x2aW5nIGFuXG4gKiBleHBsaWNpdCBuYW1lIC8gY2xhc3MgLyBmYWxsYmFjayBjaGFpbiB0byBhIHJlYWwgZW5kcG9pbnQgaWQgLSBsaXZlc1xuICogaW4gYEBkYngtdG9vbHMvbW9kZWxgICh7QGxpbmsgc2VsZWN0TW9kZWx9KSBzbyBub24tTWFzdHJhIGNvbnN1bWVyc1xuICogKGUuZy4gYSBqb2IgdGhhdCBqdXN0IG5lZWRzIGEgbW9kZWwgbmFtZSkgY2FuIHJldXNlIGl0LiBIZXJlIHdlXG4gKiBhc3NlbWJsZSB0aGUgZXhwbGljaXQgYXNrIGZyb20gTWFzdHJhJ3MgcmVxdWVzdCBjb250ZXh0ICh0aGVcbiAqIHBlci1yZXF1ZXN0IG92ZXJyaWRlIHVuZGVyIHtAbGluayBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZfSwgdGhlXG4gKiBhZ2VudCAvIHBsdWdpbiBgbW9kZWxJZGAsIG9yIGBEQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRWApLFxuICogcGFzcyB0aGUgcGx1Z2luJ3MgZnV6enkgLyBjbGFzcyAvIGZhbGxiYWNrIGtub2JzIHRocm91Z2gsIGFuZCB3cmFwXG4gKiB0aGUgcmVzb2x2ZWQgaWQgaW4gdGhlIE9wZW5BSS1jb21wYXRpYmxlIHByb3ZpZGVyIGNvbmZpZyBNYXN0cmFcbiAqIGV4cGVjdHMuIENhdGFsb2d1ZSBmZXRjaGVzIGZhaWwgbG91ZDogbmV0d29yayAvIGF1dGggZXJyb3JzXG4gKiBwcm9wYWdhdGUgc28gY2FsbGVycyBzZWUgdGhlIHJlYWwgU0RLIG1lc3NhZ2UuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGdldEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBjbGFzc2VzLCBpbnZva2UsIHBvbGljeSwgcmVzb2x2ZSB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBmdW5jdGlvblV0aWxzLCBqc29uLCBsb2csIG5ldCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IE1hc3RyYU1vZGVsQ29uZmlnIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9sbG1cIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuXG5pbXBvcnQgeyBNQVNUUkFfVVNFUl9LRVksIHR5cGUgTWFzdHJhUGx1Z2luQ29uZmlnLCB0eXBlIFVzZXIgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7XG4gIHJld3JpdGVTZXJ2aW5nUmVxdWVzdCxcbiAgcmV3cml0ZVNlcnZpbmdSZXNwb25zZUJvZHksXG4gIHJld3JpdGVTZXJ2aW5nUmVzcG9uc2VTdHJlYW0sXG59IGZyb20gXCIuL3NlcnZpbmctc2FuaXRpemUudHNcIjtcbmltcG9ydCB7XG4gIE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVksXG4gIE1BU1RSQV9SRVNPTFZFRF9NT0RFTF9LRVksXG4gIHJlc29sdmVTZXJ2aW5nQ29uZmlnLFxufSBmcm9tIFwiLi9zZXJ2aW5nLnRzXCI7XG5pbXBvcnQgeyByZWNvcmRBY3RpdmVUcmFjZUF1dGgsIHJlY29yZEFjdGl2ZVRyYWNlTW9kZWwgfSBmcm9tIFwiLi90ZWxlbWV0cnkudHNcIjtcblxudHlwZSBNb2RlbENsYXNzID0gbW9kZWwuTW9kZWxDbGFzcztcbmNvbnN0IHsgcGFyc2VNb2RlbENsYXNzIH0gPSBjbGFzc2VzO1xuY29uc3QgeyBzZWxlY3RNb2RlbCB9ID0gcmVzb2x2ZTtcblxuLyoqIEtlZXAgUmVzcG9uc2VzIHR1cm5zIHN0YXRlbGVzcyBzbyB0b29sIGNvbnRpbnVhdGlvbnMgcmVwbGF5IGVuY3J5cHRlZCByZWFzb25pbmcgaW5saW5lLiAqL1xuZXhwb3J0IGNvbnN0IFJFU1BPTlNFU19QUk9WSURFUl9PUFRJT05TID0ge1xuICBvcGVuYWk6IHtcbiAgICBzdG9yZTogZmFsc2UsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG4vKiogUGljayB0aGUgbmF0aXZlIERhdGFicmlja3MgaW5mZXJlbmNlIHN1cmZhY2UgcmVxdWlyZWQgYnkgYSByZXNvbHZlZCBtb2RlbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2aW5nQXBpKG1vZGVsSWQ6IHN0cmluZyk6IFwiY2hhdFwiIHwgXCJyZXNwb25zZXNcIiB7XG4gIHJldHVybiBwb2xpY3kubW9kZWxTZXJ2aW5nQXBpKG1vZGVsSWQpO1xufVxuXG4vKiogT3B0aW9uYWwgb3ZlcnJpZGVzIGFjY2VwdGVkIGJ5IHtAbGluayBidWlsZE1vZGVsfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRNb2RlbE92ZXJyaWRlcyB7XG4gIC8qKlxuICAgKiBTdGF0aWMgbW9kZWwgaWQgZnJvbSB0aGUgYWdlbnQgLyBwbHVnaW4gY29uZmlnIChzdHJpbmcgc3VnYXIgb25cbiAgICogYGRlZi5tb2RlbGAgb3IgYGNvbmZpZy5kZWZhdWx0TW9kZWxgKS4gTG9zZXMgdG8gdGhlIHBlci1yZXF1ZXN0XG4gICAqIG92ZXJyaWRlIGJ1dCB3aW5zIG92ZXIgZW52IC8gY2xhc3MgLyBmYWxsYmFjay5cbiAgICovXG4gIG1vZGVsSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDaGF0IGNhcGFiaWxpdHkgY2xhc3MgdG8gcmVzb2x2ZSB3aGVuIG5vIGV4cGxpY2l0IG1vZGVsIGlkIGlzXG4gICAqIHN1cHBsaWVkLiBVc2VkIGJ5IGludGVybmFsIGFnZW50cyAoZS5nLiB0aGUgY2hhcnQgcGxhbm5lciBhc2tzIGZvclxuICAgKiB7QGxpbmsgbW9kZWwuTW9kZWxDbGFzcy5DaGF0RmFzdH0pIHRvIGV4cHJlc3MgaW50ZW50IHdpdGhvdXQgcGlubmluZyBhblxuICAgKiBlbmRwb2ludCBuYW1lOyB0aGUgbGl2ZSBjYXRhbG9ndWUgaXMgY2xhc3NpZmllZCBhbmQgdGhlIHRvcFxuICAgKiBhdmFpbGFibGUgbW9kZWwgaW4gdGhlIGNsYXNzIGlzIGNob3NlbiwgZmFsbGluZyBiYWNrIHRvIHRoZVxuICAgKiBjbGFzcydzIHN0YXRpYyBsaXN0IHdoZW4gdGhlIHdvcmtzcGFjZSBoYXMgbm9uZS5cbiAgICovXG4gIG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25JbnB1dChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIHJlcXVlc3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBkZWZhdWx0Q2xhc3M6IE1vZGVsQ2xhc3MgfCB1bmRlZmluZWQsXG4gIHNlcnZpbmcgPSByZXNvbHZlU2VydmluZ0NvbmZpZyhjb25maWcpLFxuKSB7XG4gIGNvbnN0IHJlcXVlc3RlZENsYXNzID0gcmVxdWVzdGVkICE9PSB1bmRlZmluZWQgPyBwYXJzZU1vZGVsQ2xhc3MocmVxdWVzdGVkKSA6IG51bGw7XG4gIGNvbnN0IGV4cGxpY2l0ID0gcmVxdWVzdGVkQ2xhc3MgPT09IG51bGwgPyByZXF1ZXN0ZWQgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IG1vZGVsQ2xhc3MgPSByZXF1ZXN0ZWRDbGFzcyA/PyBkZWZhdWx0Q2xhc3M7XG4gIHJldHVybiB7XG4gICAgLi4uKGV4cGxpY2l0ICE9PSB1bmRlZmluZWQgPyB7IGV4cGxpY2l0IH0gOiB7fSksXG4gICAgZnV6enk6IHNlcnZpbmcuZnV6enksXG4gICAgdGhyZXNob2xkOiBzZXJ2aW5nLnRocmVzaG9sZCxcbiAgICAuLi4obW9kZWxDbGFzcyAhPT0gdW5kZWZpbmVkID8geyBtb2RlbENsYXNzIH0gOiB7fSksXG4gICAgZmFsbGJhY2tzOiBzZXJ2aW5nLmZhbGxiYWNrcy5zbGljZSgpLFxuICAgIGxpdmVPbmx5OiByZXF1ZXN0ZWQgPT09IHVuZGVmaW5lZCxcbiAgICB0dGxNczogc2VydmluZy50dGxNcyxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGFuIGFnZW50J3MgdW5waW5uZWQgZGVmYXVsdCBhZ2FpbnN0IGFuIGFscmVhZHktbG9hZGVkIGxpdmUgY2F0YWxvZ3VlLlxuICpcbiAqIFdpdGggbm8gY29uZmlndXJlZCBpZC9jbGFzcy9mYWxsYmFjaywgdGhlIGdlbmVyaWMgbW9kZWwgcmFua2VyIHNlbGVjdHMgdGhlXG4gKiBoaWdoZXN0LXJhbmtlZCBjdXJyZW50bHkgYXZhaWxhYmxlIEdQVCwgdGhlbiBmYWxscyBiYWNrIHRvIHRoZSBoaWdoZXN0LXJhbmtlZFxuICogbGl2ZSBjaGF0IGVuZHBvaW50IHdoZW4gdGhlIHdvcmtzcGFjZSBoYXMgbm8gR1BULlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURlZmF1bHRNb2RlbElkKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIG92ZXJyaWRlczogQnVpbGRNb2RlbE92ZXJyaWRlcyA9IHt9LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgcmVxdWVzdGVkID0gb3ZlcnJpZGVzLm1vZGVsSWQgPz8gcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUU7XG4gIHJldHVybiByZXNvbHZlLnJlc29sdmVNb2RlbChlbmRwb2ludHMsIHNlbGVjdGlvbklucHV0KGNvbmZpZywgcmVxdWVzdGVkLCBvdmVycmlkZXMubW9kZWxDbGFzcykpXG4gICAgLm1vZGVsSWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGBNYXN0cmFNb2RlbENvbmZpZ2AgZm9yIHRoZSBjdXJyZW50IGFnZW50IHN0ZXAuIFJ1bnNcbiAqIHdoaWxlIGBhZ2VudC5zdHJlYW1gIGlzIGluc2lkZSB0aGUgYGFzVXNlcihyZXEpYCBzY29wZSBzbyB0b2tlbnNcbiAqIGFyZSB1c2VyLXNjb3BlZDsgb3V0c2lkZSBhbiBhY3RpdmUgdXNlciBjb250ZXh0IHRoZSB3b3Jrc3BhY2VcbiAqIGNsaWVudCBmYWxscyBiYWNrIHRvIHRoZSBzZXJ2aWNlIHByaW5jaXBhbC5cbiAqXG4gKiBFbmRwb2ludCBwcmVjZWRlbmNlOiB0aGUgcGVyLXJlcXVlc3Qgb3ZlcnJpZGVcbiAqICh7QGxpbmsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWX0sIG9ubHkgd2hlbiBgY29uZmlnLm1vZGVsT3ZlcnJpZGVgIGFsbG93c1xuICogaXQpLCB0aGVuIHtAbGluayBCdWlsZE1vZGVsT3ZlcnJpZGVzLm1vZGVsSWR9IGZyb20gdGhlIGFnZW50IC8gcGx1Z2luXG4gKiBjb25maWcsIHRoZW4gYERBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FYC4gV2l0aCBub25lIG9mIHRob3NlIHNldCB0aGVcbiAqIGNhcGFiaWxpdHkgY2xhc3MgYW5kIGZhbGxiYWNrIGxhZGRlciBpbiBgQGRieC10b29scy9tb2RlbGAgY2hvb3NlIHRoZVxuICogZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZE1vZGVsKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICBvdmVycmlkZXM6IEJ1aWxkTW9kZWxPdmVycmlkZXMgPSB7fSxcbik6IFByb21pc2U8TWFzdHJhTW9kZWxDb25maWc+IHtcbiAgdm9pZCBzZXR1cEZldGNoSW50ZXJjZXB0b3IoKTtcbiAgLy8gVGhlIGNoYXQgcGF0aCBzdGFtcHMgdGhlIEFwcEtpdCB1c2VyIG9uIHRoZSByZXF1ZXN0IGNvbnRleHQgdmlhXG4gIC8vIGBNYXN0cmFTZXJ2ZXJgLiBUaGUgTUNQIHRyYW5zcG9ydCByb3V0ZXMgZG9uJ3QgdGhyZWFkIHRoYXQgY29udGV4dFxuICAvLyBpbnRvIHRvb2wgZXhlY3V0aW9uLCBzbyBmYWxsIGJhY2sgdG8gdGhlIGFtYmllbnQgZXhlY3V0aW9uIGNvbnRleHRcbiAgLy8gKHRoZSBhY3RpdmUgT0JPIHNjb3BlLCBvciB0aGUgc2VydmljZSBwcmluY2lwYWwpIHdoZW4gaXQncyBhYnNlbnQuXG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBleGVjdXRpb25Db250ZXh0ID0gdXNlcj8uZXhlY3V0aW9uQ29udGV4dCA/PyBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gIHJlY29yZEFjdGl2ZVRyYWNlQXV0aChcImlzVXNlckNvbnRleHRcIiBpbiBleGVjdXRpb25Db250ZXh0ID8gXCJvYm9cIiA6IFwic2VydmljZS1wcmluY2lwYWxcIik7XG4gIGNvbnN0IGNsaWVudENvbmZpZyA9IGV4ZWN1dGlvbkNvbnRleHQuY2xpZW50LmNvbmZpZztcbiAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnRDb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgYXdhaXQgY2xpZW50Q29uZmlnLmF1dGhlbnRpY2F0ZShoZWFkZXJzKTtcbiAgLy8gVGhlIE9wZW5BSSBOb2RlIFNESyBhcHBlbmRzIHBhdGhzIGxpa2UgYC9jaGF0L2NvbXBsZXRpb25zYCB0byB3aGF0ZXZlclxuICAvLyBVUkwgd2UgaGFuZCBpdC4gRHJvcCB0aGUgdHJhaWxpbmcgc2xhc2ggc28gdGhlIHJlc3VsdGluZyBVUkwgc3RheXNcbiAgLy8gd2VsbC1mb3JtZWQgKGAvc2VydmluZy1lbmRwb2ludHMvY2hhdC9jb21wbGV0aW9uc2ApLlxuICBjb25zdCB1cmwgPSBuZXcgVVJMKFwiL3NlcnZpbmctZW5kcG9pbnRzXCIsIGhvc3QpLnRvU3RyaW5nKCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpO1xuXG4gIGNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoY29uZmlnKTtcbiAgY29uc3Qgc2VydmluZyA9IHJlc29sdmVTZXJ2aW5nQ29uZmlnKGNvbmZpZyk7XG4gIGNvbnN0IG92ZXJyaWRlID0gc2VydmluZy5hbGxvd092ZXJyaWRlXG4gICAgPyAocmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVkpIGFzIHN0cmluZyB8IHVuZGVmaW5lZClcbiAgICA6IHVuZGVmaW5lZDtcblxuICAvLyBUaGUgb3ZlcnJpZGUgLyBhZ2VudCBkZWZhdWx0IC8gZW52IHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBjb25jcmV0ZVxuICAvLyBlbmRwb2ludCBuYW1lIG9yIGEgbW9kZWwgY2xhc3Mgc2x1ZyAoXCJjaGF0LXRoaW5raW5nXCIgL1xuICAvLyBcImNoYXQtYmFsYW5jZWRcIiAvIFwiY2hhdC1mYXN0XCIpLiBBIGNsYXNzIHNsdWcgYmVjb21lcyBhIGNsYXNzIGludGVudFxuICAvLyAobGV0IHRoZSBsaXZlIGNhdGFsb2d1ZSBwaWNrIHRoZSBiZXN0IG1vZGVsIGluIHRoYXQgYmFuZCk7IGFueXRoaW5nXG4gIC8vIGVsc2UgaXMgYW4gZXhwbGljaXQgbmFtZSBmdXp6eS1tYXRjaGVkIGFnYWluc3QgdGhlIGNhdGFsb2d1ZS4gQW5cbiAgLy8gaW50ZXJuYWwgYG92ZXJyaWRlcy5tb2RlbENsYXNzYCAoZS5nLiB0aGUgY2hhcnQgcGxhbm5lcikgaXMgdGhlXG4gIC8vIGZsb29yIHdoZW4gbm90aGluZyB3YXMgcmVxdWVzdGVkLlxuICBjb25zdCByZXF1ZXN0ZWQgPSBvdmVycmlkZSA/PyBvdmVycmlkZXMubW9kZWxJZCA/PyBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRTtcblxuICBjb25zdCB7IG1vZGVsSWQsIHNvdXJjZSB9ID0gYXdhaXQgc2VsZWN0TW9kZWwoXG4gICAgZXhlY3V0aW9uQ29udGV4dC5jbGllbnQsXG4gICAgaG9zdCxcbiAgICBzZWxlY3Rpb25JbnB1dChjb25maWcsIHJlcXVlc3RlZCwgb3ZlcnJpZGVzLm1vZGVsQ2xhc3MsIHNlcnZpbmcpLFxuICApO1xuICBsb2dnZXIuZGVidWcoXCJtb2RlbCBzZWxlY3RlZFwiLCB7IG1vZGVsSWQsIHNvdXJjZSwgcmVxdWVzdGVkIH0pO1xuICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1JFU09MVkVEX01PREVMX0tFWSwgbW9kZWxJZCk7XG4gIHJlY29yZEFjdGl2ZVRyYWNlTW9kZWwobW9kZWxJZCk7XG5cbiAgcmV0dXJuIHtcbiAgICBwcm92aWRlcklkOiBjb25maWcucHJvdmlkZXJJZCA/PyBcImRhdGFicmlja3NcIixcbiAgICBtb2RlbElkLFxuICAgIHVybCxcbiAgICBoZWFkZXJzOiBPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycy5lbnRyaWVzKCkpLFxuICAgIGFwaTogc2VydmluZ0FwaShtb2RlbElkKSxcbiAgfTtcbn1cblxuLyoqIENoYXQgQ29tcGxldGlvbnMgcm91dGUgd2hvc2UgcHJvdmlkZXItc3BlY2lmaWMgd2lyZSBzaGFwZXMgYXJlIG5vcm1hbGl6ZWQgaGVyZS4gKi9cbmNvbnN0IENIQVRfQ09NUExFVElPTlNfUEFUSCA9IGAvJHtpbnZva2UuQ0hBVF9DT01QTEVUSU9OU19QQVRIfWA7XG5cbi8qKlxuICogSW5zdGFsbCBhIHNpbmdsZSBzaGFyZWQgYGdsb2JhbFRoaXMuZmV0Y2hgIHdyYXBwZXIgZm9yIENoYXQgQ29tcGxldGlvbnNcbiAqIHJlcXVlc3RzLiBUaGUgd3JhcHBlciBkb2VzIHRocmVlIHRoaW5nczpcbiAqXG4gKiAgIDEuIFJld3JpdGVzIG91dGdvaW5nIEpTT04gZnJvbSBlaXRoZXIgYGluaXQuYm9keWAgb3IgYSBgUmVxdWVzdGAgdG8gcmVwYWlyXG4gKiAgICAgIHByb3ZpZGVyLXNwZWNpZmljIHJlcXVlc3QgY29uc3RyYWludHMgKHNlZSB7QGxpbmsgcmV3cml0ZVNlcnZpbmdSZXF1ZXN0fVxuICogICAgICBpbiBgLi9zZXJ2aW5nLXNhbml0aXplLmpzYCkuXG4gKiAgIDIuIEF0IGBMT0dfTEVWRUw9ZGVidWdgLCBkdW1wcyB0aGUgKHBvc3Qtc2FuaXRpemUpIEpTT04gYm9keSBzb1xuICogICAgICA0eHggZGVidWdnaW5nIGRvZXNuJ3QgaGF2ZSB0byBmaWdodCBBSSBTREsncyBgW0FycmF5XWBcbiAqICAgICAgZm9ybWF0dGVyLlxuICogICAzLiBSZXBhaXJzIGJ1ZmZlcmVkIGFuZCBzdHJlYW1pbmcgcmVzcG9uc2VzIHdoZXJlIGEgcHJvdmlkZXIgcmV0dXJuc1xuICogICAgICBgY2hvaWNlc1tdLm1lc3NhZ2UuY29udGVudGAgb3IgYGNob2ljZXNbXS5kZWx0YS5jb250ZW50YCBhcyBhIHBhcnRzXG4gKiAgICAgIGFycmF5IHRoYXQgdGhlIEFJIFNESydzIE9wZW5BSSBzY2hlbWEgcmVqZWN0cy5cbiAqXG4gKiBTYWZlIHRvIGNhbGwgZnJvbSBhbnkgaG90IHBhdGg6IHtAbGluayBmdW5jdGlvblV0aWxzLm1lbW9pemV9IGVuc3VyZXNcbiAqIHRoZSB3cmFwcGVyIGlzIGluc3RhbGxlZCBhdCBtb3N0IG9uY2UgcGVyIHByb2Nlc3MsIHNvIHN1YnNlcXVlbnRcbiAqIGNhbGxzIGFyZSBhIG5vLW9wIGV2ZW4gd2hlbiB7QGxpbmsgYnVpbGRNb2RlbH0gZmlyZXMgb24gZXZlcnkgYWdlbnRcbiAqIHN0ZXAuXG4gKi9cbmNvbnN0IHNldHVwRmV0Y2hJbnRlcmNlcHRvciA9IGZ1bmN0aW9uVXRpbHMubWVtb2l6ZSgoKTogdm9pZCA9PiB7XG4gIGdsb2JhbFRoaXMuZmV0Y2ggPSBjcmVhdGVTZXJ2aW5nRmV0Y2hJbnRlcmNlcHRvcihnbG9iYWxUaGlzLmZldGNoLmJpbmQoZ2xvYmFsVGhpcykpO1xufSk7XG5cbi8qKiBCdWlsZCB0aGUgc2VydmluZyBmZXRjaCB3cmFwcGVyOyBleHBvcnRlZCBmb3IgdHJhbnNwb3J0LWxldmVsIHJlZ3Jlc3Npb24gdGVzdHMuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VydmluZ0ZldGNoSW50ZXJjZXB0b3Iob3JpZ2luYWw6IHR5cGVvZiBmZXRjaCk6IHR5cGVvZiBmZXRjaCB7XG4gIGNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvbGxtXCIpO1xuICByZXR1cm4gKGFzeW5jIChpbnB1dCwgaW5pdCkgPT4ge1xuICAgIGNvbnN0IHVybCA9IG5ldC51cmxCdWlsZGVyKGlucHV0KTtcbiAgICBjb25zdCBtZXRob2QgPSBpbml0Py5tZXRob2QgPz8gKGlucHV0IGluc3RhbmNlb2YgUmVxdWVzdCA/IGlucHV0Lm1ldGhvZCA6IFwiR0VUXCIpO1xuICAgIGlmICghdXJsIHx8IHVybC5wYXRobmFtZSAhPT0gQ0hBVF9DT01QTEVUSU9OU19QQVRIIHx8IG1ldGhvZC50b1VwcGVyQ2FzZSgpICE9PSBcIlBPU1RcIikge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsKGlucHV0LCBpbml0KTtcbiAgICB9XG4gICAgY29uc3QgcmV3cml0dGVuID0gYXdhaXQgcmV3cml0ZVNlcnZpbmdSZXF1ZXN0KGlucHV0LCBpbml0KTtcbiAgICBjb25zdCBwYXJzZWQgPSBqc29uLnBhcnNlPHVua25vd24+KHJld3JpdHRlbi5ib2R5KTtcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBcIlBPU1RcIixcbiAgICAgIHBhcnNlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8geyB1cmw6IHVybC50b1N0cmluZygpLCBib2R5VHlwZTogXCJub24tSlNPTlwiIH1cbiAgICAgICAgOiB7IHVybDogdXJsLnRvU3RyaW5nKCksIGJvZHk6IHBhcnNlZCB9LFxuICAgICk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvcmlnaW5hbChyZXdyaXR0ZW4uaW5wdXQsIHJld3JpdHRlbi5pbml0KTtcbiAgICByZXR1cm4gcmVwYWlyU2VydmluZ1Jlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfSkgYXMgdHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2g7XG59XG5cbi8qKlxuICogUmV3cml0ZSBhIHNlcnZpbmcgcmVzcG9uc2Ugd2hvc2UgYm9keSBuZWVkcyByZXBhaXIsIGxlYXZpbmcgdW5zdXBwb3J0ZWRcbiAqIGNvbnRlbnQgdHlwZXMgYnl0ZS1pZGVudGljYWwuXG4gKlxuICogU1NFIHJlbWFpbnMgYSBsaXZlIHN0cmVhbTogYSBUcmFuc2Zvcm1TdHJlYW0gcmVwYWlycyBjb21wbGV0ZSBgZGF0YTpgIGxpbmVzXG4gKiBhcyBieXRlcyBhcnJpdmUgYW5kIHByZXNlcnZlcyBwYXJ0aWFsIGxpbmVzIGFjcm9zcyBuZXR3b3JrIGNodW5rcy4gSlNPTiBpc1xuICogYnVmZmVyZWQgdGhyb3VnaCB0aGUgZXhpc3RpbmcgcmVzcG9uc2UtYm9keSByZXBhaXIuIEEgbm9uLUpTT04vbm9uLVNTRSBib2R5XG4gKiBpcyByZXR1cm5lZCB1bnRvdWNoZWQgc28gdGhlIGNhbGxlciBzdGlsbCBzZWVzIHRoZSBvcmlnaW5hbCByZXNwb25zZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVwYWlyU2VydmluZ1Jlc3BvbnNlKHJlc3BvbnNlOiBSZXNwb25zZSk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSA/PyBcIlwiO1xuICBpZiAoY29udGVudFR5cGUuaW5jbHVkZXMoXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiKSAmJiByZXNwb25zZS5ib2R5KSB7XG4gICAgcmV0dXJuIHJlYnVpbGRTZXJ2aW5nUmVzcG9uc2UocmVzcG9uc2UsIHJld3JpdGVTZXJ2aW5nUmVzcG9uc2VTdHJlYW0ocmVzcG9uc2UuYm9keSkpO1xuICB9XG4gIGlmICghY29udGVudFR5cGUuaW5jbHVkZXMoXCJhcHBsaWNhdGlvbi9qc29uXCIpKSByZXR1cm4gcmVzcG9uc2U7XG5cbiAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3BvbnNlLmNsb25lKCkudGV4dCgpO1xuICBjb25zdCByZXdyaXR0ZW4gPSByZXdyaXRlU2VydmluZ1Jlc3BvbnNlQm9keShib2R5KTtcbiAgaWYgKHJld3JpdHRlbiA9PT0gYm9keSkgcmV0dXJuIHJlc3BvbnNlO1xuICByZXR1cm4gcmVidWlsZFNlcnZpbmdSZXNwb25zZShyZXNwb25zZSwgcmV3cml0dGVuKTtcbn1cblxuLyoqIFJlYnVpbGQgYSB0cmFuc2Zvcm1lZCByZXNwb25zZSB3aXRob3V0IHN0YWxlIGJ5dGUtbGVuZ3RoL2VuY29kaW5nIGhlYWRlcnMuICovXG5mdW5jdGlvbiByZWJ1aWxkU2VydmluZ1Jlc3BvbnNlKFxuICByZXNwb25zZTogUmVzcG9uc2UsXG4gIGJvZHk6IHN0cmluZyB8IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+LFxuKTogUmVzcG9uc2Uge1xuICAvLyBgY29udGVudC1sZW5ndGhgIC8gYGNvbnRlbnQtZW5jb2RpbmdgIGRlc2NyaWJlIHRoZSBPUklHSU5BTCBieXRlcywgc28gdGhleVxuICAvLyBhcmUgZHJvcHBlZDogdGhlIHJld3JpdHRlbiBib2R5IGlzIGEgZGlmZmVyZW50IGxlbmd0aCBhbmQgYWxyZWFkeSBkZWNvZGVkLlxuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyk7XG4gIGhlYWRlcnMuZGVsZXRlKFwiY29udGVudC1sZW5ndGhcIik7XG4gIGhlYWRlcnMuZGVsZXRlKFwiY29udGVudC1lbmNvZGluZ1wiKTtcbiAgcmV0dXJuIG5ldyBSZXNwb25zZShib2R5LCB7XG4gICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICBoZWFkZXJzLFxuICB9KTtcbn1cbiJdfQ==
@@ -0,0 +1,29 @@
1
+ import type { JSONSchema7 } from "json-schema";
2
+ declare const HTTP_METHODS: readonly ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "HEAD", "TRACE"];
3
+ /** HTTP method supported by an {@link OpenApiTool}. */
4
+ export type OpenApiHttpMethod = (typeof HTTP_METHODS)[number];
5
+ /** One executable HTTP operation derived from an OpenAPI document. */
6
+ export interface OpenApiTool {
7
+ /** Stable operation identifier. */
8
+ id: string;
9
+ /** Model-facing operation description. */
10
+ description: string;
11
+ /** Resolved operation URL, or the OpenAPI path for a local document without a server URL. */
12
+ url: string;
13
+ /** HTTP method used by the operation. */
14
+ method: OpenApiHttpMethod;
15
+ /** JSON Schema describing operation input. */
16
+ inputSchema: JSONSchema7;
17
+ /** JSON Schema describing a successful operation result. */
18
+ outputSchema: JSONSchema7;
19
+ }
20
+ /** Request options used while loading an OpenAPI document. */
21
+ export interface OpenApiToolsOptions {
22
+ /** Cancels an HTTP request or file read. */
23
+ signal?: AbortSignal;
24
+ /** Headers sent when `source` is an HTTP(S) URL. */
25
+ headers?: RequestInit["headers"];
26
+ }
27
+ /** Load an HTTP(S) URL or local file and return its OpenAPI operations as tool schemas. */
28
+ export declare function openApiTools(source: string, options?: OpenApiToolsOptions): Promise<OpenApiTool[]>;
29
+ export {};
@@ -0,0 +1,181 @@
1
+ /**
2
+ * OpenAPI operation loading and JSON Schema extraction.
3
+ *
4
+ * @module
5
+ */
6
+ import { readFile } from "node:fs/promises";
7
+ import { object } from "@dbx-tools/shared-core";
8
+ import { urlBuilder } from "@dbx-tools/shared-core/net";
9
+ import { z } from "zod";
10
+ const HTTP_METHODS = [
11
+ "GET",
12
+ "POST",
13
+ "PUT",
14
+ "PATCH",
15
+ "DELETE",
16
+ "OPTIONS",
17
+ "HEAD",
18
+ "TRACE",
19
+ ];
20
+ const JsonObjectSchema = z
21
+ .record(z.string(), z.unknown())
22
+ .describe("A JSON object embedded in an OpenAPI document.");
23
+ const OpenApiMediaTypeSchema = z
24
+ .object({
25
+ schema: JsonObjectSchema.describe("The JSON Schema for this media type."),
26
+ })
27
+ .describe("One OpenAPI media type.");
28
+ const OpenApiRequestBodySchema = z
29
+ .object({
30
+ content: z
31
+ .record(z.string(), OpenApiMediaTypeSchema)
32
+ .describe("Request media types keyed by content type."),
33
+ })
34
+ .describe("An OpenAPI request body.");
35
+ const OpenApiResponseSchema = z
36
+ .object({
37
+ content: z
38
+ .record(z.string(), OpenApiMediaTypeSchema)
39
+ .optional()
40
+ .describe("Response media types keyed by content type."),
41
+ })
42
+ .describe("One OpenAPI response.");
43
+ const OpenApiOperationSchema = z
44
+ .object({
45
+ operationId: z.string().describe("The stable operation identifier."),
46
+ summary: z.string().optional().describe("The short operation summary."),
47
+ description: z.string().optional().describe("The full operation description."),
48
+ requestBody: OpenApiRequestBodySchema.optional().describe("The optional operation request body."),
49
+ responses: z
50
+ .record(z.string(), OpenApiResponseSchema)
51
+ .describe("Operation responses keyed by HTTP status."),
52
+ })
53
+ .describe("The OpenAPI fields required to define a tool.");
54
+ const OpenApiPathSchema = z
55
+ .object({
56
+ get: OpenApiOperationSchema.optional(),
57
+ post: OpenApiOperationSchema.optional(),
58
+ put: OpenApiOperationSchema.optional(),
59
+ patch: OpenApiOperationSchema.optional(),
60
+ delete: OpenApiOperationSchema.optional(),
61
+ options: OpenApiOperationSchema.optional(),
62
+ head: OpenApiOperationSchema.optional(),
63
+ trace: OpenApiOperationSchema.optional(),
64
+ })
65
+ .describe("Operations available at one OpenAPI path.");
66
+ const OpenApiDocumentSchema = z
67
+ .object({
68
+ paths: z
69
+ .record(z.string(), OpenApiPathSchema)
70
+ .refine((paths) => Object.keys(paths).length > 0, "OpenAPI paths must not be empty")
71
+ .describe("OpenAPI path items keyed by URL path."),
72
+ components: JsonObjectSchema.optional().describe("Reusable OpenAPI components."),
73
+ servers: z
74
+ .array(z.object({
75
+ url: z.string().describe("Server base URL."),
76
+ }))
77
+ .optional()
78
+ .describe("OpenAPI server definitions."),
79
+ })
80
+ .describe("An OpenAPI document used to define HTTP tools.");
81
+ /** Load an HTTP(S) URL or local file and return its OpenAPI operations as tool schemas. */
82
+ export async function openApiTools(source, options = {}) {
83
+ const sourceUrl = httpUrl(source);
84
+ const document = OpenApiDocumentSchema.parse(sourceUrl
85
+ ? await fetchDocument(sourceUrl, options)
86
+ : await readDocument(source, options.signal));
87
+ return Object.entries(document.paths).flatMap(([path, item]) => HTTP_METHODS.flatMap((method) => {
88
+ const operation = item[method.toLowerCase()];
89
+ return operation ? [operationTool(document, sourceUrl, path, method, operation)] : [];
90
+ }));
91
+ }
92
+ function httpUrl(source) {
93
+ const url = urlBuilder(source);
94
+ return url?.scheme === "http" || url?.scheme === "https" ? url : undefined;
95
+ }
96
+ async function fetchDocument(url, options) {
97
+ const response = await fetch(url, {
98
+ signal: options.signal,
99
+ headers: options.headers,
100
+ });
101
+ if (!response.ok) {
102
+ throw new Error(`OpenAPI request failed with HTTP ${response.status}: ${url}`);
103
+ }
104
+ return response.json();
105
+ }
106
+ async function readDocument(path, signal) {
107
+ return JSON.parse(await readFile(path, { encoding: "utf8", signal }));
108
+ }
109
+ function operationTool(document, sourceUrl, path, method, operation) {
110
+ const requestSchema = jsonSchema(operation.requestBody?.content) ?? { type: "object" };
111
+ const responseSchema = successfulResponseSchema(operation);
112
+ return {
113
+ id: operation.operationId,
114
+ description: operation.description?.trim() || operation.summary?.trim() || operation.operationId,
115
+ url: operationUrl(document, sourceUrl, path),
116
+ method,
117
+ inputSchema: resolveReferences(document, requestSchema),
118
+ outputSchema: resolveReferences(document, responseSchema),
119
+ };
120
+ }
121
+ function successfulResponseSchema(operation) {
122
+ for (const [status, response] of Object.entries(operation.responses)) {
123
+ const schema = jsonSchema(response.content);
124
+ if (/^2(?:\d{2}|XX)$/i.test(status) && schema)
125
+ return schema;
126
+ }
127
+ return {};
128
+ }
129
+ function jsonSchema(content) {
130
+ const mediaType = Object.entries(content ?? {}).find(([type]) => /^application\/(?:[^+;]+\+)?json(?:;|$)/i.test(type));
131
+ return mediaType?.[1].schema;
132
+ }
133
+ function operationUrl(document, sourceUrl, path) {
134
+ const server = document.servers?.[0]?.url;
135
+ if (server) {
136
+ const base = sourceUrl ? urlBuilder(new URL(server, sourceUrl)) : httpUrl(server);
137
+ return base
138
+ ? base.withPathAppend(path).toString()
139
+ : `${server.replace(/\/$/, "")}/${path.replace(/^\//, "")}`;
140
+ }
141
+ return sourceUrl ? urlBuilder(sourceUrl)?.withPathReplace(path).toString() ?? path : path;
142
+ }
143
+ function resolveReferences(document, value, active = new Set()) {
144
+ if (Array.isArray(value))
145
+ return value.map((item) => resolveReferences(document, item, active));
146
+ if (!object.isRecord(value))
147
+ return value;
148
+ const reference = typeof value.$ref === "string" ? value.$ref : undefined;
149
+ if (reference) {
150
+ if (active.has(reference))
151
+ throw new Error(`Cyclic OpenAPI reference: ${reference}`);
152
+ const target = referenceTarget(document, reference);
153
+ const next = new Set(active).add(reference);
154
+ const { $ref: _ignored, ...siblings } = value;
155
+ return {
156
+ ...resolveReferences(document, target, next),
157
+ ...resolveReferences(document, siblings, next),
158
+ };
159
+ }
160
+ return Object.fromEntries(Object.entries(value).map(([key, child]) => [key, resolveReferences(document, child, active)]));
161
+ }
162
+ function referenceTarget(document, reference) {
163
+ if (!reference.startsWith("#/"))
164
+ throw new Error(`Unsupported OpenAPI reference: ${reference}`);
165
+ let current = document;
166
+ for (const rawSegment of reference.slice(2).split("/")) {
167
+ const segment = rawSegment.replaceAll("~1", "/").replaceAll("~0", "~");
168
+ if (!object.isRecord(current) || !(segment in current)) {
169
+ throw new Error(`Unresolved OpenAPI reference: ${reference}`);
170
+ }
171
+ current = current[segment];
172
+ }
173
+ return current;
174
+ }
175
+ if (import.meta.main) {
176
+ const source = process.argv[2];
177
+ if (!source)
178
+ throw new Error("Usage: bun openapi-tool.ts <openapi-url-or-file>");
179
+ console.log(JSON.stringify(await openApiTools(source), null, 2));
180
+ }
181
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFwaS10b29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29wZW5hcGktdG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsVUFBVSxFQUFtQixNQUFNLDRCQUE0QixDQUFDO0FBRXpFLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEIsTUFBTSxZQUFZLEdBQUc7SUFDbkIsS0FBSztJQUNMLE1BQU07SUFDTixLQUFLO0lBQ0wsT0FBTztJQUNQLFFBQVE7SUFDUixTQUFTO0lBQ1QsTUFBTTtJQUNOLE9BQU87Q0FDQyxDQUFDO0FBRVgsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDO0tBQ3ZCLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQy9CLFFBQVEsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0FBRTlELE1BQU0sc0JBQXNCLEdBQUcsQ0FBQztLQUM3QixNQUFNLENBQUM7SUFDTixNQUFNLEVBQUUsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLHNDQUFzQyxDQUFDO0NBQzFFLENBQUM7S0FDRCxRQUFRLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQUV2QyxNQUFNLHdCQUF3QixHQUFHLENBQUM7S0FDL0IsTUFBTSxDQUFDO0lBQ04sT0FBTyxFQUFFLENBQUM7U0FDUCxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLHNCQUFzQixDQUFDO1NBQzFDLFFBQVEsQ0FBQyw0Q0FBNEMsQ0FBQztDQUMxRCxDQUFDO0tBQ0QsUUFBUSxDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFFeEMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDO0tBQzVCLE1BQU0s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LE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsSUFBSSxDQUFDLE1BQU07UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7SUFDakYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25FLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE9wZW5BUEkgb3BlcmF0aW9uIGxvYWRpbmcgYW5kIEpTT04gU2NoZW1hIGV4dHJhY3Rpb24uXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBvYmplY3QgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgdXJsQnVpbGRlciwgdHlwZSBVcmxCdWlsZGVyIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvbmV0XCI7XG5pbXBvcnQgdHlwZSB7IEpTT05TY2hlbWE3IH0gZnJvbSBcImpzb24tc2NoZW1hXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5jb25zdCBIVFRQX01FVEhPRFMgPSBbXG4gIFwiR0VUXCIsXG4gIFwiUE9TVFwiLFxuICBcIlBVVFwiLFxuICBcIlBBVENIXCIsXG4gIFwiREVMRVRFXCIsXG4gIFwiT1BUSU9OU1wiLFxuICBcIkhFQURcIixcbiAgXCJUUkFDRVwiLFxuXSBhcyBjb25zdDtcblxuY29uc3QgSnNvbk9iamVjdFNjaGVtYSA9IHpcbiAgLnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSlcbiAgLmRlc2NyaWJlKFwiQSBKU09OIG9iamVjdCBlbWJlZGRlZCBpbiBhbiBPcGVuQVBJIGRvY3VtZW50LlwiKTtcblxuY29uc3QgT3BlbkFwaU1lZGlhVHlwZVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgc2NoZW1hOiBKc29uT2JqZWN0U2NoZW1hLmRlc2NyaWJlKFwiVGhlIEpTT04gU2NoZW1hIGZvciB0aGlzIG1lZGlhIHR5cGUuXCIpLFxuICB9KVxuICAuZGVzY3JpYmUoXCJPbmUgT3BlbkFQSSBtZWRpYSB0eXBlLlwiKTtcblxuY29uc3QgT3BlbkFwaVJlcXVlc3RCb2R5U2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBjb250ZW50OiB6XG4gICAgICAucmVjb3JkKHouc3RyaW5nKCksIE9wZW5BcGlNZWRpYVR5cGVTY2hlbWEpXG4gICAgICAuZGVzY3JpYmUoXCJSZXF1ZXN0IG1lZGlhIHR5cGVzIGtleWVkIGJ5IGNvbnRlbnQgdHlwZS5cIiksXG4gIH0pXG4gIC5kZXNjcmliZShcIkFuIE9wZW5BUEkgcmVxdWVzdCBib2R5LlwiKTtcblxuY29uc3QgT3BlbkFwaVJlc3BvbnNlU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBjb250ZW50OiB6XG4gICAgICAucmVjb3JkKHouc3RyaW5nKCksIE9wZW5BcGlNZWRpYVR5cGVTY2hlbWEpXG4gICAgICAub3B0aW9uYWwoKVxuICAgICAgLmRlc2NyaWJlKFwiUmVzcG9uc2UgbWVkaWEgdHlwZXMga2V5ZWQgYnkgY29udGVudCB0eXBlLlwiKSxcbiAgfSlcbiAgLmRlc2NyaWJlKFwiT25lIE9wZW5BUEkgcmVzcG9uc2UuXCIpO1xuXG5jb25zdCBPcGVuQXBpT3BlcmF0aW9uU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBvcGVyYXRpb25JZDogei5zdHJpbmcoKS5kZXNjcmliZShcIlRoZSBzdGFibGUgb3BlcmF0aW9uIGlkZW50aWZpZXIuXCIpLFxuICAgIHN1bW1hcnk6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIlRoZSBzaG9ydCBvcGVyYXRpb24gc3VtbWFyeS5cIiksXG4gICAgZGVzY3JpcHRpb246IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIlRoZSBmdWxsIG9wZXJhdGlvbiBkZXNjcmlwdGlvbi5cIiksXG4gICAgcmVxdWVzdEJvZHk6IE9wZW5BcGlSZXF1ZXN0Qm9keVNjaGVtYS5vcHRpb25hbCgpLmRlc2NyaWJlKFxuICAgICAgXCJUaGUgb3B0aW9uYWwgb3BlcmF0aW9uIHJlcXVlc3QgYm9keS5cIixcbiAgICApLFxuICAgIHJlc3BvbnNlczogelxuICAgICAgLnJlY29yZCh6LnN0cmluZygpLCBPcGVuQXBpUmVzcG9uc2VTY2hlbWEpXG4gICAgICAuZGVzY3JpYmUoXCJPcGVyYXRpb24gcmVzcG9uc2VzIGtleWVkIGJ5IEhUVFAgc3RhdHVzLlwiKSxcbiAgfSlcbiAgLmRlc2NyaWJlKFwiVGhlIE9wZW5BUEkgZmllbGRzIHJlcXVpcmVkIHRvIGRlZmluZSBhIHRvb2wuXCIpO1xuXG5jb25zdCBPcGVuQXBpUGF0aFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgZ2V0OiBPcGVuQXBpT3BlcmF0aW9uU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgcG9zdDogT3BlbkFwaU9wZXJhdGlvblNjaGVtYS5vcHRpb25hbCgpLFxuICAgIHB1dDogT3BlbkFwaU9wZXJhdGlvblNjaGVtYS5vcHRpb25hbCgpLFxuICAgIHBhdGNoOiBPcGVuQXBpT3BlcmF0aW9uU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgZGVsZXRlOiBPcGVuQXBpT3BlcmF0aW9uU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgb3B0aW9uczogT3BlbkFwaU9wZXJhdGlvblNjaGVtYS5vcHRpb25hbCgpLFxuICAgIGhlYWQ6IE9wZW5BcGlPcGVyYXRpb25TY2hlbWEub3B0aW9uYWwoKSxcbiAgICB0cmFjZTogT3BlbkFwaU9wZXJhdGlvblNjaGVtYS5vcHRpb25hbCgpLFxuICB9KVxuICAuZGVzY3JpYmUoXCJPcGVyYXRpb25zIGF2YWlsYWJsZSBhdCBvbmUgT3BlbkFQSSBwYXRoLlwiKTtcblxuY29uc3QgT3BlbkFwaURvY3VtZW50U2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBwYXRoczogelxuICAgICAgLnJlY29yZCh6LnN0cmluZygpLCBPcGVuQXBpUGF0aFNjaGVtYSlcbiAgICAgIC5yZWZpbmUoKHBhdGhzKSA9PiBPYmplY3Qua2V5cyhwYXRocykubGVuZ3RoID4gMCwgXCJPcGVuQVBJIHBhdGhzIG11c3Qgbm90IGJlIGVtcHR5XCIpXG4gICAgICAuZGVzY3JpYmUoXCJPcGVuQVBJIHBhdGggaXRlbXMga2V5ZWQgYnkgVVJMIHBhdGguXCIpLFxuICAgIGNvbXBvbmVudHM6IEpzb25PYmplY3RTY2hlbWEub3B0aW9uYWwoKS5kZXNjcmliZShcIlJldXNhYmxlIE9wZW5BUEkgY29tcG9uZW50cy5cIiksXG4gICAgc2VydmVyczogelxuICAgICAgLmFycmF5KFxuICAgICAgICB6Lm9iamVjdCh7XG4gICAgICAgICAgdXJsOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiU2VydmVyIGJhc2UgVVJMLlwiKSxcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAub3B0aW9uYWwoKVxuICAgICAgLmRlc2NyaWJlKFwiT3BlbkFQSSBzZXJ2ZXIgZGVmaW5pdGlvbnMuXCIpLFxuICB9KVxuICAuZGVzY3JpYmUoXCJBbiBPcGVuQVBJIGRvY3VtZW50IHVzZWQgdG8gZGVmaW5lIEhUVFAgdG9vbHMuXCIpO1xuXG50eXBlIE9wZW5BcGlEb2N1bWVudCA9IHouaW5mZXI8dHlwZW9mIE9wZW5BcGlEb2N1bWVudFNjaGVtYT47XG50eXBlIE9wZW5BcGlPcGVyYXRpb24gPSB6LmluZmVyPHR5cGVvZiBPcGVuQXBpT3BlcmF0aW9uU2NoZW1hPjtcblxuLyoqIEhUVFAgbWV0aG9kIHN1cHBvcnRlZCBieSBhbiB7QGxpbmsgT3BlbkFwaVRvb2x9LiAqL1xuZXhwb3J0IHR5cGUgT3BlbkFwaUh0dHBNZXRob2QgPSAodHlwZW9mIEhUVFBfTUVUSE9EUylbbnVtYmVyXTtcblxuLyoqIE9uZSBleGVjdXRhYmxlIEhUVFAgb3BlcmF0aW9uIGRlcml2ZWQgZnJvbSBhbiBPcGVuQVBJIGRvY3VtZW50LiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuQXBpVG9vbCB7XG4gIC8qKiBTdGFibGUgb3BlcmF0aW9uIGlkZW50aWZpZXIuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBNb2RlbC1mYWNpbmcgb3BlcmF0aW9uIGRlc2NyaXB0aW9uLiAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKiogUmVzb2x2ZWQgb3BlcmF0aW9uIFVSTCwgb3IgdGhlIE9wZW5BUEkgcGF0aCBmb3IgYSBsb2NhbCBkb2N1bWVudCB3aXRob3V0IGEgc2VydmVyIFVSTC4gKi9cbiAgdXJsOiBzdHJpbmc7XG4gIC8qKiBIVFRQIG1ldGhvZCB1c2VkIGJ5IHRoZSBvcGVyYXRpb24uICovXG4gIG1ldGhvZDogT3BlbkFwaUh0dHBNZXRob2Q7XG4gIC8qKiBKU09OIFNjaGVtYSBkZXNjcmliaW5nIG9wZXJhdGlvbiBpbnB1dC4gKi9cbiAgaW5wdXRTY2hlbWE6IEpTT05TY2hlbWE3O1xuICAvKiogSlNPTiBTY2hlbWEgZGVzY3JpYmluZyBhIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uIHJlc3VsdC4gKi9cbiAgb3V0cHV0U2NoZW1hOiBKU09OU2NoZW1hNztcbn1cblxuLyoqIFJlcXVlc3Qgb3B0aW9ucyB1c2VkIHdoaWxlIGxvYWRpbmcgYW4gT3BlbkFQSSBkb2N1bWVudC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkFwaVRvb2xzT3B0aW9ucyB7XG4gIC8qKiBDYW5jZWxzIGFuIEhUVFAgcmVxdWVzdCBvciBmaWxlIHJlYWQuICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAvKiogSGVhZGVycyBzZW50IHdoZW4gYHNvdXJjZWAgaXMgYW4gSFRUUChTKSBVUkwuICovXG4gIGhlYWRlcnM/OiBSZXF1ZXN0SW5pdFtcImhlYWRlcnNcIl07XG59XG5cbi8qKiBMb2FkIGFuIEhUVFAoUykgVVJMIG9yIGxvY2FsIGZpbGUgYW5kIHJldHVybiBpdHMgT3BlbkFQSSBvcGVyYXRpb25zIGFzIHRvb2wgc2NoZW1hcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuQXBpVG9vbHMoXG4gIHNvdXJjZTogc3RyaW5nLFxuICBvcHRpb25zOiBPcGVuQXBpVG9vbHNPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPE9wZW5BcGlUb29sW10+IHtcbiAgY29uc3Qgc291cmNlVXJsID0gaHR0cFVybChzb3VyY2UpO1xuICBjb25zdCBkb2N1bWVudCA9IE9wZW5BcGlEb2N1bWVudFNjaGVtYS5wYXJzZShcbiAgICBzb3VyY2VVcmxcbiAgICAgID8gYXdhaXQgZmV0Y2hEb2N1bWVudChzb3VyY2VVcmwsIG9wdGlvbnMpXG4gICAgICA6IGF3YWl0IHJlYWREb2N1bWVudChzb3VyY2UsIG9wdGlvbnMuc2lnbmFsKSxcbiAgKTtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGRvY3VtZW50LnBhdGhzKS5mbGF0TWFwKChbcGF0aCwgaXRlbV0pID0+XG4gICAgSFRUUF9NRVRIT0RTLmZsYXRNYXAoKG1ldGhvZCkgPT4ge1xuICAgICAgY29uc3Qgb3BlcmF0aW9uID0gaXRlbVttZXRob2QudG9Mb3dlckNhc2UoKSBhcyBMb3dlcmNhc2U8T3BlbkFwaUh0dHBNZXRob2Q+XTtcbiAgICAgIHJldHVybiBvcGVyYXRpb24gPyBbb3BlcmF0aW9uVG9vbChkb2N1bWVudCwgc291cmNlVXJsLCBwYXRoLCBtZXRob2QsIG9wZXJhdGlvbildIDogW107XG4gICAgfSksXG4gICk7XG59XG5cbmZ1bmN0aW9uIGh0dHBVcmwoc291cmNlOiBzdHJpbmcpOiBVcmxCdWlsZGVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdXJsID0gdXJsQnVpbGRlcihzb3VyY2UpO1xuICByZXR1cm4gdXJsPy5zY2hlbWUgPT09IFwiaHR0cFwiIHx8IHVybD8uc2NoZW1lID09PSBcImh0dHBzXCIgPyB1cmwgOiB1bmRlZmluZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoRG9jdW1lbnQodXJsOiBVUkwsIG9wdGlvbnM6IE9wZW5BcGlUb29sc09wdGlvbnMpOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICBzaWduYWw6IG9wdGlvbnMuc2lnbmFsLFxuICAgIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyxcbiAgfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9wZW5BUEkgcmVxdWVzdCBmYWlsZWQgd2l0aCBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHt1cmx9YCk7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZERvY3VtZW50KHBhdGg6IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHVua25vd24+IHtcbiAgcmV0dXJuIEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUocGF0aCwgeyBlbmNvZGluZzogXCJ1dGY4XCIsIHNpZ25hbCB9KSk7XG59XG5cbmZ1bmN0aW9uIG9wZXJhdGlvblRvb2woXG4gIGRvY3VtZW50OiBPcGVuQXBpRG9jdW1lbnQsXG4gIHNvdXJjZVVybDogVVJMIHwgdW5kZWZpbmVkLFxuICBwYXRoOiBzdHJpbmcsXG4gIG1ldGhvZDogT3BlbkFwaUh0dHBNZXRob2QsXG4gIG9wZXJhdGlvbjogT3BlbkFwaU9wZXJhdGlvbixcbik6IE9wZW5BcGlUb29sIHtcbiAgY29uc3QgcmVxdWVzdFNjaGVtYSA9IGpzb25TY2hlbWEob3BlcmF0aW9uLnJlcXVlc3RCb2R5Py5jb250ZW50KSA/PyB7IHR5cGU6IFwib2JqZWN0XCIgfTtcbiAgY29uc3QgcmVzcG9uc2VTY2hlbWEgPSBzdWNjZXNzZnVsUmVzcG9uc2VTY2hlbWEob3BlcmF0aW9uKTtcbiAgcmV0dXJuIHtcbiAgICBpZDogb3BlcmF0aW9uLm9wZXJhdGlvbklkLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgb3BlcmF0aW9uLmRlc2NyaXB0aW9uPy50cmltKCkgfHwgb3BlcmF0aW9uLnN1bW1hcnk/LnRyaW0oKSB8fCBvcGVyYXRpb24ub3BlcmF0aW9uSWQsXG4gICAgdXJsOiBvcGVyYXRpb25VcmwoZG9jdW1lbnQsIHNvdXJjZVVybCwgcGF0aCksXG4gICAgbWV0aG9kLFxuICAgIGlucHV0U2NoZW1hOiByZXNvbHZlUmVmZXJlbmNlcyhkb2N1bWVudCwgcmVxdWVzdFNjaGVtYSkgYXMgSlNPTlNjaGVtYTcsXG4gICAgb3V0cHV0U2NoZW1hOiByZXNvbHZlUmVmZXJlbmNlcyhkb2N1bWVudCwgcmVzcG9uc2VTY2hlbWEpIGFzIEpTT05TY2hlbWE3LFxuICB9O1xufVxuXG5mdW5jdGlvbiBzdWNjZXNzZnVsUmVzcG9uc2VTY2hlbWEob3BlcmF0aW9uOiBPcGVuQXBpT3BlcmF0aW9uKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IFtzdGF0dXMsIHJlc3BvbnNlXSBvZiBPYmplY3QuZW50cmllcyhvcGVyYXRpb24ucmVzcG9uc2VzKSkge1xuICAgIGNvbnN0IHNjaGVtYSA9IGpzb25TY2hlbWEocmVzcG9uc2UuY29udGVudCk7XG4gICAgaWYgKC9eMig/OlxcZHsyfXxYWCkkL2kudGVzdChzdGF0dXMpICYmIHNjaGVtYSkgcmV0dXJuIHNjaGVtYTtcbiAgfVxuICByZXR1cm4ge307XG59XG5cbmZ1bmN0aW9uIGpzb25TY2hlbWEoXG4gIGNvbnRlbnQ6IFJlY29yZDxzdHJpbmcsIHouaW5mZXI8dHlwZW9mIE9wZW5BcGlNZWRpYVR5cGVTY2hlbWE+PiB8IHVuZGVmaW5lZCxcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWVkaWFUeXBlID0gT2JqZWN0LmVudHJpZXMoY29udGVudCA/PyB7fSkuZmluZCgoW3R5cGVdKSA9PlxuICAgIC9eYXBwbGljYXRpb25cXC8oPzpbXis7XStcXCspP2pzb24oPzo7fCQpL2kudGVzdCh0eXBlKSxcbiAgKTtcbiAgcmV0dXJuIG1lZGlhVHlwZT8uWzFdLnNjaGVtYTtcbn1cblxuZnVuY3Rpb24gb3BlcmF0aW9uVXJsKGRvY3VtZW50OiBPcGVuQXBpRG9jdW1lbnQsIHNvdXJjZVVybDogVVJMIHwgdW5kZWZpbmVkLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzZXJ2ZXIgPSBkb2N1bWVudC5zZXJ2ZXJzPy5bMF0/LnVybDtcbiAgaWYgKHNlcnZlcikge1xuICAgIGNvbnN0IGJhc2UgPSBzb3VyY2VVcmwgPyB1cmxCdWlsZGVyKG5ldyBVUkwoc2VydmVyLCBzb3VyY2VVcmwpKSA6IGh0dHBVcmwoc2VydmVyKTtcbiAgICByZXR1cm4gYmFzZVxuICAgICAgPyBiYXNlLndpdGhQYXRoQXBwZW5kKHBhdGgpLnRvU3RyaW5nKClcbiAgICAgIDogYCR7c2VydmVyLnJlcGxhY2UoL1xcLyQvLCBcIlwiKX0vJHtwYXRoLnJlcGxhY2UoL15cXC8vLCBcIlwiKX1gO1xuICB9XG4gIHJldHVybiBzb3VyY2VVcmwgPyB1cmxCdWlsZGVyKHNvdXJjZVVybCk/LndpdGhQYXRoUmVwbGFjZShwYXRoKS50b1N0cmluZygpID8/IHBhdGggOiBwYXRoO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlUmVmZXJlbmNlcyhcbiAgZG9jdW1lbnQ6IE9wZW5BcGlEb2N1bWVudCxcbiAgdmFsdWU6IHVua25vd24sXG4gIGFjdGl2ZTogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKSxcbik6IHVua25vd24ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHJlc29sdmVSZWZlcmVuY2VzKGRvY3VtZW50LCBpdGVtLCBhY3RpdmUpKTtcbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIGNvbnN0IHJlZmVyZW5jZSA9IHR5cGVvZiB2YWx1ZS4kcmVmID09PSBcInN0cmluZ1wiID8gdmFsdWUuJHJlZiA6IHVuZGVmaW5lZDtcbiAgaWYgKHJlZmVyZW5jZSkge1xuICAgIGlmIChhY3RpdmUuaGFzKHJlZmVyZW5jZSkpIHRocm93IG5ldyBFcnJvcihgQ3ljbGljIE9wZW5BUEkgcmVmZXJlbmNlOiAke3JlZmVyZW5jZX1gKTtcbiAgICBjb25zdCB0YXJnZXQgPSByZWZlcmVuY2VUYXJnZXQoZG9jdW1lbnQsIHJlZmVyZW5jZSk7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBTZXQoYWN0aXZlKS5hZGQocmVmZXJlbmNlKTtcbiAgICBjb25zdCB7ICRyZWY6IF9pZ25vcmVkLCAuLi5zaWJsaW5ncyB9ID0gdmFsdWU7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLihyZXNvbHZlUmVmZXJlbmNlcyhkb2N1bWVudCwgdGFyZ2V0LCBuZXh0KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksXG4gICAgICAuLi4ocmVzb2x2ZVJlZmVyZW5jZXMoZG9jdW1lbnQsIHNpYmxpbmdzLCBuZXh0KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksXG4gICAgfTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlKS5tYXAoKFtrZXksIGNoaWxkXSkgPT4gW2tleSwgcmVzb2x2ZVJlZmVyZW5jZXMoZG9jdW1lbnQsIGNoaWxkLCBhY3RpdmUpXSksXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlZmVyZW5jZVRhcmdldChkb2N1bWVudDogT3BlbkFwaURvY3VtZW50LCByZWZlcmVuY2U6IHN0cmluZyk6IHVua25vd24ge1xuICBpZiAoIXJlZmVyZW5jZS5zdGFydHNXaXRoKFwiIy9cIikpIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgT3BlbkFQSSByZWZlcmVuY2U6ICR7cmVmZXJlbmNlfWApO1xuICBsZXQgY3VycmVudDogdW5rbm93biA9IGRvY3VtZW50O1xuICBmb3IgKGNvbnN0IHJhd1NlZ21lbnQgb2YgcmVmZXJlbmNlLnNsaWNlKDIpLnNwbGl0KFwiL1wiKSkge1xuICAgIGNvbnN0IHNlZ21lbnQgPSByYXdTZWdtZW50LnJlcGxhY2VBbGwoXCJ+MVwiLCBcIi9cIikucmVwbGFjZUFsbChcIn4wXCIsIFwiflwiKTtcbiAgICBpZiAoIW9iamVjdC5pc1JlY29yZChjdXJyZW50KSB8fCAhKHNlZ21lbnQgaW4gY3VycmVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZXNvbHZlZCBPcGVuQVBJIHJlZmVyZW5jZTogJHtyZWZlcmVuY2V9YCk7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50W3NlZ21lbnRdO1xuICB9XG4gIHJldHVybiBjdXJyZW50O1xufVxuXG5pZiAoaW1wb3J0Lm1ldGEubWFpbikge1xuICBjb25zdCBzb3VyY2UgPSBwcm9jZXNzLmFyZ3ZbMl07XG4gIGlmICghc291cmNlKSB0aHJvdyBuZXcgRXJyb3IoXCJVc2FnZTogYnVuIG9wZW5hcGktdG9vbC50cyA8b3BlbmFwaS11cmwtb3ItZmlsZT5cIik7XG4gIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGF3YWl0IG9wZW5BcGlUb29scyhzb3VyY2UpLCBudWxsLCAyKSk7XG59XG4iXX0=
package/lib/src/server.js CHANGED
@@ -13,8 +13,8 @@ import { trace } from "@opentelemetry/api";
13
13
  import { attributedUserId, MASTRA_REQUEST_ID_KEY, MASTRA_SCOPES_KEY, MASTRA_USER_EMAIL_KEY, MASTRA_USER_KEY, MASTRA_USER_NAME_KEY, } from "./config.js";
14
14
  import { requestUserEmail, requestUserId } from "./identity.js";
15
15
  import { resolveFeedbackEnabled } from "./mlflow.js";
16
+ import { extractModelOverride, MASTRA_MODEL_OVERRIDE_KEY, MASTRA_RESOLVED_MODEL_KEY, resolveServingConfig, } from "./serving.js";
16
17
  import { recordActiveTraceAuth, recordActiveTraceUser } from "./telemetry.js";
17
- import { extractModelOverride, MASTRA_MODEL_OVERRIDE_KEY, resolveServingConfig, } from "./serving.js";
18
18
  /**
19
19
  * OpenTelemetry's sentinel for "no valid trace" - 32 zero hex chars.
20
20
  * `trace.getActiveSpan()` returns a non-recording span with this id
@@ -31,6 +31,7 @@ const TRUSTED_REQUEST_CONTEXT_KEYS = [
31
31
  MASTRA_REQUEST_ID_KEY,
32
32
  MASTRA_SCOPES_KEY,
33
33
  MASTRA_MODEL_OVERRIDE_KEY,
34
+ MASTRA_RESOLVED_MODEL_KEY,
34
35
  ];
35
36
  /** Remove browser-supplied values for fields owned by trusted server middleware. */
36
37
  export function clearTrustedRequestContext(requestContext) {
@@ -389,4 +390,4 @@ export function attachRoutePatchMiddleware(app) {
389
390
  next();
390
391
  });
391
392
  }
392
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDcEIsY0FBYyxHQUNmLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUFFLFlBQVksSUFBSSxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUczQyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLGVBQWUsRUFDZixvQkFBb0IsR0FHckIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDckQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUUsT0FBTyxFQUNMLG9CQUFvQixFQUNwQix5QkFBeUIsRUFDekIsb0JBQW9CLEdBQ3JCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCOzs7OztHQUtHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLE1BQU0sNEJBQTRCLEdBQUc7SUFDbkMsc0JBQXNCO0lBQ3RCLG9CQUFvQjtJQUNwQixlQUFlO0lBQ2Ysb0JBQW9CO0lBQ3BCLHFCQUFxQjtJQUNyQixxQkFBcUI7SUFDckIsaUJBQWlCO0lBQ2pCLHlCQUF5QjtDQUNqQixDQUFDO0FBRVgsb0ZBQW9GO0FBQ3BGLE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxjQUE4QjtJQUN2RSxLQUFLLE1BQU0sR0FBRyxJQUFJLDRCQUE0QixFQUFFLENBQUM7UUFDL0MsY0FBYyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoQyxDQUFDO0FBQ0gsQ0FBQztBQWlCRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx1QkFBdUIsQ0FDM0MsY0FBOEIsRUFDOUIsYUFBaUMsRUFBRTtJQUVuQyxJQUFJLENBQUMsZUFBZSxFQUFFLHNCQUFzQixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQUUsT0FBTztJQUM5RixNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixFQUFFLENBQUM7SUFDL0MsTUFBTSxhQUFhLEdBQUcsZUFBZSxJQUFJLGdCQUFnQixDQUFDO0lBQzFELDZFQUE2RTtJQUM3RSw0RUFBNEU7SUFDNUUsNkVBQTZFO0lBQzdFLDRFQUE0RTtJQUM1RSw4RUFBOEU7SUFDOUUsTUFBTSxJQUFJLEdBQVM7UUFDakIsRUFBRSxFQUFFLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDekQsZ0JBQWdCO0tBQ2pCLENBQUM7SUFDRixjQUFjLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxQyxjQUFjLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwRCwrREFBK0Q7SUFDL0QsZ0VBQWdFO0lBQ2hFLDJEQUEyRDtJQUMzRCwrREFBK0Q7SUFDL0QsNEVBQTRFO0lBQzVFLHFFQUFxRTtJQUNyRSxJQUFJLFFBQTRCLENBQUM7SUFDakMsSUFBSSxLQUFLLEdBQXVCLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFDakQsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNsQixRQUFRLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO1FBQ3JDLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDO0lBQzlDLENBQUM7U0FBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLGFBQWEsRUFBRSxDQUFDO1FBQ2xELE1BQU0sV0FBVyxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNuRSxRQUFRLEdBQUcsV0FBVyxFQUFFLFFBQVEsQ0FBQztRQUNqQyxLQUFLLEdBQUcsV0FBVyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDeEYsRUFBRSxLQUFlLENBQUM7SUFDdEIsQ0FBQztJQUNELElBQUksUUFBUSxFQUFFLENBQUM7UUFDYixjQUFjLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDRCxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsY0FBYyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxvQkFBb0IsQ0FDeEMsVUFBMEUsRUFBRTtJQUU1RSxNQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO0lBQzVDLE1BQU0sdUJBQXVCLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDOUMsSUFBSSxPQUFPLENBQUMsUUFBUTtRQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pGLDRFQUE0RTtJQUM1RSx5RUFBeUU7SUFDekUsSUFBSSxPQUFPLENBQUMsVUFBVTtRQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZGLGNBQWMsQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsT0FBTyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMxRSxPQUFPLGNBQWMsQ0FBQztBQUN4QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxZQUFhLFNBQVEsbUJBQW1CO0lBU3pDO0lBUkYsR0FBRyxDQUFhO0lBQ3hCOzs7T0FHRztJQUNLLGVBQWUsQ0FBVTtJQUVqQyxZQUNVLE1BQTBCLEVBQ2xDLEdBQUcsSUFBdUQ7UUFFMUQsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFIUCxXQUFNLEdBQU4sTUFBTSxDQUFvQjtRQUlsQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVRLHNCQUFzQjtRQUM3QixLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNwQyxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWlDLENBQUM7WUFDcEUsMEJBQTBCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDM0MsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQywrQkFBK0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUV4RCxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ2hDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtnQkFDbEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO2dCQUNkLFNBQVMsRUFBRSxjQUFjLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDO2dCQUNwRCxRQUFRLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDbEQsVUFBVSxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUM7Z0JBQ3RELFFBQVEsRUFBRSxjQUFjLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDO2dCQUNsRCxTQUFTLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQztnQkFDcEQsYUFBYSxFQUFFLGNBQWMsQ0FBQyxHQUFHO2dCQUMvQixzREFBc0Q7Z0JBQ3RELHlEQUF5RDtnQkFDekQsd0JBQXdCLENBQ3pCO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsMkJBQTJCLENBQUMsR0FBb0IsRUFBRSxjQUE4QjtRQUNwRiw0RUFBNEU7UUFDNUUseUVBQXlFO1FBQ3pFLDBFQUEwRTtRQUMxRSxNQUFNLHVCQUF1QixDQUFDLGNBQWMsRUFBRTtZQUM1QyxNQUFNLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQztZQUMxQixLQUFLLEVBQUUsZ0JBQWdCLENBQUMsR0FBRyxDQUFDO1NBQzdCLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFxQixDQUFDO1FBQ3JFLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxxQkFBcUIsQ0FDbkIsZUFBZSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FDdkUsQ0FBQztRQUNKLENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRztZQUNoQixjQUFjLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDO1lBQ3pDLGNBQWMsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUM7WUFDeEMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQztTQUMzQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBbUIsRUFBRSxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsZ0NBQWdDLENBQzlCLEdBQW9CLEVBQ3BCLEdBQXFCLEVBQ3JCLGNBQThCO1FBRTlCLElBQUksY0FBYyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQztZQUFFLE9BQU87UUFDdEQsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNoRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztRQUMzRSxNQUFNLFNBQVMsR0FBRyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2hELGNBQWMsQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDckQsR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7T0FHRztJQUNILDZCQUE2QixDQUFDLEdBQW9CLEVBQUUsY0FBOEI7UUFDaEYsTUFBTSxNQUFNLEdBQUc7WUFDYixHQUFHLE1BQU07aUJBQ04sUUFBUSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFDO2lCQUMzRixRQUFRLEVBQUU7U0FDZCxDQUFDO1FBQ0YsY0FBYyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsc0JBQXNCLENBQUMsR0FBcUI7UUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksR0FBRyxDQUFDLFdBQVc7WUFBRSxPQUFPO1FBQ3JELElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUM7WUFBRSxPQUFPO1FBQzNELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxhQUFhLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUM7UUFDN0QsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLEtBQUssZ0JBQWdCO1lBQUUsT0FBTztRQUNyRCxHQUFHLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxNQUFNLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7OztPQWlCRztJQUNILCtCQUErQixDQUM3QixHQUFvQixFQUNwQixHQUFxQixFQUNyQixjQUE4QjtRQUU5QixJQUFJLGNBQWMsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUM7WUFBRSxPQUFPO1FBQ3JELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRCxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsY0FBYyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNwRCxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0RCxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsdUJBQXVCLENBQ3BELEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQ2xDLFFBQVEsRUFDUixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUssRUFDakIsV0FBVyxDQUNaLENBQUM7UUFDRixJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsU0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN0QixHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUU7Z0JBQ2hDLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFFBQVEsRUFBRSxLQUFLO2dCQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtnQkFDbEIsSUFBSSxFQUFFLEdBQUc7YUFDVixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsY0FBYyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxxQkFBcUIsQ0FBQyxHQUFvQjtRQUNoRCxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sQ0FDTCxXQUFXLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1lBQ2pGLFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FDL0UsQ0FBQztJQUNKLENBQUM7SUFFRCxvQ0FBb0MsQ0FBQyxHQUFvQixFQUFFLGNBQThCO1FBQ3ZGLDJEQUEyRDtRQUMzRCxxREFBcUQ7UUFDckQsMERBQTBEO1FBQzFELDBDQUEwQztRQUMxQyxNQUFNLE9BQU8sR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEQsSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDMUIsTUFBTSxRQUFRLEdBQUcsb0JBQW9CLENBQUM7Z0JBQ3BDLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBd0Q7Z0JBQ3JFLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBZ0M7Z0JBQzNDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTthQUNmLENBQUMsQ0FBQztZQUNILElBQUksUUFBUTtnQkFBRSxjQUFjLENBQUMsR0FBRyxDQUFDLHlCQUF5QixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFVRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sZUFBZSxHQUNuQixvSkFBb0osQ0FBQztBQUV2SiwwRUFBMEU7QUFDMUUsTUFBTSxjQUFjLEdBQUcsc0JBQXNCLENBQUM7QUFDOUMsa0RBQWtEO0FBQ2xELE1BQU0sb0JBQW9CLEdBQUcsb0NBQW9DLENBQUM7QUFDbEUsNkVBQTZFO0FBQzdFLE1BQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFDO0FBQ3RDLCtFQUErRTtBQUMvRSxNQUFNLFdBQVcsR0FBRyxpREFBaUQsQ0FBQztBQUN0RSwwQ0FBMEM7QUFDMUMsTUFBTSxzQkFBc0IsR0FBRyw2QkFBNkIsQ0FBQztBQUU3RDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxNQUFjLEVBQ2QsSUFBWSxFQUNaLElBQTBCO0lBRTFCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxNQUFNO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDeEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ25ELDBFQUEwRTtJQUMxRSwyREFBMkQ7SUFDM0QsSUFBSSxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0QsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxLQUFLLE1BQU0sSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDNUUsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQy9CLElBQUksQ0FBQyxLQUFLLE1BQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3BELElBQUksQ0FBQyxLQUFLLE1BQU0sSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3pELElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDekYsSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDcEQsSUFBSSxDQUFDLENBQUMsS0FBSyxPQUFPLElBQUksQ0FBQyxLQUFLLFFBQVEsQ0FBQyxJQUFJLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNyRixJQUFJLENBQUMsS0FBSyxNQUFNLElBQUksQ0FBQyxLQUFLLHlCQUF5QjtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ2pFLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxHQUFvQjtJQUM3RCxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUMxQixNQUFNLGFBQWEsR0FDakIsR0FBRyxDQUFDLElBQUksS0FBSyxPQUFPO1lBQ3BCLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUM3QixHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVE7WUFDckIsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLGFBQWE7WUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ2xDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztRQUMzQixJQUFJLEVBQUUsQ0FBQztJQUNULENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRXhwcmVzcy1sYXllciBwbHVtYmluZyBmb3IgdGhlIE1hc3RyYSBwbHVnaW46IGEgYE1hc3RyYVNlcnZlcmAgdGhhdFxuICogc3RhbXBzIHRoZSBwZXItcmVxdWVzdCBgUmVxdWVzdENvbnRleHRgIGFuZCBhIHNjb3BlZCBuYXRpdmUgQVBJIGdhdGUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGdldEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBoYXNoLCBodHRwLCBsb2csIG9iamVjdCwgc3RyaW5nVXRpbHMsIHRva2VuIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGZlZWRiYWNrLCB0aHJlYWQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQge1xuICBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLFxuICBNQVNUUkFfVEhSRUFEX0lEX0tFWSxcbiAgUmVxdWVzdENvbnRleHQsXG59IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBNYXN0cmFTZXJ2ZXIgYXMgRXhwcmVzc01hc3RyYVNlcnZlciB9IGZyb20gXCJAbWFzdHJhL2V4cHJlc3NcIjtcbmltcG9ydCB7IHRyYWNlIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuaW1wb3J0IHR5cGUgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuXG5pbXBvcnQge1xuICBhdHRyaWJ1dGVkVXNlcklkLFxuICBNQVNUUkFfUkVRVUVTVF9JRF9LRVksXG4gIE1BU1RSQV9TQ09QRVNfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIE1BU1RSQV9VU0VSX0tFWSxcbiAgTUFTVFJBX1VTRVJfTkFNRV9LRVksXG4gIHR5cGUgTWFzdHJhUGx1Z2luQ29uZmlnLFxuICB0eXBlIFVzZXIsXG59IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgcmVxdWVzdFVzZXJFbWFpbCwgcmVxdWVzdFVzZXJJZCB9IGZyb20gXCIuL2lkZW50aXR5LnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlRmVlZGJhY2tFbmFibGVkIH0gZnJvbSBcIi4vbWxmbG93LnRzXCI7XG5pbXBvcnQgeyByZWNvcmRBY3RpdmVUcmFjZUF1dGgsIHJlY29yZEFjdGl2ZVRyYWNlVXNlciB9IGZyb20gXCIuL3RlbGVtZXRyeS50c1wiO1xuXG5pbXBvcnQge1xuICBleHRyYWN0TW9kZWxPdmVycmlkZSxcbiAgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSxcbiAgcmVzb2x2ZVNlcnZpbmdDb25maWcsXG59IGZyb20gXCIuL3NlcnZpbmcudHNcIjtcbi8qKlxuICogT3BlblRlbGVtZXRyeSdzIHNlbnRpbmVsIGZvciBcIm5vIHZhbGlkIHRyYWNlXCIgLSAzMiB6ZXJvIGhleCBjaGFycy5cbiAqIGB0cmFjZS5nZXRBY3RpdmVTcGFuKClgIHJldHVybnMgYSBub24tcmVjb3JkaW5nIHNwYW4gd2l0aCB0aGlzIGlkXG4gKiB3aGVuIG5vIFNESyBpcyByZWdpc3RlcmVkLCB3aGljaCBtdXN0IG5ldmVyIGJlIHN1cmZhY2VkIGFzIGEgdHJhY2UgdG9cbiAqIGF0dGFjaCBmZWVkYmFjayB0by5cbiAqL1xuY29uc3QgSU5WQUxJRF9UUkFDRV9JRCA9IFwiMFwiLnJlcGVhdCgzMik7XG5jb25zdCBUUlVTVEVEX1JFUVVFU1RfQ09OVEVYVF9LRVlTID0gW1xuICBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLFxuICBNQVNUUkFfVEhSRUFEX0lEX0tFWSxcbiAgTUFTVFJBX1VTRVJfS0VZLFxuICBNQVNUUkFfVVNFUl9OQU1FX0tFWSxcbiAgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLFxuICBNQVNUUkFfUkVRVUVTVF9JRF9LRVksXG4gIE1BU1RSQV9TQ09QRVNfS0VZLFxuICBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZLFxuXSBhcyBjb25zdDtcblxuLyoqIFJlbW92ZSBicm93c2VyLXN1cHBsaWVkIHZhbHVlcyBmb3IgZmllbGRzIG93bmVkIGJ5IHRydXN0ZWQgc2VydmVyIG1pZGRsZXdhcmUuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJUcnVzdGVkUmVxdWVzdENvbnRleHQocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIFRSVVNURURfUkVRVUVTVF9DT05URVhUX0tFWVMpIHtcbiAgICByZXF1ZXN0Q29udGV4dC5kZWxldGVSYXcoa2V5KTtcbiAgfVxufVxuXG4vKipcbiAqIFdobyBhIHR1cm4gaXMgQVRUUklCVVRFRCB0bywgaW5kZXBlbmRlbnQgb2Ygd2hpY2ggRGF0YWJyaWNrcyBjcmVkZW50aWFsIHJ1bnNcbiAqIGl0cyBjYWxscy4gU3VwcGxpZWQgYnkgdGhlIEhUVFAgbWlkZGxld2FyZSBmcm9tIHRoZSBmb3J3YXJkZWQgdXNlciBoZWFkZXJzIHNvXG4gKiB0aGF0IGluIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSAtIHdoZXJlIGV2ZXJ5IHJlcXVlc3Qgc2hhcmVzIHRoZSBhcHAgU1Anc1xuICogY2xpZW50IC0gdGhlIG1lbW9yeSB0aHJlYWQsIHBlci11c2VyIGNhY2hlIG5hbWVzcGFjZSwgYW5kIHRyYWNlIG1ldGFkYXRhXG4gKiBzdGlsbCBrZXkgb2ZmIHRoZSByZWFsIGNhbGxlci4gSWdub3JlZCBpbiBhbiBPQk8gKHVzZXIpIGNvbnRleHQsIHdob3NlIG93blxuICogdXNlciBpZCAvIGVtYWlsIGFyZSBhdXRob3JpdGF0aXZlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJpYnV0ZWRJZGVudGl0eSB7XG4gIC8qKiBGb3J3YXJkZWQgYHgtZm9yd2FyZGVkLXVzZXJgIGlkLCB1c2VkIHdoZW4gdGhlIGNsaWVudCBpcyB0aGUgc2VydmljZSBwcmluY2lwYWwuICovXG4gIHVzZXJJZD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIEZvcndhcmRlZCBgeC1mb3J3YXJkZWQtZW1haWxgLCB1c2VkIGZvciB0cmFjZSBtZXRhZGF0YSB1bmRlciB0aGUgc2VydmljZSBwcmluY2lwYWwuICovXG4gIGVtYWlsPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFN0YW1wIHRoZSBBcHBLaXQgdXNlciAocGx1cyB0aGUgcmVzb3VyY2UgaWQgYW5kIHRyYWNlIG1ldGFkYXRhKSBvbnRvXG4gKiBgcmVxdWVzdENvbnRleHRgLlxuICpcbiAqIFNwbGl0IG91dCBvZiB7QGxpbmsgTWFzdHJhU2VydmVyfSBiZWNhdXNlIHRoZSBIVFRQIG1pZGRsZXdhcmUgaXMgbm90IHRoZSBvbmx5XG4gKiBjYWxsZXIgdGhhdCBuZWVkcyBpdDogYW4gb3V0LW9mLWJhbmQgdHVybiAoYSBUZWFtcyBhY3Rpdml0eSBhcnJpdmluZyBvblxuICogYW5vdGhlciBwbHVnaW4ncyByb3V0ZSwgYSBzY2hlZHVsZWQgam9iKSBkcml2ZXMgYGFnZW50LmdlbmVyYXRlYCBkaXJlY3RseSwgYW5kXG4gKiB3aXRob3V0IHRoaXMgc3RhbXAgZXZlcnkgdXNlci1zY29wZWQgdG9vbCAtIGBhc2tfZ2VuaWVgIGFib3ZlIGFsbCAtIGZhaWxzIHdpdGhcbiAqIFwiaW52b2tlIHRoZSB0b29sIGZyb20gYW4gYWdlbnQgdHVybiBzZXJ2ZWQgYnkgdGhlIG1hc3RyYSBwbHVnaW5cIi4gVGhvc2VcbiAqIGNhbGxlcnMgYnVpbGQgYSBjb250ZXh0IHdpdGgge0BsaW5rIGNyZWF0ZVJlcXVlc3RDb250ZXh0fSBpbnN0ZWFkIG9mIGFcbiAqIHJlcXVlc3QuXG4gKlxuICogVGhlIERhdGFicmlja3MgY3JlZGVudGlhbCBhbHdheXMgY29tZXMgZnJvbSB0aGUgYW1iaWVudCBleGVjdXRpb24gY29udGV4dDtcbiAqIGBhdHRyaWJ1dGVkYCBvbmx5IGNoYW5nZXMgV0hPIHRoZSB0dXJuIGlzIGF0dHJpYnV0ZWQgdG8gd2hlbiB0aGF0IGNvbnRleHQgaXNcbiAqIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCAoc2VlIHtAbGluayBBdHRyaWJ1dGVkSWRlbnRpdHl9KS5cbiAqXG4gKiBJZGVtcG90ZW50OiByZXR1cm5zIGltbWVkaWF0ZWx5IHdoZW4gdGhlIHVzZXIgYW5kIHJlc291cmNlIGlkIGFyZSBhbHJlYWR5XG4gKiBwcmVzZW50LCBzbyB0aGUgbWlkZGxld2FyZSBjYW4gY2FsbCBpdCBvdmVyIGEgY29udGV4dCBhbm90aGVyIGxheWVyIHN0YW1wZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcihcbiAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICBhdHRyaWJ1dGVkOiBBdHRyaWJ1dGVkSWRlbnRpdHkgPSB7fSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoW01BU1RSQV9VU0VSX0tFWSwgTUFTVFJBX1JFU09VUkNFX0lEX0tFWV0uZXZlcnkoKGtleSkgPT4gcmVxdWVzdENvbnRleHQuZ2V0KGtleSkpKSByZXR1cm47XG4gIGNvbnN0IGV4ZWN1dGlvbkNvbnRleHQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gIGNvbnN0IGlzVXNlckNvbnRleHQgPSBcImlzVXNlckNvbnRleHRcIiBpbiBleGVjdXRpb25Db250ZXh0O1xuICAvLyBUaGUgRGF0YWJyaWNrcyBDUkVERU5USUFMIGlzIGFsd2F5cyB0aGUgYW1iaWVudCBleGVjdXRpb24gY29udGV4dCdzIGNsaWVudFxuICAvLyAoT0JPIGluIGEgdXNlciBjb250ZXh0LCB0aGUgc2VydmljZSBwcmluY2lwYWwgb3RoZXJ3aXNlKS4gV0hPIHRoZSB0dXJuIGlzXG4gIC8vIGF0dHJpYnV0ZWQgdG8gY2FuIGRpZmZlcjogaW4gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIGV2ZXJ5IHJlcXVlc3Qgc2hhcmVzXG4gIC8vIHRoZSBTUCBjbGllbnQsIGJ1dCB0aGUgZm9yd2FyZGVkIHVzZXIgaWQgbXVzdCBzdGlsbCBrZXkgdGhlIG1lbW9yeSB0aHJlYWRcbiAgLy8gYW5kIHRoZSBwZXItdXNlciBjYWNoZSBuYW1lc3BhY2Ugc28gdHdvIGNhbGxlcnMgZG9uJ3Qgc2hhcmUgYSBjb252ZXJzYXRpb24uXG4gIGNvbnN0IHVzZXI6IFVzZXIgPSB7XG4gICAgaWQ6IGF0dHJpYnV0ZWRVc2VySWQoZXhlY3V0aW9uQ29udGV4dCwgYXR0cmlidXRlZC51c2VySWQpLFxuICAgIGV4ZWN1dGlvbkNvbnRleHQsXG4gIH07XG4gIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVVNFUl9LRVksIHVzZXIpO1xuICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1JFU09VUkNFX0lEX0tFWSwgdXNlci5pZCk7XG4gIC8vIEFwcEtpdCdzIGBVc2VyQ29udGV4dGAgc3VyZmFjZXMgZGlzcGxheSBuYW1lIC8gZW1haWwgb25seSBvblxuICAvLyBPQk8gcmVxdWVzdHMuIFNlcnZpY2UtY29udGV4dCBjYWxscyAoYmFja2dyb3VuZCB0YXNrcywgc2VydmVyXG4gIC8vIHN0YXJ0LXVwKSBsZWF2ZSB0aGVzZSB1bmRlZmluZWQgYW5kIHdlIHNraXAgdGhlIHN0YW1wIHNvXG4gIC8vIGRvd25zdHJlYW0gdHJhY2UgbWV0YWRhdGEgc3RheXMgYWJzZW50IHJhdGhlciB0aGFuIGVtcHR5LiBJblxuICAvLyBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgdGhlIGZvcndhcmRlZCBlbWFpbCBzdGlsbCBpZGVudGlmaWVzIHRoZSBjYWxsZXIsXG4gIC8vIHNvIGl0IGlzIHVzZWQgZm9yIHRyYWNlIG1ldGFkYXRhIGV2ZW4gdGhvdWdoIHRoZSBjbGllbnQgaXMgdGhlIFNQLlxuICBsZXQgdXNlck5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IGVtYWlsOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBhdHRyaWJ1dGVkLmVtYWlsO1xuICBpZiAoaXNVc2VyQ29udGV4dCkge1xuICAgIHVzZXJOYW1lID0gZXhlY3V0aW9uQ29udGV4dC51c2VyTmFtZTtcbiAgICBlbWFpbCA9IGV4ZWN1dGlvbkNvbnRleHQudXNlckVtYWlsID8/IGVtYWlsO1xuICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IGF3YWl0IGV4ZWN1dGlvbkNvbnRleHQuY2xpZW50LmN1cnJlbnRVc2VyLm1lKCk7XG4gICAgdXNlck5hbWUgPSBjdXJyZW50VXNlcj8udXNlck5hbWU7XG4gICAgZW1haWwgPSBjdXJyZW50VXNlcj8uZW1haWxzPy5maWx0ZXIoKGVtYWlsKSA9PiBlbWFpbC5wcmltYXJ5KS5maW5kKChlbWFpbCkgPT4gZW1haWwudmFsdWUpXG4gICAgICA/LnZhbHVlIGFzIHN0cmluZztcbiAgfVxuICBpZiAodXNlck5hbWUpIHtcbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1VTRVJfTkFNRV9LRVksIHVzZXJOYW1lKTtcbiAgfVxuICBpZiAoZW1haWwpIHtcbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1VTRVJfRU1BSUxfS0VZLCBlbWFpbCk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgYFJlcXVlc3RDb250ZXh0YCBhIE5PTi1IVFRQIGFnZW50IHR1cm4gbmVlZHMuXG4gKlxuICogRXZlcnl0aGluZyBNYXN0cmEncyB0b29scyByZWFkIG9mZiB0aGUgY29udGV4dCBpcyBzdGFtcGVkIHRoZSBzYW1lIHdheSB0aGVcbiAqIHJlcXVlc3QgbWlkZGxld2FyZSBzdGFtcHMgaXQgLSB0aGUgQXBwS2l0IHVzZXIgKHNvIGBhc2tfZ2VuaWVgIGFuZCB0aGUgbW9kZWxcbiAqIHJlc29sdmVyIGNhbiBtaW50IHVzZXItc2NvcGVkIHRva2VucyksIHRoZSBtZW1vcnkgdGhyZWFkIC8gcmVzb3VyY2UgcGFpciwgYW5kXG4gKiBhIHJlcXVlc3QgaWQgc28gdGhlIHR1cm4ncyBzcGFucyBqb2luIHVwIGluIHRyYWNlcy4gVGhlIHJlc3VsdCBpcyBwYXNzZWQgYXNcbiAqIGByZXF1ZXN0Q29udGV4dGAgdG8gYGFnZW50LmdlbmVyYXRlYCAvIGBhZ2VudC5zdHJlYW1gLlxuICpcbiAqIFRoaXMgaXMgd2hhdCBtYWtlcyBhIGNhcmQgdHVybiBhbnN3ZXIgd2l0aCB0aGUgU0FNRSBkYXRhIGEgY2hhdCB0dXJuIGRvZXM6IHRoZVxuICogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gZW5kcG9pbnRzIGlzIHByZXNlbnRhdGlvbiwgbm90IGNhcGFiaWxpdHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVSZXF1ZXN0Q29udGV4dChcbiAgb3B0aW9uczogeyB0aHJlYWRJZD86IHN0cmluZzsgcmVzb3VyY2VJZD86IHN0cmluZzsgcmVxdWVzdElkPzogc3RyaW5nIH0gPSB7fSxcbik6IFByb21pc2U8UmVxdWVzdENvbnRleHQ+IHtcbiAgY29uc3QgcmVxdWVzdENvbnRleHQgPSBuZXcgUmVxdWVzdENvbnRleHQoKTtcbiAgYXdhaXQgc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXIocmVxdWVzdENvbnRleHQpO1xuICBpZiAob3B0aW9ucy50aHJlYWRJZCkgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9USFJFQURfSURfS0VZLCBvcHRpb25zLnRocmVhZElkKTtcbiAgLy8gU3RhbXBlZCBBRlRFUiB0aGUgdXNlciBzbyBhbiBleHBsaWNpdCByZXNvdXJjZSBpZCAoYSBjaGFubmVsIG1lbWJlciwgc2F5KVxuICAvLyB3aW5zIG92ZXIgdGhlIGFtYmllbnQgaWRlbnRpdHkgYHN0YW1wUmVxdWVzdENvbnRleHRVc2VyYCBkZWZhdWx0ZWQgdG8uXG4gIGlmIChvcHRpb25zLnJlc291cmNlSWQpIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLCBvcHRpb25zLnJlc291cmNlSWQpO1xuICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1JFUVVFU1RfSURfS0VZLCBvcHRpb25zLnJlcXVlc3RJZCA/PyBoYXNoLmlkKCkpO1xuICByZXR1cm4gcmVxdWVzdENvbnRleHQ7XG59XG5cbi8qKlxuICogYEBtYXN0cmEvZXhwcmVzc2Agc3ViY2xhc3MgdGhhdCBzdGFtcHMgYFJlcXVlc3RDb250ZXh0YCB3aXRoIHRoZVxuICogQXBwS2l0IHVzZXIsIHJlc291cmNlIGlkLCBhbmQgYSB0aHJlYWQgaWQgYmFja2VkIGJ5IGFuIEhUVFAtb25seVxuICogc2Vzc2lvbiBjb29raWUgKGBhcHBraXRfPHBsdWdpbi1uYW1lPl9zZXNzaW9uX2lkYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYXN0cmFTZXJ2ZXIgZXh0ZW5kcyBFeHByZXNzTWFzdHJhU2VydmVyIHtcbiAgcHJpdmF0ZSBsb2c6IGxvZy5Mb2dnZXI7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHN0YW1wIHRoZSBNTGZsb3cgdHJhY2UtaWQgaGVhZGVyIG9uIHJlc3BvbnNlcy4gU2hhcmVzIHRoZVxuICAgKiBwbHVnaW4ncyBmZWVkYmFjayBnYXRlIHZpYSB7QGxpbmsgcmVzb2x2ZUZlZWRiYWNrRW5hYmxlZH0uXG4gICAqL1xuICBwcml2YXRlIGZlZWRiYWNrRW5hYmxlZDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICAgIC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgRXhwcmVzc01hc3RyYVNlcnZlcj5cbiAgKSB7XG4gICAgc3VwZXIoLi4uYXJncyk7XG4gICAgdGhpcy5sb2cgPSBsb2cubG9nZ2VyKGNvbmZpZyk7XG4gICAgdGhpcy5mZWVkYmFja0VuYWJsZWQgPSByZXNvbHZlRmVlZGJhY2tFbmFibGVkKGNvbmZpZy5mZWVkYmFjayk7XG4gIH1cblxuICBvdmVycmlkZSByZWdpc3RlckF1dGhNaWRkbGV3YXJlKCk6IHZvaWQge1xuICAgIHN1cGVyLnJlZ2lzdGVyQXV0aE1pZGRsZXdhcmUoKTtcbiAgICB0aGlzLmFwcC51c2UoYXN5bmMgKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IHJlcy5sb2NhbHMucmVxdWVzdENvbnRleHQhIGFzIFJlcXVlc3RDb250ZXh0O1xuICAgICAgY2xlYXJUcnVzdGVkUmVxdWVzdENvbnRleHQocmVxdWVzdENvbnRleHQpO1xuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dFVzZXIocmVxLCByZXF1ZXN0Q29udGV4dCk7XG4gICAgICB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VGhyZWFkSWQocmVxLCByZXMsIHJlcXVlc3RDb250ZXh0KTtcbiAgICAgIHRoaXMuY29uZmlndXJlUmVxdWVzdENvbnRleHRNb2RlbE92ZXJyaWRlKHJlcSwgcmVxdWVzdENvbnRleHQpO1xuICAgICAgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dFJlcXVlc3RJZChyZXEsIHJlcywgcmVxdWVzdENvbnRleHQpO1xuICAgICAgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dFNjb3BlcyhyZXEsIHJlcXVlc3RDb250ZXh0KTtcblxuICAgICAgdGhpcy5jb25maWd1cmVNbGZsb3dUcmFjZUlkKHJlcyk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcImF1dGg6bWlkZGxld2FyZVwiLCB7XG4gICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCxcbiAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgIHJlcXVlc3RJZDogcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9SRVFVRVNUX0lEX0tFWSksXG4gICAgICAgIHRocmVhZElkOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVkpLFxuICAgICAgICByZXNvdXJjZUlkOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1JFU09VUkNFX0lEX0tFWSksXG4gICAgICAgIHVzZXJOYW1lOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfTkFNRV9LRVkpLFxuICAgICAgICB1c2VyRW1haWw6IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9FTUFJTF9LRVkpLFxuICAgICAgICBtb2RlbE92ZXJyaWRlOiByZXF1ZXN0Q29udGV4dC5nZXQoXG4gICAgICAgICAgLy8gaW1wb3J0ZWQgYmVsb3c7IGxvZ2dlZCBzbyBhIG1pc3JvdXRlZCByZXF1ZXN0IHNob3dzXG4gICAgICAgICAgLy8gdXAgYWxvbmdzaWRlIGl0cyBtb2RlbCBzZWxlY3Rpb24gaW4gYExPR19MRVZFTD1kZWJ1Z2AuXG4gICAgICAgICAgXCJtYXN0cmFfX21vZGVsX292ZXJyaWRlXCIsXG4gICAgICAgICksXG4gICAgICB9KTtcbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VXNlcihyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KSB7XG4gICAgLy8gUGFzcyB0aGUgZm9yd2FyZGVkIGNhbGxlciBpZGVudGl0eSBzbyBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgc3RpbGwga2V5c1xuICAgIC8vIG1lbW9yeSAvIGNhY2hlIC8gdHJhY2VzIHBlciB1c2VyIGV2ZW4gdGhvdWdoIHRoZSBjbGllbnQgaXMgdGhlIGFwcCBTUC5cbiAgICAvLyBJbiBhbiBPQk8gY29udGV4dCB0aGVzZSBhcmUgaWdub3JlZCBpbiBmYXZvciBvZiB0aGUgY29udGV4dCdzIG93biB1c2VyLlxuICAgIGF3YWl0IHN0YW1wUmVxdWVzdENvbnRleHRVc2VyKHJlcXVlc3RDb250ZXh0LCB7XG4gICAgICB1c2VySWQ6IHJlcXVlc3RVc2VySWQocmVxKSxcbiAgICAgIGVtYWlsOiByZXF1ZXN0VXNlckVtYWlsKHJlcSksXG4gICAgfSk7XG4gICAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9LRVkpIGFzIFVzZXIgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHVzZXIpIHtcbiAgICAgIHJlY29yZEFjdGl2ZVRyYWNlQXV0aChcbiAgICAgICAgXCJpc1VzZXJDb250ZXh0XCIgaW4gdXNlci5leGVjdXRpb25Db250ZXh0ID8gXCJvYm9cIiA6IFwic2VydmljZS1wcmluY2lwYWxcIixcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHRyYWNlVXNlciA9IFtcbiAgICAgIHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9FTUFJTF9LRVkpLFxuICAgICAgcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX05BTUVfS0VZKSxcbiAgICAgIHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKSxcbiAgICBdLmZpbmQoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCk7XG4gICAgcmVjb3JkQWN0aXZlVHJhY2VVc2VyKHRyYWNlVXNlcik7XG4gIH1cblxuICAvKipcbiAgICogU3RhbXAgYSBwZXItcmVxdWVzdCBpZCBhbmQgZWNobyBpdCBvbiB0aGUgcmVzcG9uc2Ugc28gYW4gdXBzdHJlYW1cbiAgICogcHJveHkgLyBjdXJsIGNsaWVudCAvIGJyb3dzZXItc2lkZSBsb2cgbGluZSBjYW4gcGFpciBpdHMgdmlldyBvZlxuICAgKiB0aGUgcmVxdWVzdCB3aXRoIHRoZSBtYXRjaGluZyB0cmFjZSBzcGFuLiBSZXVzZXMgYFgtUmVxdWVzdC1JZGBcbiAgICogd2hlbiB0aGUgdXBzdHJlYW0gYWxyZWFkeSBzdXBwbGllcyBvbmUgc28gbXVsdGktaG9wIHRyYWNlcyBzdGF5XG4gICAqIGpvaW5lZDsgb3RoZXJ3aXNlIG1pbnRzIGEgVVVJRHY0LlxuICAgKlxuICAgKiBUaGUgaWQgaXMgc3VyZmFjZWQgYXMgYG1hc3RyYV9fcmVxdWVzdElkYCBzcGFuIG1ldGFkYXRhIHZpYVxuICAgKiB7QGxpbmsgVFJBQ0VfUkVRVUVTVF9DT05URVhUX0tFWVN9IGFuZCBhcyB0aGUgYFgtUmVxdWVzdC1JZGBcbiAgICogcmVzcG9uc2UgaGVhZGVyIHNvIGRldiB0b29scyBjYW4gY29weSBpdCBmcm9tIGVpdGhlciBzaWRlLlxuICAgKi9cbiAgY29uZmlndXJlUmVxdWVzdENvbnRleHRSZXF1ZXN0SWQoXG4gICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICAgIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCxcbiAgKSB7XG4gICAgaWYgKHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfUkVRVUVTVF9JRF9LRVkpKSByZXR1cm47XG4gICAgY29uc3QgaGVhZGVyVmFsdWUgPSByZXEuaGVhZGVyc1tcIngtcmVxdWVzdC1pZFwiXTtcbiAgICBjb25zdCB1cHN0cmVhbSA9IEFycmF5LmlzQXJyYXkoaGVhZGVyVmFsdWUpID8gaGVhZGVyVmFsdWVbMF0gOiBoZWFkZXJWYWx1ZTtcbiAgICBjb25zdCByZXF1ZXN0SWQgPSB1cHN0cmVhbT8udHJpbSgpIHx8IGhhc2guaWQoKTtcbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1JFUVVFU1RfSURfS0VZLCByZXF1ZXN0SWQpO1xuICAgIHJlcy5zZXRIZWFkZXIoXCJYLVJlcXVlc3QtSWRcIiwgcmVxdWVzdElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFtcCBPQXV0aCBzY29wZXMgZnJvbSB0aGUgZm9yd2FyZGVkIGFjY2VzcyB0b2tlbiBvblxuICAgKiB7QGxpbmsgTUFTVFJBX1NDT1BFU19LRVl9IGZvciB3b3Jrc3BhY2UgbW91bnQgZ2F0aW5nLlxuICAgKi9cbiAgY29uZmlndXJlUmVxdWVzdENvbnRleHRTY29wZXMocmVxOiBleHByZXNzLlJlcXVlc3QsIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCkge1xuICAgIGNvbnN0IHNjb3BlcyA9IFtcbiAgICAgIC4uLm9iamVjdFxuICAgICAgICAuc2VxdWVuY2UodG9rZW4uZ2V0QWNjZXNzVG9rZW5TY29wZXMocmVxKSwgdG9rZW4uZ2V0QWNjZXNzVG9rZW5TY29wZXMocmVxLCBcImF1dGhvcml6YXRpb25cIikpXG4gICAgICAgIC5kaXN0aW5jdCgpLFxuICAgIF07XG4gICAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9TQ09QRVNfS0VZLCBzY29wZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YW1wIHRoZSB0dXJuJ3MgTUxmbG93IHRyYWNlIGlkIG9uIHRoZSByZXNwb25zZSBzbyB0aGUgY2hhdCBjbGllbnRcbiAgICogY2FuIGF0dGFjaCB0aHVtYnMgLyBjb21tZW50IGZlZWRiYWNrIHRvIGl0IGxhdGVyLiBNTGZsb3cgZGVyaXZlc1xuICAgKiBpdHMgdHJhY2UgaWQgZnJvbSB0aGUgT3BlblRlbGVtZXRyeSB0cmFjZSBpZCAoYHRyLTxoZXg+YCksIGFuZCBldmVyeVxuICAgKiBNYXN0cmEgc3BhbiBmb3IgdGhpcyByZXF1ZXN0IGluaGVyaXRzIHRoZSBhbWJpZW50IE9UZWwgY29udGV4dCAoc2VlXG4gICAqIGBvYnNlcnZhYmlsaXR5LnRzYCksIHNvIHRoZSBhY3RpdmUgc3BhbidzIHRyYWNlIGlkIGhlcmUgaXMgdGhlIGlkXG4gICAqIE1MZmxvdyB3aWxsIHJlY29yZCBmb3IgdGhlIHR1cm4uXG4gICAqXG4gICAqIE5vLW9wIHVubGVzcyBmZWVkYmFjayBpcyBlbmFibGVkLCBhbmQgd2hlbiBubyBsaXZlIE9UZWwgc3BhbiBpc1xuICAgKiBhY3RpdmUgKGUuZy4gdGhlIE9UTFAgU0RLIGlzbid0IHJlZ2lzdGVyZWQpOiBpbiB0aGF0IGNhc2UgdGhlIGhlYWRlclxuICAgKiBpcyBzaW1wbHkgYWJzZW50IGFuZCB0aGUgY2xpZW50IGhpZGVzIGZlZWRiYWNrIGZvciB0aGF0IG1lc3NhZ2UsXG4gICAqIGRlZ3JhZGluZyBncmFjZWZ1bGx5IHJhdGhlciB0aGFuIGVtaXR0aW5nIGEgYm9ndXMgdHJhY2UgaWQuXG4gICAqL1xuICBjb25maWd1cmVNbGZsb3dUcmFjZUlkKHJlczogZXhwcmVzcy5SZXNwb25zZSkge1xuICAgIGlmICghdGhpcy5mZWVkYmFja0VuYWJsZWQgfHwgcmVzLmhlYWRlcnNTZW50KSByZXR1cm47XG4gICAgaWYgKHJlcy5nZXRIZWFkZXIoZmVlZGJhY2suTUxGTE9XX1RSQUNFX0lEX0hFQURFUikpIHJldHVybjtcbiAgICBjb25zdCB0cmFjZUlkID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpPy5zcGFuQ29udGV4dCgpLnRyYWNlSWQ7XG4gICAgaWYgKCF0cmFjZUlkIHx8IHRyYWNlSWQgPT09IElOVkFMSURfVFJBQ0VfSUQpIHJldHVybjtcbiAgICByZXMuc2V0SGVhZGVyKGZlZWRiYWNrLk1MRkxPV19UUkFDRV9JRF9IRUFERVIsIGB0ci0ke3RyYWNlSWR9YCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgdGhyZWFkIGlkIHRoaXMgcmVxdWVzdCB0YXJnZXRzIGFuZCBwaW4gaXQgb25cbiAgICogYFJlcXVlc3RDb250ZXh0YCAoY29uc3VtZWQgYnkgdGhlIGFnZW50IHN0cmVhbSBmb3IgcGVyc2lzdGVuY2UgYW5kXG4gICAqIGJ5IG5hdGl2ZSBtZW1vcnkgcm91dGVzKS4gUmVzb2x1dGlvbiBvcmRlcjpcbiAgICpcbiAgICogICAxLiBBIGNsaWVudC1zdXBwbGllZCB0aHJlYWQgaWQgKHRoZSB0aHJlYWQtc2VsZWN0aW9uIGhlYWRlciAvXG4gICAqICAgICAgYD90aHJlYWRJZD1gIHF1ZXJ5KS4gVGhpcyBpcyBob3cgdGhlIGNoYXQgVUkgcmVmZXJlbmNlcyBhXG4gICAqICAgICAgc3BlY2lmaWMgY29udmVyc2F0aW9uIGFtb25nIHRoZSBtYW55IGEgdXNlciBvd25zIC0gaXQgcGlja3MgYVxuICAgKiAgICAgIHRocmVhZCBpZCBmcm9tIHRoZSBgL3RocmVhZHNgIGxpc3RpbmcgKG9yIG1pbnRzIG9uZSBmb3IgYSBuZXdcbiAgICogICAgICBjb252ZXJzYXRpb24pIGFuZCBzdGFtcHMgaXQgaGVyZS4gVGhlIGlkIGlzIHNjb3BlZCB0byB0aGVcbiAgICogICAgICBjYWxsZXIncyByZXNvdXJjZSBieSB0aGUgcmVjYWxsIC8gbGlzdCByb3V0ZXMsIHNvIGEgY2xpZW50XG4gICAqICAgICAgY2FuIG9ubHkgZXZlciByZWFkIG9yIHdyaXRlIGl0cyBvd24gdGhyZWFkcy5cbiAgICogICAyLiBUaGUgcGVyLXNlc3Npb24gY29va2llIChgYXBwa2l0XzxwbHVnaW4tbmFtZT5fc2Vzc2lvbl9pZGApLFxuICAgKiAgICAgIG1pbnRlZCBvbiBmaXJzdCBjb250YWN0LiBUaGlzIGlzIHRoZSBkZWZhdWx0IHNpbmdsZS10aHJlYWRcbiAgICogICAgICBmYWxsYmFjayBmb3IgY2xpZW50cyB0aGF0IGRvbid0IG1hbmFnZSB0aHJlYWRzIGV4cGxpY2l0bHksIHNvXG4gICAqICAgICAgZXhpc3RpbmcgZW1iZWRzIGtlZXAgb25lIHN0YWJsZSBjb252ZXJzYXRpb24gcGVyIHNlc3Npb24gd2l0aFxuICAgKiAgICAgIG5vIGNsaWVudCBjaGFuZ2VzLlxuICAgKi9cbiAgY29uZmlndXJlUmVxdWVzdENvbnRleHRUaHJlYWRJZChcbiAgICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICApIHtcbiAgICBpZiAocmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9USFJFQURfSURfS0VZKSkgcmV0dXJuO1xuICAgIGNvbnN0IHJlcXVlc3RlZCA9IHRoaXMucmVhZFJlcXVlc3RlZFRocmVhZElkKHJlcSk7XG4gICAgaWYgKHJlcXVlc3RlZCkge1xuICAgICAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9USFJFQURfSURfS0VZLCByZXF1ZXN0ZWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb29raWVzID0gaHR0cC5wYXJzZUNvb2tpZXMocmVxLmhlYWRlcnMuY29va2llKTtcbiAgICBjb25zdCBjb29raWVOYW1lID0gc3RyaW5nVXRpbHMudG9JZGVudGlmaWVyV2l0aE9wdGlvbnMoXG4gICAgICB7IGRlbGltaXRlcjogXCJfXCIsIGRpc3RpbmN0OiB0cnVlIH0sXG4gICAgICBcImFwcGtpdFwiLFxuICAgICAgdGhpcy5jb25maWcubmFtZSEsXG4gICAgICBcInNlc3Npb25JZFwiLFxuICAgICk7XG4gICAgbGV0IHNlc3Npb25JZCA9IGNvb2tpZXNbY29va2llTmFtZV07XG4gICAgaWYgKCFzZXNzaW9uSWQpIHtcbiAgICAgIHNlc3Npb25JZCA9IGhhc2guaWQoKTtcbiAgICAgIHJlcy5jb29raWUoY29va2llTmFtZSwgc2Vzc2lvbklkLCB7XG4gICAgICAgIGh0dHBPbmx5OiB0cnVlLFxuICAgICAgICBzYW1lU2l0ZTogXCJsYXhcIixcbiAgICAgICAgc2VjdXJlOiByZXEuc2VjdXJlLFxuICAgICAgICBwYXRoOiBcIi9cIixcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVksIHNlc3Npb25JZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCB0aGUgY2xpZW50LXNlbGVjdGVkIHRocmVhZCBpZCBmcm9tIHRoZSByZXF1ZXN0LCBwcmVmZXJyaW5nXG4gICAqIHRoZSB0aHJlYWQtc2VsZWN0aW9uIGhlYWRlciBvdmVyIHRoZSBgP3RocmVhZElkPWAgcXVlcnkuIFJldHVybnNcbiAgICogYG51bGxgIHdoZW4gbmVpdGhlciBjYXJyaWVzIGEgbm9uLWVtcHR5IHZhbHVlIHNvIHRoZSBjYWxsZXIgZmFsbHNcbiAgICogYmFjayB0byB0aGUgc2Vzc2lvbiBjb29raWUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRSZXF1ZXN0ZWRUaHJlYWRJZChyZXE6IGV4cHJlc3MuUmVxdWVzdCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGhlYWRlclZhbHVlID0gcmVxLmhlYWRlcnNbdGhyZWFkLlRIUkVBRF9JRF9IRUFERVJdO1xuICAgIGNvbnN0IHF1ZXJ5VmFsdWUgPSByZXEucXVlcnlbdGhyZWFkLlRIUkVBRF9JRF9RVUVSWV07XG4gICAgcmV0dXJuIChcbiAgICAgIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoQXJyYXkuaXNBcnJheShoZWFkZXJWYWx1ZSkgPyBoZWFkZXJWYWx1ZVswXSA6IGhlYWRlclZhbHVlKSA/P1xuICAgICAgc3RyaW5nVXRpbHMudHJpbVRvTnVsbChBcnJheS5pc0FycmF5KHF1ZXJ5VmFsdWUpID8gcXVlcnlWYWx1ZVswXSA6IHF1ZXJ5VmFsdWUpXG4gICAgKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0TW9kZWxPdmVycmlkZShyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KSB7XG4gICAgLy8gUGVyLXJlcXVlc3QgbW9kZWwgb3ZlcnJpZGU6IG9ubHkgaG9ub3JlZCB3aGVuIHRoZSBwbHVnaW5cbiAgICAvLyBvcHRzIGluIChkZWZhdWx0KS4gU291cmNlcywgaW4gcHJpb3JpdHkgb3JkZXIsIGFyZVxuICAgIC8vIGBYLU1hc3RyYS1Nb2RlbGAgaGVhZGVyLCBgP21vZGVsPWAgcXVlcnksIGFuZCBgbW9kZWxgIC9cbiAgICAvLyBgbW9kZWxJZGAgYm9keSBmaWVsZDsgc2VlIGBzZXJ2aW5nLnRzYC5cbiAgICBjb25zdCBzZXJ2aW5nID0gcmVzb2x2ZVNlcnZpbmdDb25maWcodGhpcy5jb25maWcpO1xuICAgIGlmIChzZXJ2aW5nLmFsbG93T3ZlcnJpZGUpIHtcbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gZXh0cmFjdE1vZGVsT3ZlcnJpZGUoe1xuICAgICAgICBoZWFkZXJzOiByZXEuaGVhZGVycyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZD4sXG4gICAgICAgIHF1ZXJ5OiByZXEucXVlcnkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIGJvZHk6IHJlcS5ib2R5LFxuICAgICAgfSk7XG4gICAgICBpZiAob3ZlcnJpZGUpIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZLCBvdmVycmlkZSk7XG4gICAgfVxuICB9XG59XG5cbi8qKiBJbnB1dHMgZm9yIHtAbGluayBpc01hc3RyYVJlcXVlc3RBbGxvd2VkfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFzdHJhQXBpR2F0ZU9wdGlvbnMge1xuICAvKiogYGNvbmZpZy5hcGlBY2Nlc3NgOyBgXCJmdWxsXCJgIHNob3J0LWNpcmN1aXRzIHRvIGFsbG93IGV2ZXJ5dGhpbmcuICovXG4gIGFjY2VzczogXCJzY29wZWRcIiB8IFwiZnVsbFwiO1xuICAvKiogV2hldGhlciB0aGUgTUNQIHRyYW5zcG9ydCBpcyBtb3VudGVkIChzbyBgL21jcC8qYCBpcyBsZWdpdGltYXRlKS4gKi9cbiAgbWNwRW5hYmxlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBNb3VudC1yZWxhdGl2ZSBhZ2VudCBpbmZlcmVuY2UgcGF0aHMgKGAvYWdlbnRzLzppZC88dmVyYj4uLi5gKS4gTWF0Y2hlZFxuICogYnkgcHJlZml4IG9uIHRoZSB2ZXJiIHNvIGZ1dHVyZSB2YXJpYW50cyAoYHN0cmVhbVZOZXh0YCwgYHN0cmVhbS92bmV4dGAsXG4gKiBgZ2VuZXJhdGVWTmV4dGApIHN0YXkgY292ZXJlZCB3aXRob3V0IGEgY29kZSBjaGFuZ2UuXG4gKlxuICogQ292ZXJzIHRoZSBwbGFpbiBpbmZlcmVuY2UgdmVyYnMgKGBzdHJlYW1gIC8gYGdlbmVyYXRlYCAvIGBuZXR3b3JrYCkgcGx1c1xuICogdGhlIGh1bWFuLWluLXRoZS1sb29wIHJlc3VtZSB2ZXJicyBhIHBhdXNlZCBgcmVxdWlyZUFwcHJvdmFsYCB0b29sIG5lZWRzXG4gKiB0byBjb250aW51ZTogYGFwcHJvdmUtdG9vbC1jYWxsYCAvIGBkZWNsaW5lLXRvb2wtY2FsbGAgKHN0cmVhbWluZywgYW5kIHZpYVxuICogcHJlZml4IHRoZWlyIGAtZ2VuZXJhdGVgIG5vbi1zdHJlYW1pbmcgdmFyaWFudHMpLCB0aGUgYC1uZXR3b3JrLWAgdmFyaWFudHMsXG4gKiBhbmQgYHJlc3VtZS1zdHJlYW1gIChjb3ZlcnMgYHJlc3VtZS1zdHJlYW0tdW50aWwtaWRsZWApLiBXaXRob3V0IHRoZXNlIGFuXG4gKiBhcHByb3ZhbC1nYXRlZCB0b29sIChlLmcuIGBzZW5kX2VtYWlsYCkgY2FuIGJlIHJlcXVlc3RlZCBidXQgbmV2ZXIgYXBwcm92ZWRcbiAqIGZyb20gdGhlIGJyb3dzZXIgLSB0aGUgcmVzdW1lIGBQT1NUYCA0MDNzIHVuZGVyIHNjb3BlZCBtb2RlLiBUb2dldGhlciB3aXRoXG4gKiB0aGUgcmVzb3VyY2Utc2NvcGVkIG1lbW9yeSBtdXRhdGlvbnMgYmVsb3csIHRoZXNlIGFyZSB0aGUgb25seSBzdG9jayBNYXN0cmFcbiAqIHdyaXRlcyB0aGUgYnJvd3NlciBjbGllbnQgY2FuIG1ha2UuXG4gKi9cbmNvbnN0IEFHRU5UX0lORkVSRU5DRSA9XG4gIC9eXFwvYWdlbnRzXFwvW14vXStcXC8oc3RyZWFtfGdlbmVyYXRlfG5ldHdvcmt8cmVzdW1lLXN0cmVhbXxhcHByb3ZlLXRvb2wtY2FsbHxkZWNsaW5lLXRvb2wtY2FsbHxhcHByb3ZlLW5ldHdvcmstdG9vbC1jYWxsfGRlY2xpbmUtbmV0d29yay10b29sLWNhbGwpL2k7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByZWFkLW9ubHkgYWdlbnQgbWV0YWRhdGEgKGAvYWdlbnRzYCwgYC9hZ2VudHMvOmlkYCkuICovXG5jb25zdCBBR0VOVF9NRVRBREFUQSA9IC9eXFwvYWdlbnRzKFxcL1teL10rKT8kLztcbi8qKiBQZXJzaXN0ZWQgYXBwcm92YWwgZGlzY292ZXJ5IGZvciBvbmUgYWdlbnQuICovXG5jb25zdCBBR0VOVF9TVVNQRU5ERURfUlVOUyA9IC9eXFwvYWdlbnRzXFwvW14vXStcXC9zdXNwZW5kZWQtcnVucyQvaTtcbi8qKiBPZmZpY2lhbCBBSSBTREsgVUkgc3RyZWFtIHJvdXRlLCBpbmNsdWRpbmcgYHJlc3VtZURhdGFgIGNvbnRpbnVhdGlvbnMuICovXG5jb25zdCBBR0VOVF9DSEFUID0gL15cXC9jaGF0XFwvW14vXSskL2k7XG4vKiogTmF0aXZlIHJlc291cmNlLXNjb3BlZCBtZW1vcnkgcmVhZHMgdXNlZCBieSBoaXN0b3J5IGFuZCB0aGUgdGhyZWFkIGxpc3QuICovXG5jb25zdCBNRU1PUllfUkVBRCA9IC9eXFwvbWVtb3J5XFwvdGhyZWFkcyg/OlxcL1teL10rKD86XFwvbWVzc2FnZXMpPyk/JC9pO1xuLyoqIE5hdGl2ZSB0aHJlYWQgcmVuYW1lL2RlbGV0ZSByb3V0ZXMuICovXG5jb25zdCBNRU1PUllfVEhSRUFEX01VVEFUSU9OID0gL15cXC9tZW1vcnlcXC90aHJlYWRzXFwvW14vXSskL2k7XG5cbi8qKlxuICogV2hldGhlciBhIHJlcXVlc3QgdG8gdGhlIHN0b2NrIGBAbWFzdHJhL2V4cHJlc3NgIHN1Yi1hcHAgc2hvdWxkIGJlXG4gKiBkaXNwYXRjaGVkLCBnaXZlbiB0aGUgY29uZmlndXJlZCB7QGxpbmsgTWFzdHJhQXBpR2F0ZU9wdGlvbnMuYWNjZXNzfS5cbiAqXG4gKiBgcGF0aGAgaXMgbW91bnQtcmVsYXRpdmUgKHdoYXQgdGhlIHBsdWdpbidzIGNhdGNoLWFsbCBzZWVzLCBlLmcuXG4gKiBgL2NoYXQveGAsIGAvbWVtb3J5L3RocmVhZHNgLCBgL21jcC8uLi5gKS4gSW4gYFwic2NvcGVkXCJgXG4gKiBtb2RlIHRoZSBhbGxvd2xpc3QgaXMgZGVsaWJlcmF0ZWx5IHRpZ2h0IC0gdGhlIGNoYXQgY2xpZW50IG9ubHkgZXZlclxuICogbmVlZHMgYWdlbnQgaW5mZXJlbmNlLCByZWFkLW9ubHkgYWdlbnQgbWV0YWRhdGEsIHJlc291cmNlLXNjb3BlZCBtZW1vcnksXG4gKiB0aGlzIHBsdWdpbidzIG93biBgL3JvdXRlLypgIHJvdXRlcywgYW5kICh3aGVuIGVuYWJsZWQpIE1DUC4gVGhlIHJlbWFpbmluZ1xuICogYWRtaW4sIG11dGF0aW5nLCBhbmQgYnVsay1leHBvcnQgc3VyZmFjZSBzdGF5cyBkZW5pZWQgYnkgZGVmYXVsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWFzdHJhUmVxdWVzdEFsbG93ZWQoXG4gIG1ldGhvZDogc3RyaW5nLFxuICBwYXRoOiBzdHJpbmcsXG4gIG9wdHM6IE1hc3RyYUFwaUdhdGVPcHRpb25zLFxuKTogYm9vbGVhbiB7XG4gIGlmIChvcHRzLmFjY2VzcyA9PT0gXCJmdWxsXCIpIHJldHVybiB0cnVlO1xuICBjb25zdCBwID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGggOiBgLyR7cGF0aH1gO1xuICAvLyBUaGUgcGx1Z2luJ3MgYC9yb3V0ZS8qYCBhZGRpdGlvbnMgdmFsaWRhdGUgdGhlaXIgb3duIGlucHV0cyBhbmQgdHJ1c3RlZFxuICAvLyBBcHBLaXQgcmVxdWVzdCBjb250ZXh0IGJlZm9yZSByZWFjaGluZyBwcm9kdWN0IGJlaGF2aW9yLlxuICBpZiAocCA9PT0gXCIvcm91dGVcIiB8fCBwLnN0YXJ0c1dpdGgoXCIvcm91dGUvXCIpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG9wdHMubWNwRW5hYmxlZCAmJiAocCA9PT0gXCIvbWNwXCIgfHwgcC5zdGFydHNXaXRoKFwiL21jcC9cIikpKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgbSA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICBpZiAobSA9PT0gXCJQT1NUXCIgJiYgQUdFTlRfQ0hBVC50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiUE9TVFwiICYmIEFHRU5UX0lORkVSRU5DRS50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiR0VUXCIgJiYgKEFHRU5UX01FVEFEQVRBLnRlc3QocCkgfHwgQUdFTlRfU1VTUEVOREVEX1JVTlMudGVzdChwKSkpIHJldHVybiB0cnVlO1xuICBpZiAobSA9PT0gXCJHRVRcIiAmJiBNRU1PUllfUkVBRC50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKChtID09PSBcIlBBVENIXCIgfHwgbSA9PT0gXCJERUxFVEVcIikgJiYgTUVNT1JZX1RIUkVBRF9NVVRBVElPTi50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiUE9TVFwiICYmIHAgPT09IFwiL21lbW9yeS9tZXNzYWdlcy9kZWxldGVcIikgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBLZWVwIE1hc3RyYSBjdXN0b20gQVBJIHJvdXRlcyBtb3VudC1yZWxhdGl2ZSB3aGVuIHRoZSBFeHByZXNzIHN1YmFwcCBpc1xuICogaG9zdGVkIHVuZGVyIEFwcEtpdCdzIGAvYXBpLzxwbHVnaW4+YCBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0YWNoUm91dGVQYXRjaE1pZGRsZXdhcmUoYXBwOiBleHByZXNzLkV4cHJlc3MpOiB2b2lkIHtcbiAgYXBwLnVzZSgocmVxLCBfcmVzLCBuZXh0KSA9PiB7XG4gICAgY29uc3QgaXNDdXN0b21Sb3V0ZSA9XG4gICAgICByZXEucGF0aCA9PT0gXCIvY2hhdFwiIHx8XG4gICAgICByZXEucGF0aC5zdGFydHNXaXRoKFwiL2NoYXQvXCIpIHx8XG4gICAgICByZXEucGF0aCA9PT0gXCIvcm91dGVcIiB8fFxuICAgICAgcmVxLnBhdGguc3RhcnRzV2l0aChcIi9yb3V0ZS9cIik7XG4gICAgaWYgKCFpc0N1c3RvbVJvdXRlKSByZXR1cm4gbmV4dCgpO1xuICAgIHJlcS5vcmlnaW5hbFVybCA9IHJlcS5wYXRoO1xuICAgIG5leHQoKTtcbiAgfSk7XG59XG4iXX0=
393
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDcEIsY0FBYyxHQUNmLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUFFLFlBQVksSUFBSSxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUczQyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLGVBQWUsRUFDZixvQkFBb0IsR0FHckIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDckQsT0FBTyxFQUNMLG9CQUFvQixFQUNwQix5QkFBeUIsRUFDekIseUJBQXlCLEVBQ3pCLG9CQUFvQixHQUNyQixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUscUJBQXFCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RTs7Ozs7R0FLRztBQUNILE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN4QyxNQUFN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QU8sSUFBSSxDQUFDO0lBQ3pGLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3BELElBQUksQ0FBQyxDQUFDLEtBQUssT0FBTyxJQUFJLENBQUMsS0FBSyxRQUFRLENBQUMsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDckYsSUFBSSxDQUFDLEtBQUssTUFBTSxJQUFJLENBQUMsS0FBSyx5QkFBeUI7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNqRSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsR0FBb0I7SUFDN0QsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDMUIsTUFBTSxhQUFhLEdBQ2pCLEdBQUcsQ0FBQyxJQUFJLEtBQUssT0FBTztZQUNwQixHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDN0IsR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRO1lBQ3JCLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNsQyxHQUFHLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDM0IsSUFBSSxFQUFFLENBQUM7SUFDVCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEV4cHJlc3MtbGF5ZXIgcGx1bWJpbmcgZm9yIHRoZSBNYXN0cmEgcGx1Z2luOiBhIGBNYXN0cmFTZXJ2ZXJgIHRoYXRcbiAqIHN0YW1wcyB0aGUgcGVyLXJlcXVlc3QgYFJlcXVlc3RDb250ZXh0YCBhbmQgYSBzY29wZWQgbmF0aXZlIEFQSSBnYXRlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBnZXRFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgaGFzaCwgaHR0cCwgbG9nLCBvYmplY3QsIHN0cmluZ1V0aWxzLCB0b2tlbiB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBmZWVkYmFjaywgdGhyZWFkIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHtcbiAgTUFTVFJBX1JFU09VUkNFX0lEX0tFWSxcbiAgTUFTVFJBX1RIUkVBRF9JRF9LRVksXG4gIFJlcXVlc3RDb250ZXh0LFxufSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgTWFzdHJhU2VydmVyIGFzIEV4cHJlc3NNYXN0cmFTZXJ2ZXIgfSBmcm9tIFwiQG1hc3RyYS9leHByZXNzXCI7XG5pbXBvcnQgeyB0cmFjZSB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9hcGlcIjtcbmltcG9ydCB0eXBlIGV4cHJlc3MgZnJvbSBcImV4cHJlc3NcIjtcblxuaW1wb3J0IHtcbiAgYXR0cmlidXRlZFVzZXJJZCxcbiAgTUFTVFJBX1JFUVVFU1RfSURfS0VZLFxuICBNQVNUUkFfU0NPUEVTX0tFWSxcbiAgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLFxuICBNQVNUUkFfVVNFUl9LRVksXG4gIE1BU1RSQV9VU0VSX05BTUVfS0VZLFxuICB0eXBlIE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgdHlwZSBVc2VyLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IHJlcXVlc3RVc2VyRW1haWwsIHJlcXVlc3RVc2VySWQgfSBmcm9tIFwiLi9pZGVudGl0eS50c1wiO1xuaW1wb3J0IHsgcmVzb2x2ZUZlZWRiYWNrRW5hYmxlZCB9IGZyb20gXCIuL21sZmxvdy50c1wiO1xuaW1wb3J0IHtcbiAgZXh0cmFjdE1vZGVsT3ZlcnJpZGUsXG4gIE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVksXG4gIE1BU1RSQV9SRVNPTFZFRF9NT0RFTF9LRVksXG4gIHJlc29sdmVTZXJ2aW5nQ29uZmlnLFxufSBmcm9tIFwiLi9zZXJ2aW5nLnRzXCI7XG5pbXBvcnQgeyByZWNvcmRBY3RpdmVUcmFjZUF1dGgsIHJlY29yZEFjdGl2ZVRyYWNlVXNlciB9IGZyb20gXCIuL3RlbGVtZXRyeS50c1wiO1xuLyoqXG4gKiBPcGVuVGVsZW1ldHJ5J3Mgc2VudGluZWwgZm9yIFwibm8gdmFsaWQgdHJhY2VcIiAtIDMyIHplcm8gaGV4IGNoYXJzLlxuICogYHRyYWNlLmdldEFjdGl2ZVNwYW4oKWAgcmV0dXJucyBhIG5vbi1yZWNvcmRpbmcgc3BhbiB3aXRoIHRoaXMgaWRcbiAqIHdoZW4gbm8gU0RLIGlzIHJlZ2lzdGVyZWQsIHdoaWNoIG11c3QgbmV2ZXIgYmUgc3VyZmFjZWQgYXMgYSB0cmFjZSB0b1xuICogYXR0YWNoIGZlZWRiYWNrIHRvLlxuICovXG5jb25zdCBJTlZBTElEX1RSQUNFX0lEID0gXCIwXCIucmVwZWF0KDMyKTtcbmNvbnN0IFRSVVNURURfUkVRVUVTVF9DT05URVhUX0tFWVMgPSBbXG4gIE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksXG4gIE1BU1RSQV9USFJFQURfSURfS0VZLFxuICBNQVNUUkFfVVNFUl9LRVksXG4gIE1BU1RSQV9VU0VSX05BTUVfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIE1BU1RSQV9SRVFVRVNUX0lEX0tFWSxcbiAgTUFTVFJBX1NDT1BFU19LRVksXG4gIE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVksXG4gIE1BU1RSQV9SRVNPTFZFRF9NT0RFTF9LRVksXG5dIGFzIGNvbnN0O1xuXG4vKiogUmVtb3ZlIGJyb3dzZXItc3VwcGxpZWQgdmFsdWVzIGZvciBmaWVsZHMgb3duZWQgYnkgdHJ1c3RlZCBzZXJ2ZXIgbWlkZGxld2FyZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclRydXN0ZWRSZXF1ZXN0Q29udGV4dChyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgVFJVU1RFRF9SRVFVRVNUX0NPTlRFWFRfS0VZUykge1xuICAgIHJlcXVlc3RDb250ZXh0LmRlbGV0ZVJhdyhrZXkpO1xuICB9XG59XG5cbi8qKlxuICogV2hvIGEgdHVybiBpcyBBVFRSSUJVVEVEIHRvLCBpbmRlcGVuZGVudCBvZiB3aGljaCBEYXRhYnJpY2tzIGNyZWRlbnRpYWwgcnVuc1xuICogaXRzIGNhbGxzLiBTdXBwbGllZCBieSB0aGUgSFRUUCBtaWRkbGV3YXJlIGZyb20gdGhlIGZvcndhcmRlZCB1c2VyIGhlYWRlcnMgc29cbiAqIHRoYXQgaW4gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIC0gd2hlcmUgZXZlcnkgcmVxdWVzdCBzaGFyZXMgdGhlIGFwcCBTUCdzXG4gKiBjbGllbnQgLSB0aGUgbWVtb3J5IHRocmVhZCwgcGVyLXVzZXIgY2FjaGUgbmFtZXNwYWNlLCBhbmQgdHJhY2UgbWV0YWRhdGFcbiAqIHN0aWxsIGtleSBvZmYgdGhlIHJlYWwgY2FsbGVyLiBJZ25vcmVkIGluIGFuIE9CTyAodXNlcikgY29udGV4dCwgd2hvc2Ugb3duXG4gKiB1c2VyIGlkIC8gZW1haWwgYXJlIGF1dGhvcml0YXRpdmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXR0cmlidXRlZElkZW50aXR5IHtcbiAgLyoqIEZvcndhcmRlZCBgeC1mb3J3YXJkZWQtdXNlcmAgaWQsIHVzZWQgd2hlbiB0aGUgY2xpZW50IGlzIHRoZSBzZXJ2aWNlIHByaW5jaXBhbC4gKi9cbiAgdXNlcklkPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogRm9yd2FyZGVkIGB4LWZvcndhcmRlZC1lbWFpbGAsIHVzZWQgZm9yIHRyYWNlIG1ldGFkYXRhIHVuZGVyIHRoZSBzZXJ2aWNlIHByaW5jaXBhbC4gKi9cbiAgZW1haWw/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU3RhbXAgdGhlIEFwcEtpdCB1c2VyIChwbHVzIHRoZSByZXNvdXJjZSBpZCBhbmQgdHJhY2UgbWV0YWRhdGEpIG9udG9cbiAqIGByZXF1ZXN0Q29udGV4dGAuXG4gKlxuICogU3BsaXQgb3V0IG9mIHtAbGluayBNYXN0cmFTZXJ2ZXJ9IGJlY2F1c2UgdGhlIEhUVFAgbWlkZGxld2FyZSBpcyBub3QgdGhlIG9ubHlcbiAqIGNhbGxlciB0aGF0IG5lZWRzIGl0OiBhbiBvdXQtb2YtYmFuZCB0dXJuIChhIFRlYW1zIGFjdGl2aXR5IGFycml2aW5nIG9uXG4gKiBhbm90aGVyIHBsdWdpbidzIHJvdXRlLCBhIHNjaGVkdWxlZCBqb2IpIGRyaXZlcyBgYWdlbnQuZ2VuZXJhdGVgIGRpcmVjdGx5LCBhbmRcbiAqIHdpdGhvdXQgdGhpcyBzdGFtcCBldmVyeSB1c2VyLXNjb3BlZCB0b29sIC0gYGFza19nZW5pZWAgYWJvdmUgYWxsIC0gZmFpbHMgd2l0aFxuICogXCJpbnZva2UgdGhlIHRvb2wgZnJvbSBhbiBhZ2VudCB0dXJuIHNlcnZlZCBieSB0aGUgbWFzdHJhIHBsdWdpblwiLiBUaG9zZVxuICogY2FsbGVycyBidWlsZCBhIGNvbnRleHQgd2l0aCB7QGxpbmsgY3JlYXRlUmVxdWVzdENvbnRleHR9IGluc3RlYWQgb2YgYVxuICogcmVxdWVzdC5cbiAqXG4gKiBUaGUgRGF0YWJyaWNrcyBjcmVkZW50aWFsIGFsd2F5cyBjb21lcyBmcm9tIHRoZSBhbWJpZW50IGV4ZWN1dGlvbiBjb250ZXh0O1xuICogYGF0dHJpYnV0ZWRgIG9ubHkgY2hhbmdlcyBXSE8gdGhlIHR1cm4gaXMgYXR0cmlidXRlZCB0byB3aGVuIHRoYXQgY29udGV4dCBpc1xuICogdGhlIHNlcnZpY2UgcHJpbmNpcGFsIChzZWUge0BsaW5rIEF0dHJpYnV0ZWRJZGVudGl0eX0pLlxuICpcbiAqIElkZW1wb3RlbnQ6IHJldHVybnMgaW1tZWRpYXRlbHkgd2hlbiB0aGUgdXNlciBhbmQgcmVzb3VyY2UgaWQgYXJlIGFscmVhZHlcbiAqIHByZXNlbnQsIHNvIHRoZSBtaWRkbGV3YXJlIGNhbiBjYWxsIGl0IG92ZXIgYSBjb250ZXh0IGFub3RoZXIgbGF5ZXIgc3RhbXBlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YW1wUmVxdWVzdENvbnRleHRVc2VyKFxuICByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQsXG4gIGF0dHJpYnV0ZWQ6IEF0dHJpYnV0ZWRJZGVudGl0eSA9IHt9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChbTUFTVFJBX1VTRVJfS0VZLCBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZXS5ldmVyeSgoa2V5KSA9PiByZXF1ZXN0Q29udGV4dC5nZXQoa2V5KSkpIHJldHVybjtcbiAgY29uc3QgZXhlY3V0aW9uQ29udGV4dCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgY29uc3QgaXNVc2VyQ29udGV4dCA9IFwiaXNVc2VyQ29udGV4dFwiIGluIGV4ZWN1dGlvbkNvbnRleHQ7XG4gIC8vIFRoZSBEYXRhYnJpY2tzIENSRURFTlRJQUwgaXMgYWx3YXlzIHRoZSBhbWJpZW50IGV4ZWN1dGlvbiBjb250ZXh0J3MgY2xpZW50XG4gIC8vIChPQk8gaW4gYSB1c2VyIGNvbnRleHQsIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCBvdGhlcndpc2UpLiBXSE8gdGhlIHR1cm4gaXNcbiAgLy8gYXR0cmlidXRlZCB0byBjYW4gZGlmZmVyOiBpbiBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgZXZlcnkgcmVxdWVzdCBzaGFyZXNcbiAgLy8gdGhlIFNQIGNsaWVudCwgYnV0IHRoZSBmb3J3YXJkZWQgdXNlciBpZCBtdXN0IHN0aWxsIGtleSB0aGUgbWVtb3J5IHRocmVhZFxuICAvLyBhbmQgdGhlIHBlci11c2VyIGNhY2hlIG5hbWVzcGFjZSBzbyB0d28gY2FsbGVycyBkb24ndCBzaGFyZSBhIGNvbnZlcnNhdGlvbi5cbiAgY29uc3QgdXNlcjogVXNlciA9IHtcbiAgICBpZDogYXR0cmlidXRlZFVzZXJJZChleGVjdXRpb25Db250ZXh0LCBhdHRyaWJ1dGVkLnVzZXJJZCksXG4gICAgZXhlY3V0aW9uQ29udGV4dCxcbiAgfTtcbiAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9VU0VSX0tFWSwgdXNlcik7XG4gIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLCB1c2VyLmlkKTtcbiAgLy8gQXBwS2l0J3MgYFVzZXJDb250ZXh0YCBzdXJmYWNlcyBkaXNwbGF5IG5hbWUgLyBlbWFpbCBvbmx5IG9uXG4gIC8vIE9CTyByZXF1ZXN0cy4gU2VydmljZS1jb250ZXh0IGNhbGxzIChiYWNrZ3JvdW5kIHRhc2tzLCBzZXJ2ZXJcbiAgLy8gc3RhcnQtdXApIGxlYXZlIHRoZXNlIHVuZGVmaW5lZCBhbmQgd2Ugc2tpcCB0aGUgc3RhbXAgc29cbiAgLy8gZG93bnN0cmVhbSB0cmFjZSBtZXRhZGF0YSBzdGF5cyBhYnNlbnQgcmF0aGVyIHRoYW4gZW1wdHkuIEluXG4gIC8vIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSB0aGUgZm9yd2FyZGVkIGVtYWlsIHN0aWxsIGlkZW50aWZpZXMgdGhlIGNhbGxlcixcbiAgLy8gc28gaXQgaXMgdXNlZCBmb3IgdHJhY2UgbWV0YWRhdGEgZXZlbiB0aG91Z2ggdGhlIGNsaWVudCBpcyB0aGUgU1AuXG4gIGxldCB1c2VyTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgZW1haWw6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGF0dHJpYnV0ZWQuZW1haWw7XG4gIGlmIChpc1VzZXJDb250ZXh0KSB7XG4gICAgdXNlck5hbWUgPSBleGVjdXRpb25Db250ZXh0LnVzZXJOYW1lO1xuICAgIGVtYWlsID0gZXhlY3V0aW9uQ29udGV4dC51c2VyRW1haWwgPz8gZW1haWw7XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gYXdhaXQgZXhlY3V0aW9uQ29udGV4dC5jbGllbnQuY3VycmVudFVzZXIubWUoKTtcbiAgICB1c2VyTmFtZSA9IGN1cnJlbnRVc2VyPy51c2VyTmFtZTtcbiAgICBlbWFpbCA9IGN1cnJlbnRVc2VyPy5lbWFpbHM/LmZpbHRlcigoZW1haWwpID0+IGVtYWlsLnByaW1hcnkpLmZpbmQoKGVtYWlsKSA9PiBlbWFpbC52YWx1ZSlcbiAgICAgID8udmFsdWUgYXMgc3RyaW5nO1xuICB9XG4gIGlmICh1c2VyTmFtZSkge1xuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVVNFUl9OQU1FX0tFWSwgdXNlck5hbWUpO1xuICB9XG4gIGlmIChlbWFpbCkge1xuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVVNFUl9FTUFJTF9LRVksIGVtYWlsKTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBgUmVxdWVzdENvbnRleHRgIGEgTk9OLUhUVFAgYWdlbnQgdHVybiBuZWVkcy5cbiAqXG4gKiBFdmVyeXRoaW5nIE1hc3RyYSdzIHRvb2xzIHJlYWQgb2ZmIHRoZSBjb250ZXh0IGlzIHN0YW1wZWQgdGhlIHNhbWUgd2F5IHRoZVxuICogcmVxdWVzdCBtaWRkbGV3YXJlIHN0YW1wcyBpdCAtIHRoZSBBcHBLaXQgdXNlciAoc28gYGFza19nZW5pZWAgYW5kIHRoZSBtb2RlbFxuICogcmVzb2x2ZXIgY2FuIG1pbnQgdXNlci1zY29wZWQgdG9rZW5zKSwgdGhlIG1lbW9yeSB0aHJlYWQgLyByZXNvdXJjZSBwYWlyLCBhbmRcbiAqIGEgcmVxdWVzdCBpZCBzbyB0aGUgdHVybidzIHNwYW5zIGpvaW4gdXAgaW4gdHJhY2VzLiBUaGUgcmVzdWx0IGlzIHBhc3NlZCBhc1xuICogYHJlcXVlc3RDb250ZXh0YCB0byBgYWdlbnQuZ2VuZXJhdGVgIC8gYGFnZW50LnN0cmVhbWAuXG4gKlxuICogVGhpcyBpcyB3aGF0IG1ha2VzIGEgY2FyZCB0dXJuIGFuc3dlciB3aXRoIHRoZSBTQU1FIGRhdGEgYSBjaGF0IHR1cm4gZG9lczogdGhlXG4gKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBlbmRwb2ludHMgaXMgcHJlc2VudGF0aW9uLCBub3QgY2FwYWJpbGl0eS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RDb250ZXh0KFxuICBvcHRpb25zOiB7IHRocmVhZElkPzogc3RyaW5nOyByZXNvdXJjZUlkPzogc3RyaW5nOyByZXF1ZXN0SWQ/OiBzdHJpbmcgfSA9IHt9LFxuKTogUHJvbWlzZTxSZXF1ZXN0Q29udGV4dD4ge1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IG5ldyBSZXF1ZXN0Q29udGV4dCgpO1xuICBhd2FpdCBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcihyZXF1ZXN0Q29udGV4dCk7XG4gIGlmIChvcHRpb25zLnRocmVhZElkKSByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVksIG9wdGlvbnMudGhyZWFkSWQpO1xuICAvLyBTdGFtcGVkIEFGVEVSIHRoZSB1c2VyIHNvIGFuIGV4cGxpY2l0IHJlc291cmNlIGlkIChhIGNoYW5uZWwgbWVtYmVyLCBzYXkpXG4gIC8vIHdpbnMgb3ZlciB0aGUgYW1iaWVudCBpZGVudGl0eSBgc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXJgIGRlZmF1bHRlZCB0by5cbiAgaWYgKG9wdGlvbnMucmVzb3VyY2VJZCkgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksIG9wdGlvbnMucmVzb3VyY2VJZCk7XG4gIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVRVUVTVF9JRF9LRVksIG9wdGlvbnMucmVxdWVzdElkID8/IGhhc2guaWQoKSk7XG4gIHJldHVybiByZXF1ZXN0Q29udGV4dDtcbn1cblxuLyoqXG4gKiBgQG1hc3RyYS9leHByZXNzYCBzdWJjbGFzcyB0aGF0IHN0YW1wcyBgUmVxdWVzdENvbnRleHRgIHdpdGggdGhlXG4gKiBBcHBLaXQgdXNlciwgcmVzb3VyY2UgaWQsIGFuZCBhIHRocmVhZCBpZCBiYWNrZWQgYnkgYW4gSFRUUC1vbmx5XG4gKiBzZXNzaW9uIGNvb2tpZSAoYGFwcGtpdF88cGx1Z2luLW5hbWU+X3Nlc3Npb25faWRgKS5cbiAqL1xuZXhwb3J0IGNsYXNzIE1hc3RyYVNlcnZlciBleHRlbmRzIEV4cHJlc3NNYXN0cmFTZXJ2ZXIge1xuICBwcml2YXRlIGxvZzogbG9nLkxvZ2dlcjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3RhbXAgdGhlIE1MZmxvdyB0cmFjZS1pZCBoZWFkZXIgb24gcmVzcG9uc2VzLiBTaGFyZXMgdGhlXG4gICAqIHBsdWdpbidzIGZlZWRiYWNrIGdhdGUgdmlhIHtAbGluayByZXNvbHZlRmVlZGJhY2tFbmFibGVkfS5cbiAgICovXG4gIHByaXZhdGUgZmVlZGJhY2tFbmFibGVkOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gICAgLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBFeHByZXNzTWFzdHJhU2VydmVyPlxuICApIHtcbiAgICBzdXBlciguLi5hcmdzKTtcbiAgICB0aGlzLmxvZyA9IGxvZy5sb2dnZXIoY29uZmlnKTtcbiAgICB0aGlzLmZlZWRiYWNrRW5hYmxlZCA9IHJlc29sdmVGZWVkYmFja0VuYWJsZWQoY29uZmlnLmZlZWRiYWNrKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlZ2lzdGVyQXV0aE1pZGRsZXdhcmUoKTogdm9pZCB7XG4gICAgc3VwZXIucmVnaXN0ZXJBdXRoTWlkZGxld2FyZSgpO1xuICAgIHRoaXMuYXBwLnVzZShhc3luYyAocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gcmVzLmxvY2Fscy5yZXF1ZXN0Q29udGV4dCEgYXMgUmVxdWVzdENvbnRleHQ7XG4gICAgICBjbGVhclRydXN0ZWRSZXF1ZXN0Q29udGV4dChyZXF1ZXN0Q29udGV4dCk7XG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VXNlcihyZXEsIHJlcXVlc3RDb250ZXh0KTtcbiAgICAgIHRoaXMuY29uZmlndXJlUmVxdWVzdENvbnRleHRUaHJlYWRJZChyZXEsIHJlcywgcmVxdWVzdENvbnRleHQpO1xuICAgICAgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dE1vZGVsT3ZlcnJpZGUocmVxLCByZXF1ZXN0Q29udGV4dCk7XG4gICAgICB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0UmVxdWVzdElkKHJlcSwgcmVzLCByZXF1ZXN0Q29udGV4dCk7XG4gICAgICB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0U2NvcGVzKHJlcSwgcmVxdWVzdENvbnRleHQpO1xuXG4gICAgICB0aGlzLmNvbmZpZ3VyZU1sZmxvd1RyYWNlSWQocmVzKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFwiYXV0aDptaWRkbGV3YXJlXCIsIHtcbiAgICAgICAgbWV0aG9kOiByZXEubWV0aG9kLFxuICAgICAgICBwYXRoOiByZXEucGF0aCxcbiAgICAgICAgcmVxdWVzdElkOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1JFUVVFU1RfSURfS0VZKSxcbiAgICAgICAgdGhyZWFkSWQ6IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVEhSRUFEX0lEX0tFWSksXG4gICAgICAgIHJlc291cmNlSWQ6IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKSxcbiAgICAgICAgdXNlck5hbWU6IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9OQU1FX0tFWSksXG4gICAgICAgIHVzZXJFbWFpbDogcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX0VNQUlMX0tFWSksXG4gICAgICAgIG1vZGVsT3ZlcnJpZGU6IHJlcXVlc3RDb250ZXh0LmdldChcbiAgICAgICAgICAvLyBpbXBvcnRlZCBiZWxvdzsgbG9nZ2VkIHNvIGEgbWlzcm91dGVkIHJlcXVlc3Qgc2hvd3NcbiAgICAgICAgICAvLyB1cCBhbG9uZ3NpZGUgaXRzIG1vZGVsIHNlbGVjdGlvbiBpbiBgTE9HX0xFVkVMPWRlYnVnYC5cbiAgICAgICAgICBcIm1hc3RyYV9fbW9kZWxfb3ZlcnJpZGVcIixcbiAgICAgICAgKSxcbiAgICAgIH0pO1xuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgY29uZmlndXJlUmVxdWVzdENvbnRleHRVc2VyKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQpIHtcbiAgICAvLyBQYXNzIHRoZSBmb3J3YXJkZWQgY2FsbGVyIGlkZW50aXR5IHNvIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSBzdGlsbCBrZXlzXG4gICAgLy8gbWVtb3J5IC8gY2FjaGUgLyB0cmFjZXMgcGVyIHVzZXIgZXZlbiB0aG91Z2ggdGhlIGNsaWVudCBpcyB0aGUgYXBwIFNQLlxuICAgIC8vIEluIGFuIE9CTyBjb250ZXh0IHRoZXNlIGFyZSBpZ25vcmVkIGluIGZhdm9yIG9mIHRoZSBjb250ZXh0J3Mgb3duIHVzZXIuXG4gICAgYXdhaXQgc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXIocmVxdWVzdENvbnRleHQsIHtcbiAgICAgIHVzZXJJZDogcmVxdWVzdFVzZXJJZChyZXEpLFxuICAgICAgZW1haWw6IHJlcXVlc3RVc2VyRW1haWwocmVxKSxcbiAgICB9KTtcbiAgICBjb25zdCB1c2VyID0gcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX0tFWSkgYXMgVXNlciB8IHVuZGVmaW5lZDtcbiAgICBpZiAodXNlcikge1xuICAgICAgcmVjb3JkQWN0aXZlVHJhY2VBdXRoKFwiaXNVc2VyQ29udGV4dFwiIGluIHVzZXIuZXhlY3V0aW9uQ29udGV4dCA/IFwib2JvXCIgOiBcInNlcnZpY2UtcHJpbmNpcGFsXCIpO1xuICAgIH1cbiAgICBjb25zdCB0cmFjZVVzZXIgPSBbXG4gICAgICByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfRU1BSUxfS0VZKSxcbiAgICAgIHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9OQU1FX0tFWSksXG4gICAgICByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1JFU09VUkNFX0lEX0tFWSksXG4gICAgXS5maW5kKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCA+IDApO1xuICAgIHJlY29yZEFjdGl2ZVRyYWNlVXNlcih0cmFjZVVzZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YW1wIGEgcGVyLXJlcXVlc3QgaWQgYW5kIGVjaG8gaXQgb24gdGhlIHJlc3BvbnNlIHNvIGFuIHVwc3RyZWFtXG4gICAqIHByb3h5IC8gY3VybCBjbGllbnQgLyBicm93c2VyLXNpZGUgbG9nIGxpbmUgY2FuIHBhaXIgaXRzIHZpZXcgb2ZcbiAgICogdGhlIHJlcXVlc3Qgd2l0aCB0aGUgbWF0Y2hpbmcgdHJhY2Ugc3Bhbi4gUmV1c2VzIGBYLVJlcXVlc3QtSWRgXG4gICAqIHdoZW4gdGhlIHVwc3RyZWFtIGFscmVhZHkgc3VwcGxpZXMgb25lIHNvIG11bHRpLWhvcCB0cmFjZXMgc3RheVxuICAgKiBqb2luZWQ7IG90aGVyd2lzZSBtaW50cyBhIFVVSUR2NC5cbiAgICpcbiAgICogVGhlIGlkIGlzIHN1cmZhY2VkIGFzIGBtYXN0cmFfX3JlcXVlc3RJZGAgc3BhbiBtZXRhZGF0YSB2aWFcbiAgICoge0BsaW5rIFRSQUNFX1JFUVVFU1RfQ09OVEVYVF9LRVlTfSBhbmQgYXMgdGhlIGBYLVJlcXVlc3QtSWRgXG4gICAqIHJlc3BvbnNlIGhlYWRlciBzbyBkZXYgdG9vbHMgY2FuIGNvcHkgaXQgZnJvbSBlaXRoZXIgc2lkZS5cbiAgICovXG4gIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0UmVxdWVzdElkKFxuICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQsXG4gICkge1xuICAgIGlmIChyZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1JFUVVFU1RfSURfS0VZKSkgcmV0dXJuO1xuICAgIGNvbnN0IGhlYWRlclZhbHVlID0gcmVxLmhlYWRlcnNbXCJ4LXJlcXVlc3QtaWRcIl07XG4gICAgY29uc3QgdXBzdHJlYW0gPSBBcnJheS5pc0FycmF5KGhlYWRlclZhbHVlKSA/IGhlYWRlclZhbHVlWzBdIDogaGVhZGVyVmFsdWU7XG4gICAgY29uc3QgcmVxdWVzdElkID0gdXBzdHJlYW0/LnRyaW0oKSB8fCBoYXNoLmlkKCk7XG4gICAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9SRVFVRVNUX0lEX0tFWSwgcmVxdWVzdElkKTtcbiAgICByZXMuc2V0SGVhZGVyKFwiWC1SZXF1ZXN0LUlkXCIsIHJlcXVlc3RJZCk7XG4gIH1cblxuICAvKipcbiAgICogU3RhbXAgT0F1dGggc2NvcGVzIGZyb20gdGhlIGZvcndhcmRlZCBhY2Nlc3MgdG9rZW4gb25cbiAgICoge0BsaW5rIE1BU1RSQV9TQ09QRVNfS0VZfSBmb3Igd29ya3NwYWNlIG1vdW50IGdhdGluZy5cbiAgICovXG4gIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0U2NvcGVzKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQpIHtcbiAgICBjb25zdCBzY29wZXMgPSBbXG4gICAgICAuLi5vYmplY3RcbiAgICAgICAgLnNlcXVlbmNlKHRva2VuLmdldEFjY2Vzc1Rva2VuU2NvcGVzKHJlcSksIHRva2VuLmdldEFjY2Vzc1Rva2VuU2NvcGVzKHJlcSwgXCJhdXRob3JpemF0aW9uXCIpKVxuICAgICAgICAuZGlzdGluY3QoKSxcbiAgICBdO1xuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfU0NPUEVTX0tFWSwgc2NvcGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFtcCB0aGUgdHVybidzIE1MZmxvdyB0cmFjZSBpZCBvbiB0aGUgcmVzcG9uc2Ugc28gdGhlIGNoYXQgY2xpZW50XG4gICAqIGNhbiBhdHRhY2ggdGh1bWJzIC8gY29tbWVudCBmZWVkYmFjayB0byBpdCBsYXRlci4gTUxmbG93IGRlcml2ZXNcbiAgICogaXRzIHRyYWNlIGlkIGZyb20gdGhlIE9wZW5UZWxlbWV0cnkgdHJhY2UgaWQgKGB0ci08aGV4PmApLCBhbmQgZXZlcnlcbiAgICogTWFzdHJhIHNwYW4gZm9yIHRoaXMgcmVxdWVzdCBpbmhlcml0cyB0aGUgYW1iaWVudCBPVGVsIGNvbnRleHQgKHNlZVxuICAgKiBgb2JzZXJ2YWJpbGl0eS50c2ApLCBzbyB0aGUgYWN0aXZlIHNwYW4ncyB0cmFjZSBpZCBoZXJlIGlzIHRoZSBpZFxuICAgKiBNTGZsb3cgd2lsbCByZWNvcmQgZm9yIHRoZSB0dXJuLlxuICAgKlxuICAgKiBOby1vcCB1bmxlc3MgZmVlZGJhY2sgaXMgZW5hYmxlZCwgYW5kIHdoZW4gbm8gbGl2ZSBPVGVsIHNwYW4gaXNcbiAgICogYWN0aXZlIChlLmcuIHRoZSBPVExQIFNESyBpc24ndCByZWdpc3RlcmVkKTogaW4gdGhhdCBjYXNlIHRoZSBoZWFkZXJcbiAgICogaXMgc2ltcGx5IGFic2VudCBhbmQgdGhlIGNsaWVudCBoaWRlcyBmZWVkYmFjayBmb3IgdGhhdCBtZXNzYWdlLFxuICAgKiBkZWdyYWRpbmcgZ3JhY2VmdWxseSByYXRoZXIgdGhhbiBlbWl0dGluZyBhIGJvZ3VzIHRyYWNlIGlkLlxuICAgKi9cbiAgY29uZmlndXJlTWxmbG93VHJhY2VJZChyZXM6IGV4cHJlc3MuUmVzcG9uc2UpIHtcbiAgICBpZiAoIXRoaXMuZmVlZGJhY2tFbmFibGVkIHx8IHJlcy5oZWFkZXJzU2VudCkgcmV0dXJuO1xuICAgIGlmIChyZXMuZ2V0SGVhZGVyKGZlZWRiYWNrLk1MRkxPV19UUkFDRV9JRF9IRUFERVIpKSByZXR1cm47XG4gICAgY29uc3QgdHJhY2VJZCA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKT8uc3BhbkNvbnRleHQoKS50cmFjZUlkO1xuICAgIGlmICghdHJhY2VJZCB8fCB0cmFjZUlkID09PSBJTlZBTElEX1RSQUNFX0lEKSByZXR1cm47XG4gICAgcmVzLnNldEhlYWRlcihmZWVkYmFjay5NTEZMT1dfVFJBQ0VfSURfSEVBREVSLCBgdHItJHt0cmFjZUlkfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIHRocmVhZCBpZCB0aGlzIHJlcXVlc3QgdGFyZ2V0cyBhbmQgcGluIGl0IG9uXG4gICAqIGBSZXF1ZXN0Q29udGV4dGAgKGNvbnN1bWVkIGJ5IHRoZSBhZ2VudCBzdHJlYW0gZm9yIHBlcnNpc3RlbmNlIGFuZFxuICAgKiBieSBuYXRpdmUgbWVtb3J5IHJvdXRlcykuIFJlc29sdXRpb24gb3JkZXI6XG4gICAqXG4gICAqICAgMS4gQSBjbGllbnQtc3VwcGxpZWQgdGhyZWFkIGlkICh0aGUgdGhyZWFkLXNlbGVjdGlvbiBoZWFkZXIgL1xuICAgKiAgICAgIGA/dGhyZWFkSWQ9YCBxdWVyeSkuIFRoaXMgaXMgaG93IHRoZSBjaGF0IFVJIHJlZmVyZW5jZXMgYVxuICAgKiAgICAgIHNwZWNpZmljIGNvbnZlcnNhdGlvbiBhbW9uZyB0aGUgbWFueSBhIHVzZXIgb3ducyAtIGl0IHBpY2tzIGFcbiAgICogICAgICB0aHJlYWQgaWQgZnJvbSB0aGUgYC90aHJlYWRzYCBsaXN0aW5nIChvciBtaW50cyBvbmUgZm9yIGEgbmV3XG4gICAqICAgICAgY29udmVyc2F0aW9uKSBhbmQgc3RhbXBzIGl0IGhlcmUuIFRoZSBpZCBpcyBzY29wZWQgdG8gdGhlXG4gICAqICAgICAgY2FsbGVyJ3MgcmVzb3VyY2UgYnkgdGhlIHJlY2FsbCAvIGxpc3Qgcm91dGVzLCBzbyBhIGNsaWVudFxuICAgKiAgICAgIGNhbiBvbmx5IGV2ZXIgcmVhZCBvciB3cml0ZSBpdHMgb3duIHRocmVhZHMuXG4gICAqICAgMi4gVGhlIHBlci1zZXNzaW9uIGNvb2tpZSAoYGFwcGtpdF88cGx1Z2luLW5hbWU+X3Nlc3Npb25faWRgKSxcbiAgICogICAgICBtaW50ZWQgb24gZmlyc3QgY29udGFjdC4gVGhpcyBpcyB0aGUgZGVmYXVsdCBzaW5nbGUtdGhyZWFkXG4gICAqICAgICAgZmFsbGJhY2sgZm9yIGNsaWVudHMgdGhhdCBkb24ndCBtYW5hZ2UgdGhyZWFkcyBleHBsaWNpdGx5LCBzb1xuICAgKiAgICAgIGV4aXN0aW5nIGVtYmVkcyBrZWVwIG9uZSBzdGFibGUgY29udmVyc2F0aW9uIHBlciBzZXNzaW9uIHdpdGhcbiAgICogICAgICBubyBjbGllbnQgY2hhbmdlcy5cbiAgICovXG4gIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VGhyZWFkSWQoXG4gICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICAgIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCxcbiAgKSB7XG4gICAgaWYgKHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVEhSRUFEX0lEX0tFWSkpIHJldHVybjtcbiAgICBjb25zdCByZXF1ZXN0ZWQgPSB0aGlzLnJlYWRSZXF1ZXN0ZWRUaHJlYWRJZChyZXEpO1xuICAgIGlmIChyZXF1ZXN0ZWQpIHtcbiAgICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVEhSRUFEX0lEX0tFWSwgcmVxdWVzdGVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29va2llcyA9IGh0dHAucGFyc2VDb29raWVzKHJlcS5oZWFkZXJzLmNvb2tpZSk7XG4gICAgY29uc3QgY29va2llTmFtZSA9IHN0cmluZ1V0aWxzLnRvSWRlbnRpZmllcldpdGhPcHRpb25zKFxuICAgICAgeyBkZWxpbWl0ZXI6IFwiX1wiLCBkaXN0aW5jdDogdHJ1ZSB9LFxuICAgICAgXCJhcHBraXRcIixcbiAgICAgIHRoaXMuY29uZmlnLm5hbWUhLFxuICAgICAgXCJzZXNzaW9uSWRcIixcbiAgICApO1xuICAgIGxldCBzZXNzaW9uSWQgPSBjb29raWVzW2Nvb2tpZU5hbWVdO1xuICAgIGlmICghc2Vzc2lvbklkKSB7XG4gICAgICBzZXNzaW9uSWQgPSBoYXNoLmlkKCk7XG4gICAgICByZXMuY29va2llKGNvb2tpZU5hbWUsIHNlc3Npb25JZCwge1xuICAgICAgICBodHRwT25seTogdHJ1ZSxcbiAgICAgICAgc2FtZVNpdGU6IFwibGF4XCIsXG4gICAgICAgIHNlY3VyZTogcmVxLnNlY3VyZSxcbiAgICAgICAgcGF0aDogXCIvXCIsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9USFJFQURfSURfS0VZLCBzZXNzaW9uSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgdGhlIGNsaWVudC1zZWxlY3RlZCB0aHJlYWQgaWQgZnJvbSB0aGUgcmVxdWVzdCwgcHJlZmVycmluZ1xuICAgKiB0aGUgdGhyZWFkLXNlbGVjdGlvbiBoZWFkZXIgb3ZlciB0aGUgYD90aHJlYWRJZD1gIHF1ZXJ5LiBSZXR1cm5zXG4gICAqIGBudWxsYCB3aGVuIG5laXRoZXIgY2FycmllcyBhIG5vbi1lbXB0eSB2YWx1ZSBzbyB0aGUgY2FsbGVyIGZhbGxzXG4gICAqIGJhY2sgdG8gdGhlIHNlc3Npb24gY29va2llLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkUmVxdWVzdGVkVGhyZWFkSWQocmVxOiBleHByZXNzLlJlcXVlc3QpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IHJlcS5oZWFkZXJzW3RocmVhZC5USFJFQURfSURfSEVBREVSXTtcbiAgICBjb25zdCBxdWVyeVZhbHVlID0gcmVxLnF1ZXJ5W3RocmVhZC5USFJFQURfSURfUVVFUlldO1xuICAgIHJldHVybiAoXG4gICAgICBzdHJpbmdVdGlscy50cmltVG9OdWxsKEFycmF5LmlzQXJyYXkoaGVhZGVyVmFsdWUpID8gaGVhZGVyVmFsdWVbMF0gOiBoZWFkZXJWYWx1ZSkgPz9cbiAgICAgIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoQXJyYXkuaXNBcnJheShxdWVyeVZhbHVlKSA/IHF1ZXJ5VmFsdWVbMF0gOiBxdWVyeVZhbHVlKVxuICAgICk7XG4gIH1cblxuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dE1vZGVsT3ZlcnJpZGUocmVxOiBleHByZXNzLlJlcXVlc3QsIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCkge1xuICAgIC8vIFBlci1yZXF1ZXN0IG1vZGVsIG92ZXJyaWRlOiBvbmx5IGhvbm9yZWQgd2hlbiB0aGUgcGx1Z2luXG4gICAgLy8gb3B0cyBpbiAoZGVmYXVsdCkuIFNvdXJjZXMsIGluIHByaW9yaXR5IG9yZGVyLCBhcmVcbiAgICAvLyBgWC1NYXN0cmEtTW9kZWxgIGhlYWRlciwgYD9tb2RlbD1gIHF1ZXJ5LCBhbmQgYG1vZGVsYCAvXG4gICAgLy8gYG1vZGVsSWRgIGJvZHkgZmllbGQ7IHNlZSBgc2VydmluZy50c2AuXG4gICAgY29uc3Qgc2VydmluZyA9IHJlc29sdmVTZXJ2aW5nQ29uZmlnKHRoaXMuY29uZmlnKTtcbiAgICBpZiAoc2VydmluZy5hbGxvd092ZXJyaWRlKSB7XG4gICAgICBjb25zdCBvdmVycmlkZSA9IGV4dHJhY3RNb2RlbE92ZXJyaWRlKHtcbiAgICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+LFxuICAgICAgICBxdWVyeTogcmVxLnF1ZXJ5IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBib2R5OiByZXEuYm9keSxcbiAgICAgIH0pO1xuICAgICAgaWYgKG92ZXJyaWRlKSByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSwgb3ZlcnJpZGUpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogSW5wdXRzIGZvciB7QGxpbmsgaXNNYXN0cmFSZXF1ZXN0QWxsb3dlZH0uICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYUFwaUdhdGVPcHRpb25zIHtcbiAgLyoqIGBjb25maWcuYXBpQWNjZXNzYDsgYFwiZnVsbFwiYCBzaG9ydC1jaXJjdWl0cyB0byBhbGxvdyBldmVyeXRoaW5nLiAqL1xuICBhY2Nlc3M6IFwic2NvcGVkXCIgfCBcImZ1bGxcIjtcbiAgLyoqIFdoZXRoZXIgdGhlIE1DUCB0cmFuc3BvcnQgaXMgbW91bnRlZCAoc28gYC9tY3AvKmAgaXMgbGVnaXRpbWF0ZSkuICovXG4gIG1jcEVuYWJsZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogTW91bnQtcmVsYXRpdmUgYWdlbnQgaW5mZXJlbmNlIHBhdGhzIChgL2FnZW50cy86aWQvPHZlcmI+Li4uYCkuIE1hdGNoZWRcbiAqIGJ5IHByZWZpeCBvbiB0aGUgdmVyYiBzbyBmdXR1cmUgdmFyaWFudHMgKGBzdHJlYW1WTmV4dGAsIGBzdHJlYW0vdm5leHRgLFxuICogYGdlbmVyYXRlVk5leHRgKSBzdGF5IGNvdmVyZWQgd2l0aG91dCBhIGNvZGUgY2hhbmdlLlxuICpcbiAqIENvdmVycyB0aGUgcGxhaW4gaW5mZXJlbmNlIHZlcmJzIChgc3RyZWFtYCAvIGBnZW5lcmF0ZWAgLyBgbmV0d29ya2ApIHBsdXNcbiAqIHRoZSBodW1hbi1pbi10aGUtbG9vcCByZXN1bWUgdmVyYnMgYSBwYXVzZWQgYHJlcXVpcmVBcHByb3ZhbGAgdG9vbCBuZWVkc1xuICogdG8gY29udGludWU6IGBhcHByb3ZlLXRvb2wtY2FsbGAgLyBgZGVjbGluZS10b29sLWNhbGxgIChzdHJlYW1pbmcsIGFuZCB2aWFcbiAqIHByZWZpeCB0aGVpciBgLWdlbmVyYXRlYCBub24tc3RyZWFtaW5nIHZhcmlhbnRzKSwgdGhlIGAtbmV0d29yay1gIHZhcmlhbnRzLFxuICogYW5kIGByZXN1bWUtc3RyZWFtYCAoY292ZXJzIGByZXN1bWUtc3RyZWFtLXVudGlsLWlkbGVgKS4gV2l0aG91dCB0aGVzZSBhblxuICogYXBwcm92YWwtZ2F0ZWQgdG9vbCAoZS5nLiBgc2VuZF9lbWFpbGApIGNhbiBiZSByZXF1ZXN0ZWQgYnV0IG5ldmVyIGFwcHJvdmVkXG4gKiBmcm9tIHRoZSBicm93c2VyIC0gdGhlIHJlc3VtZSBgUE9TVGAgNDAzcyB1bmRlciBzY29wZWQgbW9kZS4gVG9nZXRoZXIgd2l0aFxuICogdGhlIHJlc291cmNlLXNjb3BlZCBtZW1vcnkgbXV0YXRpb25zIGJlbG93LCB0aGVzZSBhcmUgdGhlIG9ubHkgc3RvY2sgTWFzdHJhXG4gKiB3cml0ZXMgdGhlIGJyb3dzZXIgY2xpZW50IGNhbiBtYWtlLlxuICovXG5jb25zdCBBR0VOVF9JTkZFUkVOQ0UgPVxuICAvXlxcL2FnZW50c1xcL1teL10rXFwvKHN0cmVhbXxnZW5lcmF0ZXxuZXR3b3JrfHJlc3VtZS1zdHJlYW18YXBwcm92ZS10b29sLWNhbGx8ZGVjbGluZS10b29sLWNhbGx8YXBwcm92ZS1uZXR3b3JrLXRvb2wtY2FsbHxkZWNsaW5lLW5ldHdvcmstdG9vbC1jYWxsKS9pO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcmVhZC1vbmx5IGFnZW50IG1ldGFkYXRhIChgL2FnZW50c2AsIGAvYWdlbnRzLzppZGApLiAqL1xuY29uc3QgQUdFTlRfTUVUQURBVEEgPSAvXlxcL2FnZW50cyhcXC9bXi9dKyk/JC87XG4vKiogUGVyc2lzdGVkIGFwcHJvdmFsIGRpc2NvdmVyeSBmb3Igb25lIGFnZW50LiAqL1xuY29uc3QgQUdFTlRfU1VTUEVOREVEX1JVTlMgPSAvXlxcL2FnZW50c1xcL1teL10rXFwvc3VzcGVuZGVkLXJ1bnMkL2k7XG4vKiogT2ZmaWNpYWwgQUkgU0RLIFVJIHN0cmVhbSByb3V0ZSwgaW5jbHVkaW5nIGByZXN1bWVEYXRhYCBjb250aW51YXRpb25zLiAqL1xuY29uc3QgQUdFTlRfQ0hBVCA9IC9eXFwvY2hhdFxcL1teL10rJC9pO1xuLyoqIE5hdGl2ZSByZXNvdXJjZS1zY29wZWQgbWVtb3J5IHJlYWRzIHVzZWQgYnkgaGlzdG9yeSBhbmQgdGhlIHRocmVhZCBsaXN0LiAqL1xuY29uc3QgTUVNT1JZX1JFQUQgPSAvXlxcL21lbW9yeVxcL3RocmVhZHMoPzpcXC9bXi9dKyg/OlxcL21lc3NhZ2VzKT8pPyQvaTtcbi8qKiBOYXRpdmUgdGhyZWFkIHJlbmFtZS9kZWxldGUgcm91dGVzLiAqL1xuY29uc3QgTUVNT1JZX1RIUkVBRF9NVVRBVElPTiA9IC9eXFwvbWVtb3J5XFwvdGhyZWFkc1xcL1teL10rJC9pO1xuXG4vKipcbiAqIFdoZXRoZXIgYSByZXF1ZXN0IHRvIHRoZSBzdG9jayBgQG1hc3RyYS9leHByZXNzYCBzdWItYXBwIHNob3VsZCBiZVxuICogZGlzcGF0Y2hlZCwgZ2l2ZW4gdGhlIGNvbmZpZ3VyZWQge0BsaW5rIE1hc3RyYUFwaUdhdGVPcHRpb25zLmFjY2Vzc30uXG4gKlxuICogYHBhdGhgIGlzIG1vdW50LXJlbGF0aXZlICh3aGF0IHRoZSBwbHVnaW4ncyBjYXRjaC1hbGwgc2VlcywgZS5nLlxuICogYC9jaGF0L3hgLCBgL21lbW9yeS90aHJlYWRzYCwgYC9tY3AvLi4uYCkuIEluIGBcInNjb3BlZFwiYFxuICogbW9kZSB0aGUgYWxsb3dsaXN0IGlzIGRlbGliZXJhdGVseSB0aWdodCAtIHRoZSBjaGF0IGNsaWVudCBvbmx5IGV2ZXJcbiAqIG5lZWRzIGFnZW50IGluZmVyZW5jZSwgcmVhZC1vbmx5IGFnZW50IG1ldGFkYXRhLCByZXNvdXJjZS1zY29wZWQgbWVtb3J5LFxuICogdGhpcyBwbHVnaW4ncyBvd24gYC9yb3V0ZS8qYCByb3V0ZXMsIGFuZCAod2hlbiBlbmFibGVkKSBNQ1AuIFRoZSByZW1haW5pbmdcbiAqIGFkbWluLCBtdXRhdGluZywgYW5kIGJ1bGstZXhwb3J0IHN1cmZhY2Ugc3RheXMgZGVuaWVkIGJ5IGRlZmF1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01hc3RyYVJlcXVlc3RBbGxvd2VkKFxuICBtZXRob2Q6IHN0cmluZyxcbiAgcGF0aDogc3RyaW5nLFxuICBvcHRzOiBNYXN0cmFBcGlHYXRlT3B0aW9ucyxcbik6IGJvb2xlYW4ge1xuICBpZiAob3B0cy5hY2Nlc3MgPT09IFwiZnVsbFwiKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgcCA9IHBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoIDogYC8ke3BhdGh9YDtcbiAgLy8gVGhlIHBsdWdpbidzIGAvcm91dGUvKmAgYWRkaXRpb25zIHZhbGlkYXRlIHRoZWlyIG93biBpbnB1dHMgYW5kIHRydXN0ZWRcbiAgLy8gQXBwS2l0IHJlcXVlc3QgY29udGV4dCBiZWZvcmUgcmVhY2hpbmcgcHJvZHVjdCBiZWhhdmlvci5cbiAgaWYgKHAgPT09IFwiL3JvdXRlXCIgfHwgcC5zdGFydHNXaXRoKFwiL3JvdXRlL1wiKSkgcmV0dXJuIHRydWU7XG4gIGlmIChvcHRzLm1jcEVuYWJsZWQgJiYgKHAgPT09IFwiL21jcFwiIHx8IHAuc3RhcnRzV2l0aChcIi9tY3AvXCIpKSkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IG0gPSBtZXRob2QudG9VcHBlckNhc2UoKTtcbiAgaWYgKG0gPT09IFwiUE9TVFwiICYmIEFHRU5UX0NIQVQudGVzdChwKSkgcmV0dXJuIHRydWU7XG4gIGlmIChtID09PSBcIlBPU1RcIiAmJiBBR0VOVF9JTkZFUkVOQ0UudGVzdChwKSkgcmV0dXJuIHRydWU7XG4gIGlmIChtID09PSBcIkdFVFwiICYmIChBR0VOVF9NRVRBREFUQS50ZXN0KHApIHx8IEFHRU5UX1NVU1BFTkRFRF9SVU5TLnRlc3QocCkpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiR0VUXCIgJiYgTUVNT1JZX1JFQUQudGVzdChwKSkgcmV0dXJuIHRydWU7XG4gIGlmICgobSA9PT0gXCJQQVRDSFwiIHx8IG0gPT09IFwiREVMRVRFXCIpICYmIE1FTU9SWV9USFJFQURfTVVUQVRJT04udGVzdChwKSkgcmV0dXJuIHRydWU7XG4gIGlmIChtID09PSBcIlBPU1RcIiAmJiBwID09PSBcIi9tZW1vcnkvbWVzc2FnZXMvZGVsZXRlXCIpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogS2VlcCBNYXN0cmEgY3VzdG9tIEFQSSByb3V0ZXMgbW91bnQtcmVsYXRpdmUgd2hlbiB0aGUgRXhwcmVzcyBzdWJhcHAgaXNcbiAqIGhvc3RlZCB1bmRlciBBcHBLaXQncyBgL2FwaS88cGx1Z2luPmAgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaFJvdXRlUGF0Y2hNaWRkbGV3YXJlKGFwcDogZXhwcmVzcy5FeHByZXNzKTogdm9pZCB7XG4gIGFwcC51c2UoKHJlcSwgX3JlcywgbmV4dCkgPT4ge1xuICAgIGNvbnN0IGlzQ3VzdG9tUm91dGUgPVxuICAgICAgcmVxLnBhdGggPT09IFwiL2NoYXRcIiB8fFxuICAgICAgcmVxLnBhdGguc3RhcnRzV2l0aChcIi9jaGF0L1wiKSB8fFxuICAgICAgcmVxLnBhdGggPT09IFwiL3JvdXRlXCIgfHxcbiAgICAgIHJlcS5wYXRoLnN0YXJ0c1dpdGgoXCIvcm91dGUvXCIpO1xuICAgIGlmICghaXNDdXN0b21Sb3V0ZSkgcmV0dXJuIG5leHQoKTtcbiAgICByZXEub3JpZ2luYWxVcmwgPSByZXEucGF0aDtcbiAgICBuZXh0KCk7XG4gIH0pO1xufVxuIl19
@@ -17,6 +17,8 @@ import type { MastraPluginConfig } from "./config.ts";
17
17
  * reads it before falling back to the agent / plugin default.
18
18
  */
19
19
  export declare const MASTRA_MODEL_OVERRIDE_KEY = "mastra__model_override";
20
+ /** RequestContext key carrying the endpoint selected for the active agent step. */
21
+ export declare const MASTRA_RESOLVED_MODEL_KEY = "mastra__resolved_model";
20
22
  /**
21
23
  * Minimal Express-ish request shape used by {@link extractModelOverride}.
22
24
  * Keeps this module independent of `express` so the helper can be