@dbx-tools/appkit-mastra 0.9.144 → 0.9.145

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.
@@ -27,7 +27,7 @@ import { context, createContextKey, SpanKind, SpanStatusCode, trace, } from "@op
27
27
  import { getRPCMetadata, RPCType } from "@opentelemetry/core";
28
28
  import { MASTRA_AUTH_MODE_KEY, MASTRA_USER_EMAIL_KEY, MASTRA_USER_NAME_KEY } from "./config.js";
29
29
  import { USER_EMAIL_HEADER, USER_ID_HEADER } from "./identity.js";
30
- import { directMlflowTracingActive, initializeAppMlflowTraceInfo, persistAppMlflowTraceInfo, updateActiveMlflowTrace, updateActiveMlflowTraceTags, } from "./mlflow.js";
30
+ import { appMlflowTraceInfoConfigured, directMlflowTracingActive, initializeAppMlflowTraceInfo, persistAppMlflowTraceInfo, updateActiveMlflowTrace, updateActiveMlflowTraceTags, } from "./mlflow.js";
31
31
  import { APPKIT_AGENT_TRACE_ROOT_ATTR, MLFLOW_AGENT_TAG, MLFLOW_AGENT_TAG_ATTR, MLFLOW_GENIE_TAG, MLFLOW_GENIE_TAG_ATTR, MLFLOW_LOCAL_TAG, MLFLOW_OBO_AUTH_TAG, MLFLOW_SP_AUTH_TAG, MLFLOW_TRACE_TAG_PREFIX, } from "./trace-attributes.js";
32
32
  export { MLFLOW_AGENT_TAG, MLFLOW_AGENT_TAG_ATTR, APPKIT_AGENT_TRACE_ROOT_ATTR, MLFLOW_GENIE_TAG, MLFLOW_GENIE_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";
33
33
  const logger = log.logger("mastra/telemetry");
@@ -68,7 +68,7 @@ export const GEN_AI_OPERATION_NAME_ATTR = "gen_ai.operation.name";
68
68
  * Root-span user id the MLflow experiment UI's User column reads from OTel
69
69
  * traces. Prefer the forwarded email when present so the column is human.
70
70
  */
71
- export const MLFLOW_USER_ATTR = "user.id";
71
+ export const MLFLOW_USER_ATTR = appkitTelemetry.USER_TRACE_ATTRIBUTE;
72
72
  /** Root-span session id that enables the MLflow Sessions tab. */
73
73
  export const MLFLOW_SESSION_ATTR = "session.id";
74
74
  /** Root-span type for a Mastra agent turn. */
@@ -405,8 +405,9 @@ let appMlflowTraceInfoProcessorRegistered = false;
405
405
  export async function registerAppMlflowTraceInfoProcessor() {
406
406
  if (appMlflowTraceInfoProcessorRegistered)
407
407
  return true;
408
- if (!(await initializeAppMlflowTraceInfo()))
408
+ if (!appMlflowTraceInfoConfigured())
409
409
  return false;
410
+ await initializeAppMlflowTraceInfo();
410
411
  await appkitTelemetry.registerNativeSpanProcessor(new AppMlflowTraceInfoSpanProcessor());
411
412
  appMlflowTraceInfoProcessorRegistered = true;
412
413
  return true;
@@ -700,4 +701,4 @@ export function attachChatTurnTelemetry(app, options = {}) {
700
701
  app.use((req, res, next) => chatTurnTelemetryMiddleware(req, res, next, options));
701
702
  logger.info("chat turn telemetry middleware attached", options);
702
703
  }
703
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBELE9BQU8sRUFBRSxTQUFTLElBQUksZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTVELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzVGLE9BQU8sRUFDTCxPQUFPLEVBQ1AsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDUixjQUFjLEVBQ2QsS0FBSyxHQUdOLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUk5RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRSxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLDRCQUE0QixFQUM1Qix5QkFBeUIsRUFDekIsdUJBQXVCLEVBQ3ZCLDJCQUEyQixHQUM1QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLHFCQUFx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Q0FBQyxJQUFJLENBQUMseUNBQXlDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weSBlYWNoIE1hc3RyYSBjaGF0IHR1cm4ncyByZXF1ZXN0L3Jlc3BvbnNlIG9udG8gaXRzIE9UZWwgcm9vdCBzcGFuXG4gKiBzbyBEYXRhYnJpY2tzLW1hbmFnZWQgTUxmbG93IGNhbiBkaXNwbGF5IHRoZW0uXG4gKlxuICogV2h5IHRoaXMgZXhpc3RzOiBNTGZsb3cncyBVQyBgPHRhcmdldD5fdHJhY2VfdW5pZmllZGAgdmlldyBwaWNrcyB0aGVcbiAqIG9uZSBzcGFuIHdob3NlIGBwYXJlbnRfc3Bhbl9pZGAgaXMgZW1wdHkgYW5kIHJlYWRzIHJlcXVlc3QvcmVzcG9uc2VcbiAqIGZyb20gYG1sZmxvdy5zcGFuSW5wdXRzYCAvIGBtbGZsb3cuc3Bhbk91dHB1dHNgIChvciB0aGUgYGdlbl9haS4qYFxuICogZXF1aXZhbGVudHMpIG9uIFRIQVQgc3BhbiBvbmx5LiBNYXN0cmEgcmVjb3JkcyB0aGUgdHVybiBvbiBpdHNcbiAqIGBpbnZva2VfYWdlbnRgIGNoaWxkIHVuZGVyIGBtYXN0cmEuYWdlbnRfcnVuLmlucHV0YCAvIGAub3V0cHV0YCwga2V5c1xuICogdGhlIHZpZXcgbmV2ZXIgcmVhZHMsIHNvIGNoYXQgdHJhY2VzIGFycml2ZSB3aXRoIGJvdGggY29sdW1ucyBudWxsXG4gKiBldmVuIHdoZW4gdGhlIHNwYW5zIHRoZW1zZWx2ZXMgbG9vayBoZWFsdGh5LlxuICpcbiAqIEFwcEtpdCdzIEhUVFAgaW5zdHJ1bWVudGF0aW9uIHJlY29yZHMgdGhlIHNlcnZlciBzcGFuIGluIE9UZWwgUlBDIG1ldGFkYXRhLFxuICogd2hpY2ggcmVtYWlucyBhdmFpbGFibGUgZXZlbiB3aGVuIEV4cHJlc3MgbWFrZXMgYSBtaWRkbGV3YXJlLWxheWVyIGNoaWxkXG4gKiBhY3RpdmUuIFdoZW4gaW5zdHJ1bWVudGF0aW9uIGlzIHVuYXZhaWxhYmxlLCB0aGlzIG1vZHVsZSBjcmVhdGVzIG9uZVxuICogcmVxdWVzdC1saWZldGltZSBzZXJ2ZXIgc3BhbiBhbmQgcnVucyBNYXN0cmEgdW5kZXIgaXQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IFN0cmluZ0RlY29kZXIgfSBmcm9tIFwibm9kZTpzdHJpbmdfZGVjb2RlclwiO1xuXG5pbXBvcnQgeyB0ZWxlbWV0cnkgYXMgYXBwa2l0VGVsZW1ldHJ5IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBnZXRSZXF1ZXN0VGFncyB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC9yZXF1ZXN0LXRhZ3NcIjtcbmltcG9ydCB7IGVudmlyb25tZW50VXRpbHMsIGpzb24sIGxvZywgb2JqZWN0LCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBmZWVkYmFjaywgdGhyZWFkIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHR5cGUgeyBUcmFjaW5nT3B0aW9ucyB9IGZyb20gXCJAbWFzdHJhL2NvcmUvb2JzZXJ2YWJpbGl0eVwiO1xuaW1wb3J0IHsgTUFTVFJBX1JFU09VUkNFX0lEX0tFWSwgTUFTVFJBX1RIUkVBRF9JRF9LRVkgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHtcbiAgY29udGV4dCxcbiAgY3JlYXRlQ29udGV4dEtleSxcbiAgU3BhbktpbmQsXG4gIFNwYW5TdGF0dXNDb2RlLFxuICB0cmFjZSxcbiAgdHlwZSBDb250ZXh0LFxuICB0eXBlIFNwYW4sXG59IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9hcGlcIjtcbmltcG9ydCB7IGdldFJQQ01ldGFkYXRhLCBSUENUeXBlIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2NvcmVcIjtcbmltcG9ydCB0eXBlIHsgUmVhZGFibGVTcGFuLCBTcGFuIGFzIFNka1NwYW4sIFNwYW5Qcm9jZXNzb3IgfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvc2RrLXRyYWNlLWJhc2VcIjtcbmltcG9ydCB0eXBlIGV4cHJlc3MgZnJvbSBcImV4cHJlc3NcIjtcblxuaW1wb3J0IHsgTUFTVFJBX0FVVEhfTU9ERV9LRVksIE1BU1RSQV9VU0VSX0VNQUlMX0tFWSwgTUFTVFJBX1VTRVJfTkFNRV9LRVkgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IFVTRVJfRU1BSUxfSEVBREVSLCBVU0VSX0lEX0hFQURFUiB9IGZyb20gXCIuL2lkZW50aXR5LnRzXCI7XG5pbXBvcnQge1xuICBkaXJlY3RNbGZsb3dUcmFjaW5nQWN0aXZlLFxuICBpbml0aWFsaXplQXBwTWxmbG93VHJhY2VJbmZvLFxuICBwZXJzaXN0QXBwTWxmbG93VHJhY2VJbmZvLFxuICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZSxcbiAgdXBkYXRlQWN0aXZlTWxmbG93VHJhY2VUYWdzLFxufSBmcm9tIFwiLi9tbGZsb3cudHNcIjtcbmltcG9ydCB7XG4gIEFQUEtJVF9BR0VOVF9UUkFDRV9ST09UX0FUVFIsXG4gIE1MRkxPV19BR0VOVF9UQUcsXG4gIE1MRkxPV19BR0VOVF9UQUdfQVRUUixcbiAgTUxGTE9XX0dFTklFX1RBRyxcbiAgTUxGTE9XX0dFTklFX1RBR19BVFRSLFxuICBNTEZMT1dfTE9DQUxfVEFHLFxuICBNTEZMT1dfT0JPX0FVVEhfVEFHLFxuICBNTEZMT1dfU1BfQVVUSF9UQUcsXG4gIE1MRkxPV19UUkFDRV9UQUdfUFJFRklYLFxufSBmcm9tIFwiLi90cmFjZS1hdHRyaWJ1dGVzLnRzXCI7XG5cbmV4cG9ydCB7XG4gIE1MRkxPV19BR0VOVF9UQUcsXG4gIE1MRkxPV19BR0VOVF9UQUdfQVRUUixcbiAgQVBQS0lUX0FHRU5UX1RSQUNFX1JPT1RfQVRUUixcbiAgTUxGTE9XX0dFTklFX1RBRyxcbiAgTUxGTE9XX0dFTklFX1RBR19BVFRSLFxuICBNTEZMT1dfTE9DQUxfVEFHLFxuICBNTEZMT1dfTE9DQUxfVEFHX0FUVFIsXG4gIE1MRkxPV19PQk9fQVVUSF9UQUcsXG4gIE1MRkxPV19PQk9fQVVUSF9UQUdfQVRUUixcbiAgTUxGTE9XX1NQX0FVVEhfVEFHLFxuICBNTEZMT1dfU1BfQVVUSF9UQUdfQVRUUixcbiAgTUxGTE9XX1RSQUNFX1RBR19QUkVGSVgsXG59IGZyb20gXCIuL3RyYWNlLWF0dHJpYnV0ZXMudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS90ZWxlbWV0cnlcIik7XG5cbi8qKiBDYXAgb24gZWFjaCBwYXlsb2FkIGNvcGllZCBvbnRvIGEgc3Bhbiwgc28gb25lIHR1cm4gY2Fubm90IGJsb2F0IHRoZSBleHBvcnQuICovXG5leHBvcnQgY29uc3QgVFJBQ0VfSU9fTElNSVQgPSA4XzAwMDtcblxuLyoqIEJvdW5kIGZvciBhIG5vbi1zdHJlYW1pbmcgYm9keSBjYXB0dXJlZCB0aHJvdWdoIGByZXMuZW5kYCBpbnN0ZWFkIG9mIGByZXMuanNvbmAuICovXG5jb25zdCBSRVNQT05TRV9CT0RZX0xJTUlUID0gVFJBQ0VfSU9fTElNSVQgKiA0O1xuXG4vKiogVHJhY2VyIHNjb3BlIHVzZWQgb25seSB3aGVuIEFwcEtpdCBkaWQgbm90IGNyZWF0ZSBhIHJlY29yZGluZyBIVFRQIHNwYW4uICovXG5jb25zdCBDSEFUX1RVUk5fVFJBQ0VSID0gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmEvdGVsZW1ldHJ5XCI7XG5cbi8qKlxuICogTW91bnQtcmVsYXRpdmUgTWFzdHJhIGFnZW50IGludm9rZSBwYXRocyB0aGF0IGNhcnJ5IGEgY2hhdCB0dXJuIGJvZHlcbiAqIChgbWVzc2FnZXNgKSBhbmQgc3RyZWFtIGFuIGFzc2lzdGFudCBhbnN3ZXIuIFJlc3VtZSAvIGFwcHJvdmUgdmVyYnNcbiAqIGFyZSBpbnRlbnRpb25hbGx5IGV4Y2x1ZGVkOiB0aGVpciBib2RpZXMgYXJlIHRvb2wgZGVjaXNpb25zLCBub3QgdGhlXG4gKiB1c2VyIHByb21wdCwgYW5kIHRoZXkgcmFyZWx5IHByb2R1Y2UgYSBmcmVzaCBhbnN3ZXIgd29ydGggc3VyZmFjaW5nLlxuICovXG5jb25zdCBBR0VOVF9UVVJOX1JPVVRFID0gLyg/Ol58XFwvKSg/OmFnZW50c1xcL1teL10rXFwvKD86c3RyZWFtfGdlbmVyYXRlKXxjaGF0XFwvW14vXSspXFwvPyQvaTtcblxuLyoqIEF0dHJpYnV0ZSBrZXlzIHRoZSBNTGZsb3cgVUMgYCpfdHJhY2VfdW5pZmllZGAgdmlldyByZWFkcyBmcm9tIHRoZSByb290IHNwYW4uICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fSU5QVVRTX0FUVFIgPSBcIm1sZmxvdy5zcGFuSW5wdXRzXCI7XG4vKiogUm9vdC1zcGFuIGF0dHJpYnV0ZSBjb25zdW1lZCBhcyBjaGF0IG91dHB1dCBieSBNTGZsb3cgdW5pZmllZCB0cmFjZSB2aWV3cy4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU1BBTl9PVVRQVVRTX0FUVFIgPSBcIm1sZmxvdy5zcGFuT3V0cHV0c1wiO1xuLyoqIEZ1bGwgc2VyaWFsaXplZCByZXF1ZXN0IG1lc3NhZ2VzIHJldGFpbmVkIHdoZW4gdGhlIE1MZmxvdyBwcmV2aWV3IGlzIHBsYWluIHRleHQuICovXG5leHBvcnQgY29uc3QgQ0hBVF9NRVNTQUdFU19BVFRSID0gXCJhcHBraXQubWFzdHJhLmNoYXQubWVzc2FnZXNcIjtcbi8qKiBGdWxsIHNlcmlhbGl6ZWQgcmVzcG9uc2UgcmV0YWluZWQgd2hlbiB0aGUgTUxmbG93IHByZXZpZXcgaXMgcGxhaW4gdGV4dC4gKi9cbmV4cG9ydCBjb25zdCBDSEFUX1JFU1BPTlNFX0FUVFIgPSBcImFwcGtpdC5tYXN0cmEuY2hhdC5yZXNwb25zZVwiO1xuLyoqIENyZWRlbnRpYWwgbW9kZSB1c2VkIGJ5IERhdGFicmlja3MgY2FsbHMgaW4gdGhpcyBjaGF0IHR1cm4uICovXG5leHBvcnQgY29uc3QgQ0hBVF9JREVOVElUWV9BVFRSID0gXCJhcHBraXQubWFzdHJhLmlkZW50aXR5Lm1vZGVcIjtcbi8qKiBXaGV0aGVyIHRoZSBzdHJlYW1lZCB0dXJuIGVtaXR0ZWQgYSBHZW5pZSB0b29sIG9yIHByb2dyZXNzIGV2ZW50LiAqL1xuZXhwb3J0IGNvbnN0IENIQVRfR0VOSUVfVVNFRF9BVFRSID0gXCJhcHBraXQubWFzdHJhLmdlbmllLnVzZWRcIjtcbi8qKlxuICogTUxmbG93IHNwYW4tdHlwZSBhdHRyaWJ1dGUuIERhdGFicmlja3MgbWFwcyB0aGlzIChvciBgZ2VuX2FpLm9wZXJhdGlvbi5uYW1lYClcbiAqIG9udG8gdGhlIHR5cGUgY2hpcCBpbiB0aGUgZXhwZXJpbWVudCBVSS4gQ3VzdG9tIHZhbHVlcyBzdWNoIGFzIGBHRU5JRWAgYXJlXG4gKiBhbGxvd2VkLlxuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fVFlQRV9BVFRSID0gXCJtbGZsb3cuc3BhblR5cGVcIjtcbi8qKiBHZW5BSSBzZW1hbnRpYy1jb252ZW50aW9uIG9wZXJhdGlvbiBuYW1lLCBhbiBhbHRlcm5hdGUgc3Bhbi10eXBlIHNvdXJjZS4gKi9cbmV4cG9ydCBjb25zdCBHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUiA9IFwiZ2VuX2FpLm9wZXJhdGlvbi5uYW1lXCI7XG4vKipcbiAqIFJvb3Qtc3BhbiB1c2VyIGlkIHRoZSBNTGZsb3cgZXhwZXJpbWVudCBVSSdzIFVzZXIgY29sdW1uIHJlYWRzIGZyb20gT1RlbFxuICogdHJhY2VzLiBQcmVmZXIgdGhlIGZvcndhcmRlZCBlbWFpbCB3aGVuIHByZXNlbnQgc28gdGhlIGNvbHVtbiBpcyBodW1hbi5cbiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19VU0VSX0FUVFIgPSBcInVzZXIuaWRcIjtcbi8qKiBSb290LXNwYW4gc2Vzc2lvbiBpZCB0aGF0IGVuYWJsZXMgdGhlIE1MZmxvdyBTZXNzaW9ucyB0YWIuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NFU1NJT05fQVRUUiA9IFwic2Vzc2lvbi5pZFwiO1xuLyoqIFJvb3Qtc3BhbiB0eXBlIGZvciBhIE1hc3RyYSBhZ2VudCB0dXJuLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX1RZUEVfQUdFTlQgPSBcIkFHRU5UXCI7XG4vKiogU3BhbiB0eXBlIGZvciBhbiBgYXNrX2dlbmllYCB0b29sIGNhbGwuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fVFlQRV9HRU5JRSA9IFwiR0VOSUVcIjtcblxuLyoqIFJvb3Qtc3BhbiBtZXRhZGF0YSBrbm93biBiZWZvcmUgYSBjaGF0IHJlcXVlc3QgaXMgZGlzcGF0Y2hlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zIHtcbiAgcmVhZG9ubHkgaWRlbnRpdHk/OlxuICAgIFwib2JvXCIgfCBcInNlcnZpY2UtcHJpbmNpcGFsXCIgfCAoKHJlcXVlc3Q6IGV4cHJlc3MuUmVxdWVzdCkgPT4gXCJvYm9cIiB8IFwic2VydmljZS1wcmluY2lwYWxcIik7XG4gIC8qKiBJbml0aWFsIHRyYWNlIHRhZ3MgZGVyaXZlZCBmcm9tIHRoZSBpbmJvdW5kIHJlcXVlc3QuICovXG4gIHJlYWRvbmx5IHRhZ3M/OlxuICAgIHwgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQ2hhdFRyYWNlVGFnVmFsdWUgfCB1bmRlZmluZWQ+PlxuICAgIHwgKChyZXF1ZXN0OiBleHByZXNzLlJlcXVlc3QpID0+IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENoYXRUcmFjZVRhZ1ZhbHVlIHwgdW5kZWZpbmVkPj4pO1xufVxuXG5pbnRlcmZhY2UgVHJhY2VUYXJnZXQge1xuICBzcGFuOiBTcGFuO1xuICBvd25lZDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIENoYXRUcmFjZVN0YXRlIHtcbiAgcmVhZG9ubHkgdGFnczogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgcmVhZG9ubHkgdHJhY2VJZDogc3RyaW5nO1xuICByZWFkb25seSBwYXJlbnRTcGFuSWQ/OiBzdHJpbmc7XG4gIGZpcnN0TW9kZWw/OiBzdHJpbmc7XG4gIHVzZXI/OiBzdHJpbmc7XG59XG5cbi8qKiBWYWx1ZXMgYWNjZXB0ZWQgYnkgcmVxdWVzdC1zY29wZWQgdHJhY2UtdGFnIGluamVjdGlvbiBoZWxwZXJzLiAqL1xuZXhwb3J0IHR5cGUgQ2hhdFRyYWNlVGFnVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG5jb25zdCBDSEFUX1RSQUNFX1NUQVRFX0tFWSA9IGNyZWF0ZUNvbnRleHRLZXkoXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmEvY2hhdC10cmFjZS1zdGF0ZVwiKTtcblxuLyoqIE9wZW5UZWxlbWV0cnkncyBzZW50aW5lbCBmb3IgXCJubyB2YWxpZCB0cmFjZVwiIC0gMzIgemVybyBoZXggY2hhcnMuICovXG5jb25zdCBJTlZBTElEX1RSQUNFX0lEID0gXCIwXCIucmVwZWF0KDMyKTtcblxuLyoqXG4gKiBNYXJrIHRoZSBhY3RpdmUgc3BhbiBhcyBhIEdlbmllIGNhbGwgc28gdGhlIGV4cGVyaW1lbnQgVUkgdHlwZXMgaXQgYEdFTklFYFxuICogYW5kIHRhZ3MgdGhlIHRyYWNlIGBnZW5pZT10cnVlYC4gU2FmZSBuby1vcCB3aGVuIG5vIHJlY29yZGluZyBzcGFuIGlzIGFjdGl2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YW1wR2VuaWVUb29sU3BhbihzcGFuOiBTcGFuIHwgdW5kZWZpbmVkID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpKTogdm9pZCB7XG4gIGlmICghc3Bhbj8uaXNSZWNvcmRpbmcoKSkgcmV0dXJuO1xuICBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9UWVBFX0FUVFIsIE1MRkxPV19TUEFOX1RZUEVfR0VOSUUpO1xuICBzcGFuLnNldEF0dHJpYnV0ZShHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUiwgXCJleGVjdXRlX3Rvb2xcIik7XG4gIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19HRU5JRV9UQUdfQVRUUiwgXCJ0cnVlXCIpO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0SGVhZGVyKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBmcm9tTWV0aG9kID1cbiAgICB0eXBlb2YgcmVxLmhlYWRlciA9PT0gXCJmdW5jdGlvblwiID8gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChyZXEuaGVhZGVyKG5hbWUpKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGZyb21NZXRob2QpIHJldHVybiBmcm9tTWV0aG9kO1xuICBjb25zdCByYXcgPSByZXEuaGVhZGVycz8uW25hbWUudG9Mb3dlckNhc2UoKV07XG4gIGNvbnN0IHZhbHVlID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3WzBdIDogcmF3O1xuICByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvTnVsbCh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHVuZGVmaW5lZCkgPz8gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0UXVlcnkocmVxOiBleHByZXNzLlJlcXVlc3QsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhdyA9IHJlcS5xdWVyeT8uW25hbWVdO1xuICBjb25zdCB2YWx1ZSA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhd1swXSA6IHJhdztcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB1bmRlZmluZWQpID8/IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc3RhbXBNbGZsb3dBY3RvcihzcGFuOiBTcGFuLCByZXE6IGV4cHJlc3MuUmVxdWVzdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0SGVhZGVyKHJlcSwgVVNFUl9FTUFJTF9IRUFERVIpID8/IHJlcXVlc3RIZWFkZXIocmVxLCBVU0VSX0lEX0hFQURFUik7XG4gIGlmICh1c2VyKSBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfVVNFUl9BVFRSLCB1c2VyKTtcbiAgY29uc3Qgc2Vzc2lvbiA9XG4gICAgcmVxdWVzdEhlYWRlcihyZXEsIHRocmVhZC5USFJFQURfSURfSEVBREVSKSA/PyByZXF1ZXN0UXVlcnkocmVxLCB0aHJlYWQuVEhSRUFEX0lEX1FVRVJZKTtcbiAgaWYgKHNlc3Npb24pIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19TRVNTSU9OX0FUVFIsIHNlc3Npb24pO1xuICByZXR1cm4gdXNlcjtcbn1cblxuZnVuY3Rpb24gdHJhY2VJZChzcGFuOiBTcGFuIHwgdW5kZWZpbmVkID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSBzcGFuPy5zcGFuQ29udGV4dCgpLnRyYWNlSWQ7XG4gIHJldHVybiB2YWx1ZSAmJiB2YWx1ZSAhPT0gSU5WQUxJRF9UUkFDRV9JRCA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpOiBDaGF0VHJhY2VTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZXh0LmFjdGl2ZSgpLmdldFZhbHVlKENIQVRfVFJBQ0VfU1RBVEVfS0VZKSBhcyBDaGF0VHJhY2VTdGF0ZSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBCaW5kIGEgTWFzdHJhIGFnZW50IHJ1biB0byB0aGUgdHJhY2Ugc2VsZWN0ZWQgYnkgY2hhdCB0ZWxlbWV0cnkuXG4gKlxuICogRGF0YWJyaWNrcyBBcHBzIHVzZXMgYSBkZWRpY2F0ZWQgYWdlbnQgdHJhY2UgYmVjYXVzZSBldmVudGVkIGFnZW50cyBmaW5pc2hcbiAqIGJlZm9yZSB0aGUgSFRUUCBzZXJ2ZXIgc3Bhbi4gUHJvbW90aW5nIE1MZmxvdyB0cmFjZSBpbmZvIGFmdGVyIHRoZSBhZ2VudCByb290XG4gKiBjbG9zZXMgYXZvaWRzIHRoZSBzaWRlY2FyIHJlcGxhY2luZyBjbGVhbiBwcmV2aWV3cyBhbmQgdGFncyB3aXRoIGVtcHR5IEhUVFBcbiAqIHRyYWNlIG1ldGFkYXRhLiBPdGhlciBydW50aW1lcyByZXRhaW4gdGhlIGV4aXN0aW5nIEhUVFAvbG9jYWwgcGFyZW50YWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0aXZlQ2hhdFRyYWNpbmdPcHRpb25zKFxuICBvcHRpb25zOiBUcmFjaW5nT3B0aW9ucyB8IHVuZGVmaW5lZCxcbik6IFRyYWNpbmdPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhdGUgPSBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpO1xuICBpZiAoIXN0YXRlKSByZXR1cm4gb3B0aW9ucztcbiAgcmV0dXJuIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHRyYWNlSWQ6IHN0YXRlLnRyYWNlSWQsXG4gICAgLi4uKHN0YXRlLnBhcmVudFNwYW5JZCA/IHsgcGFyZW50U3BhbklkOiBzdGF0ZS5wYXJlbnRTcGFuSWQgfSA6IHsgcGFyZW50U3BhbklkOiB1bmRlZmluZWQgfSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNldENoYXRUcmFjZVRhZyhzdGF0ZTogQ2hhdFRyYWNlU3RhdGUsIG5hbWU6IHN0cmluZywgdmFsdWU6IENoYXRUcmFjZVRhZ1ZhbHVlKTogdm9pZCB7XG4gIGNvbnN0IHRhZyA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwobmFtZSk7XG4gIGlmICghdGFnKSByZXR1cm47XG4gIHN0YXRlLnRhZ3Muc2V0KHRhZywgU3RyaW5nKHZhbHVlKSk7XG59XG5cbi8qKiBJbmplY3Qgb25lIE1MZmxvdyB0cmFjZSB0YWcgaW50byB0aGUgYWN0aXZlIGNoYXQgcmVxdWVzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBY3RpdmVUcmFjZVRhZyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBDaGF0VHJhY2VUYWdWYWx1ZSA9IHRydWUpOiB2b2lkIHtcbiAgY29uc3Qgc3RhdGUgPSBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpO1xuICBpZiAoc3RhdGUpIHNldENoYXRUcmFjZVRhZyhzdGF0ZSwgbmFtZSwgdmFsdWUpO1xufVxuXG4vKiogSW5qZWN0IG11bHRpcGxlIE1MZmxvdyB0cmFjZSB0YWdzIGludG8gdGhlIGFjdGl2ZSBjaGF0IHJlcXVlc3QuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VUYWdzKFxuICB0YWdzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBDaGF0VHJhY2VUYWdWYWx1ZSB8IHVuZGVmaW5lZD4+LFxuKTogdm9pZCB7XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKCFzdGF0ZSkgcmV0dXJuO1xuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGFncykpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgc2V0Q2hhdFRyYWNlVGFnKHN0YXRlLCBuYW1lLCB2YWx1ZSk7XG4gIH1cbn1cblxuLyoqIFJlY29yZCB0aGUgZmlyc3Qgc2VsZWN0ZWQgbW9kZWwgYXMgdGhlIGFjdGl2ZSBjaGF0IHRyYWNlJ3MgYGFnZW50YCB0YWcuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VNb2RlbChtb2RlbElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgdmFsdWUgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKG1vZGVsSWQpO1xuICBpZiAoIXZhbHVlKSByZXR1cm47XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKCFzdGF0ZSB8fCBzdGF0ZS5maXJzdE1vZGVsKSByZXR1cm47XG4gIHN0YXRlLmZpcnN0TW9kZWwgPSB2YWx1ZTtcbiAgc2V0Q2hhdFRyYWNlVGFnKHN0YXRlLCBNTEZMT1dfQUdFTlRfVEFHLCB2YWx1ZSk7XG4gIGNvbnN0IHNwYW4gPSB0cmFjZS5nZXRBY3RpdmVTcGFuKCk7XG4gIGlmIChzcGFuPy5pc1JlY29yZGluZygpKSBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfQUdFTlRfVEFHX0FUVFIsIHZhbHVlKTtcbiAgdXBkYXRlQWN0aXZlTWxmbG93VHJhY2VUYWdzKHsgW01MRkxPV19BR0VOVF9UQUddOiB2YWx1ZSB9KTtcbn1cblxuLyoqIFJlY29yZCB0aGUgYmVzdCByZXNvbHZlZCB1c2VyIGlkZW50aWZpZXIgb24gdGhlIGFjdGl2ZSBjaGF0IHRyYWNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEFjdGl2ZVRyYWNlVXNlcih1c2VyOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgY29uc3QgdmFsdWUgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKHVzZXIpO1xuICBpZiAoIXZhbHVlKSByZXR1cm47XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKHN0YXRlKSBzdGF0ZS51c2VyID0gdmFsdWU7XG59XG5cbi8qKiBSZWNvcmQgb25lIERhdGFicmlja3MgYXV0aGVudGljYXRpb24gbW9kZSB1c2VkIGR1cmluZyB0aGUgYWN0aXZlIGNoYXQgdHJhY2UuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VBdXRoKGF1dGg6IFwib2JvXCIgfCBcInNlcnZpY2UtcHJpbmNpcGFsXCIpOiB2b2lkIHtcbiAgcmVjb3JkQWN0aXZlVHJhY2VUYWcoYXV0aCA9PT0gXCJvYm9cIiA/IE1MRkxPV19PQk9fQVVUSF9UQUcgOiBNTEZMT1dfU1BfQVVUSF9UQUcpO1xufVxuXG4vKiogUHVibGlzaCB0aGUgdHVybidzIE1MZmxvdyB0cmFjZSBpZCBiZWZvcmUgdGhlIGhhbmRsZXIgd3JpdGVzIHRoZSBib2R5LiAqL1xuZnVuY3Rpb24gc3RhbXBNbGZsb3dUcmFjZUlkKHJlczogZXhwcmVzcy5SZXNwb25zZSwgdHJhY2VJZDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChyZXMuaGVhZGVyc1NlbnQpIHJldHVybjtcbiAgaWYgKCF0cmFjZUlkIHx8IHRyYWNlSWQgPT09IElOVkFMSURfVFJBQ0VfSUQpIHJldHVybjtcbiAgcmVzLnNldEhlYWRlcihmZWVkYmFjay5NTEZMT1dfVFJBQ0VfSURfSEVBREVSLCBgdHItJHt0cmFjZUlkfWApO1xufVxuXG4vKiogUmV0dXJuIG9uZSByYXcgcHJvbXB0IHdoZW4gdGhlIHJlcXVlc3QgaXMgZXhhY3RseSBvbmUgdGV4dC1vbmx5IHVzZXIgbWVzc2FnZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0T25seUNoYXRJbnB1dChtZXNzYWdlczogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgbWVzc2FnZXMgPT09IFwic3RyaW5nXCIpIHJldHVybiBtZXNzYWdlcyB8fCB1bmRlZmluZWQ7XG4gIGlmICghQXJyYXkuaXNBcnJheShtZXNzYWdlcykgfHwgbWVzc2FnZXMubGVuZ3RoICE9PSAxKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXNbMF07XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKG1lc3NhZ2UpIHx8IG1lc3NhZ2Uucm9sZSAhPT0gXCJ1c2VyXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSBcInN0cmluZ1wiKSByZXR1cm4gbWVzc2FnZS5jb250ZW50IHx8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRleHRGcm9tUGFydHMobWVzc2FnZS5wYXJ0cykgPz8gdGV4dEZyb21QYXJ0cyhtZXNzYWdlLmNvbnRlbnQpO1xufVxuXG5mdW5jdGlvbiB0ZXh0RnJvbVBhcnRzKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHRleHQ6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcGFydCBvZiB2YWx1ZSkge1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKHBhcnQpIHx8IHBhcnQudHlwZSAhPT0gXCJ0ZXh0XCIgfHwgdHlwZW9mIHBhcnQudGV4dCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGV4dC5wdXNoKHBhcnQudGV4dCk7XG4gIH1cbiAgY29uc3Qgam9pbmVkID0gdGV4dC5qb2luKFwiXCIpO1xuICByZXR1cm4gam9pbmVkIHx8IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplZCh2YWx1ZTogdW5rbm93biwgbGltaXQgPSBUUkFDRV9JT19MSU1JVCk6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk/LnNsaWNlKDAsIGxpbWl0KSA/PyBTdHJpbmcodmFsdWUpLnNsaWNlKDAsIGxpbWl0KTtcbn1cblxuZnVuY3Rpb24gc3NlRnJhbWUobGluZTogc3RyaW5nKTogdW5rbm93biB7XG4gIGlmICghbGluZS5zdGFydHNXaXRoKFwiZGF0YTpcIikpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBqc29uLnBhcnNlKGxpbmUuc2xpY2UoNSkpO1xufVxuXG5mdW5jdGlvbiB2YWx1ZVVzZXNHZW5pZSh2YWx1ZTogdW5rbm93biwgZGVwdGggPSAwKTogYm9vbGVhbiB7XG4gIGlmIChkZXB0aCA+IDMpIHJldHVybiBmYWxzZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuc29tZSgoaXRlbSkgPT4gdmFsdWVVc2VzR2VuaWUoaXRlbSwgZGVwdGggKyAxKSk7XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoXG4gICAgdmFsdWUudHlwZSA9PT0gXCJkYXRhLWdlbmllLXByb2dyZXNzXCIgfHxcbiAgICB2YWx1ZS50eXBlID09PSBcImFza19nZW5pZV9kb25lXCIgfHxcbiAgICB2YWx1ZS50b29sTmFtZSA9PT0gXCJhc2tfZ2VuaWVcIiB8fFxuICAgIHZhbHVlLnRvb2xfbmFtZSA9PT0gXCJhc2tfZ2VuaWVcIiB8fFxuICAgIHZhbHVlLm5hbWUgPT09IFwiYXNrX2dlbmllXCJcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIFtcImRhdGFcIiwgXCJldmVudFwiLCBcInBheWxvYWRcIl0uc29tZSgoa2V5KSA9PiB2YWx1ZVVzZXNHZW5pZSh2YWx1ZVtrZXldLCBkZXB0aCArIDEpKTtcbn1cblxuLyoqIFJldHVybiB0aGUgYXNzaXN0YW50IHRleHQgZnJvbSBvbmUgU1NFIGxpbmUsIG9yIGFuIGVtcHR5IHN0cmluZy4gKi9cbmZ1bmN0aW9uIGFzc2lzdGFudFRleHRGcm9tU3NlTGluZShsaW5lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYXNzaXN0YW50VGV4dEZyb21Tc2VGcmFtZShzc2VGcmFtZShsaW5lKSk7XG59XG5cbmZ1bmN0aW9uIGFzc2lzdGFudFRleHRGcm9tU3NlRnJhbWUoZnJhbWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAoIW9iamVjdC5pc1JlY29yZChmcmFtZSkgfHwgZnJhbWUudHlwZSAhPT0gXCJ0ZXh0LWRlbHRhXCIpIHJldHVybiBcIlwiO1xuICBjb25zdCB0ZXh0ID1cbiAgICB0eXBlb2YgZnJhbWUuZGVsdGEgPT09IFwic3RyaW5nXCJcbiAgICAgID8gZnJhbWUuZGVsdGFcbiAgICAgIDogb2JqZWN0LmlzUmVjb3JkKGZyYW1lLnBheWxvYWQpXG4gICAgICAgID8gZnJhbWUucGF5bG9hZC50ZXh0XG4gICAgICAgIDogdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIHRleHQgPT09IFwic3RyaW5nXCIgPyB0ZXh0IDogXCJcIjtcbn1cblxuLyoqXG4gKiBDb25jYXRlbmF0ZSB0aGUgYXNzaXN0YW50J3MgYW5zd2VyIG91dCBvZiBhbiBBSSBTREsgU1NFIHRyYW5zY3JpcHQuXG4gKlxuICogVGhlIGFnZW50IHN0cmVhbXMgaXRzIHJlcGx5IGFzIGB0ZXh0LWRlbHRhYCBmcmFtZXNcbiAqIChgZGF0YToge1widHlwZVwiOlwidGV4dC1kZWx0YVwiLFwicGF5bG9hZFwiOntcInRleHRcIjpcIi4uLlwifX1gKSwgc28gdGhlIGZ1bGxcbiAqIGFuc3dlciBvbmx5IGV2ZXIgZXhpc3RzIGFzIGRlbHRhcyBvbiB0aGUgd2lyZSBhbmQgaGFzIHRvIGJlXG4gKiByZWFzc2VtYmxlZCBoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaXN0YW50VGV4dEZyb21Tc2UoYm9keTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbGluZSBvZiBib2R5LnNwbGl0KFwiXFxuXCIpKSB7XG4gICAgY29uc3QgdGV4dCA9IGFzc2lzdGFudFRleHRGcm9tU3NlTGluZShsaW5lKTtcbiAgICBpZiAodGV4dCkgcGFydHMucHVzaCh0ZXh0KTtcbiAgfVxuICByZXR1cm4gcGFydHMuam9pbihcIlwiKS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCk7XG59XG5cbi8qKiBSZWFkIHRoZSBmaW5hbCBhc3Npc3RhbnQgdGV4dCBmcm9tIGEgbm9uLXN0cmVhbWluZyBNYXN0cmEgcmVzcG9uc2UuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaXN0YW50VGV4dEZyb21Kc29uKGJvZHk6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAoIW9iamVjdC5pc1JlY29yZChib2R5KSB8fCB0eXBlb2YgYm9keS50ZXh0ICE9PSBcInN0cmluZ1wiKSByZXR1cm4gXCJcIjtcbiAgcmV0dXJuIGJvZHkudGV4dC5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCk7XG59XG5cbmNvbnN0IE1BU1RSQV9BR0VOVF9JTlBVVF9BVFRSID0gXCJtYXN0cmEuYWdlbnRfcnVuLmlucHV0XCI7XG5jb25zdCBNQVNUUkFfQUdFTlRfT1VUUFVUX0FUVFIgPSBcIm1hc3RyYS5hZ2VudF9ydW4ub3V0cHV0XCI7XG5jb25zdCBHRU5fQUlfUkVRVUVTVF9NT0RFTF9BVFRSID0gXCJnZW5fYWkucmVxdWVzdC5tb2RlbFwiO1xuY29uc3QgR0VOX0FJX0FHRU5UX0lEX0FUVFIgPSBcImdlbl9haS5hZ2VudC5pZFwiO1xuY29uc3QgR0VOX0FJX0FHRU5UX05BTUVfQVRUUiA9IFwiZ2VuX2FpLmFnZW50Lm5hbWVcIjtcbmNvbnN0IE1BU1RSQV9NT0RFTF9NRVRBREFUQV9BVFRSID0gXCJtYXN0cmEubWV0YWRhdGEubW9kZWxNZXRhZGF0YVwiO1xuY29uc3QgTUFTVFJBX01FVEFEQVRBX1BSRUZJWCA9IFwibWFzdHJhLm1ldGFkYXRhLlwiO1xuXG5pbnRlcmZhY2UgQXBwTWxmbG93VHJhY2VTdGF0ZSB7XG4gIHJlYWRvbmx5IHRhZ3M6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIGdlbmllOiBib29sZWFuO1xuICBtb2RlbD86IHN0cmluZztcbn1cblxuZnVuY3Rpb24gYXR0cmlidXRlU3RyaW5nKHNwYW46IFJlYWRhYmxlU3BhbiwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSBzcGFuLmF0dHJpYnV0ZXNbbmFtZV07XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyAoc3RyaW5nVXRpbHMudHJpbVRvTnVsbCh2YWx1ZSkgPz8gdW5kZWZpbmVkKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gbWV0YWRhdGFBdHRyaWJ1dGUoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7TUFTVFJBX01FVEFEQVRBX1BSRUZJWH0ke2tleX1gO1xufVxuXG5mdW5jdGlvbiBtb2RlbEZyb21TcGFuKHNwYW46IFJlYWRhYmxlU3Bhbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRpcmVjdCA9IGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBHRU5fQUlfUkVRVUVTVF9NT0RFTF9BVFRSKTtcbiAgaWYgKGRpcmVjdCkgcmV0dXJuIGRpcmVjdDtcbiAgY29uc3QgbWV0YWRhdGEgPSBqc29uLnBhcnNlKGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBNQVNUUkFfTU9ERUxfTUVUQURBVEFfQVRUUikpO1xuICByZXR1cm4gb2JqZWN0LmlzUmVjb3JkKG1ldGFkYXRhKSAmJiB0eXBlb2YgbWV0YWRhdGEubW9kZWxJZCA9PT0gXCJzdHJpbmdcIlxuICAgID8gKHN0cmluZ1V0aWxzLnRyaW1Ub051bGwobWV0YWRhdGEubW9kZWxJZCkgPz8gdW5kZWZpbmVkKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBzcGFuVXNlc0dlbmllKHNwYW46IFJlYWRhYmxlU3Bhbik6IGJvb2xlYW4ge1xuICBpZiAoc3Bhbi5hdHRyaWJ1dGVzW01MRkxPV19HRU5JRV9UQUdfQVRUUl0gPT09IFwidHJ1ZVwiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKC9cXGJhc2tfZ2VuaWUoPzpffFxcYikvaS50ZXN0KHNwYW4ubmFtZSkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gW1wiZ2VuX2FpLnRvb2wubmFtZVwiLCBcIm1hc3RyYS50b29sX2NhbGwubmFtZVwiXS5zb21lKChuYW1lKSA9PlxuICAgIC9eYXNrX2dlbmllKD86X3wkKS9pLnRlc3QoYXR0cmlidXRlU3RyaW5nKHNwYW4sIG5hbWUpID8/IFwiXCIpLFxuICApO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0VHJhY2VUYWdzKHNwYW46IFJlYWRhYmxlU3Bhbiwgc3RhdGU6IEFwcE1sZmxvd1RyYWNlU3RhdGUpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNwYW4uYXR0cmlidXRlcykpIHtcbiAgICBpZiAoIW5hbWUuc3RhcnRzV2l0aChNTEZMT1dfVFJBQ0VfVEFHX1BSRUZJWCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHRhZyA9IG5hbWUuc2xpY2UoTUxGTE9XX1RSQUNFX1RBR19QUkVGSVgubGVuZ3RoKTtcbiAgICBpZiAoXG4gICAgICB0YWcgJiZcbiAgICAgICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpXG4gICAgKSB7XG4gICAgICBzdGF0ZS50YWdzLnNldCh0YWcsIFN0cmluZyh2YWx1ZSkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoclRpbWVNaWxsaXNlY29uZHModmFsdWU6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl0pOiBudW1iZXIge1xuICByZXR1cm4gdmFsdWVbMF0gKiAxXzAwMCArIHZhbHVlWzFdIC8gMV8wMDBfMDAwO1xufVxuXG5mdW5jdGlvbiBwcmV2aWV3SW5wdXQoc3BhbjogUmVhZGFibGVTcGFuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmF3ID0gYXR0cmlidXRlU3RyaW5nKHNwYW4sIE1BU1RSQV9BR0VOVF9JTlBVVF9BVFRSKTtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiAodGV4dE9ubHlDaGF0SW5wdXQoanNvbi5wYXJzZShyYXcpKSA/PyByYXcpLnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUKTtcbn1cblxuZnVuY3Rpb24gcHJldmlld091dHB1dChzcGFuOiBSZWFkYWJsZVNwYW4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByYXcgPSBhdHRyaWJ1dGVTdHJpbmcoc3BhbiwgTUFTVFJBX0FHRU5UX09VVFBVVF9BVFRSKTtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBhcnNlZCA9IGpzb24ucGFyc2UocmF3KTtcbiAgY29uc3QgdGV4dCA9IGFzc2lzdGFudFRleHRGcm9tSnNvbihwYXJzZWQpIHx8ICh0eXBlb2YgcGFyc2VkID09PSBcInN0cmluZ1wiID8gcGFyc2VkIDogcmF3KTtcbiAgcmV0dXJuIHRleHQuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpO1xufVxuXG4vKiogUHJvbW90ZSB0aGUgYWN0dWFsIE1hc3RyYSBgaW52b2tlX2FnZW50YCB0cmFjZSBleHBvcnRlZCBieSBBcHBLaXQncyBwcm92aWRlci4gKi9cbmV4cG9ydCBjbGFzcyBBcHBNbGZsb3dUcmFjZUluZm9TcGFuUHJvY2Vzc29yIGltcGxlbWVudHMgU3BhblByb2Nlc3NvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhY2VzID0gbmV3IE1hcDxzdHJpbmcsIEFwcE1sZmxvd1RyYWNlU3RhdGU+KCk7XG5cbiAgb25TdGFydChzcGFuOiBTZGtTcGFuLCBfcGFyZW50Q29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuICAgIGNvbnN0IHRyYWNlSWQgPSBzcGFuLnNwYW5Db250ZXh0KCkudHJhY2VJZDtcbiAgICBpZiAoIXRoaXMudHJhY2VzLmhhcyh0cmFjZUlkKSkge1xuICAgICAgdGhpcy50cmFjZXMuc2V0KHRyYWNlSWQsIHsgdGFnczogbmV3IE1hcCgpLCBnZW5pZTogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgb25FbmQoc3BhbjogUmVhZGFibGVTcGFuKTogdm9pZCB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHNwYW4uc3BhbkNvbnRleHQoKS50cmFjZUlkO1xuICAgIGNvbnN0IHN0YXRlOiBBcHBNbGZsb3dUcmFjZVN0YXRlID0gdGhpcy50cmFjZXMuZ2V0KHRyYWNlSWQpID8/IHtcbiAgICAgIHRhZ3M6IG5ldyBNYXAoKSxcbiAgICAgIGdlbmllOiBmYWxzZSxcbiAgICB9O1xuICAgIHRoaXMudHJhY2VzLnNldCh0cmFjZUlkLCBzdGF0ZSk7XG4gICAgY29sbGVjdFRyYWNlVGFncyhzcGFuLCBzdGF0ZSk7XG4gICAgc3RhdGUubW9kZWwgPz89IG1vZGVsRnJvbVNwYW4oc3Bhbik7XG4gICAgc3RhdGUuZ2VuaWUgfHw9IHNwYW5Vc2VzR2VuaWUoc3Bhbik7XG5cbiAgICBpZiAoYXR0cmlidXRlU3RyaW5nKHNwYW4sIEdFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSKSAhPT0gXCJpbnZva2VfYWdlbnRcIikge1xuICAgICAgaWYgKCFzcGFuLnBhcmVudFNwYW5Db250ZXh0Py5zcGFuSWQpIHRoaXMudHJhY2VzLmRlbGV0ZSh0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhZ2VudCA9XG4gICAgICBzdGF0ZS5tb2RlbCA/P1xuICAgICAgYXR0cmlidXRlU3RyaW5nKHNwYW4sIEdFTl9BSV9BR0VOVF9JRF9BVFRSKSA/P1xuICAgICAgYXR0cmlidXRlU3RyaW5nKHNwYW4sIEdFTl9BSV9BR0VOVF9OQU1FX0FUVFIpO1xuICAgIGlmIChhZ2VudCkgc3RhdGUudGFncy5zZXQoTUxGTE9XX0FHRU5UX1RBRywgYWdlbnQpO1xuICAgIGlmIChzdGF0ZS5nZW5pZSkgc3RhdGUudGFncy5zZXQoTUxGTE9XX0dFTklFX1RBRywgXCJ0cnVlXCIpO1xuICAgIGNvbnN0IGF1dGggPSBhdHRyaWJ1dGVTdHJpbmcoc3BhbiwgbWV0YWRhdGFBdHRyaWJ1dGUoTUFTVFJBX0FVVEhfTU9ERV9LRVkpKTtcbiAgICBpZiAoYXV0aCA9PT0gXCJvYm9cIikgc3RhdGUudGFncy5zZXQoTUxGTE9XX09CT19BVVRIX1RBRywgXCJ0cnVlXCIpO1xuICAgIGVsc2UgaWYgKGF1dGggPT09IFwic2VydmljZS1wcmluY2lwYWxcIikgc3RhdGUudGFncy5zZXQoTUxGTE9XX1NQX0FVVEhfVEFHLCBcInRydWVcIik7XG5cbiAgICBjb25zdCB1c2VyID1cbiAgICAgIGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBtZXRhZGF0YUF0dHJpYnV0ZShNQVNUUkFfVVNFUl9FTUFJTF9LRVkpKSA/P1xuICAgICAgYXR0cmlidXRlU3RyaW5nKHNwYW4sIG1ldGFkYXRhQXR0cmlidXRlKE1BU1RSQV9VU0VSX05BTUVfS0VZKSkgPz9cbiAgICAgIGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBtZXRhZGF0YUF0dHJpYnV0ZShNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKSk7XG4gICAgY29uc3Qgc2Vzc2lvbklkID1cbiAgICAgIGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBtZXRhZGF0YUF0dHJpYnV0ZShNQVNUUkFfVEhSRUFEX0lEX0tFWSkpID8/XG4gICAgICBhdHRyaWJ1dGVTdHJpbmcoc3BhbiwgXCJnZW5fYWkuY29udmVyc2F0aW9uLmlkXCIpO1xuICAgIGNvbnN0IHJlcXVlc3RQcmV2aWV3ID0gcHJldmlld0lucHV0KHNwYW4pO1xuICAgIGNvbnN0IHJlc3BvbnNlUHJldmlldyA9IHByZXZpZXdPdXRwdXQoc3Bhbik7XG4gICAgcGVyc2lzdEFwcE1sZmxvd1RyYWNlSW5mbyh7XG4gICAgICB0cmFjZUlkLFxuICAgICAgcmVxdWVzdFRpbWU6IGhyVGltZU1pbGxpc2Vjb25kcyhzcGFuLnN0YXJ0VGltZSksXG4gICAgICBleGVjdXRpb25EdXJhdGlvbjogaHJUaW1lTWlsbGlzZWNvbmRzKHNwYW4uZHVyYXRpb24pLFxuICAgICAgZXJyb3I6IHNwYW4uc3RhdHVzLmNvZGUgPT09IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgdGFnczogT2JqZWN0LmZyb21FbnRyaWVzKHN0YXRlLnRhZ3MpLFxuICAgICAgLi4uKHVzZXIgPyB7IHVzZXIgfSA6IHt9KSxcbiAgICAgIC4uLihzZXNzaW9uSWQgPyB7IHNlc3Npb25JZCB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3RQcmV2aWV3ID8geyByZXF1ZXN0UHJldmlldyB9IDoge30pLFxuICAgICAgLi4uKHJlc3BvbnNlUHJldmlldyA/IHsgcmVzcG9uc2VQcmV2aWV3IH0gOiB7fSksXG4gICAgfSk7XG4gICAgdGhpcy50cmFjZXMuZGVsZXRlKHRyYWNlSWQpO1xuICB9XG5cbiAgYXN5bmMgZm9yY2VGbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy50cmFjZXMuY2xlYXIoKTtcbiAgfVxufVxuXG5sZXQgYXBwTWxmbG93VHJhY2VJbmZvUHJvY2Vzc29yUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKiogUmVnaXN0ZXIgdHJhY2UgZW5yaWNobWVudCBiZWZvcmUgQXBwS2l0IGNvbnN0cnVjdHMgaXRzIG5hdGl2ZSBwcm92aWRlci4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWdpc3RlckFwcE1sZmxvd1RyYWNlSW5mb1Byb2Nlc3NvcigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKGFwcE1sZmxvd1RyYWNlSW5mb1Byb2Nlc3NvclJlZ2lzdGVyZWQpIHJldHVybiB0cnVlO1xuICBpZiAoIShhd2FpdCBpbml0aWFsaXplQXBwTWxmbG93VHJhY2VJbmZvKCkpKSByZXR1cm4gZmFsc2U7XG4gIGF3YWl0IGFwcGtpdFRlbGVtZXRyeS5yZWdpc3Rlck5hdGl2ZVNwYW5Qcm9jZXNzb3IobmV3IEFwcE1sZmxvd1RyYWNlSW5mb1NwYW5Qcm9jZXNzb3IoKSk7XG4gIGFwcE1sZmxvd1RyYWNlSW5mb1Byb2Nlc3NvclJlZ2lzdGVyZWQgPSB0cnVlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIEluY3JlbWVudGFsbHkgYXNzZW1ibGUgVVRGLTggU1NFIHRleHQgd2hpbGUgcmV0YWluaW5nIGEgYm91bmRlZCBKU09OIGZhbGxiYWNrLiAqL1xuY2xhc3MgQXNzaXN0YW50UmVzcG9uc2VDb2xsZWN0b3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IGRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihcInV0ZjhcIik7XG4gIHByaXZhdGUgYW5zd2VyID0gXCJcIjtcbiAgcHJpdmF0ZSBib2R5ID0gXCJcIjtcbiAgcHJpdmF0ZSBwZW5kaW5nTGluZSA9IFwiXCI7XG4gIHByaXZhdGUgZmluaXNoZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBnZW5pZSA9IGZhbHNlO1xuXG4gIHdyaXRlKGNodW5rOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmluaXNoZWQpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aGlzLmNvbnN1bWUoY2h1bmspO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGNodW5rKSkge1xuICAgICAgdGhpcy5jb25zdW1lKFxuICAgICAgICB0aGlzLmRlY29kZXIud3JpdGUoQnVmZmVyLmZyb20oY2h1bmsuYnVmZmVyLCBjaHVuay5ieXRlT2Zmc2V0LCBjaHVuay5ieXRlTGVuZ3RoKSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGZpbmlzaCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZpbmlzaGVkKSByZXR1cm4gdGhpcy5hbnN3ZXIgfHwgdGhpcy5qc29uQW5zd2VyKCk7XG4gICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgdGhpcy5jb25zdW1lKHRoaXMuZGVjb2Rlci5lbmQoKSk7XG4gICAgdGhpcy5jb25zdW1lU3NlTGluZSh0aGlzLnBlbmRpbmdMaW5lKTtcbiAgICB0aGlzLnBlbmRpbmdMaW5lID0gXCJcIjtcbiAgICByZXR1cm4gdGhpcy5hbnN3ZXIgfHwgdGhpcy5qc29uQW5zd2VyKCk7XG4gIH1cblxuICByYXdCb2R5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYm9keS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCk7XG4gIH1cblxuICB1c2VkR2VuaWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2VuaWU7XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWUodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm47XG4gICAgaWYgKHRoaXMuYm9keS5sZW5ndGggPCBSRVNQT05TRV9CT0RZX0xJTUlUKSB7XG4gICAgICB0aGlzLmJvZHkgKz0gdGV4dC5zbGljZSgwLCBSRVNQT05TRV9CT0RZX0xJTUlUIC0gdGhpcy5ib2R5Lmxlbmd0aCk7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZ0xpbmUgKz0gdGV4dDtcbiAgICBsZXQgbmV3bGluZSA9IHRoaXMucGVuZGluZ0xpbmUuaW5kZXhPZihcIlxcblwiKTtcbiAgICB3aGlsZSAobmV3bGluZSA+PSAwKSB7XG4gICAgICB0aGlzLmNvbnN1bWVTc2VMaW5lKHRoaXMucGVuZGluZ0xpbmUuc2xpY2UoMCwgbmV3bGluZSkucmVwbGFjZSgvXFxyJC8sIFwiXCIpKTtcbiAgICAgIHRoaXMucGVuZGluZ0xpbmUgPSB0aGlzLnBlbmRpbmdMaW5lLnNsaWNlKG5ld2xpbmUgKyAxKTtcbiAgICAgIG5ld2xpbmUgPSB0aGlzLnBlbmRpbmdMaW5lLmluZGV4T2YoXCJcXG5cIik7XG4gICAgfVxuICAgIGlmICh0aGlzLnBlbmRpbmdMaW5lLmxlbmd0aCA+IFJFU1BPTlNFX0JPRFlfTElNSVQpIHtcbiAgICAgIHRoaXMucGVuZGluZ0xpbmUgPSB0aGlzLnBlbmRpbmdMaW5lLnNsaWNlKC1SRVNQT05TRV9CT0RZX0xJTUlUKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVTc2VMaW5lKGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGZyYW1lID0gc3NlRnJhbWUobGluZSk7XG4gICAgdGhpcy5nZW5pZSB8fD0gdmFsdWVVc2VzR2VuaWUoZnJhbWUpO1xuICAgIGlmICh0aGlzLmFuc3dlci5sZW5ndGggPj0gVFJBQ0VfSU9fTElNSVQpIHJldHVybjtcbiAgICBjb25zdCB0ZXh0ID0gYXNzaXN0YW50VGV4dEZyb21Tc2VGcmFtZShmcmFtZSk7XG4gICAgdGhpcy5hbnN3ZXIgKz0gdGV4dC5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCAtIHRoaXMuYW5zd2VyLmxlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIGpzb25BbnN3ZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYXNzaXN0YW50VGV4dEZyb21Kc29uKGpzb24ucGFyc2UodGhpcy5ib2R5KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZWxlY3QgdGhlIHNwYW4gTUxmbG93IHRyZWF0cyBhcyB0aGUgcmVxdWVzdCByb290LlxuICpcbiAqIE9UZWwgSFRUUCBpbnN0cnVtZW50YXRpb24gc3RvcmVzIGl0cyBzZXJ2ZXIgc3BhbiBpbiBSUEMgbWV0YWRhdGEuIFRoYXQgc3BhblxuICogd2lucyBvdmVyIGFuIGFjdGl2ZSBFeHByZXNzIGNoaWxkLiBJZiBubyByZWNvcmRpbmcgbG9jYWwgc3BhbiBleGlzdHMsIGNyZWF0ZVxuICogb25lIHVuZGVyIHRoZSBjdXJyZW50IGNvbnRleHQgc28gZW5hYmxlZCBXM0MgcHJvcGFnYXRpb24gcmVtYWlucyBpbnRhY3QuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVUcmFjZVRhcmdldCgpOiBUcmFjZVRhcmdldCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGFjdGl2ZUNvbnRleHQgPSBjb250ZXh0LmFjdGl2ZSgpO1xuICBpZiAoZGlyZWN0TWxmbG93VHJhY2luZ0FjdGl2ZSgpKSB7XG4gICAgY29uc3Qgc3BhbiA9IHRyYWNlLmdldFRyYWNlcihDSEFUX1RVUk5fVFJBQ0VSKS5zdGFydFNwYW4oXG4gICAgICBcIm1hc3RyYS5jaGF0X3R1cm5cIixcbiAgICAgIHtcbiAgICAgICAga2luZDogU3BhbktpbmQuU0VSVkVSLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgW0FQUEtJVF9BR0VOVF9UUkFDRV9ST09UX0FUVFJdOiB0cnVlLFxuICAgICAgICAgIFtNTEZMT1dfU1BBTl9UWVBFX0FUVFJdOiBNTEZMT1dfU1BBTl9UWVBFX0FHRU5ULFxuICAgICAgICAgIFtHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUl06IFwiaW52b2tlX2FnZW50XCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJhY2UuZGVsZXRlU3BhbihhY3RpdmVDb250ZXh0KSxcbiAgICApO1xuICAgIGlmICghc3Bhbi5pc1JlY29yZGluZygpKSB7XG4gICAgICBzcGFuLmVuZCgpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3Bhbiwgb3duZWQ6IHRydWUgfTtcbiAgfVxuXG4gIGNvbnN0IHJwYyA9IGdldFJQQ01ldGFkYXRhKGFjdGl2ZUNvbnRleHQpO1xuICBpZiAocnBjPy50eXBlID09PSBSUENUeXBlLkhUVFAgJiYgcnBjLnNwYW4uaXNSZWNvcmRpbmcoKSkge1xuICAgIHJldHVybiB7IHNwYW46IHJwYy5zcGFuLCBvd25lZDogZmFsc2UgfTtcbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZSA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKTtcbiAgaWYgKGFjdGl2ZT8uaXNSZWNvcmRpbmcoKSkgcmV0dXJuIHsgc3BhbjogYWN0aXZlLCBvd25lZDogZmFsc2UgfTtcblxuICBjb25zdCBzcGFuID0gdHJhY2UuZ2V0VHJhY2VyKENIQVRfVFVSTl9UUkFDRVIpLnN0YXJ0U3BhbihcbiAgICBcIm1hc3RyYS5jaGF0X3R1cm5cIixcbiAgICB7XG4gICAgICBraW5kOiBTcGFuS2luZC5TRVJWRVIsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIFtBUFBLSVRfQUdFTlRfVFJBQ0VfUk9PVF9BVFRSXTogdHJ1ZSxcbiAgICAgICAgW01MRkxPV19TUEFOX1RZUEVfQVRUUl06IE1MRkxPV19TUEFOX1RZUEVfQUdFTlQsXG4gICAgICAgIFtHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUl06IFwiaW52b2tlX2FnZW50XCIsXG4gICAgICB9LFxuICAgIH0sXG4gICAgYWN0aXZlQ29udGV4dCxcbiAgKTtcbiAgaWYgKCFzcGFuLmlzUmVjb3JkaW5nKCkpIHtcbiAgICBzcGFuLmVuZCgpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgc3Bhbiwgb3duZWQ6IHRydWUgfTtcbn1cblxuLyoqXG4gKiBFeHByZXNzIG1pZGRsZXdhcmUgdGhhdCBzdGFtcHMgY2hhdCB0dXJuIEkvTyBvbnRvIHRoZSBleHBvcnRlZCBPVGVsIHJvb3QuXG4gKlxuICogVGVlIGByZXMud3JpdGVgLCBgcmVzLmpzb25gLCBhbmQgYHJlcy5lbmRgIGluc3RlYWQgb2YgbGlzdGVuaW5nIGZvciBgZmluaXNoYDpcbiAqIEhUVFAgaW5zdHJ1bWVudGF0aW9uIGVuZHMgaXRzIHNlcnZlciBzcGFuIG9uIGZpbmlzaCwgYW5kIGF0dHJpYnV0ZXMgc2V0XG4gKiBhZnRlciBhIHNwYW4gZW5kcyBuZXZlciByZWFjaCB0aGUgZXhwb3J0ZXIuXG4gKlxuICogYHBhdGhgIGlzIG1vdW50LXJlbGF0aXZlICh3aGF0IHRoZSBNYXN0cmEgc3ViLWFwcCBzZWVzKSwgZS5nLlxuICogYC9hZ2VudHMvc3VwcG9ydC9zdHJlYW1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhdFR1cm5UZWxlbWV0cnlNaWRkbGV3YXJlKFxuICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICBuZXh0OiBleHByZXNzLk5leHRGdW5jdGlvbixcbiAgb3B0aW9uczogQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgaWYgKHJlcS5tZXRob2QgIT09IFwiUE9TVFwiIHx8ICFBR0VOVF9UVVJOX1JPVVRFLnRlc3QocmVxLnBhdGgpKSB7XG4gICAgbmV4dCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0YXJnZXQgPSByZXNvbHZlVHJhY2VUYXJnZXQoKTtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICBuZXh0KCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRhcmdldFRyYWNlSWQgPSB0cmFjZUlkKHRhcmdldC5zcGFuKTtcbiAgaWYgKCF0YXJnZXRUcmFjZUlkKSB7XG4gICAgaWYgKHRhcmdldC5vd25lZCkgdGFyZ2V0LnNwYW4uZW5kKCk7XG4gICAgbmV4dCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0cmFjZVN0YXRlOiBDaGF0VHJhY2VTdGF0ZSA9IHtcbiAgICB0YWdzOiBuZXcgTWFwKCksXG4gICAgdHJhY2VJZDogdGFyZ2V0VHJhY2VJZCxcbiAgICBwYXJlbnRTcGFuSWQ6IHRhcmdldC5zcGFuLnNwYW5Db250ZXh0KCkuc3BhbklkLFxuICB9O1xuICBjb25zdCB0cmFjZVJlcXVlc3RUaW1lID0gRGF0ZS5ub3coKTtcbiAgaWYgKCFlbnZpcm9ubWVudFV0aWxzLmlzRGF0YWJyaWNrc0FwcEVudigpKSB7XG4gICAgc2V0Q2hhdFRyYWNlVGFnKHRyYWNlU3RhdGUsIE1MRkxPV19MT0NBTF9UQUcsIHRydWUpO1xuICB9XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnZXRSZXF1ZXN0VGFncyhyZXEpKSkge1xuICAgIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBuYW1lLCB2YWx1ZSk7XG4gIH1cbiAgY29uc3QgaW5pdGlhbFRhZ3MgPSB0eXBlb2Ygb3B0aW9ucy50YWdzID09PSBcImZ1bmN0aW9uXCIgPyBvcHRpb25zLnRhZ3MocmVxKSA6IG9wdGlvbnMudGFncztcbiAgaWYgKGluaXRpYWxUYWdzKSB7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGluaXRpYWxUYWdzKSkge1xuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHN0YW1wTWxmbG93VHJhY2VJZChyZXMsIHRyYWNlU3RhdGUudHJhY2VJZCk7XG4gIHRyYWNlU3RhdGUudXNlciA9IHN0YW1wTWxmbG93QWN0b3IodGFyZ2V0LnNwYW4sIHJlcSk7XG4gIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9UWVBFX0FUVFIsIE1MRkxPV19TUEFOX1RZUEVfQUdFTlQpO1xuICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFIsIFwiaW52b2tlX2FnZW50XCIpO1xuICBjb25zdCBpZGVudGl0eSA9XG4gICAgdHlwZW9mIG9wdGlvbnMuaWRlbnRpdHkgPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMuaWRlbnRpdHkocmVxKSA6IG9wdGlvbnMuaWRlbnRpdHk7XG4gIGlmIChpZGVudGl0eSkge1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0lERU5USVRZX0FUVFIsIGlkZW50aXR5KTtcbiAgICBzZXRDaGF0VHJhY2VUYWcoXG4gICAgICB0cmFjZVN0YXRlLFxuICAgICAgaWRlbnRpdHkgPT09IFwib2JvXCIgPyBNTEZMT1dfT0JPX0FVVEhfVEFHIDogTUxGTE9XX1NQX0FVVEhfVEFHLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICB9XG4gIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0dFTklFX1VTRURfQVRUUiwgZmFsc2UpO1xuXG4gIGNvbnN0IG1lc3NhZ2VzID0gKHJlcS5ib2R5IGFzIHsgbWVzc2FnZXM/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5tZXNzYWdlcztcbiAgbGV0IHJlcXVlc3RQcmV2aWV3OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmIChtZXNzYWdlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZnVsbElucHV0ID0gc2VyaWFsaXplZChtZXNzYWdlcyk7XG4gICAgcmVxdWVzdFByZXZpZXcgPSB0ZXh0T25seUNoYXRJbnB1dChtZXNzYWdlcykgPz8gZnVsbElucHV0O1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX01FU1NBR0VTX0FUVFIsIGZ1bGxJbnB1dCk7XG4gICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19TUEFOX0lOUFVUU19BVFRSLCByZXF1ZXN0UHJldmlldy5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICB9XG5cbiAgY29uc3QgY29sbGVjdG9yID0gbmV3IEFzc2lzdGFudFJlc3BvbnNlQ29sbGVjdG9yKCk7XG4gIGxldCByZXNwb25zZVByZXZpZXc6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IG91dHB1dFJlY29yZGVkID0gZmFsc2U7XG4gIGxldCBmdWxsT3V0cHV0UmVjb3JkZWQgPSBmYWxzZTtcbiAgbGV0IGdlbmllUmVjb3JkZWQgPSBmYWxzZTtcbiAgbGV0IG93bmVkU3BhbkVuZGVkID0gZmFsc2U7XG4gIGxldCB0cmFjZUZpbmFsaXplZCA9IGZhbHNlO1xuICBjb25zdCBwYXNzVGhyb3VnaFdyaXRlID0gcmVzLndyaXRlLmJpbmQocmVzKSBhcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiBib29sZWFuO1xuICBjb25zdCBwYXNzVGhyb3VnaEVuZCA9IHJlcy5lbmQuYmluZChyZXMpIGFzICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd247XG4gIGNvbnN0IHBhc3NUaHJvdWdoSnNvbiA9IHJlcy5qc29uLmJpbmQocmVzKSBhcyAoYm9keT86IHVua25vd24pID0+IGV4cHJlc3MuUmVzcG9uc2U7XG4gIGNvbnN0IHJlY29yZE91dHB1dCA9IChhbnN3ZXI6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmIChvdXRwdXRSZWNvcmRlZCB8fCAhYW5zd2VyKSByZXR1cm47XG4gICAgcmVzcG9uc2VQcmV2aWV3ID0gYW5zd2VyO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9PVVRQVVRTX0FUVFIsIGFuc3dlci5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICAgIG91dHB1dFJlY29yZGVkID0gdHJ1ZTtcbiAgfTtcbiAgY29uc3QgcmVjb3JkRnVsbE91dHB1dCA9IChyZXNwb25zZTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgaWYgKGZ1bGxPdXRwdXRSZWNvcmRlZCB8fCAhcmVzcG9uc2UpIHJldHVybjtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9SRVNQT05TRV9BVFRSLCByZXNwb25zZS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICAgIGZ1bGxPdXRwdXRSZWNvcmRlZCA9IHRydWU7XG4gIH07XG4gIGNvbnN0IHJlY29yZEdlbmllID0gKHVzZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICBpZiAoIXVzZWQgfHwgZ2VuaWVSZWNvcmRlZCkgcmV0dXJuO1xuICAgIGdlbmllUmVjb3JkZWQgPSB0cnVlO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0dFTklFX1VTRURfQVRUUiwgdHJ1ZSk7XG4gICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19HRU5JRV9UQUdfQVRUUiwgXCJ0cnVlXCIpO1xuICAgIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBNTEZMT1dfR0VOSUVfVEFHLCB0cnVlKTtcbiAgICBjb250ZXh0LndpdGgodHJhY2Uuc2V0U3Bhbihjb250ZXh0LmFjdGl2ZSgpLCB0YXJnZXQuc3BhbiksICgpID0+IHtcbiAgICAgIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlVGFncyh7IFtNTEZMT1dfR0VOSUVfVEFHXTogXCJ0cnVlXCIgfSk7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGZpbmFsaXplVHJhY2UgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHRyYWNlRmluYWxpemVkKSByZXR1cm47XG4gICAgdHJhY2VGaW5hbGl6ZWQgPSB0cnVlO1xuICAgIGNvbnN0IHRhZ3MgPSBPYmplY3QuZnJvbUVudHJpZXModHJhY2VTdGF0ZS50YWdzKTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgdHJhY2VTdGF0ZS50YWdzKSB7XG4gICAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoYCR7TUxGTE9XX1RSQUNFX1RBR19QUkVGSVh9JHtuYW1lfWAsIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRyYWNlU3RhdGUudXNlcikgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19VU0VSX0FUVFIsIHRyYWNlU3RhdGUudXNlcik7XG4gICAgY29udGV4dC53aXRoKHRyYWNlLnNldFNwYW4oY29udGV4dC5hY3RpdmUoKSwgdGFyZ2V0LnNwYW4pLCAoKSA9PiB7XG4gICAgICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZSh7XG4gICAgICAgIC4uLihPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAwID8geyB0YWdzIH0gOiB7fSksXG4gICAgICAgIC4uLih0cmFjZVN0YXRlLnVzZXIgPyB7IHVzZXI6IHRyYWNlU3RhdGUudXNlciB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKCFlbnZpcm9ubWVudFV0aWxzLmlzRGF0YWJyaWNrc0FwcEVudigpKSB7XG4gICAgICBwZXJzaXN0QXBwTWxmbG93VHJhY2VJbmZvKHtcbiAgICAgICAgdHJhY2VJZDogdHJhY2VTdGF0ZS50cmFjZUlkLFxuICAgICAgICByZXF1ZXN0VGltZTogdHJhY2VSZXF1ZXN0VGltZSxcbiAgICAgICAgZXhlY3V0aW9uRHVyYXRpb246IERhdGUubm93KCkgLSB0cmFjZVJlcXVlc3RUaW1lLFxuICAgICAgICBlcnJvcjogcmVzLnN0YXR1c0NvZGUgPj0gNTAwLFxuICAgICAgICB0YWdzLFxuICAgICAgICAuLi4odHJhY2VTdGF0ZS51c2VyID8geyB1c2VyOiB0cmFjZVN0YXRlLnVzZXIgfSA6IHt9KSxcbiAgICAgICAgLi4uKHJlcXVlc3RQcmV2aWV3ID8geyByZXF1ZXN0UHJldmlldyB9IDoge30pLFxuICAgICAgICAuLi4ocmVzcG9uc2VQcmV2aWV3ID8geyByZXNwb25zZVByZXZpZXcgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgZW5kT3duZWRTcGFuID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICghdGFyZ2V0Lm93bmVkIHx8IG93bmVkU3BhbkVuZGVkKSByZXR1cm47XG4gICAgb3duZWRTcGFuRW5kZWQgPSB0cnVlO1xuICAgIHRhcmdldC5zcGFuLmVuZCgpO1xuICB9O1xuXG4gIHJlcy53cml0ZSA9ICgoY2h1bms6IHVua25vd24sIC4uLnJlc3Q6IHVua25vd25bXSkgPT4ge1xuICAgIGNvbGxlY3Rvci53cml0ZShjaHVuayk7XG4gICAgcmV0dXJuIHBhc3NUaHJvdWdoV3JpdGUoY2h1bmssIC4uLnJlc3QpO1xuICB9KSBhcyB0eXBlb2YgcmVzLndyaXRlO1xuXG4gIHJlcy5qc29uID0gKChib2R5PzogdW5rbm93bikgPT4ge1xuICAgIHJlY29yZEZ1bGxPdXRwdXQoc2VyaWFsaXplZChib2R5KSk7XG4gICAgcmVjb3JkR2VuaWUodmFsdWVVc2VzR2VuaWUoYm9keSkpO1xuICAgIHJlY29yZE91dHB1dChhc3Npc3RhbnRUZXh0RnJvbUpzb24oYm9keSkpO1xuICAgIHJldHVybiBwYXNzVGhyb3VnaEpzb24oYm9keSk7XG4gIH0pIGFzIHR5cGVvZiByZXMuanNvbjtcblxuICByZXMuZW5kID0gKChjaHVuaz86IHVua25vd24sIC4uLnJlc3Q6IHVua25vd25bXSkgPT4ge1xuICAgIGNvbGxlY3Rvci53cml0ZShjaHVuayk7XG4gICAgcmVjb3JkT3V0cHV0KGNvbGxlY3Rvci5maW5pc2goKSk7XG4gICAgcmVjb3JkRnVsbE91dHB1dChjb2xsZWN0b3IucmF3Qm9keSgpKTtcbiAgICByZWNvcmRHZW5pZShjb2xsZWN0b3IudXNlZEdlbmllKCkpO1xuICAgIGZpbmFsaXplVHJhY2UoKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHBhc3NUaHJvdWdoRW5kKGNodW5rLCAuLi5yZXN0KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZW5kT3duZWRTcGFuKCk7XG4gICAgfVxuICB9KSBhcyB0eXBlb2YgcmVzLmVuZDtcblxuICByZXMub25jZShcImNsb3NlXCIsICgpID0+IHtcbiAgICByZWNvcmRPdXRwdXQoY29sbGVjdG9yLmZpbmlzaCgpKTtcbiAgICByZWNvcmRGdWxsT3V0cHV0KGNvbGxlY3Rvci5yYXdCb2R5KCkpO1xuICAgIHJlY29yZEdlbmllKGNvbGxlY3Rvci51c2VkR2VuaWUoKSk7XG4gICAgZmluYWxpemVUcmFjZSgpO1xuICAgIGVuZE93bmVkU3BhbigpO1xuICB9KTtcblxuICBjb25zdCBjaGF0Q29udGV4dCA9IHRyYWNlXG4gICAgLnNldFNwYW4oY29udGV4dC5hY3RpdmUoKSwgdGFyZ2V0LnNwYW4pXG4gICAgLnNldFZhbHVlKENIQVRfVFJBQ0VfU1RBVEVfS0VZLCB0cmFjZVN0YXRlKTtcbiAgY29udGV4dC53aXRoKGNoYXRDb250ZXh0LCAoKSA9PiB7XG4gICAgbmV4dCgpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJbnN0YWxsIHtAbGluayBjaGF0VHVyblRlbGVtZXRyeU1pZGRsZXdhcmV9IG9uIGEgTWFzdHJhIEV4cHJlc3Mgc3ViLWFwcC5cbiAqXG4gKiBDYWxsIGJlZm9yZSBgTWFzdHJhU2VydmVyLmluaXQoKWAgc28gdGhlIGxheWVyIHNpdHMgYWhlYWQgb2YgdGhlIGFnZW50XG4gKiByb3V0ZXMuIFNhZmUgdG8gY2FsbCB1bmNvbmRpdGlvbmFsbHk6IHdoZW4gbm8gcmVjb3JkaW5nIHRyYWNlciBpcyByZWdpc3RlcmVkLFxuICogdGhlIG1pZGRsZXdhcmUgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaENoYXRUdXJuVGVsZW1ldHJ5KFxuICBhcHA6IGV4cHJlc3MuRXhwcmVzcyxcbiAgb3B0aW9uczogQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgYXBwLnVzZSgocmVxLCByZXMsIG5leHQpID0+IGNoYXRUdXJuVGVsZW1ldHJ5TWlkZGxld2FyZShyZXEsIHJlcywgbmV4dCwgb3B0aW9ucykpO1xuICBsb2dnZXIuaW5mbyhcImNoYXQgdHVybiB0ZWxlbWV0cnkgbWlkZGxld2FyZSBhdHRhY2hlZFwiLCBvcHRpb25zKTtcbn1cbiJdfQ==
704
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBELE9BQU8sRUFBRSxTQUFTLElBQUksZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTVELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzVGLE9BQU8sRUFDTCxPQUFPLEVBQ1AsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDUixjQUFjLEVBQ2QsS0FBSyxHQUdOLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUk5RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRSxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLHlCQUF5QixFQUN6Qiw0QkFBNEIsRUFDNUIseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2QiwyQkFBMkIsR0FDNUIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLDRCQUE0QixFQUM1QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGdCQUFn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SSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDbEYsTUFBTSxDQUFDLElBQUksQ0FBQyx5Q0FBeUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNsRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5IGVhY2ggTWFzdHJhIGNoYXQgdHVybidzIHJlcXVlc3QvcmVzcG9uc2Ugb250byBpdHMgT1RlbCByb290IHNwYW5cbiAqIHNvIERhdGFicmlja3MtbWFuYWdlZCBNTGZsb3cgY2FuIGRpc3BsYXkgdGhlbS5cbiAqXG4gKiBXaHkgdGhpcyBleGlzdHM6IE1MZmxvdydzIFVDIGA8dGFyZ2V0Pl90cmFjZV91bmlmaWVkYCB2aWV3IHBpY2tzIHRoZVxuICogb25lIHNwYW4gd2hvc2UgYHBhcmVudF9zcGFuX2lkYCBpcyBlbXB0eSBhbmQgcmVhZHMgcmVxdWVzdC9yZXNwb25zZVxuICogZnJvbSBgbWxmbG93LnNwYW5JbnB1dHNgIC8gYG1sZmxvdy5zcGFuT3V0cHV0c2AgKG9yIHRoZSBgZ2VuX2FpLipgXG4gKiBlcXVpdmFsZW50cykgb24gVEhBVCBzcGFuIG9ubHkuIE1hc3RyYSByZWNvcmRzIHRoZSB0dXJuIG9uIGl0c1xuICogYGludm9rZV9hZ2VudGAgY2hpbGQgdW5kZXIgYG1hc3RyYS5hZ2VudF9ydW4uaW5wdXRgIC8gYC5vdXRwdXRgLCBrZXlzXG4gKiB0aGUgdmlldyBuZXZlciByZWFkcywgc28gY2hhdCB0cmFjZXMgYXJyaXZlIHdpdGggYm90aCBjb2x1bW5zIG51bGxcbiAqIGV2ZW4gd2hlbiB0aGUgc3BhbnMgdGhlbXNlbHZlcyBsb29rIGhlYWx0aHkuXG4gKlxuICogQXBwS2l0J3MgSFRUUCBpbnN0cnVtZW50YXRpb24gcmVjb3JkcyB0aGUgc2VydmVyIHNwYW4gaW4gT1RlbCBSUEMgbWV0YWRhdGEsXG4gKiB3aGljaCByZW1haW5zIGF2YWlsYWJsZSBldmVuIHdoZW4gRXhwcmVzcyBtYWtlcyBhIG1pZGRsZXdhcmUtbGF5ZXIgY2hpbGRcbiAqIGFjdGl2ZS4gV2hlbiBpbnN0cnVtZW50YXRpb24gaXMgdW5hdmFpbGFibGUsIHRoaXMgbW9kdWxlIGNyZWF0ZXMgb25lXG4gKiByZXF1ZXN0LWxpZmV0aW1lIHNlcnZlciBzcGFuIGFuZCBydW5zIE1hc3RyYSB1bmRlciBpdC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgU3RyaW5nRGVjb2RlciB9IGZyb20gXCJub2RlOnN0cmluZ19kZWNvZGVyXCI7XG5cbmltcG9ydCB7IHRlbGVtZXRyeSBhcyBhcHBraXRUZWxlbWV0cnkgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGdldFJlcXVlc3RUYWdzIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0L3JlcXVlc3QtdGFnc1wiO1xuaW1wb3J0IHsgZW52aXJvbm1lbnRVdGlscywganNvbiwgbG9nLCBvYmplY3QsIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGZlZWRiYWNrLCB0aHJlYWQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQgdHlwZSB7IFRyYWNpbmdPcHRpb25zIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9vYnNlcnZhYmlsaXR5XCI7XG5pbXBvcnQgeyBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLCBNQVNUUkFfVEhSRUFEX0lEX0tFWSB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQge1xuICBjb250ZXh0LFxuICBjcmVhdGVDb250ZXh0S2V5LFxuICBTcGFuS2luZCxcbiAgU3BhblN0YXR1c0NvZGUsXG4gIHRyYWNlLFxuICB0eXBlIENvbnRleHQsXG4gIHR5cGUgU3Bhbixcbn0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuaW1wb3J0IHsgZ2V0UlBDTWV0YWRhdGEsIFJQQ1R5cGUgfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBSZWFkYWJsZVNwYW4sIFNwYW4gYXMgU2RrU3BhbiwgU3BhblByb2Nlc3NvciB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2UtYmFzZVwiO1xuaW1wb3J0IHR5cGUgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuXG5pbXBvcnQgeyBNQVNUUkFfQVVUSF9NT0RFX0tFWSwgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLCBNQVNUUkFfVVNFUl9OQU1FX0tFWSB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgVVNFUl9FTUFJTF9IRUFERVIsIFVTRVJfSURfSEVBREVSIH0gZnJvbSBcIi4vaWRlbnRpdHkudHNcIjtcbmltcG9ydCB7XG4gIGFwcE1sZmxvd1RyYWNlSW5mb0NvbmZpZ3VyZWQsXG4gIGRpcmVjdE1sZmxvd1RyYWNpbmdBY3RpdmUsXG4gIGluaXRpYWxpemVBcHBNbGZsb3dUcmFjZUluZm8sXG4gIHBlcnNpc3RBcHBNbGZsb3dUcmFjZUluZm8sXG4gIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlLFxuICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZVRhZ3MsXG59IGZyb20gXCIuL21sZmxvdy50c1wiO1xuaW1wb3J0IHtcbiAgQVBQS0lUX0FHRU5UX1RSQUNFX1JPT1RfQVRUUixcbiAgTUxGTE9XX0FHRU5UX1RBRyxcbiAgTUxGTE9XX0FHRU5UX1RBR19BVFRSLFxuICBNTEZMT1dfR0VOSUVfVEFHLFxuICBNTEZMT1dfR0VOSUVfVEFHX0FUVFIsXG4gIE1MRkxPV19MT0NBTF9UQUcsXG4gIE1MRkxPV19PQk9fQVVUSF9UQUcsXG4gIE1MRkxPV19TUF9BVVRIX1RBRyxcbiAgTUxGTE9XX1RSQUNFX1RBR19QUkVGSVgsXG59IGZyb20gXCIuL3RyYWNlLWF0dHJpYnV0ZXMudHNcIjtcblxuZXhwb3J0IHtcbiAgTUxGTE9XX0FHRU5UX1RBRyxcbiAgTUxGTE9XX0FHRU5UX1RBR19BVFRSLFxuICBBUFBLSVRfQUdFTlRfVFJBQ0VfUk9PVF9BVFRSLFxuICBNTEZMT1dfR0VOSUVfVEFHLFxuICBNTEZMT1dfR0VOSUVfVEFHX0FUVFIsXG4gIE1MRkxPV19MT0NBTF9UQUcsXG4gIE1MRkxPV19MT0NBTF9UQUdfQVRUUixcbiAgTUxGTE9XX09CT19BVVRIX1RBRyxcbiAgTUxGTE9XX09CT19BVVRIX1RBR19BVFRSLFxuICBNTEZMT1dfU1BfQVVUSF9UQUcsXG4gIE1MRkxPV19TUF9BVVRIX1RBR19BVFRSLFxuICBNTEZMT1dfVFJBQ0VfVEFHX1BSRUZJWCxcbn0gZnJvbSBcIi4vdHJhY2UtYXR0cmlidXRlcy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL3RlbGVtZXRyeVwiKTtcblxuLyoqIENhcCBvbiBlYWNoIHBheWxvYWQgY29waWVkIG9udG8gYSBzcGFuLCBzbyBvbmUgdHVybiBjYW5ub3QgYmxvYXQgdGhlIGV4cG9ydC4gKi9cbmV4cG9ydCBjb25zdCBUUkFDRV9JT19MSU1JVCA9IDhfMDAwO1xuXG4vKiogQm91bmQgZm9yIGEgbm9uLXN0cmVhbWluZyBib2R5IGNhcHR1cmVkIHRocm91Z2ggYHJlcy5lbmRgIGluc3RlYWQgb2YgYHJlcy5qc29uYC4gKi9cbmNvbnN0IFJFU1BPTlNFX0JPRFlfTElNSVQgPSBUUkFDRV9JT19MSU1JVCAqIDQ7XG5cbi8qKiBUcmFjZXIgc2NvcGUgdXNlZCBvbmx5IHdoZW4gQXBwS2l0IGRpZCBub3QgY3JlYXRlIGEgcmVjb3JkaW5nIEhUVFAgc3Bhbi4gKi9cbmNvbnN0IENIQVRfVFVSTl9UUkFDRVIgPSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYS90ZWxlbWV0cnlcIjtcblxuLyoqXG4gKiBNb3VudC1yZWxhdGl2ZSBNYXN0cmEgYWdlbnQgaW52b2tlIHBhdGhzIHRoYXQgY2FycnkgYSBjaGF0IHR1cm4gYm9keVxuICogKGBtZXNzYWdlc2ApIGFuZCBzdHJlYW0gYW4gYXNzaXN0YW50IGFuc3dlci4gUmVzdW1lIC8gYXBwcm92ZSB2ZXJic1xuICogYXJlIGludGVudGlvbmFsbHkgZXhjbHVkZWQ6IHRoZWlyIGJvZGllcyBhcmUgdG9vbCBkZWNpc2lvbnMsIG5vdCB0aGVcbiAqIHVzZXIgcHJvbXB0LCBhbmQgdGhleSByYXJlbHkgcHJvZHVjZSBhIGZyZXNoIGFuc3dlciB3b3J0aCBzdXJmYWNpbmcuXG4gKi9cbmNvbnN0IEFHRU5UX1RVUk5fUk9VVEUgPSAvKD86XnxcXC8pKD86YWdlbnRzXFwvW14vXStcXC8oPzpzdHJlYW18Z2VuZXJhdGUpfGNoYXRcXC9bXi9dKylcXC8/JC9pO1xuXG4vKiogQXR0cmlidXRlIGtleXMgdGhlIE1MZmxvdyBVQyBgKl90cmFjZV91bmlmaWVkYCB2aWV3IHJlYWRzIGZyb20gdGhlIHJvb3Qgc3Bhbi4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU1BBTl9JTlBVVFNfQVRUUiA9IFwibWxmbG93LnNwYW5JbnB1dHNcIjtcbi8qKiBSb290LXNwYW4gYXR0cmlidXRlIGNvbnN1bWVkIGFzIGNoYXQgb3V0cHV0IGJ5IE1MZmxvdyB1bmlmaWVkIHRyYWNlIHZpZXdzLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX09VVFBVVFNfQVRUUiA9IFwibWxmbG93LnNwYW5PdXRwdXRzXCI7XG4vKiogRnVsbCBzZXJpYWxpemVkIHJlcXVlc3QgbWVzc2FnZXMgcmV0YWluZWQgd2hlbiB0aGUgTUxmbG93IHByZXZpZXcgaXMgcGxhaW4gdGV4dC4gKi9cbmV4cG9ydCBjb25zdCBDSEFUX01FU1NBR0VTX0FUVFIgPSBcImFwcGtpdC5tYXN0cmEuY2hhdC5tZXNzYWdlc1wiO1xuLyoqIEZ1bGwgc2VyaWFsaXplZCByZXNwb25zZSByZXRhaW5lZCB3aGVuIHRoZSBNTGZsb3cgcHJldmlldyBpcyBwbGFpbiB0ZXh0LiAqL1xuZXhwb3J0IGNvbnN0IENIQVRfUkVTUE9OU0VfQVRUUiA9IFwiYXBwa2l0Lm1hc3RyYS5jaGF0LnJlc3BvbnNlXCI7XG4vKiogQ3JlZGVudGlhbCBtb2RlIHVzZWQgYnkgRGF0YWJyaWNrcyBjYWxscyBpbiB0aGlzIGNoYXQgdHVybi4gKi9cbmV4cG9ydCBjb25zdCBDSEFUX0lERU5USVRZX0FUVFIgPSBcImFwcGtpdC5tYXN0cmEuaWRlbnRpdHkubW9kZVwiO1xuLyoqIFdoZXRoZXIgdGhlIHN0cmVhbWVkIHR1cm4gZW1pdHRlZCBhIEdlbmllIHRvb2wgb3IgcHJvZ3Jlc3MgZXZlbnQuICovXG5leHBvcnQgY29uc3QgQ0hBVF9HRU5JRV9VU0VEX0FUVFIgPSBcImFwcGtpdC5tYXN0cmEuZ2VuaWUudXNlZFwiO1xuLyoqXG4gKiBNTGZsb3cgc3Bhbi10eXBlIGF0dHJpYnV0ZS4gRGF0YWJyaWNrcyBtYXBzIHRoaXMgKG9yIGBnZW5fYWkub3BlcmF0aW9uLm5hbWVgKVxuICogb250byB0aGUgdHlwZSBjaGlwIGluIHRoZSBleHBlcmltZW50IFVJLiBDdXN0b20gdmFsdWVzIHN1Y2ggYXMgYEdFTklFYCBhcmVcbiAqIGFsbG93ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU1BBTl9UWVBFX0FUVFIgPSBcIm1sZmxvdy5zcGFuVHlwZVwiO1xuLyoqIEdlbkFJIHNlbWFudGljLWNvbnZlbnRpb24gb3BlcmF0aW9uIG5hbWUsIGFuIGFsdGVybmF0ZSBzcGFuLXR5cGUgc291cmNlLiAqL1xuZXhwb3J0IGNvbnN0IEdFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSID0gXCJnZW5fYWkub3BlcmF0aW9uLm5hbWVcIjtcbi8qKlxuICogUm9vdC1zcGFuIHVzZXIgaWQgdGhlIE1MZmxvdyBleHBlcmltZW50IFVJJ3MgVXNlciBjb2x1bW4gcmVhZHMgZnJvbSBPVGVsXG4gKiB0cmFjZXMuIFByZWZlciB0aGUgZm9yd2FyZGVkIGVtYWlsIHdoZW4gcHJlc2VudCBzbyB0aGUgY29sdW1uIGlzIGh1bWFuLlxuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1VTRVJfQVRUUiA9IGFwcGtpdFRlbGVtZXRyeS5VU0VSX1RSQUNFX0FUVFJJQlVURTtcbi8qKiBSb290LXNwYW4gc2Vzc2lvbiBpZCB0aGF0IGVuYWJsZXMgdGhlIE1MZmxvdyBTZXNzaW9ucyB0YWIuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NFU1NJT05fQVRUUiA9IFwic2Vzc2lvbi5pZFwiO1xuLyoqIFJvb3Qtc3BhbiB0eXBlIGZvciBhIE1hc3RyYSBhZ2VudCB0dXJuLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX1RZUEVfQUdFTlQgPSBcIkFHRU5UXCI7XG4vKiogU3BhbiB0eXBlIGZvciBhbiBgYXNrX2dlbmllYCB0b29sIGNhbGwuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fVFlQRV9HRU5JRSA9IFwiR0VOSUVcIjtcblxuLyoqIFJvb3Qtc3BhbiBtZXRhZGF0YSBrbm93biBiZWZvcmUgYSBjaGF0IHJlcXVlc3QgaXMgZGlzcGF0Y2hlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zIHtcbiAgcmVhZG9ubHkgaWRlbnRpdHk/OlxuICAgIFwib2JvXCIgfCBcInNlcnZpY2UtcHJpbmNpcGFsXCIgfCAoKHJlcXVlc3Q6IGV4cHJlc3MuUmVxdWVzdCkgPT4gXCJvYm9cIiB8IFwic2VydmljZS1wcmluY2lwYWxcIik7XG4gIC8qKiBJbml0aWFsIHRyYWNlIHRhZ3MgZGVyaXZlZCBmcm9tIHRoZSBpbmJvdW5kIHJlcXVlc3QuICovXG4gIHJlYWRvbmx5IHRhZ3M/OlxuICAgIHwgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQ2hhdFRyYWNlVGFnVmFsdWUgfCB1bmRlZmluZWQ+PlxuICAgIHwgKChyZXF1ZXN0OiBleHByZXNzLlJlcXVlc3QpID0+IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENoYXRUcmFjZVRhZ1ZhbHVlIHwgdW5kZWZpbmVkPj4pO1xufVxuXG5pbnRlcmZhY2UgVHJhY2VUYXJnZXQge1xuICBzcGFuOiBTcGFuO1xuICBvd25lZDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIENoYXRUcmFjZVN0YXRlIHtcbiAgcmVhZG9ubHkgdGFnczogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgcmVhZG9ubHkgdHJhY2VJZDogc3RyaW5nO1xuICByZWFkb25seSBwYXJlbnRTcGFuSWQ/OiBzdHJpbmc7XG4gIGZpcnN0TW9kZWw/OiBzdHJpbmc7XG4gIHVzZXI/OiBzdHJpbmc7XG59XG5cbi8qKiBWYWx1ZXMgYWNjZXB0ZWQgYnkgcmVxdWVzdC1zY29wZWQgdHJhY2UtdGFnIGluamVjdGlvbiBoZWxwZXJzLiAqL1xuZXhwb3J0IHR5cGUgQ2hhdFRyYWNlVGFnVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG5jb25zdCBDSEFUX1RSQUNFX1NUQVRFX0tFWSA9IGNyZWF0ZUNvbnRleHRLZXkoXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmEvY2hhdC10cmFjZS1zdGF0ZVwiKTtcblxuLyoqIE9wZW5UZWxlbWV0cnkncyBzZW50aW5lbCBmb3IgXCJubyB2YWxpZCB0cmFjZVwiIC0gMzIgemVybyBoZXggY2hhcnMuICovXG5jb25zdCBJTlZBTElEX1RSQUNFX0lEID0gXCIwXCIucmVwZWF0KDMyKTtcblxuLyoqXG4gKiBNYXJrIHRoZSBhY3RpdmUgc3BhbiBhcyBhIEdlbmllIGNhbGwgc28gdGhlIGV4cGVyaW1lbnQgVUkgdHlwZXMgaXQgYEdFTklFYFxuICogYW5kIHRhZ3MgdGhlIHRyYWNlIGBnZW5pZT10cnVlYC4gU2FmZSBuby1vcCB3aGVuIG5vIHJlY29yZGluZyBzcGFuIGlzIGFjdGl2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YW1wR2VuaWVUb29sU3BhbihzcGFuOiBTcGFuIHwgdW5kZWZpbmVkID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpKTogdm9pZCB7XG4gIGlmICghc3Bhbj8uaXNSZWNvcmRpbmcoKSkgcmV0dXJuO1xuICBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9UWVBFX0FUVFIsIE1MRkxPV19TUEFOX1RZUEVfR0VOSUUpO1xuICBzcGFuLnNldEF0dHJpYnV0ZShHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUiwgXCJleGVjdXRlX3Rvb2xcIik7XG4gIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19HRU5JRV9UQUdfQVRUUiwgXCJ0cnVlXCIpO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0SGVhZGVyKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBmcm9tTWV0aG9kID1cbiAgICB0eXBlb2YgcmVxLmhlYWRlciA9PT0gXCJmdW5jdGlvblwiID8gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChyZXEuaGVhZGVyKG5hbWUpKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGZyb21NZXRob2QpIHJldHVybiBmcm9tTWV0aG9kO1xuICBjb25zdCByYXcgPSByZXEuaGVhZGVycz8uW25hbWUudG9Mb3dlckNhc2UoKV07XG4gIGNvbnN0IHZhbHVlID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3WzBdIDogcmF3O1xuICByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvTnVsbCh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHVuZGVmaW5lZCkgPz8gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0UXVlcnkocmVxOiBleHByZXNzLlJlcXVlc3QsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhdyA9IHJlcS5xdWVyeT8uW25hbWVdO1xuICBjb25zdCB2YWx1ZSA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhd1swXSA6IHJhdztcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB1bmRlZmluZWQpID8/IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc3RhbXBNbGZsb3dBY3RvcihzcGFuOiBTcGFuLCByZXE6IGV4cHJlc3MuUmVxdWVzdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0SGVhZGVyKHJlcSwgVVNFUl9FTUFJTF9IRUFERVIpID8/IHJlcXVlc3RIZWFkZXIocmVxLCBVU0VSX0lEX0hFQURFUik7XG4gIGlmICh1c2VyKSBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfVVNFUl9BVFRSLCB1c2VyKTtcbiAgY29uc3Qgc2Vzc2lvbiA9XG4gICAgcmVxdWVzdEhlYWRlcihyZXEsIHRocmVhZC5USFJFQURfSURfSEVBREVSKSA/PyByZXF1ZXN0UXVlcnkocmVxLCB0aHJlYWQuVEhSRUFEX0lEX1FVRVJZKTtcbiAgaWYgKHNlc3Npb24pIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19TRVNTSU9OX0FUVFIsIHNlc3Npb24pO1xuICByZXR1cm4gdXNlcjtcbn1cblxuZnVuY3Rpb24gdHJhY2VJZChzcGFuOiBTcGFuIHwgdW5kZWZpbmVkID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSBzcGFuPy5zcGFuQ29udGV4dCgpLnRyYWNlSWQ7XG4gIHJldHVybiB2YWx1ZSAmJiB2YWx1ZSAhPT0gSU5WQUxJRF9UUkFDRV9JRCA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpOiBDaGF0VHJhY2VTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZXh0LmFjdGl2ZSgpLmdldFZhbHVlKENIQVRfVFJBQ0VfU1RBVEVfS0VZKSBhcyBDaGF0VHJhY2VTdGF0ZSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBCaW5kIGEgTWFzdHJhIGFnZW50IHJ1biB0byB0aGUgdHJhY2Ugc2VsZWN0ZWQgYnkgY2hhdCB0ZWxlbWV0cnkuXG4gKlxuICogRGF0YWJyaWNrcyBBcHBzIHVzZXMgYSBkZWRpY2F0ZWQgYWdlbnQgdHJhY2UgYmVjYXVzZSBldmVudGVkIGFnZW50cyBmaW5pc2hcbiAqIGJlZm9yZSB0aGUgSFRUUCBzZXJ2ZXIgc3Bhbi4gUHJvbW90aW5nIE1MZmxvdyB0cmFjZSBpbmZvIGFmdGVyIHRoZSBhZ2VudCByb290XG4gKiBjbG9zZXMgYXZvaWRzIHRoZSBzaWRlY2FyIHJlcGxhY2luZyBjbGVhbiBwcmV2aWV3cyBhbmQgdGFncyB3aXRoIGVtcHR5IEhUVFBcbiAqIHRyYWNlIG1ldGFkYXRhLiBPdGhlciBydW50aW1lcyByZXRhaW4gdGhlIGV4aXN0aW5nIEhUVFAvbG9jYWwgcGFyZW50YWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0aXZlQ2hhdFRyYWNpbmdPcHRpb25zKFxuICBvcHRpb25zOiBUcmFjaW5nT3B0aW9ucyB8IHVuZGVmaW5lZCxcbik6IFRyYWNpbmdPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhdGUgPSBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpO1xuICBpZiAoIXN0YXRlKSByZXR1cm4gb3B0aW9ucztcbiAgcmV0dXJuIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHRyYWNlSWQ6IHN0YXRlLnRyYWNlSWQsXG4gICAgLi4uKHN0YXRlLnBhcmVudFNwYW5JZCA/IHsgcGFyZW50U3BhbklkOiBzdGF0ZS5wYXJlbnRTcGFuSWQgfSA6IHsgcGFyZW50U3BhbklkOiB1bmRlZmluZWQgfSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNldENoYXRUcmFjZVRhZyhzdGF0ZTogQ2hhdFRyYWNlU3RhdGUsIG5hbWU6IHN0cmluZywgdmFsdWU6IENoYXRUcmFjZVRhZ1ZhbHVlKTogdm9pZCB7XG4gIGNvbnN0IHRhZyA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwobmFtZSk7XG4gIGlmICghdGFnKSByZXR1cm47XG4gIHN0YXRlLnRhZ3Muc2V0KHRhZywgU3RyaW5nKHZhbHVlKSk7XG59XG5cbi8qKiBJbmplY3Qgb25lIE1MZmxvdyB0cmFjZSB0YWcgaW50byB0aGUgYWN0aXZlIGNoYXQgcmVxdWVzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBY3RpdmVUcmFjZVRhZyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBDaGF0VHJhY2VUYWdWYWx1ZSA9IHRydWUpOiB2b2lkIHtcbiAgY29uc3Qgc3RhdGUgPSBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpO1xuICBpZiAoc3RhdGUpIHNldENoYXRUcmFjZVRhZyhzdGF0ZSwgbmFtZSwgdmFsdWUpO1xufVxuXG4vKiogSW5qZWN0IG11bHRpcGxlIE1MZmxvdyB0cmFjZSB0YWdzIGludG8gdGhlIGFjdGl2ZSBjaGF0IHJlcXVlc3QuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VUYWdzKFxuICB0YWdzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBDaGF0VHJhY2VUYWdWYWx1ZSB8IHVuZGVmaW5lZD4+LFxuKTogdm9pZCB7XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKCFzdGF0ZSkgcmV0dXJuO1xuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGFncykpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgc2V0Q2hhdFRyYWNlVGFnKHN0YXRlLCBuYW1lLCB2YWx1ZSk7XG4gIH1cbn1cblxuLyoqIFJlY29yZCB0aGUgZmlyc3Qgc2VsZWN0ZWQgbW9kZWwgYXMgdGhlIGFjdGl2ZSBjaGF0IHRyYWNlJ3MgYGFnZW50YCB0YWcuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VNb2RlbChtb2RlbElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgdmFsdWUgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKG1vZGVsSWQpO1xuICBpZiAoIXZhbHVlKSByZXR1cm47XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKCFzdGF0ZSB8fCBzdGF0ZS5maXJzdE1vZGVsKSByZXR1cm47XG4gIHN0YXRlLmZpcnN0TW9kZWwgPSB2YWx1ZTtcbiAgc2V0Q2hhdFRyYWNlVGFnKHN0YXRlLCBNTEZMT1dfQUdFTlRfVEFHLCB2YWx1ZSk7XG4gIGNvbnN0IHNwYW4gPSB0cmFjZS5nZXRBY3RpdmVTcGFuKCk7XG4gIGlmIChzcGFuPy5pc1JlY29yZGluZygpKSBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfQUdFTlRfVEFHX0FUVFIsIHZhbHVlKTtcbiAgdXBkYXRlQWN0aXZlTWxmbG93VHJhY2VUYWdzKHsgW01MRkxPV19BR0VOVF9UQUddOiB2YWx1ZSB9KTtcbn1cblxuLyoqIFJlY29yZCB0aGUgYmVzdCByZXNvbHZlZCB1c2VyIGlkZW50aWZpZXIgb24gdGhlIGFjdGl2ZSBjaGF0IHRyYWNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEFjdGl2ZVRyYWNlVXNlcih1c2VyOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgY29uc3QgdmFsdWUgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKHVzZXIpO1xuICBpZiAoIXZhbHVlKSByZXR1cm47XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKHN0YXRlKSBzdGF0ZS51c2VyID0gdmFsdWU7XG59XG5cbi8qKiBSZWNvcmQgb25lIERhdGFicmlja3MgYXV0aGVudGljYXRpb24gbW9kZSB1c2VkIGR1cmluZyB0aGUgYWN0aXZlIGNoYXQgdHJhY2UuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VBdXRoKGF1dGg6IFwib2JvXCIgfCBcInNlcnZpY2UtcHJpbmNpcGFsXCIpOiB2b2lkIHtcbiAgcmVjb3JkQWN0aXZlVHJhY2VUYWcoYXV0aCA9PT0gXCJvYm9cIiA/IE1MRkxPV19PQk9fQVVUSF9UQUcgOiBNTEZMT1dfU1BfQVVUSF9UQUcpO1xufVxuXG4vKiogUHVibGlzaCB0aGUgdHVybidzIE1MZmxvdyB0cmFjZSBpZCBiZWZvcmUgdGhlIGhhbmRsZXIgd3JpdGVzIHRoZSBib2R5LiAqL1xuZnVuY3Rpb24gc3RhbXBNbGZsb3dUcmFjZUlkKHJlczogZXhwcmVzcy5SZXNwb25zZSwgdHJhY2VJZDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChyZXMuaGVhZGVyc1NlbnQpIHJldHVybjtcbiAgaWYgKCF0cmFjZUlkIHx8IHRyYWNlSWQgPT09IElOVkFMSURfVFJBQ0VfSUQpIHJldHVybjtcbiAgcmVzLnNldEhlYWRlcihmZWVkYmFjay5NTEZMT1dfVFJBQ0VfSURfSEVBREVSLCBgdHItJHt0cmFjZUlkfWApO1xufVxuXG4vKiogUmV0dXJuIG9uZSByYXcgcHJvbXB0IHdoZW4gdGhlIHJlcXVlc3QgaXMgZXhhY3RseSBvbmUgdGV4dC1vbmx5IHVzZXIgbWVzc2FnZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0T25seUNoYXRJbnB1dChtZXNzYWdlczogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgbWVzc2FnZXMgPT09IFwic3RyaW5nXCIpIHJldHVybiBtZXNzYWdlcyB8fCB1bmRlZmluZWQ7XG4gIGlmICghQXJyYXkuaXNBcnJheShtZXNzYWdlcykgfHwgbWVzc2FnZXMubGVuZ3RoICE9PSAxKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXNbMF07XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKG1lc3NhZ2UpIHx8IG1lc3NhZ2Uucm9sZSAhPT0gXCJ1c2VyXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSBcInN0cmluZ1wiKSByZXR1cm4gbWVzc2FnZS5jb250ZW50IHx8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRleHRGcm9tUGFydHMobWVzc2FnZS5wYXJ0cykgPz8gdGV4dEZyb21QYXJ0cyhtZXNzYWdlLmNvbnRlbnQpO1xufVxuXG5mdW5jdGlvbiB0ZXh0RnJvbVBhcnRzKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHRleHQ6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcGFydCBvZiB2YWx1ZSkge1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKHBhcnQpIHx8IHBhcnQudHlwZSAhPT0gXCJ0ZXh0XCIgfHwgdHlwZW9mIHBhcnQudGV4dCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGV4dC5wdXNoKHBhcnQudGV4dCk7XG4gIH1cbiAgY29uc3Qgam9pbmVkID0gdGV4dC5qb2luKFwiXCIpO1xuICByZXR1cm4gam9pbmVkIHx8IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplZCh2YWx1ZTogdW5rbm93biwgbGltaXQgPSBUUkFDRV9JT19MSU1JVCk6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk/LnNsaWNlKDAsIGxpbWl0KSA/PyBTdHJpbmcodmFsdWUpLnNsaWNlKDAsIGxpbWl0KTtcbn1cblxuZnVuY3Rpb24gc3NlRnJhbWUobGluZTogc3RyaW5nKTogdW5rbm93biB7XG4gIGlmICghbGluZS5zdGFydHNXaXRoKFwiZGF0YTpcIikpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBqc29uLnBhcnNlKGxpbmUuc2xpY2UoNSkpO1xufVxuXG5mdW5jdGlvbiB2YWx1ZVVzZXNHZW5pZSh2YWx1ZTogdW5rbm93biwgZGVwdGggPSAwKTogYm9vbGVhbiB7XG4gIGlmIChkZXB0aCA+IDMpIHJldHVybiBmYWxzZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuc29tZSgoaXRlbSkgPT4gdmFsdWVVc2VzR2VuaWUoaXRlbSwgZGVwdGggKyAxKSk7XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoXG4gICAgdmFsdWUudHlwZSA9PT0gXCJkYXRhLWdlbmllLXByb2dyZXNzXCIgfHxcbiAgICB2YWx1ZS50eXBlID09PSBcImFza19nZW5pZV9kb25lXCIgfHxcbiAgICB2YWx1ZS50b29sTmFtZSA9PT0gXCJhc2tfZ2VuaWVcIiB8fFxuICAgIHZhbHVlLnRvb2xfbmFtZSA9PT0gXCJhc2tfZ2VuaWVcIiB8fFxuICAgIHZhbHVlLm5hbWUgPT09IFwiYXNrX2dlbmllXCJcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIFtcImRhdGFcIiwgXCJldmVudFwiLCBcInBheWxvYWRcIl0uc29tZSgoa2V5KSA9PiB2YWx1ZVVzZXNHZW5pZSh2YWx1ZVtrZXldLCBkZXB0aCArIDEpKTtcbn1cblxuLyoqIFJldHVybiB0aGUgYXNzaXN0YW50IHRleHQgZnJvbSBvbmUgU1NFIGxpbmUsIG9yIGFuIGVtcHR5IHN0cmluZy4gKi9cbmZ1bmN0aW9uIGFzc2lzdGFudFRleHRGcm9tU3NlTGluZShsaW5lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYXNzaXN0YW50VGV4dEZyb21Tc2VGcmFtZShzc2VGcmFtZShsaW5lKSk7XG59XG5cbmZ1bmN0aW9uIGFzc2lzdGFudFRleHRGcm9tU3NlRnJhbWUoZnJhbWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAoIW9iamVjdC5pc1JlY29yZChmcmFtZSkgfHwgZnJhbWUudHlwZSAhPT0gXCJ0ZXh0LWRlbHRhXCIpIHJldHVybiBcIlwiO1xuICBjb25zdCB0ZXh0ID1cbiAgICB0eXBlb2YgZnJhbWUuZGVsdGEgPT09IFwic3RyaW5nXCJcbiAgICAgID8gZnJhbWUuZGVsdGFcbiAgICAgIDogb2JqZWN0LmlzUmVjb3JkKGZyYW1lLnBheWxvYWQpXG4gICAgICAgID8gZnJhbWUucGF5bG9hZC50ZXh0XG4gICAgICAgIDogdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIHRleHQgPT09IFwic3RyaW5nXCIgPyB0ZXh0IDogXCJcIjtcbn1cblxuLyoqXG4gKiBDb25jYXRlbmF0ZSB0aGUgYXNzaXN0YW50J3MgYW5zd2VyIG91dCBvZiBhbiBBSSBTREsgU1NFIHRyYW5zY3JpcHQuXG4gKlxuICogVGhlIGFnZW50IHN0cmVhbXMgaXRzIHJlcGx5IGFzIGB0ZXh0LWRlbHRhYCBmcmFtZXNcbiAqIChgZGF0YToge1widHlwZVwiOlwidGV4dC1kZWx0YVwiLFwicGF5bG9hZFwiOntcInRleHRcIjpcIi4uLlwifX1gKSwgc28gdGhlIGZ1bGxcbiAqIGFuc3dlciBvbmx5IGV2ZXIgZXhpc3RzIGFzIGRlbHRhcyBvbiB0aGUgd2lyZSBhbmQgaGFzIHRvIGJlXG4gKiByZWFzc2VtYmxlZCBoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaXN0YW50VGV4dEZyb21Tc2UoYm9keTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbGluZSBvZiBib2R5LnNwbGl0KFwiXFxuXCIpKSB7XG4gICAgY29uc3QgdGV4dCA9IGFzc2lzdGFudFRleHRGcm9tU3NlTGluZShsaW5lKTtcbiAgICBpZiAodGV4dCkgcGFydHMucHVzaCh0ZXh0KTtcbiAgfVxuICByZXR1cm4gcGFydHMuam9pbihcIlwiKS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCk7XG59XG5cbi8qKiBSZWFkIHRoZSBmaW5hbCBhc3Npc3RhbnQgdGV4dCBmcm9tIGEgbm9uLXN0cmVhbWluZyBNYXN0cmEgcmVzcG9uc2UuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaXN0YW50VGV4dEZyb21Kc29uKGJvZHk6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAoIW9iamVjdC5pc1JlY29yZChib2R5KSB8fCB0eXBlb2YgYm9keS50ZXh0ICE9PSBcInN0cmluZ1wiKSByZXR1cm4gXCJcIjtcbiAgcmV0dXJuIGJvZHkudGV4dC5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCk7XG59XG5cbmNvbnN0IE1BU1RSQV9BR0VOVF9JTlBVVF9BVFRSID0gXCJtYXN0cmEuYWdlbnRfcnVuLmlucHV0XCI7XG5jb25zdCBNQVNUUkFfQUdFTlRfT1VUUFVUX0FUVFIgPSBcIm1hc3RyYS5hZ2VudF9ydW4ub3V0cHV0XCI7XG5jb25zdCBHRU5fQUlfUkVRVUVTVF9NT0RFTF9BVFRSID0gXCJnZW5fYWkucmVxdWVzdC5tb2RlbFwiO1xuY29uc3QgR0VOX0FJX0FHRU5UX0lEX0FUVFIgPSBcImdlbl9haS5hZ2VudC5pZFwiO1xuY29uc3QgR0VOX0FJX0FHRU5UX05BTUVfQVRUUiA9IFwiZ2VuX2FpLmFnZW50Lm5hbWVcIjtcbmNvbnN0IE1BU1RSQV9NT0RFTF9NRVRBREFUQV9BVFRSID0gXCJtYXN0cmEubWV0YWRhdGEubW9kZWxNZXRhZGF0YVwiO1xuY29uc3QgTUFTVFJBX01FVEFEQVRBX1BSRUZJWCA9IFwibWFzdHJhLm1ldGFkYXRhLlwiO1xuXG5pbnRlcmZhY2UgQXBwTWxmbG93VHJhY2VTdGF0ZSB7XG4gIHJlYWRvbmx5IHRhZ3M6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIGdlbmllOiBib29sZWFuO1xuICBtb2RlbD86IHN0cmluZztcbn1cblxuZnVuY3Rpb24gYXR0cmlidXRlU3RyaW5nKHNwYW46IFJlYWRhYmxlU3BhbiwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSBzcGFuLmF0dHJpYnV0ZXNbbmFtZV07XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyAoc3RyaW5nVXRpbHMudHJpbVRvTnVsbCh2YWx1ZSkgPz8gdW5kZWZpbmVkKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gbWV0YWRhdGFBdHRyaWJ1dGUoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7TUFTVFJBX01FVEFEQVRBX1BSRUZJWH0ke2tleX1gO1xufVxuXG5mdW5jdGlvbiBtb2RlbEZyb21TcGFuKHNwYW46IFJlYWRhYmxlU3Bhbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRpcmVjdCA9IGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBHRU5fQUlfUkVRVUVTVF9NT0RFTF9BVFRSKTtcbiAgaWYgKGRpcmVjdCkgcmV0dXJuIGRpcmVjdDtcbiAgY29uc3QgbWV0YWRhdGEgPSBqc29uLnBhcnNlKGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBNQVNUUkFfTU9ERUxfTUVUQURBVEFfQVRUUikpO1xuICByZXR1cm4gb2JqZWN0LmlzUmVjb3JkKG1ldGFkYXRhKSAmJiB0eXBlb2YgbWV0YWRhdGEubW9kZWxJZCA9PT0gXCJzdHJpbmdcIlxuICAgID8gKHN0cmluZ1V0aWxzLnRyaW1Ub051bGwobWV0YWRhdGEubW9kZWxJZCkgPz8gdW5kZWZpbmVkKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBzcGFuVXNlc0dlbmllKHNwYW46IFJlYWRhYmxlU3Bhbik6IGJvb2xlYW4ge1xuICBpZiAoc3Bhbi5hdHRyaWJ1dGVzW01MRkxPV19HRU5JRV9UQUdfQVRUUl0gPT09IFwidHJ1ZVwiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKC9cXGJhc2tfZ2VuaWUoPzpffFxcYikvaS50ZXN0KHNwYW4ubmFtZSkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gW1wiZ2VuX2FpLnRvb2wubmFtZVwiLCBcIm1hc3RyYS50b29sX2NhbGwubmFtZVwiXS5zb21lKChuYW1lKSA9PlxuICAgIC9eYXNrX2dlbmllKD86X3wkKS9pLnRlc3QoYXR0cmlidXRlU3RyaW5nKHNwYW4sIG5hbWUpID8/IFwiXCIpLFxuICApO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0VHJhY2VUYWdzKHNwYW46IFJlYWRhYmxlU3Bhbiwgc3RhdGU6IEFwcE1sZmxvd1RyYWNlU3RhdGUpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNwYW4uYXR0cmlidXRlcykpIHtcbiAgICBpZiAoIW5hbWUuc3RhcnRzV2l0aChNTEZMT1dfVFJBQ0VfVEFHX1BSRUZJWCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHRhZyA9IG5hbWUuc2xpY2UoTUxGTE9XX1RSQUNFX1RBR19QUkVGSVgubGVuZ3RoKTtcbiAgICBpZiAoXG4gICAgICB0YWcgJiZcbiAgICAgICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpXG4gICAgKSB7XG4gICAgICBzdGF0ZS50YWdzLnNldCh0YWcsIFN0cmluZyh2YWx1ZSkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoclRpbWVNaWxsaXNlY29uZHModmFsdWU6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl0pOiBudW1iZXIge1xuICByZXR1cm4gdmFsdWVbMF0gKiAxXzAwMCArIHZhbHVlWzFdIC8gMV8wMDBfMDAwO1xufVxuXG5mdW5jdGlvbiBwcmV2aWV3SW5wdXQoc3BhbjogUmVhZGFibGVTcGFuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmF3ID0gYXR0cmlidXRlU3RyaW5nKHNwYW4sIE1BU1RSQV9BR0VOVF9JTlBVVF9BVFRSKTtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiAodGV4dE9ubHlDaGF0SW5wdXQoanNvbi5wYXJzZShyYXcpKSA/PyByYXcpLnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUKTtcbn1cblxuZnVuY3Rpb24gcHJldmlld091dHB1dChzcGFuOiBSZWFkYWJsZVNwYW4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByYXcgPSBhdHRyaWJ1dGVTdHJpbmcoc3BhbiwgTUFTVFJBX0FHRU5UX09VVFBVVF9BVFRSKTtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBhcnNlZCA9IGpzb24ucGFyc2UocmF3KTtcbiAgY29uc3QgdGV4dCA9IGFzc2lzdGFudFRleHRGcm9tSnNvbihwYXJzZWQpIHx8ICh0eXBlb2YgcGFyc2VkID09PSBcInN0cmluZ1wiID8gcGFyc2VkIDogcmF3KTtcbiAgcmV0dXJuIHRleHQuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpO1xufVxuXG4vKiogUHJvbW90ZSB0aGUgYWN0dWFsIE1hc3RyYSBgaW52b2tlX2FnZW50YCB0cmFjZSBleHBvcnRlZCBieSBBcHBLaXQncyBwcm92aWRlci4gKi9cbmV4cG9ydCBjbGFzcyBBcHBNbGZsb3dUcmFjZUluZm9TcGFuUHJvY2Vzc29yIGltcGxlbWVudHMgU3BhblByb2Nlc3NvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhY2VzID0gbmV3IE1hcDxzdHJpbmcsIEFwcE1sZmxvd1RyYWNlU3RhdGU+KCk7XG5cbiAgb25TdGFydChzcGFuOiBTZGtTcGFuLCBfcGFyZW50Q29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuICAgIGNvbnN0IHRyYWNlSWQgPSBzcGFuLnNwYW5Db250ZXh0KCkudHJhY2VJZDtcbiAgICBpZiAoIXRoaXMudHJhY2VzLmhhcyh0cmFjZUlkKSkge1xuICAgICAgdGhpcy50cmFjZXMuc2V0KHRyYWNlSWQsIHsgdGFnczogbmV3IE1hcCgpLCBnZW5pZTogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgb25FbmQoc3BhbjogUmVhZGFibGVTcGFuKTogdm9pZCB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHNwYW4uc3BhbkNvbnRleHQoKS50cmFjZUlkO1xuICAgIGNvbnN0IHN0YXRlOiBBcHBNbGZsb3dUcmFjZVN0YXRlID0gdGhpcy50cmFjZXMuZ2V0KHRyYWNlSWQpID8/IHtcbiAgICAgIHRhZ3M6IG5ldyBNYXAoKSxcbiAgICAgIGdlbmllOiBmYWxzZSxcbiAgICB9O1xuICAgIHRoaXMudHJhY2VzLnNldCh0cmFjZUlkLCBzdGF0ZSk7XG4gICAgY29sbGVjdFRyYWNlVGFncyhzcGFuLCBzdGF0ZSk7XG4gICAgc3RhdGUubW9kZWwgPz89IG1vZGVsRnJvbVNwYW4oc3Bhbik7XG4gICAgc3RhdGUuZ2VuaWUgfHw9IHNwYW5Vc2VzR2VuaWUoc3Bhbik7XG5cbiAgICBpZiAoYXR0cmlidXRlU3RyaW5nKHNwYW4sIEdFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSKSAhPT0gXCJpbnZva2VfYWdlbnRcIikge1xuICAgICAgaWYgKCFzcGFuLnBhcmVudFNwYW5Db250ZXh0Py5zcGFuSWQpIHRoaXMudHJhY2VzLmRlbGV0ZSh0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhZ2VudCA9XG4gICAgICBzdGF0ZS5tb2RlbCA/P1xuICAgICAgYXR0cmlidXRlU3RyaW5nKHNwYW4sIEdFTl9BSV9BR0VOVF9JRF9BVFRSKSA/P1xuICAgICAgYXR0cmlidXRlU3RyaW5nKHNwYW4sIEdFTl9BSV9BR0VOVF9OQU1FX0FUVFIpO1xuICAgIGlmIChhZ2VudCkgc3RhdGUudGFncy5zZXQoTUxGTE9XX0FHRU5UX1RBRywgYWdlbnQpO1xuICAgIGlmIChzdGF0ZS5nZW5pZSkgc3RhdGUudGFncy5zZXQoTUxGTE9XX0dFTklFX1RBRywgXCJ0cnVlXCIpO1xuICAgIGNvbnN0IGF1dGggPSBhdHRyaWJ1dGVTdHJpbmcoc3BhbiwgbWV0YWRhdGFBdHRyaWJ1dGUoTUFTVFJBX0FVVEhfTU9ERV9LRVkpKTtcbiAgICBpZiAoYXV0aCA9PT0gXCJvYm9cIikgc3RhdGUudGFncy5zZXQoTUxGTE9XX09CT19BVVRIX1RBRywgXCJ0cnVlXCIpO1xuICAgIGVsc2UgaWYgKGF1dGggPT09IFwic2VydmljZS1wcmluY2lwYWxcIikgc3RhdGUudGFncy5zZXQoTUxGTE9XX1NQX0FVVEhfVEFHLCBcInRydWVcIik7XG5cbiAgICBjb25zdCB1c2VyID1cbiAgICAgIGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBtZXRhZGF0YUF0dHJpYnV0ZShNQVNUUkFfVVNFUl9FTUFJTF9LRVkpKSA/P1xuICAgICAgYXR0cmlidXRlU3RyaW5nKHNwYW4sIG1ldGFkYXRhQXR0cmlidXRlKE1BU1RSQV9VU0VSX05BTUVfS0VZKSkgPz9cbiAgICAgIGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBtZXRhZGF0YUF0dHJpYnV0ZShNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKSk7XG4gICAgY29uc3Qgc2Vzc2lvbklkID1cbiAgICAgIGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBtZXRhZGF0YUF0dHJpYnV0ZShNQVNUUkFfVEhSRUFEX0lEX0tFWSkpID8/XG4gICAgICBhdHRyaWJ1dGVTdHJpbmcoc3BhbiwgXCJnZW5fYWkuY29udmVyc2F0aW9uLmlkXCIpO1xuICAgIGNvbnN0IHJlcXVlc3RQcmV2aWV3ID0gcHJldmlld0lucHV0KHNwYW4pO1xuICAgIGNvbnN0IHJlc3BvbnNlUHJldmlldyA9IHByZXZpZXdPdXRwdXQoc3Bhbik7XG4gICAgcGVyc2lzdEFwcE1sZmxvd1RyYWNlSW5mbyh7XG4gICAgICB0cmFjZUlkLFxuICAgICAgcmVxdWVzdFRpbWU6IGhyVGltZU1pbGxpc2Vjb25kcyhzcGFuLnN0YXJ0VGltZSksXG4gICAgICBleGVjdXRpb25EdXJhdGlvbjogaHJUaW1lTWlsbGlzZWNvbmRzKHNwYW4uZHVyYXRpb24pLFxuICAgICAgZXJyb3I6IHNwYW4uc3RhdHVzLmNvZGUgPT09IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgdGFnczogT2JqZWN0LmZyb21FbnRyaWVzKHN0YXRlLnRhZ3MpLFxuICAgICAgLi4uKHVzZXIgPyB7IHVzZXIgfSA6IHt9KSxcbiAgICAgIC4uLihzZXNzaW9uSWQgPyB7IHNlc3Npb25JZCB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3RQcmV2aWV3ID8geyByZXF1ZXN0UHJldmlldyB9IDoge30pLFxuICAgICAgLi4uKHJlc3BvbnNlUHJldmlldyA/IHsgcmVzcG9uc2VQcmV2aWV3IH0gOiB7fSksXG4gICAgfSk7XG4gICAgdGhpcy50cmFjZXMuZGVsZXRlKHRyYWNlSWQpO1xuICB9XG5cbiAgYXN5bmMgZm9yY2VGbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy50cmFjZXMuY2xlYXIoKTtcbiAgfVxufVxuXG5sZXQgYXBwTWxmbG93VHJhY2VJbmZvUHJvY2Vzc29yUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKiogUmVnaXN0ZXIgdHJhY2UgZW5yaWNobWVudCBiZWZvcmUgQXBwS2l0IGNvbnN0cnVjdHMgaXRzIG5hdGl2ZSBwcm92aWRlci4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWdpc3RlckFwcE1sZmxvd1RyYWNlSW5mb1Byb2Nlc3NvcigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKGFwcE1sZmxvd1RyYWNlSW5mb1Byb2Nlc3NvclJlZ2lzdGVyZWQpIHJldHVybiB0cnVlO1xuICBpZiAoIWFwcE1sZmxvd1RyYWNlSW5mb0NvbmZpZ3VyZWQoKSkgcmV0dXJuIGZhbHNlO1xuICBhd2FpdCBpbml0aWFsaXplQXBwTWxmbG93VHJhY2VJbmZvKCk7XG4gIGF3YWl0IGFwcGtpdFRlbGVtZXRyeS5yZWdpc3Rlck5hdGl2ZVNwYW5Qcm9jZXNzb3IobmV3IEFwcE1sZmxvd1RyYWNlSW5mb1NwYW5Qcm9jZXNzb3IoKSk7XG4gIGFwcE1sZmxvd1RyYWNlSW5mb1Byb2Nlc3NvclJlZ2lzdGVyZWQgPSB0cnVlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIEluY3JlbWVudGFsbHkgYXNzZW1ibGUgVVRGLTggU1NFIHRleHQgd2hpbGUgcmV0YWluaW5nIGEgYm91bmRlZCBKU09OIGZhbGxiYWNrLiAqL1xuY2xhc3MgQXNzaXN0YW50UmVzcG9uc2VDb2xsZWN0b3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IGRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihcInV0ZjhcIik7XG4gIHByaXZhdGUgYW5zd2VyID0gXCJcIjtcbiAgcHJpdmF0ZSBib2R5ID0gXCJcIjtcbiAgcHJpdmF0ZSBwZW5kaW5nTGluZSA9IFwiXCI7XG4gIHByaXZhdGUgZmluaXNoZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBnZW5pZSA9IGZhbHNlO1xuXG4gIHdyaXRlKGNodW5rOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmluaXNoZWQpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aGlzLmNvbnN1bWUoY2h1bmspO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGNodW5rKSkge1xuICAgICAgdGhpcy5jb25zdW1lKFxuICAgICAgICB0aGlzLmRlY29kZXIud3JpdGUoQnVmZmVyLmZyb20oY2h1bmsuYnVmZmVyLCBjaHVuay5ieXRlT2Zmc2V0LCBjaHVuay5ieXRlTGVuZ3RoKSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGZpbmlzaCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZpbmlzaGVkKSByZXR1cm4gdGhpcy5hbnN3ZXIgfHwgdGhpcy5qc29uQW5zd2VyKCk7XG4gICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgdGhpcy5jb25zdW1lKHRoaXMuZGVjb2Rlci5lbmQoKSk7XG4gICAgdGhpcy5jb25zdW1lU3NlTGluZSh0aGlzLnBlbmRpbmdMaW5lKTtcbiAgICB0aGlzLnBlbmRpbmdMaW5lID0gXCJcIjtcbiAgICByZXR1cm4gdGhpcy5hbnN3ZXIgfHwgdGhpcy5qc29uQW5zd2VyKCk7XG4gIH1cblxuICByYXdCb2R5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYm9keS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCk7XG4gIH1cblxuICB1c2VkR2VuaWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2VuaWU7XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWUodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm47XG4gICAgaWYgKHRoaXMuYm9keS5sZW5ndGggPCBSRVNQT05TRV9CT0RZX0xJTUlUKSB7XG4gICAgICB0aGlzLmJvZHkgKz0gdGV4dC5zbGljZSgwLCBSRVNQT05TRV9CT0RZX0xJTUlUIC0gdGhpcy5ib2R5Lmxlbmd0aCk7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZ0xpbmUgKz0gdGV4dDtcbiAgICBsZXQgbmV3bGluZSA9IHRoaXMucGVuZGluZ0xpbmUuaW5kZXhPZihcIlxcblwiKTtcbiAgICB3aGlsZSAobmV3bGluZSA+PSAwKSB7XG4gICAgICB0aGlzLmNvbnN1bWVTc2VMaW5lKHRoaXMucGVuZGluZ0xpbmUuc2xpY2UoMCwgbmV3bGluZSkucmVwbGFjZSgvXFxyJC8sIFwiXCIpKTtcbiAgICAgIHRoaXMucGVuZGluZ0xpbmUgPSB0aGlzLnBlbmRpbmdMaW5lLnNsaWNlKG5ld2xpbmUgKyAxKTtcbiAgICAgIG5ld2xpbmUgPSB0aGlzLnBlbmRpbmdMaW5lLmluZGV4T2YoXCJcXG5cIik7XG4gICAgfVxuICAgIGlmICh0aGlzLnBlbmRpbmdMaW5lLmxlbmd0aCA+IFJFU1BPTlNFX0JPRFlfTElNSVQpIHtcbiAgICAgIHRoaXMucGVuZGluZ0xpbmUgPSB0aGlzLnBlbmRpbmdMaW5lLnNsaWNlKC1SRVNQT05TRV9CT0RZX0xJTUlUKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVTc2VMaW5lKGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGZyYW1lID0gc3NlRnJhbWUobGluZSk7XG4gICAgdGhpcy5nZW5pZSB8fD0gdmFsdWVVc2VzR2VuaWUoZnJhbWUpO1xuICAgIGlmICh0aGlzLmFuc3dlci5sZW5ndGggPj0gVFJBQ0VfSU9fTElNSVQpIHJldHVybjtcbiAgICBjb25zdCB0ZXh0ID0gYXNzaXN0YW50VGV4dEZyb21Tc2VGcmFtZShmcmFtZSk7XG4gICAgdGhpcy5hbnN3ZXIgKz0gdGV4dC5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCAtIHRoaXMuYW5zd2VyLmxlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIGpzb25BbnN3ZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYXNzaXN0YW50VGV4dEZyb21Kc29uKGpzb24ucGFyc2UodGhpcy5ib2R5KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZWxlY3QgdGhlIHNwYW4gTUxmbG93IHRyZWF0cyBhcyB0aGUgcmVxdWVzdCByb290LlxuICpcbiAqIE9UZWwgSFRUUCBpbnN0cnVtZW50YXRpb24gc3RvcmVzIGl0cyBzZXJ2ZXIgc3BhbiBpbiBSUEMgbWV0YWRhdGEuIFRoYXQgc3BhblxuICogd2lucyBvdmVyIGFuIGFjdGl2ZSBFeHByZXNzIGNoaWxkLiBJZiBubyByZWNvcmRpbmcgbG9jYWwgc3BhbiBleGlzdHMsIGNyZWF0ZVxuICogb25lIHVuZGVyIHRoZSBjdXJyZW50IGNvbnRleHQgc28gZW5hYmxlZCBXM0MgcHJvcGFnYXRpb24gcmVtYWlucyBpbnRhY3QuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVUcmFjZVRhcmdldCgpOiBUcmFjZVRhcmdldCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGFjdGl2ZUNvbnRleHQgPSBjb250ZXh0LmFjdGl2ZSgpO1xuICBpZiAoZGlyZWN0TWxmbG93VHJhY2luZ0FjdGl2ZSgpKSB7XG4gICAgY29uc3Qgc3BhbiA9IHRyYWNlLmdldFRyYWNlcihDSEFUX1RVUk5fVFJBQ0VSKS5zdGFydFNwYW4oXG4gICAgICBcIm1hc3RyYS5jaGF0X3R1cm5cIixcbiAgICAgIHtcbiAgICAgICAga2luZDogU3BhbktpbmQuU0VSVkVSLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgW0FQUEtJVF9BR0VOVF9UUkFDRV9ST09UX0FUVFJdOiB0cnVlLFxuICAgICAgICAgIFtNTEZMT1dfU1BBTl9UWVBFX0FUVFJdOiBNTEZMT1dfU1BBTl9UWVBFX0FHRU5ULFxuICAgICAgICAgIFtHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUl06IFwiaW52b2tlX2FnZW50XCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJhY2UuZGVsZXRlU3BhbihhY3RpdmVDb250ZXh0KSxcbiAgICApO1xuICAgIGlmICghc3Bhbi5pc1JlY29yZGluZygpKSB7XG4gICAgICBzcGFuLmVuZCgpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3Bhbiwgb3duZWQ6IHRydWUgfTtcbiAgfVxuXG4gIGNvbnN0IHJwYyA9IGdldFJQQ01ldGFkYXRhKGFjdGl2ZUNvbnRleHQpO1xuICBpZiAocnBjPy50eXBlID09PSBSUENUeXBlLkhUVFAgJiYgcnBjLnNwYW4uaXNSZWNvcmRpbmcoKSkge1xuICAgIHJldHVybiB7IHNwYW46IHJwYy5zcGFuLCBvd25lZDogZmFsc2UgfTtcbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZSA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKTtcbiAgaWYgKGFjdGl2ZT8uaXNSZWNvcmRpbmcoKSkgcmV0dXJuIHsgc3BhbjogYWN0aXZlLCBvd25lZDogZmFsc2UgfTtcblxuICBjb25zdCBzcGFuID0gdHJhY2UuZ2V0VHJhY2VyKENIQVRfVFVSTl9UUkFDRVIpLnN0YXJ0U3BhbihcbiAgICBcIm1hc3RyYS5jaGF0X3R1cm5cIixcbiAgICB7XG4gICAgICBraW5kOiBTcGFuS2luZC5TRVJWRVIsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIFtBUFBLSVRfQUdFTlRfVFJBQ0VfUk9PVF9BVFRSXTogdHJ1ZSxcbiAgICAgICAgW01MRkxPV19TUEFOX1RZUEVfQVRUUl06IE1MRkxPV19TUEFOX1RZUEVfQUdFTlQsXG4gICAgICAgIFtHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUl06IFwiaW52b2tlX2FnZW50XCIsXG4gICAgICB9LFxuICAgIH0sXG4gICAgYWN0aXZlQ29udGV4dCxcbiAgKTtcbiAgaWYgKCFzcGFuLmlzUmVjb3JkaW5nKCkpIHtcbiAgICBzcGFuLmVuZCgpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgc3Bhbiwgb3duZWQ6IHRydWUgfTtcbn1cblxuLyoqXG4gKiBFeHByZXNzIG1pZGRsZXdhcmUgdGhhdCBzdGFtcHMgY2hhdCB0dXJuIEkvTyBvbnRvIHRoZSBleHBvcnRlZCBPVGVsIHJvb3QuXG4gKlxuICogVGVlIGByZXMud3JpdGVgLCBgcmVzLmpzb25gLCBhbmQgYHJlcy5lbmRgIGluc3RlYWQgb2YgbGlzdGVuaW5nIGZvciBgZmluaXNoYDpcbiAqIEhUVFAgaW5zdHJ1bWVudGF0aW9uIGVuZHMgaXRzIHNlcnZlciBzcGFuIG9uIGZpbmlzaCwgYW5kIGF0dHJpYnV0ZXMgc2V0XG4gKiBhZnRlciBhIHNwYW4gZW5kcyBuZXZlciByZWFjaCB0aGUgZXhwb3J0ZXIuXG4gKlxuICogYHBhdGhgIGlzIG1vdW50LXJlbGF0aXZlICh3aGF0IHRoZSBNYXN0cmEgc3ViLWFwcCBzZWVzKSwgZS5nLlxuICogYC9hZ2VudHMvc3VwcG9ydC9zdHJlYW1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhdFR1cm5UZWxlbWV0cnlNaWRkbGV3YXJlKFxuICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICBuZXh0OiBleHByZXNzLk5leHRGdW5jdGlvbixcbiAgb3B0aW9uczogQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgaWYgKHJlcS5tZXRob2QgIT09IFwiUE9TVFwiIHx8ICFBR0VOVF9UVVJOX1JPVVRFLnRlc3QocmVxLnBhdGgpKSB7XG4gICAgbmV4dCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0YXJnZXQgPSByZXNvbHZlVHJhY2VUYXJnZXQoKTtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICBuZXh0KCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRhcmdldFRyYWNlSWQgPSB0cmFjZUlkKHRhcmdldC5zcGFuKTtcbiAgaWYgKCF0YXJnZXRUcmFjZUlkKSB7XG4gICAgaWYgKHRhcmdldC5vd25lZCkgdGFyZ2V0LnNwYW4uZW5kKCk7XG4gICAgbmV4dCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0cmFjZVN0YXRlOiBDaGF0VHJhY2VTdGF0ZSA9IHtcbiAgICB0YWdzOiBuZXcgTWFwKCksXG4gICAgdHJhY2VJZDogdGFyZ2V0VHJhY2VJZCxcbiAgICBwYXJlbnRTcGFuSWQ6IHRhcmdldC5zcGFuLnNwYW5Db250ZXh0KCkuc3BhbklkLFxuICB9O1xuICBjb25zdCB0cmFjZVJlcXVlc3RUaW1lID0gRGF0ZS5ub3coKTtcbiAgaWYgKCFlbnZpcm9ubWVudFV0aWxzLmlzRGF0YWJyaWNrc0FwcEVudigpKSB7XG4gICAgc2V0Q2hhdFRyYWNlVGFnKHRyYWNlU3RhdGUsIE1MRkxPV19MT0NBTF9UQUcsIHRydWUpO1xuICB9XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnZXRSZXF1ZXN0VGFncyhyZXEpKSkge1xuICAgIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBuYW1lLCB2YWx1ZSk7XG4gIH1cbiAgY29uc3QgaW5pdGlhbFRhZ3MgPSB0eXBlb2Ygb3B0aW9ucy50YWdzID09PSBcImZ1bmN0aW9uXCIgPyBvcHRpb25zLnRhZ3MocmVxKSA6IG9wdGlvbnMudGFncztcbiAgaWYgKGluaXRpYWxUYWdzKSB7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGluaXRpYWxUYWdzKSkge1xuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHN0YW1wTWxmbG93VHJhY2VJZChyZXMsIHRyYWNlU3RhdGUudHJhY2VJZCk7XG4gIHRyYWNlU3RhdGUudXNlciA9IHN0YW1wTWxmbG93QWN0b3IodGFyZ2V0LnNwYW4sIHJlcSk7XG4gIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9UWVBFX0FUVFIsIE1MRkxPV19TUEFOX1RZUEVfQUdFTlQpO1xuICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFIsIFwiaW52b2tlX2FnZW50XCIpO1xuICBjb25zdCBpZGVudGl0eSA9XG4gICAgdHlwZW9mIG9wdGlvbnMuaWRlbnRpdHkgPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMuaWRlbnRpdHkocmVxKSA6IG9wdGlvbnMuaWRlbnRpdHk7XG4gIGlmIChpZGVudGl0eSkge1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0lERU5USVRZX0FUVFIsIGlkZW50aXR5KTtcbiAgICBzZXRDaGF0VHJhY2VUYWcoXG4gICAgICB0cmFjZVN0YXRlLFxuICAgICAgaWRlbnRpdHkgPT09IFwib2JvXCIgPyBNTEZMT1dfT0JPX0FVVEhfVEFHIDogTUxGTE9XX1NQX0FVVEhfVEFHLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICB9XG4gIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0dFTklFX1VTRURfQVRUUiwgZmFsc2UpO1xuXG4gIGNvbnN0IG1lc3NhZ2VzID0gKHJlcS5ib2R5IGFzIHsgbWVzc2FnZXM/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5tZXNzYWdlcztcbiAgbGV0IHJlcXVlc3RQcmV2aWV3OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmIChtZXNzYWdlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZnVsbElucHV0ID0gc2VyaWFsaXplZChtZXNzYWdlcyk7XG4gICAgcmVxdWVzdFByZXZpZXcgPSB0ZXh0T25seUNoYXRJbnB1dChtZXNzYWdlcykgPz8gZnVsbElucHV0O1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX01FU1NBR0VTX0FUVFIsIGZ1bGxJbnB1dCk7XG4gICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19TUEFOX0lOUFVUU19BVFRSLCByZXF1ZXN0UHJldmlldy5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICB9XG5cbiAgY29uc3QgY29sbGVjdG9yID0gbmV3IEFzc2lzdGFudFJlc3BvbnNlQ29sbGVjdG9yKCk7XG4gIGxldCByZXNwb25zZVByZXZpZXc6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IG91dHB1dFJlY29yZGVkID0gZmFsc2U7XG4gIGxldCBmdWxsT3V0cHV0UmVjb3JkZWQgPSBmYWxzZTtcbiAgbGV0IGdlbmllUmVjb3JkZWQgPSBmYWxzZTtcbiAgbGV0IG93bmVkU3BhbkVuZGVkID0gZmFsc2U7XG4gIGxldCB0cmFjZUZpbmFsaXplZCA9IGZhbHNlO1xuICBjb25zdCBwYXNzVGhyb3VnaFdyaXRlID0gcmVzLndyaXRlLmJpbmQocmVzKSBhcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiBib29sZWFuO1xuICBjb25zdCBwYXNzVGhyb3VnaEVuZCA9IHJlcy5lbmQuYmluZChyZXMpIGFzICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd247XG4gIGNvbnN0IHBhc3NUaHJvdWdoSnNvbiA9IHJlcy5qc29uLmJpbmQocmVzKSBhcyAoYm9keT86IHVua25vd24pID0+IGV4cHJlc3MuUmVzcG9uc2U7XG4gIGNvbnN0IHJlY29yZE91dHB1dCA9IChhbnN3ZXI6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmIChvdXRwdXRSZWNvcmRlZCB8fCAhYW5zd2VyKSByZXR1cm47XG4gICAgcmVzcG9uc2VQcmV2aWV3ID0gYW5zd2VyO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9PVVRQVVRTX0FUVFIsIGFuc3dlci5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICAgIG91dHB1dFJlY29yZGVkID0gdHJ1ZTtcbiAgfTtcbiAgY29uc3QgcmVjb3JkRnVsbE91dHB1dCA9IChyZXNwb25zZTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgaWYgKGZ1bGxPdXRwdXRSZWNvcmRlZCB8fCAhcmVzcG9uc2UpIHJldHVybjtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9SRVNQT05TRV9BVFRSLCByZXNwb25zZS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICAgIGZ1bGxPdXRwdXRSZWNvcmRlZCA9IHRydWU7XG4gIH07XG4gIGNvbnN0IHJlY29yZEdlbmllID0gKHVzZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICBpZiAoIXVzZWQgfHwgZ2VuaWVSZWNvcmRlZCkgcmV0dXJuO1xuICAgIGdlbmllUmVjb3JkZWQgPSB0cnVlO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0dFTklFX1VTRURfQVRUUiwgdHJ1ZSk7XG4gICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19HRU5JRV9UQUdfQVRUUiwgXCJ0cnVlXCIpO1xuICAgIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBNTEZMT1dfR0VOSUVfVEFHLCB0cnVlKTtcbiAgICBjb250ZXh0LndpdGgodHJhY2Uuc2V0U3Bhbihjb250ZXh0LmFjdGl2ZSgpLCB0YXJnZXQuc3BhbiksICgpID0+IHtcbiAgICAgIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlVGFncyh7IFtNTEZMT1dfR0VOSUVfVEFHXTogXCJ0cnVlXCIgfSk7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGZpbmFsaXplVHJhY2UgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHRyYWNlRmluYWxpemVkKSByZXR1cm47XG4gICAgdHJhY2VGaW5hbGl6ZWQgPSB0cnVlO1xuICAgIGNvbnN0IHRhZ3MgPSBPYmplY3QuZnJvbUVudHJpZXModHJhY2VTdGF0ZS50YWdzKTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgdHJhY2VTdGF0ZS50YWdzKSB7XG4gICAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoYCR7TUxGTE9XX1RSQUNFX1RBR19QUkVGSVh9JHtuYW1lfWAsIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRyYWNlU3RhdGUudXNlcikgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19VU0VSX0FUVFIsIHRyYWNlU3RhdGUudXNlcik7XG4gICAgY29udGV4dC53aXRoKHRyYWNlLnNldFNwYW4oY29udGV4dC5hY3RpdmUoKSwgdGFyZ2V0LnNwYW4pLCAoKSA9PiB7XG4gICAgICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZSh7XG4gICAgICAgIC4uLihPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAwID8geyB0YWdzIH0gOiB7fSksXG4gICAgICAgIC4uLih0cmFjZVN0YXRlLnVzZXIgPyB7IHVzZXI6IHRyYWNlU3RhdGUudXNlciB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKCFlbnZpcm9ubWVudFV0aWxzLmlzRGF0YWJyaWNrc0FwcEVudigpKSB7XG4gICAgICBwZXJzaXN0QXBwTWxmbG93VHJhY2VJbmZvKHtcbiAgICAgICAgdHJhY2VJZDogdHJhY2VTdGF0ZS50cmFjZUlkLFxuICAgICAgICByZXF1ZXN0VGltZTogdHJhY2VSZXF1ZXN0VGltZSxcbiAgICAgICAgZXhlY3V0aW9uRHVyYXRpb246IERhdGUubm93KCkgLSB0cmFjZVJlcXVlc3RUaW1lLFxuICAgICAgICBlcnJvcjogcmVzLnN0YXR1c0NvZGUgPj0gNTAwLFxuICAgICAgICB0YWdzLFxuICAgICAgICAuLi4odHJhY2VTdGF0ZS51c2VyID8geyB1c2VyOiB0cmFjZVN0YXRlLnVzZXIgfSA6IHt9KSxcbiAgICAgICAgLi4uKHJlcXVlc3RQcmV2aWV3ID8geyByZXF1ZXN0UHJldmlldyB9IDoge30pLFxuICAgICAgICAuLi4ocmVzcG9uc2VQcmV2aWV3ID8geyByZXNwb25zZVByZXZpZXcgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgZW5kT3duZWRTcGFuID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICghdGFyZ2V0Lm93bmVkIHx8IG93bmVkU3BhbkVuZGVkKSByZXR1cm47XG4gICAgb3duZWRTcGFuRW5kZWQgPSB0cnVlO1xuICAgIHRhcmdldC5zcGFuLmVuZCgpO1xuICB9O1xuXG4gIHJlcy53cml0ZSA9ICgoY2h1bms6IHVua25vd24sIC4uLnJlc3Q6IHVua25vd25bXSkgPT4ge1xuICAgIGNvbGxlY3Rvci53cml0ZShjaHVuayk7XG4gICAgcmV0dXJuIHBhc3NUaHJvdWdoV3JpdGUoY2h1bmssIC4uLnJlc3QpO1xuICB9KSBhcyB0eXBlb2YgcmVzLndyaXRlO1xuXG4gIHJlcy5qc29uID0gKChib2R5PzogdW5rbm93bikgPT4ge1xuICAgIHJlY29yZEZ1bGxPdXRwdXQoc2VyaWFsaXplZChib2R5KSk7XG4gICAgcmVjb3JkR2VuaWUodmFsdWVVc2VzR2VuaWUoYm9keSkpO1xuICAgIHJlY29yZE91dHB1dChhc3Npc3RhbnRUZXh0RnJvbUpzb24oYm9keSkpO1xuICAgIHJldHVybiBwYXNzVGhyb3VnaEpzb24oYm9keSk7XG4gIH0pIGFzIHR5cGVvZiByZXMuanNvbjtcblxuICByZXMuZW5kID0gKChjaHVuaz86IHVua25vd24sIC4uLnJlc3Q6IHVua25vd25bXSkgPT4ge1xuICAgIGNvbGxlY3Rvci53cml0ZShjaHVuayk7XG4gICAgcmVjb3JkT3V0cHV0KGNvbGxlY3Rvci5maW5pc2goKSk7XG4gICAgcmVjb3JkRnVsbE91dHB1dChjb2xsZWN0b3IucmF3Qm9keSgpKTtcbiAgICByZWNvcmRHZW5pZShjb2xsZWN0b3IudXNlZEdlbmllKCkpO1xuICAgIGZpbmFsaXplVHJhY2UoKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHBhc3NUaHJvdWdoRW5kKGNodW5rLCAuLi5yZXN0KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZW5kT3duZWRTcGFuKCk7XG4gICAgfVxuICB9KSBhcyB0eXBlb2YgcmVzLmVuZDtcblxuICByZXMub25jZShcImNsb3NlXCIsICgpID0+IHtcbiAgICByZWNvcmRPdXRwdXQoY29sbGVjdG9yLmZpbmlzaCgpKTtcbiAgICByZWNvcmRGdWxsT3V0cHV0KGNvbGxlY3Rvci5yYXdCb2R5KCkpO1xuICAgIHJlY29yZEdlbmllKGNvbGxlY3Rvci51c2VkR2VuaWUoKSk7XG4gICAgZmluYWxpemVUcmFjZSgpO1xuICAgIGVuZE93bmVkU3BhbigpO1xuICB9KTtcblxuICBjb25zdCBjaGF0Q29udGV4dCA9IHRyYWNlXG4gICAgLnNldFNwYW4oY29udGV4dC5hY3RpdmUoKSwgdGFyZ2V0LnNwYW4pXG4gICAgLnNldFZhbHVlKENIQVRfVFJBQ0VfU1RBVEVfS0VZLCB0cmFjZVN0YXRlKTtcbiAgY29udGV4dC53aXRoKGNoYXRDb250ZXh0LCAoKSA9PiB7XG4gICAgbmV4dCgpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJbnN0YWxsIHtAbGluayBjaGF0VHVyblRlbGVtZXRyeU1pZGRsZXdhcmV9IG9uIGEgTWFzdHJhIEV4cHJlc3Mgc3ViLWFwcC5cbiAqXG4gKiBDYWxsIGJlZm9yZSBgTWFzdHJhU2VydmVyLmluaXQoKWAgc28gdGhlIGxheWVyIHNpdHMgYWhlYWQgb2YgdGhlIGFnZW50XG4gKiByb3V0ZXMuIFNhZmUgdG8gY2FsbCB1bmNvbmRpdGlvbmFsbHk6IHdoZW4gbm8gcmVjb3JkaW5nIHRyYWNlciBpcyByZWdpc3RlcmVkLFxuICogdGhlIG1pZGRsZXdhcmUgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaENoYXRUdXJuVGVsZW1ldHJ5KFxuICBhcHA6IGV4cHJlc3MuRXhwcmVzcyxcbiAgb3B0aW9uczogQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgYXBwLnVzZSgocmVxLCByZXMsIG5leHQpID0+IGNoYXRUdXJuVGVsZW1ldHJ5TWlkZGxld2FyZShyZXEsIHJlcywgbmV4dCwgb3B0aW9ucykpO1xuICBsb2dnZXIuaW5mbyhcImNoYXQgdHVybiB0ZWxlbWV0cnkgbWlkZGxld2FyZSBhdHRhY2hlZFwiLCBvcHRpb25zKTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -36,21 +36,21 @@
36
36
  },
37
37
  "dependencies": {
38
38
  "@databricks/appkit": "0.81.0",
39
- "@dbx-tools/appkit": "^0.9.144",
40
- "@dbx-tools/cache": "^0.9.144",
41
- "@dbx-tools/core": "^0.9.144",
42
- "@dbx-tools/databricks": "^0.9.144",
43
- "@dbx-tools/fs": "^0.9.144",
44
- "@dbx-tools/genie": "^0.9.144",
45
- "@dbx-tools/model": "^0.9.144",
46
- "@dbx-tools/model-protocol": "^0.9.144",
47
- "@dbx-tools/path": "^0.9.144",
48
- "@dbx-tools/postgres": "^0.9.144",
49
- "@dbx-tools/shared-core": "^0.9.144",
50
- "@dbx-tools/shared-fs": "^0.9.144",
51
- "@dbx-tools/shared-genie": "^0.9.144",
52
- "@dbx-tools/shared-mastra": "^0.9.144",
53
- "@dbx-tools/shared-model": "^0.9.144",
39
+ "@dbx-tools/appkit": "^0.9.145",
40
+ "@dbx-tools/cache": "^0.9.145",
41
+ "@dbx-tools/core": "^0.9.145",
42
+ "@dbx-tools/databricks": "^0.9.145",
43
+ "@dbx-tools/fs": "^0.9.145",
44
+ "@dbx-tools/genie": "^0.9.145",
45
+ "@dbx-tools/model": "^0.9.145",
46
+ "@dbx-tools/model-protocol": "^0.9.145",
47
+ "@dbx-tools/path": "^0.9.145",
48
+ "@dbx-tools/postgres": "^0.9.145",
49
+ "@dbx-tools/shared-core": "^0.9.145",
50
+ "@dbx-tools/shared-fs": "^0.9.145",
51
+ "@dbx-tools/shared-genie": "^0.9.145",
52
+ "@dbx-tools/shared-mastra": "^0.9.145",
53
+ "@dbx-tools/shared-model": "^0.9.145",
54
54
  "@mastra/ai-sdk": "1.10.5",
55
55
  "@mastra/core": "1.71.0",
56
56
  "@mastra/express": "1.5.15",
@@ -231,7 +231,7 @@
231
231
  "./package.json": "./package.json"
232
232
  }
233
233
  },
234
- "version": "0.9.144",
234
+ "version": "0.9.145",
235
235
  "types": "./lib/index.d.ts",
236
236
  "dbxToolsConfig": {
237
237
  "tags": [
package/src/chat.ts CHANGED
@@ -24,6 +24,7 @@ import {
24
24
  resolveFollowUpSuggestionsConfig,
25
25
  } from "./follow-up-suggestions.ts";
26
26
  import { withRequestMemoryScope } from "./memory.ts";
27
+ import { activeChatTracingOptions } from "./telemetry.ts";
27
28
 
28
29
  const logger = log.logger("mastra/chat");
29
30
 
@@ -93,6 +94,7 @@ export function agentChatRoutes(config: MastraPluginConfig = {}) {
93
94
  if (userText) requestContext.setRaw(FOLLOW_UP_USER_TEXT_KEY, userText);
94
95
  requestContext.setRaw(FOLLOW_UP_NATIVE_QUESTIONS_KEY, []);
95
96
  requestContext.setRaw(FOLLOW_UP_RUN_ID_KEY, runId);
97
+ const tracingOptions = activeChatTracingOptions(undefined);
96
98
  const stream = await handleChatStream({
97
99
  mastra,
98
100
  agentId,
@@ -106,6 +108,7 @@ export function agentChatRoutes(config: MastraPluginConfig = {}) {
106
108
  ...params,
107
109
  runId,
108
110
  requestContext,
111
+ ...(tracingOptions ? { tracingOptions } : {}),
109
112
  ...(abortSignal ? { abortSignal } : {}),
110
113
  },
111
114
  requestContext,
package/src/config.ts CHANGED
@@ -619,8 +619,9 @@ export interface MastraPluginConfig extends BasePluginConfig {
619
619
  * - `"auto"`: OBO when the request carries an OBO token, the service principal
620
620
  * when it does not. For an app serving BOTH the platform front door and a
621
621
  * door that has no token to forward - a `@dbx-tools/tunnel` gate, a
622
- * Teams channel - where AppKit's `asUser` would otherwise throw
623
- * `AuthenticationError` outside `NODE_ENV=development`.
622
+ * separately authenticated webhook or bot channel - where AppKit's `asUser`
623
+ * would otherwise throw `AuthenticationError` outside
624
+ * `NODE_ENV=development`.
624
625
  *
625
626
  * The service-principal path changes only the Databricks CREDENTIAL. Memory
626
627
  * threads, the per-user cache namespace, and trace metadata still key off the
package/src/identity.ts CHANGED
@@ -9,12 +9,12 @@
9
9
  * otherwise, so ONE decision - do we enter that scope for this request - moves
10
10
  * every call site together.
11
11
  *
12
- * The decision itself is NOT Mastra-specific (the Teams messaging endpoint and
13
- * the tunnel gate face it too), so it lives in `@dbx-tools/appkit`'s `identity`
14
- * module - which also documents the measured AppKit behavior that makes `"auto"`
15
- * necessary. This module is the Mastra-facing binding: the plugin's own config
16
- * field and env var, re-exporting the shared vocabulary so a consumer importing
17
- * `@dbx-tools/appkit-mastra` needs no second import.
12
+ * The decision itself is NOT Mastra-specific (authenticated webhooks and the
13
+ * tunnel gate face it too), so it lives in `@dbx-tools/appkit`'s `identity`
14
+ * module - which also documents the measured AppKit behavior that makes
15
+ * `"auto"` necessary. This module is the Mastra-facing binding: the plugin's own
16
+ * config field and env var, re-exporting the shared vocabulary so a consumer
17
+ * importing `@dbx-tools/appkit-mastra` needs no second import.
18
18
  *
19
19
  * Why the option exists: OBO requires the caller to be a member of the
20
20
  * WORKSPACE, not merely of the Databricks account. An app shared with an
@@ -38,7 +38,8 @@
38
38
  * - `"auto"`: OBO when the request carries an OBO token, the service principal
39
39
  * when it does not. The mode for an app that serves BOTH the platform front
40
40
  * door and a door with no OBO token to forward (a `@dbx-tools/tunnel`
41
- * gate, a Teams channel), since a single container serves both at once.
41
+ * gate or an authenticated webhook), since a single container serves both
42
+ * at once.
42
43
  *
43
44
  * What the service-principal path does NOT change is WHO the turn belongs to.
44
45
  * The memory thread's `resourceId`, the per-user cache namespace, and the user
package/src/mlflow.ts CHANGED
@@ -49,6 +49,7 @@ let directMlflowInitStarted = false;
49
49
  let directMlflowProvider: NodeTracerProvider | undefined;
50
50
  let directMlflowProcessor: SpanProcessor | undefined;
51
51
  let appMlflowTraceInfoInitStarted = false;
52
+ let appMlflowTraceInfoRequestInitStarted = false;
52
53
  let appMlflowTraceInfoClient: WorkspaceClient | undefined;
53
54
  let appMlflowTracePrefix: string | undefined;
54
55
  const pendingAppMlflowTraceInfo = new Set<Promise<void>>();
@@ -209,7 +210,18 @@ async function resolveUcTracePrefix(client: WorkspaceClient): Promise<string | u
209
210
  if (loadedUcPrefix) return loadedUcPrefix.prefix;
210
211
  const experiment = await fetchExperiment(client);
211
212
  if (!experiment) return undefined;
212
- const prefix = ucTracePrefixFromExperimentTags(experiment.tags);
213
+ const location = experiment.trace_location?.uc_trace_location;
214
+ const prefix =
215
+ ucTracePrefixFromExperimentTags(experiment.tags) ??
216
+ (location
217
+ ? [
218
+ location.catalog,
219
+ location.schema,
220
+ location.effective_table_prefix ?? location.table_prefix,
221
+ ]
222
+ .filter(Boolean)
223
+ .join(".")
224
+ : undefined);
213
225
  loadedUcPrefix = { prefix };
214
226
  return prefix;
215
227
  }
@@ -229,6 +241,23 @@ const MlflowExperimentResponseSchema = z
229
241
  .object({
230
242
  experiment_id: z.string().min(1).describe("Workspace MLflow experiment identifier."),
231
243
  tags: z.unknown().optional().describe("Experiment tags, including the UC trace location."),
244
+ trace_location: z
245
+ .object({
246
+ uc_trace_location: z
247
+ .object({
248
+ catalog: z.string().describe("Unity Catalog catalog name."),
249
+ schema: z.string().describe("Unity Catalog schema name."),
250
+ table_prefix: z.string().describe("Configured trace table prefix."),
251
+ effective_table_prefix: z
252
+ .string()
253
+ .optional()
254
+ .describe("Effective trace table prefix selected by Databricks."),
255
+ })
256
+ .optional()
257
+ .describe("Unity Catalog trace location."),
258
+ })
259
+ .optional()
260
+ .describe("Experiment trace storage location."),
232
261
  })
233
262
  .passthrough()
234
263
  .describe("Configured MLflow experiment."),
@@ -354,13 +383,13 @@ export async function initializeAppMlflowTraceInfo(client?: WorkspaceClient): Pr
354
383
  appMlflowTraceInfoInitStarted = true;
355
384
  try {
356
385
  const resolvedClient = client ?? (createWorkspaceClient() as WorkspaceClient);
386
+ appMlflowTraceInfoClient ??= resolvedClient;
357
387
  const prefix = await resolveUcTracePrefix(resolvedClient);
358
388
  if (!prefix || prefix.split(".").length !== 3) {
359
389
  throw new ConfigurationError(
360
390
  "Databricks Apps MLflow trace-info promotion requires a UC-linked experiment or MLFLOW_UC_TRACE_PREFIX.",
361
391
  );
362
392
  }
363
- appMlflowTraceInfoClient = resolvedClient;
364
393
  appMlflowTracePrefix = prefix;
365
394
  logger.info("Databricks Apps MLflow trace-info promotion enabled", { prefix });
366
395
  return true;
@@ -368,10 +397,25 @@ export async function initializeAppMlflowTraceInfo(client?: WorkspaceClient): Pr
368
397
  logger.warn("Databricks Apps MLflow trace-info promotion disabled", {
369
398
  error: errorUtils.toError(err),
370
399
  });
400
+ // Startup uses the service principal. Permit one later request-scoped
401
+ // client to resolve experiment metadata when that principal cannot read it.
402
+ if (client === undefined) appMlflowTraceInfoInitStarted = false;
371
403
  return false;
372
404
  }
373
405
  }
374
406
 
407
+ /**
408
+ * Retry Apps trace-location discovery once with a request-scoped workspace
409
+ * client after service-principal startup discovery failed.
410
+ */
411
+ export async function initializeRequestMlflowTraceInfo(client: WorkspaceClient): Promise<boolean> {
412
+ if (appMlflowTraceInfoClient && appMlflowTracePrefix) return true;
413
+ if (appMlflowTraceInfoRequestInitStarted || !appMlflowTraceInfoConfigured()) return false;
414
+ appMlflowTraceInfoRequestInitStarted = true;
415
+ appMlflowTraceInfoInitStarted = false;
416
+ return initializeAppMlflowTraceInfo(client);
417
+ }
418
+
375
419
  /** Trace-level values persisted beside spans already exported by the Apps OTLP sidecar. */
376
420
  export interface AppMlflowTraceInfo {
377
421
  traceId: string;
@@ -434,6 +478,7 @@ export function persistAppMlflowTraceInfo(params: AppMlflowTraceInfo): void {
434
478
  /** Reset Apps trace-info promotion state for tests. */
435
479
  export function resetAppMlflowTraceInfo(): void {
436
480
  appMlflowTraceInfoInitStarted = false;
481
+ appMlflowTraceInfoRequestInitStarted = false;
437
482
  appMlflowTraceInfoClient = undefined;
438
483
  appMlflowTracePrefix = undefined;
439
484
  pendingAppMlflowTraceInfo.clear();
@@ -644,7 +689,7 @@ async function resolveMlflowExperimentManagerUrl(
644
689
 
645
690
  async function fetchExperiment(
646
691
  client: WorkspaceClient,
647
- ): Promise<{ experiment_id: string; tags?: unknown } | undefined> {
692
+ ): Promise<z.infer<typeof MlflowExperimentResponseSchema>["experiment"] | undefined> {
648
693
  const experiment = configuredExperiment();
649
694
  const path = experiment.id
650
695
  ? `/api/2.0/mlflow/experiments/get?experiment_id=${encodeURIComponent(experiment.id)}`