@dbx-tools/appkit-mastra 0.9.67 → 0.9.68

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.
@@ -47,7 +47,7 @@ import { Observability } from "@mastra/observability";
47
47
  import { OtelBridge } from "@mastra/otel-bridge";
48
48
  import { propagation } from "@opentelemetry/api";
49
49
  import { TRACE_REQUEST_CONTEXT_KEYS } from "./config.js";
50
- import { initializeDirectMlflowTracing, mlflowEnabled } from "./mlflow.js";
50
+ import { initializeAppMlflowTraceInfo, initializeDirectMlflowTracing, mlflowEnabled, } from "./mlflow.js";
51
51
  const logger = log.logger("mastra/observability");
52
52
  const DEFAULT_SERVICE_NAME = "mastra";
53
53
  /** True when AppKit's global OTel pipeline is configured to export traces. */
@@ -84,6 +84,7 @@ export async function buildObservability(options) {
84
84
  const otelBase = process.env.OTEL_EXPORTER_OTLP_ENDPOINT;
85
85
  const otelTracesOverride = process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT;
86
86
  const otlpConfigured = isOtlpTracingConfigured();
87
+ const appMlflowTraceInfo = options?.enabled === false ? false : await initializeAppMlflowTraceInfo();
87
88
  const directMlflowConfigured = options?.enabled === false || otlpConfigured ? false : await initializeDirectMlflowTracing();
88
89
  if (directMlflowConfigured)
89
90
  configureOtelPropagation();
@@ -120,7 +121,13 @@ export async function buildObservability(options) {
120
121
  otelBase: otelBase ?? "<unset>",
121
122
  resolvedTracesUrl: resolvedTracesUrl ?? "<unset>",
122
123
  feedback,
123
- observability: directMlflowConfigured ? "mlflow-direct" : feedback ? "mlflow" : "otel",
124
+ observability: directMlflowConfigured
125
+ ? "mlflow-direct"
126
+ : appMlflowTraceInfo
127
+ ? "mlflow-apps"
128
+ : feedback
129
+ ? "mlflow"
130
+ : "otel",
124
131
  });
125
132
  return new Observability({
126
133
  configs: {
@@ -132,4 +139,4 @@ export async function buildObservability(options) {
132
139
  },
133
140
  });
134
141
  }
135
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzZXJ2YWJpbGl0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vYnNlcnZhYmlsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQ0c7QUFFSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWpELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6RCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTNFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUVsRCxNQUFNLG9CQUFvQixHQUFHLFFBQVEsQ0FBQztBQXFDdEMsOEVBQThFO0FBQzlFLE1BQU0sVUFBVSx1QkFBdUI7SUFDckMsT0FBTyxPQUFPLENBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxDQUMxRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QjtJQUN0QyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ2hGLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN0QixNQUFNLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxFQUFFO1FBQ2hELE9BQU8sRUFBRSx1QkFBdUI7S0FDakMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsa0JBQWtCLENBQ3RDLE9BQW1DO0lBRW5DLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUM7SUFDekQsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxDQUFDO0lBQzFFLE1BQU0sY0FBYyxHQUFHLHVCQUF1QixFQUFFLENBQUM7SUFDakQsTUFBTSxzQkFBc0IsR0FDMUIsT0FBTyxFQUFFLE9BQU8sS0FBSyxLQUFLLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sNkJBQTZCLEVBQUUsQ0FBQztJQUMvRixJQUFJLHNCQUFzQjtRQUFFLHdCQUF3QixFQUFFLENBQUM7SUFDdkQsTUFBTSxpQkFBaUIsR0FBRyxjQUFjLElBQUksc0JBQXNCLENBQUM7SUFFbkUsSUFBSSxPQUFPLEVBQUUsT0FBTyxLQUFLLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEtBQUssSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1FBQ3BGLE1BQU0sQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUU7WUFDdEMsTUFBTSxFQUNKLE9BQU8sRUFBRSxPQUFPLEtBQUssS0FBSztnQkFDeEIsQ0FBQyxDQUFDLDJCQUEyQjtnQkFDN0IsQ0FBQyxDQUFDLHlEQUF5RDtTQUNoRSxDQUFDLENBQUM7UUFDSCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcsT0FBTyxFQUFFLFdBQVcsSUFBSSxDQUFDLE1BQU0sWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksb0JBQW9CLENBQUM7SUFDaEcsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsa0JBQWtCLElBQUksMEJBQTBCLENBQUMsQ0FBQyxDQUFDO0lBRTVGLG1FQUFtRTtJQUNuRSxzREFBc0Q7SUFDdEQscUVBQXFFO0lBQ3JFLGdFQUFnRTtJQUNoRSxtRUFBbUU7SUFDbkUsa0VBQWtFO0lBQ2xFLDZCQUE2QjtJQUM3QixNQUFNLGlCQUFpQixHQUFHLGtCQUFrQjtRQUMxQyxDQUFDLENBQUMsa0JBQWtCO1FBQ3BCLENBQUMsQ0FBQyxRQUFRO1lBQ1IsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFlBQVk7WUFDN0MsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoQix1RUFBdUU7SUFDdkUsb0VBQW9FO0lBQ3BFLHVEQUF1RDtJQUN2RCxNQUFNLFFBQVEsR0FBRyxhQUFhLEVBQUUsQ0FBQztJQUNqQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxFQUFFO1FBQzVELFdBQVc7UUFDWCxrQkFBa0I7UUFDbEIsUUFBUSxFQUFFLFFBQVEsSUFBSSxTQUFTO1FBQy9CLGlCQUFpQixFQUFFLGlCQUFpQixJQUFJLFNBQVM7UUFDakQsUUFBUTtRQUNSLGFBQWEsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTTtLQUN2RixDQUFDLENBQUM7SUFFSCxPQUFPLElBQUksYUFBYSxDQUFDO1FBQ3ZCLE9BQU8sRUFBRTtZQUNQLFdBQVcsRUFBRTtnQkFDWCxXQUFXO2dCQUNYLE1BQU0sRUFBRSxJQUFJLFVBQVUsRUFBRTtnQkFDeEIsa0JBQWtCO2FBQ25CO1NBQ0Y7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNYXN0cmEgb2JzZXJ2YWJpbGl0eSB3aXJlZCB0aHJvdWdoIHRoZSBzYW1lIE9UZWwgcGlwZWxpbmUgQXBwS2l0J3NcbiAqIGJ1aWx0LWluIHBsdWdpbnMgKGUuZy4gYGFnZW50c2ApIHVzZSwgdmlhIGBAbWFzdHJhL290ZWwtYnJpZGdlYC5cbiAqXG4gKiBIb3cgdHJhY2VzIGZsb3c6XG4gKlxuICogMS4gYEBkYXRhYnJpY2tzL2FwcGtpdGAgYm9vdHMgYSBnbG9iYWwgYE5vZGVTREtgIGluXG4gKiAgICBgVGVsZW1ldHJ5TWFuYWdlci5pbml0aWFsaXplKClgIChkdXJpbmcgYGNyZWF0ZUFwcGApIHdoZW5cbiAqICAgIGBPVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlRgIGlzIHNldCBpbiB0aGUgcHJvY2VzcyBlbnYuXG4gKiAyLiBFdmVyeSBBcHBLaXQgcGx1Z2luIHNwYW4gKGUuZy4gdGhlIGBhZ2VudHNgIHBsdWdpbidzXG4gKiAgICBgZXhlY3V0ZVN0cmVhbWApIGlzIGNyZWF0ZWQgdmlhIHRoZSBnbG9iYWwgT1RlbCB0cmFjZXJcbiAqICAgIChgdHJhY2UuZ2V0VHJhY2VyKDxwbHVnaW4+KWApLCBzbyBpdCBsYW5kcyBvbiB0aGF0IE5vZGVTREsgYW5kXG4gKiAgICBpcyBzaGlwcGVkIHRocm91Z2ggaXRzIE9UTFAgZXhwb3J0ZXIuXG4gKiAzLiBUaGUgTWFzdHJhIGBPdGVsQnJpZGdlYCBBTFNPIGNyZWF0ZXMgcmVhbCBPVGVsIHNwYW5zIG9uIHRoZSBzYW1lXG4gKiAgICBnbG9iYWwgdHJhY2VyIGZvciBldmVyeSBNYXN0cmEgb3BlcmF0aW9uIChhZ2VudCBydW5zLCBtb2RlbFxuICogICAgY2FsbHMsIHRvb2wgaW52b2NhdGlvbnMsIHdvcmtmbG93IHN0ZXBzKS4gVGhleSBpbmhlcml0IHRoZVxuICogICAgYW1iaWVudCBPVGVsIGNvbnRleHQsIHNvIHdoZW4gTWFzdHJhIGlzIGludm9rZWQgZnJvbSBpbnNpZGUgYW5cbiAqICAgIEFwcEtpdCBIVFRQIHNwYW4gdGhlIHRyYWNlIHN0YXlzIGNvbm5lY3RlZC5cbiAqXG4gKiBOZXQgZWZmZWN0OiBNYXN0cmEgc3BhbnMgZ2V0IGV4YWN0bHkgdGhlIHRyZWF0bWVudCBBcHBLaXQnc1xuICogYGFnZW50c2AgcGx1Z2luIGdldHMuIE5vIGN1c3RvbSBPVExQIHBpcGVsaW5lIGxpdmVzIGluIHRoaXNcbiAqIHBhY2thZ2U7IHRoZSBPVExQIGVuZHBvaW50LCBoZWFkZXJzLCBhbmQgcmVzb3VyY2UgYXR0cmlidXRlcyBhcmVcbiAqIGRyaXZlbiBieSB0aGUgc3RhbmRhcmQgT1RlbCBlbnYgdmFyc1xuICogKGBPVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlRgLCBgT1RFTF9FWFBPUlRFUl9PVExQX0hFQURFUlNgLFxuICogYE9URUxfU0VSVklDRV9OQU1FYCwgYE9URUxfUkVTT1VSQ0VfQVRUUklCVVRFU2AsIC4uLikgYW5kIGNvbnN1bWVkXG4gKiBieSBBcHBLaXQncyBgVGVsZW1ldHJ5TWFuYWdlcmAuIFNldCB0aG9zZSBvbmNlIGFuZCBib3RoIEFwcEtpdCBhbmRcbiAqIE1hc3RyYSBzcGFucyBlbmQgdXAgYXQgdGhlIHNhbWUgYmFja2VuZC5cbiAqXG4gKiBXaGVuIGBPVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlRgIGlzIHVuc2V0IHRoZSBicmlkZ2UgaXMgbm90XG4gKiByZWdpc3RlcmVkIGF0IGFsbCAodW5sZXNzIGBvYnNlcnZhYmlsaXR5OiB0cnVlYCBmb3JjZXMgaXQgb24pLCBzb1xuICogTWFzdHJhIGRvZXMgbm90IGVtaXQgYFtPdGVsQnJpZGdlXSBObyBPVEVMIHNwYW4gZm91bmRgIHdhcm5pbmdzLlxuICpcbiAqIE9uIERhdGFicmlja3MgQXBwcyB0aGUgc3VwcG9ydGVkIHNpbmsgaXMgVW5pdHkgQ2F0YWxvZyB2aWFcbiAqIGB0ZWxlbWV0cnlfZXhwb3J0X2Rlc3RpbmF0aW9uc2AgKHRoZSBwbGF0Zm9ybSBpbmplY3RzIHRoZSBsb2NhbCBPVExQXG4gKiBzaWRlY2FyKS4gTWFuYWdlZCBNTGZsb3cgaGFzIG5vIE9UTFAgaW5nZXN0IGVuZHBvaW50IC0gZG8gbm90IHBvaW50XG4gKiBgT1RFTF9FWFBPUlRFUl9PVExQXypgIGF0IHRoZSB3b3Jrc3BhY2UgaG9zdC4gU2V0XG4gKiBgT1RFTF9QUk9QQUdBVE9SUz1ub25lYCBzbyBBcHBzIGluZ3Jlc3MgYHRyYWNlcGFyZW50YCBkb2VzIG5vdCBoaWRlXG4gKiBldmVyeSByZXF1ZXN0LXNjb3BlZCByb290IHNwYW4gZnJvbSB0aGUgVUMgYCpfdHJhY2VfdW5pZmllZGAgdmlldy5cbiAqIENoYXQgcmVxdWVzdC9yZXNwb25zZSBvbiB0aGF0IHJvb3Qgc3BhbiBpcyBzdGFtcGVkIGJ5XG4gKiBgdGVsZW1ldHJ5LmF0dGFjaENoYXRUdXJuVGVsZW1ldHJ5YCAoc2VlIGB0ZWxlbWV0cnkudHNgKS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgcHJvamVjdFV0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IE9ic2VydmFiaWxpdHkgfSBmcm9tIFwiQG1hc3RyYS9vYnNlcnZhYmlsaXR5XCI7XG5pbXBvcnQgeyBPdGVsQnJpZGdlIH0gZnJvbSBcIkBtYXN0cmEvb3RlbC1icmlkZ2VcIjtcbmltcG9ydCB7IHByb3BhZ2F0aW9uIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuXG5pbXBvcnQgeyBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZUyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgaW5pdGlhbGl6ZURpcmVjdE1sZmxvd1RyYWNpbmcsIG1sZmxvd0VuYWJsZWQgfSBmcm9tIFwiLi9tbGZsb3cudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9vYnNlcnZhYmlsaXR5XCIpO1xuXG5jb25zdCBERUZBVUxUX1NFUlZJQ0VfTkFNRSA9IFwibWFzdHJhXCI7XG5cbi8qKiBPcHRpb25zIGZvciBjb25uZWN0aW5nIE1hc3RyYSBzcGFucyB0byBBcHBLaXQncyBPcGVuVGVsZW1ldHJ5IHBpcGVsaW5lLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZE9ic2VydmFiaWxpdHlPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gd2lyZSB0aGUgTWFzdHJhIGBPdGVsQnJpZGdlYC4gTWlycm9yc1xuICAgKiB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLm9ic2VydmFiaWxpdHl9OlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChhdXRvKTogb24gb25seSB3aGVuIGBPVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlRgIG9yXG4gICAqICAgYE9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfRU5EUE9JTlRgIGlzIHNldCAoc2FtZSBzaWduYWwgQXBwS2l0J3NcbiAgICogICBgVGVsZW1ldHJ5TWFuYWdlcmAgdXNlcyB0byByZWdpc3RlciBhIHJlYWwgdHJhY2VyKS4gV2hlbiB1bnNldCxcbiAgICogICBza2lwIHRoZSBicmlkZ2UgZW50aXJlbHkgc28gTWFzdHJhIGRvZXMgbm90IGVtaXRcbiAgICogICBgW090ZWxCcmlkZ2VdIE5vIE9URUwgc3BhbiBmb3VuZGAgd2FybmluZ3Mgb24gdGhlIG5vb3AgdHJhY2VyLlxuICAgKiAtIGB0cnVlYDogZm9yY2Ugb24gZXZlbiB3aXRob3V0IGFuIE9UTFAgZW5kcG9pbnQuXG4gICAqIC0gYGZhbHNlYDogZm9yY2Ugb2ZmLlxuICAgKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTZXJ2aWNlIG5hbWUgYXR0YWNoZWQgdG8gdGhlIE1hc3RyYSBgT2JzZXJ2YWJpbGl0eWAgY29uZmlnLiBVc2VkXG4gICAqIGFzIHRoZSB0cmFjZXIgc2NvcGUgbmFtZSBvbiBicmlkZ2VkIE9UZWwgc3BhbnMgKHRoZSBgc2VydmljZS5uYW1lYFxuICAgKiByZXNvdXJjZSBhdHRyaWJ1dGUgaXMgb3duZWQgYnkgQXBwS2l0J3MgYFRlbGVtZXRyeU1hbmFnZXJgIGluc3RlYWRcbiAgICogLSBpdCByZWFkcyBgT1RFTF9TRVJWSUNFX05BTUVgIC8gYERBVEFCUklDS1NfQVBQX05BTUVgIGF0XG4gICAqIGBjcmVhdGVBcHBgIHRpbWUpLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBwcm9qZWN0IG5hbWUgdGhlbiBgXCJtYXN0cmFcImAuXG4gICAqL1xuICBzZXJ2aWNlTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIGBSZXF1ZXN0Q29udGV4dGAga2V5cyB0byBleHRyYWN0IGFzIHNwYW4gbWV0YWRhdGEgb24gZXZlcnkgTWFzdHJhXG4gICAqIHRyYWNlLiBEZWZhdWx0cyB0byB7QGxpbmsgVFJBQ0VfUkVRVUVTVF9DT05URVhUX0tFWVN9ICh1c2VyIGlkLFxuICAgKiB0aHJlYWQgaWQsIHJlcXVlc3QgaWQsIGVudmlyb25tZW50LCBtb2RlbCBvdmVycmlkZSwgLi4uKS5cbiAgICpcbiAgICogU3VwcG9ydHMgZG90IG5vdGF0aW9uIGZvciBuZXN0ZWQgdmFsdWVzIHBlciB0aGUgTWFzdHJhIGRvY3MuXG4gICAqL1xuICByZXF1ZXN0Q29udGV4dEtleXM/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqIFRydWUgd2hlbiBBcHBLaXQncyBnbG9iYWwgT1RlbCBwaXBlbGluZSBpcyBjb25maWd1cmVkIHRvIGV4cG9ydCB0cmFjZXMuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPdGxwVHJhY2luZ0NvbmZpZ3VyZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiBCb29sZWFuKFxuICAgIHByb2Nlc3MuZW52Lk9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVCB8fCBwcm9jZXNzLmVudi5PVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0VORFBPSU5ULFxuICApO1xufVxuXG4vKipcbiAqIEhvbm9yIHRoZSBzdGFuZGFyZCBuby1vcCBwcm9wYWdhdG9yIHNldHRpbmcgYWZ0ZXIgQXBwS2l0IHJlZ2lzdGVycyBpdHNcbiAqIHRyYWNlciBwcm92aWRlci4gQXBwS2l0IDAuODEgaW5zdGFsbHMgVzNDIHByb3BhZ2F0aW9uIHVuY29uZGl0aW9uYWxseSwgc29cbiAqIGRpc2FibGluZyBvbmx5IHRoZSBnbG9iYWwgcHJvcGFnYXRvciBrZWVwcyBhc3luYyBzcGFuIGNvbnRleHQgYWN0aXZlIHdoaWxlXG4gKiBwcmV2ZW50aW5nIGluZ3Jlc3MgZXh0cmFjdGlvbiBhbmQgZG93bnN0cmVhbSBpbmplY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVPdGVsUHJvcGFnYXRpb24oKTogYm9vbGVhbiB7XG4gIGlmIChwcm9jZXNzLmVudi5PVEVMX1BST1BBR0FUT1JTPy50cmltKCkudG9Mb3dlckNhc2UoKSAhPT0gXCJub25lXCIpIHJldHVybiBmYWxzZTtcbiAgcHJvcGFnYXRpb24uZGlzYWJsZSgpO1xuICBsb2dnZXIuaW5mbyhcIk9wZW5UZWxlbWV0cnkgcHJvcGFnYXRpb24gZGlzYWJsZWRcIiwge1xuICAgIHNldHRpbmc6IFwiT1RFTF9QUk9QQUdBVE9SUz1ub25lXCIsXG4gIH0pO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIE1hc3RyYSBgT2JzZXJ2YWJpbGl0eWAgd2hvc2Ugc3BhbnMgcmlkZSBBcHBLaXQncyBnbG9iYWxcbiAqIE9UZWwgcGlwZWxpbmUgdmlhIGBAbWFzdHJhL290ZWwtYnJpZGdlYC5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdHJhY2luZyBpcyBvZmY6IGVpdGhlciB0aGUgY2FsbGVyIHBhc3NlZFxuICogYGVuYWJsZWQ6IGZhbHNlYCwgb3IgYXV0byBtb2RlIGZpbmRzIG5laXRoZXIgQXBwS2l0IE9UTFAgbm9yIGEgbG9jYWwgTUxmbG93XG4gKiBleHBlcmltZW50LlxuICogU2tpcHBpbmcgdGhlIGJyaWRnZSBpbiB0aGF0IGNhc2UgYXZvaWRzIGBbT3RlbEJyaWRnZV0gTm8gT1RFTCBzcGFuXG4gKiBmb3VuZGAgbG9nIHNwYW0gZnJvbSBNYXN0cmEgc3BhbnMgdGhhdCBoYXZlIG5vIHBhcmVudCBvbiB0aGUgbm9vcFxuICogdHJhY2VyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRPYnNlcnZhYmlsaXR5KFxuICBvcHRpb25zPzogQnVpbGRPYnNlcnZhYmlsaXR5T3B0aW9ucyxcbik6IFByb21pc2U8T2JzZXJ2YWJpbGl0eSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBvdGVsQmFzZSA9IHByb2Nlc3MuZW52Lk9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVDtcbiAgY29uc3Qgb3RlbFRyYWNlc092ZXJyaWRlID0gcHJvY2Vzcy5lbnYuT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19FTkRQT0lOVDtcbiAgY29uc3Qgb3RscENvbmZpZ3VyZWQgPSBpc090bHBUcmFjaW5nQ29uZmlndXJlZCgpO1xuICBjb25zdCBkaXJlY3RNbGZsb3dDb25maWd1cmVkID1cbiAgICBvcHRpb25zPy5lbmFibGVkID09PSBmYWxzZSB8fCBvdGxwQ29uZmlndXJlZCA/IGZhbHNlIDogYXdhaXQgaW5pdGlhbGl6ZURpcmVjdE1sZmxvd1RyYWNpbmcoKTtcbiAgaWYgKGRpcmVjdE1sZmxvd0NvbmZpZ3VyZWQpIGNvbmZpZ3VyZU90ZWxQcm9wYWdhdGlvbigpO1xuICBjb25zdCB0cmFjaW5nQ29uZmlndXJlZCA9IG90bHBDb25maWd1cmVkIHx8IGRpcmVjdE1sZmxvd0NvbmZpZ3VyZWQ7XG5cbiAgaWYgKG9wdGlvbnM/LmVuYWJsZWQgPT09IGZhbHNlIHx8IChvcHRpb25zPy5lbmFibGVkICE9PSB0cnVlICYmICF0cmFjaW5nQ29uZmlndXJlZCkpIHtcbiAgICBsb2dnZXIuaW5mbyhcIk1hc3RyYSBvYnNlcnZhYmlsaXR5IG9mZlwiLCB7XG4gICAgICByZWFzb246XG4gICAgICAgIG9wdGlvbnM/LmVuYWJsZWQgPT09IGZhbHNlXG4gICAgICAgICAgPyBcImRpc2FibGVkIGluIHBsdWdpbiBjb25maWdcIlxuICAgICAgICAgIDogXCJubyBPVExQIGVuZHBvaW50IG9yIGRpcmVjdCBNTGZsb3cgZXhwZXJpbWVudCBjb25maWd1cmVkXCIsXG4gICAgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHNlcnZpY2VOYW1lID0gb3B0aW9ucz8uc2VydmljZU5hbWUgPz8gKGF3YWl0IHByb2plY3RVdGlscy5uYW1lKCkpID8/IERFRkFVTFRfU0VSVklDRV9OQU1FO1xuICBjb25zdCByZXF1ZXN0Q29udGV4dEtleXMgPSBbLi4uKG9wdGlvbnM/LnJlcXVlc3RDb250ZXh0S2V5cyA/PyBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZUyldO1xuXG4gIC8vIFRoZSBPVGVsIEhUVFAgZXhwb3J0ZXIgdHJlYXRzIGBPVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlRgIGFzIGFcbiAgLy8gKmJhc2UqIFVSTCBhbmQgYXBwZW5kcyB0aGUgc2lnbmFsIHBhdGggaXRzZWxmIChlLmcuXG4gIC8vIGBodHRwOi8vbG9jYWxob3N0OjYwMDZgIC0+IGBodHRwOi8vbG9jYWxob3N0OjYwMDYvdjEvdHJhY2VzYCkuIExvZ1xuICAvLyB0aGUgcmVzb2x2ZWQgUE9TVCBVUkwgc28gbWlzY29uZmlndXJhdGlvbnMgKGUuZy4gYWNjaWRlbnRhbGx5XG4gIC8vIHNldHRpbmcgdGhlIGJhc2UgdmFyIHRvIGEgYC92MS90cmFjZXNgLXN1ZmZpeGVkIFVSTCwgd2hpY2ggbWFrZXNcbiAgLy8gdGhlIFNESyBQT1NUIHRvIGAuLi4vdjEvdHJhY2VzL3YxL3RyYWNlc2AgYW5kIFBob2VuaXggNDA0cykgYXJlXG4gIC8vIG9idmlvdXMgaW4gc3RhcnR1cCBvdXRwdXQuXG4gIGNvbnN0IHJlc29sdmVkVHJhY2VzVXJsID0gb3RlbFRyYWNlc092ZXJyaWRlXG4gICAgPyBvdGVsVHJhY2VzT3ZlcnJpZGVcbiAgICA6IG90ZWxCYXNlXG4gICAgICA/IGAke290ZWxCYXNlLnJlcGxhY2UoL1xcLyskLywgXCJcIil9L3YxL3RyYWNlc2BcbiAgICAgIDogdW5kZWZpbmVkO1xuICAvLyBgbWxmbG93RW5hYmxlZGAgaXMgdGhlIHNhbWUgZ2F0ZSB0aGF0IGZsaXBzIGNoYXQgZmVlZGJhY2sgb24sIHNvIHRoZVxuICAvLyBib290IGxpbmUgaXMgdGhlIG9uZS1nbGFuY2UgY2hlY2sgdGhhdCBib3RoIGhhbHZlcyBvZiB0aGUgQXBwcyBVQ1xuICAvLyBwaXBlbGluZSAoT1RMUCBzaWRlY2FyICsgZXhwZXJpbWVudCBpZCkgYXJlIHByZXNlbnQuXG4gIGNvbnN0IGZlZWRiYWNrID0gbWxmbG93RW5hYmxlZCgpO1xuICBsb2dnZXIuaW5mbyhcIk1hc3RyYSBvYnNlcnZhYmlsaXR5IHdpcmVkIHRocm91Z2ggT1RlbCBicmlkZ2VcIiwge1xuICAgIHNlcnZpY2VOYW1lLFxuICAgIHJlcXVlc3RDb250ZXh0S2V5cyxcbiAgICBvdGVsQmFzZTogb3RlbEJhc2UgPz8gXCI8dW5zZXQ+XCIsXG4gICAgcmVzb2x2ZWRUcmFjZXNVcmw6IHJlc29sdmVkVHJhY2VzVXJsID8/IFwiPHVuc2V0PlwiLFxuICAgIGZlZWRiYWNrLFxuICAgIG9ic2VydmFiaWxpdHk6IGRpcmVjdE1sZmxvd0NvbmZpZ3VyZWQgPyBcIm1sZmxvdy1kaXJlY3RcIiA6IGZlZWRiYWNrID8gXCJtbGZsb3dcIiA6IFwib3RlbFwiLFxuICB9KTtcblxuICByZXR1cm4gbmV3IE9ic2VydmFiaWxpdHkoe1xuICAgIGNvbmZpZ3M6IHtcbiAgICAgIHNlcnZpY2VOYW1lOiB7XG4gICAgICAgIHNlcnZpY2VOYW1lLFxuICAgICAgICBicmlkZ2U6IG5ldyBPdGVsQnJpZGdlKCksXG4gICAgICAgIHJlcXVlc3RDb250ZXh0S2V5cyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzZXJ2YWJpbGl0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vYnNlcnZhYmlsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQ0c7QUFFSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWpELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLDZCQUE2QixFQUM3QixhQUFhLEdBQ2QsTUFBTSxhQUFhLENBQUM7QUFFckIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBRWxELE1BQU0sb0JBQW9CLEdBQUcsUUFBUSxDQUFDO0FBcUN0Qyw4RUFBOEU7QUFDOUUsTUFBTSxVQUFVLHVCQUF1QjtJQUNyQyxPQUFPLE9BQU8sQ0FDWixPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLENBQzFGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCO0lBQ3RDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxNQUFNO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDaEYsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3RCLE1BQU0s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eEIsa0JBQWtCO2FBQ25CO1NBQ0Y7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNYXN0cmEgb2JzZXJ2YWJpbGl0eSB3aXJlZCB0aHJvdWdoIHRoZSBzYW1lIE9UZWwgcGlwZWxpbmUgQXBwS2l0J3NcbiAqIGJ1aWx0LWluIHBsdWdpbnMgKGUuZy4gYGFnZW50c2ApIHVzZSwgdmlhIGBAbWFzdHJhL290ZWwtYnJpZGdlYC5cbiAqXG4gKiBIb3cgdHJhY2VzIGZsb3c6XG4gKlxuICogMS4gYEBkYXRhYnJpY2tzL2FwcGtpdGAgYm9vdHMgYSBnbG9iYWwgYE5vZGVTREtgIGluXG4gKiAgICBgVGVsZW1ldHJ5TWFuYWdlci5pbml0aWFsaXplKClgIChkdXJpbmcgYGNyZWF0ZUFwcGApIHdoZW5cbiAqICAgIGBPVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlRgIGlzIHNldCBpbiB0aGUgcHJvY2VzcyBlbnYuXG4gKiAyLiBFdmVyeSBBcHBLaXQgcGx1Z2luIHNwYW4gKGUuZy4gdGhlIGBhZ2VudHNgIHBsdWdpbidzXG4gKiAgICBgZXhlY3V0ZVN0cmVhbWApIGlzIGNyZWF0ZWQgdmlhIHRoZSBnbG9iYWwgT1RlbCB0cmFjZXJcbiAqICAgIChgdHJhY2UuZ2V0VHJhY2VyKDxwbHVnaW4+KWApLCBzbyBpdCBsYW5kcyBvbiB0aGF0IE5vZGVTREsgYW5kXG4gKiAgICBpcyBzaGlwcGVkIHRocm91Z2ggaXRzIE9UTFAgZXhwb3J0ZXIuXG4gKiAzLiBUaGUgTWFzdHJhIGBPdGVsQnJpZGdlYCBBTFNPIGNyZWF0ZXMgcmVhbCBPVGVsIHNwYW5zIG9uIHRoZSBzYW1lXG4gKiAgICBnbG9iYWwgdHJhY2VyIGZvciBldmVyeSBNYXN0cmEgb3BlcmF0aW9uIChhZ2VudCBydW5zLCBtb2RlbFxuICogICAgY2FsbHMsIHRvb2wgaW52b2NhdGlvbnMsIHdvcmtmbG93IHN0ZXBzKS4gVGhleSBpbmhlcml0IHRoZVxuICogICAgYW1iaWVudCBPVGVsIGNvbnRleHQsIHNvIHdoZW4gTWFzdHJhIGlzIGludm9rZWQgZnJvbSBpbnNpZGUgYW5cbiAqICAgIEFwcEtpdCBIVFRQIHNwYW4gdGhlIHRyYWNlIHN0YXlzIGNvbm5lY3RlZC5cbiAqXG4gKiBOZXQgZWZmZWN0OiBNYXN0cmEgc3BhbnMgZ2V0IGV4YWN0bHkgdGhlIHRyZWF0bWVudCBBcHBLaXQnc1xuICogYGFnZW50c2AgcGx1Z2luIGdldHMuIE5vIGN1c3RvbSBPVExQIHBpcGVsaW5lIGxpdmVzIGluIHRoaXNcbiAqIHBhY2thZ2U7IHRoZSBPVExQIGVuZHBvaW50LCBoZWFkZXJzLCBhbmQgcmVzb3VyY2UgYXR0cmlidXRlcyBhcmVcbiAqIGRyaXZlbiBieSB0aGUgc3RhbmRhcmQgT1RlbCBlbnYgdmFyc1xuICogKGBPVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlRgLCBgT1RFTF9FWFBPUlRFUl9PVExQX0hFQURFUlNgLFxuICogYE9URUxfU0VSVklDRV9OQU1FYCwgYE9URUxfUkVTT1VSQ0VfQVRUUklCVVRFU2AsIC4uLikgYW5kIGNvbnN1bWVkXG4gKiBieSBBcHBLaXQncyBgVGVsZW1ldHJ5TWFuYWdlcmAuIFNldCB0aG9zZSBvbmNlIGFuZCBib3RoIEFwcEtpdCBhbmRcbiAqIE1hc3RyYSBzcGFucyBlbmQgdXAgYXQgdGhlIHNhbWUgYmFja2VuZC5cbiAqXG4gKiBXaGVuIGBPVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlRgIGlzIHVuc2V0IHRoZSBicmlkZ2UgaXMgbm90XG4gKiByZWdpc3RlcmVkIGF0IGFsbCAodW5sZXNzIGBvYnNlcnZhYmlsaXR5OiB0cnVlYCBmb3JjZXMgaXQgb24pLCBzb1xuICogTWFzdHJhIGRvZXMgbm90IGVtaXQgYFtPdGVsQnJpZGdlXSBObyBPVEVMIHNwYW4gZm91bmRgIHdhcm5pbmdzLlxuICpcbiAqIE9uIERhdGFicmlja3MgQXBwcyB0aGUgc3VwcG9ydGVkIHNpbmsgaXMgVW5pdHkgQ2F0YWxvZyB2aWFcbiAqIGB0ZWxlbWV0cnlfZXhwb3J0X2Rlc3RpbmF0aW9uc2AgKHRoZSBwbGF0Zm9ybSBpbmplY3RzIHRoZSBsb2NhbCBPVExQXG4gKiBzaWRlY2FyKS4gTWFuYWdlZCBNTGZsb3cgaGFzIG5vIE9UTFAgaW5nZXN0IGVuZHBvaW50IC0gZG8gbm90IHBvaW50XG4gKiBgT1RFTF9FWFBPUlRFUl9PVExQXypgIGF0IHRoZSB3b3Jrc3BhY2UgaG9zdC4gU2V0XG4gKiBgT1RFTF9QUk9QQUdBVE9SUz1ub25lYCBzbyBBcHBzIGluZ3Jlc3MgYHRyYWNlcGFyZW50YCBkb2VzIG5vdCBoaWRlXG4gKiBldmVyeSByZXF1ZXN0LXNjb3BlZCByb290IHNwYW4gZnJvbSB0aGUgVUMgYCpfdHJhY2VfdW5pZmllZGAgdmlldy5cbiAqIENoYXQgcmVxdWVzdC9yZXNwb25zZSBvbiB0aGF0IHJvb3Qgc3BhbiBpcyBzdGFtcGVkIGJ5XG4gKiBgdGVsZW1ldHJ5LmF0dGFjaENoYXRUdXJuVGVsZW1ldHJ5YCAoc2VlIGB0ZWxlbWV0cnkudHNgKS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgcHJvamVjdFV0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IE9ic2VydmFiaWxpdHkgfSBmcm9tIFwiQG1hc3RyYS9vYnNlcnZhYmlsaXR5XCI7XG5pbXBvcnQgeyBPdGVsQnJpZGdlIH0gZnJvbSBcIkBtYXN0cmEvb3RlbC1icmlkZ2VcIjtcbmltcG9ydCB7IHByb3BhZ2F0aW9uIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuXG5pbXBvcnQgeyBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZUyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHtcbiAgaW5pdGlhbGl6ZUFwcE1sZmxvd1RyYWNlSW5mbyxcbiAgaW5pdGlhbGl6ZURpcmVjdE1sZmxvd1RyYWNpbmcsXG4gIG1sZmxvd0VuYWJsZWQsXG59IGZyb20gXCIuL21sZmxvdy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL29ic2VydmFiaWxpdHlcIik7XG5cbmNvbnN0IERFRkFVTFRfU0VSVklDRV9OQU1FID0gXCJtYXN0cmFcIjtcblxuLyoqIE9wdGlvbnMgZm9yIGNvbm5lY3RpbmcgTWFzdHJhIHNwYW5zIHRvIEFwcEtpdCdzIE9wZW5UZWxlbWV0cnkgcGlwZWxpbmUuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT2JzZXJ2YWJpbGl0eU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byB3aXJlIHRoZSBNYXN0cmEgYE90ZWxCcmlkZ2VgLiBNaXJyb3JzXG4gICAqIHtAbGluayBNYXN0cmFQbHVnaW5Db25maWcub2JzZXJ2YWJpbGl0eX06XG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGF1dG8pOiBvbiBvbmx5IHdoZW4gYE9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVGAgb3JcbiAgICogICBgT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19FTkRQT0lOVGAgaXMgc2V0IChzYW1lIHNpZ25hbCBBcHBLaXQnc1xuICAgKiAgIGBUZWxlbWV0cnlNYW5hZ2VyYCB1c2VzIHRvIHJlZ2lzdGVyIGEgcmVhbCB0cmFjZXIpLiBXaGVuIHVuc2V0LFxuICAgKiAgIHNraXAgdGhlIGJyaWRnZSBlbnRpcmVseSBzbyBNYXN0cmEgZG9lcyBub3QgZW1pdFxuICAgKiAgIGBbT3RlbEJyaWRnZV0gTm8gT1RFTCBzcGFuIGZvdW5kYCB3YXJuaW5ncyBvbiB0aGUgbm9vcCB0cmFjZXIuXG4gICAqIC0gYHRydWVgOiBmb3JjZSBvbiBldmVuIHdpdGhvdXQgYW4gT1RMUCBlbmRwb2ludC5cbiAgICogLSBgZmFsc2VgOiBmb3JjZSBvZmYuXG4gICAqL1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNlcnZpY2UgbmFtZSBhdHRhY2hlZCB0byB0aGUgTWFzdHJhIGBPYnNlcnZhYmlsaXR5YCBjb25maWcuIFVzZWRcbiAgICogYXMgdGhlIHRyYWNlciBzY29wZSBuYW1lIG9uIGJyaWRnZWQgT1RlbCBzcGFucyAodGhlIGBzZXJ2aWNlLm5hbWVgXG4gICAqIHJlc291cmNlIGF0dHJpYnV0ZSBpcyBvd25lZCBieSBBcHBLaXQncyBgVGVsZW1ldHJ5TWFuYWdlcmAgaW5zdGVhZFxuICAgKiAtIGl0IHJlYWRzIGBPVEVMX1NFUlZJQ0VfTkFNRWAgLyBgREFUQUJSSUNLU19BUFBfTkFNRWAgYXRcbiAgICogYGNyZWF0ZUFwcGAgdGltZSkuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHByb2plY3QgbmFtZSB0aGVuIGBcIm1hc3RyYVwiYC5cbiAgICovXG4gIHNlcnZpY2VOYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogYFJlcXVlc3RDb250ZXh0YCBrZXlzIHRvIGV4dHJhY3QgYXMgc3BhbiBtZXRhZGF0YSBvbiBldmVyeSBNYXN0cmFcbiAgICogdHJhY2UuIERlZmF1bHRzIHRvIHtAbGluayBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZU30gKHVzZXIgaWQsXG4gICAqIHRocmVhZCBpZCwgcmVxdWVzdCBpZCwgZW52aXJvbm1lbnQsIG1vZGVsIG92ZXJyaWRlLCAuLi4pLlxuICAgKlxuICAgKiBTdXBwb3J0cyBkb3Qgbm90YXRpb24gZm9yIG5lc3RlZCB2YWx1ZXMgcGVyIHRoZSBNYXN0cmEgZG9jcy5cbiAgICovXG4gIHJlcXVlc3RDb250ZXh0S2V5cz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKiogVHJ1ZSB3aGVuIEFwcEtpdCdzIGdsb2JhbCBPVGVsIHBpcGVsaW5lIGlzIGNvbmZpZ3VyZWQgdG8gZXhwb3J0IHRyYWNlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc090bHBUcmFjaW5nQ29uZmlndXJlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgcHJvY2Vzcy5lbnYuT1RFTF9FWFBPUlRFUl9PVExQX0VORFBPSU5UIHx8IHByb2Nlc3MuZW52Lk9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfRU5EUE9JTlQsXG4gICk7XG59XG5cbi8qKlxuICogSG9ub3IgdGhlIHN0YW5kYXJkIG5vLW9wIHByb3BhZ2F0b3Igc2V0dGluZyBhZnRlciBBcHBLaXQgcmVnaXN0ZXJzIGl0c1xuICogdHJhY2VyIHByb3ZpZGVyLiBBcHBLaXQgMC44MSBpbnN0YWxscyBXM0MgcHJvcGFnYXRpb24gdW5jb25kaXRpb25hbGx5LCBzb1xuICogZGlzYWJsaW5nIG9ubHkgdGhlIGdsb2JhbCBwcm9wYWdhdG9yIGtlZXBzIGFzeW5jIHNwYW4gY29udGV4dCBhY3RpdmUgd2hpbGVcbiAqIHByZXZlbnRpbmcgaW5ncmVzcyBleHRyYWN0aW9uIGFuZCBkb3duc3RyZWFtIGluamVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ3VyZU90ZWxQcm9wYWdhdGlvbigpOiBib29sZWFuIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk9URUxfUFJPUEFHQVRPUlM/LnRyaW0oKS50b0xvd2VyQ2FzZSgpICE9PSBcIm5vbmVcIikgcmV0dXJuIGZhbHNlO1xuICBwcm9wYWdhdGlvbi5kaXNhYmxlKCk7XG4gIGxvZ2dlci5pbmZvKFwiT3BlblRlbGVtZXRyeSBwcm9wYWdhdGlvbiBkaXNhYmxlZFwiLCB7XG4gICAgc2V0dGluZzogXCJPVEVMX1BST1BBR0FUT1JTPW5vbmVcIixcbiAgfSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgTWFzdHJhIGBPYnNlcnZhYmlsaXR5YCB3aG9zZSBzcGFucyByaWRlIEFwcEtpdCdzIGdsb2JhbFxuICogT1RlbCBwaXBlbGluZSB2aWEgYEBtYXN0cmEvb3RlbC1icmlkZ2VgLlxuICpcbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0cmFjaW5nIGlzIG9mZjogZWl0aGVyIHRoZSBjYWxsZXIgcGFzc2VkXG4gKiBgZW5hYmxlZDogZmFsc2VgLCBvciBhdXRvIG1vZGUgZmluZHMgbmVpdGhlciBBcHBLaXQgT1RMUCBub3IgYSBsb2NhbCBNTGZsb3dcbiAqIGV4cGVyaW1lbnQuXG4gKiBTa2lwcGluZyB0aGUgYnJpZGdlIGluIHRoYXQgY2FzZSBhdm9pZHMgYFtPdGVsQnJpZGdlXSBObyBPVEVMIHNwYW5cbiAqIGZvdW5kYCBsb2cgc3BhbSBmcm9tIE1hc3RyYSBzcGFucyB0aGF0IGhhdmUgbm8gcGFyZW50IG9uIHRoZSBub29wXG4gKiB0cmFjZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZE9ic2VydmFiaWxpdHkoXG4gIG9wdGlvbnM/OiBCdWlsZE9ic2VydmFiaWxpdHlPcHRpb25zLFxuKTogUHJvbWlzZTxPYnNlcnZhYmlsaXR5IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG90ZWxCYXNlID0gcHJvY2Vzcy5lbnYuT1RFTF9FWFBPUlRFUl9PVExQX0VORFBPSU5UO1xuICBjb25zdCBvdGVsVHJhY2VzT3ZlcnJpZGUgPSBwcm9jZXNzLmVudi5PVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0VORFBPSU5UO1xuICBjb25zdCBvdGxwQ29uZmlndXJlZCA9IGlzT3RscFRyYWNpbmdDb25maWd1cmVkKCk7XG4gIGNvbnN0IGFwcE1sZmxvd1RyYWNlSW5mbyA9XG4gICAgb3B0aW9ucz8uZW5hYmxlZCA9PT0gZmFsc2UgPyBmYWxzZSA6IGF3YWl0IGluaXRpYWxpemVBcHBNbGZsb3dUcmFjZUluZm8oKTtcbiAgY29uc3QgZGlyZWN0TWxmbG93Q29uZmlndXJlZCA9XG4gICAgb3B0aW9ucz8uZW5hYmxlZCA9PT0gZmFsc2UgfHwgb3RscENvbmZpZ3VyZWQgPyBmYWxzZSA6IGF3YWl0IGluaXRpYWxpemVEaXJlY3RNbGZsb3dUcmFjaW5nKCk7XG4gIGlmIChkaXJlY3RNbGZsb3dDb25maWd1cmVkKSBjb25maWd1cmVPdGVsUHJvcGFnYXRpb24oKTtcbiAgY29uc3QgdHJhY2luZ0NvbmZpZ3VyZWQgPSBvdGxwQ29uZmlndXJlZCB8fCBkaXJlY3RNbGZsb3dDb25maWd1cmVkO1xuXG4gIGlmIChvcHRpb25zPy5lbmFibGVkID09PSBmYWxzZSB8fCAob3B0aW9ucz8uZW5hYmxlZCAhPT0gdHJ1ZSAmJiAhdHJhY2luZ0NvbmZpZ3VyZWQpKSB7XG4gICAgbG9nZ2VyLmluZm8oXCJNYXN0cmEgb2JzZXJ2YWJpbGl0eSBvZmZcIiwge1xuICAgICAgcmVhc29uOlxuICAgICAgICBvcHRpb25zPy5lbmFibGVkID09PSBmYWxzZVxuICAgICAgICAgID8gXCJkaXNhYmxlZCBpbiBwbHVnaW4gY29uZmlnXCJcbiAgICAgICAgICA6IFwibm8gT1RMUCBlbmRwb2ludCBvciBkaXJlY3QgTUxmbG93IGV4cGVyaW1lbnQgY29uZmlndXJlZFwiLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBzZXJ2aWNlTmFtZSA9IG9wdGlvbnM/LnNlcnZpY2VOYW1lID8/IChhd2FpdCBwcm9qZWN0VXRpbHMubmFtZSgpKSA/PyBERUZBVUxUX1NFUlZJQ0VfTkFNRTtcbiAgY29uc3QgcmVxdWVzdENvbnRleHRLZXlzID0gWy4uLihvcHRpb25zPy5yZXF1ZXN0Q29udGV4dEtleXMgPz8gVFJBQ0VfUkVRVUVTVF9DT05URVhUX0tFWVMpXTtcblxuICAvLyBUaGUgT1RlbCBIVFRQIGV4cG9ydGVyIHRyZWF0cyBgT1RFTF9FWFBPUlRFUl9PVExQX0VORFBPSU5UYCBhcyBhXG4gIC8vICpiYXNlKiBVUkwgYW5kIGFwcGVuZHMgdGhlIHNpZ25hbCBwYXRoIGl0c2VsZiAoZS5nLlxuICAvLyBgaHR0cDovL2xvY2FsaG9zdDo2MDA2YCAtPiBgaHR0cDovL2xvY2FsaG9zdDo2MDA2L3YxL3RyYWNlc2ApLiBMb2dcbiAgLy8gdGhlIHJlc29sdmVkIFBPU1QgVVJMIHNvIG1pc2NvbmZpZ3VyYXRpb25zIChlLmcuIGFjY2lkZW50YWxseVxuICAvLyBzZXR0aW5nIHRoZSBiYXNlIHZhciB0byBhIGAvdjEvdHJhY2VzYC1zdWZmaXhlZCBVUkwsIHdoaWNoIG1ha2VzXG4gIC8vIHRoZSBTREsgUE9TVCB0byBgLi4uL3YxL3RyYWNlcy92MS90cmFjZXNgIGFuZCBQaG9lbml4IDQwNHMpIGFyZVxuICAvLyBvYnZpb3VzIGluIHN0YXJ0dXAgb3V0cHV0LlxuICBjb25zdCByZXNvbHZlZFRyYWNlc1VybCA9IG90ZWxUcmFjZXNPdmVycmlkZVxuICAgID8gb3RlbFRyYWNlc092ZXJyaWRlXG4gICAgOiBvdGVsQmFzZVxuICAgICAgPyBgJHtvdGVsQmFzZS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpfS92MS90cmFjZXNgXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgLy8gYG1sZmxvd0VuYWJsZWRgIGlzIHRoZSBzYW1lIGdhdGUgdGhhdCBmbGlwcyBjaGF0IGZlZWRiYWNrIG9uLCBzbyB0aGVcbiAgLy8gYm9vdCBsaW5lIGlzIHRoZSBvbmUtZ2xhbmNlIGNoZWNrIHRoYXQgYm90aCBoYWx2ZXMgb2YgdGhlIEFwcHMgVUNcbiAgLy8gcGlwZWxpbmUgKE9UTFAgc2lkZWNhciArIGV4cGVyaW1lbnQgaWQpIGFyZSBwcmVzZW50LlxuICBjb25zdCBmZWVkYmFjayA9IG1sZmxvd0VuYWJsZWQoKTtcbiAgbG9nZ2VyLmluZm8oXCJNYXN0cmEgb2JzZXJ2YWJpbGl0eSB3aXJlZCB0aHJvdWdoIE9UZWwgYnJpZGdlXCIsIHtcbiAgICBzZXJ2aWNlTmFtZSxcbiAgICByZXF1ZXN0Q29udGV4dEtleXMsXG4gICAgb3RlbEJhc2U6IG90ZWxCYXNlID8/IFwiPHVuc2V0PlwiLFxuICAgIHJlc29sdmVkVHJhY2VzVXJsOiByZXNvbHZlZFRyYWNlc1VybCA/PyBcIjx1bnNldD5cIixcbiAgICBmZWVkYmFjayxcbiAgICBvYnNlcnZhYmlsaXR5OiBkaXJlY3RNbGZsb3dDb25maWd1cmVkXG4gICAgICA/IFwibWxmbG93LWRpcmVjdFwiXG4gICAgICA6IGFwcE1sZmxvd1RyYWNlSW5mb1xuICAgICAgICA/IFwibWxmbG93LWFwcHNcIlxuICAgICAgICA6IGZlZWRiYWNrXG4gICAgICAgICAgPyBcIm1sZmxvd1wiXG4gICAgICAgICAgOiBcIm90ZWxcIixcbiAgfSk7XG5cbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmlsaXR5KHtcbiAgICBjb25maWdzOiB7XG4gICAgICBzZXJ2aWNlTmFtZToge1xuICAgICAgICBzZXJ2aWNlTmFtZSxcbiAgICAgICAgYnJpZGdlOiBuZXcgT3RlbEJyaWRnZSgpLFxuICAgICAgICByZXF1ZXN0Q29udGV4dEtleXMsXG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xufVxuIl19
@@ -18,13 +18,14 @@
18
18
  * @module
19
19
  */
20
20
  import { StringDecoder } from "node:string_decoder";
21
+ import { appkit } from "@dbx-tools/appkit";
21
22
  import { getRequestTags } from "@dbx-tools/appkit/request-tags";
22
- import { environmentUtils, json, log, object, stringUtils } from "@dbx-tools/shared-core";
23
+ import { json, log, object, stringUtils } from "@dbx-tools/shared-core";
23
24
  import { feedback, thread } from "@dbx-tools/shared-mastra";
24
25
  import { context, createContextKey, SpanKind, trace } from "@opentelemetry/api";
25
26
  import { getRPCMetadata, RPCType } from "@opentelemetry/core";
26
27
  import { USER_EMAIL_HEADER, USER_ID_HEADER } from "./identity.js";
27
- import { directMlflowTracingActive, updateActiveMlflowTrace, updateActiveMlflowTraceTags, } from "./mlflow.js";
28
+ import { directMlflowTracingActive, persistAppMlflowTraceInfo, updateActiveMlflowTrace, updateActiveMlflowTraceTags, } from "./mlflow.js";
28
29
  import { MLFLOW_AGENT_TAG, MLFLOW_AGENT_TAG_ATTR, MLFLOW_GENIE_TAG, MLFLOW_GENIE_TAG_ATTR, MLFLOW_MODEL_TAG, MLFLOW_LOCAL_TAG, MLFLOW_OBO_AUTH_TAG, MLFLOW_SP_AUTH_TAG, MLFLOW_TRACE_TAG_PREFIX, } from "./trace-attributes.js";
29
30
  export { MLFLOW_AGENT_TAG, MLFLOW_AGENT_TAG_ATTR, MLFLOW_GENIE_TAG, MLFLOW_GENIE_TAG_ATTR, MLFLOW_MODEL_TAG, MLFLOW_MODEL_TAG_ATTR, MLFLOW_LOCAL_TAG, MLFLOW_LOCAL_TAG_ATTR, MLFLOW_OBO_AUTH_TAG, MLFLOW_OBO_AUTH_TAG_ATTR, MLFLOW_SP_AUTH_TAG, MLFLOW_SP_AUTH_TAG_ATTR, MLFLOW_TRACE_TAG_PREFIX, } from "./trace-attributes.js";
30
31
  const logger = log.logger("mastra/telemetry");
@@ -408,8 +409,9 @@ export function chatTurnTelemetryMiddleware(req, res, next, options = {}) {
408
409
  return;
409
410
  }
410
411
  const traceState = { models: new Set(), tags: new Map() };
412
+ const traceRequestTime = Date.now();
411
413
  setChatTraceTag(traceState, MLFLOW_AGENT_TAG, true);
412
- if (!environmentUtils.isDatabricksAppEnv()) {
414
+ if (!appkit.isDatabricksAppEnv()) {
413
415
  setChatTraceTag(traceState, MLFLOW_LOCAL_TAG, true);
414
416
  }
415
417
  for (const [name, value] of Object.entries(getRequestTags(req))) {
@@ -434,12 +436,15 @@ export function chatTurnTelemetryMiddleware(req, res, next, options = {}) {
434
436
  }
435
437
  target.span.setAttribute(CHAT_GENIE_USED_ATTR, false);
436
438
  const messages = req.body?.messages;
439
+ let requestPreview;
437
440
  if (messages !== undefined) {
438
441
  const fullInput = serialized(messages);
442
+ requestPreview = textOnlyChatInput(messages) ?? fullInput;
439
443
  target.span.setAttribute(CHAT_MESSAGES_ATTR, fullInput);
440
- target.span.setAttribute(MLFLOW_SPAN_INPUTS_ATTR, (textOnlyChatInput(messages) ?? fullInput).slice(0, TRACE_IO_LIMIT));
444
+ target.span.setAttribute(MLFLOW_SPAN_INPUTS_ATTR, requestPreview.slice(0, TRACE_IO_LIMIT));
441
445
  }
442
446
  const collector = new AssistantResponseCollector();
447
+ let responsePreview;
443
448
  let outputRecorded = false;
444
449
  let fullOutputRecorded = false;
445
450
  let genieRecorded = false;
@@ -451,6 +456,7 @@ export function chatTurnTelemetryMiddleware(req, res, next, options = {}) {
451
456
  const recordOutput = (answer) => {
452
457
  if (outputRecorded || !answer)
453
458
  return;
459
+ responsePreview = answer;
454
460
  target.span.setAttribute(MLFLOW_SPAN_OUTPUTS_ATTR, answer.slice(0, TRACE_IO_LIMIT));
455
461
  outputRecorded = true;
456
462
  };
@@ -490,6 +496,16 @@ export function chatTurnTelemetryMiddleware(req, res, next, options = {}) {
490
496
  ...(traceState.user ? { user: traceState.user } : {}),
491
497
  });
492
498
  });
499
+ persistAppMlflowTraceInfo({
500
+ traceId: targetTraceId,
501
+ requestTime: traceRequestTime,
502
+ executionDuration: Date.now() - traceRequestTime,
503
+ error: res.statusCode >= 500,
504
+ tags,
505
+ ...(traceState.user ? { user: traceState.user } : {}),
506
+ ...(requestPreview ? { requestPreview } : {}),
507
+ ...(responsePreview ? { responsePreview } : {}),
508
+ });
493
509
  };
494
510
  const endOwnedSpan = () => {
495
511
  if (!target.owned || ownedSpanEnded)
@@ -546,4 +562,4 @@ export function attachChatTurnTelemetry(app, options = {}) {
546
562
  app.use((req, res, next) => chatTurnTelemetryMiddleware(req, res, next, options));
547
563
  logger.info("chat turn telemetry middleware attached", options);
548
564
  }
549
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQWEsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRzlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEUsT0FBTyxFQUNMLHlCQUF5QixFQUN6Qix1QkFBdUIsRUFDdkIsMkJBQTJCLEdBQzVCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLHVCQUF1QixHQUN4QixNQUFNLHVCQUF1QixDQUFDO0FBRS9CLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQix3QkFB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RUFBRSxDQUFDLENBQUM7UUFDNUQsSUFBSSxFQUFFLENBQUM7SUFDVCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLEdBQW9CLEVBQ3BCLFVBQW9DLEVBQUU7SUFFdEMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLE1BQU0sQ0FBQyxJQUFJLENBQUMseUNBQXlDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weSBlYWNoIE1hc3RyYSBjaGF0IHR1cm4ncyByZXF1ZXN0L3Jlc3BvbnNlIG9udG8gaXRzIE9UZWwgcm9vdCBzcGFuXG4gKiBzbyBEYXRhYnJpY2tzLW1hbmFnZWQgTUxmbG93IGNhbiBkaXNwbGF5IHRoZW0uXG4gKlxuICogV2h5IHRoaXMgZXhpc3RzOiBNTGZsb3cncyBVQyBgPHRhcmdldD5fdHJhY2VfdW5pZmllZGAgdmlldyBwaWNrcyB0aGVcbiAqIG9uZSBzcGFuIHdob3NlIGBwYXJlbnRfc3Bhbl9pZGAgaXMgZW1wdHkgYW5kIHJlYWRzIHJlcXVlc3QvcmVzcG9uc2VcbiAqIGZyb20gYG1sZmxvdy5zcGFuSW5wdXRzYCAvIGBtbGZsb3cuc3Bhbk91dHB1dHNgIChvciB0aGUgYGdlbl9haS4qYFxuICogZXF1aXZhbGVudHMpIG9uIFRIQVQgc3BhbiBvbmx5LiBNYXN0cmEgcmVjb3JkcyB0aGUgdHVybiBvbiBpdHNcbiAqIGBpbnZva2VfYWdlbnRgIGNoaWxkIHVuZGVyIGBtYXN0cmEuYWdlbnRfcnVuLmlucHV0YCAvIGAub3V0cHV0YCwga2V5c1xuICogdGhlIHZpZXcgbmV2ZXIgcmVhZHMsIHNvIGNoYXQgdHJhY2VzIGFycml2ZSB3aXRoIGJvdGggY29sdW1ucyBudWxsXG4gKiBldmVuIHdoZW4gdGhlIHNwYW5zIHRoZW1zZWx2ZXMgbG9vayBoZWFsdGh5LlxuICpcbiAqIEFwcEtpdCdzIEhUVFAgaW5zdHJ1bWVudGF0aW9uIHJlY29yZHMgdGhlIHNlcnZlciBzcGFuIGluIE9UZWwgUlBDIG1ldGFkYXRhLFxuICogd2hpY2ggcmVtYWlucyBhdmFpbGFibGUgZXZlbiB3aGVuIEV4cHJlc3MgbWFrZXMgYSBtaWRkbGV3YXJlLWxheWVyIGNoaWxkXG4gKiBhY3RpdmUuIFdoZW4gaW5zdHJ1bWVudGF0aW9uIGlzIHVuYXZhaWxhYmxlLCB0aGlzIG1vZHVsZSBjcmVhdGVzIG9uZVxuICogcmVxdWVzdC1saWZldGltZSBzZXJ2ZXIgc3BhbiBhbmQgcnVucyBNYXN0cmEgdW5kZXIgaXQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IFN0cmluZ0RlY29kZXIgfSBmcm9tIFwibm9kZTpzdHJpbmdfZGVjb2RlclwiO1xuXG5pbXBvcnQgeyBnZXRSZXF1ZXN0VGFncyB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC9yZXF1ZXN0LXRhZ3NcIjtcbmltcG9ydCB7IGVudmlyb25tZW50VXRpbHMsIGpzb24sIGxvZywgb2JqZWN0LCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBmZWVkYmFjaywgdGhyZWFkIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHsgY29udGV4dCwgY3JlYXRlQ29udGV4dEtleSwgU3BhbktpbmQsIHRyYWNlLCB0eXBlIFNwYW4gfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvYXBpXCI7XG5pbXBvcnQgeyBnZXRSUENNZXRhZGF0YSwgUlBDVHlwZSB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9jb3JlXCI7XG5pbXBvcnQgdHlwZSBleHByZXNzIGZyb20gXCJleHByZXNzXCI7XG5cbmltcG9ydCB7IFVTRVJfRU1BSUxfSEVBREVSLCBVU0VSX0lEX0hFQURFUiB9IGZyb20gXCIuL2lkZW50aXR5LnRzXCI7XG5pbXBvcnQge1xuICBkaXJlY3RNbGZsb3dUcmFjaW5nQWN0aXZlLFxuICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZSxcbiAgdXBkYXRlQWN0aXZlTWxmbG93VHJhY2VUYWdzLFxufSBmcm9tIFwiLi9tbGZsb3cudHNcIjtcbmltcG9ydCB7XG4gIE1MRkxPV19BR0VOVF9UQUcsXG4gIE1MRkxPV19BR0VOVF9UQUdfQVRUUixcbiAgTUxGTE9XX0dFTklFX1RBRyxcbiAgTUxGTE9XX0dFTklFX1RBR19BVFRSLFxuICBNTEZMT1dfTU9ERUxfVEFHLFxuICBNTEZMT1dfTE9DQUxfVEFHLFxuICBNTEZMT1dfT0JPX0FVVEhfVEFHLFxuICBNTEZMT1dfU1BfQVVUSF9UQUcsXG4gIE1MRkxPV19UUkFDRV9UQUdfUFJFRklYLFxufSBmcm9tIFwiLi90cmFjZS1hdHRyaWJ1dGVzLnRzXCI7XG5cbmV4cG9ydCB7XG4gIE1MRkxPV19BR0VOVF9UQUcsXG4gIE1MRkxPV19BR0VOVF9UQUdfQVRUUixcbiAgTUxGTE9XX0dFTklFX1RBRyxcbiAgTUxGTE9XX0dFTklFX1RBR19BVFRSLFxuICBNTEZMT1dfTU9ERUxfVEFHLFxuICBNTEZMT1dfTU9ERUxfVEFHX0FUVFIsXG4gIE1MRkxPV19MT0NBTF9UQUcsXG4gIE1MRkxPV19MT0NBTF9UQUdfQVRUUixcbiAgTUxGTE9XX09CT19BVVRIX1RBRyxcbiAgTUxGTE9XX09CT19BVVRIX1RBR19BVFRSLFxuICBNTEZMT1dfU1BfQVVUSF9UQUcsXG4gIE1MRkxPV19TUF9BVVRIX1RBR19BVFRSLFxuICBNTEZMT1dfVFJBQ0VfVEFHX1BSRUZJWCxcbn0gZnJvbSBcIi4vdHJhY2UtYXR0cmlidXRlcy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL3RlbGVtZXRyeVwiKTtcblxuLyoqIENhcCBvbiBlYWNoIHBheWxvYWQgY29waWVkIG9udG8gYSBzcGFuLCBzbyBvbmUgdHVybiBjYW5ub3QgYmxvYXQgdGhlIGV4cG9ydC4gKi9cbmV4cG9ydCBjb25zdCBUUkFDRV9JT19MSU1JVCA9IDhfMDAwO1xuXG4vKiogQm91bmQgZm9yIGEgbm9uLXN0cmVhbWluZyBib2R5IGNhcHR1cmVkIHRocm91Z2ggYHJlcy5lbmRgIGluc3RlYWQgb2YgYHJlcy5qc29uYC4gKi9cbmNvbnN0IFJFU1BPTlNFX0JPRFlfTElNSVQgPSBUUkFDRV9JT19MSU1JVCAqIDQ7XG5cbi8qKiBUcmFjZXIgc2NvcGUgdXNlZCBvbmx5IHdoZW4gQXBwS2l0IGRpZCBub3QgY3JlYXRlIGEgcmVjb3JkaW5nIEhUVFAgc3Bhbi4gKi9cbmNvbnN0IENIQVRfVFVSTl9UUkFDRVIgPSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYS90ZWxlbWV0cnlcIjtcblxuLyoqXG4gKiBNb3VudC1yZWxhdGl2ZSBNYXN0cmEgYWdlbnQgaW52b2tlIHBhdGhzIHRoYXQgY2FycnkgYSBjaGF0IHR1cm4gYm9keVxuICogKGBtZXNzYWdlc2ApIGFuZCBzdHJlYW0gYW4gYXNzaXN0YW50IGFuc3dlci4gUmVzdW1lIC8gYXBwcm92ZSB2ZXJic1xuICogYXJlIGludGVudGlvbmFsbHkgZXhjbHVkZWQ6IHRoZWlyIGJvZGllcyBhcmUgdG9vbCBkZWNpc2lvbnMsIG5vdCB0aGVcbiAqIHVzZXIgcHJvbXB0LCBhbmQgdGhleSByYXJlbHkgcHJvZHVjZSBhIGZyZXNoIGFuc3dlciB3b3J0aCBzdXJmYWNpbmcuXG4gKi9cbmNvbnN0IEFHRU5UX1RVUk5fUk9VVEUgPSAvXig/OlxcL2FnZW50c1xcL1teL10rXFwvKD86c3RyZWFtfGdlbmVyYXRlKSg/OlxcL3wkKXxcXC9jaGF0XFwvW14vXSskKS9pO1xuXG4vKiogQXR0cmlidXRlIGtleXMgdGhlIE1MZmxvdyBVQyBgKl90cmFjZV91bmlmaWVkYCB2aWV3IHJlYWRzIGZyb20gdGhlIHJvb3Qgc3Bhbi4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU1BBTl9JTlBVVFNfQVRUUiA9IFwibWxmbG93LnNwYW5JbnB1dHNcIjtcbi8qKiBSb290LXNwYW4gYXR0cmlidXRlIGNvbnN1bWVkIGFzIGNoYXQgb3V0cHV0IGJ5IE1MZmxvdyB1bmlmaWVkIHRyYWNlIHZpZXdzLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX09VVFBVVFNfQVRUUiA9IFwibWxmbG93LnNwYW5PdXRwdXRzXCI7XG4vKiogRnVsbCBzZXJpYWxpemVkIHJlcXVlc3QgbWVzc2FnZXMgcmV0YWluZWQgd2hlbiB0aGUgTUxmbG93IHByZXZpZXcgaXMgcGxhaW4gdGV4dC4gKi9cbmV4cG9ydCBjb25zdCBDSEFUX01FU1NBR0VTX0FUVFIgPSBcImFwcGtpdC5tYXN0cmEuY2hhdC5tZXNzYWdlc1wiO1xuLyoqIEZ1bGwgc2VyaWFsaXplZCByZXNwb25zZSByZXRhaW5lZCB3aGVuIHRoZSBNTGZsb3cgcHJldmlldyBpcyBwbGFpbiB0ZXh0LiAqL1xuZXhwb3J0IGNvbnN0IENIQVRfUkVTUE9OU0VfQVRUUiA9IFwiYXBwa2l0Lm1hc3RyYS5jaGF0LnJlc3BvbnNlXCI7XG4vKiogQ3JlZGVudGlhbCBtb2RlIHVzZWQgYnkgRGF0YWJyaWNrcyBjYWxscyBpbiB0aGlzIGNoYXQgdHVybi4gKi9cbmV4cG9ydCBjb25zdCBDSEFUX0lERU5USVRZX0FUVFIgPSBcImFwcGtpdC5tYXN0cmEuaWRlbnRpdHkubW9kZVwiO1xuLyoqIFdoZXRoZXIgdGhlIHN0cmVhbWVkIHR1cm4gZW1pdHRlZCBhIEdlbmllIHRvb2wgb3IgcHJvZ3Jlc3MgZXZlbnQuICovXG5leHBvcnQgY29uc3QgQ0hBVF9HRU5JRV9VU0VEX0FUVFIgPSBcImFwcGtpdC5tYXN0cmEuZ2VuaWUudXNlZFwiO1xuLyoqXG4gKiBNTGZsb3cgc3Bhbi10eXBlIGF0dHJpYnV0ZS4gRGF0YWJyaWNrcyBtYXBzIHRoaXMgKG9yIGBnZW5fYWkub3BlcmF0aW9uLm5hbWVgKVxuICogb250byB0aGUgdHlwZSBjaGlwIGluIHRoZSBleHBlcmltZW50IFVJLiBDdXN0b20gdmFsdWVzIHN1Y2ggYXMgYEdFTklFYCBhcmVcbiAqIGFsbG93ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU1BBTl9UWVBFX0FUVFIgPSBcIm1sZmxvdy5zcGFuVHlwZVwiO1xuLyoqIEdlbkFJIHNlbWFudGljLWNvbnZlbnRpb24gb3BlcmF0aW9uIG5hbWUsIGFuIGFsdGVybmF0ZSBzcGFuLXR5cGUgc291cmNlLiAqL1xuZXhwb3J0IGNvbnN0IEdFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSID0gXCJnZW5fYWkub3BlcmF0aW9uLm5hbWVcIjtcbi8qKlxuICogUm9vdC1zcGFuIHVzZXIgaWQgdGhlIE1MZmxvdyBleHBlcmltZW50IFVJJ3MgVXNlciBjb2x1bW4gcmVhZHMgZnJvbSBPVGVsXG4gKiB0cmFjZXMuIFByZWZlciB0aGUgZm9yd2FyZGVkIGVtYWlsIHdoZW4gcHJlc2VudCBzbyB0aGUgY29sdW1uIGlzIGh1bWFuLlxuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1VTRVJfQVRUUiA9IFwidXNlci5pZFwiO1xuLyoqIFJvb3Qtc3BhbiBzZXNzaW9uIGlkIHRoYXQgZW5hYmxlcyB0aGUgTUxmbG93IFNlc3Npb25zIHRhYi4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU0VTU0lPTl9BVFRSID0gXCJzZXNzaW9uLmlkXCI7XG4vKiogUm9vdC1zcGFuIHR5cGUgZm9yIGEgTWFzdHJhIGFnZW50IHR1cm4uICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fVFlQRV9BR0VOVCA9IFwiQUdFTlRcIjtcbi8qKiBTcGFuIHR5cGUgZm9yIGFuIGBhc2tfZ2VuaWVgIHRvb2wgY2FsbC4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU1BBTl9UWVBFX0dFTklFID0gXCJHRU5JRVwiO1xuXG4vKiogUm9vdC1zcGFuIG1ldGFkYXRhIGtub3duIGJlZm9yZSBhIGNoYXQgcmVxdWVzdCBpcyBkaXNwYXRjaGVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGF0VHVyblRlbGVtZXRyeU9wdGlvbnMge1xuICByZWFkb25seSBpZGVudGl0eT86XG4gICAgXCJvYm9cIiB8IFwic2VydmljZS1wcmluY2lwYWxcIiB8ICgocmVxdWVzdDogZXhwcmVzcy5SZXF1ZXN0KSA9PiBcIm9ib1wiIHwgXCJzZXJ2aWNlLXByaW5jaXBhbFwiKTtcbiAgLyoqIEluaXRpYWwgdHJhY2UgdGFncyBkZXJpdmVkIGZyb20gdGhlIGluYm91bmQgcmVxdWVzdC4gKi9cbiAgcmVhZG9ubHkgdGFncz86XG4gICAgfCBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBDaGF0VHJhY2VUYWdWYWx1ZSB8IHVuZGVmaW5lZD4+XG4gICAgfCAoKHJlcXVlc3Q6IGV4cHJlc3MuUmVxdWVzdCkgPT4gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQ2hhdFRyYWNlVGFnVmFsdWUgfCB1bmRlZmluZWQ+Pik7XG59XG5cbmludGVyZmFjZSBUcmFjZVRhcmdldCB7XG4gIHNwYW46IFNwYW47XG4gIG93bmVkOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgQ2hhdFRyYWNlU3RhdGUge1xuICByZWFkb25seSBtb2RlbHM6IFNldDxzdHJpbmc+O1xuICByZWFkb25seSB0YWdzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICB1c2VyPzogc3RyaW5nO1xufVxuXG4vKiogVmFsdWVzIGFjY2VwdGVkIGJ5IHJlcXVlc3Qtc2NvcGVkIHRyYWNlLXRhZyBpbmplY3Rpb24gaGVscGVycy4gKi9cbmV4cG9ydCB0eXBlIENoYXRUcmFjZVRhZ1ZhbHVlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbjtcblxuY29uc3QgQ0hBVF9UUkFDRV9TVEFURV9LRVkgPSBjcmVhdGVDb250ZXh0S2V5KFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhL2NoYXQtdHJhY2Utc3RhdGVcIik7XG5cbi8qKiBPcGVuVGVsZW1ldHJ5J3Mgc2VudGluZWwgZm9yIFwibm8gdmFsaWQgdHJhY2VcIiAtIDMyIHplcm8gaGV4IGNoYXJzLiAqL1xuY29uc3QgSU5WQUxJRF9UUkFDRV9JRCA9IFwiMFwiLnJlcGVhdCgzMik7XG5cbi8qKlxuICogTWFyayB0aGUgYWN0aXZlIHNwYW4gYXMgYSBHZW5pZSBjYWxsIHNvIHRoZSBleHBlcmltZW50IFVJIHR5cGVzIGl0IGBHRU5JRWBcbiAqIGFuZCB0YWdzIHRoZSB0cmFjZSBgZ2VuaWU9dHJ1ZWAuIFNhZmUgbm8tb3Agd2hlbiBubyByZWNvcmRpbmcgc3BhbiBpcyBhY3RpdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFtcEdlbmllVG9vbFNwYW4oc3BhbjogU3BhbiB8IHVuZGVmaW5lZCA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKSk6IHZvaWQge1xuICBpZiAoIXNwYW4/LmlzUmVjb3JkaW5nKCkpIHJldHVybjtcbiAgc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX1NQQU5fVFlQRV9BVFRSLCBNTEZMT1dfU1BBTl9UWVBFX0dFTklFKTtcbiAgc3Bhbi5zZXRBdHRyaWJ1dGUoR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFIsIFwiZXhlY3V0ZV90b29sXCIpO1xuICBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfR0VOSUVfVEFHX0FUVFIsIFwidHJ1ZVwiKTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdEhlYWRlcihyZXE6IGV4cHJlc3MuUmVxdWVzdCwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZnJvbU1ldGhvZCA9XG4gICAgdHlwZW9mIHJlcS5oZWFkZXIgPT09IFwiZnVuY3Rpb25cIiA/IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwocmVxLmhlYWRlcihuYW1lKSkgOiB1bmRlZmluZWQ7XG4gIGlmIChmcm9tTWV0aG9kKSByZXR1cm4gZnJvbU1ldGhvZDtcbiAgY29uc3QgcmF3ID0gcmVxLmhlYWRlcnM/LltuYW1lLnRvTG93ZXJDYXNlKCldO1xuICBjb25zdCB2YWx1ZSA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhd1swXSA6IHJhdztcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB1bmRlZmluZWQpID8/IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdFF1ZXJ5KHJlcTogZXhwcmVzcy5SZXF1ZXN0LCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByYXcgPSByZXEucXVlcnk/LltuYW1lXTtcbiAgY29uc3QgdmFsdWUgPSBBcnJheS5pc0FycmF5KHJhdykgPyByYXdbMF0gOiByYXc7XG4gIHJldHVybiBzdHJpbmdVdGlscy50cmltVG9OdWxsKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdW5kZWZpbmVkKSA/PyB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHN0YW1wTWxmbG93QWN0b3Ioc3BhbjogU3BhbiwgcmVxOiBleHByZXNzLlJlcXVlc3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB1c2VyID0gcmVxdWVzdEhlYWRlcihyZXEsIFVTRVJfRU1BSUxfSEVBREVSKSA/PyByZXF1ZXN0SGVhZGVyKHJlcSwgVVNFUl9JRF9IRUFERVIpO1xuICBpZiAodXNlcikgc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX1VTRVJfQVRUUiwgdXNlcik7XG4gIGNvbnN0IHNlc3Npb24gPVxuICAgIHJlcXVlc3RIZWFkZXIocmVxLCB0aHJlYWQuVEhSRUFEX0lEX0hFQURFUikgPz8gcmVxdWVzdFF1ZXJ5KHJlcSwgdGhyZWFkLlRIUkVBRF9JRF9RVUVSWSk7XG4gIGlmIChzZXNzaW9uKSBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU0VTU0lPTl9BVFRSLCBzZXNzaW9uKTtcbiAgcmV0dXJuIHVzZXI7XG59XG5cbmZ1bmN0aW9uIHRyYWNlSWQoc3BhbjogU3BhbiB8IHVuZGVmaW5lZCA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gc3Bhbj8uc3BhbkNvbnRleHQoKS50cmFjZUlkO1xuICByZXR1cm4gdmFsdWUgJiYgdmFsdWUgIT09IElOVkFMSURfVFJBQ0VfSUQgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTogQ2hhdFRyYWNlU3RhdGUgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY29udGV4dC5hY3RpdmUoKS5nZXRWYWx1ZShDSEFUX1RSQUNFX1NUQVRFX0tFWSkgYXMgQ2hhdFRyYWNlU3RhdGUgfCB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHNldENoYXRUcmFjZVRhZyhcbiAgc3RhdGU6IENoYXRUcmFjZVN0YXRlLFxuICBuYW1lOiBzdHJpbmcsXG4gIHZhbHVlOiBDaGF0VHJhY2VUYWdWYWx1ZSxcbik6IHZvaWQge1xuICBjb25zdCB0YWcgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKG5hbWUpO1xuICBpZiAoIXRhZykgcmV0dXJuO1xuICBzdGF0ZS50YWdzLnNldCh0YWcsIFN0cmluZyh2YWx1ZSkpO1xufVxuXG4vKiogSW5qZWN0IG9uZSBNTGZsb3cgdHJhY2UgdGFnIGludG8gdGhlIGFjdGl2ZSBjaGF0IHJlcXVlc3QuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VUYWcoXG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IENoYXRUcmFjZVRhZ1ZhbHVlID0gdHJ1ZSxcbik6IHZvaWQge1xuICBjb25zdCBzdGF0ZSA9IGFjdGl2ZUNoYXRUcmFjZVN0YXRlKCk7XG4gIGlmIChzdGF0ZSkgc2V0Q2hhdFRyYWNlVGFnKHN0YXRlLCBuYW1lLCB2YWx1ZSk7XG59XG5cbi8qKiBJbmplY3QgbXVsdGlwbGUgTUxmbG93IHRyYWNlIHRhZ3MgaW50byB0aGUgYWN0aXZlIGNoYXQgcmVxdWVzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBY3RpdmVUcmFjZVRhZ3MoXG4gIHRhZ3M6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENoYXRUcmFjZVRhZ1ZhbHVlIHwgdW5kZWZpbmVkPj4sXG4pOiB2b2lkIHtcbiAgY29uc3Qgc3RhdGUgPSBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpO1xuICBpZiAoIXN0YXRlKSByZXR1cm47XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0YWdzKSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSBzZXRDaGF0VHJhY2VUYWcoc3RhdGUsIG5hbWUsIHZhbHVlKTtcbiAgfVxufVxuXG4vKiogUmVjb3JkIGEgc2VsZWN0ZWQgbW9kZWwgb24gdGhlIGFjdGl2ZSBjaGF0IHRyYWNlLCBwcmVzZXJ2aW5nIGZpcnN0LXVzZSBvcmRlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBY3RpdmVUcmFjZU1vZGVsKG1vZGVsSWQ6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCB2YWx1ZSA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwobW9kZWxJZCk7XG4gIGlmICghdmFsdWUpIHJldHVybjtcbiAgYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKT8ubW9kZWxzLmFkZCh2YWx1ZSk7XG59XG5cbi8qKiBSZWNvcmQgdGhlIGJlc3QgcmVzb2x2ZWQgdXNlciBpZGVudGlmaWVyIG9uIHRoZSBhY3RpdmUgY2hhdCB0cmFjZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBY3RpdmVUcmFjZVVzZXIodXNlcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IHZhbHVlID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbCh1c2VyKTtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICBjb25zdCBzdGF0ZSA9IGFjdGl2ZUNoYXRUcmFjZVN0YXRlKCk7XG4gIGlmIChzdGF0ZSkgc3RhdGUudXNlciA9IHZhbHVlO1xufVxuXG4vKiogUmVjb3JkIG9uZSBEYXRhYnJpY2tzIGF1dGhlbnRpY2F0aW9uIG1vZGUgdXNlZCBkdXJpbmcgdGhlIGFjdGl2ZSBjaGF0IHRyYWNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEFjdGl2ZVRyYWNlQXV0aChhdXRoOiBcIm9ib1wiIHwgXCJzZXJ2aWNlLXByaW5jaXBhbFwiKTogdm9pZCB7XG4gIHJlY29yZEFjdGl2ZVRyYWNlVGFnKGF1dGggPT09IFwib2JvXCIgPyBNTEZMT1dfT0JPX0FVVEhfVEFHIDogTUxGTE9XX1NQX0FVVEhfVEFHKTtcbn1cblxuLyoqIFNlcmlhbGl6ZSBtb2RlbCB0YWdzIGFzIGEgc2NhbGFyIG9yIGFuIG9yZGVyZWQgSlNPTiBhcnJheSBmb3IgbXVsdGlwbGUgdmFsdWVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsVHJhY2VUYWcobW9kZWxzOiBJdGVyYWJsZTxzdHJpbmc+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgbW9kZWwgb2YgbW9kZWxzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKG1vZGVsKTtcbiAgICBpZiAoIXZhbHVlIHx8IHNlZW4uaGFzKHZhbHVlKSkgY29udGludWU7XG4gICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgfVxuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPT09IDEgPyB2YWx1ZXNbMF0gOiBKU09OLnN0cmluZ2lmeSh2YWx1ZXMpO1xufVxuXG4vKiogUHVibGlzaCB0aGUgdHVybidzIE1MZmxvdyB0cmFjZSBpZCBiZWZvcmUgdGhlIGhhbmRsZXIgd3JpdGVzIHRoZSBib2R5LiAqL1xuZnVuY3Rpb24gc3RhbXBNbGZsb3dUcmFjZUlkKHJlczogZXhwcmVzcy5SZXNwb25zZSwgc3BhbjogU3Bhbik6IHZvaWQge1xuICBpZiAocmVzLmhlYWRlcnNTZW50KSByZXR1cm47XG4gIGNvbnN0IHRyYWNlSWQgPSBzcGFuLnNwYW5Db250ZXh0KCkudHJhY2VJZDtcbiAgaWYgKCF0cmFjZUlkIHx8IHRyYWNlSWQgPT09IElOVkFMSURfVFJBQ0VfSUQpIHJldHVybjtcbiAgcmVzLnNldEhlYWRlcihmZWVkYmFjay5NTEZMT1dfVFJBQ0VfSURfSEVBREVSLCBgdHItJHt0cmFjZUlkfWApO1xufVxuXG4vKiogUmV0dXJuIG9uZSByYXcgcHJvbXB0IHdoZW4gdGhlIHJlcXVlc3QgaXMgZXhhY3RseSBvbmUgdGV4dC1vbmx5IHVzZXIgbWVzc2FnZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0T25seUNoYXRJbnB1dChtZXNzYWdlczogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgbWVzc2FnZXMgPT09IFwic3RyaW5nXCIpIHJldHVybiBtZXNzYWdlcyB8fCB1bmRlZmluZWQ7XG4gIGlmICghQXJyYXkuaXNBcnJheShtZXNzYWdlcykgfHwgbWVzc2FnZXMubGVuZ3RoICE9PSAxKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXNbMF07XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKG1lc3NhZ2UpIHx8IG1lc3NhZ2Uucm9sZSAhPT0gXCJ1c2VyXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSBcInN0cmluZ1wiKSByZXR1cm4gbWVzc2FnZS5jb250ZW50IHx8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRleHRGcm9tUGFydHMobWVzc2FnZS5wYXJ0cykgPz8gdGV4dEZyb21QYXJ0cyhtZXNzYWdlLmNvbnRlbnQpO1xufVxuXG5mdW5jdGlvbiB0ZXh0RnJvbVBhcnRzKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHRleHQ6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcGFydCBvZiB2YWx1ZSkge1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKHBhcnQpIHx8IHBhcnQudHlwZSAhPT0gXCJ0ZXh0XCIgfHwgdHlwZW9mIHBhcnQudGV4dCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGV4dC5wdXNoKHBhcnQudGV4dCk7XG4gIH1cbiAgY29uc3Qgam9pbmVkID0gdGV4dC5qb2luKFwiXCIpO1xuICByZXR1cm4gam9pbmVkIHx8IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplZCh2YWx1ZTogdW5rbm93biwgbGltaXQgPSBUUkFDRV9JT19MSU1JVCk6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk/LnNsaWNlKDAsIGxpbWl0KSA/PyBTdHJpbmcodmFsdWUpLnNsaWNlKDAsIGxpbWl0KTtcbn1cblxuZnVuY3Rpb24gc3NlRnJhbWUobGluZTogc3RyaW5nKTogdW5rbm93biB7XG4gIGlmICghbGluZS5zdGFydHNXaXRoKFwiZGF0YTpcIikpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBqc29uLnBhcnNlKGxpbmUuc2xpY2UoNSkpO1xufVxuXG5mdW5jdGlvbiB2YWx1ZVVzZXNHZW5pZSh2YWx1ZTogdW5rbm93biwgZGVwdGggPSAwKTogYm9vbGVhbiB7XG4gIGlmIChkZXB0aCA+IDMpIHJldHVybiBmYWxzZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuc29tZSgoaXRlbSkgPT4gdmFsdWVVc2VzR2VuaWUoaXRlbSwgZGVwdGggKyAxKSk7XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoXG4gICAgdmFsdWUudHlwZSA9PT0gXCJkYXRhLWdlbmllLXByb2dyZXNzXCIgfHxcbiAgICB2YWx1ZS50eXBlID09PSBcImFza19nZW5pZV9kb25lXCIgfHxcbiAgICB2YWx1ZS50b29sTmFtZSA9PT0gXCJhc2tfZ2VuaWVcIiB8fFxuICAgIHZhbHVlLnRvb2xfbmFtZSA9PT0gXCJhc2tfZ2VuaWVcIiB8fFxuICAgIHZhbHVlLm5hbWUgPT09IFwiYXNrX2dlbmllXCJcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIFtcImRhdGFcIiwgXCJldmVudFwiLCBcInBheWxvYWRcIl0uc29tZSgoa2V5KSA9PiB2YWx1ZVVzZXNHZW5pZSh2YWx1ZVtrZXldLCBkZXB0aCArIDEpKTtcbn1cblxuLyoqIFJldHVybiB0aGUgYXNzaXN0YW50IHRleHQgZnJvbSBvbmUgU1NFIGxpbmUsIG9yIGFuIGVtcHR5IHN0cmluZy4gKi9cbmZ1bmN0aW9uIGFzc2lzdGFudFRleHRGcm9tU3NlTGluZShsaW5lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYXNzaXN0YW50VGV4dEZyb21Tc2VGcmFtZShzc2VGcmFtZShsaW5lKSk7XG59XG5cbmZ1bmN0aW9uIGFzc2lzdGFudFRleHRGcm9tU3NlRnJhbWUoZnJhbWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAoIW9iamVjdC5pc1JlY29yZChmcmFtZSkgfHwgZnJhbWUudHlwZSAhPT0gXCJ0ZXh0LWRlbHRhXCIpIHJldHVybiBcIlwiO1xuICBjb25zdCB0ZXh0ID1cbiAgICB0eXBlb2YgZnJhbWUuZGVsdGEgPT09IFwic3RyaW5nXCJcbiAgICAgID8gZnJhbWUuZGVsdGFcbiAgICAgIDogb2JqZWN0LmlzUmVjb3JkKGZyYW1lLnBheWxvYWQpXG4gICAgICAgID8gZnJhbWUucGF5bG9hZC50ZXh0XG4gICAgICAgIDogdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIHRleHQgPT09IFwic3RyaW5nXCIgPyB0ZXh0IDogXCJcIjtcbn1cblxuLyoqXG4gKiBDb25jYXRlbmF0ZSB0aGUgYXNzaXN0YW50J3MgYW5zd2VyIG91dCBvZiBhbiBBSSBTREsgU1NFIHRyYW5zY3JpcHQuXG4gKlxuICogVGhlIGFnZW50IHN0cmVhbXMgaXRzIHJlcGx5IGFzIGB0ZXh0LWRlbHRhYCBmcmFtZXNcbiAqIChgZGF0YToge1widHlwZVwiOlwidGV4dC1kZWx0YVwiLFwicGF5bG9hZFwiOntcInRleHRcIjpcIi4uLlwifX1gKSwgc28gdGhlIGZ1bGxcbiAqIGFuc3dlciBvbmx5IGV2ZXIgZXhpc3RzIGFzIGRlbHRhcyBvbiB0aGUgd2lyZSBhbmQgaGFzIHRvIGJlXG4gKiByZWFzc2VtYmxlZCBoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaXN0YW50VGV4dEZyb21Tc2UoYm9keTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbGluZSBvZiBib2R5LnNwbGl0KFwiXFxuXCIpKSB7XG4gICAgY29uc3QgdGV4dCA9IGFzc2lzdGFudFRleHRGcm9tU3NlTGluZShsaW5lKTtcbiAgICBpZiAodGV4dCkgcGFydHMucHVzaCh0ZXh0KTtcbiAgfVxuICByZXR1cm4gcGFydHMuam9pbihcIlwiKS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCk7XG59XG5cbi8qKiBSZWFkIHRoZSBmaW5hbCBhc3Npc3RhbnQgdGV4dCBmcm9tIGEgbm9uLXN0cmVhbWluZyBNYXN0cmEgcmVzcG9uc2UuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaXN0YW50VGV4dEZyb21Kc29uKGJvZHk6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAoIW9iamVjdC5pc1JlY29yZChib2R5KSB8fCB0eXBlb2YgYm9keS50ZXh0ICE9PSBcInN0cmluZ1wiKSByZXR1cm4gXCJcIjtcbiAgcmV0dXJuIGJvZHkudGV4dC5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCk7XG59XG5cbi8qKiBJbmNyZW1lbnRhbGx5IGFzc2VtYmxlIFVURi04IFNTRSB0ZXh0IHdoaWxlIHJldGFpbmluZyBhIGJvdW5kZWQgSlNPTiBmYWxsYmFjay4gKi9cbmNsYXNzIEFzc2lzdGFudFJlc3BvbnNlQ29sbGVjdG9yIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoXCJ1dGY4XCIpO1xuICBwcml2YXRlIGFuc3dlciA9IFwiXCI7XG4gIHByaXZhdGUgYm9keSA9IFwiXCI7XG4gIHByaXZhdGUgcGVuZGluZ0xpbmUgPSBcIlwiO1xuICBwcml2YXRlIGZpbmlzaGVkID0gZmFsc2U7XG4gIHByaXZhdGUgZ2VuaWUgPSBmYWxzZTtcblxuICB3cml0ZShjaHVuazogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh0aGlzLmZpbmlzaGVkKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhpcy5jb25zdW1lKGNodW5rKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhjaHVuaykpIHtcbiAgICAgIHRoaXMuY29uc3VtZShcbiAgICAgICAgdGhpcy5kZWNvZGVyLndyaXRlKEJ1ZmZlci5mcm9tKGNodW5rLmJ1ZmZlciwgY2h1bmsuYnl0ZU9mZnNldCwgY2h1bmsuYnl0ZUxlbmd0aCkpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBmaW5pc2goKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5maW5pc2hlZCkgcmV0dXJuIHRoaXMuYW5zd2VyIHx8IHRoaXMuanNvbkFuc3dlcigpO1xuICAgIHRoaXMuZmluaXNoZWQgPSB0cnVlO1xuICAgIHRoaXMuY29uc3VtZSh0aGlzLmRlY29kZXIuZW5kKCkpO1xuICAgIHRoaXMuY29uc3VtZVNzZUxpbmUodGhpcy5wZW5kaW5nTGluZSk7XG4gICAgdGhpcy5wZW5kaW5nTGluZSA9IFwiXCI7XG4gICAgcmV0dXJuIHRoaXMuYW5zd2VyIHx8IHRoaXMuanNvbkFuc3dlcigpO1xuICB9XG5cbiAgcmF3Qm9keSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJvZHkuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpO1xuICB9XG5cbiAgdXNlZEdlbmllKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdlbmllO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdW1lKHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGV4dCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmJvZHkubGVuZ3RoIDwgUkVTUE9OU0VfQk9EWV9MSU1JVCkge1xuICAgICAgdGhpcy5ib2R5ICs9IHRleHQuc2xpY2UoMCwgUkVTUE9OU0VfQk9EWV9MSU1JVCAtIHRoaXMuYm9keS5sZW5ndGgpO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmdMaW5lICs9IHRleHQ7XG4gICAgbGV0IG5ld2xpbmUgPSB0aGlzLnBlbmRpbmdMaW5lLmluZGV4T2YoXCJcXG5cIik7XG4gICAgd2hpbGUgKG5ld2xpbmUgPj0gMCkge1xuICAgICAgdGhpcy5jb25zdW1lU3NlTGluZSh0aGlzLnBlbmRpbmdMaW5lLnNsaWNlKDAsIG5ld2xpbmUpLnJlcGxhY2UoL1xcciQvLCBcIlwiKSk7XG4gICAgICB0aGlzLnBlbmRpbmdMaW5lID0gdGhpcy5wZW5kaW5nTGluZS5zbGljZShuZXdsaW5lICsgMSk7XG4gICAgICBuZXdsaW5lID0gdGhpcy5wZW5kaW5nTGluZS5pbmRleE9mKFwiXFxuXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wZW5kaW5nTGluZS5sZW5ndGggPiBSRVNQT05TRV9CT0RZX0xJTUlUKSB7XG4gICAgICB0aGlzLnBlbmRpbmdMaW5lID0gdGhpcy5wZW5kaW5nTGluZS5zbGljZSgtUkVTUE9OU0VfQk9EWV9MSU1JVCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb25zdW1lU3NlTGluZShsaW5lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBmcmFtZSA9IHNzZUZyYW1lKGxpbmUpO1xuICAgIHRoaXMuZ2VuaWUgfHw9IHZhbHVlVXNlc0dlbmllKGZyYW1lKTtcbiAgICBpZiAodGhpcy5hbnN3ZXIubGVuZ3RoID49IFRSQUNFX0lPX0xJTUlUKSByZXR1cm47XG4gICAgY29uc3QgdGV4dCA9IGFzc2lzdGFudFRleHRGcm9tU3NlRnJhbWUoZnJhbWUpO1xuICAgIHRoaXMuYW5zd2VyICs9IHRleHQuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQgLSB0aGlzLmFuc3dlci5sZW5ndGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBqc29uQW5zd2VyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGFzc2lzdGFudFRleHRGcm9tSnNvbihqc29uLnBhcnNlKHRoaXMuYm9keSkpO1xuICB9XG59XG5cbi8qKlxuICogU2VsZWN0IHRoZSBzcGFuIE1MZmxvdyB0cmVhdHMgYXMgdGhlIHJlcXVlc3Qgcm9vdC5cbiAqXG4gKiBPVGVsIEhUVFAgaW5zdHJ1bWVudGF0aW9uIHN0b3JlcyBpdHMgc2VydmVyIHNwYW4gaW4gUlBDIG1ldGFkYXRhLiBUaGF0IHNwYW5cbiAqIHdpbnMgb3ZlciBhbiBhY3RpdmUgRXhwcmVzcyBjaGlsZC4gSWYgbm8gcmVjb3JkaW5nIGxvY2FsIHNwYW4gZXhpc3RzLCBjcmVhdGVcbiAqIG9uZSB1bmRlciB0aGUgY3VycmVudCBjb250ZXh0IHNvIGVuYWJsZWQgVzNDIHByb3BhZ2F0aW9uIHJlbWFpbnMgaW50YWN0LlxuICovXG5mdW5jdGlvbiByZXNvbHZlVHJhY2VUYXJnZXQoKTogVHJhY2VUYXJnZXQgfCB1bmRlZmluZWQge1xuICBjb25zdCBhY3RpdmVDb250ZXh0ID0gY29udGV4dC5hY3RpdmUoKTtcbiAgaWYgKGRpcmVjdE1sZmxvd1RyYWNpbmdBY3RpdmUoKSkge1xuICAgIGNvbnN0IHNwYW4gPSB0cmFjZVxuICAgICAgLmdldFRyYWNlcihDSEFUX1RVUk5fVFJBQ0VSKVxuICAgICAgLnN0YXJ0U3BhbihcbiAgICAgICAgXCJtYXN0cmEuY2hhdF90dXJuXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBraW5kOiBTcGFuS2luZC5TRVJWRVIsXG4gICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgW01MRkxPV19BR0VOVF9UQUdfQVRUUl06IFwidHJ1ZVwiLFxuICAgICAgICAgICAgW01MRkxPV19TUEFOX1RZUEVfQVRUUl06IE1MRkxPV19TUEFOX1RZUEVfQUdFTlQsXG4gICAgICAgICAgICBbR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFJdOiBcImludm9rZV9hZ2VudFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHRyYWNlLmRlbGV0ZVNwYW4oYWN0aXZlQ29udGV4dCksXG4gICAgICApO1xuICAgIGlmICghc3Bhbi5pc1JlY29yZGluZygpKSB7XG4gICAgICBzcGFuLmVuZCgpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3Bhbiwgb3duZWQ6IHRydWUgfTtcbiAgfVxuXG4gIGNvbnN0IHJwYyA9IGdldFJQQ01ldGFkYXRhKGFjdGl2ZUNvbnRleHQpO1xuICBpZiAocnBjPy50eXBlID09PSBSUENUeXBlLkhUVFAgJiYgcnBjLnNwYW4uaXNSZWNvcmRpbmcoKSkge1xuICAgIHJldHVybiB7IHNwYW46IHJwYy5zcGFuLCBvd25lZDogZmFsc2UgfTtcbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZSA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKTtcbiAgaWYgKGFjdGl2ZT8uaXNSZWNvcmRpbmcoKSkgcmV0dXJuIHsgc3BhbjogYWN0aXZlLCBvd25lZDogZmFsc2UgfTtcblxuICBjb25zdCBzcGFuID0gdHJhY2VcbiAgICAuZ2V0VHJhY2VyKENIQVRfVFVSTl9UUkFDRVIpXG4gICAgLnN0YXJ0U3BhbihcbiAgICAgIFwibWFzdHJhLmNoYXRfdHVyblwiLFxuICAgICAge1xuICAgICAgICBraW5kOiBTcGFuS2luZC5TRVJWRVIsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICBbTUxGTE9XX0FHRU5UX1RBR19BVFRSXTogXCJ0cnVlXCIsXG4gICAgICAgICAgW01MRkxPV19TUEFOX1RZUEVfQVRUUl06IE1MRkxPV19TUEFOX1RZUEVfQUdFTlQsXG4gICAgICAgICAgW0dFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSXTogXCJpbnZva2VfYWdlbnRcIixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhY3RpdmVDb250ZXh0LFxuICAgICk7XG4gIGlmICghc3Bhbi5pc1JlY29yZGluZygpKSB7XG4gICAgc3Bhbi5lbmQoKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB7IHNwYW4sIG93bmVkOiB0cnVlIH07XG59XG5cbi8qKlxuICogRXhwcmVzcyBtaWRkbGV3YXJlIHRoYXQgc3RhbXBzIGNoYXQgdHVybiBJL08gb250byB0aGUgZXhwb3J0ZWQgT1RlbCByb290LlxuICpcbiAqIFRlZSBgcmVzLndyaXRlYCwgYHJlcy5qc29uYCwgYW5kIGByZXMuZW5kYCBpbnN0ZWFkIG9mIGxpc3RlbmluZyBmb3IgYGZpbmlzaGA6XG4gKiBIVFRQIGluc3RydW1lbnRhdGlvbiBlbmRzIGl0cyBzZXJ2ZXIgc3BhbiBvbiBmaW5pc2gsIGFuZCBhdHRyaWJ1dGVzIHNldFxuICogYWZ0ZXIgYSBzcGFuIGVuZHMgbmV2ZXIgcmVhY2ggdGhlIGV4cG9ydGVyLlxuICpcbiAqIGBwYXRoYCBpcyBtb3VudC1yZWxhdGl2ZSAod2hhdCB0aGUgTWFzdHJhIHN1Yi1hcHAgc2VlcyksIGUuZy5cbiAqIGAvYWdlbnRzL3N1cHBvcnQvc3RyZWFtYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYXRUdXJuVGVsZW1ldHJ5TWlkZGxld2FyZShcbiAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgbmV4dDogZXhwcmVzcy5OZXh0RnVuY3Rpb24sXG4gIG9wdGlvbnM6IENoYXRUdXJuVGVsZW1ldHJ5T3B0aW9ucyA9IHt9LFxuKTogdm9pZCB7XG4gIGlmIChyZXEubWV0aG9kICE9PSBcIlBPU1RcIiB8fCAhQUdFTlRfVFVSTl9ST1VURS50ZXN0KHJlcS5wYXRoKSkge1xuICAgIG5leHQoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgdGFyZ2V0ID0gcmVzb2x2ZVRyYWNlVGFyZ2V0KCk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgbmV4dCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0YXJnZXRUcmFjZUlkID0gdHJhY2VJZCh0YXJnZXQuc3Bhbik7XG4gIGlmICghdGFyZ2V0VHJhY2VJZCkge1xuICAgIGlmICh0YXJnZXQub3duZWQpIHRhcmdldC5zcGFuLmVuZCgpO1xuICAgIG5leHQoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgdHJhY2VTdGF0ZTogQ2hhdFRyYWNlU3RhdGUgPSB7IG1vZGVsczogbmV3IFNldCgpLCB0YWdzOiBuZXcgTWFwKCkgfTtcbiAgc2V0Q2hhdFRyYWNlVGFnKHRyYWNlU3RhdGUsIE1MRkxPV19BR0VOVF9UQUcsIHRydWUpO1xuICBpZiAoIWVudmlyb25tZW50VXRpbHMuaXNEYXRhYnJpY2tzQXBwRW52KCkpIHtcbiAgICBzZXRDaGF0VHJhY2VUYWcodHJhY2VTdGF0ZSwgTUxGTE9XX0xPQ0FMX1RBRywgdHJ1ZSk7XG4gIH1cbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGdldFJlcXVlc3RUYWdzKHJlcSkpKSB7XG4gICAgc2V0Q2hhdFRyYWNlVGFnKHRyYWNlU3RhdGUsIG5hbWUsIHZhbHVlKTtcbiAgfVxuICBjb25zdCBpbml0aWFsVGFncyA9IHR5cGVvZiBvcHRpb25zLnRhZ3MgPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMudGFncyhyZXEpIDogb3B0aW9ucy50YWdzO1xuICBpZiAoaW5pdGlhbFRhZ3MpIHtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5pdGlhbFRhZ3MpKSB7XG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgc2V0Q2hhdFRyYWNlVGFnKHRyYWNlU3RhdGUsIG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgc3RhbXBNbGZsb3dUcmFjZUlkKHJlcywgdGFyZ2V0LnNwYW4pO1xuICB0cmFjZVN0YXRlLnVzZXIgPSBzdGFtcE1sZmxvd0FjdG9yKHRhcmdldC5zcGFuLCByZXEpO1xuICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX1NQQU5fVFlQRV9BVFRSLCBNTEZMT1dfU1BBTl9UWVBFX0FHRU5UKTtcbiAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKEdFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSLCBcImludm9rZV9hZ2VudFwiKTtcbiAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19BR0VOVF9UQUdfQVRUUiwgXCJ0cnVlXCIpO1xuICBjb25zdCBpZGVudGl0eSA9XG4gICAgdHlwZW9mIG9wdGlvbnMuaWRlbnRpdHkgPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMuaWRlbnRpdHkocmVxKSA6IG9wdGlvbnMuaWRlbnRpdHk7XG4gIGlmIChpZGVudGl0eSkge1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0lERU5USVRZX0FUVFIsIGlkZW50aXR5KTtcbiAgICBzZXRDaGF0VHJhY2VUYWcoXG4gICAgICB0cmFjZVN0YXRlLFxuICAgICAgaWRlbnRpdHkgPT09IFwib2JvXCIgPyBNTEZMT1dfT0JPX0FVVEhfVEFHIDogTUxGTE9XX1NQX0FVVEhfVEFHLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICB9XG4gIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0dFTklFX1VTRURfQVRUUiwgZmFsc2UpO1xuXG4gIGNvbnN0IG1lc3NhZ2VzID0gKHJlcS5ib2R5IGFzIHsgbWVzc2FnZXM/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5tZXNzYWdlcztcbiAgaWYgKG1lc3NhZ2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBmdWxsSW5wdXQgPSBzZXJpYWxpemVkKG1lc3NhZ2VzKTtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9NRVNTQUdFU19BVFRSLCBmdWxsSW5wdXQpO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShcbiAgICAgIE1MRkxPV19TUEFOX0lOUFVUU19BVFRSLFxuICAgICAgKHRleHRPbmx5Q2hhdElucHV0KG1lc3NhZ2VzKSA/PyBmdWxsSW5wdXQpLnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUKSxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgY29sbGVjdG9yID0gbmV3IEFzc2lzdGFudFJlc3BvbnNlQ29sbGVjdG9yKCk7XG4gIGxldCBvdXRwdXRSZWNvcmRlZCA9IGZhbHNlO1xuICBsZXQgZnVsbE91dHB1dFJlY29yZGVkID0gZmFsc2U7XG4gIGxldCBnZW5pZVJlY29yZGVkID0gZmFsc2U7XG4gIGxldCBvd25lZFNwYW5FbmRlZCA9IGZhbHNlO1xuICBsZXQgdHJhY2VGaW5hbGl6ZWQgPSBmYWxzZTtcbiAgY29uc3QgcGFzc1Rocm91Z2hXcml0ZSA9IHJlcy53cml0ZS5iaW5kKHJlcykgYXMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYm9vbGVhbjtcbiAgY29uc3QgcGFzc1Rocm91Z2hFbmQgPSByZXMuZW5kLmJpbmQocmVzKSBhcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuICBjb25zdCBwYXNzVGhyb3VnaEpzb24gPSByZXMuanNvbi5iaW5kKHJlcykgYXMgKGJvZHk/OiB1bmtub3duKSA9PiBleHByZXNzLlJlc3BvbnNlO1xuICBjb25zdCByZWNvcmRPdXRwdXQgPSAoYW5zd2VyOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBpZiAob3V0cHV0UmVjb3JkZWQgfHwgIWFuc3dlcikgcmV0dXJuO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9PVVRQVVRTX0FUVFIsIGFuc3dlci5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICAgIG91dHB1dFJlY29yZGVkID0gdHJ1ZTtcbiAgfTtcbiAgY29uc3QgcmVjb3JkRnVsbE91dHB1dCA9IChyZXNwb25zZTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgaWYgKGZ1bGxPdXRwdXRSZWNvcmRlZCB8fCAhcmVzcG9uc2UpIHJldHVybjtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9SRVNQT05TRV9BVFRSLCByZXNwb25zZS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICAgIGZ1bGxPdXRwdXRSZWNvcmRlZCA9IHRydWU7XG4gIH07XG4gIGNvbnN0IHJlY29yZEdlbmllID0gKHVzZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICBpZiAoIXVzZWQgfHwgZ2VuaWVSZWNvcmRlZCkgcmV0dXJuO1xuICAgIGdlbmllUmVjb3JkZWQgPSB0cnVlO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0dFTklFX1VTRURfQVRUUiwgdHJ1ZSk7XG4gICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19HRU5JRV9UQUdfQVRUUiwgXCJ0cnVlXCIpO1xuICAgIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBNTEZMT1dfR0VOSUVfVEFHLCB0cnVlKTtcbiAgICBjb250ZXh0LndpdGgodHJhY2Uuc2V0U3Bhbihjb250ZXh0LmFjdGl2ZSgpLCB0YXJnZXQuc3BhbiksICgpID0+IHtcbiAgICAgIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlVGFncyh7IFtNTEZMT1dfR0VOSUVfVEFHXTogXCJ0cnVlXCIgfSk7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGZpbmFsaXplVHJhY2UgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHRyYWNlRmluYWxpemVkKSByZXR1cm47XG4gICAgdHJhY2VGaW5hbGl6ZWQgPSB0cnVlO1xuICAgIGNvbnN0IG1vZGVsID0gbW9kZWxUcmFjZVRhZyh0cmFjZVN0YXRlLm1vZGVscyk7XG4gICAgaWYgKG1vZGVsKSBzZXRDaGF0VHJhY2VUYWcodHJhY2VTdGF0ZSwgTUxGTE9XX01PREVMX1RBRywgbW9kZWwpO1xuICAgIGNvbnN0IHRhZ3MgPSBPYmplY3QuZnJvbUVudHJpZXModHJhY2VTdGF0ZS50YWdzKTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgdHJhY2VTdGF0ZS50YWdzKSB7XG4gICAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoYCR7TUxGTE9XX1RSQUNFX1RBR19QUkVGSVh9JHtuYW1lfWAsIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRyYWNlU3RhdGUudXNlcikgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19VU0VSX0FUVFIsIHRyYWNlU3RhdGUudXNlcik7XG4gICAgY29udGV4dC53aXRoKHRyYWNlLnNldFNwYW4oY29udGV4dC5hY3RpdmUoKSwgdGFyZ2V0LnNwYW4pLCAoKSA9PiB7XG4gICAgICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZSh7XG4gICAgICAgIC4uLihPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAwID8geyB0YWdzIH0gOiB7fSksXG4gICAgICAgIC4uLih0cmFjZVN0YXRlLnVzZXIgPyB7IHVzZXI6IHRyYWNlU3RhdGUudXNlciB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGVuZE93bmVkU3BhbiA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRhcmdldC5vd25lZCB8fCBvd25lZFNwYW5FbmRlZCkgcmV0dXJuO1xuICAgIG93bmVkU3BhbkVuZGVkID0gdHJ1ZTtcbiAgICB0YXJnZXQuc3Bhbi5lbmQoKTtcbiAgfTtcblxuICByZXMud3JpdGUgPSAoKGNodW5rOiB1bmtub3duLCAuLi5yZXN0OiB1bmtub3duW10pID0+IHtcbiAgICBjb2xsZWN0b3Iud3JpdGUoY2h1bmspO1xuICAgIHJldHVybiBwYXNzVGhyb3VnaFdyaXRlKGNodW5rLCAuLi5yZXN0KTtcbiAgfSkgYXMgdHlwZW9mIHJlcy53cml0ZTtcblxuICByZXMuanNvbiA9ICgoYm9keT86IHVua25vd24pID0+IHtcbiAgICByZWNvcmRGdWxsT3V0cHV0KHNlcmlhbGl6ZWQoYm9keSkpO1xuICAgIHJlY29yZEdlbmllKHZhbHVlVXNlc0dlbmllKGJvZHkpKTtcbiAgICByZWNvcmRPdXRwdXQoYXNzaXN0YW50VGV4dEZyb21Kc29uKGJvZHkpKTtcbiAgICByZXR1cm4gcGFzc1Rocm91Z2hKc29uKGJvZHkpO1xuICB9KSBhcyB0eXBlb2YgcmVzLmpzb247XG5cbiAgcmVzLmVuZCA9ICgoY2h1bms/OiB1bmtub3duLCAuLi5yZXN0OiB1bmtub3duW10pID0+IHtcbiAgICBjb2xsZWN0b3Iud3JpdGUoY2h1bmspO1xuICAgIHJlY29yZE91dHB1dChjb2xsZWN0b3IuZmluaXNoKCkpO1xuICAgIHJlY29yZEZ1bGxPdXRwdXQoY29sbGVjdG9yLnJhd0JvZHkoKSk7XG4gICAgcmVjb3JkR2VuaWUoY29sbGVjdG9yLnVzZWRHZW5pZSgpKTtcbiAgICBmaW5hbGl6ZVRyYWNlKCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBwYXNzVGhyb3VnaEVuZChjaHVuaywgLi4ucmVzdCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVuZE93bmVkU3BhbigpO1xuICAgIH1cbiAgfSkgYXMgdHlwZW9mIHJlcy5lbmQ7XG5cbiAgcmVzLm9uY2UoXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgcmVjb3JkT3V0cHV0KGNvbGxlY3Rvci5maW5pc2goKSk7XG4gICAgcmVjb3JkRnVsbE91dHB1dChjb2xsZWN0b3IucmF3Qm9keSgpKTtcbiAgICByZWNvcmRHZW5pZShjb2xsZWN0b3IudXNlZEdlbmllKCkpO1xuICAgIGZpbmFsaXplVHJhY2UoKTtcbiAgICBlbmRPd25lZFNwYW4oKTtcbiAgfSk7XG5cbiAgY29uc3QgY2hhdENvbnRleHQgPSB0cmFjZVxuICAgIC5zZXRTcGFuKGNvbnRleHQuYWN0aXZlKCksIHRhcmdldC5zcGFuKVxuICAgIC5zZXRWYWx1ZShDSEFUX1RSQUNFX1NUQVRFX0tFWSwgdHJhY2VTdGF0ZSk7XG4gIGNvbnRleHQud2l0aChjaGF0Q29udGV4dCwgKCkgPT4ge1xuICAgIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlVGFncyh7IFtNTEZMT1dfQUdFTlRfVEFHXTogXCJ0cnVlXCIgfSk7XG4gICAgbmV4dCgpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJbnN0YWxsIHtAbGluayBjaGF0VHVyblRlbGVtZXRyeU1pZGRsZXdhcmV9IG9uIGEgTWFzdHJhIEV4cHJlc3Mgc3ViLWFwcC5cbiAqXG4gKiBDYWxsIGJlZm9yZSBgTWFzdHJhU2VydmVyLmluaXQoKWAgc28gdGhlIGxheWVyIHNpdHMgYWhlYWQgb2YgdGhlIGFnZW50XG4gKiByb3V0ZXMuIFNhZmUgdG8gY2FsbCB1bmNvbmRpdGlvbmFsbHk6IHdoZW4gbm8gcmVjb3JkaW5nIHRyYWNlciBpcyByZWdpc3RlcmVkLFxuICogdGhlIG1pZGRsZXdhcmUgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaENoYXRUdXJuVGVsZW1ldHJ5KFxuICBhcHA6IGV4cHJlc3MuRXhwcmVzcyxcbiAgb3B0aW9uczogQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgYXBwLnVzZSgocmVxLCByZXMsIG5leHQpID0+IGNoYXRUdXJuVGVsZW1ldHJ5TWlkZGxld2FyZShyZXEsIHJlcywgbmV4dCwgb3B0aW9ucykpO1xuICBsb2dnZXIuaW5mbyhcImNoYXQgdHVybiB0ZWxlbWV0cnkgbWlkZGxld2FyZSBhdHRhY2hlZFwiLCBvcHRpb25zKTtcbn1cbiJdfQ==
565
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFhLE1BQU0sb0JBQW9CLENBQUM7QUFDM0YsT0FBTyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUc5RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xFLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2QiwyQkFBMkIsR0FDNUIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsdUJBQXVCLEdBQ3hCLE1BQU0sdUJBQXVCLENBQUM7QUFFL0IsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsbUJBQW1CLEVBQ25CLHdCQUF3QixFQUN4QixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLHVCQUF1QixHQUN4QixNQUFNLHVCQUF1QixDQUFDO0FBRS9CLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUU5QyxtRkFBbUY7QUFDbkYsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQztBQUVwQyx1RkFBdUY7QUFDdkYsTUFBTSxtQkFBbUIsR0FBRyxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBRS9DLCtFQUErRTtBQUMvRSxNQUFNLGdCQUFnQixHQUFHLG9DQUFvQyxDQUFDO0FBRTlEOzs7OztHQUtHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxtRUFBbUUsQ0FBQztBQUU3RixvRkFBb0Y7QUFDcEYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsbUJBQW1CLENBQUM7QUFDM0QsaUZBQWlGO0FBQ2pGLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLG9CQUFvQixDQUFDO0FBQzdELHVGQUF1RjtBQUN2RixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyw2QkFBNkIsQ0FBQztBQUNoRSwrRUFBK0U7QUFDL0UsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsNkJBQTZCLENBQUM7QUFDaEUsa0VBQWtFO0FBQ2xFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLDZCQUE2QixDQUFDO0FBQ2hFLHdFQUF3RTtBQUN4RSxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRywwQkFBMEIsQ0FBQztBQUMvRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsaUJBQWlCLENBQUM7QUFDdkQsK0VBQStFO0FBQy9FLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLHVCQUF1QixDQUFDO0FBQ2xFOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztBQUMxQyxpRUFBaUU7QUFDakUsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsWUFBWSxDQUFDO0FBQ2hELDhDQUE4QztBQUM5QyxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxPQUFPLENBQUM7QUFDOUMsOENBQThDO0FBQzlDLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLE9BQU8sQ0FBQztBQTBCOUMsTUFBTSxvQkFBb0IsR0FBRyxnQkFBZ0IsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO0FBRTNGLHlFQUF5RTtBQUN6RSxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFeEM7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE9BQXlCLEtBQUssQ0FBQyxhQUFhLEVBQUU7SUFDL0UsSUFBSSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUU7UUFBRSxPQUFPO0lBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUNqRSxJQUFJLENBQUMsWUFBWSxDQUFDLDBCQUEwQixFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQzlELElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLEdBQW9CLEVBQUUsSUFBWTtJQUN2RCxNQUFNLFVBQVUsR0FDZCxPQUFPLEdBQUcsQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzFGLElBQUksVUFBVTtRQUFFLE9BQU8sVUFBVSxDQUFDO0lBQ2xDLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUM5QyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNoRCxPQUFPLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsQ0FBQztBQUM1RixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsR0FBb0IsRUFBRSxJQUFZO0lBQ3RELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNoRCxPQUFPLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsQ0FBQztBQUM1RixDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxJQUFVLEVBQUUsR0FBb0I7SUFDeEQsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDekYsSUFBSSxJQUFJO1FBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNwRCxNQUFNLE9BQU8sR0FDWCxhQUFhLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLFlBQVksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzNGLElBQUksT0FBTztRQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDN0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsT0FBeUIsS0FBSyxDQUFDLGFBQWEsRUFBRTtJQUM3RCxNQUFNLEtBQUssR0FBRyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDO0lBQzFDLE9BQU8sS0FBSyxJQUFJLEtBQUssS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDakUsQ0FBQztBQUVELFNBQVMsb0JBQW9CO0lBQzNCLE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBK0IsQ0FBQztBQUN2RixDQUFDO0FBRUQsU0FBUyxlQUFlLENBQ3RCLEtBQXFCLEVBQ3JCLElBQVksRUFDWixLQUF3QjtJQUV4QixNQUFNLEdBQUcsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pDLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTztJQUNqQixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELGdFQUFnRTtBQUNoRSxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLElBQVksRUFDWixRQUEyQixJQUFJO0lBRS9CLE1BQU0sS0FBSyxHQUFHLG9CQUFvQixFQUFFLENBQUM7SUFDckMsSUFBSSxLQUFLO1FBQUUsZUFBZSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDakQsQ0FBQztBQUVELHNFQUFzRTtBQUN0RSxNQUFNLFVBQVUscUJBQXFCLENBQ25DLElBQTZEO0lBRTdELE1BQU0sS0FBSyxHQUFHLG9CQUFvQixFQUFFLENBQUM7SUFDckMsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPO0lBQ25CLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDakQsSUFBSSxLQUFLLEtBQUssU0FBUztZQUFFLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9ELENBQUM7QUFDSCxDQUFDO0FBRUQsb0ZBQW9GO0FBQ3BGLE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxPQUFlO0lBQ3BELE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUMsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPO0lBQ25CLG9CQUFvQixFQUFFLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQseUVBQXlFO0FBQ3pFLE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxJQUF3QjtJQUM1RCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTztJQUNuQixNQUFNLEtBQUssR0FBRyxvQkFBb0IsRUFBRSxDQUFDO0lBQ3JDLElBQUksS0FBSztRQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO0FBQ2hDLENBQUM7QUFFRCxtRkFBbUY7QUFDbkYsTUFBTSxVQUFVLHFCQUFxQixDQUFDLElBQWlDO0lBQ3JFLG9CQUFvQixDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQ2xGLENBQUM7QUFFRCxxRkFBcUY7QUFDckYsTUFBTSxVQUFVLGFBQWEsQ0FBQyxNQUF3QjtJQUNwRCxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUMvQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUFFLFNBQVM7UUFDeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzFDLE9BQU8sTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLFNBQVMsa0JBQWtCLENBQUMsR0FBcUIsRUFBRSxJQUFVO0lBQzNELElBQUksR0FBRyxDQUFDLFdBQVc7UUFBRSxPQUFPO0lBQzVCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUM7SUFDM0MsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLEtBQUssZ0JBQWdCO1FBQUUsT0FBTztJQUNyRCxHQUFHLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxNQUFNLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVELG9GQUFvRjtBQUNwRixNQUFNLFVBQVUsaUJBQWlCLENBQUMsUUFBaUI7SUFDakQsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRO1FBQUUsT0FBTyxRQUFRLElBQUksU0FBUyxDQUFDO0lBQy9ELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3hFLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLE1BQU07UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMzRSxJQUFJLE9BQU8sT0FBTyxDQUFDLE9BQU8sS0FBSyxRQUFRO1FBQUUsT0FBTyxPQUFPLENBQUMsT0FBTyxJQUFJLFNBQVMsQ0FBQztJQUM3RSxPQUFPLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN4RSxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsS0FBYztJQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNsRSxNQUFNLElBQUksR0FBYSxFQUFFLENBQUM7SUFDMUIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDcEYsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdCLE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUM3QixDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsS0FBYyxFQUFFLEtBQUssR0FBRyxjQUFjO0lBQ3hELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2pGLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxJQUFZO0lBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2hELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLEtBQWMsRUFBRSxLQUFLLEdBQUcsQ0FBQztJQUMvQyxJQUFJLEtBQUssR0FBRyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDNUIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMxQyxJQUNFLEtBQUssQ0FBQyxJQUFJLEtBQUsscUJBQXFCO1FBQ3BDLEtBQUssQ0FBQyxJQUFJLEtBQUssZ0JBQWdCO1FBQy9CLEtBQUssQ0FBQyxRQUFRLEtBQUssV0FBVztRQUM5QixLQUFLLENBQUMsU0FBUyxLQUFLLFdBQVc7UUFDL0IsS0FBSyxDQUFDLElBQUksS0FBSyxXQUFXLEVBQzFCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0YsQ0FBQztBQUVELHVFQUF1RTtBQUN2RSxTQUFTLHdCQUF3QixDQUFDLElBQVk7SUFDNUMsT0FBTyx5QkFBeUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQsU0FBUyx5QkFBeUIsQ0FBQyxLQUFjO0lBQy9DLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssWUFBWTtRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3RFLE1BQU0sSUFBSSxHQUNSLE9BQU8sS0FBSyxDQUFDLEtBQUssS0FBSyxRQUFRO1FBQzdCLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSztRQUNiLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDOUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSTtZQUNwQixDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2xCLE9BQU8sT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUM5QyxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxJQUFZO0lBQy9DLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUMzQixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNwQyxNQUFNLElBQUksR0FBRyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxJQUFJLElBQUk7WUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQsMEVBQTBFO0FBQzFFLE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxJQUFhO0lBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDdkUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVELHFGQUFxRjtBQUNyRixNQUFNLDBCQUEwQjtJQUNiLE9BQU8sR0FBRyxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QyxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ1osSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNWLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFDakIsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixLQUFLLEdBQUcsS0FBSyxDQUFDO0lBRXRCLEtBQUssQ0FBQyxLQUFjO1FBQ2xCLElBQUksSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQzFCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxPQUFPLENBQ1YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQ2xGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFRCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVPLE9BQU8sQ0FBQyxJQUFZO1FBQzFCLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNsQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLG1CQUFtQixFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQztRQUN6QixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxPQUFPLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0UsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdkQsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLG1CQUFtQixFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbEUsQ0FBQztJQUNILENBQUM7SUFFTyxjQUFjLENBQUMsSUFBWTtRQUNqQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLEtBQUssS0FBSyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxjQUFjO1lBQUUsT0FBTztRQUNqRCxNQUFNLElBQUksR0FBRyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFTyxVQUFVO1FBQ2hCLE9BQU8scUJBQXFCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0NBQ0Y7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGtCQUFrQjtJQUN6QixNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDdkMsSUFBSSx5QkFBeUIsRUFBRSxFQUFFLENBQUM7UUFDaEMsTUFBTSxJQUFJLEdBQUcsS0FBSzthQUNmLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQzthQUMzQixTQUFTLENBQ1Isa0JBQWtCLEVBQ2xCO1lBQ0UsSUFBSSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1lBQ3JCLFVBQVUsRUFBRTtnQkFDVixDQUFDLHFCQUFxQixDQUFDLEVBQUUsTUFBTTtnQkFDL0IsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLHNCQUFzQjtnQkFDL0MsQ0FBQywwQkFBMEIsQ0FBQyxFQUFFLGNBQWM7YUFDN0M7U0FDRixFQUNELEtBQUssQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQ2hDLENBQUM7UUFDSixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1gsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDMUMsSUFBSSxHQUFHLEVBQUUsSUFBSSxLQUFLLE9BQU8sQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1FBQ3pELE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNyQyxJQUFJLE1BQU0sRUFBRSxXQUFXLEVBQUU7UUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFFakUsTUFBTSxJQUFJLEdBQUcsS0FBSztTQUNmLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQztTQUMzQixTQUFTLENBQ1Isa0JBQWtCLEVBQ2xCO1FBQ0UsSUFBSSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1FBQ3JCLFVBQVUsRUFBRTtZQUNWLENBQUMscUJBQXFCLENBQUMsRUFBRSxNQUFNO1lBQy9CLENBQUMscUJBQXFCLENBQUMsRUFBRSxzQkFBc0I7WUFDL0MsQ0FBQywwQkFBMEIsQ0FBQyxFQUFFLGNBQWM7U0FDN0M7S0FDRixFQUNELGFBQWEsQ0FDZCxDQUFDO0lBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNYLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUMvQixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLDJCQUEyQixDQUN6QyxHQUFvQixFQUNwQixHQUFxQixFQUNyQixJQUEwQixFQUMxQixVQUFvQyxFQUFFO0lBRXRDLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDOUQsSUFBSSxFQUFFLENBQUM7UUFDUCxPQUFPO0lBQ1QsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLGtCQUFrQixFQUFFLENBQUM7SUFDcEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osSUFBSSxFQUFFLENBQUM7UUFDUCxPQUFPO0lBQ1QsQ0FBQztJQUNELE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0MsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25CLElBQUksTUFBTSxDQUFDLEtBQUs7WUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3BDLElBQUksRUFBRSxDQUFDO1FBQ1AsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLFVBQVUsR0FBbUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO0lBQzFFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3BDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUM7UUFDakMsZUFBZSxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoRSxlQUFlLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsTUFBTSxXQUFXLEdBQUcsT0FBTyxPQUFPLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztJQUMxRixJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2hCLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDeEQsSUFBSSxLQUFLLEtBQUssU0FBUztnQkFBRSxlQUFlLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwRSxDQUFDO0lBQ0gsQ0FBQztJQUNELGtCQUFrQixDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsVUFBVSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLHFCQUFxQixFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFDeEUsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsMEJBQTBCLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDckUsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDeEQsTUFBTSxRQUFRLEdBQ1osT0FBTyxPQUFPLENBQUMsUUFBUSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztJQUNwRixJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdkQsZUFBZSxDQUNiLFVBQVUsRUFDVixRQUFRLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLEVBQzdELElBQUksQ0FDTCxDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRXRELE1BQU0sUUFBUSxHQUFJLEdBQUcsQ0FBQyxJQUEyQyxFQUFFLFFBQVEsQ0FBQztJQUM1RSxJQUFJLGNBQWtDLENBQUM7SUFDdkMsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDM0IsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxTQUFTLENBQUM7UUFDMUQsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDeEQsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQ3RCLHVCQUF1QixFQUN2QixjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FDeEMsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLDBCQUEwQixFQUFFLENBQUM7SUFDbkQsSUFBSSxlQUFtQyxDQUFDO0lBQ3hDLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztJQUMzQixJQUFJLGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUMvQixJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDMUIsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQzNCLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztJQUMzQixNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBb0MsQ0FBQztJQUNoRixNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQW9DLENBQUM7SUFDNUUsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUF5QyxDQUFDO0lBQ25GLE1BQU0sWUFBWSxHQUFHLENBQUMsTUFBYyxFQUFRLEVBQUU7UUFDNUMsSUFBSSxjQUFjLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUN0QyxlQUFlLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLHdCQUF3QixFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDcEYsY0FBYyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDLENBQUM7SUFDRixNQUFNLGdCQUFnQixHQUFHLENBQUMsUUFBZ0IsRUFBUSxFQUFFO1FBQ2xELElBQUksa0JBQWtCLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQ2hGLGtCQUFrQixHQUFHLElBQUksQ0FBQztJQUM1QixDQUFDLENBQUM7SUFDRixNQUFNLFdBQVcsR0FBRyxDQUFDLElBQWEsRUFBUSxFQUFFO1FBQzFDLElBQUksQ0FBQyxJQUFJLElBQUksYUFBYTtZQUFFLE9BQU87UUFDbkMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNyRCxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN4RCxlQUFlLENBQUMsVUFBVSxFQUFFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BELE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRTtZQUM5RCwyQkFBMkIsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0lBQ0YsTUFBTSxhQUFhLEdBQUcsR0FBUyxFQUFFO1FBQy9CLElBQUksY0FBYztZQUFFLE9BQU87UUFDM0IsY0FBYyxHQUFHLElBQUksQ0FBQztRQUN0QixNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLElBQUksS0FBSztZQUFFLGVBQWUsQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEUsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakQsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLHVCQUF1QixHQUFHLElBQUksRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFDRCxJQUFJLFVBQVUsQ0FBQyxJQUFJO1lBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pGLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRTtZQUM5RCx1QkFBdUIsQ0FBQztnQkFDdEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNqRCxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDdEQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCx5QkFBeUIsQ0FBQztZQUN4QixPQUFPLEVBQUUsYUFBYTtZQUN0QixXQUFXLEVBQUUsZ0JBQWdCO1lBQzdCLGlCQUFpQixFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxnQkFBZ0I7WUFDaEQsS0FBSyxFQUFFLEdBQUcsQ0FBQyxVQUFVLElBQUksR0FBRztZQUM1QixJQUFJO1lBQ0osR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JELEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM3QyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDaEQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0lBQ0YsTUFBTSxZQUFZLEdBQUcsR0FBUyxFQUFFO1FBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLGNBQWM7WUFBRSxPQUFPO1FBQzVDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNwQixDQUFDLENBQUM7SUFFRixHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFjLEVBQUUsR0FBRyxJQUFlLEVBQUUsRUFBRTtRQUNsRCxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8sZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQyxDQUFxQixDQUFDO0lBRXZCLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQWMsRUFBRSxFQUFFO1FBQzdCLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25DLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsQyxZQUFZLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMxQyxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDLENBQW9CLENBQUM7SUFFdEIsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBZSxFQUFFLEdBQUcsSUFBZSxFQUFFLEVBQUU7UUFDakQsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixZQUFZLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDakMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDdEMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLGFBQWEsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQztZQUNILE9BQU8sY0FBYyxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3hDLENBQUM7Z0JBQVMsQ0FBQztZQUNULFlBQVksRUFBRSxDQUFDO1FBQ2pCLENBQUM7SUFDSCxDQUFDLENBQW1CLENBQUM7SUFFckIsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO1FBQ3JCLFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNqQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN0QyxXQUFXLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDbkMsYUFBYSxFQUFFLENBQUM7UUFDaEIsWUFBWSxFQUFFLENBQUM7SUFDakIsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLFdBQVcsR0FBRyxLQUFLO1NBQ3RCLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQztTQUN0QyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDOUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO1FBQzdCLDJCQUEyQixDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDNUQsSUFBSSxFQUFFLENBQUM7SUFDVCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLEdBQW9CLEVBQ3BCLFVBQW9DLEVBQUU7SUFFdEMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLE1BQU0sQ0FBQyxJQUFJLENBQUMseUNBQXlDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weSBlYWNoIE1hc3RyYSBjaGF0IHR1cm4ncyByZXF1ZXN0L3Jlc3BvbnNlIG9udG8gaXRzIE9UZWwgcm9vdCBzcGFuXG4gKiBzbyBEYXRhYnJpY2tzLW1hbmFnZWQgTUxmbG93IGNhbiBkaXNwbGF5IHRoZW0uXG4gKlxuICogV2h5IHRoaXMgZXhpc3RzOiBNTGZsb3cncyBVQyBgPHRhcmdldD5fdHJhY2VfdW5pZmllZGAgdmlldyBwaWNrcyB0aGVcbiAqIG9uZSBzcGFuIHdob3NlIGBwYXJlbnRfc3Bhbl9pZGAgaXMgZW1wdHkgYW5kIHJlYWRzIHJlcXVlc3QvcmVzcG9uc2VcbiAqIGZyb20gYG1sZmxvdy5zcGFuSW5wdXRzYCAvIGBtbGZsb3cuc3Bhbk91dHB1dHNgIChvciB0aGUgYGdlbl9haS4qYFxuICogZXF1aXZhbGVudHMpIG9uIFRIQVQgc3BhbiBvbmx5LiBNYXN0cmEgcmVjb3JkcyB0aGUgdHVybiBvbiBpdHNcbiAqIGBpbnZva2VfYWdlbnRgIGNoaWxkIHVuZGVyIGBtYXN0cmEuYWdlbnRfcnVuLmlucHV0YCAvIGAub3V0cHV0YCwga2V5c1xuICogdGhlIHZpZXcgbmV2ZXIgcmVhZHMsIHNvIGNoYXQgdHJhY2VzIGFycml2ZSB3aXRoIGJvdGggY29sdW1ucyBudWxsXG4gKiBldmVuIHdoZW4gdGhlIHNwYW5zIHRoZW1zZWx2ZXMgbG9vayBoZWFsdGh5LlxuICpcbiAqIEFwcEtpdCdzIEhUVFAgaW5zdHJ1bWVudGF0aW9uIHJlY29yZHMgdGhlIHNlcnZlciBzcGFuIGluIE9UZWwgUlBDIG1ldGFkYXRhLFxuICogd2hpY2ggcmVtYWlucyBhdmFpbGFibGUgZXZlbiB3aGVuIEV4cHJlc3MgbWFrZXMgYSBtaWRkbGV3YXJlLWxheWVyIGNoaWxkXG4gKiBhY3RpdmUuIFdoZW4gaW5zdHJ1bWVudGF0aW9uIGlzIHVuYXZhaWxhYmxlLCB0aGlzIG1vZHVsZSBjcmVhdGVzIG9uZVxuICogcmVxdWVzdC1saWZldGltZSBzZXJ2ZXIgc3BhbiBhbmQgcnVucyBNYXN0cmEgdW5kZXIgaXQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IFN0cmluZ0RlY29kZXIgfSBmcm9tIFwibm9kZTpzdHJpbmdfZGVjb2RlclwiO1xuXG5pbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGdldFJlcXVlc3RUYWdzIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0L3JlcXVlc3QtdGFnc1wiO1xuaW1wb3J0IHsganNvbiwgbG9nLCBvYmplY3QsIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGZlZWRiYWNrLCB0aHJlYWQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQgeyBjb250ZXh0LCBjcmVhdGVDb250ZXh0S2V5LCBTcGFuS2luZCwgdHJhY2UsIHR5cGUgU3BhbiB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9hcGlcIjtcbmltcG9ydCB7IGdldFJQQ01ldGFkYXRhLCBSUENUeXBlIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2NvcmVcIjtcbmltcG9ydCB0eXBlIGV4cHJlc3MgZnJvbSBcImV4cHJlc3NcIjtcblxuaW1wb3J0IHsgVVNFUl9FTUFJTF9IRUFERVIsIFVTRVJfSURfSEVBREVSIH0gZnJvbSBcIi4vaWRlbnRpdHkudHNcIjtcbmltcG9ydCB7XG4gIGRpcmVjdE1sZmxvd1RyYWNpbmdBY3RpdmUsXG4gIHBlcnNpc3RBcHBNbGZsb3dUcmFjZUluZm8sXG4gIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlLFxuICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZVRhZ3MsXG59IGZyb20gXCIuL21sZmxvdy50c1wiO1xuaW1wb3J0IHtcbiAgTUxGTE9XX0FHRU5UX1RBRyxcbiAgTUxGTE9XX0FHRU5UX1RBR19BVFRSLFxuICBNTEZMT1dfR0VOSUVfVEFHLFxuICBNTEZMT1dfR0VOSUVfVEFHX0FUVFIsXG4gIE1MRkxPV19NT0RFTF9UQUcsXG4gIE1MRkxPV19MT0NBTF9UQUcsXG4gIE1MRkxPV19PQk9fQVVUSF9UQUcsXG4gIE1MRkxPV19TUF9BVVRIX1RBRyxcbiAgTUxGTE9XX1RSQUNFX1RBR19QUkVGSVgsXG59IGZyb20gXCIuL3RyYWNlLWF0dHJpYnV0ZXMudHNcIjtcblxuZXhwb3J0IHtcbiAgTUxGTE9XX0FHRU5UX1RBRyxcbiAgTUxGTE9XX0FHRU5UX1RBR19BVFRSLFxuICBNTEZMT1dfR0VOSUVfVEFHLFxuICBNTEZMT1dfR0VOSUVfVEFHX0FUVFIsXG4gIE1MRkxPV19NT0RFTF9UQUcsXG4gIE1MRkxPV19NT0RFTF9UQUdfQVRUUixcbiAgTUxGTE9XX0xPQ0FMX1RBRyxcbiAgTUxGTE9XX0xPQ0FMX1RBR19BVFRSLFxuICBNTEZMT1dfT0JPX0FVVEhfVEFHLFxuICBNTEZMT1dfT0JPX0FVVEhfVEFHX0FUVFIsXG4gIE1MRkxPV19TUF9BVVRIX1RBRyxcbiAgTUxGTE9XX1NQX0FVVEhfVEFHX0FUVFIsXG4gIE1MRkxPV19UUkFDRV9UQUdfUFJFRklYLFxufSBmcm9tIFwiLi90cmFjZS1hdHRyaWJ1dGVzLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvdGVsZW1ldHJ5XCIpO1xuXG4vKiogQ2FwIG9uIGVhY2ggcGF5bG9hZCBjb3BpZWQgb250byBhIHNwYW4sIHNvIG9uZSB0dXJuIGNhbm5vdCBibG9hdCB0aGUgZXhwb3J0LiAqL1xuZXhwb3J0IGNvbnN0IFRSQUNFX0lPX0xJTUlUID0gOF8wMDA7XG5cbi8qKiBCb3VuZCBmb3IgYSBub24tc3RyZWFtaW5nIGJvZHkgY2FwdHVyZWQgdGhyb3VnaCBgcmVzLmVuZGAgaW5zdGVhZCBvZiBgcmVzLmpzb25gLiAqL1xuY29uc3QgUkVTUE9OU0VfQk9EWV9MSU1JVCA9IFRSQUNFX0lPX0xJTUlUICogNDtcblxuLyoqIFRyYWNlciBzY29wZSB1c2VkIG9ubHkgd2hlbiBBcHBLaXQgZGlkIG5vdCBjcmVhdGUgYSByZWNvcmRpbmcgSFRUUCBzcGFuLiAqL1xuY29uc3QgQ0hBVF9UVVJOX1RSQUNFUiA9IFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhL3RlbGVtZXRyeVwiO1xuXG4vKipcbiAqIE1vdW50LXJlbGF0aXZlIE1hc3RyYSBhZ2VudCBpbnZva2UgcGF0aHMgdGhhdCBjYXJyeSBhIGNoYXQgdHVybiBib2R5XG4gKiAoYG1lc3NhZ2VzYCkgYW5kIHN0cmVhbSBhbiBhc3Npc3RhbnQgYW5zd2VyLiBSZXN1bWUgLyBhcHByb3ZlIHZlcmJzXG4gKiBhcmUgaW50ZW50aW9uYWxseSBleGNsdWRlZDogdGhlaXIgYm9kaWVzIGFyZSB0b29sIGRlY2lzaW9ucywgbm90IHRoZVxuICogdXNlciBwcm9tcHQsIGFuZCB0aGV5IHJhcmVseSBwcm9kdWNlIGEgZnJlc2ggYW5zd2VyIHdvcnRoIHN1cmZhY2luZy5cbiAqL1xuY29uc3QgQUdFTlRfVFVSTl9ST1VURSA9IC9eKD86XFwvYWdlbnRzXFwvW14vXStcXC8oPzpzdHJlYW18Z2VuZXJhdGUpKD86XFwvfCQpfFxcL2NoYXRcXC9bXi9dKyQpL2k7XG5cbi8qKiBBdHRyaWJ1dGUga2V5cyB0aGUgTUxmbG93IFVDIGAqX3RyYWNlX3VuaWZpZWRgIHZpZXcgcmVhZHMgZnJvbSB0aGUgcm9vdCBzcGFuLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX0lOUFVUU19BVFRSID0gXCJtbGZsb3cuc3BhbklucHV0c1wiO1xuLyoqIFJvb3Qtc3BhbiBhdHRyaWJ1dGUgY29uc3VtZWQgYXMgY2hhdCBvdXRwdXQgYnkgTUxmbG93IHVuaWZpZWQgdHJhY2Ugdmlld3MuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fT1VUUFVUU19BVFRSID0gXCJtbGZsb3cuc3Bhbk91dHB1dHNcIjtcbi8qKiBGdWxsIHNlcmlhbGl6ZWQgcmVxdWVzdCBtZXNzYWdlcyByZXRhaW5lZCB3aGVuIHRoZSBNTGZsb3cgcHJldmlldyBpcyBwbGFpbiB0ZXh0LiAqL1xuZXhwb3J0IGNvbnN0IENIQVRfTUVTU0FHRVNfQVRUUiA9IFwiYXBwa2l0Lm1hc3RyYS5jaGF0Lm1lc3NhZ2VzXCI7XG4vKiogRnVsbCBzZXJpYWxpemVkIHJlc3BvbnNlIHJldGFpbmVkIHdoZW4gdGhlIE1MZmxvdyBwcmV2aWV3IGlzIHBsYWluIHRleHQuICovXG5leHBvcnQgY29uc3QgQ0hBVF9SRVNQT05TRV9BVFRSID0gXCJhcHBraXQubWFzdHJhLmNoYXQucmVzcG9uc2VcIjtcbi8qKiBDcmVkZW50aWFsIG1vZGUgdXNlZCBieSBEYXRhYnJpY2tzIGNhbGxzIGluIHRoaXMgY2hhdCB0dXJuLiAqL1xuZXhwb3J0IGNvbnN0IENIQVRfSURFTlRJVFlfQVRUUiA9IFwiYXBwa2l0Lm1hc3RyYS5pZGVudGl0eS5tb2RlXCI7XG4vKiogV2hldGhlciB0aGUgc3RyZWFtZWQgdHVybiBlbWl0dGVkIGEgR2VuaWUgdG9vbCBvciBwcm9ncmVzcyBldmVudC4gKi9cbmV4cG9ydCBjb25zdCBDSEFUX0dFTklFX1VTRURfQVRUUiA9IFwiYXBwa2l0Lm1hc3RyYS5nZW5pZS51c2VkXCI7XG4vKipcbiAqIE1MZmxvdyBzcGFuLXR5cGUgYXR0cmlidXRlLiBEYXRhYnJpY2tzIG1hcHMgdGhpcyAob3IgYGdlbl9haS5vcGVyYXRpb24ubmFtZWApXG4gKiBvbnRvIHRoZSB0eXBlIGNoaXAgaW4gdGhlIGV4cGVyaW1lbnQgVUkuIEN1c3RvbSB2YWx1ZXMgc3VjaCBhcyBgR0VOSUVgIGFyZVxuICogYWxsb3dlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX1RZUEVfQVRUUiA9IFwibWxmbG93LnNwYW5UeXBlXCI7XG4vKiogR2VuQUkgc2VtYW50aWMtY29udmVudGlvbiBvcGVyYXRpb24gbmFtZSwgYW4gYWx0ZXJuYXRlIHNwYW4tdHlwZSBzb3VyY2UuICovXG5leHBvcnQgY29uc3QgR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFIgPSBcImdlbl9haS5vcGVyYXRpb24ubmFtZVwiO1xuLyoqXG4gKiBSb290LXNwYW4gdXNlciBpZCB0aGUgTUxmbG93IGV4cGVyaW1lbnQgVUkncyBVc2VyIGNvbHVtbiByZWFkcyBmcm9tIE9UZWxcbiAqIHRyYWNlcy4gUHJlZmVyIHRoZSBmb3J3YXJkZWQgZW1haWwgd2hlbiBwcmVzZW50IHNvIHRoZSBjb2x1bW4gaXMgaHVtYW4uXG4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfVVNFUl9BVFRSID0gXCJ1c2VyLmlkXCI7XG4vKiogUm9vdC1zcGFuIHNlc3Npb24gaWQgdGhhdCBlbmFibGVzIHRoZSBNTGZsb3cgU2Vzc2lvbnMgdGFiLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TRVNTSU9OX0FUVFIgPSBcInNlc3Npb24uaWRcIjtcbi8qKiBSb290LXNwYW4gdHlwZSBmb3IgYSBNYXN0cmEgYWdlbnQgdHVybi4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU1BBTl9UWVBFX0FHRU5UID0gXCJBR0VOVFwiO1xuLyoqIFNwYW4gdHlwZSBmb3IgYW4gYGFza19nZW5pZWAgdG9vbCBjYWxsLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX1RZUEVfR0VOSUUgPSBcIkdFTklFXCI7XG5cbi8qKiBSb290LXNwYW4gbWV0YWRhdGEga25vd24gYmVmb3JlIGEgY2hhdCByZXF1ZXN0IGlzIGRpc3BhdGNoZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXRUdXJuVGVsZW1ldHJ5T3B0aW9ucyB7XG4gIHJlYWRvbmx5IGlkZW50aXR5PzpcbiAgICBcIm9ib1wiIHwgXCJzZXJ2aWNlLXByaW5jaXBhbFwiIHwgKChyZXF1ZXN0OiBleHByZXNzLlJlcXVlc3QpID0+IFwib2JvXCIgfCBcInNlcnZpY2UtcHJpbmNpcGFsXCIpO1xuICAvKiogSW5pdGlhbCB0cmFjZSB0YWdzIGRlcml2ZWQgZnJvbSB0aGUgaW5ib3VuZCByZXF1ZXN0LiAqL1xuICByZWFkb25seSB0YWdzPzpcbiAgICB8IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENoYXRUcmFjZVRhZ1ZhbHVlIHwgdW5kZWZpbmVkPj5cbiAgICB8ICgocmVxdWVzdDogZXhwcmVzcy5SZXF1ZXN0KSA9PiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBDaGF0VHJhY2VUYWdWYWx1ZSB8IHVuZGVmaW5lZD4+KTtcbn1cblxuaW50ZXJmYWNlIFRyYWNlVGFyZ2V0IHtcbiAgc3BhbjogU3BhbjtcbiAgb3duZWQ6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBDaGF0VHJhY2VTdGF0ZSB7XG4gIHJlYWRvbmx5IG1vZGVsczogU2V0PHN0cmluZz47XG4gIHJlYWRvbmx5IHRhZ3M6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIHVzZXI/OiBzdHJpbmc7XG59XG5cbi8qKiBWYWx1ZXMgYWNjZXB0ZWQgYnkgcmVxdWVzdC1zY29wZWQgdHJhY2UtdGFnIGluamVjdGlvbiBoZWxwZXJzLiAqL1xuZXhwb3J0IHR5cGUgQ2hhdFRyYWNlVGFnVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG5jb25zdCBDSEFUX1RSQUNFX1NUQVRFX0tFWSA9IGNyZWF0ZUNvbnRleHRLZXkoXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmEvY2hhdC10cmFjZS1zdGF0ZVwiKTtcblxuLyoqIE9wZW5UZWxlbWV0cnkncyBzZW50aW5lbCBmb3IgXCJubyB2YWxpZCB0cmFjZVwiIC0gMzIgemVybyBoZXggY2hhcnMuICovXG5jb25zdCBJTlZBTElEX1RSQUNFX0lEID0gXCIwXCIucmVwZWF0KDMyKTtcblxuLyoqXG4gKiBNYXJrIHRoZSBhY3RpdmUgc3BhbiBhcyBhIEdlbmllIGNhbGwgc28gdGhlIGV4cGVyaW1lbnQgVUkgdHlwZXMgaXQgYEdFTklFYFxuICogYW5kIHRhZ3MgdGhlIHRyYWNlIGBnZW5pZT10cnVlYC4gU2FmZSBuby1vcCB3aGVuIG5vIHJlY29yZGluZyBzcGFuIGlzIGFjdGl2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YW1wR2VuaWVUb29sU3BhbihzcGFuOiBTcGFuIHwgdW5kZWZpbmVkID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpKTogdm9pZCB7XG4gIGlmICghc3Bhbj8uaXNSZWNvcmRpbmcoKSkgcmV0dXJuO1xuICBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9UWVBFX0FUVFIsIE1MRkxPV19TUEFOX1RZUEVfR0VOSUUpO1xuICBzcGFuLnNldEF0dHJpYnV0ZShHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUiwgXCJleGVjdXRlX3Rvb2xcIik7XG4gIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19HRU5JRV9UQUdfQVRUUiwgXCJ0cnVlXCIpO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0SGVhZGVyKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBmcm9tTWV0aG9kID1cbiAgICB0eXBlb2YgcmVxLmhlYWRlciA9PT0gXCJmdW5jdGlvblwiID8gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChyZXEuaGVhZGVyKG5hbWUpKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGZyb21NZXRob2QpIHJldHVybiBmcm9tTWV0aG9kO1xuICBjb25zdCByYXcgPSByZXEuaGVhZGVycz8uW25hbWUudG9Mb3dlckNhc2UoKV07XG4gIGNvbnN0IHZhbHVlID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3WzBdIDogcmF3O1xuICByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvTnVsbCh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHVuZGVmaW5lZCkgPz8gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0UXVlcnkocmVxOiBleHByZXNzLlJlcXVlc3QsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhdyA9IHJlcS5xdWVyeT8uW25hbWVdO1xuICBjb25zdCB2YWx1ZSA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhd1swXSA6IHJhdztcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB1bmRlZmluZWQpID8/IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc3RhbXBNbGZsb3dBY3RvcihzcGFuOiBTcGFuLCByZXE6IGV4cHJlc3MuUmVxdWVzdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0SGVhZGVyKHJlcSwgVVNFUl9FTUFJTF9IRUFERVIpID8/IHJlcXVlc3RIZWFkZXIocmVxLCBVU0VSX0lEX0hFQURFUik7XG4gIGlmICh1c2VyKSBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfVVNFUl9BVFRSLCB1c2VyKTtcbiAgY29uc3Qgc2Vzc2lvbiA9XG4gICAgcmVxdWVzdEhlYWRlcihyZXEsIHRocmVhZC5USFJFQURfSURfSEVBREVSKSA/PyByZXF1ZXN0UXVlcnkocmVxLCB0aHJlYWQuVEhSRUFEX0lEX1FVRVJZKTtcbiAgaWYgKHNlc3Npb24pIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19TRVNTSU9OX0FUVFIsIHNlc3Npb24pO1xuICByZXR1cm4gdXNlcjtcbn1cblxuZnVuY3Rpb24gdHJhY2VJZChzcGFuOiBTcGFuIHwgdW5kZWZpbmVkID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSBzcGFuPy5zcGFuQ29udGV4dCgpLnRyYWNlSWQ7XG4gIHJldHVybiB2YWx1ZSAmJiB2YWx1ZSAhPT0gSU5WQUxJRF9UUkFDRV9JRCA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpOiBDaGF0VHJhY2VTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZXh0LmFjdGl2ZSgpLmdldFZhbHVlKENIQVRfVFJBQ0VfU1RBVEVfS0VZKSBhcyBDaGF0VHJhY2VTdGF0ZSB8IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc2V0Q2hhdFRyYWNlVGFnKFxuICBzdGF0ZTogQ2hhdFRyYWNlU3RhdGUsXG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IENoYXRUcmFjZVRhZ1ZhbHVlLFxuKTogdm9pZCB7XG4gIGNvbnN0IHRhZyA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwobmFtZSk7XG4gIGlmICghdGFnKSByZXR1cm47XG4gIHN0YXRlLnRhZ3Muc2V0KHRhZywgU3RyaW5nKHZhbHVlKSk7XG59XG5cbi8qKiBJbmplY3Qgb25lIE1MZmxvdyB0cmFjZSB0YWcgaW50byB0aGUgYWN0aXZlIGNoYXQgcmVxdWVzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBY3RpdmVUcmFjZVRhZyhcbiAgbmFtZTogc3RyaW5nLFxuICB2YWx1ZTogQ2hhdFRyYWNlVGFnVmFsdWUgPSB0cnVlLFxuKTogdm9pZCB7XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKHN0YXRlKSBzZXRDaGF0VHJhY2VUYWcoc3RhdGUsIG5hbWUsIHZhbHVlKTtcbn1cblxuLyoqIEluamVjdCBtdWx0aXBsZSBNTGZsb3cgdHJhY2UgdGFncyBpbnRvIHRoZSBhY3RpdmUgY2hhdCByZXF1ZXN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEFjdGl2ZVRyYWNlVGFncyhcbiAgdGFnczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQ2hhdFRyYWNlVGFnVmFsdWUgfCB1bmRlZmluZWQ+Pixcbik6IHZvaWQge1xuICBjb25zdCBzdGF0ZSA9IGFjdGl2ZUNoYXRUcmFjZVN0YXRlKCk7XG4gIGlmICghc3RhdGUpIHJldHVybjtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRhZ3MpKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHNldENoYXRUcmFjZVRhZyhzdGF0ZSwgbmFtZSwgdmFsdWUpO1xuICB9XG59XG5cbi8qKiBSZWNvcmQgYSBzZWxlY3RlZCBtb2RlbCBvbiB0aGUgYWN0aXZlIGNoYXQgdHJhY2UsIHByZXNlcnZpbmcgZmlyc3QtdXNlIG9yZGVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEFjdGl2ZVRyYWNlTW9kZWwobW9kZWxJZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHZhbHVlID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChtb2RlbElkKTtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpPy5tb2RlbHMuYWRkKHZhbHVlKTtcbn1cblxuLyoqIFJlY29yZCB0aGUgYmVzdCByZXNvbHZlZCB1c2VyIGlkZW50aWZpZXIgb24gdGhlIGFjdGl2ZSBjaGF0IHRyYWNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEFjdGl2ZVRyYWNlVXNlcih1c2VyOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgY29uc3QgdmFsdWUgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKHVzZXIpO1xuICBpZiAoIXZhbHVlKSByZXR1cm47XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKHN0YXRlKSBzdGF0ZS51c2VyID0gdmFsdWU7XG59XG5cbi8qKiBSZWNvcmQgb25lIERhdGFicmlja3MgYXV0aGVudGljYXRpb24gbW9kZSB1c2VkIGR1cmluZyB0aGUgYWN0aXZlIGNoYXQgdHJhY2UuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VBdXRoKGF1dGg6IFwib2JvXCIgfCBcInNlcnZpY2UtcHJpbmNpcGFsXCIpOiB2b2lkIHtcbiAgcmVjb3JkQWN0aXZlVHJhY2VUYWcoYXV0aCA9PT0gXCJvYm9cIiA/IE1MRkxPV19PQk9fQVVUSF9UQUcgOiBNTEZMT1dfU1BfQVVUSF9UQUcpO1xufVxuXG4vKiogU2VyaWFsaXplIG1vZGVsIHRhZ3MgYXMgYSBzY2FsYXIgb3IgYW4gb3JkZXJlZCBKU09OIGFycmF5IGZvciBtdWx0aXBsZSB2YWx1ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxUcmFjZVRhZyhtb2RlbHM6IEl0ZXJhYmxlPHN0cmluZz4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB2YWx1ZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBtb2RlbCBvZiBtb2RlbHMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwobW9kZWwpO1xuICAgIGlmICghdmFsdWUgfHwgc2Vlbi5oYXModmFsdWUpKSBjb250aW51ZTtcbiAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICB9XG4gIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdmFsdWVzLmxlbmd0aCA9PT0gMSA/IHZhbHVlc1swXSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlcyk7XG59XG5cbi8qKiBQdWJsaXNoIHRoZSB0dXJuJ3MgTUxmbG93IHRyYWNlIGlkIGJlZm9yZSB0aGUgaGFuZGxlciB3cml0ZXMgdGhlIGJvZHkuICovXG5mdW5jdGlvbiBzdGFtcE1sZmxvd1RyYWNlSWQocmVzOiBleHByZXNzLlJlc3BvbnNlLCBzcGFuOiBTcGFuKTogdm9pZCB7XG4gIGlmIChyZXMuaGVhZGVyc1NlbnQpIHJldHVybjtcbiAgY29uc3QgdHJhY2VJZCA9IHNwYW4uc3BhbkNvbnRleHQoKS50cmFjZUlkO1xuICBpZiAoIXRyYWNlSWQgfHwgdHJhY2VJZCA9PT0gSU5WQUxJRF9UUkFDRV9JRCkgcmV0dXJuO1xuICByZXMuc2V0SGVhZGVyKGZlZWRiYWNrLk1MRkxPV19UUkFDRV9JRF9IRUFERVIsIGB0ci0ke3RyYWNlSWR9YCk7XG59XG5cbi8qKiBSZXR1cm4gb25lIHJhdyBwcm9tcHQgd2hlbiB0aGUgcmVxdWVzdCBpcyBleGFjdGx5IG9uZSB0ZXh0LW9ubHkgdXNlciBtZXNzYWdlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRleHRPbmx5Q2hhdElucHV0KG1lc3NhZ2VzOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiBtZXNzYWdlcyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIG1lc3NhZ2VzIHx8IHVuZGVmaW5lZDtcbiAgaWYgKCFBcnJheS5pc0FycmF5KG1lc3NhZ2VzKSB8fCBtZXNzYWdlcy5sZW5ndGggIT09IDEpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlc1swXTtcbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQobWVzc2FnZSkgfHwgbWVzc2FnZS5yb2xlICE9PSBcInVzZXJcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQgPT09IFwic3RyaW5nXCIpIHJldHVybiBtZXNzYWdlLmNvbnRlbnQgfHwgdW5kZWZpbmVkO1xuICByZXR1cm4gdGV4dEZyb21QYXJ0cyhtZXNzYWdlLnBhcnRzKSA/PyB0ZXh0RnJvbVBhcnRzKG1lc3NhZ2UuY29udGVudCk7XG59XG5cbmZ1bmN0aW9uIHRleHRGcm9tUGFydHModmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdGV4dDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBwYXJ0IG9mIHZhbHVlKSB7XG4gICAgaWYgKCFvYmplY3QuaXNSZWNvcmQocGFydCkgfHwgcGFydC50eXBlICE9PSBcInRleHRcIiB8fCB0eXBlb2YgcGFydC50ZXh0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0ZXh0LnB1c2gocGFydC50ZXh0KTtcbiAgfVxuICBjb25zdCBqb2luZWQgPSB0ZXh0LmpvaW4oXCJcIik7XG4gIHJldHVybiBqb2luZWQgfHwgdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVkKHZhbHVlOiB1bmtub3duLCBsaW1pdCA9IFRSQUNFX0lPX0xJTUlUKTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKT8uc2xpY2UoMCwgbGltaXQpID8/IFN0cmluZyh2YWx1ZSkuc2xpY2UoMCwgbGltaXQpO1xufVxuXG5mdW5jdGlvbiBzc2VGcmFtZShsaW5lOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKCFsaW5lLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGpzb24ucGFyc2UobGluZS5zbGljZSg1KSk7XG59XG5cbmZ1bmN0aW9uIHZhbHVlVXNlc0dlbmllKHZhbHVlOiB1bmtub3duLCBkZXB0aCA9IDApOiBib29sZWFuIHtcbiAgaWYgKGRlcHRoID4gMykgcmV0dXJuIGZhbHNlO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5zb21lKChpdGVtKSA9PiB2YWx1ZVVzZXNHZW5pZShpdGVtLCBkZXB0aCArIDEpKTtcbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChcbiAgICB2YWx1ZS50eXBlID09PSBcImRhdGEtZ2VuaWUtcHJvZ3Jlc3NcIiB8fFxuICAgIHZhbHVlLnR5cGUgPT09IFwiYXNrX2dlbmllX2RvbmVcIiB8fFxuICAgIHZhbHVlLnRvb2xOYW1lID09PSBcImFza19nZW5pZVwiIHx8XG4gICAgdmFsdWUudG9vbF9uYW1lID09PSBcImFza19nZW5pZVwiIHx8XG4gICAgdmFsdWUubmFtZSA9PT0gXCJhc2tfZ2VuaWVcIlxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gW1wiZGF0YVwiLCBcImV2ZW50XCIsIFwicGF5bG9hZFwiXS5zb21lKChrZXkpID0+IHZhbHVlVXNlc0dlbmllKHZhbHVlW2tleV0sIGRlcHRoICsgMSkpO1xufVxuXG4vKiogUmV0dXJuIHRoZSBhc3Npc3RhbnQgdGV4dCBmcm9tIG9uZSBTU0UgbGluZSwgb3IgYW4gZW1wdHkgc3RyaW5nLiAqL1xuZnVuY3Rpb24gYXNzaXN0YW50VGV4dEZyb21Tc2VMaW5lKGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBhc3Npc3RhbnRUZXh0RnJvbVNzZUZyYW1lKHNzZUZyYW1lKGxpbmUpKTtcbn1cblxuZnVuY3Rpb24gYXNzaXN0YW50VGV4dEZyb21Tc2VGcmFtZShmcmFtZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKGZyYW1lKSB8fCBmcmFtZS50eXBlICE9PSBcInRleHQtZGVsdGFcIikgcmV0dXJuIFwiXCI7XG4gIGNvbnN0IHRleHQgPVxuICAgIHR5cGVvZiBmcmFtZS5kZWx0YSA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBmcmFtZS5kZWx0YVxuICAgICAgOiBvYmplY3QuaXNSZWNvcmQoZnJhbWUucGF5bG9hZClcbiAgICAgICAgPyBmcmFtZS5wYXlsb2FkLnRleHRcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2YgdGV4dCA9PT0gXCJzdHJpbmdcIiA/IHRleHQgOiBcIlwiO1xufVxuXG4vKipcbiAqIENvbmNhdGVuYXRlIHRoZSBhc3Npc3RhbnQncyBhbnN3ZXIgb3V0IG9mIGFuIEFJIFNESyBTU0UgdHJhbnNjcmlwdC5cbiAqXG4gKiBUaGUgYWdlbnQgc3RyZWFtcyBpdHMgcmVwbHkgYXMgYHRleHQtZGVsdGFgIGZyYW1lc1xuICogKGBkYXRhOiB7XCJ0eXBlXCI6XCJ0ZXh0LWRlbHRhXCIsXCJwYXlsb2FkXCI6e1widGV4dFwiOlwiLi4uXCJ9fWApLCBzbyB0aGUgZnVsbFxuICogYW5zd2VyIG9ubHkgZXZlciBleGlzdHMgYXMgZGVsdGFzIG9uIHRoZSB3aXJlIGFuZCBoYXMgdG8gYmVcbiAqIHJlYXNzZW1ibGVkIGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3Npc3RhbnRUZXh0RnJvbVNzZShib2R5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGJvZHkuc3BsaXQoXCJcXG5cIikpIHtcbiAgICBjb25zdCB0ZXh0ID0gYXNzaXN0YW50VGV4dEZyb21Tc2VMaW5lKGxpbmUpO1xuICAgIGlmICh0ZXh0KSBwYXJ0cy5wdXNoKHRleHQpO1xuICB9XG4gIHJldHVybiBwYXJ0cy5qb2luKFwiXCIpLnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUKTtcbn1cblxuLyoqIFJlYWQgdGhlIGZpbmFsIGFzc2lzdGFudCB0ZXh0IGZyb20gYSBub24tc3RyZWFtaW5nIE1hc3RyYSByZXNwb25zZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3Npc3RhbnRUZXh0RnJvbUpzb24oYm9keTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKGJvZHkpIHx8IHR5cGVvZiBib2R5LnRleHQgIT09IFwic3RyaW5nXCIpIHJldHVybiBcIlwiO1xuICByZXR1cm4gYm9keS50ZXh0LnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUKTtcbn1cblxuLyoqIEluY3JlbWVudGFsbHkgYXNzZW1ibGUgVVRGLTggU1NFIHRleHQgd2hpbGUgcmV0YWluaW5nIGEgYm91bmRlZCBKU09OIGZhbGxiYWNrLiAqL1xuY2xhc3MgQXNzaXN0YW50UmVzcG9uc2VDb2xsZWN0b3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IGRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihcInV0ZjhcIik7XG4gIHByaXZhdGUgYW5zd2VyID0gXCJcIjtcbiAgcHJpdmF0ZSBib2R5ID0gXCJcIjtcbiAgcHJpdmF0ZSBwZW5kaW5nTGluZSA9IFwiXCI7XG4gIHByaXZhdGUgZmluaXNoZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBnZW5pZSA9IGZhbHNlO1xuXG4gIHdyaXRlKGNodW5rOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmluaXNoZWQpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aGlzLmNvbnN1bWUoY2h1bmspO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGNodW5rKSkge1xuICAgICAgdGhpcy5jb25zdW1lKFxuICAgICAgICB0aGlzLmRlY29kZXIud3JpdGUoQnVmZmVyLmZyb20oY2h1bmsuYnVmZmVyLCBjaHVuay5ieXRlT2Zmc2V0LCBjaHVuay5ieXRlTGVuZ3RoKSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGZpbmlzaCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZpbmlzaGVkKSByZXR1cm4gdGhpcy5hbnN3ZXIgfHwgdGhpcy5qc29uQW5zd2VyKCk7XG4gICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgdGhpcy5jb25zdW1lKHRoaXMuZGVjb2Rlci5lbmQoKSk7XG4gICAgdGhpcy5jb25zdW1lU3NlTGluZSh0aGlzLnBlbmRpbmdMaW5lKTtcbiAgICB0aGlzLnBlbmRpbmdMaW5lID0gXCJcIjtcbiAgICByZXR1cm4gdGhpcy5hbnN3ZXIgfHwgdGhpcy5qc29uQW5zd2VyKCk7XG4gIH1cblxuICByYXdCb2R5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYm9keS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCk7XG4gIH1cblxuICB1c2VkR2VuaWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2VuaWU7XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWUodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm47XG4gICAgaWYgKHRoaXMuYm9keS5sZW5ndGggPCBSRVNQT05TRV9CT0RZX0xJTUlUKSB7XG4gICAgICB0aGlzLmJvZHkgKz0gdGV4dC5zbGljZSgwLCBSRVNQT05TRV9CT0RZX0xJTUlUIC0gdGhpcy5ib2R5Lmxlbmd0aCk7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZ0xpbmUgKz0gdGV4dDtcbiAgICBsZXQgbmV3bGluZSA9IHRoaXMucGVuZGluZ0xpbmUuaW5kZXhPZihcIlxcblwiKTtcbiAgICB3aGlsZSAobmV3bGluZSA+PSAwKSB7XG4gICAgICB0aGlzLmNvbnN1bWVTc2VMaW5lKHRoaXMucGVuZGluZ0xpbmUuc2xpY2UoMCwgbmV3bGluZSkucmVwbGFjZSgvXFxyJC8sIFwiXCIpKTtcbiAgICAgIHRoaXMucGVuZGluZ0xpbmUgPSB0aGlzLnBlbmRpbmdMaW5lLnNsaWNlKG5ld2xpbmUgKyAxKTtcbiAgICAgIG5ld2xpbmUgPSB0aGlzLnBlbmRpbmdMaW5lLmluZGV4T2YoXCJcXG5cIik7XG4gICAgfVxuICAgIGlmICh0aGlzLnBlbmRpbmdMaW5lLmxlbmd0aCA+IFJFU1BPTlNFX0JPRFlfTElNSVQpIHtcbiAgICAgIHRoaXMucGVuZGluZ0xpbmUgPSB0aGlzLnBlbmRpbmdMaW5lLnNsaWNlKC1SRVNQT05TRV9CT0RZX0xJTUlUKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVTc2VMaW5lKGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGZyYW1lID0gc3NlRnJhbWUobGluZSk7XG4gICAgdGhpcy5nZW5pZSB8fD0gdmFsdWVVc2VzR2VuaWUoZnJhbWUpO1xuICAgIGlmICh0aGlzLmFuc3dlci5sZW5ndGggPj0gVFJBQ0VfSU9fTElNSVQpIHJldHVybjtcbiAgICBjb25zdCB0ZXh0ID0gYXNzaXN0YW50VGV4dEZyb21Tc2VGcmFtZShmcmFtZSk7XG4gICAgdGhpcy5hbnN3ZXIgKz0gdGV4dC5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCAtIHRoaXMuYW5zd2VyLmxlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIGpzb25BbnN3ZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYXNzaXN0YW50VGV4dEZyb21Kc29uKGpzb24ucGFyc2UodGhpcy5ib2R5KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZWxlY3QgdGhlIHNwYW4gTUxmbG93IHRyZWF0cyBhcyB0aGUgcmVxdWVzdCByb290LlxuICpcbiAqIE9UZWwgSFRUUCBpbnN0cnVtZW50YXRpb24gc3RvcmVzIGl0cyBzZXJ2ZXIgc3BhbiBpbiBSUEMgbWV0YWRhdGEuIFRoYXQgc3BhblxuICogd2lucyBvdmVyIGFuIGFjdGl2ZSBFeHByZXNzIGNoaWxkLiBJZiBubyByZWNvcmRpbmcgbG9jYWwgc3BhbiBleGlzdHMsIGNyZWF0ZVxuICogb25lIHVuZGVyIHRoZSBjdXJyZW50IGNvbnRleHQgc28gZW5hYmxlZCBXM0MgcHJvcGFnYXRpb24gcmVtYWlucyBpbnRhY3QuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVUcmFjZVRhcmdldCgpOiBUcmFjZVRhcmdldCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGFjdGl2ZUNvbnRleHQgPSBjb250ZXh0LmFjdGl2ZSgpO1xuICBpZiAoZGlyZWN0TWxmbG93VHJhY2luZ0FjdGl2ZSgpKSB7XG4gICAgY29uc3Qgc3BhbiA9IHRyYWNlXG4gICAgICAuZ2V0VHJhY2VyKENIQVRfVFVSTl9UUkFDRVIpXG4gICAgICAuc3RhcnRTcGFuKFxuICAgICAgICBcIm1hc3RyYS5jaGF0X3R1cm5cIixcbiAgICAgICAge1xuICAgICAgICAgIGtpbmQ6IFNwYW5LaW5kLlNFUlZFUixcbiAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICBbTUxGTE9XX0FHRU5UX1RBR19BVFRSXTogXCJ0cnVlXCIsXG4gICAgICAgICAgICBbTUxGTE9XX1NQQU5fVFlQRV9BVFRSXTogTUxGTE9XX1NQQU5fVFlQRV9BR0VOVCxcbiAgICAgICAgICAgIFtHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUl06IFwiaW52b2tlX2FnZW50XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgdHJhY2UuZGVsZXRlU3BhbihhY3RpdmVDb250ZXh0KSxcbiAgICAgICk7XG4gICAgaWYgKCFzcGFuLmlzUmVjb3JkaW5nKCkpIHtcbiAgICAgIHNwYW4uZW5kKCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4geyBzcGFuLCBvd25lZDogdHJ1ZSB9O1xuICB9XG5cbiAgY29uc3QgcnBjID0gZ2V0UlBDTWV0YWRhdGEoYWN0aXZlQ29udGV4dCk7XG4gIGlmIChycGM/LnR5cGUgPT09IFJQQ1R5cGUuSFRUUCAmJiBycGMuc3Bhbi5pc1JlY29yZGluZygpKSB7XG4gICAgcmV0dXJuIHsgc3BhbjogcnBjLnNwYW4sIG93bmVkOiBmYWxzZSB9O1xuICB9XG5cbiAgY29uc3QgYWN0aXZlID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpO1xuICBpZiAoYWN0aXZlPy5pc1JlY29yZGluZygpKSByZXR1cm4geyBzcGFuOiBhY3RpdmUsIG93bmVkOiBmYWxzZSB9O1xuXG4gIGNvbnN0IHNwYW4gPSB0cmFjZVxuICAgIC5nZXRUcmFjZXIoQ0hBVF9UVVJOX1RSQUNFUilcbiAgICAuc3RhcnRTcGFuKFxuICAgICAgXCJtYXN0cmEuY2hhdF90dXJuXCIsXG4gICAgICB7XG4gICAgICAgIGtpbmQ6IFNwYW5LaW5kLlNFUlZFUixcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgIFtNTEZMT1dfQUdFTlRfVEFHX0FUVFJdOiBcInRydWVcIixcbiAgICAgICAgICBbTUxGTE9XX1NQQU5fVFlQRV9BVFRSXTogTUxGTE9XX1NQQU5fVFlQRV9BR0VOVCxcbiAgICAgICAgICBbR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFJdOiBcImludm9rZV9hZ2VudFwiLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFjdGl2ZUNvbnRleHQsXG4gICAgKTtcbiAgaWYgKCFzcGFuLmlzUmVjb3JkaW5nKCkpIHtcbiAgICBzcGFuLmVuZCgpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgc3Bhbiwgb3duZWQ6IHRydWUgfTtcbn1cblxuLyoqXG4gKiBFeHByZXNzIG1pZGRsZXdhcmUgdGhhdCBzdGFtcHMgY2hhdCB0dXJuIEkvTyBvbnRvIHRoZSBleHBvcnRlZCBPVGVsIHJvb3QuXG4gKlxuICogVGVlIGByZXMud3JpdGVgLCBgcmVzLmpzb25gLCBhbmQgYHJlcy5lbmRgIGluc3RlYWQgb2YgbGlzdGVuaW5nIGZvciBgZmluaXNoYDpcbiAqIEhUVFAgaW5zdHJ1bWVudGF0aW9uIGVuZHMgaXRzIHNlcnZlciBzcGFuIG9uIGZpbmlzaCwgYW5kIGF0dHJpYnV0ZXMgc2V0XG4gKiBhZnRlciBhIHNwYW4gZW5kcyBuZXZlciByZWFjaCB0aGUgZXhwb3J0ZXIuXG4gKlxuICogYHBhdGhgIGlzIG1vdW50LXJlbGF0aXZlICh3aGF0IHRoZSBNYXN0cmEgc3ViLWFwcCBzZWVzKSwgZS5nLlxuICogYC9hZ2VudHMvc3VwcG9ydC9zdHJlYW1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhdFR1cm5UZWxlbWV0cnlNaWRkbGV3YXJlKFxuICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICBuZXh0OiBleHByZXNzLk5leHRGdW5jdGlvbixcbiAgb3B0aW9uczogQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgaWYgKHJlcS5tZXRob2QgIT09IFwiUE9TVFwiIHx8ICFBR0VOVF9UVVJOX1JPVVRFLnRlc3QocmVxLnBhdGgpKSB7XG4gICAgbmV4dCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0YXJnZXQgPSByZXNvbHZlVHJhY2VUYXJnZXQoKTtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICBuZXh0KCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRhcmdldFRyYWNlSWQgPSB0cmFjZUlkKHRhcmdldC5zcGFuKTtcbiAgaWYgKCF0YXJnZXRUcmFjZUlkKSB7XG4gICAgaWYgKHRhcmdldC5vd25lZCkgdGFyZ2V0LnNwYW4uZW5kKCk7XG4gICAgbmV4dCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0cmFjZVN0YXRlOiBDaGF0VHJhY2VTdGF0ZSA9IHsgbW9kZWxzOiBuZXcgU2V0KCksIHRhZ3M6IG5ldyBNYXAoKSB9O1xuICBjb25zdCB0cmFjZVJlcXVlc3RUaW1lID0gRGF0ZS5ub3coKTtcbiAgc2V0Q2hhdFRyYWNlVGFnKHRyYWNlU3RhdGUsIE1MRkxPV19BR0VOVF9UQUcsIHRydWUpO1xuICBpZiAoIWFwcGtpdC5pc0RhdGFicmlja3NBcHBFbnYoKSkge1xuICAgIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBNTEZMT1dfTE9DQUxfVEFHLCB0cnVlKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0UmVxdWVzdFRhZ3MocmVxKSkpIHtcbiAgICBzZXRDaGF0VHJhY2VUYWcodHJhY2VTdGF0ZSwgbmFtZSwgdmFsdWUpO1xuICB9XG4gIGNvbnN0IGluaXRpYWxUYWdzID0gdHlwZW9mIG9wdGlvbnMudGFncyA9PT0gXCJmdW5jdGlvblwiID8gb3B0aW9ucy50YWdzKHJlcSkgOiBvcHRpb25zLnRhZ3M7XG4gIGlmIChpbml0aWFsVGFncykge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbml0aWFsVGFncykpIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSBzZXRDaGF0VHJhY2VUYWcodHJhY2VTdGF0ZSwgbmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICBzdGFtcE1sZmxvd1RyYWNlSWQocmVzLCB0YXJnZXQuc3Bhbik7XG4gIHRyYWNlU3RhdGUudXNlciA9IHN0YW1wTWxmbG93QWN0b3IodGFyZ2V0LnNwYW4sIHJlcSk7XG4gIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9UWVBFX0FUVFIsIE1MRkxPV19TUEFOX1RZUEVfQUdFTlQpO1xuICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFIsIFwiaW52b2tlX2FnZW50XCIpO1xuICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX0FHRU5UX1RBR19BVFRSLCBcInRydWVcIik7XG4gIGNvbnN0IGlkZW50aXR5ID1cbiAgICB0eXBlb2Ygb3B0aW9ucy5pZGVudGl0eSA9PT0gXCJmdW5jdGlvblwiID8gb3B0aW9ucy5pZGVudGl0eShyZXEpIDogb3B0aW9ucy5pZGVudGl0eTtcbiAgaWYgKGlkZW50aXR5KSB7XG4gICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKENIQVRfSURFTlRJVFlfQVRUUiwgaWRlbnRpdHkpO1xuICAgIHNldENoYXRUcmFjZVRhZyhcbiAgICAgIHRyYWNlU3RhdGUsXG4gICAgICBpZGVudGl0eSA9PT0gXCJvYm9cIiA/IE1MRkxPV19PQk9fQVVUSF9UQUcgOiBNTEZMT1dfU1BfQVVUSF9UQUcsXG4gICAgICB0cnVlLFxuICAgICk7XG4gIH1cbiAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKENIQVRfR0VOSUVfVVNFRF9BVFRSLCBmYWxzZSk7XG5cbiAgY29uc3QgbWVzc2FnZXMgPSAocmVxLmJvZHkgYXMgeyBtZXNzYWdlcz86IHVua25vd24gfSB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2VzO1xuICBsZXQgcmVxdWVzdFByZXZpZXc6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgaWYgKG1lc3NhZ2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBmdWxsSW5wdXQgPSBzZXJpYWxpemVkKG1lc3NhZ2VzKTtcbiAgICByZXF1ZXN0UHJldmlldyA9IHRleHRPbmx5Q2hhdElucHV0KG1lc3NhZ2VzKSA/PyBmdWxsSW5wdXQ7XG4gICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKENIQVRfTUVTU0FHRVNfQVRUUiwgZnVsbElucHV0KTtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoXG4gICAgICBNTEZMT1dfU1BBTl9JTlBVVFNfQVRUUixcbiAgICAgIHJlcXVlc3RQcmV2aWV3LnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUKSxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgY29sbGVjdG9yID0gbmV3IEFzc2lzdGFudFJlc3BvbnNlQ29sbGVjdG9yKCk7XG4gIGxldCByZXNwb25zZVByZXZpZXc6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IG91dHB1dFJlY29yZGVkID0gZmFsc2U7XG4gIGxldCBmdWxsT3V0cHV0UmVjb3JkZWQgPSBmYWxzZTtcbiAgbGV0IGdlbmllUmVjb3JkZWQgPSBmYWxzZTtcbiAgbGV0IG93bmVkU3BhbkVuZGVkID0gZmFsc2U7XG4gIGxldCB0cmFjZUZpbmFsaXplZCA9IGZhbHNlO1xuICBjb25zdCBwYXNzVGhyb3VnaFdyaXRlID0gcmVzLndyaXRlLmJpbmQocmVzKSBhcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiBib29sZWFuO1xuICBjb25zdCBwYXNzVGhyb3VnaEVuZCA9IHJlcy5lbmQuYmluZChyZXMpIGFzICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd247XG4gIGNvbnN0IHBhc3NUaHJvdWdoSnNvbiA9IHJlcy5qc29uLmJpbmQocmVzKSBhcyAoYm9keT86IHVua25vd24pID0+IGV4cHJlc3MuUmVzcG9uc2U7XG4gIGNvbnN0IHJlY29yZE91dHB1dCA9IChhbnN3ZXI6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmIChvdXRwdXRSZWNvcmRlZCB8fCAhYW5zd2VyKSByZXR1cm47XG4gICAgcmVzcG9uc2VQcmV2aWV3ID0gYW5zd2VyO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9PVVRQVVRTX0FUVFIsIGFuc3dlci5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICAgIG91dHB1dFJlY29yZGVkID0gdHJ1ZTtcbiAgfTtcbiAgY29uc3QgcmVjb3JkRnVsbE91dHB1dCA9IChyZXNwb25zZTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgaWYgKGZ1bGxPdXRwdXRSZWNvcmRlZCB8fCAhcmVzcG9uc2UpIHJldHVybjtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9SRVNQT05TRV9BVFRSLCByZXNwb25zZS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICAgIGZ1bGxPdXRwdXRSZWNvcmRlZCA9IHRydWU7XG4gIH07XG4gIGNvbnN0IHJlY29yZEdlbmllID0gKHVzZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICBpZiAoIXVzZWQgfHwgZ2VuaWVSZWNvcmRlZCkgcmV0dXJuO1xuICAgIGdlbmllUmVjb3JkZWQgPSB0cnVlO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0dFTklFX1VTRURfQVRUUiwgdHJ1ZSk7XG4gICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19HRU5JRV9UQUdfQVRUUiwgXCJ0cnVlXCIpO1xuICAgIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBNTEZMT1dfR0VOSUVfVEFHLCB0cnVlKTtcbiAgICBjb250ZXh0LndpdGgodHJhY2Uuc2V0U3Bhbihjb250ZXh0LmFjdGl2ZSgpLCB0YXJnZXQuc3BhbiksICgpID0+IHtcbiAgICAgIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlVGFncyh7IFtNTEZMT1dfR0VOSUVfVEFHXTogXCJ0cnVlXCIgfSk7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGZpbmFsaXplVHJhY2UgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHRyYWNlRmluYWxpemVkKSByZXR1cm47XG4gICAgdHJhY2VGaW5hbGl6ZWQgPSB0cnVlO1xuICAgIGNvbnN0IG1vZGVsID0gbW9kZWxUcmFjZVRhZyh0cmFjZVN0YXRlLm1vZGVscyk7XG4gICAgaWYgKG1vZGVsKSBzZXRDaGF0VHJhY2VUYWcodHJhY2VTdGF0ZSwgTUxGTE9XX01PREVMX1RBRywgbW9kZWwpO1xuICAgIGNvbnN0IHRhZ3MgPSBPYmplY3QuZnJvbUVudHJpZXModHJhY2VTdGF0ZS50YWdzKTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgdHJhY2VTdGF0ZS50YWdzKSB7XG4gICAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoYCR7TUxGTE9XX1RSQUNFX1RBR19QUkVGSVh9JHtuYW1lfWAsIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRyYWNlU3RhdGUudXNlcikgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19VU0VSX0FUVFIsIHRyYWNlU3RhdGUudXNlcik7XG4gICAgY29udGV4dC53aXRoKHRyYWNlLnNldFNwYW4oY29udGV4dC5hY3RpdmUoKSwgdGFyZ2V0LnNwYW4pLCAoKSA9PiB7XG4gICAgICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZSh7XG4gICAgICAgIC4uLihPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAwID8geyB0YWdzIH0gOiB7fSksXG4gICAgICAgIC4uLih0cmFjZVN0YXRlLnVzZXIgPyB7IHVzZXI6IHRyYWNlU3RhdGUudXNlciB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcGVyc2lzdEFwcE1sZmxvd1RyYWNlSW5mbyh7XG4gICAgICB0cmFjZUlkOiB0YXJnZXRUcmFjZUlkLFxuICAgICAgcmVxdWVzdFRpbWU6IHRyYWNlUmVxdWVzdFRpbWUsXG4gICAgICBleGVjdXRpb25EdXJhdGlvbjogRGF0ZS5ub3coKSAtIHRyYWNlUmVxdWVzdFRpbWUsXG4gICAgICBlcnJvcjogcmVzLnN0YXR1c0NvZGUgPj0gNTAwLFxuICAgICAgdGFncyxcbiAgICAgIC4uLih0cmFjZVN0YXRlLnVzZXIgPyB7IHVzZXI6IHRyYWNlU3RhdGUudXNlciB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3RQcmV2aWV3ID8geyByZXF1ZXN0UHJldmlldyB9IDoge30pLFxuICAgICAgLi4uKHJlc3BvbnNlUHJldmlldyA/IHsgcmVzcG9uc2VQcmV2aWV3IH0gOiB7fSksXG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGVuZE93bmVkU3BhbiA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRhcmdldC5vd25lZCB8fCBvd25lZFNwYW5FbmRlZCkgcmV0dXJuO1xuICAgIG93bmVkU3BhbkVuZGVkID0gdHJ1ZTtcbiAgICB0YXJnZXQuc3Bhbi5lbmQoKTtcbiAgfTtcblxuICByZXMud3JpdGUgPSAoKGNodW5rOiB1bmtub3duLCAuLi5yZXN0OiB1bmtub3duW10pID0+IHtcbiAgICBjb2xsZWN0b3Iud3JpdGUoY2h1bmspO1xuICAgIHJldHVybiBwYXNzVGhyb3VnaFdyaXRlKGNodW5rLCAuLi5yZXN0KTtcbiAgfSkgYXMgdHlwZW9mIHJlcy53cml0ZTtcblxuICByZXMuanNvbiA9ICgoYm9keT86IHVua25vd24pID0+IHtcbiAgICByZWNvcmRGdWxsT3V0cHV0KHNlcmlhbGl6ZWQoYm9keSkpO1xuICAgIHJlY29yZEdlbmllKHZhbHVlVXNlc0dlbmllKGJvZHkpKTtcbiAgICByZWNvcmRPdXRwdXQoYXNzaXN0YW50VGV4dEZyb21Kc29uKGJvZHkpKTtcbiAgICByZXR1cm4gcGFzc1Rocm91Z2hKc29uKGJvZHkpO1xuICB9KSBhcyB0eXBlb2YgcmVzLmpzb247XG5cbiAgcmVzLmVuZCA9ICgoY2h1bms/OiB1bmtub3duLCAuLi5yZXN0OiB1bmtub3duW10pID0+IHtcbiAgICBjb2xsZWN0b3Iud3JpdGUoY2h1bmspO1xuICAgIHJlY29yZE91dHB1dChjb2xsZWN0b3IuZmluaXNoKCkpO1xuICAgIHJlY29yZEZ1bGxPdXRwdXQoY29sbGVjdG9yLnJhd0JvZHkoKSk7XG4gICAgcmVjb3JkR2VuaWUoY29sbGVjdG9yLnVzZWRHZW5pZSgpKTtcbiAgICBmaW5hbGl6ZVRyYWNlKCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBwYXNzVGhyb3VnaEVuZChjaHVuaywgLi4ucmVzdCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVuZE93bmVkU3BhbigpO1xuICAgIH1cbiAgfSkgYXMgdHlwZW9mIHJlcy5lbmQ7XG5cbiAgcmVzLm9uY2UoXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgcmVjb3JkT3V0cHV0KGNvbGxlY3Rvci5maW5pc2goKSk7XG4gICAgcmVjb3JkRnVsbE91dHB1dChjb2xsZWN0b3IucmF3Qm9keSgpKTtcbiAgICByZWNvcmRHZW5pZShjb2xsZWN0b3IudXNlZEdlbmllKCkpO1xuICAgIGZpbmFsaXplVHJhY2UoKTtcbiAgICBlbmRPd25lZFNwYW4oKTtcbiAgfSk7XG5cbiAgY29uc3QgY2hhdENvbnRleHQgPSB0cmFjZVxuICAgIC5zZXRTcGFuKGNvbnRleHQuYWN0aXZlKCksIHRhcmdldC5zcGFuKVxuICAgIC5zZXRWYWx1ZShDSEFUX1RSQUNFX1NUQVRFX0tFWSwgdHJhY2VTdGF0ZSk7XG4gIGNvbnRleHQud2l0aChjaGF0Q29udGV4dCwgKCkgPT4ge1xuICAgIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlVGFncyh7IFtNTEZMT1dfQUdFTlRfVEFHXTogXCJ0cnVlXCIgfSk7XG4gICAgbmV4dCgpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJbnN0YWxsIHtAbGluayBjaGF0VHVyblRlbGVtZXRyeU1pZGRsZXdhcmV9IG9uIGEgTWFzdHJhIEV4cHJlc3Mgc3ViLWFwcC5cbiAqXG4gKiBDYWxsIGJlZm9yZSBgTWFzdHJhU2VydmVyLmluaXQoKWAgc28gdGhlIGxheWVyIHNpdHMgYWhlYWQgb2YgdGhlIGFnZW50XG4gKiByb3V0ZXMuIFNhZmUgdG8gY2FsbCB1bmNvbmRpdGlvbmFsbHk6IHdoZW4gbm8gcmVjb3JkaW5nIHRyYWNlciBpcyByZWdpc3RlcmVkLFxuICogdGhlIG1pZGRsZXdhcmUgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaENoYXRUdXJuVGVsZW1ldHJ5KFxuICBhcHA6IGV4cHJlc3MuRXhwcmVzcyxcbiAgb3B0aW9uczogQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgYXBwLnVzZSgocmVxLCByZXMsIG5leHQpID0+IGNoYXRUdXJuVGVsZW1ldHJ5TWlkZGxld2FyZShyZXEsIHJlcywgbmV4dCwgb3B0aW9ucykpO1xuICBsb2dnZXIuaW5mbyhcImNoYXQgdHVybiB0ZWxlbWV0cnkgbWlkZGxld2FyZSBhdHRhY2hlZFwiLCBvcHRpb25zKTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -33,19 +33,19 @@
33
33
  },
34
34
  "dependencies": {
35
35
  "@databricks/appkit": "0.81.0",
36
- "@dbx-tools/appkit": "^0.9.67",
37
- "@dbx-tools/core": "^0.9.67",
38
- "@dbx-tools/databricks": "^0.9.67",
39
- "@dbx-tools/fs": "^0.9.67",
40
- "@dbx-tools/genie": "^0.9.67",
41
- "@dbx-tools/model": "^0.9.67",
42
- "@dbx-tools/path": "^0.9.67",
43
- "@dbx-tools/postgres": "^0.9.67",
44
- "@dbx-tools/shared-core": "^0.9.67",
45
- "@dbx-tools/shared-fs": "^0.9.67",
46
- "@dbx-tools/shared-genie": "^0.9.67",
47
- "@dbx-tools/shared-mastra": "^0.9.67",
48
- "@dbx-tools/shared-model": "^0.9.67",
36
+ "@dbx-tools/appkit": "^0.9.68",
37
+ "@dbx-tools/core": "^0.9.68",
38
+ "@dbx-tools/databricks": "^0.9.68",
39
+ "@dbx-tools/fs": "^0.9.68",
40
+ "@dbx-tools/genie": "^0.9.68",
41
+ "@dbx-tools/model": "^0.9.68",
42
+ "@dbx-tools/path": "^0.9.68",
43
+ "@dbx-tools/postgres": "^0.9.68",
44
+ "@dbx-tools/shared-core": "^0.9.68",
45
+ "@dbx-tools/shared-fs": "^0.9.68",
46
+ "@dbx-tools/shared-genie": "^0.9.68",
47
+ "@dbx-tools/shared-mastra": "^0.9.68",
48
+ "@dbx-tools/shared-model": "^0.9.68",
49
49
  "@mastra/ai-sdk": "1.10.5",
50
50
  "@mastra/core": "1.71.0",
51
51
  "@mastra/express": "1.5.15",
@@ -215,7 +215,7 @@
215
215
  "./package.json": "./package.json"
216
216
  }
217
217
  },
218
- "version": "0.9.67",
218
+ "version": "0.9.68",
219
219
  "types": "./lib/index.d.ts",
220
220
  "dbxToolsConfig": {
221
221
  "tags": [