@dbx-tools/appkit-mastra 0.9.5 → 0.9.6

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.
Files changed (49) hide show
  1. package/README.md +16 -18
  2. package/index.ts +1 -3
  3. package/lib/index.d.ts +1 -3
  4. package/lib/index.js +2 -3
  5. package/lib/src/agents.d.ts +2 -2
  6. package/lib/src/agents.js +6 -6
  7. package/lib/src/chart.js +23 -23
  8. package/lib/src/evaluation.js +3 -3
  9. package/lib/src/genie.d.ts +2 -2
  10. package/lib/src/genie.js +20 -20
  11. package/lib/src/memory.js +9 -26
  12. package/lib/src/mlflow.js +4 -4
  13. package/lib/src/model.js +4 -4
  14. package/lib/src/monty-sandbox.js +6 -6
  15. package/lib/src/observability.js +3 -3
  16. package/lib/src/plugin.js +26 -21
  17. package/lib/src/remote-skills.js +20 -30
  18. package/lib/src/sandbox.js +10 -10
  19. package/lib/src/server.js +5 -5
  20. package/lib/src/serving-sanitize.js +12 -9
  21. package/lib/src/serving.js +8 -8
  22. package/lib/src/storage-schema.js +4 -4
  23. package/lib/src/summarize.js +3 -3
  24. package/lib/src/workspaces.js +9 -9
  25. package/lib/src/writer.js +3 -3
  26. package/lib/tsconfig.tsbuildinfo +1 -1
  27. package/package.json +17 -17
  28. package/src/agents.ts +8 -8
  29. package/src/chart.ts +24 -24
  30. package/src/evaluation.ts +2 -2
  31. package/src/genie.ts +20 -20
  32. package/src/memory.ts +11 -27
  33. package/src/mlflow.ts +3 -3
  34. package/src/model.ts +3 -3
  35. package/src/monty-sandbox.ts +5 -5
  36. package/src/observability.ts +2 -2
  37. package/src/plugin.ts +30 -20
  38. package/src/remote-skills.ts +36 -38
  39. package/src/sandbox.ts +9 -9
  40. package/src/server.ts +4 -4
  41. package/src/serving-sanitize.ts +11 -13
  42. package/src/serving.ts +7 -7
  43. package/src/storage-schema.ts +3 -3
  44. package/src/summarize.ts +2 -2
  45. package/src/workspaces.ts +8 -8
  46. package/src/writer.ts +2 -2
  47. package/lib/src/pagination.d.ts +0 -33
  48. package/lib/src/pagination.js +0 -36
  49. package/src/pagination.ts +0 -47
@@ -19,8 +19,8 @@
19
19
  */
20
20
  import { createHash } from "node:crypto";
21
21
  import { ConfigurationError, createWorkspaceClient } from "@databricks/appkit";
22
- import { DatabricksFileSystem, workspace as databricksWorkspace } from "@dbx-tools/databricks";
23
- import { error, log, object, string, token } from "@dbx-tools/shared-core";
22
+ import { DatabricksFileSystem, workspaceClient } from "@dbx-tools/databricks";
23
+ import { errorUtils, log, object, stringUtils, token } from "@dbx-tools/shared-core";
24
24
  import { CompositeFilesystem, Workspace, } from "@mastra/core/workspace";
25
25
  import { MASTRA_SCOPES_KEY, MASTRA_USER_EMAIL_KEY, MASTRA_USER_KEY } from "./config.js";
26
26
  import { scratchFilesystem, filesystems } from "./filesystems.js";
@@ -260,7 +260,7 @@ async function resolveSkillFolderFilesystem(name, folder, context, client) {
260
260
  });
261
261
  return undefined;
262
262
  }
263
- const root = string.trimToNull(await resolveSkillFolderValue(folder.path, context));
263
+ const root = stringUtils.trimToNull(await resolveSkillFolderValue(folder.path, context));
264
264
  if (!root)
265
265
  return undefined;
266
266
  return databricksFilesystem(client, root, folder.writable !== true);
@@ -279,10 +279,10 @@ function resolveWorkspaceIdentity(options) {
279
279
  let id = options.id;
280
280
  let name = options.name;
281
281
  if (!id) {
282
- id = name ? string.toSlug(name) : "workspace";
282
+ id = name ? stringUtils.toSlug(name) : "workspace";
283
283
  }
284
284
  if (!name) {
285
- name = Array.from(string.tokenize(id)).join(" ");
285
+ name = Array.from(stringUtils.tokenize(id)).join(" ");
286
286
  }
287
287
  return { id, name };
288
288
  }
@@ -316,7 +316,7 @@ function shouldMountSkillFolders(requestContext) {
316
316
  }
317
317
  /** Read the trimmed OBO user email stamped on {@link MASTRA_USER_EMAIL_KEY}. */
318
318
  function resolveScopedEmail(requestContext) {
319
- return string.trimToNull(requestContext?.get(MASTRA_USER_EMAIL_KEY)) ?? undefined;
319
+ return stringUtils.trimToNull(requestContext?.get(MASTRA_USER_EMAIL_KEY)) ?? undefined;
320
320
  }
321
321
  /**
322
322
  * Wrap a {@link DatabricksFileSystem} as a Mastra filesystem. When the root is
@@ -325,7 +325,7 @@ function resolveScopedEmail(requestContext) {
325
325
  */
326
326
  async function databricksFilesystem(client, root, readOnly = true) {
327
327
  const fs = new DatabricksFileSystem({
328
- client: databricksWorkspace.toLegacyWorkspaceClient(client),
328
+ client: workspaceClient.toLegacyWorkspaceClient(client),
329
329
  root,
330
330
  readOnly,
331
331
  createRoot: !readOnly,
@@ -340,7 +340,7 @@ async function databricksFilesystem(client, root, readOnly = true) {
340
340
  logger.debug("databricks-mount:scratch-fallback", {
341
341
  root,
342
342
  readOnly,
343
- error: error.errorMessage(err),
343
+ error: errorUtils.errorMessage(err),
344
344
  });
345
345
  }
346
346
  return scratchFilesystem();
@@ -400,4 +400,4 @@ function buildWorkspaceSkillsResolver(resolvers, extraSkillPaths = []) {
400
400
  return merged;
401
401
  };
402
402
  }
403
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3Jrc3BhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxTQUFTLElBQUksbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvRixPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTNFLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsU0FBUyxHQU1WLE1BQU0sd0JBQXdCLENBQUM7QUFFaEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHFCQUFxQixFQUFFLGVBQWUsRUFBYSxNQUFNLGFBQWEsQ0FBQztBQUNuRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxpQkFBaUIsRUFBMEMsTUFBTSxjQUFjLENBQUM7QUFDekYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFekYsNkVBQTZFO0FBRTdFLCtEQUErRDtBQUMvRCxNQUFNLHFCQUFxQixHQUFHLENBQUMsV0FBVyxFQUFFLHFCQUFxQixFQUFFLFVBQVUsQ0FBVSxDQUFDO0FBRXhGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQWdIL0MsOEVBQThFO0FBRTlFOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxD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LGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDakUsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWFzdHJhIHdvcmtzcGFjZSBmYWN0b3J5IGZvciBEYXRhYnJpY2tzIEFwcHMuXG4gKlxuICogQnVpbGRzIGEgcGVyLXJlcXVlc3Qge0BsaW5rIFdvcmtzcGFjZX0gd2l0aCBEYXRhYnJpY2tzIFNhbmRib3ggY29tbWFuZFxuICogZXhlY3V0aW9uIHBsdXMgYSB7QGxpbmsgQ29tcG9zaXRlRmlsZXN5c3RlbX0gb3ZlciB0aGUgTkFNRUQgc2tpbGwgZm9sZGVyc1xuICogcmVzb2x2ZWQgZm9yIHRoYXQgcmVxdWVzdC4gQSBza2lsbCBmb2xkZXIgbWFwcyBhIG5hbWUgdG8gYSBsb2NhdGlvbiBwbHVzIGl0c1xuICogcmVhZGFibGUgLyB3cml0YWJsZSBwb2xpY3k6IGEgRGF0YWJyaWNrcyBwYXRoIG1vdW50ZWQgdGhyb3VnaCB0aGUgT0JPIGNsaWVudFxuICogb24ge0BsaW5rIE1BU1RSQV9VU0VSX0tFWX0sIG9yIGFueSB7QGxpbmsgV29ya3NwYWNlRmlsZXN5c3RlbX0gYSBjb25zdW1pbmdcbiAqIGxpYnJhcnkgYWxyZWFkeSBvd25zLiB7QGxpbmsgREVGQVVMVF9TS0lMTF9GT0xERVJTfSBzdXBwbGllcyB0aGUgQXNzaXN0YW50XG4gKiB0cmVlcywgYW5kIGBza2lsbEZvbGRlcnNgIG1lcmdlcyBvdmVyIGl0IC0gc2FtZSBuYW1lIG92ZXJyaWRlcywgYGZhbHNlYFxuICogZGlzYWJsZXMsIGEgbmV3IG5hbWUgYWRkcy4gT3B0aW9uYWwgbW91bnQgcmVzb2x2ZXJzIGNvbnRyaWJ1dGUgZnVydGhlclxuICogZmlsZXN5c3RlbXMgYW5kIHNraWxsIHNjYW4gcm9vdHMgb24gdG9wLlxuICpcbiAqIERhdGFicmlja3MgbW91bnRzIHVzZSBgQGRieC10b29scy9kYXRhYnJpY2tzYCB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW19XG4gKiB3cmFwcGVkIGJ5IHtAbGluayBmaWxlc3lzdGVtc307IG1pc3Npbmcgcm9vdHMgZmFsbCBiYWNrIHRvXG4gKiB7QGxpbmsgc2NyYXRjaEZpbGVzeXN0ZW19LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uRXJyb3IsIGNyZWF0ZVdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0sIHdvcmtzcGFjZSBhcyBkYXRhYnJpY2tzV29ya3NwYWNlIH0gZnJvbSBcIkBkYngtdG9vbHMvZGF0YWJyaWNrc1wiO1xuaW1wb3J0IHsgZXJyb3IsIGxvZywgb2JqZWN0LCBzdHJpbmcsIHRva2VuIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHtcbiAgQ29tcG9zaXRlRmlsZXN5c3RlbSxcbiAgV29ya3NwYWNlLFxuICB0eXBlIFNraWxsc0NvbnRleHQsXG4gIHR5cGUgU2tpbGxzUmVzb2x2ZXIsXG4gIHR5cGUgV29ya3NwYWNlRmlsZXN5c3RlbSxcbiAgdHlwZSBXb3Jrc3BhY2VTYW5kYm94LFxuICB0eXBlIFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlcixcbn0gZnJvbSBcIkBtYXN0cmEvY29yZS93b3Jrc3BhY2VcIjtcblxuaW1wb3J0IHsgTUFTVFJBX1NDT1BFU19LRVksIE1BU1RSQV9VU0VSX0VNQUlMX0tFWSwgTUFTVFJBX1VTRVJfS0VZLCB0eXBlIFVzZXIgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IHNjcmF0Y2hGaWxlc3lzdGVtLCBmaWxlc3lzdGVtcyB9IGZyb20gXCIuL2ZpbGVzeXN0ZW1zLnRzXCI7XG5pbXBvcnQgeyBNb250eVNhbmRib3ggfSBmcm9tIFwiLi9tb250eS1zYW5kYm94LnRzXCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzU2FuZGJveCwgdHlwZSBEYXRhYnJpY2tzV29ya3NwYWNlU2FuZGJveE9wdGlvbnMgfSBmcm9tIFwiLi9zYW5kYm94LnRzXCI7XG5pbXBvcnQgeyBBU1NJU1RBTlRfU0hBUkVEX1NLSUxMU19QQVRILCB1c2VyQXNzaXN0YW50U2tpbGxzUGF0aCB9IGZyb20gXCIuL3NraWxsLXBhdGhzLnRzXCI7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBPQXV0aCBzY29wZXMgdGhhdCBnYXRlIERhdGFicmlja3Mgd29ya3NwYWNlIGZpbGUgbW91bnRzLiAqL1xuY29uc3QgV09SS1NQQUNFX0ZJTEVfU0NPUEVTID0gW1wid29ya3NwYWNlXCIsIFwid29ya3NwYWNlLndvcmtzcGFjZVwiLCBcImFsbC1hcGlzXCJdIGFzIGNvbnN0O1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL3dvcmtzcGFjZXNcIik7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBQZXItcmVxdWVzdCBjb250ZXh0IGZvciBtb3VudCBhbmQgc2tpbGwtZm9sZGVyIHJlc29sdmVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya3NwYWNlTW91bnRDb250ZXh0IHtcbiAgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dDtcbn1cblxuLyoqXG4gKiBBIHNraWxsLWZvbGRlciBmaWVsZCBnaXZlbiBlaXRoZXIgZGlyZWN0bHkgb3IgYXMgYSBwZXItcmVxdWVzdCByZXNvbHZlci5cbiAqIEEgcmVzb2x2ZXIgcmV0dXJuaW5nIGB1bmRlZmluZWRgIHNraXBzIHRoZSBmb2xkZXIgZm9yIHRoYXQgcmVxdWVzdC5cbiAqL1xuZXhwb3J0IHR5cGUgU2tpbGxGb2xkZXJWYWx1ZTxUPiA9XG4gIFQgfCAoKGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCkgPT4gVCB8IHVuZGVmaW5lZCB8IFByb21pc2U8VCB8IHVuZGVmaW5lZD4pO1xuXG4vKipcbiAqIE9uZSBuYW1lZCBza2lsbC1mb2xkZXIgbG9jYXRpb24gYW5kIGl0cyByZWFkIC8gd3JpdGUgcG9saWN5LlxuICpcbiAqIEdpdmUge0BsaW5rIHBhdGh9IGZvciBhIERhdGFicmlja3Mgd29ya3NwYWNlIHRyZWUgKG1vdW50ZWQgdGhyb3VnaCB0aGVcbiAqIHJlcXVlc3QncyBPQk8gY2xpZW50KSwgb3Ige0BsaW5rIGZpbGVzeXN0ZW19IGZvciBhIG1vdW50IHRoZSBjb25zdW1lciBidWlsZHNcbiAqIGl0c2VsZi4ge0BsaW5rIGZpbGVzeXN0ZW19IHdpbnMgd2hlbiBib3RoIGFyZSBzZXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2tpbGxGb2xkZXJPcHRpb25zIHtcbiAgLyoqIEFic29sdXRlIERhdGFicmlja3Mgd29ya3NwYWNlIHBhdGggZm9yIHRoaXMgZm9sZGVyLiAqL1xuICBwYXRoPzogU2tpbGxGb2xkZXJWYWx1ZTxzdHJpbmc+O1xuICAvKiogUmVhZHktbWFkZSBtb3VudCwgZm9yIGxvY2F0aW9ucyB0aGUgT0JPIGNsaWVudCBjYW5ub3QgcmVhY2guICovXG4gIGZpbGVzeXN0ZW0/OiBTa2lsbEZvbGRlclZhbHVlPFdvcmtzcGFjZUZpbGVzeXN0ZW0+O1xuICAvKipcbiAgICogU2NhbiB0aGlzIG1vdW50IGZvciBgU0tJTEwubWRgIGZpbGVzLiBEZWZhdWx0cyB0byBgdHJ1ZWA7IGBmYWxzZWAgbW91bnRzXG4gICAqIHRoZSBsb2NhdGlvbiBmb3IgZmlsZSB0b29scyB3aXRob3V0IGFkZGluZyBpdCB0byBza2lsbCBkaXNjb3ZlcnkuXG4gICAqL1xuICByZWFkYWJsZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbGxvdyB3cml0ZXMgdG8gYSB7QGxpbmsgcGF0aH0gbW91bnQgKGFuZCBjcmVhdGUgdGhlIHJvb3Qgd2hlbiBtaXNzaW5nKS5cbiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC4gQSBzdXBwbGllZCB7QGxpbmsgZmlsZXN5c3RlbX0gY2FycmllcyBpdHMgb3duXG4gICAqIHJlYWQtb25seSBmbGFnIGluc3RlYWQuXG4gICAqL1xuICB3cml0YWJsZT86IGJvb2xlYW47XG4gIC8qKiBNb3VudCBwb2ludCBpbiB0aGUgY29tcG9zaXRlIG5hbWVzcGFjZS4gRGVmYXVsdHMgdG8gYC88bmFtZT5gLiAqL1xuICBtb3VudD86IHN0cmluZztcbn1cblxuLyoqIE1vdW50IG1hcCBwbHVzIG9wdGlvbmFsIE1hc3RyYSBza2lsbCBzY2FuIHJvb3RzIGZvciBvbmUgcmVzb2x2ZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uIHtcbiAgbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBXb3Jrc3BhY2VGaWxlc3lzdGVtPjtcbiAgLyoqIFBhdGhzIHdpdGhpbiB0aGUgY29tcG9zaXRlIG5hbWVzcGFjZSB3aGVyZSBgU0tJTEwubWRgIGZpbGVzIGFyZSBzY2FubmVkLiAqL1xuICBza2lsbFBhdGhzPzogc3RyaW5nW107XG59XG5cbi8qKiBDb250cmlidXRlcyBmaWxlc3lzdGVtIG1vdW50cyAoYW5kIG9wdGlvbmFsIHNraWxsIHBhdGhzKSBmb3Igb25lIHJlcXVlc3QuICovXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VNb3VudFJlc29sdmVyID0gKFxuICBjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQsXG4pID0+IFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uIHwgUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj47XG5cbi8qKiBOYW1lcyBjYXJyaWVkIGJ5IHtAbGluayBERUZBVUxUX1NLSUxMX0ZPTERFUlN9LiAqL1xuZXhwb3J0IHR5cGUgRGVmYXVsdFNraWxsRm9sZGVyTmFtZSA9IFwid29ya3NwYWNlLXRlYW1cIiB8IFwid29ya3NwYWNlLXRlYW0tYXBwXCI7XG5cbi8qKlxuICogU2FuZGJveCBzZWxlY3Rpb24gZm9yIHtAbGluayBjcmVhdGVXb3Jrc3BhY2V9LiBEYXRhYnJpY2tzIGlzIHRoZSBkZWZhdWx0O1xuICogYGZhbHNlYCBkaXNhYmxlcyBjb21tYW5kIGV4ZWN1dGlvbiwgYW5kIGEgTWFzdHJhIHByb3ZpZGVyIG9yIHJlc29sdmVyIGlzIGFuXG4gKiBleHBsaWNpdCByZXBsYWNlbWVudC5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbiA9XG4gIHwgZmFsc2VcbiAgfCBcImRhdGFicmlja3NcIlxuICB8IFwibW9udHlcIlxuICB8IERhdGFicmlja3NXb3Jrc3BhY2VTYW5kYm94T3B0aW9uc1xuICB8IFdvcmtzcGFjZVNhbmRib3hcbiAgfCBXb3Jrc3BhY2VTYW5kYm94UmVzb2x2ZXI7XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgY3JlYXRlV29ya3NwYWNlfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlV29ya3NwYWNlT3B0aW9ucyB7XG4gIC8qKiBXb3Jrc3BhY2UgaWQ7IGRlcml2ZWQgZnJvbSBgbmFtZWAgb3IgYFwid29ya3NwYWNlXCJgIHdoZW4gb21pdHRlZC4gKi9cbiAgaWQ/OiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IG5hbWU7IGRlcml2ZWQgZnJvbSBgaWRgIHdoZW4gb21pdHRlZC4gKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFN0YXJ0IGZyb20ge0BsaW5rIERFRkFVTFRfU0tJTExfRk9MREVSU30uIERlZmF1bHRzIHRvIGB0cnVlYDsgYGZhbHNlYFxuICAgKiBzdGFydHMgZnJvbSBhbiBlbXB0eSBtYXAsIGxlYXZpbmcgb25seSB0aGUge0BsaW5rIHNraWxsRm9sZGVyc30gZ2l2ZW4gaGVyZS5cbiAgICovXG4gIGFzc2lzdGFudFNraWxscz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBOYW1lZCBza2lsbCBmb2xkZXJzIG1lcmdlZCBvdmVyIHtAbGluayBERUZBVUxUX1NLSUxMX0ZPTERFUlN9OiBhIG1hdGNoaW5nXG4gICAqIG5hbWUgb3ZlcnJpZGVzIHRoYXQgZGVmYXVsdCwgYGZhbHNlYCBkaXNhYmxlcyBpdCwgYW5kIGFueSBvdGhlciBuYW1lIGFkZHNcbiAgICogYSBmb2xkZXIuXG4gICAqL1xuICBza2lsbEZvbGRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBTa2lsbEZvbGRlck9wdGlvbnMgfCBmYWxzZT47XG4gIC8qKiBFeHRyYSBwZXItcmVxdWVzdCBtb3VudCByZXNvbHZlcnMgKHJ1biBhZnRlciB0aGUgc2tpbGwtZm9sZGVyIG1vdW50cykuICovXG4gIG1vdW50cz86IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXTtcbiAgLyoqIFJlcGxhY2UgdGhlIGF1dG8tYnVpbHQgZHluYW1pYyBza2lsbHMgcmVzb2x2ZXIuICovXG4gIHNraWxscz86IFNraWxsc1Jlc29sdmVyO1xuICAvKiogRm9yd2FyZGVkIHRvIE1hc3RyYSB3aGVuIHNraWxsIGRpc2NvdmVyeSBpcyBlbmFibGVkLiAqL1xuICBjaGVja1NraWxsRmlsZU10aW1lPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBCTTI1IGtleXdvcmQgc2VhcmNoIG92ZXIgaW5kZXhlZCB3b3Jrc3BhY2UgY29udGVudC4gKi9cbiAgYm0yNT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDb21tYW5kIHNhbmRib3guIERlZmF1bHRzIHRvIERhdGFicmlja3MgU2FuZGJveC4gUGFzcyBgZmFsc2VgIHRvIGRpc2FibGVcbiAgICogY29tbWFuZCBleGVjdXRpb24sIG9yIGFuIGV4cGxpY2l0IE1hc3RyYSBzYW5kYm94L3Byb3ZpZGVyIHJlc29sdmVyIHRvXG4gICAqIHJlcGxhY2UgRGF0YWJyaWNrcyBmb3IgdGhpcyB3b3Jrc3BhY2UuXG4gICAqL1xuICBzYW5kYm94PzogV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbjtcbiAgLyoqXG4gICAqIEV4dHJhIExPQ0FMIHNraWxsIHNjYW4gcGF0aHMgYWRkZWQgdG8gZXZlcnkgcmVxdWVzdCdzIHNraWxsIGRpc2NvdmVyeS5cbiAgICogVXNlZCBieSB0aGUgcGx1Z2luIHRvIHN1cmZhY2UgcmVtb3RlIHNraWxscyBwcm92aXNpb25lZCB0byBhIGxvY2FsIHRlbXBcbiAgICogZGlyIGF0IHN0YXJ0dXAgKHNlZSBgcmVtb3RlLXNraWxscy50c2ApLiBEYXRhYnJpY2tzLWhvc3RlZCByZW1vdGUgc2tpbGxzXG4gICAqIG5lZWQgbm8gZW50cnkgaGVyZSAtIHRoZXkgbGFuZCBpbiB0aGUgQXNzaXN0YW50IHRyZWUgdGhlIGJ1aWx0LWluIG1vdW50XG4gICAqIGFscmVhZHkgc2NhbnMuXG4gICAqL1xuICBleHRyYVNraWxsUGF0aHM/OiBzdHJpbmdbXTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkZWZhdWx0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogVGhlIHNraWxsIGZvbGRlcnMgZXZlcnkgd29ya3NwYWNlIHN0YXJ0cyB3aXRoLlxuICpcbiAqIC0gYHdvcmtzcGFjZS10ZWFtYCAtIHRoZSBzaGFyZWQgd29ya3NwYWNlIEFzc2lzdGFudCB0cmVlLCByZWFkLW9ubHkgYmVjYXVzZVxuICogICB3cml0aW5nIGl0IGlzIGEgd29ya3NwYWNlLWFkbWluIGFjdGlvbi5cbiAqIC0gYHdvcmtzcGFjZS10ZWFtLWFwcGAgLSB0aGUgcmVxdWVzdGluZyB1c2VyJ3Mgb3duIEFzc2lzdGFudCB0cmVlLCB3cml0YWJsZVxuICogICBzbyB0aGUgYXBwIGNhbiBzYXZlIHNraWxscyBiYWNrIHRvIGl0LiBTa2lwcGVkIHdoZW4gdGhlIHJlcXVlc3QgY2FycmllcyBub1xuICogICB1c2VyIGVtYWlsLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9TS0lMTF9GT0xERVJTOiBSZWFkb25seTxSZWNvcmQ8RGVmYXVsdFNraWxsRm9sZGVyTmFtZSwgU2tpbGxGb2xkZXJPcHRpb25zPj4gPSB7XG4gIFwid29ya3NwYWNlLXRlYW1cIjoge1xuICAgIHBhdGg6IEFTU0lTVEFOVF9TSEFSRURfU0tJTExTX1BBVEgsXG4gICAgcmVhZGFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICB9LFxuICBcIndvcmtzcGFjZS10ZWFtLWFwcFwiOiB7XG4gICAgcGF0aDogKHsgcmVxdWVzdENvbnRleHQgfSkgPT4ge1xuICAgICAgY29uc3QgZW1haWwgPSByZXNvbHZlU2NvcGVkRW1haWwocmVxdWVzdENvbnRleHQpO1xuICAgICAgcmV0dXJuIGVtYWlsID8gdXNlckFzc2lzdGFudFNraWxsc1BhdGgoZW1haWwpIDogdW5kZWZpbmVkO1xuICAgIH0sXG4gICAgcmVhZGFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gIH0sXG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfSB3aXRoIHBlci1yZXF1ZXN0IERhdGFicmlja3MgbW91bnRzLlxuICpcbiAqIEBleGFtcGxlIERlZmF1bHQgc2tpbGwgZm9sZGVycyBvbmx5XG4gKiBgYGB0c1xuICogY3JlYXRlV29ya3NwYWNlKClcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIE92ZXJyaWRlIGEgZGVmYXVsdCwgZHJvcCBhbm90aGVyLCBhbmQgYWRkIGEgbG9jYXRpb24gb2YgeW91ciBvd25cbiAqIGBgYHRzXG4gKiBjcmVhdGVXb3Jrc3BhY2Uoe1xuICogICBza2lsbEZvbGRlcnM6IHtcbiAqICAgICBcIndvcmtzcGFjZS10ZWFtXCI6IHsgcGF0aDogXCIvV29ya3NwYWNlL1NoYXJlZC90ZWFtLXNraWxsc1wiIH0sXG4gKiAgICAgXCJ3b3Jrc3BhY2UtdGVhbS1hcHBcIjogZmFsc2UsXG4gKiAgICAgcnVuYm9va3M6IHsgcGF0aDogXCIvV29ya3NwYWNlL1NoYXJlZC9ydW5ib29rcy9za2lsbHNcIiwgd3JpdGFibGU6IHRydWUgfSxcbiAqICAgICB2b2x1bWU6IHsgZmlsZXN5c3RlbTogbXlWb2x1bWVGaWxlc3lzdGVtIH0sXG4gKiAgIH0sXG4gKiB9KVxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgU2tpbGwgZm9sZGVycyBwbHVzIGEgY3VzdG9tIG1vdW50IHJlc29sdmVyXG4gKiBgYGB0c1xuICogY3JlYXRlV29ya3NwYWNlKHtcbiAqICAgbW91bnRzOiBbXG4gKiAgICAgYXN5bmMgKHsgcmVxdWVzdENvbnRleHQgfSkgPT4gKHtcbiAqICAgICAgIG1vdW50czogeyBcIi9kYXRhXCI6IG15RmlsZXN5c3RlbSB9LFxuICogICAgICAgc2tpbGxQYXRoczogW10sXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXb3Jrc3BhY2Uob3B0aW9uczogQ3JlYXRlV29ya3NwYWNlT3B0aW9ucyA9IHt9KTogV29ya3NwYWNlIHtcbiAgY29uc3QgeyBpZCwgbmFtZSB9ID0gcmVzb2x2ZVdvcmtzcGFjZUlkZW50aXR5KG9wdGlvbnMpO1xuICBjb25zdCBza2lsbEZvbGRlcnMgPSByZXNvbHZlU2tpbGxGb2xkZXJzKG9wdGlvbnMpO1xuICBjb25zdCBmb2xkZXJOYW1lcyA9IE9iamVjdC5rZXlzKHNraWxsRm9sZGVycyk7XG4gIGNvbnN0IHJlc29sdmVycyA9IGJ1aWxkTW91bnRSZXNvbHZlcnMoc2tpbGxGb2xkZXJzLCBvcHRpb25zLm1vdW50cyk7XG4gIGNvbnN0IGV4dHJhU2tpbGxQYXRocyA9IG9wdGlvbnMuZXh0cmFTa2lsbFBhdGhzID8/IFtdO1xuICBjb25zdCBza2lsbHMgPVxuICAgIG9wdGlvbnMuc2tpbGxzID8/XG4gICAgKHJlc29sdmVycy5sZW5ndGggPiAwIHx8IGV4dHJhU2tpbGxQYXRocy5sZW5ndGggPiAwXG4gICAgICA/IGJ1aWxkV29ya3NwYWNlU2tpbGxzUmVzb2x2ZXIocmVzb2x2ZXJzLCBleHRyYVNraWxsUGF0aHMpXG4gICAgICA6IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNoZWNrU2tpbGxGaWxlTXRpbWUgPSBvcHRpb25zLmNoZWNrU2tpbGxGaWxlTXRpbWUgPz8gZm9sZGVyTmFtZXMubGVuZ3RoID4gMDtcbiAgY29uc3QgYm0yNSA9IG9wdGlvbnMuYm0yNSAhPT0gZmFsc2U7XG4gIGNvbnN0IHNhbmRib3ggPSByZXNvbHZlV29ya3NwYWNlU2FuZGJveChvcHRpb25zLnNhbmRib3gsIGlkLCBuYW1lKTtcbiAgbG9nZ2VyLmRlYnVnKFwid29ya3NwYWNlOmNyZWF0ZVwiLCB7XG4gICAgaWQsXG4gICAgbmFtZSxcbiAgICByZXNvbHZlckNvdW50OiByZXNvbHZlcnMubGVuZ3RoLFxuICAgIHNraWxsRm9sZGVyczogZm9sZGVyTmFtZXMsXG4gICAgY3VzdG9tTW91bnRSZXNvbHZlcnM6IG9wdGlvbnMubW91bnRzPy5sZW5ndGggPz8gMCxcbiAgICBjdXN0b21Ta2lsbHNSZXNvbHZlcjogQm9vbGVhbihvcHRpb25zLnNraWxscyksXG4gICAgY2hlY2tTa2lsbEZpbGVNdGltZSxcbiAgICBibTI1LFxuICAgIGV4dHJhU2tpbGxQYXRoczogZXh0cmFTa2lsbFBhdGhzLmxlbmd0aCxcbiAgICBzYW5kYm94OiBzYW5kYm94ID8gc2FuZGJveE5hbWUob3B0aW9ucy5zYW5kYm94KSA6IFwiZGlzYWJsZWRcIixcbiAgfSk7XG5cbiAgcmV0dXJuIG5ldyBXb3Jrc3BhY2Uoe1xuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgZmlsZXN5c3RlbTogKGNvbnRleHQpID0+IHJlc29sdmVXb3Jrc3BhY2VGaWxlc3lzdGVtKHJlc29sdmVycywgY29udGV4dCksXG4gICAgLi4uKHNraWxsc1xuICAgICAgPyB7XG4gICAgICAgICAgc2tpbGxzLFxuICAgICAgICAgIGNoZWNrU2tpbGxGaWxlTXRpbWUsXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICAgIC4uLihzYW5kYm94XG4gICAgICA/IHtcbiAgICAgICAgICBzYW5kYm94LFxuICAgICAgICAgIGluc3RydWN0aW9uczogeyBkeW5hbWljU2FuZGJveDogXCJyZXNvbHZlXCIgYXMgY29uc3QgfSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgYm0yNSxcbiAgfSk7XG59XG5cbi8qKlxuICogTWVyZ2UgdGhlIGNvbmZpZ3VyZWQgc2tpbGwgZm9sZGVycyBvdmVyIHtAbGluayBERUZBVUxUX1NLSUxMX0ZPTERFUlN9LlxuICpcbiAqIGBhc3Npc3RhbnRTa2lsbHM6IGZhbHNlYCBkcm9wcyB0aGUgZGVmYXVsdHMsIGFuZCBhIGBmYWxzZWAgdmFsdWUgcmVtb3ZlcyBvbmVcbiAqIGVudHJ5IGJ5IG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU2tpbGxGb2xkZXJzKFxuICBvcHRpb25zOiBQaWNrPENyZWF0ZVdvcmtzcGFjZU9wdGlvbnMsIFwiYXNzaXN0YW50U2tpbGxzXCIgfCBcInNraWxsRm9sZGVyc1wiPiA9IHt9LFxuKTogUmVjb3JkPHN0cmluZywgU2tpbGxGb2xkZXJPcHRpb25zPiB7XG4gIGNvbnN0IG1lcmdlZDogUmVjb3JkPHN0cmluZywgU2tpbGxGb2xkZXJPcHRpb25zPiA9XG4gICAgb3B0aW9ucy5hc3Npc3RhbnRTa2lsbHMgPT09IGZhbHNlID8ge30gOiB7IC4uLkRFRkFVTFRfU0tJTExfRk9MREVSUyB9O1xuICBmb3IgKGNvbnN0IFtuYW1lLCBmb2xkZXJdIG9mIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuc2tpbGxGb2xkZXJzID8/IHt9KSkge1xuICAgIGlmIChmb2xkZXIgPT09IGZhbHNlKSB7XG4gICAgICBkZWxldGUgbWVyZ2VkW25hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZXJnZWRbbmFtZV0gPSBmb2xkZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiBtZXJnZWQ7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHJpdmF0ZSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuZnVuY3Rpb24gcmVzb2x2ZVdvcmtzcGFjZVNhbmRib3goXG4gIHNlbGVjdGlvbjogV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbiB8IHVuZGVmaW5lZCxcbiAgd29ya3NwYWNlSWQ6IHN0cmluZyxcbiAgd29ya3NwYWNlTmFtZTogc3RyaW5nLFxuKTogV29ya3NwYWNlU2FuZGJveCB8IFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBzZWxlY3Rpb24gPz8gXCJkYXRhYnJpY2tzXCI7XG4gIGlmIChjb25maWd1cmVkID09PSBmYWxzZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGNvbmZpZ3VyZWQgPT09IFwibW9udHlcIikgcmV0dXJuIG5ldyBNb250eVNhbmRib3goKTtcbiAgaWYgKHR5cGVvZiBjb25maWd1cmVkID09PSBcImZ1bmN0aW9uXCIgfHwgaXNTYW5kYm94KGNvbmZpZ3VyZWQpKSByZXR1cm4gY29uZmlndXJlZDtcblxuICBjb25zdCBvcHRpb25zOiBEYXRhYnJpY2tzV29ya3NwYWNlU2FuZGJveE9wdGlvbnMgPVxuICAgIGNvbmZpZ3VyZWQgPT09IFwiZGF0YWJyaWNrc1wiID8geyBwcm92aWRlcjogXCJkYXRhYnJpY2tzXCIgfSA6IGNvbmZpZ3VyZWQ7XG4gIHJldHVybiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PiB7XG4gICAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9LRVkpIGFzIFVzZXIgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgICAgXCJEYXRhYnJpY2tzIHNhbmRib3ggdXNlciBjb250ZXh0XCIsXG4gICAgICAgIFwiSW52b2tlIGNvbW1hbmQgdG9vbHMgZnJvbSBhbiBhZ2VudCB0dXJuIHNlcnZlZCBieSB0aGUgTWFzdHJhIHBsdWdpbi5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZ3VyZWRJZCA9XG4gICAgICB0eXBlb2Ygb3B0aW9ucy5zYW5kYm94SWQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IG9wdGlvbnMuc2FuZGJveElkKHsgcmVxdWVzdENvbnRleHQgfSlcbiAgICAgICAgOiBvcHRpb25zLnNhbmRib3hJZDtcbiAgICBjb25zdCBzYW5kYm94SWQgPSBjb25maWd1cmVkSWQgPz8gZGVmYXVsdFNhbmRib3hJZCh3b3Jrc3BhY2VJZCwgdXNlci5pZCk7XG4gICAgY29uc3QgY2xpZW50ID1cbiAgICAgIHR5cGVvZiBvcHRpb25zLmNsaWVudCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gb3B0aW9ucy5jbGllbnQoeyByZXF1ZXN0Q29udGV4dCB9KVxuICAgICAgICA6IChvcHRpb25zLmNsaWVudCA/PyBjcmVhdGVXb3Jrc3BhY2VDbGllbnQoKSk7XG4gICAgY29uc3Qge1xuICAgICAgcHJvdmlkZXI6IF9wcm92aWRlcixcbiAgICAgIHNhbmRib3hJZDogX3NhbmRib3hJZCxcbiAgICAgIGNsaWVudDogX2NsaWVudCxcbiAgICAgIC4uLnNhbmRib3hPcHRpb25zXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgcmV0dXJuIG5ldyBEYXRhYnJpY2tzU2FuZGJveCh7XG4gICAgICAuLi5zYW5kYm94T3B0aW9ucyxcbiAgICAgIGNsaWVudCxcbiAgICAgIHNhbmRib3hJZCxcbiAgICAgIGRpc3BsYXlOYW1lOiBvcHRpb25zLmRpc3BsYXlOYW1lID8/IGBNYXN0cmEgJHt3b3Jrc3BhY2VOYW1lfWAsXG4gICAgfSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRTYW5kYm94SWQod29ya3NwYWNlSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBkaWdlc3QgPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgLnVwZGF0ZShvYmplY3QudG9TdGFibGVLZXkoeyB3b3Jrc3BhY2VJZCwgdXNlcklkIH0pKVxuICAgIC5kaWdlc3QoXCJoZXhcIilcbiAgICAuc2xpY2UoMCwgMzIpO1xuICByZXR1cm4gYG1hc3RyYS0ke2RpZ2VzdH1gO1xufVxuXG5mdW5jdGlvbiBpc1NhbmRib3godmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3Jrc3BhY2VTYW5kYm94IHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIFwiaWRcIiBpbiB2YWx1ZSAmJiBcInByb3ZpZGVyXCIgaW4gdmFsdWUgJiYgXCJzdGF0dXNcIiBpbiB2YWx1ZSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gc2FuZGJveE5hbWUoc2VsZWN0aW9uOiBXb3Jrc3BhY2VTYW5kYm94U2VsZWN0aW9uIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKHNlbGVjdGlvbiA9PT0gdW5kZWZpbmVkIHx8IHNlbGVjdGlvbiA9PT0gXCJkYXRhYnJpY2tzXCIpIHJldHVybiBcImRhdGFicmlja3NcIjtcbiAgaWYgKHNlbGVjdGlvbiA9PT0gXCJtb250eVwiKSByZXR1cm4gXCJtb250eVwiO1xuICBpZiAoc2VsZWN0aW9uID09PSBmYWxzZSkgcmV0dXJuIFwiZGlzYWJsZWRcIjtcbiAgaWYgKHR5cGVvZiBzZWxlY3Rpb24gPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFwicmVzb2x2ZXJcIjtcbiAgcmV0dXJuIGlzU2FuZGJveChzZWxlY3Rpb24pID8gc2VsZWN0aW9uLnByb3ZpZGVyIDogKHNlbGVjdGlvbi5wcm92aWRlciA/PyBcImRhdGFicmlja3NcIik7XG59XG5cbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgdGhlIHJlcXVlc3QgdG9rZW4gY2FycmllcyBhIHNjb3BlIHRoYXQgYWxsb3dzIHdvcmtzcGFjZVxuICogZmlsZSBBUEkgYWNjZXNzIChgd29ya3NwYWNlYCBvciBgYWxsLWFwaXNgIG9uIHtAbGluayBNQVNUUkFfU0NPUEVTX0tFWX0pLlxuICovXG5mdW5jdGlvbiBoYXNXb3Jrc3BhY2VGaWxlU2NvcGUocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0IHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b2tlbi5pbmNsdWRlc0FjY2Vzc1Rva2VuU2NvcGUoXG4gICAgcmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfU0NPUEVTX0tFWSksXG4gICAgV09SS1NQQUNFX0ZJTEVfU0NPUEVTLFxuICApO1xufVxuXG4vKipcbiAqIE1vdW50IHJlc29sdmVyIGZvciB0aGUgbmFtZWQgc2tpbGwgZm9sZGVycy5cbiAqXG4gKiBHYXRlcyBvbiB3b3Jrc3BhY2UgZmlsZSBzY29wZSAob3IgZGV2ZWxvcG1lbnQgbW9kZSksIHRoZW4gbW91bnRzIGV2ZXJ5XG4gKiBmb2xkZXIgd2hvc2UgbG9jYXRpb24gcmVzb2x2ZXMgZm9yIHRoaXMgcmVxdWVzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVNraWxsRm9sZGVyTW91bnRzKFxuICBza2lsbEZvbGRlcnM6IFJlY29yZDxzdHJpbmcsIFNraWxsRm9sZGVyT3B0aW9ucz4sXG4gIGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCxcbik6IFByb21pc2U8V29ya3NwYWNlTW91bnRDb250cmlidXRpb24+IHtcbiAgY29uc3QgbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBXb3Jrc3BhY2VGaWxlc3lzdGVtPiA9IHt9O1xuICBjb25zdCBza2lsbFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IGNvbnRleHQucmVxdWVzdENvbnRleHQ7XG5cbiAgaWYgKCFyZXF1ZXN0Q29udGV4dCB8fCAhc2hvdWxkTW91bnRTa2lsbEZvbGRlcnMocmVxdWVzdENvbnRleHQpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwic2tpbGwtZm9sZGVyczpza2lwcGVkXCIsIHtcbiAgICAgIHJlYXNvbjogIXJlcXVlc3RDb250ZXh0ID8gXCJuby1yZXF1ZXN0LWNvbnRleHRcIiA6IFwibWlzc2luZy13b3Jrc3BhY2Utc2NvcGVcIixcbiAgICAgIG5vZGVFbnY6IHByb2Nlc3MuZW52Lk5PREVfRU5WLFxuICAgICAgc2NvcGVzOiByZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9TQ09QRVNfS0VZKSxcbiAgICB9KTtcbiAgICByZXR1cm4geyBtb3VudHMsIHNraWxsUGF0aHMgfTtcbiAgfVxuXG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBjbGllbnQgPSB1c2VyPy5leGVjdXRpb25Db250ZXh0LmNsaWVudCBhcyBXb3Jrc3BhY2VDbGllbnQgfCB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgZm9sZGVyXSBvZiBPYmplY3QuZW50cmllcyhza2lsbEZvbGRlcnMpKSB7XG4gICAgY29uc3QgZmlsZXN5c3RlbSA9IGF3YWl0IHJlc29sdmVTa2lsbEZvbGRlckZpbGVzeXN0ZW0obmFtZSwgZm9sZGVyLCBjb250ZXh0LCBjbGllbnQpO1xuICAgIGlmICghZmlsZXN5c3RlbSkgY29udGludWU7XG4gICAgY29uc3QgbW91bnQgPSBmb2xkZXIubW91bnQgPz8gYC8ke25hbWV9YDtcbiAgICBtb3VudHNbbW91bnRdID0gZmlsZXN5c3RlbTtcbiAgICBpZiAoZm9sZGVyLnJlYWRhYmxlICE9PSBmYWxzZSkgc2tpbGxQYXRocy5wdXNoKG1vdW50KTtcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhcInNraWxsLWZvbGRlcnM6bW91bnRlZFwiLCB7XG4gICAgbW91bnRLZXlzOiBPYmplY3Qua2V5cyhtb3VudHMpLFxuICAgIHNraWxsUGF0aHMsXG4gIH0pO1xuXG4gIHJldHVybiB7IG1vdW50cywgc2tpbGxQYXRocyB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgb25lIHNraWxsIGZvbGRlciB0byBhIE1hc3RyYSBmaWxlc3lzdGVtLCBvciBgdW5kZWZpbmVkYCB0byBza2lwIGl0XG4gKiBmb3IgdGhpcyByZXF1ZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlU2tpbGxGb2xkZXJGaWxlc3lzdGVtKFxuICBuYW1lOiBzdHJpbmcsXG4gIGZvbGRlcjogU2tpbGxGb2xkZXJPcHRpb25zLFxuICBjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQsXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50IHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VGaWxlc3lzdGVtIHwgdW5kZWZpbmVkPiB7XG4gIGlmIChmb2xkZXIuZmlsZXN5c3RlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHJlc29sdmVTa2lsbEZvbGRlclZhbHVlKGZvbGRlci5maWxlc3lzdGVtLCBjb250ZXh0KTtcbiAgfVxuICAvLyBBIHBhdGggbW91bnQgbmVlZHMgdGhlIHJlcXVlc3QncyBPQk8gY2xpZW50IHRvIHJlYWNoIHRoZSB3b3Jrc3BhY2UuXG4gIGlmIChmb2xkZXIucGF0aCA9PT0gdW5kZWZpbmVkIHx8ICFjbGllbnQpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJza2lsbC1mb2xkZXI6c2tpcHBlZFwiLCB7XG4gICAgICBuYW1lLFxuICAgICAgcmVhc29uOiBmb2xkZXIucGF0aCA9PT0gdW5kZWZpbmVkID8gXCJuby1sb2NhdGlvblwiIDogXCJtaXNzaW5nLW9iby1jbGllbnRcIixcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHJvb3QgPSBzdHJpbmcudHJpbVRvTnVsbChhd2FpdCByZXNvbHZlU2tpbGxGb2xkZXJWYWx1ZShmb2xkZXIucGF0aCwgY29udGV4dCkpO1xuICBpZiAoIXJvb3QpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBkYXRhYnJpY2tzRmlsZXN5c3RlbShjbGllbnQsIHJvb3QsIGZvbGRlci53cml0YWJsZSAhPT0gdHJ1ZSk7XG59XG5cbi8qKiBSZWFkIGEge0BsaW5rIFNraWxsRm9sZGVyVmFsdWV9LCBjYWxsaW5nIGl0IHdoZW4gaXQgaXMgYSBwZXItcmVxdWVzdCByZXNvbHZlci4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTa2lsbEZvbGRlclZhbHVlPFQ+KFxuICB2YWx1ZTogU2tpbGxGb2xkZXJWYWx1ZTxUPixcbiAgY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0LFxuKTogVCB8IHVuZGVmaW5lZCB8IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICA/ICh2YWx1ZSBhcyAoY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0KSA9PiBUIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxUIHwgdW5kZWZpbmVkPikoY29udGV4dClcbiAgICA6IHZhbHVlO1xufVxuXG4vKipcbiAqIEZpbGwgaW4gYGlkYCBhbmQgYG5hbWVgIHdoZW4gZWl0aGVyIGlzIG9taXR0ZWQgb24ge0BsaW5rIENyZWF0ZVdvcmtzcGFjZU9wdGlvbnN9LlxuICogU2x1Z2lmaWVzIGBuYW1lYCBpbnRvIGBpZGA7IHRva2VuaXplcyBgaWRgIGludG8gYSBkaXNwbGF5IGBuYW1lYC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVdvcmtzcGFjZUlkZW50aXR5KG9wdGlvbnM6IENyZWF0ZVdvcmtzcGFjZU9wdGlvbnMpOiB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbn0ge1xuICBsZXQgaWQgPSBvcHRpb25zLmlkO1xuICBsZXQgbmFtZSA9IG9wdGlvbnMubmFtZTtcbiAgaWYgKCFpZCkge1xuICAgIGlkID0gbmFtZSA/IHN0cmluZy50b1NsdWcobmFtZSkgOiBcIndvcmtzcGFjZVwiO1xuICB9XG4gIGlmICghbmFtZSkge1xuICAgIG5hbWUgPSBBcnJheS5mcm9tKHN0cmluZy50b2tlbml6ZShpZCkpLmpvaW4oXCIgXCIpO1xuICB9XG4gIHJldHVybiB7IGlkLCBuYW1lIH07XG59XG5cbi8qKiBDb2xsZWN0IHRoZSBza2lsbC1mb2xkZXIgcmVzb2x2ZXIgYW5kIGFueSBjYWxsZXItc3VwcGxpZWQgb25lcy4gKi9cbmZ1bmN0aW9uIGJ1aWxkTW91bnRSZXNvbHZlcnMoXG4gIHNraWxsRm9sZGVyczogUmVjb3JkPHN0cmluZywgU2tpbGxGb2xkZXJPcHRpb25zPixcbiAgbW91bnRzOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10gfCB1bmRlZmluZWQsXG4pOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10ge1xuICBjb25zdCByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSA9IFtdO1xuICBjb25zdCBmb2xkZXJDb3VudCA9IE9iamVjdC5rZXlzKHNraWxsRm9sZGVycykubGVuZ3RoO1xuICBpZiAoZm9sZGVyQ291bnQgPiAwKSB7XG4gICAgcmVzb2x2ZXJzLnB1c2goKGNvbnRleHQpID0+IHJlc29sdmVTa2lsbEZvbGRlck1vdW50cyhza2lsbEZvbGRlcnMsIGNvbnRleHQpKTtcbiAgfVxuICBpZiAobW91bnRzPy5sZW5ndGgpIHtcbiAgICByZXNvbHZlcnMucHVzaCguLi5tb3VudHMpO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcIm1vdW50czpyZXNvbHZlcnNcIiwge1xuICAgIHNraWxsRm9sZGVyQ291bnQ6IGZvbGRlckNvdW50LFxuICAgIGN1c3RvbVJlc29sdmVyQ291bnQ6IG1vdW50cz8ubGVuZ3RoID8/IDAsXG4gICAgdG90YWxSZXNvbHZlckNvdW50OiByZXNvbHZlcnMubGVuZ3RoLFxuICB9KTtcbiAgcmV0dXJuIHJlc29sdmVycztcbn1cblxuLyoqXG4gKiBHYXRlIHNraWxsLWZvbGRlciBtb3VudHMgb24gdGhlIHJlcXVlc3QncyB0b2tlbi5cbiAqXG4gKiBBbHdheXMgYWxsb3dzIG1vdW50cyBpbiBkZXZlbG9wbWVudDsgaW4gb3RoZXIgZW52aXJvbm1lbnRzIHJlcXVpcmVzXG4gKiB7QGxpbmsgaGFzV29ya3NwYWNlRmlsZVNjb3BlfS5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkTW91bnRTa2lsbEZvbGRlcnMocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KTogYm9vbGVhbiB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGhhc1dvcmtzcGFjZUZpbGVTY29wZShyZXF1ZXN0Q29udGV4dCk7XG59XG5cbi8qKiBSZWFkIHRoZSB0cmltbWVkIE9CTyB1c2VyIGVtYWlsIHN0YW1wZWQgb24ge0BsaW5rIE1BU1RSQV9VU0VSX0VNQUlMX0tFWX0uICovXG5mdW5jdGlvbiByZXNvbHZlU2NvcGVkRW1haWwocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0IHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHN0cmluZy50cmltVG9OdWxsKHJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1VTRVJfRU1BSUxfS0VZKSkgPz8gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFdyYXAgYSB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW19IGFzIGEgTWFzdHJhIGZpbGVzeXN0ZW0uIFdoZW4gdGhlIHJvb3QgaXNcbiAqIG1pc3NpbmcgKGFuZCB7QGxpbmsgcmVhZE9ubHl9IHNvIHdlIHdpbGwgbm90IGNyZWF0ZSBpdCksIGZhbGwgYmFjayB0b1xuICoge0BsaW5rIHNjcmF0Y2hGaWxlc3lzdGVtfSBzbyBza2lsbCBzY2FucyBzdGlsbCBoYXZlIGEgd3JpdGFibGUgbG9jYWwgbW91bnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRhdGFicmlja3NGaWxlc3lzdGVtKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgcm9vdDogc3RyaW5nLFxuICByZWFkT25seTogYm9vbGVhbiA9IHRydWUsXG4pOiBQcm9taXNlPFdvcmtzcGFjZUZpbGVzeXN0ZW0+IHtcbiAgY29uc3QgZnMgPSBuZXcgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0oe1xuICAgIGNsaWVudDogZGF0YWJyaWNrc1dvcmtzcGFjZS50b0xlZ2FjeVdvcmtzcGFjZUNsaWVudChjbGllbnQpLFxuICAgIHJvb3QsXG4gICAgcmVhZE9ubHksXG4gICAgY3JlYXRlUm9vdDogIXJlYWRPbmx5LFxuICB9KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5pbml0KCk7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhcIi5cIikpIHtcbiAgICAgIHJldHVybiBmaWxlc3lzdGVtcyhmcywgeyByZWFkT25seSB9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImRhdGFicmlja3MtbW91bnQ6c2NyYXRjaC1mYWxsYmFja1wiLCB7XG4gICAgICByb290LFxuICAgICAgcmVhZE9ubHksXG4gICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHNjcmF0Y2hGaWxlc3lzdGVtKCk7XG59XG5cbi8qKlxuICogUnVuIGV2ZXJ5IG1vdW50IHJlc29sdmVyIGZvciBvbmUgcmVxdWVzdCBhbmQgbWVyZ2UgbW91bnRzIHBsdXMgc2tpbGwgcGF0aHMuXG4gKiBMYXRlciByZXNvbHZlcnMgb3ZlcndyaXRlIG1vdW50IGtleXMgZnJvbSBlYXJsaWVyIG9uZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VDb250cmlidXRpb24oXG4gIHJlc29sdmVyczogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdLFxuICBjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQsXG4pOiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPiB7XG4gIGNvbnN0IG1vdW50czogUmVjb3JkPHN0cmluZywgV29ya3NwYWNlRmlsZXN5c3RlbT4gPSB7fTtcbiAgY29uc3Qgc2tpbGxQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgcmVzb2x2ZXJdIG9mIHJlc29sdmVycy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBjb250cmlidXRpb24gPSBhd2FpdCByZXNvbHZlcihjb250ZXh0KTtcbiAgICBsb2dnZXIuZGVidWcoXCJtb3VudHM6cmVzb2x2ZXJcIiwge1xuICAgICAgaW5kZXgsXG4gICAgICBtb3VudEtleXM6IE9iamVjdC5rZXlzKGNvbnRyaWJ1dGlvbi5tb3VudHMpLFxuICAgICAgc2tpbGxQYXRoczogY29udHJpYnV0aW9uLnNraWxsUGF0aHMgPz8gW10sXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbihtb3VudHMsIGNvbnRyaWJ1dGlvbi5tb3VudHMpO1xuICAgIGlmIChjb250cmlidXRpb24uc2tpbGxQYXRocz8ubGVuZ3RoKSB7XG4gICAgICBza2lsbFBhdGhzLnB1c2goLi4uY29udHJpYnV0aW9uLnNraWxsUGF0aHMpO1xuICAgIH1cbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhcIm1vdW50czptZXJnZWRcIiwge1xuICAgIG1vdW50S2V5czogT2JqZWN0LmtleXMobW91bnRzKSxcbiAgICBza2lsbFBhdGhzLFxuICB9KTtcblxuICByZXR1cm4geyBtb3VudHMsIHNraWxsUGF0aHMgfTtcbn1cblxuLyoqXG4gKiBEeW5hbWljIGZpbGVzeXN0ZW0gcmVzb2x2ZXIgcGFzc2VkIHRvIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfS5cbiAqXG4gKiBSZXR1cm5zIGEge0BsaW5rIENvbXBvc2l0ZUZpbGVzeXN0ZW19IHdoZW4gYW55IG1vdW50IHJlc29sdmVkOyBvdGhlcndpc2UgYVxuICogZnJlc2gge0BsaW5rIHNjcmF0Y2hGaWxlc3lzdGVtfSBzbyBNYXN0cmEgYWx3YXlzIGhhcyBhIHdyaXRhYmxlIGxvY2FsIHJvb3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VGaWxlc3lzdGVtKFxuICByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSxcbiAgY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0LFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VGaWxlc3lzdGVtPiB7XG4gIGNvbnN0IHsgbW91bnRzIH0gPSBhd2FpdCByZXNvbHZlV29ya3NwYWNlQ29udHJpYnV0aW9uKHJlc29sdmVycywgY29udGV4dCk7XG4gIGNvbnN0IG1vdW50S2V5cyA9IE9iamVjdC5rZXlzKG1vdW50cyk7XG4gIGlmIChtb3VudEtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiZmlsZXN5c3RlbTpzY3JhdGNoXCIsIHtcbiAgICAgIGhhc1JlcXVlc3RDb250ZXh0OiBCb29sZWFuKGNvbnRleHQucmVxdWVzdENvbnRleHQpLFxuICAgIH0pO1xuICAgIHJldHVybiBzY3JhdGNoRmlsZXN5c3RlbSgpO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImZpbGVzeXN0ZW06Y29tcG9zaXRlXCIsIHsgbW91bnRLZXlzIH0pO1xuICByZXR1cm4gbmV3IENvbXBvc2l0ZUZpbGVzeXN0ZW0oeyBtb3VudHMgfSk7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGR5bmFtaWMge0BsaW5rIFNraWxsc1Jlc29sdmVyfSB0aGF0IGNvbGxlY3RzIGBza2lsbFBhdGhzYCBmcm9tXG4gKiBldmVyeSBtb3VudCByZXNvbHZlciBvbiBlYWNoIHJlcXVlc3QuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkV29ya3NwYWNlU2tpbGxzUmVzb2x2ZXIoXG4gIHJlc29sdmVyczogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdLFxuICBleHRyYVNraWxsUGF0aHM6IHN0cmluZ1tdID0gW10sXG4pOiBTa2lsbHNSZXNvbHZlciB7XG4gIHJldHVybiBhc3luYyAoY29udGV4dDogU2tpbGxzQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHsgc2tpbGxQYXRocyB9ID0gYXdhaXQgcmVzb2x2ZVdvcmtzcGFjZUNvbnRyaWJ1dGlvbihyZXNvbHZlcnMsIGNvbnRleHQpO1xuICAgIGNvbnN0IG1lcmdlZCA9IFsuLi4oc2tpbGxQYXRocyA/PyBbXSksIC4uLmV4dHJhU2tpbGxQYXRoc107XG4gICAgbG9nZ2VyLmRlYnVnKFwic2tpbGxzOnJlc29sdmVkXCIsIHsgc2tpbGxQYXRocywgZXh0cmFTa2lsbFBhdGhzIH0pO1xuICAgIHJldHVybiBtZXJnZWQ7XG4gIH07XG59XG4iXX0=
403
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3Jrc3BhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXJGLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsU0FBUyxHQU1WLE1BQU0sd0JBQXdCLENBQUM7QUFFaEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHFCQUFxQixFQUFFLGVBQWUsRUFBYSxNQUFNLGFBQWEsQ0FBQztBQUNuRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxpQkFBaUIsRUFBMEMsTUFBTSxjQUFjLENBQUM7QUFDekYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFekYsNkVBQTZFO0FBRTdFLCtEQUErRDtBQUMvRCxNQUFNLHFCQUFxQixHQUFHLENBQUMsV0FBVyxFQUFFLHFCQUFxQixFQUFFLFVBQVUsQ0FBVSxDQUFDO0FBRXhGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQWdIL0MsOEVBQThFO0FBRTlFOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJB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QyxDQUFDO1FBQ2pFLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1hc3RyYSB3b3Jrc3BhY2UgZmFjdG9yeSBmb3IgRGF0YWJyaWNrcyBBcHBzLlxuICpcbiAqIEJ1aWxkcyBhIHBlci1yZXF1ZXN0IHtAbGluayBXb3Jrc3BhY2V9IHdpdGggRGF0YWJyaWNrcyBTYW5kYm94IGNvbW1hbmRcbiAqIGV4ZWN1dGlvbiBwbHVzIGEge0BsaW5rIENvbXBvc2l0ZUZpbGVzeXN0ZW19IG92ZXIgdGhlIE5BTUVEIHNraWxsIGZvbGRlcnNcbiAqIHJlc29sdmVkIGZvciB0aGF0IHJlcXVlc3QuIEEgc2tpbGwgZm9sZGVyIG1hcHMgYSBuYW1lIHRvIGEgbG9jYXRpb24gcGx1cyBpdHNcbiAqIHJlYWRhYmxlIC8gd3JpdGFibGUgcG9saWN5OiBhIERhdGFicmlja3MgcGF0aCBtb3VudGVkIHRocm91Z2ggdGhlIE9CTyBjbGllbnRcbiAqIG9uIHtAbGluayBNQVNUUkFfVVNFUl9LRVl9LCBvciBhbnkge0BsaW5rIFdvcmtzcGFjZUZpbGVzeXN0ZW19IGEgY29uc3VtaW5nXG4gKiBsaWJyYXJ5IGFscmVhZHkgb3ducy4ge0BsaW5rIERFRkFVTFRfU0tJTExfRk9MREVSU30gc3VwcGxpZXMgdGhlIEFzc2lzdGFudFxuICogdHJlZXMsIGFuZCBgc2tpbGxGb2xkZXJzYCBtZXJnZXMgb3ZlciBpdCAtIHNhbWUgbmFtZSBvdmVycmlkZXMsIGBmYWxzZWBcbiAqIGRpc2FibGVzLCBhIG5ldyBuYW1lIGFkZHMuIE9wdGlvbmFsIG1vdW50IHJlc29sdmVycyBjb250cmlidXRlIGZ1cnRoZXJcbiAqIGZpbGVzeXN0ZW1zIGFuZCBza2lsbCBzY2FuIHJvb3RzIG9uIHRvcC5cbiAqXG4gKiBEYXRhYnJpY2tzIG1vdW50cyB1c2UgYEBkYngtdG9vbHMvZGF0YWJyaWNrc2Age0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtfVxuICogd3JhcHBlZCBieSB7QGxpbmsgZmlsZXN5c3RlbXN9OyBtaXNzaW5nIHJvb3RzIGZhbGwgYmFjayB0b1xuICoge0BsaW5rIHNjcmF0Y2hGaWxlc3lzdGVtfS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkVycm9yLCBjcmVhdGVXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IERhdGFicmlja3NGaWxlU3lzdGVtLCB3b3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRieC10b29scy9kYXRhYnJpY2tzXCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBsb2csIG9iamVjdCwgc3RyaW5nVXRpbHMsIHRva2VuIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHtcbiAgQ29tcG9zaXRlRmlsZXN5c3RlbSxcbiAgV29ya3NwYWNlLFxuICB0eXBlIFNraWxsc0NvbnRleHQsXG4gIHR5cGUgU2tpbGxzUmVzb2x2ZXIsXG4gIHR5cGUgV29ya3NwYWNlRmlsZXN5c3RlbSxcbiAgdHlwZSBXb3Jrc3BhY2VTYW5kYm94LFxuICB0eXBlIFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlcixcbn0gZnJvbSBcIkBtYXN0cmEvY29yZS93b3Jrc3BhY2VcIjtcblxuaW1wb3J0IHsgTUFTVFJBX1NDT1BFU19LRVksIE1BU1RSQV9VU0VSX0VNQUlMX0tFWSwgTUFTVFJBX1VTRVJfS0VZLCB0eXBlIFVzZXIgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IHNjcmF0Y2hGaWxlc3lzdGVtLCBmaWxlc3lzdGVtcyB9IGZyb20gXCIuL2ZpbGVzeXN0ZW1zLnRzXCI7XG5pbXBvcnQgeyBNb250eVNhbmRib3ggfSBmcm9tIFwiLi9tb250eS1zYW5kYm94LnRzXCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzU2FuZGJveCwgdHlwZSBEYXRhYnJpY2tzV29ya3NwYWNlU2FuZGJveE9wdGlvbnMgfSBmcm9tIFwiLi9zYW5kYm94LnRzXCI7XG5pbXBvcnQgeyBBU1NJU1RBTlRfU0hBUkVEX1NLSUxMU19QQVRILCB1c2VyQXNzaXN0YW50U2tpbGxzUGF0aCB9IGZyb20gXCIuL3NraWxsLXBhdGhzLnRzXCI7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBPQXV0aCBzY29wZXMgdGhhdCBnYXRlIERhdGFicmlja3Mgd29ya3NwYWNlIGZpbGUgbW91bnRzLiAqL1xuY29uc3QgV09SS1NQQUNFX0ZJTEVfU0NPUEVTID0gW1wid29ya3NwYWNlXCIsIFwid29ya3NwYWNlLndvcmtzcGFjZVwiLCBcImFsbC1hcGlzXCJdIGFzIGNvbnN0O1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL3dvcmtzcGFjZXNcIik7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBQZXItcmVxdWVzdCBjb250ZXh0IGZvciBtb3VudCBhbmQgc2tpbGwtZm9sZGVyIHJlc29sdmVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya3NwYWNlTW91bnRDb250ZXh0IHtcbiAgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dDtcbn1cblxuLyoqXG4gKiBBIHNraWxsLWZvbGRlciBmaWVsZCBnaXZlbiBlaXRoZXIgZGlyZWN0bHkgb3IgYXMgYSBwZXItcmVxdWVzdCByZXNvbHZlci5cbiAqIEEgcmVzb2x2ZXIgcmV0dXJuaW5nIGB1bmRlZmluZWRgIHNraXBzIHRoZSBmb2xkZXIgZm9yIHRoYXQgcmVxdWVzdC5cbiAqL1xuZXhwb3J0IHR5cGUgU2tpbGxGb2xkZXJWYWx1ZTxUPiA9XG4gIFQgfCAoKGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCkgPT4gVCB8IHVuZGVmaW5lZCB8IFByb21pc2U8VCB8IHVuZGVmaW5lZD4pO1xuXG4vKipcbiAqIE9uZSBuYW1lZCBza2lsbC1mb2xkZXIgbG9jYXRpb24gYW5kIGl0cyByZWFkIC8gd3JpdGUgcG9saWN5LlxuICpcbiAqIEdpdmUge0BsaW5rIHBhdGh9IGZvciBhIERhdGFicmlja3Mgd29ya3NwYWNlIHRyZWUgKG1vdW50ZWQgdGhyb3VnaCB0aGVcbiAqIHJlcXVlc3QncyBPQk8gY2xpZW50KSwgb3Ige0BsaW5rIGZpbGVzeXN0ZW19IGZvciBhIG1vdW50IHRoZSBjb25zdW1lciBidWlsZHNcbiAqIGl0c2VsZi4ge0BsaW5rIGZpbGVzeXN0ZW19IHdpbnMgd2hlbiBib3RoIGFyZSBzZXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2tpbGxGb2xkZXJPcHRpb25zIHtcbiAgLyoqIEFic29sdXRlIERhdGFicmlja3Mgd29ya3NwYWNlIHBhdGggZm9yIHRoaXMgZm9sZGVyLiAqL1xuICBwYXRoPzogU2tpbGxGb2xkZXJWYWx1ZTxzdHJpbmc+O1xuICAvKiogUmVhZHktbWFkZSBtb3VudCwgZm9yIGxvY2F0aW9ucyB0aGUgT0JPIGNsaWVudCBjYW5ub3QgcmVhY2guICovXG4gIGZpbGVzeXN0ZW0/OiBTa2lsbEZvbGRlclZhbHVlPFdvcmtzcGFjZUZpbGVzeXN0ZW0+O1xuICAvKipcbiAgICogU2NhbiB0aGlzIG1vdW50IGZvciBgU0tJTEwubWRgIGZpbGVzLiBEZWZhdWx0cyB0byBgdHJ1ZWA7IGBmYWxzZWAgbW91bnRzXG4gICAqIHRoZSBsb2NhdGlvbiBmb3IgZmlsZSB0b29scyB3aXRob3V0IGFkZGluZyBpdCB0byBza2lsbCBkaXNjb3ZlcnkuXG4gICAqL1xuICByZWFkYWJsZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbGxvdyB3cml0ZXMgdG8gYSB7QGxpbmsgcGF0aH0gbW91bnQgKGFuZCBjcmVhdGUgdGhlIHJvb3Qgd2hlbiBtaXNzaW5nKS5cbiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC4gQSBzdXBwbGllZCB7QGxpbmsgZmlsZXN5c3RlbX0gY2FycmllcyBpdHMgb3duXG4gICAqIHJlYWQtb25seSBmbGFnIGluc3RlYWQuXG4gICAqL1xuICB3cml0YWJsZT86IGJvb2xlYW47XG4gIC8qKiBNb3VudCBwb2ludCBpbiB0aGUgY29tcG9zaXRlIG5hbWVzcGFjZS4gRGVmYXVsdHMgdG8gYC88bmFtZT5gLiAqL1xuICBtb3VudD86IHN0cmluZztcbn1cblxuLyoqIE1vdW50IG1hcCBwbHVzIG9wdGlvbmFsIE1hc3RyYSBza2lsbCBzY2FuIHJvb3RzIGZvciBvbmUgcmVzb2x2ZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uIHtcbiAgbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBXb3Jrc3BhY2VGaWxlc3lzdGVtPjtcbiAgLyoqIFBhdGhzIHdpdGhpbiB0aGUgY29tcG9zaXRlIG5hbWVzcGFjZSB3aGVyZSBgU0tJTEwubWRgIGZpbGVzIGFyZSBzY2FubmVkLiAqL1xuICBza2lsbFBhdGhzPzogc3RyaW5nW107XG59XG5cbi8qKiBDb250cmlidXRlcyBmaWxlc3lzdGVtIG1vdW50cyAoYW5kIG9wdGlvbmFsIHNraWxsIHBhdGhzKSBmb3Igb25lIHJlcXVlc3QuICovXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VNb3VudFJlc29sdmVyID0gKFxuICBjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQsXG4pID0+IFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uIHwgUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj47XG5cbi8qKiBOYW1lcyBjYXJyaWVkIGJ5IHtAbGluayBERUZBVUxUX1NLSUxMX0ZPTERFUlN9LiAqL1xuZXhwb3J0IHR5cGUgRGVmYXVsdFNraWxsRm9sZGVyTmFtZSA9IFwid29ya3NwYWNlLXRlYW1cIiB8IFwid29ya3NwYWNlLXRlYW0tYXBwXCI7XG5cbi8qKlxuICogU2FuZGJveCBzZWxlY3Rpb24gZm9yIHtAbGluayBjcmVhdGVXb3Jrc3BhY2V9LiBEYXRhYnJpY2tzIGlzIHRoZSBkZWZhdWx0O1xuICogYGZhbHNlYCBkaXNhYmxlcyBjb21tYW5kIGV4ZWN1dGlvbiwgYW5kIGEgTWFzdHJhIHByb3ZpZGVyIG9yIHJlc29sdmVyIGlzIGFuXG4gKiBleHBsaWNpdCByZXBsYWNlbWVudC5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbiA9XG4gIHwgZmFsc2VcbiAgfCBcImRhdGFicmlja3NcIlxuICB8IFwibW9udHlcIlxuICB8IERhdGFicmlja3NXb3Jrc3BhY2VTYW5kYm94T3B0aW9uc1xuICB8IFdvcmtzcGFjZVNhbmRib3hcbiAgfCBXb3Jrc3BhY2VTYW5kYm94UmVzb2x2ZXI7XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgY3JlYXRlV29ya3NwYWNlfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlV29ya3NwYWNlT3B0aW9ucyB7XG4gIC8qKiBXb3Jrc3BhY2UgaWQ7IGRlcml2ZWQgZnJvbSBgbmFtZWAgb3IgYFwid29ya3NwYWNlXCJgIHdoZW4gb21pdHRlZC4gKi9cbiAgaWQ/OiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IG5hbWU7IGRlcml2ZWQgZnJvbSBgaWRgIHdoZW4gb21pdHRlZC4gKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFN0YXJ0IGZyb20ge0BsaW5rIERFRkFVTFRfU0tJTExfRk9MREVSU30uIERlZmF1bHRzIHRvIGB0cnVlYDsgYGZhbHNlYFxuICAgKiBzdGFydHMgZnJvbSBhbiBlbXB0eSBtYXAsIGxlYXZpbmcgb25seSB0aGUge0BsaW5rIHNraWxsRm9sZGVyc30gZ2l2ZW4gaGVyZS5cbiAgICovXG4gIGFzc2lzdGFudFNraWxscz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBOYW1lZCBza2lsbCBmb2xkZXJzIG1lcmdlZCBvdmVyIHtAbGluayBERUZBVUxUX1NLSUxMX0ZPTERFUlN9OiBhIG1hdGNoaW5nXG4gICAqIG5hbWUgb3ZlcnJpZGVzIHRoYXQgZGVmYXVsdCwgYGZhbHNlYCBkaXNhYmxlcyBpdCwgYW5kIGFueSBvdGhlciBuYW1lIGFkZHNcbiAgICogYSBmb2xkZXIuXG4gICAqL1xuICBza2lsbEZvbGRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBTa2lsbEZvbGRlck9wdGlvbnMgfCBmYWxzZT47XG4gIC8qKiBFeHRyYSBwZXItcmVxdWVzdCBtb3VudCByZXNvbHZlcnMgKHJ1biBhZnRlciB0aGUgc2tpbGwtZm9sZGVyIG1vdW50cykuICovXG4gIG1vdW50cz86IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXTtcbiAgLyoqIFJlcGxhY2UgdGhlIGF1dG8tYnVpbHQgZHluYW1pYyBza2lsbHMgcmVzb2x2ZXIuICovXG4gIHNraWxscz86IFNraWxsc1Jlc29sdmVyO1xuICAvKiogRm9yd2FyZGVkIHRvIE1hc3RyYSB3aGVuIHNraWxsIGRpc2NvdmVyeSBpcyBlbmFibGVkLiAqL1xuICBjaGVja1NraWxsRmlsZU10aW1lPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBCTTI1IGtleXdvcmQgc2VhcmNoIG92ZXIgaW5kZXhlZCB3b3Jrc3BhY2UgY29udGVudC4gKi9cbiAgYm0yNT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDb21tYW5kIHNhbmRib3guIERlZmF1bHRzIHRvIERhdGFicmlja3MgU2FuZGJveC4gUGFzcyBgZmFsc2VgIHRvIGRpc2FibGVcbiAgICogY29tbWFuZCBleGVjdXRpb24sIG9yIGFuIGV4cGxpY2l0IE1hc3RyYSBzYW5kYm94L3Byb3ZpZGVyIHJlc29sdmVyIHRvXG4gICAqIHJlcGxhY2UgRGF0YWJyaWNrcyBmb3IgdGhpcyB3b3Jrc3BhY2UuXG4gICAqL1xuICBzYW5kYm94PzogV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbjtcbiAgLyoqXG4gICAqIEV4dHJhIExPQ0FMIHNraWxsIHNjYW4gcGF0aHMgYWRkZWQgdG8gZXZlcnkgcmVxdWVzdCdzIHNraWxsIGRpc2NvdmVyeS5cbiAgICogVXNlZCBieSB0aGUgcGx1Z2luIHRvIHN1cmZhY2UgcmVtb3RlIHNraWxscyBwcm92aXNpb25lZCB0byBhIGxvY2FsIHRlbXBcbiAgICogZGlyIGF0IHN0YXJ0dXAgKHNlZSBgcmVtb3RlLXNraWxscy50c2ApLiBEYXRhYnJpY2tzLWhvc3RlZCByZW1vdGUgc2tpbGxzXG4gICAqIG5lZWQgbm8gZW50cnkgaGVyZSAtIHRoZXkgbGFuZCBpbiB0aGUgQXNzaXN0YW50IHRyZWUgdGhlIGJ1aWx0LWluIG1vdW50XG4gICAqIGFscmVhZHkgc2NhbnMuXG4gICAqL1xuICBleHRyYVNraWxsUGF0aHM/OiBzdHJpbmdbXTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkZWZhdWx0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogVGhlIHNraWxsIGZvbGRlcnMgZXZlcnkgd29ya3NwYWNlIHN0YXJ0cyB3aXRoLlxuICpcbiAqIC0gYHdvcmtzcGFjZS10ZWFtYCAtIHRoZSBzaGFyZWQgd29ya3NwYWNlIEFzc2lzdGFudCB0cmVlLCByZWFkLW9ubHkgYmVjYXVzZVxuICogICB3cml0aW5nIGl0IGlzIGEgd29ya3NwYWNlLWFkbWluIGFjdGlvbi5cbiAqIC0gYHdvcmtzcGFjZS10ZWFtLWFwcGAgLSB0aGUgcmVxdWVzdGluZyB1c2VyJ3Mgb3duIEFzc2lzdGFudCB0cmVlLCB3cml0YWJsZVxuICogICBzbyB0aGUgYXBwIGNhbiBzYXZlIHNraWxscyBiYWNrIHRvIGl0LiBTa2lwcGVkIHdoZW4gdGhlIHJlcXVlc3QgY2FycmllcyBub1xuICogICB1c2VyIGVtYWlsLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9TS0lMTF9GT0xERVJTOiBSZWFkb25seTxSZWNvcmQ8RGVmYXVsdFNraWxsRm9sZGVyTmFtZSwgU2tpbGxGb2xkZXJPcHRpb25zPj4gPSB7XG4gIFwid29ya3NwYWNlLXRlYW1cIjoge1xuICAgIHBhdGg6IEFTU0lTVEFOVF9TSEFSRURfU0tJTExTX1BBVEgsXG4gICAgcmVhZGFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICB9LFxuICBcIndvcmtzcGFjZS10ZWFtLWFwcFwiOiB7XG4gICAgcGF0aDogKHsgcmVxdWVzdENvbnRleHQgfSkgPT4ge1xuICAgICAgY29uc3QgZW1haWwgPSByZXNvbHZlU2NvcGVkRW1haWwocmVxdWVzdENvbnRleHQpO1xuICAgICAgcmV0dXJuIGVtYWlsID8gdXNlckFzc2lzdGFudFNraWxsc1BhdGgoZW1haWwpIDogdW5kZWZpbmVkO1xuICAgIH0sXG4gICAgcmVhZGFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gIH0sXG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfSB3aXRoIHBlci1yZXF1ZXN0IERhdGFicmlja3MgbW91bnRzLlxuICpcbiAqIEBleGFtcGxlIERlZmF1bHQgc2tpbGwgZm9sZGVycyBvbmx5XG4gKiBgYGB0c1xuICogY3JlYXRlV29ya3NwYWNlKClcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIE92ZXJyaWRlIGEgZGVmYXVsdCwgZHJvcCBhbm90aGVyLCBhbmQgYWRkIGEgbG9jYXRpb24gb2YgeW91ciBvd25cbiAqIGBgYHRzXG4gKiBjcmVhdGVXb3Jrc3BhY2Uoe1xuICogICBza2lsbEZvbGRlcnM6IHtcbiAqICAgICBcIndvcmtzcGFjZS10ZWFtXCI6IHsgcGF0aDogXCIvV29ya3NwYWNlL1NoYXJlZC90ZWFtLXNraWxsc1wiIH0sXG4gKiAgICAgXCJ3b3Jrc3BhY2UtdGVhbS1hcHBcIjogZmFsc2UsXG4gKiAgICAgcnVuYm9va3M6IHsgcGF0aDogXCIvV29ya3NwYWNlL1NoYXJlZC9ydW5ib29rcy9za2lsbHNcIiwgd3JpdGFibGU6IHRydWUgfSxcbiAqICAgICB2b2x1bWU6IHsgZmlsZXN5c3RlbTogbXlWb2x1bWVGaWxlc3lzdGVtIH0sXG4gKiAgIH0sXG4gKiB9KVxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgU2tpbGwgZm9sZGVycyBwbHVzIGEgY3VzdG9tIG1vdW50IHJlc29sdmVyXG4gKiBgYGB0c1xuICogY3JlYXRlV29ya3NwYWNlKHtcbiAqICAgbW91bnRzOiBbXG4gKiAgICAgYXN5bmMgKHsgcmVxdWVzdENvbnRleHQgfSkgPT4gKHtcbiAqICAgICAgIG1vdW50czogeyBcIi9kYXRhXCI6IG15RmlsZXN5c3RlbSB9LFxuICogICAgICAgc2tpbGxQYXRoczogW10sXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXb3Jrc3BhY2Uob3B0aW9uczogQ3JlYXRlV29ya3NwYWNlT3B0aW9ucyA9IHt9KTogV29ya3NwYWNlIHtcbiAgY29uc3QgeyBpZCwgbmFtZSB9ID0gcmVzb2x2ZVdvcmtzcGFjZUlkZW50aXR5KG9wdGlvbnMpO1xuICBjb25zdCBza2lsbEZvbGRlcnMgPSByZXNvbHZlU2tpbGxGb2xkZXJzKG9wdGlvbnMpO1xuICBjb25zdCBmb2xkZXJOYW1lcyA9IE9iamVjdC5rZXlzKHNraWxsRm9sZGVycyk7XG4gIGNvbnN0IHJlc29sdmVycyA9IGJ1aWxkTW91bnRSZXNvbHZlcnMoc2tpbGxGb2xkZXJzLCBvcHRpb25zLm1vdW50cyk7XG4gIGNvbnN0IGV4dHJhU2tpbGxQYXRocyA9IG9wdGlvbnMuZXh0cmFTa2lsbFBhdGhzID8/IFtdO1xuICBjb25zdCBza2lsbHMgPVxuICAgIG9wdGlvbnMuc2tpbGxzID8/XG4gICAgKHJlc29sdmVycy5sZW5ndGggPiAwIHx8IGV4dHJhU2tpbGxQYXRocy5sZW5ndGggPiAwXG4gICAgICA/IGJ1aWxkV29ya3NwYWNlU2tpbGxzUmVzb2x2ZXIocmVzb2x2ZXJzLCBleHRyYVNraWxsUGF0aHMpXG4gICAgICA6IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNoZWNrU2tpbGxGaWxlTXRpbWUgPSBvcHRpb25zLmNoZWNrU2tpbGxGaWxlTXRpbWUgPz8gZm9sZGVyTmFtZXMubGVuZ3RoID4gMDtcbiAgY29uc3QgYm0yNSA9IG9wdGlvbnMuYm0yNSAhPT0gZmFsc2U7XG4gIGNvbnN0IHNhbmRib3ggPSByZXNvbHZlV29ya3NwYWNlU2FuZGJveChvcHRpb25zLnNhbmRib3gsIGlkLCBuYW1lKTtcbiAgbG9nZ2VyLmRlYnVnKFwid29ya3NwYWNlOmNyZWF0ZVwiLCB7XG4gICAgaWQsXG4gICAgbmFtZSxcbiAgICByZXNvbHZlckNvdW50OiByZXNvbHZlcnMubGVuZ3RoLFxuICAgIHNraWxsRm9sZGVyczogZm9sZGVyTmFtZXMsXG4gICAgY3VzdG9tTW91bnRSZXNvbHZlcnM6IG9wdGlvbnMubW91bnRzPy5sZW5ndGggPz8gMCxcbiAgICBjdXN0b21Ta2lsbHNSZXNvbHZlcjogQm9vbGVhbihvcHRpb25zLnNraWxscyksXG4gICAgY2hlY2tTa2lsbEZpbGVNdGltZSxcbiAgICBibTI1LFxuICAgIGV4dHJhU2tpbGxQYXRoczogZXh0cmFTa2lsbFBhdGhzLmxlbmd0aCxcbiAgICBzYW5kYm94OiBzYW5kYm94ID8gc2FuZGJveE5hbWUob3B0aW9ucy5zYW5kYm94KSA6IFwiZGlzYWJsZWRcIixcbiAgfSk7XG5cbiAgcmV0dXJuIG5ldyBXb3Jrc3BhY2Uoe1xuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgZmlsZXN5c3RlbTogKGNvbnRleHQpID0+IHJlc29sdmVXb3Jrc3BhY2VGaWxlc3lzdGVtKHJlc29sdmVycywgY29udGV4dCksXG4gICAgLi4uKHNraWxsc1xuICAgICAgPyB7XG4gICAgICAgICAgc2tpbGxzLFxuICAgICAgICAgIGNoZWNrU2tpbGxGaWxlTXRpbWUsXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICAgIC4uLihzYW5kYm94XG4gICAgICA/IHtcbiAgICAgICAgICBzYW5kYm94LFxuICAgICAgICAgIGluc3RydWN0aW9uczogeyBkeW5hbWljU2FuZGJveDogXCJyZXNvbHZlXCIgYXMgY29uc3QgfSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgYm0yNSxcbiAgfSk7XG59XG5cbi8qKlxuICogTWVyZ2UgdGhlIGNvbmZpZ3VyZWQgc2tpbGwgZm9sZGVycyBvdmVyIHtAbGluayBERUZBVUxUX1NLSUxMX0ZPTERFUlN9LlxuICpcbiAqIGBhc3Npc3RhbnRTa2lsbHM6IGZhbHNlYCBkcm9wcyB0aGUgZGVmYXVsdHMsIGFuZCBhIGBmYWxzZWAgdmFsdWUgcmVtb3ZlcyBvbmVcbiAqIGVudHJ5IGJ5IG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU2tpbGxGb2xkZXJzKFxuICBvcHRpb25zOiBQaWNrPENyZWF0ZVdvcmtzcGFjZU9wdGlvbnMsIFwiYXNzaXN0YW50U2tpbGxzXCIgfCBcInNraWxsRm9sZGVyc1wiPiA9IHt9LFxuKTogUmVjb3JkPHN0cmluZywgU2tpbGxGb2xkZXJPcHRpb25zPiB7XG4gIGNvbnN0IG1lcmdlZDogUmVjb3JkPHN0cmluZywgU2tpbGxGb2xkZXJPcHRpb25zPiA9XG4gICAgb3B0aW9ucy5hc3Npc3RhbnRTa2lsbHMgPT09IGZhbHNlID8ge30gOiB7IC4uLkRFRkFVTFRfU0tJTExfRk9MREVSUyB9O1xuICBmb3IgKGNvbnN0IFtuYW1lLCBmb2xkZXJdIG9mIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuc2tpbGxGb2xkZXJzID8/IHt9KSkge1xuICAgIGlmIChmb2xkZXIgPT09IGZhbHNlKSB7XG4gICAgICBkZWxldGUgbWVyZ2VkW25hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZXJnZWRbbmFtZV0gPSBmb2xkZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiBtZXJnZWQ7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHJpdmF0ZSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuZnVuY3Rpb24gcmVzb2x2ZVdvcmtzcGFjZVNhbmRib3goXG4gIHNlbGVjdGlvbjogV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbiB8IHVuZGVmaW5lZCxcbiAgd29ya3NwYWNlSWQ6IHN0cmluZyxcbiAgd29ya3NwYWNlTmFtZTogc3RyaW5nLFxuKTogV29ya3NwYWNlU2FuZGJveCB8IFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBzZWxlY3Rpb24gPz8gXCJkYXRhYnJpY2tzXCI7XG4gIGlmIChjb25maWd1cmVkID09PSBmYWxzZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGNvbmZpZ3VyZWQgPT09IFwibW9udHlcIikgcmV0dXJuIG5ldyBNb250eVNhbmRib3goKTtcbiAgaWYgKHR5cGVvZiBjb25maWd1cmVkID09PSBcImZ1bmN0aW9uXCIgfHwgaXNTYW5kYm94KGNvbmZpZ3VyZWQpKSByZXR1cm4gY29uZmlndXJlZDtcblxuICBjb25zdCBvcHRpb25zOiBEYXRhYnJpY2tzV29ya3NwYWNlU2FuZGJveE9wdGlvbnMgPVxuICAgIGNvbmZpZ3VyZWQgPT09IFwiZGF0YWJyaWNrc1wiID8geyBwcm92aWRlcjogXCJkYXRhYnJpY2tzXCIgfSA6IGNvbmZpZ3VyZWQ7XG4gIHJldHVybiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PiB7XG4gICAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9LRVkpIGFzIFVzZXIgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgICAgXCJEYXRhYnJpY2tzIHNhbmRib3ggdXNlciBjb250ZXh0XCIsXG4gICAgICAgIFwiSW52b2tlIGNvbW1hbmQgdG9vbHMgZnJvbSBhbiBhZ2VudCB0dXJuIHNlcnZlZCBieSB0aGUgTWFzdHJhIHBsdWdpbi5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZ3VyZWRJZCA9XG4gICAgICB0eXBlb2Ygb3B0aW9ucy5zYW5kYm94SWQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IG9wdGlvbnMuc2FuZGJveElkKHsgcmVxdWVzdENvbnRleHQgfSlcbiAgICAgICAgOiBvcHRpb25zLnNhbmRib3hJZDtcbiAgICBjb25zdCBzYW5kYm94SWQgPSBjb25maWd1cmVkSWQgPz8gZGVmYXVsdFNhbmRib3hJZCh3b3Jrc3BhY2VJZCwgdXNlci5pZCk7XG4gICAgY29uc3QgY2xpZW50ID1cbiAgICAgIHR5cGVvZiBvcHRpb25zLmNsaWVudCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gb3B0aW9ucy5jbGllbnQoeyByZXF1ZXN0Q29udGV4dCB9KVxuICAgICAgICA6IChvcHRpb25zLmNsaWVudCA/PyBjcmVhdGVXb3Jrc3BhY2VDbGllbnQoKSk7XG4gICAgY29uc3Qge1xuICAgICAgcHJvdmlkZXI6IF9wcm92aWRlcixcbiAgICAgIHNhbmRib3hJZDogX3NhbmRib3hJZCxcbiAgICAgIGNsaWVudDogX2NsaWVudCxcbiAgICAgIC4uLnNhbmRib3hPcHRpb25zXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgcmV0dXJuIG5ldyBEYXRhYnJpY2tzU2FuZGJveCh7XG4gICAgICAuLi5zYW5kYm94T3B0aW9ucyxcbiAgICAgIGNsaWVudCxcbiAgICAgIHNhbmRib3hJZCxcbiAgICAgIGRpc3BsYXlOYW1lOiBvcHRpb25zLmRpc3BsYXlOYW1lID8/IGBNYXN0cmEgJHt3b3Jrc3BhY2VOYW1lfWAsXG4gICAgfSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRTYW5kYm94SWQod29ya3NwYWNlSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBkaWdlc3QgPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgLnVwZGF0ZShvYmplY3QudG9TdGFibGVLZXkoeyB3b3Jrc3BhY2VJZCwgdXNlcklkIH0pKVxuICAgIC5kaWdlc3QoXCJoZXhcIilcbiAgICAuc2xpY2UoMCwgMzIpO1xuICByZXR1cm4gYG1hc3RyYS0ke2RpZ2VzdH1gO1xufVxuXG5mdW5jdGlvbiBpc1NhbmRib3godmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3Jrc3BhY2VTYW5kYm94IHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIFwiaWRcIiBpbiB2YWx1ZSAmJiBcInByb3ZpZGVyXCIgaW4gdmFsdWUgJiYgXCJzdGF0dXNcIiBpbiB2YWx1ZSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gc2FuZGJveE5hbWUoc2VsZWN0aW9uOiBXb3Jrc3BhY2VTYW5kYm94U2VsZWN0aW9uIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKHNlbGVjdGlvbiA9PT0gdW5kZWZpbmVkIHx8IHNlbGVjdGlvbiA9PT0gXCJkYXRhYnJpY2tzXCIpIHJldHVybiBcImRhdGFicmlja3NcIjtcbiAgaWYgKHNlbGVjdGlvbiA9PT0gXCJtb250eVwiKSByZXR1cm4gXCJtb250eVwiO1xuICBpZiAoc2VsZWN0aW9uID09PSBmYWxzZSkgcmV0dXJuIFwiZGlzYWJsZWRcIjtcbiAgaWYgKHR5cGVvZiBzZWxlY3Rpb24gPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFwicmVzb2x2ZXJcIjtcbiAgcmV0dXJuIGlzU2FuZGJveChzZWxlY3Rpb24pID8gc2VsZWN0aW9uLnByb3ZpZGVyIDogKHNlbGVjdGlvbi5wcm92aWRlciA/PyBcImRhdGFicmlja3NcIik7XG59XG5cbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgdGhlIHJlcXVlc3QgdG9rZW4gY2FycmllcyBhIHNjb3BlIHRoYXQgYWxsb3dzIHdvcmtzcGFjZVxuICogZmlsZSBBUEkgYWNjZXNzIChgd29ya3NwYWNlYCBvciBgYWxsLWFwaXNgIG9uIHtAbGluayBNQVNUUkFfU0NPUEVTX0tFWX0pLlxuICovXG5mdW5jdGlvbiBoYXNXb3Jrc3BhY2VGaWxlU2NvcGUocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0IHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b2tlbi5pbmNsdWRlc0FjY2Vzc1Rva2VuU2NvcGUoXG4gICAgcmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfU0NPUEVTX0tFWSksXG4gICAgV09SS1NQQUNFX0ZJTEVfU0NPUEVTLFxuICApO1xufVxuXG4vKipcbiAqIE1vdW50IHJlc29sdmVyIGZvciB0aGUgbmFtZWQgc2tpbGwgZm9sZGVycy5cbiAqXG4gKiBHYXRlcyBvbiB3b3Jrc3BhY2UgZmlsZSBzY29wZSAob3IgZGV2ZWxvcG1lbnQgbW9kZSksIHRoZW4gbW91bnRzIGV2ZXJ5XG4gKiBmb2xkZXIgd2hvc2UgbG9jYXRpb24gcmVzb2x2ZXMgZm9yIHRoaXMgcmVxdWVzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVNraWxsRm9sZGVyTW91bnRzKFxuICBza2lsbEZvbGRlcnM6IFJlY29yZDxzdHJpbmcsIFNraWxsRm9sZGVyT3B0aW9ucz4sXG4gIGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCxcbik6IFByb21pc2U8V29ya3NwYWNlTW91bnRDb250cmlidXRpb24+IHtcbiAgY29uc3QgbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBXb3Jrc3BhY2VGaWxlc3lzdGVtPiA9IHt9O1xuICBjb25zdCBza2lsbFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IGNvbnRleHQucmVxdWVzdENvbnRleHQ7XG5cbiAgaWYgKCFyZXF1ZXN0Q29udGV4dCB8fCAhc2hvdWxkTW91bnRTa2lsbEZvbGRlcnMocmVxdWVzdENvbnRleHQpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwic2tpbGwtZm9sZGVyczpza2lwcGVkXCIsIHtcbiAgICAgIHJlYXNvbjogIXJlcXVlc3RDb250ZXh0ID8gXCJuby1yZXF1ZXN0LWNvbnRleHRcIiA6IFwibWlzc2luZy13b3Jrc3BhY2Utc2NvcGVcIixcbiAgICAgIG5vZGVFbnY6IHByb2Nlc3MuZW52Lk5PREVfRU5WLFxuICAgICAgc2NvcGVzOiByZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9TQ09QRVNfS0VZKSxcbiAgICB9KTtcbiAgICByZXR1cm4geyBtb3VudHMsIHNraWxsUGF0aHMgfTtcbiAgfVxuXG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBjbGllbnQgPSB1c2VyPy5leGVjdXRpb25Db250ZXh0LmNsaWVudCBhcyBXb3Jrc3BhY2VDbGllbnQgfCB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgZm9sZGVyXSBvZiBPYmplY3QuZW50cmllcyhza2lsbEZvbGRlcnMpKSB7XG4gICAgY29uc3QgZmlsZXN5c3RlbSA9IGF3YWl0IHJlc29sdmVTa2lsbEZvbGRlckZpbGVzeXN0ZW0obmFtZSwgZm9sZGVyLCBjb250ZXh0LCBjbGllbnQpO1xuICAgIGlmICghZmlsZXN5c3RlbSkgY29udGludWU7XG4gICAgY29uc3QgbW91bnQgPSBmb2xkZXIubW91bnQgPz8gYC8ke25hbWV9YDtcbiAgICBtb3VudHNbbW91bnRdID0gZmlsZXN5c3RlbTtcbiAgICBpZiAoZm9sZGVyLnJlYWRhYmxlICE9PSBmYWxzZSkgc2tpbGxQYXRocy5wdXNoKG1vdW50KTtcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhcInNraWxsLWZvbGRlcnM6bW91bnRlZFwiLCB7XG4gICAgbW91bnRLZXlzOiBPYmplY3Qua2V5cyhtb3VudHMpLFxuICAgIHNraWxsUGF0aHMsXG4gIH0pO1xuXG4gIHJldHVybiB7IG1vdW50cywgc2tpbGxQYXRocyB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgb25lIHNraWxsIGZvbGRlciB0byBhIE1hc3RyYSBmaWxlc3lzdGVtLCBvciBgdW5kZWZpbmVkYCB0byBza2lwIGl0XG4gKiBmb3IgdGhpcyByZXF1ZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlU2tpbGxGb2xkZXJGaWxlc3lzdGVtKFxuICBuYW1lOiBzdHJpbmcsXG4gIGZvbGRlcjogU2tpbGxGb2xkZXJPcHRpb25zLFxuICBjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQsXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50IHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VGaWxlc3lzdGVtIHwgdW5kZWZpbmVkPiB7XG4gIGlmIChmb2xkZXIuZmlsZXN5c3RlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHJlc29sdmVTa2lsbEZvbGRlclZhbHVlKGZvbGRlci5maWxlc3lzdGVtLCBjb250ZXh0KTtcbiAgfVxuICAvLyBBIHBhdGggbW91bnQgbmVlZHMgdGhlIHJlcXVlc3QncyBPQk8gY2xpZW50IHRvIHJlYWNoIHRoZSB3b3Jrc3BhY2UuXG4gIGlmIChmb2xkZXIucGF0aCA9PT0gdW5kZWZpbmVkIHx8ICFjbGllbnQpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJza2lsbC1mb2xkZXI6c2tpcHBlZFwiLCB7XG4gICAgICBuYW1lLFxuICAgICAgcmVhc29uOiBmb2xkZXIucGF0aCA9PT0gdW5kZWZpbmVkID8gXCJuby1sb2NhdGlvblwiIDogXCJtaXNzaW5nLW9iby1jbGllbnRcIixcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHJvb3QgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKGF3YWl0IHJlc29sdmVTa2lsbEZvbGRlclZhbHVlKGZvbGRlci5wYXRoLCBjb250ZXh0KSk7XG4gIGlmICghcm9vdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGRhdGFicmlja3NGaWxlc3lzdGVtKGNsaWVudCwgcm9vdCwgZm9sZGVyLndyaXRhYmxlICE9PSB0cnVlKTtcbn1cblxuLyoqIFJlYWQgYSB7QGxpbmsgU2tpbGxGb2xkZXJWYWx1ZX0sIGNhbGxpbmcgaXQgd2hlbiBpdCBpcyBhIHBlci1yZXF1ZXN0IHJlc29sdmVyLiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVNraWxsRm9sZGVyVmFsdWU8VD4oXG4gIHZhbHVlOiBTa2lsbEZvbGRlclZhbHVlPFQ+LFxuICBjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQsXG4pOiBUIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgID8gKHZhbHVlIGFzIChjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQpID0+IFQgfCB1bmRlZmluZWQgfCBQcm9taXNlPFQgfCB1bmRlZmluZWQ+KShjb250ZXh0KVxuICAgIDogdmFsdWU7XG59XG5cbi8qKlxuICogRmlsbCBpbiBgaWRgIGFuZCBgbmFtZWAgd2hlbiBlaXRoZXIgaXMgb21pdHRlZCBvbiB7QGxpbmsgQ3JlYXRlV29ya3NwYWNlT3B0aW9uc30uXG4gKiBTbHVnaWZpZXMgYG5hbWVgIGludG8gYGlkYDsgdG9rZW5pemVzIGBpZGAgaW50byBhIGRpc3BsYXkgYG5hbWVgLlxuICovXG5mdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlSWRlbnRpdHkob3B0aW9uczogQ3JlYXRlV29ya3NwYWNlT3B0aW9ucyk6IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xufSB7XG4gIGxldCBpZCA9IG9wdGlvbnMuaWQ7XG4gIGxldCBuYW1lID0gb3B0aW9ucy5uYW1lO1xuICBpZiAoIWlkKSB7XG4gICAgaWQgPSBuYW1lID8gc3RyaW5nVXRpbHMudG9TbHVnKG5hbWUpIDogXCJ3b3Jrc3BhY2VcIjtcbiAgfVxuICBpZiAoIW5hbWUpIHtcbiAgICBuYW1lID0gQXJyYXkuZnJvbShzdHJpbmdVdGlscy50b2tlbml6ZShpZCkpLmpvaW4oXCIgXCIpO1xuICB9XG4gIHJldHVybiB7IGlkLCBuYW1lIH07XG59XG5cbi8qKiBDb2xsZWN0IHRoZSBza2lsbC1mb2xkZXIgcmVzb2x2ZXIgYW5kIGFueSBjYWxsZXItc3VwcGxpZWQgb25lcy4gKi9cbmZ1bmN0aW9uIGJ1aWxkTW91bnRSZXNvbHZlcnMoXG4gIHNraWxsRm9sZGVyczogUmVjb3JkPHN0cmluZywgU2tpbGxGb2xkZXJPcHRpb25zPixcbiAgbW91bnRzOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10gfCB1bmRlZmluZWQsXG4pOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10ge1xuICBjb25zdCByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSA9IFtdO1xuICBjb25zdCBmb2xkZXJDb3VudCA9IE9iamVjdC5rZXlzKHNraWxsRm9sZGVycykubGVuZ3RoO1xuICBpZiAoZm9sZGVyQ291bnQgPiAwKSB7XG4gICAgcmVzb2x2ZXJzLnB1c2goKGNvbnRleHQpID0+IHJlc29sdmVTa2lsbEZvbGRlck1vdW50cyhza2lsbEZvbGRlcnMsIGNvbnRleHQpKTtcbiAgfVxuICBpZiAobW91bnRzPy5sZW5ndGgpIHtcbiAgICByZXNvbHZlcnMucHVzaCguLi5tb3VudHMpO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcIm1vdW50czpyZXNvbHZlcnNcIiwge1xuICAgIHNraWxsRm9sZGVyQ291bnQ6IGZvbGRlckNvdW50LFxuICAgIGN1c3RvbVJlc29sdmVyQ291bnQ6IG1vdW50cz8ubGVuZ3RoID8/IDAsXG4gICAgdG90YWxSZXNvbHZlckNvdW50OiByZXNvbHZlcnMubGVuZ3RoLFxuICB9KTtcbiAgcmV0dXJuIHJlc29sdmVycztcbn1cblxuLyoqXG4gKiBHYXRlIHNraWxsLWZvbGRlciBtb3VudHMgb24gdGhlIHJlcXVlc3QncyB0b2tlbi5cbiAqXG4gKiBBbHdheXMgYWxsb3dzIG1vdW50cyBpbiBkZXZlbG9wbWVudDsgaW4gb3RoZXIgZW52aXJvbm1lbnRzIHJlcXVpcmVzXG4gKiB7QGxpbmsgaGFzV29ya3NwYWNlRmlsZVNjb3BlfS5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkTW91bnRTa2lsbEZvbGRlcnMocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KTogYm9vbGVhbiB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGhhc1dvcmtzcGFjZUZpbGVTY29wZShyZXF1ZXN0Q29udGV4dCk7XG59XG5cbi8qKiBSZWFkIHRoZSB0cmltbWVkIE9CTyB1c2VyIGVtYWlsIHN0YW1wZWQgb24ge0BsaW5rIE1BU1RSQV9VU0VSX0VNQUlMX0tFWX0uICovXG5mdW5jdGlvbiByZXNvbHZlU2NvcGVkRW1haWwocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0IHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwocmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfVVNFUl9FTUFJTF9LRVkpKSA/PyB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogV3JhcCBhIHtAbGluayBEYXRhYnJpY2tzRmlsZVN5c3RlbX0gYXMgYSBNYXN0cmEgZmlsZXN5c3RlbS4gV2hlbiB0aGUgcm9vdCBpc1xuICogbWlzc2luZyAoYW5kIHtAbGluayByZWFkT25seX0gc28gd2Ugd2lsbCBub3QgY3JlYXRlIGl0KSwgZmFsbCBiYWNrIHRvXG4gKiB7QGxpbmsgc2NyYXRjaEZpbGVzeXN0ZW19IHNvIHNraWxsIHNjYW5zIHN0aWxsIGhhdmUgYSB3cml0YWJsZSBsb2NhbCBtb3VudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGF0YWJyaWNrc0ZpbGVzeXN0ZW0oXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICByb290OiBzdHJpbmcsXG4gIHJlYWRPbmx5OiBib29sZWFuID0gdHJ1ZSxcbik6IFByb21pc2U8V29ya3NwYWNlRmlsZXN5c3RlbT4ge1xuICBjb25zdCBmcyA9IG5ldyBEYXRhYnJpY2tzRmlsZVN5c3RlbSh7XG4gICAgY2xpZW50OiB3b3Jrc3BhY2VDbGllbnQudG9MZWdhY3lXb3Jrc3BhY2VDbGllbnQoY2xpZW50KSxcbiAgICByb290LFxuICAgIHJlYWRPbmx5LFxuICAgIGNyZWF0ZVJvb3Q6ICFyZWFkT25seSxcbiAgfSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMuaW5pdCgpO1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMoXCIuXCIpKSB7XG4gICAgICByZXR1cm4gZmlsZXN5c3RlbXMoZnMsIHsgcmVhZE9ubHkgfSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJkYXRhYnJpY2tzLW1vdW50OnNjcmF0Y2gtZmFsbGJhY2tcIiwge1xuICAgICAgcm9vdCxcbiAgICAgIHJlYWRPbmx5LFxuICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHNjcmF0Y2hGaWxlc3lzdGVtKCk7XG59XG5cbi8qKlxuICogUnVuIGV2ZXJ5IG1vdW50IHJlc29sdmVyIGZvciBvbmUgcmVxdWVzdCBhbmQgbWVyZ2UgbW91bnRzIHBsdXMgc2tpbGwgcGF0aHMuXG4gKiBMYXRlciByZXNvbHZlcnMgb3ZlcndyaXRlIG1vdW50IGtleXMgZnJvbSBlYXJsaWVyIG9uZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VDb250cmlidXRpb24oXG4gIHJlc29sdmVyczogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdLFxuICBjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQsXG4pOiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPiB7XG4gIGNvbnN0IG1vdW50czogUmVjb3JkPHN0cmluZywgV29ya3NwYWNlRmlsZXN5c3RlbT4gPSB7fTtcbiAgY29uc3Qgc2tpbGxQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgcmVzb2x2ZXJdIG9mIHJlc29sdmVycy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBjb250cmlidXRpb24gPSBhd2FpdCByZXNvbHZlcihjb250ZXh0KTtcbiAgICBsb2dnZXIuZGVidWcoXCJtb3VudHM6cmVzb2x2ZXJcIiwge1xuICAgICAgaW5kZXgsXG4gICAgICBtb3VudEtleXM6IE9iamVjdC5rZXlzKGNvbnRyaWJ1dGlvbi5tb3VudHMpLFxuICAgICAgc2tpbGxQYXRoczogY29udHJpYnV0aW9uLnNraWxsUGF0aHMgPz8gW10sXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbihtb3VudHMsIGNvbnRyaWJ1dGlvbi5tb3VudHMpO1xuICAgIGlmIChjb250cmlidXRpb24uc2tpbGxQYXRocz8ubGVuZ3RoKSB7XG4gICAgICBza2lsbFBhdGhzLnB1c2goLi4uY29udHJpYnV0aW9uLnNraWxsUGF0aHMpO1xuICAgIH1cbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhcIm1vdW50czptZXJnZWRcIiwge1xuICAgIG1vdW50S2V5czogT2JqZWN0LmtleXMobW91bnRzKSxcbiAgICBza2lsbFBhdGhzLFxuICB9KTtcblxuICByZXR1cm4geyBtb3VudHMsIHNraWxsUGF0aHMgfTtcbn1cblxuLyoqXG4gKiBEeW5hbWljIGZpbGVzeXN0ZW0gcmVzb2x2ZXIgcGFzc2VkIHRvIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfS5cbiAqXG4gKiBSZXR1cm5zIGEge0BsaW5rIENvbXBvc2l0ZUZpbGVzeXN0ZW19IHdoZW4gYW55IG1vdW50IHJlc29sdmVkOyBvdGhlcndpc2UgYVxuICogZnJlc2gge0BsaW5rIHNjcmF0Y2hGaWxlc3lzdGVtfSBzbyBNYXN0cmEgYWx3YXlzIGhhcyBhIHdyaXRhYmxlIGxvY2FsIHJvb3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VGaWxlc3lzdGVtKFxuICByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSxcbiAgY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0LFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VGaWxlc3lzdGVtPiB7XG4gIGNvbnN0IHsgbW91bnRzIH0gPSBhd2FpdCByZXNvbHZlV29ya3NwYWNlQ29udHJpYnV0aW9uKHJlc29sdmVycywgY29udGV4dCk7XG4gIGNvbnN0IG1vdW50S2V5cyA9IE9iamVjdC5rZXlzKG1vdW50cyk7XG4gIGlmIChtb3VudEtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiZmlsZXN5c3RlbTpzY3JhdGNoXCIsIHtcbiAgICAgIGhhc1JlcXVlc3RDb250ZXh0OiBCb29sZWFuKGNvbnRleHQucmVxdWVzdENvbnRleHQpLFxuICAgIH0pO1xuICAgIHJldHVybiBzY3JhdGNoRmlsZXN5c3RlbSgpO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImZpbGVzeXN0ZW06Y29tcG9zaXRlXCIsIHsgbW91bnRLZXlzIH0pO1xuICByZXR1cm4gbmV3IENvbXBvc2l0ZUZpbGVzeXN0ZW0oeyBtb3VudHMgfSk7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGR5bmFtaWMge0BsaW5rIFNraWxsc1Jlc29sdmVyfSB0aGF0IGNvbGxlY3RzIGBza2lsbFBhdGhzYCBmcm9tXG4gKiBldmVyeSBtb3VudCByZXNvbHZlciBvbiBlYWNoIHJlcXVlc3QuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkV29ya3NwYWNlU2tpbGxzUmVzb2x2ZXIoXG4gIHJlc29sdmVyczogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdLFxuICBleHRyYVNraWxsUGF0aHM6IHN0cmluZ1tdID0gW10sXG4pOiBTa2lsbHNSZXNvbHZlciB7XG4gIHJldHVybiBhc3luYyAoY29udGV4dDogU2tpbGxzQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHsgc2tpbGxQYXRocyB9ID0gYXdhaXQgcmVzb2x2ZVdvcmtzcGFjZUNvbnRyaWJ1dGlvbihyZXNvbHZlcnMsIGNvbnRleHQpO1xuICAgIGNvbnN0IG1lcmdlZCA9IFsuLi4oc2tpbGxQYXRocyA/PyBbXSksIC4uLmV4dHJhU2tpbGxQYXRoc107XG4gICAgbG9nZ2VyLmRlYnVnKFwic2tpbGxzOnJlc29sdmVkXCIsIHsgc2tpbGxQYXRocywgZXh0cmFTa2lsbFBhdGhzIH0pO1xuICAgIHJldHVybiBtZXJnZWQ7XG4gIH07XG59XG4iXX0=
package/lib/src/writer.js CHANGED
@@ -9,7 +9,7 @@
9
9
  *
10
10
  * @module
11
11
  */
12
- import { error } from "@dbx-tools/shared-core";
12
+ import { errorUtils } from "@dbx-tools/shared-core";
13
13
  import { GENIE_PROGRESS_PART_TYPE } from "@dbx-tools/shared-mastra";
14
14
  /**
15
15
  * Best-effort native custom progress write. No-op when the writer or owning
@@ -36,8 +36,8 @@ export async function safeWriteProgress(log, writer, toolCallId, event, context
36
36
  catch (err) {
37
37
  log.warn("writer:error", {
38
38
  ...context,
39
- error: error.errorMessage(err),
39
+ error: errorUtils.errorMessage(err),
40
40
  });
41
41
  }
42
42
  }
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dyaXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBRUgsT0FBTyxFQUFFLEtBQUssRUFBTyxNQUFNLHdCQUF3QixDQUFDO0FBQ3BELE9BQU8sRUFBRSx3QkFBd0IsRUFBeUIsTUFBTSwwQkFBMEIsQ0FBQztBQUczRjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQixDQUNyQyxHQUFlLEVBQ2YsTUFBc0MsRUFDdEMsVUFBOEIsRUFDOUIsS0FBdUIsRUFDdkIsVUFBbUMsRUFBRTtJQUVyQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2QyxPQUFPO0lBQ1QsQ0FBQztJQUNELElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNsQixJQUFJLEVBQUUsd0JBQXdCO1lBQzlCLElBQUksRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUU7U0FDNUIsQ0FBQyxDQUFDO1FBQ0gsR0FBRyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixHQUFHLE9BQU87WUFDVixLQUFLLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7U0FDL0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNoYXJlZCBoZWxwZXIgZm9yIHB1Ymxpc2hpbmcgR2VuaWUgcHJvZ3Jlc3MgdGhyb3VnaCBNYXN0cmEncyBuYXRpdmVcbiAqIGBjdHgud3JpdGVyLmN1c3RvbSgpYCBkYXRhLXBhcnQgc3VyZmFjZS5cbiAqXG4gKiBGYWlsdXJlcyBhcmUgbG9nZ2VkIGF0IGB3YXJuYCAoYSBwZXJzaXN0ZW50bHktY2xvc2VkIHdyaXRlciBpc1xuICogdGhlIG1vc3QgbGlrZWx5IGN1bHByaXQgd2hlbiBldmVudHMgZ28gbWlzc2luZyBjbGllbnQtc2lkZSkgYnV0XG4gKiBzd2FsbG93ZWQgc28gYSBjYW5jZWxsZWQgcmVxdWVzdCBvciBhIGNsaWVudCB0aGF0IG5hdmlnYXRlZFxuICogYXdheSBjYW4ndCBjcmFzaCBhIHRvb2wgbWlkLWZsaWdodC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZXJyb3IsIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBHRU5JRV9QUk9HUkVTU19QQVJUX1RZUEUsIHR5cGUgR2VuaWVXcml0ZXJFdmVudCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB0eXBlIHsgVG9vbEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Rvb2xzXCI7XG5cbi8qKlxuICogQmVzdC1lZmZvcnQgbmF0aXZlIGN1c3RvbSBwcm9ncmVzcyB3cml0ZS4gTm8tb3Agd2hlbiB0aGUgd3JpdGVyIG9yIG93bmluZ1xuICogdG9vbCBjYWxsIGlkIGlzIHVuYXZhaWxhYmxlO1xuICogY2F1Z2h0IGVycm9ycyBhcmUgbG9nZ2VkIHZpYSBgbG9nLndhcm4oXCJ3cml0ZXI6ZXJyb3JcIiwgLi4uKWBcbiAqIGFsb25nIHdpdGggYW55IGNhbGxlci1zdXBwbGllZCBgY29udGV4dGAgZmllbGRzIChlLmcuIGFcbiAqIGBjaGFydElkYCBvciBgbWVzc2FnZUlkYCkgc28gdGhlIHdhcm5pbmcgaXMgZ3JlcHBhYmxlIHBlclxuICogcmVzb3VyY2UuXG4gKlxuICogUmV0dXJucyB3aGVuIHRoZSB3cml0ZSByZXNvbHZlcyBvciByZWplY3RzOyBuZXZlciB0aHJvd3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYWZlV3JpdGVQcm9ncmVzcyhcbiAgbG9nOiBsb2cuTG9nZ2VyLFxuICB3cml0ZXI6IFRvb2xFeGVjdXRpb25Db250ZXh0W1wid3JpdGVyXCJdLFxuICB0b29sQ2FsbElkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGV2ZW50OiBHZW5pZVdyaXRlckV2ZW50LFxuICBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghd3JpdGVyIHx8ICF0b29sQ2FsbElkKSB7XG4gICAgbG9nLmRlYnVnKFwid3JpdGVyOm5vLXdyaXRlclwiLCBjb250ZXh0KTtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCB3cml0ZXIuY3VzdG9tKHtcbiAgICAgIHR5cGU6IEdFTklFX1BST0dSRVNTX1BBUlRfVFlQRSxcbiAgICAgIGRhdGE6IHsgdG9vbENhbGxJZCwgZXZlbnQgfSxcbiAgICB9KTtcbiAgICBsb2cuZGVidWcoXCJ3cml0ZXI6b2tcIiwgY29udGV4dCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKFwid3JpdGVyOmVycm9yXCIsIHtcbiAgICAgIC4uLmNvbnRleHQsXG4gICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dyaXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBTyxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSx3QkFBd0IsRUFBeUIsTUFBTSwwQkFBMEIsQ0FBQztBQUczRjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQixDQUNyQyxHQUFlLEVBQ2YsTUFBc0MsRUFDdEMsVUFBOEIsRUFDOUIsS0FBdUIsRUFDdkIsVUFBbUMsRUFBRTtJQUVyQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2QyxPQUFPO0lBQ1QsQ0FBQztJQUNELElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNsQixJQUFJLEVBQUUsd0JBQXdCO1lBQzlCLElBQUksRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUU7U0FDNUIsQ0FBQyxDQUFDO1FBQ0gsR0FBRyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixHQUFHLE9BQU87WUFDVixLQUFLLEVBQUUsVUFBVSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7U0FDcEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNoYXJlZCBoZWxwZXIgZm9yIHB1Ymxpc2hpbmcgR2VuaWUgcHJvZ3Jlc3MgdGhyb3VnaCBNYXN0cmEncyBuYXRpdmVcbiAqIGBjdHgud3JpdGVyLmN1c3RvbSgpYCBkYXRhLXBhcnQgc3VyZmFjZS5cbiAqXG4gKiBGYWlsdXJlcyBhcmUgbG9nZ2VkIGF0IGB3YXJuYCAoYSBwZXJzaXN0ZW50bHktY2xvc2VkIHdyaXRlciBpc1xuICogdGhlIG1vc3QgbGlrZWx5IGN1bHByaXQgd2hlbiBldmVudHMgZ28gbWlzc2luZyBjbGllbnQtc2lkZSkgYnV0XG4gKiBzd2FsbG93ZWQgc28gYSBjYW5jZWxsZWQgcmVxdWVzdCBvciBhIGNsaWVudCB0aGF0IG5hdmlnYXRlZFxuICogYXdheSBjYW4ndCBjcmFzaCBhIHRvb2wgbWlkLWZsaWdodC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZXJyb3JVdGlscywgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IEdFTklFX1BST0dSRVNTX1BBUlRfVFlQRSwgdHlwZSBHZW5pZVdyaXRlckV2ZW50IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHR5cGUgeyBUb29sRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcblxuLyoqXG4gKiBCZXN0LWVmZm9ydCBuYXRpdmUgY3VzdG9tIHByb2dyZXNzIHdyaXRlLiBOby1vcCB3aGVuIHRoZSB3cml0ZXIgb3Igb3duaW5nXG4gKiB0b29sIGNhbGwgaWQgaXMgdW5hdmFpbGFibGU7XG4gKiBjYXVnaHQgZXJyb3JzIGFyZSBsb2dnZWQgdmlhIGBsb2cud2FybihcIndyaXRlcjplcnJvclwiLCAuLi4pYFxuICogYWxvbmcgd2l0aCBhbnkgY2FsbGVyLXN1cHBsaWVkIGBjb250ZXh0YCBmaWVsZHMgKGUuZy4gYVxuICogYGNoYXJ0SWRgIG9yIGBtZXNzYWdlSWRgKSBzbyB0aGUgd2FybmluZyBpcyBncmVwcGFibGUgcGVyXG4gKiByZXNvdXJjZS5cbiAqXG4gKiBSZXR1cm5zIHdoZW4gdGhlIHdyaXRlIHJlc29sdmVzIG9yIHJlamVjdHM7IG5ldmVyIHRocm93cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhZmVXcml0ZVByb2dyZXNzKFxuICBsb2c6IGxvZy5Mb2dnZXIsXG4gIHdyaXRlcjogVG9vbEV4ZWN1dGlvbkNvbnRleHRbXCJ3cml0ZXJcIl0sXG4gIHRvb2xDYWxsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZXZlbnQ6IEdlbmllV3JpdGVyRXZlbnQsXG4gIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCF3cml0ZXIgfHwgIXRvb2xDYWxsSWQpIHtcbiAgICBsb2cuZGVidWcoXCJ3cml0ZXI6bm8td3JpdGVyXCIsIGNvbnRleHQpO1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IHdyaXRlci5jdXN0b20oe1xuICAgICAgdHlwZTogR0VOSUVfUFJPR1JFU1NfUEFSVF9UWVBFLFxuICAgICAgZGF0YTogeyB0b29sQ2FsbElkLCBldmVudCB9LFxuICAgIH0pO1xuICAgIGxvZy5kZWJ1ZyhcIndyaXRlcjpva1wiLCBjb250ZXh0KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oXCJ3cml0ZXI6ZXJyb3JcIiwge1xuICAgICAgLi4uY29udGV4dCxcbiAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -1 +1 @@
1
- {"root":["../src/agents.ts","../src/chart.ts","../src/chat.ts","../src/config.ts","../src/defaults.ts","../src/evaluation.ts","../src/filesystems.ts","../src/genie.ts","../src/identity.ts","../src/mcp.ts","../src/memory.ts","../src/mlflow.ts","../src/model.ts","../src/monty-sandbox.ts","../src/observability.ts","../src/pagination.ts","../src/plugin.ts","../src/processors.ts","../src/remote-skills.ts","../src/rest.ts","../src/sandbox.ts","../src/server.ts","../src/serving-sanitize.ts","../src/serving.ts","../src/skill-paths.ts","../src/statement.ts","../src/storage-schema.ts","../src/style.ts","../src/summarize.ts","../src/trace-io.ts","../src/validation.ts","../src/workspaces.ts","../src/writer.ts","../index.ts"],"version":"5.9.3"}
1
+ {"root":["../src/agents.ts","../src/chart.ts","../src/chat.ts","../src/config.ts","../src/defaults.ts","../src/evaluation.ts","../src/filesystems.ts","../src/genie.ts","../src/identity.ts","../src/mcp.ts","../src/memory.ts","../src/mlflow.ts","../src/model.ts","../src/monty-sandbox.ts","../src/observability.ts","../src/plugin.ts","../src/processors.ts","../src/remote-skills.ts","../src/rest.ts","../src/sandbox.ts","../src/server.ts","../src/serving-sanitize.ts","../src/serving.ts","../src/skill-paths.ts","../src/statement.ts","../src/storage-schema.ts","../src/style.ts","../src/summarize.ts","../src/trace-io.ts","../src/validation.ts","../src/workspaces.ts","../src/writer.ts","../index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -32,27 +32,27 @@
32
32
  },
33
33
  "dependencies": {
34
34
  "@databricks/appkit": "0.81.0",
35
- "@dbx-tools/appkit": "^0.9.5",
36
- "@dbx-tools/core": "^0.9.5",
37
- "@dbx-tools/databricks": "^0.9.5",
38
- "@dbx-tools/fs": "^0.9.5",
39
- "@dbx-tools/genie": "^0.9.5",
40
- "@dbx-tools/model": "^0.9.5",
41
- "@dbx-tools/model-rs": "^0.9.5",
42
- "@dbx-tools/path": "^0.9.5",
43
- "@dbx-tools/shared-core": "^0.9.5",
44
- "@dbx-tools/shared-fs": "^0.9.5",
45
- "@dbx-tools/shared-genie": "^0.9.5",
46
- "@dbx-tools/shared-mastra": "^0.9.5",
47
- "@dbx-tools/shared-model": "^0.9.5",
35
+ "@dbx-tools/appkit": "^0.9.6",
36
+ "@dbx-tools/core": "^0.9.6",
37
+ "@dbx-tools/databricks": "^0.9.6",
38
+ "@dbx-tools/fs": "^0.9.6",
39
+ "@dbx-tools/genie": "^0.9.6",
40
+ "@dbx-tools/model": "^0.9.6",
41
+ "@dbx-tools/model-rs": "^0.9.6",
42
+ "@dbx-tools/path": "^0.9.6",
43
+ "@dbx-tools/shared-core": "^0.9.6",
44
+ "@dbx-tools/shared-fs": "^0.9.6",
45
+ "@dbx-tools/shared-genie": "^0.9.6",
46
+ "@dbx-tools/shared-mastra": "^0.9.6",
47
+ "@dbx-tools/shared-model": "^0.9.6",
48
48
  "@mastra/ai-sdk": "1.10.5",
49
49
  "@mastra/core": "1.71.0",
50
- "@mastra/express": "1.5.14",
50
+ "@mastra/express": "1.5.15",
51
51
  "@mastra/fastembed": "1.3.2",
52
52
  "@mastra/mcp": "2.1.0",
53
53
  "@mastra/memory": "1.32.1",
54
- "@mastra/observability": "1.18.0",
55
- "@mastra/otel-bridge": "1.5.10",
54
+ "@mastra/observability": "1.18.1",
55
+ "@mastra/otel-bridge": "1.5.11",
56
56
  "@mastra/pg": "1.27.1",
57
57
  "@modelcontextprotocol/sdk": "^1.29.0",
58
58
  "@opentelemetry/api": "^1.9.1",
@@ -75,7 +75,7 @@
75
75
  "./package.json": "./package.json"
76
76
  }
77
77
  },
78
- "version": "0.9.5",
78
+ "version": "0.9.6",
79
79
  "types": "./lib/index.d.ts",
80
80
  "type": "module",
81
81
  "exports": {
package/src/agents.ts CHANGED
@@ -23,8 +23,8 @@ import type {
23
23
  ToolkitOptions as AppKitToolkitOptions,
24
24
  ToolProvider,
25
25
  } from "@databricks/appkit/beta";
26
- import { plugin, toolkit as appkitToolkit } from "@dbx-tools/appkit";
27
- import { log, object, string } from "@dbx-tools/shared-core";
26
+ import { pluginRegistry, toolkitEntries } from "@dbx-tools/appkit";
27
+ import { log, object, stringUtils } from "@dbx-tools/shared-core";
28
28
  import type {
29
29
  AgentConfig,
30
30
  AgentExecutionOptions,
@@ -147,7 +147,7 @@ export interface AppKitToolOptions {
147
147
  * words don't collide in traces. Stable across runs.
148
148
  */
149
149
  function deriveToolId(description: string): string {
150
- return string.toUniqueSlug(description, { fallbackPrefix: "tool" });
150
+ return stringUtils.toUniqueSlug(description, { fallbackPrefix: "tool" });
151
151
  }
152
152
 
153
153
  /**
@@ -522,7 +522,7 @@ function defaultAgentDescription(name: string): string {
522
522
  */
523
523
  export async function buildAgents(opts: {
524
524
  config: MastraPluginConfig;
525
- context: plugin.PluginContextLike | undefined;
525
+ context: pluginRegistry.PluginContextLike | undefined;
526
526
  memoryBuilder?: MemoryBuilder;
527
527
  log: log.Logger;
528
528
  /**
@@ -759,7 +759,7 @@ function resolveDefinitions(config: MastraPluginConfig): Record<string, AnyMastr
759
759
  /** Derive a registry id from a definition's `name`, with a fallback. */
760
760
  function deriveAgentKey(def: AnyMastraAgentDefinition, index?: number): string {
761
761
  if (def.name) {
762
- const slug = string.toIdentifier(def.name);
762
+ const slug = stringUtils.toIdentifier(def.name);
763
763
  if (slug) return slug;
764
764
  }
765
765
  return index === undefined ? FALLBACK_AGENT_ID : `agent_${index}`;
@@ -852,7 +852,7 @@ function resolveAgentWorkspace(
852
852
  */
853
853
  function buildPluginsMap(
854
854
  config: MastraPluginConfig,
855
- context: plugin.PluginContextLike | undefined,
855
+ context: pluginRegistry.PluginContextLike | undefined,
856
856
  ): MastraPlugins {
857
857
  const cache = new Map<string, MastraPluginToolkitProvider | null>();
858
858
  return new Proxy({} as MastraPlugins, {
@@ -886,7 +886,7 @@ function buildPluginsMap(
886
886
  */
887
887
  function resolveProvider(
888
888
  config: MastraPluginConfig,
889
- context: plugin.PluginContextLike | undefined,
889
+ context: pluginRegistry.PluginContextLike | undefined,
890
890
  propName: string,
891
891
  ): MastraPluginToolkitProvider | null {
892
892
  if (propName === "genie") {
@@ -952,7 +952,7 @@ function toolkitEntriesFromDefinitions(
952
952
  definitions: AgentToolDefinition[],
953
953
  options: ToolkitOptions = {},
954
954
  ): Record<string, ToolkitEntry> {
955
- return appkitToolkit.entries(pluginName, definitions, options);
955
+ return toolkitEntries.entries(pluginName, definitions, options);
956
956
  }
957
957
 
958
958
  function isPromiseLike<T>(value: T | Promise<T>): value is Promise<T> {
package/src/chart.ts CHANGED
@@ -29,16 +29,16 @@
29
29
 
30
30
  import { AppKitError, CacheManager, ExecutionError } from "@databricks/appkit";
31
31
  import {
32
- async,
33
- error,
32
+ asyncUtils,
33
+ errorUtils,
34
34
  hash,
35
35
  json,
36
36
  log,
37
37
  object,
38
- string,
38
+ stringUtils,
39
39
  type BrandContext,
40
40
  } from "@dbx-tools/shared-core";
41
- import { marker, wire, type Chart, type ChartResult } from "@dbx-tools/shared-mastra";
41
+ import { markers, wire, type Chart, type ChartResult } from "@dbx-tools/shared-mastra";
42
42
  import { model } from "@dbx-tools/shared-model";
43
43
  import { Agent } from "@mastra/core/agent";
44
44
  import type { RequestContext } from "@mastra/core/request-context";
@@ -169,7 +169,7 @@ export const chartPlanSchema = z.object({
169
169
  .nullable()
170
170
  .default(null)
171
171
  .describe(
172
- string.toDescription(`
172
+ stringUtils.toDescription(`
173
173
  Short title shown above the chart. Use null to fall back to the
174
174
  \`title\` argument the caller passed in.
175
175
  `),
@@ -179,7 +179,7 @@ export const chartPlanSchema = z.object({
179
179
  .nullable()
180
180
  .default(null)
181
181
  .describe(
182
- string.toDescription(`
182
+ stringUtils.toDescription(`
183
183
  Axis label for the primary (usually bottom / value) axis.
184
184
  Used for bar / horizontalBar / line / area / combo / waterfall
185
185
  / scatter / heatmap; use null for pie / funnel / treemap / radar.
@@ -190,7 +190,7 @@ export const chartPlanSchema = z.object({
190
190
  .nullable()
191
191
  .default(null)
192
192
  .describe(
193
- string.toDescription(`
193
+ stringUtils.toDescription(`
194
194
  Axis label for the secondary (usually left) axis. Used for
195
195
  bar / horizontalBar / line / area / combo / waterfall /
196
196
  scatter / heatmap; use null for pie / funnel / treemap / radar.
@@ -201,7 +201,7 @@ export const chartPlanSchema = z.object({
201
201
  .nullable()
202
202
  .default(null)
203
203
  .describe(
204
- string.toDescription(`
204
+ stringUtils.toDescription(`
205
205
  Primary category labels. For \`bar\` / \`horizontalBar\` /
206
206
  \`line\` / \`area\` / \`combo\` / \`waterfall\`: one label per
207
207
  data point. For \`heatmap\`: x-axis categories. For \`radar\`:
@@ -215,7 +215,7 @@ export const chartPlanSchema = z.object({
215
215
  .nullable()
216
216
  .default(null)
217
217
  .describe(
218
- string.toDescription(`
218
+ stringUtils.toDescription(`
219
219
  Y-axis (row) labels for \`heatmap\`. Use null when the
220
220
  row labels come from the series names, which is the preferred
221
221
  way to build a heatmap. Use null for every other chart type.
@@ -225,7 +225,7 @@ export const chartPlanSchema = z.object({
225
225
  .array(
226
226
  z.object({
227
227
  name: z.string().describe(
228
- string.toDescription(`
228
+ stringUtils.toDescription(`
229
229
  Legend name for this series.
230
230
  `),
231
231
  ),
@@ -238,7 +238,7 @@ export const chartPlanSchema = z.object({
238
238
  "Which y-axis to bind (0 = left, 1 = right). Use on `combo` when series have different units or scales; use null otherwise.",
239
239
  ),
240
240
  data: z.array(chartDataPointSchema).describe(
241
- string.toDescription(`
241
+ stringUtils.toDescription(`
242
242
  Data points. For category charts (\`bar\` / \`horizontalBar\`
243
243
  / \`line\` / \`area\` / \`combo\` / \`waterfall\` / \`radar\`),
244
244
  an array of numbers aligned to \`categories\`; for
@@ -254,7 +254,7 @@ export const chartPlanSchema = z.object({
254
254
  )
255
255
  .default([])
256
256
  .describe(
257
- string.toDescription(`
257
+ stringUtils.toDescription(`
258
258
  One or more series to plot. Required for every chart type
259
259
  except \`custom\`, which carries its series inside \`option\`.
260
260
  Slice charts (\`pie\` / \`funnel\` / \`treemap\`) and
@@ -268,7 +268,7 @@ export const chartPlanSchema = z.object({
268
268
  .nullable()
269
269
  .default(null)
270
270
  .describe(
271
- string.toDescription(`
271
+ stringUtils.toDescription(`
272
272
  Required for \`custom\`; use null for every other chart type. A
273
273
  COMPLETE Echarts option, as a JSON object encoded in a string:
274
274
  \`series\` (each with its own \`type\` and that series' own data
@@ -294,7 +294,7 @@ type ChartPlanInput = z.input<typeof chartPlanSchema>;
294
294
  */
295
295
  export const chartPlannerRequestSchema = z.object({
296
296
  title: z.string().describe(
297
- string.toDescription(`
297
+ stringUtils.toDescription(`
298
298
  Concise title shown above the chart (e.g. "Top 10 SKUs by Revenue").
299
299
  `),
300
300
  ),
@@ -302,7 +302,7 @@ export const chartPlannerRequestSchema = z.object({
302
302
  .string()
303
303
  .optional()
304
304
  .describe(
305
- string.toDescription(`
305
+ stringUtils.toDescription(`
306
306
  One-line intent the chart-planner uses when picking a chart type
307
307
  and axis encodings (e.g. "compare quarterly revenue across
308
308
  regions", "highlight the steep drop after position 5"). Not shown
@@ -314,7 +314,7 @@ export const chartPlannerRequestSchema = z.object({
314
314
  .nonempty("Data must contain at least one row")
315
315
  .readonly()
316
316
  .describe(
317
- string.toDescription(`
317
+ stringUtils.toDescription(`
318
318
  Tabular dataset to chart. One object per row, keyed by column
319
319
  name. Values may be strings, numbers, booleans, or null. The
320
320
  chart-planner decides which columns are categories vs. numeric
@@ -363,7 +363,7 @@ function formatChartTypePicker(): string {
363
363
  * System prompt for the inner chart-planning agent. Tuned for a
364
364
  * fast-tier model (Haiku, GPT-5-mini, Gemini Flash Lite).
365
365
  */
366
- const CHART_PLANNER_INSTRUCTIONS = string.toDescription(`
366
+ const CHART_PLANNER_INSTRUCTIONS = stringUtils.toDescription(`
367
367
  You design Apache Echarts visualizations. The user gives you a
368
368
  tabular dataset (rows of objects) plus a title and an optional
369
369
  description of the intent. You produce a small chart plan (chart
@@ -471,7 +471,7 @@ async function runChartPlanner(
471
471
  ): Promise<ChartResult> {
472
472
  const { title, description, data } = request;
473
473
  const { requestContext, abortSignal } = options;
474
- const prompt = string.toDescription({
474
+ const prompt = stringUtils.toDescription({
475
475
  Title: title,
476
476
  ...(description ? { Description: description } : {}),
477
477
  "Dataset (JSON, one row per object)": JSON.stringify(data, null, 2),
@@ -515,7 +515,7 @@ async function writeChart(entry: Chart, userKey: string): Promise<void> {
515
515
  } catch (err) {
516
516
  logger.warn("write-error", {
517
517
  chartId: entry.chartId,
518
- error: error.errorMessage(err),
518
+ error: errorUtils.errorMessage(err),
519
519
  });
520
520
  }
521
521
  }
@@ -533,7 +533,7 @@ async function readChart(chartId: string, userKey: string): Promise<Chart | unde
533
533
  } catch (err) {
534
534
  logger.warn("read-error", {
535
535
  chartId,
536
- error: error.errorMessage(err),
536
+ error: errorUtils.errorMessage(err),
537
537
  });
538
538
  return undefined;
539
539
  }
@@ -599,7 +599,7 @@ export async function prepareChart(opts: PrepareChartOptions): Promise<ChartTool
599
599
  // Fire-and-forget. Failures land in the cache as `error` entries;
600
600
  // never escape into an unhandled rejection.
601
601
  void runPrepareChart(chartId, opts);
602
- return { chartId, marker: marker.formatMarker("chart", chartId) };
602
+ return { chartId, marker: markers.formatMarker("chart", chartId) };
603
603
  }
604
604
 
605
605
  async function runPrepareChart(chartId: string, opts: PrepareChartOptions): Promise<void> {
@@ -628,7 +628,7 @@ async function runPrepareChart(chartId: string, opts: PrepareChartOptions): Prom
628
628
  elapsedMs: Date.now() - startedAt,
629
629
  });
630
630
  } catch (err) {
631
- logger.warn("error", { chartId, error: error.errorMessage(err) });
631
+ logger.warn("error", { chartId, error: errorUtils.errorMessage(err) });
632
632
  // The entry's `error` is rendered in the chat, so only an AppKitError's
633
633
  // own message travels; anything else could carry upstream provider detail.
634
634
  const errText = err instanceof AppKitError ? err.message : CHART_FAILED_MESSAGE;
@@ -693,7 +693,7 @@ export async function fetchChart(
693
693
  if (last.result !== undefined || last.error !== undefined) return last;
694
694
  const remaining = deadline - Date.now();
695
695
  if (remaining <= 0) return last;
696
- await async.sleep(Math.min(intervalMs, remaining), options.signal);
696
+ await asyncUtils.sleep(Math.min(intervalMs, remaining), options.signal);
697
697
  }
698
698
  }
699
699
 
@@ -1198,7 +1198,7 @@ export function planToEchartsOption(
1198
1198
  export function buildRenderDataTool(config: MastraPluginConfig) {
1199
1199
  return createTool({
1200
1200
  id: "render_data",
1201
- description: string.toDescription([
1201
+ description: stringUtils.toDescription([
1202
1202
  `
1203
1203
  Submit a tabular dataset for inline rendering as a chart in
1204
1204
  the user's view. Pass a title, the raw rows (array of objects
package/src/evaluation.ts CHANGED
@@ -5,7 +5,7 @@
5
5
  */
6
6
 
7
7
  import type { DriveResult, EvalDriver } from "@databricks/appkit/beta";
8
- import { error, hash, object } from "@dbx-tools/shared-core";
8
+ import { errorUtils, hash, object } from "@dbx-tools/shared-core";
9
9
  import type { Agent } from "@mastra/core/agent";
10
10
  import type { RequestContext } from "@mastra/core/request-context";
11
11
 
@@ -60,7 +60,7 @@ export function createMastraEvalDriver(
60
60
  };
61
61
  } catch (caught) {
62
62
  return {
63
- reply: error.errorMessage(caught),
63
+ reply: errorUtils.errorMessage(caught),
64
64
  toolCalls: [],
65
65
  toolCallDetails: [],
66
66
  succeeded: false,