@dbx-tools/appkit-mastra 0.9.105 → 0.9.108

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -262,12 +262,13 @@ With `lakebase()` registered, both default to enabled:
262
262
  Without `lakebase()`, agents are stateless unless you provide explicit storage
263
263
  and memory configs.
264
264
 
265
- ## Workspace Skills
265
+ ## Workspace Capabilities
266
266
 
267
267
  Every `agents.createAgent()` gets a default Mastra `Workspace` from
268
- `workspaces.databricksWorkspace()`. Most apps do not need workspace
269
- configuration: the default scans `/Workspace/.assistant/skills` and the current
270
- user's `~/.assistant/skills` path for `SKILL.md` files.
268
+ `workspaces.databricksWorkspace()`. A workspace can provide file access, skill
269
+ discovery, a command sandbox, or any combination. The default enables all three:
270
+ it mounts `/Workspace/.assistant` and the current user's workspace home, scans
271
+ their configured Assistant skill paths, and uses the Monty sandbox.
271
272
 
272
273
  Pass paths directly when an agent needs a different filesystem scope:
273
274
 
@@ -301,7 +302,6 @@ const workspace = workspaces.databricksWorkspace({
301
302
  },
302
303
  {
303
304
  path: "/Workspace/Shared/templates",
304
- readable: false,
305
305
  },
306
306
  ({ requestContext }) =>
307
307
  requestContext.get("team") === "platform" ? "~/platform" : false,
@@ -309,11 +309,36 @@ const workspace = workspaces.databricksWorkspace({
309
309
  });
310
310
  ```
311
311
 
312
- `readable: false` keeps a mount available to file tools without scanning it for
313
- skills. `skills` contains relative roots within that path. `writable` controls
314
- whether the filesystem attempts mutations; Databricks permissions still decide
315
- whether an operation succeeds. `mount` can expose the path at a different
316
- Mastra path when required.
312
+ Paths are file-only unless `skills` lists relative Mastra skill paths within
313
+ that included path. At workspace level, `skills` uses Mastra's native path list
314
+ or resolver. An empty list retains configured mounts without exposing skills.
315
+ `writable` controls whether the filesystem attempts mutations; Databricks
316
+ permissions still decide whether an operation succeeds. `mount` can expose the
317
+ path at a different Mastra path when required.
318
+
319
+ Configure the capabilities independently:
320
+
321
+ ```ts
322
+ const filesOnly = workspaces.databricksWorkspace({
323
+ assistantPaths: false,
324
+ paths: ["~/project"],
325
+ sandbox: false,
326
+ });
327
+
328
+ const skillsOnly = workspaces.databricksWorkspace({
329
+ sandbox: false,
330
+ tools: { enabled: false },
331
+ });
332
+
333
+ const sandboxOnly = workspaces.databricksWorkspace({
334
+ assistantPaths: false,
335
+ skills: [],
336
+ tools: {
337
+ enabled: false,
338
+ mastra_workspace_execute_command: { enabled: true },
339
+ },
340
+ });
341
+ ```
317
342
 
318
343
  `/tmp` is opt-in. An explicit `/tmp` path maps to a stable user-scoped directory
319
344
  under the host operating system's ephemeral temp location. `/tmp/project` maps
@@ -337,9 +362,11 @@ export const workspace = new Workspace({
337
362
  });
338
363
  ```
339
364
 
340
- Mastra discovers and loads skills from the configured roots. Set
341
- `workspaceSkills: false` to disable skill search, or pass `{ topK, minScore,
342
- ttlMs }` to tune it.
365
+ Mastra discovers and loads skills only from explicit `skills` paths, including
366
+ the paths declared under the default Assistant paths. Set `workspaceSkills:
367
+ false` to omit the agent's skill-search processor, or pass `{ topK, minScore,
368
+ ttlMs }` to tune it. Set the workspace's `skills` to an empty list when the
369
+ workspace should expose no skills at all.
343
370
 
344
371
  ### Cache Workspace Metadata
345
372
 
@@ -356,7 +383,7 @@ await createApp({
356
383
 
357
384
  The cache is isolated by user and mount path. It stores `exists`, `readdir`, and
358
385
  `stat` results for mounted Databricks paths and caches `readFile` only under
359
- skill roots. Set `cache: false` to disable it or provide filters:
386
+ skill paths. Set `cache: false` to disable it or provide filters:
360
387
 
361
388
  ```ts
362
389
  const workspace = workspaces.databricksWorkspace({
package/index.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-mastra";
6
- export const PACKAGE_VERSION = "0.9.105";
6
+ export const PACKAGE_VERSION = "0.9.108";
7
7
  export * as agents from "./src/agents.ts";
8
8
  export * as chart from "./src/chart.ts";
9
9
  export * as chat from "./src/chat.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-mastra";
2
- export declare const PACKAGE_VERSION = "0.9.105";
2
+ export declare const PACKAGE_VERSION = "0.9.108";
3
3
  export * as agents from "./src/agents.ts";
4
4
  export * as chart from "./src/chart.ts";
5
5
  export * as chat from "./src/chat.ts";
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-mastra";
5
- export const PACKAGE_VERSION = "0.9.105";
5
+ export const PACKAGE_VERSION = "0.9.108";
6
6
  export * as agents from "./src/agents.js";
7
7
  export * as chart from "./src/chart.js";
8
8
  export * as chat from "./src/chat.js";
@@ -61,4 +61,4 @@ export { TRACE_IO_LIMIT, MLFLOW_SPAN_INPUTS_ATTR, MLFLOW_SPAN_OUTPUTS_ATTR, CHAT
61
61
  export { MLFLOW_TRACE_TAG_PREFIX, MLFLOW_AGENT_TAG, MLFLOW_GENIE_TAG, MLFLOW_OBO_AUTH_TAG, MLFLOW_SP_AUTH_TAG, MLFLOW_LOCAL_TAG, MLFLOW_AGENT_TAG_ATTR, MLFLOW_GENIE_TAG_ATTR, APPKIT_AGENT_TRACE_ROOT_ATTR, MLFLOW_OBO_AUTH_TAG_ATTR, MLFLOW_SP_AUTH_TAG_ATTR, MLFLOW_LOCAL_TAG_ATTR } from "./src/trace-attributes.js";
62
62
  export { DEFAULT_DATABRICKS_WORKSPACE_PATHS } from "./src/workspaces.js";
63
63
  export * from "./exports.js";
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRywwQkFBMEIsQ0FBQztBQUM3RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssV0FBVyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssWUFBWSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxhQUFhLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7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QkFBb0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsY0FBYyxFQUFFLHVCQUF1QixFQUFFLHdCQUF3QixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixFQUFFLHFCQUFxQixFQUFFLDBCQUEwQixFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFblUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixFQUFFLDRCQUE0QixFQUFFLHdCQUF3QixFQUFFLHVCQUF1QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFelQsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFekUsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4xMDVcIjtcbmV4cG9ydCAqIGFzIGFnZW50cyBmcm9tIFwiLi9zcmMvYWdlbnRzLnRzXCI7XG5leHBvcnQgKiBhcyBjaGFydCBmcm9tIFwiLi9zcmMvY2hhcnQudHNcIjtcbmV4cG9ydCAqIGFzIGNoYXQgZnJvbSBcIi4vc3JjL2NoYXQudHNcIjtcbmV4cG9ydCAqIGFzIGNvbmZpZyBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgKiBhcyBkZWZhdWx0cyBmcm9tIFwiLi9zcmMvZGVmYXVsdHMudHNcIjtcbmV4cG9ydCAqIGFzIGV2YWx1YXRpb24gZnJvbSBcIi4vc3JjL2V2YWx1YXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIGZpbGVzeXN0ZW1zIGZyb20gXCIuL3NyYy9maWxlc3lzdGVtcy50c1wiO1xuZXhwb3J0ICogYXMgZ2VuaWUgZnJvbSBcIi4vc3JjL2dlbmllLnRzXCI7XG5leHBvcnQgKiBhcyBpZGVudGl0eSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCAqIGFzIG1jcCBmcm9tIFwiLi9zcmMvbWNwLnRzXCI7XG5leHBvcnQgKiBhcyBtZW1vcnkgZnJvbSBcIi4vc3JjL21lbW9yeS50c1wiO1xuZXhwb3J0ICogYXMgbWxmbG93IGZyb20gXCIuL3NyYy9tbGZsb3cudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsIGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0ICogYXMgbW9udHlTYW5kYm94IGZyb20gXCIuL3NyYy9tb250eS1zYW5kYm94LnRzXCI7XG5leHBvcnQgKiBhcyBvYnNlcnZhYmlsaXR5IGZyb20gXCIuL3NyYy9vYnNlcnZhYmlsaXR5LnRzXCI7XG5leHBvcnQgKiBhcyBvcGVuYXBpVG9vbCBmcm9tIFwiLi9zcmMvb3BlbmFwaS10b29sLnRzXCI7XG5leHBvcnQgKiBhcyBwbHVnaW4gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0ICogYXMgcHJvY2Vzc29ycyBmcm9tIFwiLi9zcmMvcHJvY2Vzc29ycy50c1wiO1xuZXhwb3J0ICogYXMgcmVtb3RlU2tpbGxzIGZyb20gXCIuL3NyYy9yZW1vdGUtc2tpbGxzLnRzXCI7XG5leHBvcnQgKiBhcyByZXN0IGZyb20gXCIuL3NyYy9yZXN0LnRzXCI7XG5leHBvcnQgKiBhcyBzYW5kYm94IGZyb20gXCIuL3NyYy9zYW5kYm94LnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2ZXIgZnJvbSBcIi4vc3JjL3NlcnZlci50c1wiO1xuZXhwb3J0ICogYXMgc2VydmluZyBmcm9tIFwiLi9zcmMvc2VydmluZy50c1wiO1xuZXhwb3J0ICogYXMgc2tpbGxQYXRocyBmcm9tIFwiLi9zcmMvc2tpbGwtcGF0aHMudHNcIjtcbmV4cG9ydCAqIGFzIHN0YXRlbWVudCBmcm9tIFwiLi9zcmMvc3RhdGVtZW50LnRzXCI7XG5leHBvcnQgKiBhcyBzdG9yYWdlU2NoZW1hIGZyb20gXCIuL3NyYy9zdG9yYWdlLXNjaGVtYS50c1wiO1xuZXhwb3J0ICogYXMgc3R5bGUgZnJvbSBcIi4vc3JjL3N0eWxlLnRzXCI7XG5leHBvcnQgKiBhcyBzdW1tYXJpemUgZnJvbSBcIi4vc3JjL3N1bW1hcml6ZS50c1wiO1xuZXhwb3J0ICogYXMgdGVsZW1ldHJ5IGZyb20gXCIuL3NyYy90ZWxlbWV0cnkudHNcIjtcbmV4cG9ydCAqIGFzIHRyYWNlQXR0cmlidXRlcyBmcm9tIFwiLi9zcmMvdHJhY2UtYXR0cmlidXRlcy50c1wiO1xuZXhwb3J0ICogYXMgdmFsaWRhdGlvbiBmcm9tIFwiLi9zcmMvdmFsaWRhdGlvbi50c1wiO1xuZXhwb3J0ICogYXMgd29ya3NwYWNlcyBmcm9tIFwiLi9zcmMvd29ya3NwYWNlcy50c1wiO1xuZXhwb3J0ICogYXMgd3JpdGVyIGZyb20gXCIuL3NyYy93cml0ZXIudHNcIjtcbmV4cG9ydCB7IEZBTExCQUNLX0FHRU5UX0lELCBERUZBVUxUX0FHRU5UX01BWF9TVEVQUywgREVGQVVMVF9UT09MX1dPUktGTE9XX0lOU1RSVUNUSU9OUywgREVGQVVMVF9TVFlMRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvYWdlbnRzLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1hc3RyYVRvb2xzLCBBcHBLaXRUb29sT3B0aW9ucywgVG9vbGtpdE9wdGlvbnMsIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciwgTWFzdHJhUGx1Z2lucywgTWFzdHJhVG9vbHNGbiwgTWFzdHJhQWdlbnRXb3Jrc3BhY2VSZXNvbHZlciwgTWFzdHJhQWdlbnREZWZpbml0aW9uLCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24sIE1hc3RyYVN0b3JhZ2VDb25maWdPdmVycmlkZSwgTWFzdHJhTWVtb3J5Q29uZmlnT3ZlcnJpZGUsIEFnZW50RGVmYXVsdE1vZGVsLCBCdWlsdEFnZW50cyB9IGZyb20gXCIuL3NyYy9hZ2VudHMudHNcIjtcbmV4cG9ydCB7IGNoYXJ0UGxhblNjaGVtYSwgY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYSwgY2hhcnRUb29sT3V0cHV0U2NoZW1hIH0gZnJvbSBcIi4vc3JjL2NoYXJ0LnRzXCI7XG5leHBvcnQgdHlwZSB7IENoYXJ0UGxhbm5lclJlcXVlc3QsIENoYXJ0VG9vbE91dHB1dCwgUHJlcGFyZUNoYXJ0T3B0aW9ucywgRmV0Y2hDaGFydE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvY2hhcnQudHNcIjtcbmV4cG9ydCB7IE1BU1RSQV9VU0VSX0tFWSwgTUFTVFJBX1VTRVJfTkFNRV9LRVksIE1BU1RSQV9VU0VSX0VNQUlMX0tFWSwgTUFTVFJBX1JFUVVFU1RfSURfS0VZLCBNQVNUUkFfU0NPUEVTX0tFWSwgVFJBQ0VfUkVRVUVTVF9DT05URVhUX0tFWVMsIE1BU1RSQV9DT05GSUdfU0NIRU1BIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBVc2VyLCBNYXN0cmFNZW1vcnlDb25maWcsIE1hc3RyYVdvcmtzcGFjZVNraWxsc0NvbmZpZywgTWFzdHJhTWNwQ29uZmlnLCBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgeyBtb2RlbENhdGFsb2d1ZURlZmF1bHRzLCBnZW5pZVN1Z2dlc3Rpb25EZWZhdWx0cywgc3RhdGVtZW50RGF0YURlZmF1bHRzLCBjaGFydEZldGNoRGVmYXVsdHMsIGZlZWRiYWNrV3JpdGVEZWZhdWx0cyB9IGZyb20gXCIuL3NyYy9kZWZhdWx0cy50c1wiO1xuZXhwb3J0IHR5cGUgeyBNYXN0cmFFdmFsRHJpdmVyT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9ldmFsdWF0aW9uLnRzXCI7XG5leHBvcnQgeyBNYXN0cmFGaWxlU3lzdGVtQWRhcHRlciwgTW91bnRlZENvbXBvc2l0ZUZpbGVzeXN0ZW0gfSBmcm9tIFwiLi9zcmMvZmlsZXN5c3RlbXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhRmlsZVN5c3RlbUFkYXB0ZXJPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2ZpbGVzeXN0ZW1zLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX0dFTklFX0FMSUFTLCBHRU5JRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB0eXBlIHsgR2VuaWVTcGFjZUNvbmZpZywgR2VuaWVTcGFjZXNDb25maWcgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB7IElERU5USVRZX0VOViwgSURFTlRJVFlfTU9ERVMsIERFRkFVTFRfSURFTlRJVFlfTU9ERSwgVVNFUl9JRF9IRUFERVIsIFVTRVJfRU1BSUxfSEVBREVSLCByZXF1ZXN0VXNlcklkLCByZXF1ZXN0VXNlckVtYWlsLCB1c2VTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1hc3RyYUlkZW50aXR5TW9kZSB9IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0IHR5cGUgeyBSZXNvbHZlZE1jcCB9IGZyb20gXCIuL3NyYy9tY3AudHNcIjtcbmV4cG9ydCB7IE1lbW9yeUJ1aWxkZXIgfSBmcm9tIFwiLi9zcmMvbWVtb3J5LnRzXCI7XG5leHBvcnQgeyBBZ2VudFRyYWNlU3BhblByb2Nlc3NvciB9IGZyb20gXCIuL3NyYy9tbGZsb3cudHNcIjtcbmV4cG9ydCB0eXBlIHsgQXBwTWxmbG93VHJhY2VJbmZvLCBMb2dGZWVkYmFja1BhcmFtcyB9IGZyb20gXCIuL3NyYy9tbGZsb3cudHNcIjtcbmV4cG9ydCB7IFJFU1BPTlNFU19QUk9WSURFUl9PUFRJT05TIH0gZnJvbSBcIi4vc3JjL21vZGVsLnRzXCI7XG5leHBvcnQgdHlwZSB7IEJ1aWxkTW9kZWxPdmVycmlkZXMgfSBmcm9tIFwiLi9zcmMvbW9kZWwudHNcIjtcbmV4cG9ydCB7IE1vbnR5U2FuZGJveCB9IGZyb20gXCIuL3NyYy9tb250eS1zYW5kYm94LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vbnR5U2FuZGJveE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvbW9udHktc2FuZGJveC50c1wiO1xuZXhwb3J0IHR5cGUgeyBCdWlsZE9ic2VydmFiaWxpdHlPcHRpb25zIH0gZnJvbSBcIi4vc3JjL29ic2VydmFiaWxpdHkudHNcIjtcbmV4cG9ydCB0eXBlIHsgT3BlbkFwaUh0dHBNZXRob2QsIE9wZW5BcGlUb29sLCBPcGVuQXBpVG9vbHNPcHRpb25zIH0gZnJvbSBcIi4vc3JjL29wZW5hcGktdG9vbC50c1wiO1xuZXhwb3J0IHsgTWFzdHJhUGx1Z2luLCBtYXN0cmEgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgeyBzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yIH0gZnJvbSBcIi4vc3JjL3Byb2Nlc3NvcnMudHNcIjtcbmV4cG9ydCB7IEFJVE9PTFNfU09VUkNFIH0gZnJvbSBcIi4vc3JjL3JlbW90ZS1za2lsbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgQWlUb29sc1NvdXJjZSwgUmVtb3RlU2tpbGxTb3VyY2VPcHRpb25zLCBSZW1vdGVTa2lsbFNvdXJjZSwgUmVtb3RlU2tpbGxzT3B0aW9uLCBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLCBQcm92aXNpb25lZFJlbW90ZVNraWxscywgUmVtb3RlU2tpbGxDYWNoZUVudHJ5LCBSZW1vdGVTa2lsbHNNZXRhZGF0YSB9IGZyb20gXCIuL3NyYy9yZW1vdGUtc2tpbGxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NGZXRjaEluaXQgfSBmcm9tIFwiLi9zcmMvcmVzdC50c1wiO1xuZXhwb3J0IHsgRGF0YWJyaWNrc1NhbmRib3ggfSBmcm9tIFwiLi9zcmMvc2FuZGJveC50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzU2FuZGJveE9wdGlvbnMsIERhdGFicmlja3NXb3Jrc3BhY2VTYW5kYm94T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9zYW5kYm94LnRzXCI7XG5leHBvcnQgeyBNYXN0cmFTZXJ2ZXIgfSBmcm9tIFwiLi9zcmMvc2VydmVyLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF0dHJpYnV0ZWRJZGVudGl0eSwgTWFzdHJhQXBpR2F0ZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc2VydmVyLnRzXCI7XG5leHBvcnQgeyBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZLCBNQVNUUkFfUkVTT0xWRURfTU9ERUxfS0VZIH0gZnJvbSBcIi4vc3JjL3NlcnZpbmcudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxPdmVycmlkZVJlcXVlc3QgfSBmcm9tIFwiLi9zcmMvc2VydmluZy50c1wiO1xuZXhwb3J0IHsgT1JHQU5JWkFUSU9OX0FTU0lTVEFOVF9QQVRILCBPUkdBTklaQVRJT05fU0tJTExTX1BBVEggfSBmcm9tIFwiLi9zcmMvc2tpbGwtcGF0aHMudHNcIjtcbmV4cG9ydCB7IFNUQVRFTUVOVF9ST1dfQ0FQIH0gZnJvbSBcIi4vc3JjL3N0YXRlbWVudC50c1wiO1xuZXhwb3J0IHsgVFlQT0dSQVBIWV9SVUxFIH0gZnJvbSBcIi4vc3JjL3N0eWxlLnRzXCI7XG5leHBvcnQgeyBUSVRMRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvc3VtbWFyaXplLnRzXCI7XG5leHBvcnQgdHlwZSB7IFN1bW1hcml6ZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc3VtbWFyaXplLnRzXCI7XG5leHBvcnQgeyBUUkFDRV9JT19MSU1JVCwgTUxGTE9XX1NQQU5fSU5QVVRTX0FUVFIsIE1MRkxPV19TUEFOX09VVFBVVFNfQVRUUiwgQ0hBVF9NRVNTQUdFU19BVFRSLCBDSEFUX1JFU1BPTlNFX0FUVFIsIENIQVRfSURFTlRJVFlfQVRUUiwgQ0hBVF9HRU5JRV9VU0VEX0FUVFIsIE1MRkxPV19TUEFOX1RZUEVfQVRUUiwgR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFIsIE1MRkxPV19VU0VSX0FUVFIsIE1MRkxPV19TRVNTSU9OX0FUVFIsIE1MRkxPV19TUEFOX1RZUEVfQUdFTlQsIE1MRkxPV19TUEFOX1RZUEVfR0VOSUUgfSBmcm9tIFwiLi9zcmMvdGVsZW1ldHJ5LnRzXCI7XG5leHBvcnQgdHlwZSB7IENoYXRUdXJuVGVsZW1ldHJ5T3B0aW9ucywgQ2hhdFRyYWNlVGFnVmFsdWUgfSBmcm9tIFwiLi9zcmMvdGVsZW1ldHJ5LnRzXCI7XG5leHBvcnQgeyBNTEZMT1dfVFJBQ0VfVEFHX1BSRUZJWCwgTUxGTE9XX0FHRU5UX1RBRywgTUxGTE9XX0dFTklFX1RBRywgTUxGTE9XX09CT19BVVRIX1RBRywgTUxGTE9XX1NQX0FVVEhfVEFHLCBNTEZMT1dfTE9DQUxfVEFHLCBNTEZMT1dfQUdFTlRfVEFHX0FUVFIsIE1MRkxPV19HRU5JRV9UQUdfQVRUUiwgQVBQS0lUX0FHRU5UX1RSQUNFX1JPT1RfQVRUUiwgTUxGTE9XX09CT19BVVRIX1RBR19BVFRSLCBNTEZMT1dfU1BfQVVUSF9UQUdfQVRUUiwgTUxGTE9XX0xPQ0FMX1RBR19BVFRSIH0gZnJvbSBcIi4vc3JjL3RyYWNlLWF0dHJpYnV0ZXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgU2NoZW1hSXNzdWVzIH0gZnJvbSBcIi4vc3JjL3ZhbGlkYXRpb24udHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfREFUQUJSSUNLU19XT1JLU1BBQ0VfUEFUSFMgfSBmcm9tIFwiLi9zcmMvd29ya3NwYWNlcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCwgRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhPcHRpb25zLCBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aCwgRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhWYWx1ZSwgRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlRmlsdGVyLCBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGUsIFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb24sIERhdGFicmlja3NXb3Jrc3BhY2VPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZXMudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2V4cG9ydHMudHNcIjtcbiJdfQ==
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRywwQkFBMEIsQ0FBQztBQUM3RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssV0FBVyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssWUFBWSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxhQUFhLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7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QkFBb0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsY0FBYyxFQUFFLHVCQUF1QixFQUFFLHdCQUF3QixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixFQUFFLHFCQUFxQixFQUFFLDBCQUEwQixFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFblUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixFQUFFLDRCQUE0QixFQUFFLHdCQUF3QixFQUFFLHVCQUF1QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFelQsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFekUsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4xMDhcIjtcbmV4cG9ydCAqIGFzIGFnZW50cyBmcm9tIFwiLi9zcmMvYWdlbnRzLnRzXCI7XG5leHBvcnQgKiBhcyBjaGFydCBmcm9tIFwiLi9zcmMvY2hhcnQudHNcIjtcbmV4cG9ydCAqIGFzIGNoYXQgZnJvbSBcIi4vc3JjL2NoYXQudHNcIjtcbmV4cG9ydCAqIGFzIGNvbmZpZyBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgKiBhcyBkZWZhdWx0cyBmcm9tIFwiLi9zcmMvZGVmYXVsdHMudHNcIjtcbmV4cG9ydCAqIGFzIGV2YWx1YXRpb24gZnJvbSBcIi4vc3JjL2V2YWx1YXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIGZpbGVzeXN0ZW1zIGZyb20gXCIuL3NyYy9maWxlc3lzdGVtcy50c1wiO1xuZXhwb3J0ICogYXMgZ2VuaWUgZnJvbSBcIi4vc3JjL2dlbmllLnRzXCI7XG5leHBvcnQgKiBhcyBpZGVudGl0eSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCAqIGFzIG1jcCBmcm9tIFwiLi9zcmMvbWNwLnRzXCI7XG5leHBvcnQgKiBhcyBtZW1vcnkgZnJvbSBcIi4vc3JjL21lbW9yeS50c1wiO1xuZXhwb3J0ICogYXMgbWxmbG93IGZyb20gXCIuL3NyYy9tbGZsb3cudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsIGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0ICogYXMgbW9udHlTYW5kYm94IGZyb20gXCIuL3NyYy9tb250eS1zYW5kYm94LnRzXCI7XG5leHBvcnQgKiBhcyBvYnNlcnZhYmlsaXR5IGZyb20gXCIuL3NyYy9vYnNlcnZhYmlsaXR5LnRzXCI7XG5leHBvcnQgKiBhcyBvcGVuYXBpVG9vbCBmcm9tIFwiLi9zcmMvb3BlbmFwaS10b29sLnRzXCI7XG5leHBvcnQgKiBhcyBwbHVnaW4gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0ICogYXMgcHJvY2Vzc29ycyBmcm9tIFwiLi9zcmMvcHJvY2Vzc29ycy50c1wiO1xuZXhwb3J0ICogYXMgcmVtb3RlU2tpbGxzIGZyb20gXCIuL3NyYy9yZW1vdGUtc2tpbGxzLnRzXCI7XG5leHBvcnQgKiBhcyByZXN0IGZyb20gXCIuL3NyYy9yZXN0LnRzXCI7XG5leHBvcnQgKiBhcyBzYW5kYm94IGZyb20gXCIuL3NyYy9zYW5kYm94LnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2ZXIgZnJvbSBcIi4vc3JjL3NlcnZlci50c1wiO1xuZXhwb3J0ICogYXMgc2VydmluZyBmcm9tIFwiLi9zcmMvc2VydmluZy50c1wiO1xuZXhwb3J0ICogYXMgc2tpbGxQYXRocyBmcm9tIFwiLi9zcmMvc2tpbGwtcGF0aHMudHNcIjtcbmV4cG9ydCAqIGFzIHN0YXRlbWVudCBmcm9tIFwiLi9zcmMvc3RhdGVtZW50LnRzXCI7XG5leHBvcnQgKiBhcyBzdG9yYWdlU2NoZW1hIGZyb20gXCIuL3NyYy9zdG9yYWdlLXNjaGVtYS50c1wiO1xuZXhwb3J0ICogYXMgc3R5bGUgZnJvbSBcIi4vc3JjL3N0eWxlLnRzXCI7XG5leHBvcnQgKiBhcyBzdW1tYXJpemUgZnJvbSBcIi4vc3JjL3N1bW1hcml6ZS50c1wiO1xuZXhwb3J0ICogYXMgdGVsZW1ldHJ5IGZyb20gXCIuL3NyYy90ZWxlbWV0cnkudHNcIjtcbmV4cG9ydCAqIGFzIHRyYWNlQXR0cmlidXRlcyBmcm9tIFwiLi9zcmMvdHJhY2UtYXR0cmlidXRlcy50c1wiO1xuZXhwb3J0ICogYXMgdmFsaWRhdGlvbiBmcm9tIFwiLi9zcmMvdmFsaWRhdGlvbi50c1wiO1xuZXhwb3J0ICogYXMgd29ya3NwYWNlcyBmcm9tIFwiLi9zcmMvd29ya3NwYWNlcy50c1wiO1xuZXhwb3J0ICogYXMgd3JpdGVyIGZyb20gXCIuL3NyYy93cml0ZXIudHNcIjtcbmV4cG9ydCB7IEZBTExCQUNLX0FHRU5UX0lELCBERUZBVUxUX0FHRU5UX01BWF9TVEVQUywgREVGQVVMVF9UT09MX1dPUktGTE9XX0lOU1RSVUNUSU9OUywgREVGQVVMVF9TVFlMRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvYWdlbnRzLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1hc3RyYVRvb2xzLCBBcHBLaXRUb29sT3B0aW9ucywgVG9vbGtpdE9wdGlvbnMsIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciwgTWFzdHJhUGx1Z2lucywgTWFzdHJhVG9vbHNGbiwgTWFzdHJhQWdlbnRXb3Jrc3BhY2VSZXNvbHZlciwgTWFzdHJhQWdlbnREZWZpbml0aW9uLCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24sIE1hc3RyYVN0b3JhZ2VDb25maWdPdmVycmlkZSwgTWFzdHJhTWVtb3J5Q29uZmlnT3ZlcnJpZGUsIEFnZW50RGVmYXVsdE1vZGVsLCBCdWlsdEFnZW50cyB9IGZyb20gXCIuL3NyYy9hZ2VudHMudHNcIjtcbmV4cG9ydCB7IGNoYXJ0UGxhblNjaGVtYSwgY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYSwgY2hhcnRUb29sT3V0cHV0U2NoZW1hIH0gZnJvbSBcIi4vc3JjL2NoYXJ0LnRzXCI7XG5leHBvcnQgdHlwZSB7IENoYXJ0UGxhbm5lclJlcXVlc3QsIENoYXJ0VG9vbE91dHB1dCwgUHJlcGFyZUNoYXJ0T3B0aW9ucywgRmV0Y2hDaGFydE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvY2hhcnQudHNcIjtcbmV4cG9ydCB7IE1BU1RSQV9VU0VSX0tFWSwgTUFTVFJBX1VTRVJfTkFNRV9LRVksIE1BU1RSQV9VU0VSX0VNQUlMX0tFWSwgTUFTVFJBX1JFUVVFU1RfSURfS0VZLCBNQVNUUkFfU0NPUEVTX0tFWSwgVFJBQ0VfUkVRVUVTVF9DT05URVhUX0tFWVMsIE1BU1RSQV9DT05GSUdfU0NIRU1BIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBVc2VyLCBNYXN0cmFNZW1vcnlDb25maWcsIE1hc3RyYVdvcmtzcGFjZVNraWxsc0NvbmZpZywgTWFzdHJhTWNwQ29uZmlnLCBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgeyBtb2RlbENhdGFsb2d1ZURlZmF1bHRzLCBnZW5pZVN1Z2dlc3Rpb25EZWZhdWx0cywgc3RhdGVtZW50RGF0YURlZmF1bHRzLCBjaGFydEZldGNoRGVmYXVsdHMsIGZlZWRiYWNrV3JpdGVEZWZhdWx0cyB9IGZyb20gXCIuL3NyYy9kZWZhdWx0cy50c1wiO1xuZXhwb3J0IHR5cGUgeyBNYXN0cmFFdmFsRHJpdmVyT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9ldmFsdWF0aW9uLnRzXCI7XG5leHBvcnQgeyBNYXN0cmFGaWxlU3lzdGVtQWRhcHRlciwgTW91bnRlZENvbXBvc2l0ZUZpbGVzeXN0ZW0gfSBmcm9tIFwiLi9zcmMvZmlsZXN5c3RlbXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhRmlsZVN5c3RlbUFkYXB0ZXJPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2ZpbGVzeXN0ZW1zLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX0dFTklFX0FMSUFTLCBHRU5JRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB0eXBlIHsgR2VuaWVTcGFjZUNvbmZpZywgR2VuaWVTcGFjZXNDb25maWcgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB7IElERU5USVRZX0VOViwgSURFTlRJVFlfTU9ERVMsIERFRkFVTFRfSURFTlRJVFlfTU9ERSwgVVNFUl9JRF9IRUFERVIsIFVTRVJfRU1BSUxfSEVBREVSLCByZXF1ZXN0VXNlcklkLCByZXF1ZXN0VXNlckVtYWlsLCB1c2VTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1hc3RyYUlkZW50aXR5TW9kZSB9IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0IHR5cGUgeyBSZXNvbHZlZE1jcCB9IGZyb20gXCIuL3NyYy9tY3AudHNcIjtcbmV4cG9ydCB7IE1lbW9yeUJ1aWxkZXIgfSBmcm9tIFwiLi9zcmMvbWVtb3J5LnRzXCI7XG5leHBvcnQgeyBBZ2VudFRyYWNlU3BhblByb2Nlc3NvciB9IGZyb20gXCIuL3NyYy9tbGZsb3cudHNcIjtcbmV4cG9ydCB0eXBlIHsgQXBwTWxmbG93VHJhY2VJbmZvLCBMb2dGZWVkYmFja1BhcmFtcyB9IGZyb20gXCIuL3NyYy9tbGZsb3cudHNcIjtcbmV4cG9ydCB7IFJFU1BPTlNFU19QUk9WSURFUl9PUFRJT05TIH0gZnJvbSBcIi4vc3JjL21vZGVsLnRzXCI7XG5leHBvcnQgdHlwZSB7IEJ1aWxkTW9kZWxPdmVycmlkZXMgfSBmcm9tIFwiLi9zcmMvbW9kZWwudHNcIjtcbmV4cG9ydCB7IE1vbnR5U2FuZGJveCB9IGZyb20gXCIuL3NyYy9tb250eS1zYW5kYm94LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vbnR5U2FuZGJveE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvbW9udHktc2FuZGJveC50c1wiO1xuZXhwb3J0IHR5cGUgeyBCdWlsZE9ic2VydmFiaWxpdHlPcHRpb25zIH0gZnJvbSBcIi4vc3JjL29ic2VydmFiaWxpdHkudHNcIjtcbmV4cG9ydCB0eXBlIHsgT3BlbkFwaUh0dHBNZXRob2QsIE9wZW5BcGlUb29sLCBPcGVuQXBpVG9vbHNPcHRpb25zIH0gZnJvbSBcIi4vc3JjL29wZW5hcGktdG9vbC50c1wiO1xuZXhwb3J0IHsgTWFzdHJhUGx1Z2luLCBtYXN0cmEgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgeyBzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yIH0gZnJvbSBcIi4vc3JjL3Byb2Nlc3NvcnMudHNcIjtcbmV4cG9ydCB7IEFJVE9PTFNfU09VUkNFIH0gZnJvbSBcIi4vc3JjL3JlbW90ZS1za2lsbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgQWlUb29sc1NvdXJjZSwgUmVtb3RlU2tpbGxTb3VyY2VPcHRpb25zLCBSZW1vdGVTa2lsbFNvdXJjZSwgUmVtb3RlU2tpbGxzT3B0aW9uLCBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLCBQcm92aXNpb25lZFJlbW90ZVNraWxscywgUmVtb3RlU2tpbGxDYWNoZUVudHJ5LCBSZW1vdGVTa2lsbHNNZXRhZGF0YSB9IGZyb20gXCIuL3NyYy9yZW1vdGUtc2tpbGxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NGZXRjaEluaXQgfSBmcm9tIFwiLi9zcmMvcmVzdC50c1wiO1xuZXhwb3J0IHsgRGF0YWJyaWNrc1NhbmRib3ggfSBmcm9tIFwiLi9zcmMvc2FuZGJveC50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzU2FuZGJveE9wdGlvbnMsIERhdGFicmlja3NXb3Jrc3BhY2VTYW5kYm94T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9zYW5kYm94LnRzXCI7XG5leHBvcnQgeyBNYXN0cmFTZXJ2ZXIgfSBmcm9tIFwiLi9zcmMvc2VydmVyLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF0dHJpYnV0ZWRJZGVudGl0eSwgTWFzdHJhQXBpR2F0ZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc2VydmVyLnRzXCI7XG5leHBvcnQgeyBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZLCBNQVNUUkFfUkVTT0xWRURfTU9ERUxfS0VZIH0gZnJvbSBcIi4vc3JjL3NlcnZpbmcudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxPdmVycmlkZVJlcXVlc3QgfSBmcm9tIFwiLi9zcmMvc2VydmluZy50c1wiO1xuZXhwb3J0IHsgT1JHQU5JWkFUSU9OX0FTU0lTVEFOVF9QQVRILCBPUkdBTklaQVRJT05fU0tJTExTX1BBVEggfSBmcm9tIFwiLi9zcmMvc2tpbGwtcGF0aHMudHNcIjtcbmV4cG9ydCB7IFNUQVRFTUVOVF9ST1dfQ0FQIH0gZnJvbSBcIi4vc3JjL3N0YXRlbWVudC50c1wiO1xuZXhwb3J0IHsgVFlQT0dSQVBIWV9SVUxFIH0gZnJvbSBcIi4vc3JjL3N0eWxlLnRzXCI7XG5leHBvcnQgeyBUSVRMRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvc3VtbWFyaXplLnRzXCI7XG5leHBvcnQgdHlwZSB7IFN1bW1hcml6ZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc3VtbWFyaXplLnRzXCI7XG5leHBvcnQgeyBUUkFDRV9JT19MSU1JVCwgTUxGTE9XX1NQQU5fSU5QVVRTX0FUVFIsIE1MRkxPV19TUEFOX09VVFBVVFNfQVRUUiwgQ0hBVF9NRVNTQUdFU19BVFRSLCBDSEFUX1JFU1BPTlNFX0FUVFIsIENIQVRfSURFTlRJVFlfQVRUUiwgQ0hBVF9HRU5JRV9VU0VEX0FUVFIsIE1MRkxPV19TUEFOX1RZUEVfQVRUUiwgR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFIsIE1MRkxPV19VU0VSX0FUVFIsIE1MRkxPV19TRVNTSU9OX0FUVFIsIE1MRkxPV19TUEFOX1RZUEVfQUdFTlQsIE1MRkxPV19TUEFOX1RZUEVfR0VOSUUgfSBmcm9tIFwiLi9zcmMvdGVsZW1ldHJ5LnRzXCI7XG5leHBvcnQgdHlwZSB7IENoYXRUdXJuVGVsZW1ldHJ5T3B0aW9ucywgQ2hhdFRyYWNlVGFnVmFsdWUgfSBmcm9tIFwiLi9zcmMvdGVsZW1ldHJ5LnRzXCI7XG5leHBvcnQgeyBNTEZMT1dfVFJBQ0VfVEFHX1BSRUZJWCwgTUxGTE9XX0FHRU5UX1RBRywgTUxGTE9XX0dFTklFX1RBRywgTUxGTE9XX09CT19BVVRIX1RBRywgTUxGTE9XX1NQX0FVVEhfVEFHLCBNTEZMT1dfTE9DQUxfVEFHLCBNTEZMT1dfQUdFTlRfVEFHX0FUVFIsIE1MRkxPV19HRU5JRV9UQUdfQVRUUiwgQVBQS0lUX0FHRU5UX1RSQUNFX1JPT1RfQVRUUiwgTUxGTE9XX09CT19BVVRIX1RBR19BVFRSLCBNTEZMT1dfU1BfQVVUSF9UQUdfQVRUUiwgTUxGTE9XX0xPQ0FMX1RBR19BVFRSIH0gZnJvbSBcIi4vc3JjL3RyYWNlLWF0dHJpYnV0ZXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgU2NoZW1hSXNzdWVzIH0gZnJvbSBcIi4vc3JjL3ZhbGlkYXRpb24udHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfREFUQUJSSUNLU19XT1JLU1BBQ0VfUEFUSFMgfSBmcm9tIFwiLi9zcmMvd29ya3NwYWNlcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCwgRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhPcHRpb25zLCBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aCwgRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhWYWx1ZSwgRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlRmlsdGVyLCBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGUsIFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb24sIERhdGFicmlja3NXb3Jrc3BhY2VPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZXMudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2V4cG9ydHMudHNcIjtcbiJdfQ==
@@ -17,7 +17,7 @@ import { type CacheableFileSystemOperation } from "@dbx-tools/shared-fs";
17
17
  import type { RequestContext } from "@mastra/core/request-context";
18
18
  import { Workspace, type SkillsResolver, type WorkspaceConfig, type WorkspaceFilesystem, type WorkspaceSandbox, type WorkspaceSandboxResolver } from "@mastra/core/workspace";
19
19
  import { type DatabricksWorkspaceSandboxOptions } from "./sandbox.ts";
20
- /** Per-request context for mount and skill-folder resolvers. */
20
+ /** Per-request context for workspace path resolvers. */
21
21
  export interface DatabricksWorkspaceContext {
22
22
  requestContext?: RequestContext;
23
23
  }
@@ -32,13 +32,9 @@ export interface DatabricksWorkspacePathOptions {
32
32
  /** Mount description shown in filesystem listings and workspace instructions. */
33
33
  description?: string;
34
34
  /**
35
- * Scan this mount for `SKILL.md` files. Defaults to `true`; `false` mounts
36
- * the location for file tools without adding it to skill discovery.
37
- */
38
- readable?: boolean;
39
- /**
40
- * Skill roots relative to this filesystem root. Defaults to `["."]`.
41
- * Each path is joined to the actual mount path before Mastra scans it.
35
+ * Skill paths relative to this included filesystem path. Omit for a
36
+ * file-only mount. Each entry is joined to the actual mount path before
37
+ * Mastra receives it.
42
38
  */
43
39
  skills?: readonly string[];
44
40
  /**
@@ -87,7 +83,7 @@ export interface DatabricksWorkspaceOptions extends Omit<WorkspaceConfig, "files
87
83
  paths?: readonly DatabricksWorkspacePathValue[];
88
84
  /** Native Mastra filesystems composed beside the Databricks paths. */
89
85
  mounts?: Record<string, WorkspaceFilesystem>;
90
- /** Replace the auto-built dynamic skills resolver. */
86
+ /** Native Mastra skill paths or resolver composed with path-declared skills. */
91
87
  skills?: SkillsResolver;
92
88
  /** Filesystem cache filters. Ignored when the AppKit files-cache plugin is absent. */
93
89
  cache?: DatabricksWorkspaceCache;
@@ -100,7 +96,7 @@ export interface DatabricksWorkspaceOptions extends Omit<WorkspaceConfig, "files
100
96
  */
101
97
  sandbox?: WorkspaceSandboxSelection;
102
98
  /**
103
- * Extra LOCAL skill roots mounted read-only for every request's skill discovery.
99
+ * Extra LOCAL skill paths mounted read-only for every request's skill discovery.
104
100
  * Used by the plugin to surface remote skills provisioned to a local temp
105
101
  * dir at startup (see `remote-skills.ts`). Databricks-hosted remote skills
106
102
  * need no entry here - they land in the Assistant tree the built-in mount
@@ -48,14 +48,12 @@ const databricksWorkspaceOptions = new WeakMap();
48
48
  export const DEFAULT_DATABRICKS_WORKSPACE_PATHS = [
49
49
  {
50
50
  path: ORGANIZATION_ASSISTANT_PATH,
51
- readable: true,
52
51
  skills: ["skills"],
53
52
  writable: true,
54
53
  createRoot: false,
55
54
  },
56
55
  {
57
56
  path: "~",
58
- readable: true,
59
57
  skills: [".assistant/skills"],
60
58
  writable: true,
61
59
  createRoot: false,
@@ -100,6 +98,7 @@ export function databricksWorkspaceConfig(options = {}) {
100
98
  const resolvers = buildMountResolvers(paths, options.mounts, localSkillMountResolvers(extraSkillPaths), mountFilesCache, configuredCache);
101
99
  const resolveContribution = contributionResolver(resolvers);
102
100
  const resolveFilesystem = (context) => resolveWorkspaceFilesystem(resolveContribution, context, retainFilesystemSource ? mountFilesCache : undefined, filesystemSourceKey);
101
+ const hasSkillPaths = paths.some(pathMayProvideSkills) || extraSkillPaths.length > 0;
103
102
  const skills = options.skills ??
104
103
  (async ({ requestContext }) => {
105
104
  const context = { requestContext };
@@ -116,7 +115,8 @@ export function databricksWorkspaceConfig(options = {}) {
116
115
  resolverCount: resolvers.length,
117
116
  configuredPaths,
118
117
  customMounts: Object.keys(options.mounts ?? {}).length,
119
- customSkillsResolver: Boolean(options.skills),
118
+ skillsConfigured: options.skills !== undefined || hasSkillPaths,
119
+ customSkillsResolver: options.skills !== undefined,
120
120
  checkSkillFileMtime,
121
121
  bm25,
122
122
  extraSkillPaths: extraSkillPaths.length,
@@ -128,7 +128,7 @@ export function databricksWorkspaceConfig(options = {}) {
128
128
  id,
129
129
  name,
130
130
  filesystem: resolveFilesystem,
131
- ...(resolvers.length > 0 || options.skills
131
+ ...(options.skills !== undefined || hasSkillPaths
132
132
  ? {
133
133
  skills,
134
134
  checkSkillFileMtime,
@@ -167,6 +167,14 @@ export function resolveDatabricksWorkspacePaths(options = {}) {
167
167
  ...(options.paths ?? []),
168
168
  ];
169
169
  }
170
+ /** Whether one included path can contribute Mastra skill paths. */
171
+ function pathMayProvideSkills(path) {
172
+ if (typeof path === "function")
173
+ return true;
174
+ if (path === false || typeof path === "string")
175
+ return false;
176
+ return (path.skills?.length ?? 0) > 0;
177
+ }
170
178
  /* ---------------------------- private helpers ---------------------------- */
171
179
  function workspaceTools(configured) {
172
180
  return {
@@ -251,14 +259,14 @@ async function resolveFilesCacheScope(context) {
251
259
  },
252
260
  };
253
261
  }
254
- /** Join one relative skill root to its actual composite mount path. */
255
- function mountedSkillPath(mount, skillRoot) {
256
- if (posixPath.isAbsolute(skillRoot)) {
257
- throw new TypeError(`Skill path must be relative to its mount: ${skillRoot}`);
262
+ /** Join one relative skill path to its actual composite mount path. */
263
+ function mountedSkillPath(mount, skillPath) {
264
+ if (posixPath.isAbsolute(skillPath)) {
265
+ throw new TypeError(`Skill path must be relative to its mount: ${skillPath}`);
258
266
  }
259
- const normalized = posixPath.normalize(skillRoot);
267
+ const normalized = posixPath.normalize(skillPath);
260
268
  if (!normalized.ok) {
261
- throw new TypeError(`Skill path escapes its mount: ${skillRoot}`);
269
+ throw new TypeError(`Skill path escapes its mount: ${skillPath}`);
262
270
  }
263
271
  return posixPath.join(posixPath.normalizeRoot(mount), normalized.path.slice(1));
264
272
  }
@@ -268,12 +276,12 @@ function isWorkspaceRoot(root) {
268
276
  return normalized === "/Workspace" || normalized.startsWith("/Workspace/");
269
277
  }
270
278
  /**
271
- * Mount resolver for the named skill folders.
279
+ * Mount resolver for configured Databricks and temporary paths.
272
280
  *
273
281
  * Gates on workspace file scope (or development mode), then mounts every
274
282
  * folder whose location resolves for this request.
275
283
  */
276
- async function resolveSkillFolderMounts(paths, context, filesCache, cacheConfig) {
284
+ async function resolveWorkspacePathMounts(paths, context, filesCache, cacheConfig) {
277
285
  const mounts = {};
278
286
  const skillPaths = [];
279
287
  const requestContext = context.requestContext;
@@ -288,9 +296,7 @@ async function resolveSkillFolderMounts(paths, context, filesCache, cacheConfig)
288
296
  if (posixPath.isWithinRoot(SCRATCH_MOUNT, configured.path)) {
289
297
  const mount = configured.mount ?? configured.path;
290
298
  mounts[mount] = userTempFilesystem(context, configured.path);
291
- if (configured.readable !== false) {
292
- skillPaths.push(...(configured.skills ?? []).map((path) => mountedSkillPath(mount, path)));
293
- }
299
+ skillPaths.push(...(configured.skills ?? []).map((path) => mountedSkillPath(mount, path)));
294
300
  continue;
295
301
  }
296
302
  if (!canMountDatabricks) {
@@ -312,11 +318,9 @@ async function resolveSkillFolderMounts(paths, context, filesCache, cacheConfig)
312
318
  continue;
313
319
  }
314
320
  mounts[mount] = resolved.filesystem;
315
- if (configured.readable !== false) {
316
- skillPaths.push(...(configured.skills ?? ["."]).map((path) => mountedSkillPath(mount, path)));
317
- }
321
+ skillPaths.push(...(configured.skills ?? []).map((path) => mountedSkillPath(mount, path)));
318
322
  }
319
- logger.debug("skill-folders:mounted", {
323
+ logger.debug("workspace-paths:mounted", {
320
324
  mountKeys: Object.keys(mounts),
321
325
  skillPaths,
322
326
  });
@@ -348,7 +352,7 @@ async function resolveDatabricksWorkspacePath(value, context) {
348
352
  async function resolveSkillFolderFilesystem(folder, context, cacheConfig, cache) {
349
353
  // A path mount needs the request's OBO client to reach the workspace.
350
354
  if (!cache.client) {
351
- logger.debug("skill-folder:skipped", {
355
+ logger.debug("workspace-path:skipped", {
352
356
  path: folder.path,
353
357
  reason: "missing-obo-client",
354
358
  });
@@ -359,7 +363,7 @@ async function resolveSkillFolderFilesystem(folder, context, cacheConfig, cache)
359
363
  return undefined;
360
364
  const writable = folder.writable ?? isWorkspaceRoot(root);
361
365
  const cacheOptions = cache.fileSystemCache
362
- ? await resolveFileCacheOptions(cacheConfig, context, root, folder.readable === false ? [] : (folder.skills ?? ["."]))
366
+ ? await resolveFileCacheOptions(cacheConfig, context, root, folder.skills ?? [])
363
367
  : undefined;
364
368
  const resolved = await databricksFilesystem(cache.client, root, !writable, folder.createRoot ?? folder.writable === true, cache.fileSystemCache, cacheOptions, {
365
369
  ...(folder.description ? { description: folder.description } : {}),
@@ -449,12 +453,12 @@ function resolveWorkspaceIdentity(options) {
449
453
  }
450
454
  return { id, name };
451
455
  }
452
- /** Collect the skill-folder resolver and any caller-supplied ones. */
456
+ /** Collect the Databricks path resolver and any caller-supplied mounts. */
453
457
  function buildMountResolvers(paths, mounts, localMounts, filesCache, cacheConfig) {
454
458
  const resolvers = [];
455
459
  const pathCount = paths.length;
456
460
  if (pathCount > 0) {
457
- resolvers.push((context) => resolveSkillFolderMounts(paths, context, filesCache, cacheConfig));
461
+ resolvers.push((context) => resolveWorkspacePathMounts(paths, context, filesCache, cacheConfig));
458
462
  }
459
463
  if (mounts && Object.keys(mounts).length > 0)
460
464
  resolvers.push(() => ({ mounts }));
@@ -486,7 +490,7 @@ function userTempFilesystem(context, workspacePath) {
486
490
  description: "User-scoped temporary files retained while the host keeps its ephemeral temp storage.",
487
491
  });
488
492
  }
489
- /** Mount startup-provisioned local skill roots into Mastra's workspace filesystem. */
493
+ /** Mount startup-provisioned local skill paths into Mastra's workspace filesystem. */
490
494
  function localSkillMountResolvers(paths) {
491
495
  return [...new Set(paths.map((path) => path.trim()).filter(Boolean))].map((root) => {
492
496
  const mount = posixPath.normalizeRoot(root);
@@ -676,30 +680,30 @@ async function resolveWorkspaceFilesystem(resolveContribution, context, filesCac
676
680
  return filesCache.forFileSystem(scoped.scope, { paths: mountKeys, key: sourceKey }, load);
677
681
  }
678
682
  /**
679
- * Expand skill roots into concrete skill directories and keep the first
683
+ * Expand configured skill paths into concrete skill directories and keep the first
680
684
  * same-named directory. Mastra still owns parsing, indexing, and refreshes,
681
685
  * while earlier configured roots retain precedence over later roots.
682
686
  */
683
- async function resolveDistinctSkillPaths(filesystem, roots) {
687
+ async function resolveDistinctSkillPaths(filesystem, paths) {
684
688
  const selected = new Map();
685
- for (const root of roots) {
689
+ for (const path of paths) {
686
690
  try {
687
- const entries = await filesystem.readdir(root);
691
+ const entries = await filesystem.readdir(path);
688
692
  if (entries.some((entry) => entry.type === "file" && entry.name === "SKILL.md")) {
689
- const name = posixPath.basename(root);
693
+ const name = posixPath.basename(path);
690
694
  if (!selected.has(name))
691
- selected.set(name, root);
695
+ selected.set(name, path);
692
696
  continue;
693
697
  }
694
698
  for (const entry of entries) {
695
699
  if (entry.type !== "directory" || selected.has(entry.name))
696
700
  continue;
697
- selected.set(entry.name, posixPath.join(root, entry.name));
701
+ selected.set(entry.name, posixPath.join(path, entry.name));
698
702
  }
699
703
  }
700
704
  catch (error) {
701
- logger.debug("skill-root:skipped", {
702
- root,
705
+ logger.debug("skill-path:skipped", {
706
+ path,
703
707
  error: errorUtils.errorMessage(error),
704
708
  });
705
709
  }
@@ -723,4 +727,4 @@ function contributionResolver(resolvers) {
723
727
  return pending;
724
728
  };
725
729
  }
726
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3Jrc3BhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0QsT0FBTyxFQUNMLFVBQVUsSUFBSSxnQkFBZ0IsR0FHL0IsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUF1QixNQUFNLGlCQUFpQixDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckYsT0FBTyxFQUNMLEVBQUUsSUFBSSxRQUFRLEVBQ2QsU0FBUyxFQUtULGdCQUFnQixHQUNqQixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFDTCxTQUFTLEdBT1YsTUFBTSx3QkFBd0IsQ0FBQztBQUVoQyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixlQUFlLEVBQ2YsY0FBYyxHQUVmLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCxXQUFXLEVBQ1gsMEJBQTBCLEdBRTNCLE1BQU0sa0JBQWtCLENBQUM7QUFD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T0FBTyxRQUFRLENBQUM7UUFDOUIsTUFBTSxPQUFPLEdBQUcsNEJBQTRCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1QyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNYXN0cmEgd29ya3NwYWNlIGZhY3RvcnkgZm9yIERhdGFicmlja3MgQXBwcy5cbiAqXG4gKiBCdWlsZHMgbmF0aXZlIE1hc3RyYSB3b3Jrc3BhY2UgY29uZmlndXJhdGlvbiBmcm9tIERhdGFicmlja3MgcGF0aHMuIFBhdGhzXG4gKiBtb3VudCBhdCB0aGUgc2FtZSBwYXRoIGJ5IGRlZmF1bHQsIGB+YCByZXNvbHZlcyB0byB0aGUgY3VycmVudCB1c2VyJ3NcbiAqIERhdGFicmlja3Mgd29ya3NwYWNlIGhvbWUsIGFuZCBgL3RtcFsvc3VicGF0aF1gIHJlc29sdmVzIHRvIHN0YWJsZVxuICogdXNlci1zY29wZWQgc3RvcmFnZSB1bmRlciB0aGUgaG9zdCdzIGVwaGVtZXJhbCB0ZW1wIGRpcmVjdG9yeS5cbiAqXG4gKiBEYXRhYnJpY2tzIG1vdW50cyB1c2UgYEBkYngtdG9vbHMvZGF0YWJyaWNrc2Age0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtfVxuICogd3JhcHBlZCBieSB7QGxpbmsgZmlsZXN5c3RlbXN9OyBpbmFjY2Vzc2libGUgcm9vdHMgYXJlIHNraXBwZWQgaW5kZXBlbmRlbnRseS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uRXJyb3IsIGNyZWF0ZVdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYXBwa2l0LCBwbHVnaW5SZWdpc3RyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHtcbiAgZmlsZXNDYWNoZSBhcyBmaWxlc0NhY2hlUGx1Z2luLFxuICB0eXBlIEZpbGVzQ2FjaGVFeHBvcnRzLFxuICB0eXBlIEZpbGVzQ2FjaGVTY29wZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0L2ZpbGVzLWNhY2hlXCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzRmlsZVN5c3RlbSwgd29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYngtdG9vbHMvZGF0YWJyaWNrc1wiO1xuaW1wb3J0IHsgTG9jYWxGaWxlU3lzdGVtIH0gZnJvbSBcIkBkYngtdG9vbHMvZnNcIjtcbmltcG9ydCB7IG1hdGNoLCB0eXBlIFBhdGhNYXRjaElucHV0IH0gZnJvbSBcIkBkYngtdG9vbHMvcGF0aFwiO1xuaW1wb3J0IHsgZXJyb3JVdGlscywgbG9nLCBvYmplY3QsIHN0cmluZ1V0aWxzLCB0b2tlbiB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBmcyBhcyBzaGFyZWRGUyxcbiAgcG9zaXhQYXRoLFxuICB0eXBlIENhY2hlYWJsZUZpbGVTeXN0ZW1PcGVyYXRpb24sXG4gIHR5cGUgRmlsZVN5c3RlbSxcbiAgdHlwZSBGaWxlU3lzdGVtQ2FjaGUsXG4gIHR5cGUgRmlsZVN5c3RlbUNhY2hlT3B0aW9ucyxcbiAgTWVtb3J5RmlsZVN5c3RlbSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWZzXCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB7XG4gIFdvcmtzcGFjZSxcbiAgdHlwZSBTa2lsbHNSZXNvbHZlcixcbiAgdHlwZSBXb3Jrc3BhY2VDb25maWcsXG4gIHR5cGUgV29ya3NwYWNlRmlsZXN5c3RlbSxcbiAgdHlwZSBXb3Jrc3BhY2VTYW5kYm94LFxuICB0eXBlIFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlcixcbiAgdHlwZSBXb3Jrc3BhY2VUb29sc0NvbmZpZyxcbn0gZnJvbSBcIkBtYXN0cmEvY29yZS93b3Jrc3BhY2VcIjtcblxuaW1wb3J0IHtcbiAgTUFTVFJBX1NDT1BFU19LRVksXG4gIE1BU1RSQV9VU0VSX0VNQUlMX0tFWSxcbiAgTUFTVFJBX1VTRVJfS0VZLFxuICByZXNvbHZlVXNlcktleSxcbiAgdHlwZSBVc2VyLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7XG4gIGZpbGVzeXN0ZW1zLFxuICBNb3VudGVkQ29tcG9zaXRlRmlsZXN5c3RlbSxcbiAgdHlwZSBNYXN0cmFGaWxlU3lzdGVtQWRhcHRlck9wdGlvbnMsXG59IGZyb20gXCIuL2ZpbGVzeXN0ZW1zLnRzXCI7XG5pbXBvcnQgeyBNb250eVNhbmRib3ggfSBmcm9tIFwiLi9tb250eS1zYW5kYm94LnRzXCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzU2FuZGJveCwgdHlwZSBEYXRhYnJpY2tzV29ya3NwYWNlU2FuZGJveE9wdGlvbnMgfSBmcm9tIFwiLi9zYW5kYm94LnRzXCI7XG5pbXBvcnQgeyBPUkdBTklaQVRJT05fQVNTSVNUQU5UX1BBVEgsIHBlcnNvbmFsV29ya3NwYWNlUGF0aCB9IGZyb20gXCIuL3NraWxsLXBhdGhzLnRzXCI7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBPQXV0aCBzY29wZXMgdGhhdCBnYXRlIERhdGFicmlja3Mgd29ya3NwYWNlIGZpbGUgbW91bnRzLiAqL1xuY29uc3QgV09SS1NQQUNFX0ZJTEVfU0NPUEVTID0gW1wid29ya3NwYWNlXCIsIFwid29ya3NwYWNlLndvcmtzcGFjZVwiLCBcImFsbC1hcGlzXCJdIGFzIGNvbnN0O1xuY29uc3QgU0NSQVRDSF9NT1VOVCA9IFwiL3RtcFwiO1xuY29uc3QgQ0FDSEVBQkxFX0ZJTEVTWVNURU1fT1BFUkFUSU9OUyA9IFtcbiAgXCJleGlzdHNcIixcbiAgXCJyZWFkRmlsZVwiLFxuICBcInJlYWRkaXJcIixcbiAgXCJzdGF0XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSBDYWNoZWFibGVGaWxlU3lzdGVtT3BlcmF0aW9uW107XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvd29ya3NwYWNlc1wiKTtcbmxldCB3b3Jrc3BhY2VTb3VyY2VTZXF1ZW5jZSA9IDA7XG5jb25zdCBkYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucyA9IG5ldyBXZWFrTWFwPFdvcmtzcGFjZSwgRGF0YWJyaWNrc1dvcmtzcGFjZU9wdGlvbnM+KCk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBQZXItcmVxdWVzdCBjb250ZXh0IGZvciBtb3VudCBhbmQgc2tpbGwtZm9sZGVyIHJlc29sdmVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQge1xuICByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0O1xufVxuXG4vKipcbiAqIE9uZSBEYXRhYnJpY2tzIHBhdGggbW91bnRlZCBpbnRvIGEgTWFzdHJhIHdvcmtzcGFjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aE9wdGlvbnMge1xuICAvKiogQWJzb2x1dGUgRGF0YWJyaWNrcyBwYXRoIG9yIGB+YCBzaG9ydGN1dCBmb3IgdGhlIGN1cnJlbnQgdXNlcidzIHdvcmtzcGFjZSBob21lLiAqL1xuICBwYXRoOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1mcmllbmRseSBtb3VudCBuYW1lIHNob3duIGluIGZpbGVzeXN0ZW0gbGlzdGluZ3MuICovXG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICAvKiogTW91bnQgZGVzY3JpcHRpb24gc2hvd24gaW4gZmlsZXN5c3RlbSBsaXN0aW5ncyBhbmQgd29ya3NwYWNlIGluc3RydWN0aW9ucy4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTY2FuIHRoaXMgbW91bnQgZm9yIGBTS0lMTC5tZGAgZmlsZXMuIERlZmF1bHRzIHRvIGB0cnVlYDsgYGZhbHNlYCBtb3VudHNcbiAgICogdGhlIGxvY2F0aW9uIGZvciBmaWxlIHRvb2xzIHdpdGhvdXQgYWRkaW5nIGl0IHRvIHNraWxsIGRpc2NvdmVyeS5cbiAgICovXG4gIHJlYWRhYmxlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNraWxsIHJvb3RzIHJlbGF0aXZlIHRvIHRoaXMgZmlsZXN5c3RlbSByb290LiBEZWZhdWx0cyB0byBgW1wiLlwiXWAuXG4gICAqIEVhY2ggcGF0aCBpcyBqb2luZWQgdG8gdGhlIGFjdHVhbCBtb3VudCBwYXRoIGJlZm9yZSBNYXN0cmEgc2NhbnMgaXQuXG4gICAqL1xuICBza2lsbHM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIEFsbG93IHdyaXRlIGF0dGVtcHRzIHRvIGEge0BsaW5rIHBhdGh9IG1vdW50LiBEZWZhdWx0cyB0byBgdHJ1ZWAgZm9yXG4gICAqIGAvV29ya3NwYWNlYCByb290cyBhbmQgYGZhbHNlYCBlbHNld2hlcmUuIERhdGFicmlja3MgcGVybWlzc2lvbnMgc3RpbGxcbiAgICogZGV0ZXJtaW5lIHdoZXRoZXIgZWFjaCBtdXRhdGlvbiBzdWNjZWVkcy5cbiAgICovXG4gIHdyaXRhYmxlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIHdyaXRhYmxlIHtAbGluayBwYXRofSByb290IHdoZW4gbWlzc2luZy4gRGVmYXVsdHMgdG9cbiAgICoge0BsaW5rIHdyaXRhYmxlfTsgc2V0IGBmYWxzZWAgZm9yIHByZS1leGlzdGluZyByb290cyB3aXRoIGNvbmRpdGlvbmFsIGFjY2Vzcy5cbiAgICovXG4gIGNyZWF0ZVJvb3Q/OiBib29sZWFuO1xuICAvKiogTW91bnQgcG9pbnQgaW4gdGhlIGNvbXBvc2l0ZSBuYW1lc3BhY2UuIERhdGFicmlja3MgcGF0aHMgZGVmYXVsdCB0byB0aGVpciBhY3R1YWwgcm9vdC4gKi9cbiAgbW91bnQ/OiBzdHJpbmc7XG59XG5cbi8qKiBTdHJpbmcgc2hvcnRoYW5kIG9yIGZ1bGwgb3B0aW9ucyBmb3Igb25lIERhdGFicmlja3Mgd29ya3NwYWNlIHBhdGguICovXG5leHBvcnQgdHlwZSBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aCA9IHN0cmluZyB8IERhdGFicmlja3NXb3Jrc3BhY2VQYXRoT3B0aW9ucztcblxuLyoqIEZpeGVkIG9yIHJlcXVlc3QtZGVwZW5kZW50IERhdGFicmlja3MgcGF0aCBlbnRyeS4gKi9cbmV4cG9ydCB0eXBlIERhdGFicmlja3NXb3Jrc3BhY2VQYXRoVmFsdWUgPVxuICB8IERhdGFicmlja3NXb3Jrc3BhY2VQYXRoXG4gIHwgZmFsc2VcbiAgfCAoKFxuICAgICAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4gICAgKSA9PlxuICAgICAgfCBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aFxuICAgICAgfCBmYWxzZVxuICAgICAgfCB1bmRlZmluZWRcbiAgICAgIHwgUHJvbWlzZTxEYXRhYnJpY2tzV29ya3NwYWNlUGF0aCB8IGZhbHNlIHwgdW5kZWZpbmVkPik7XG5cbi8qKiBPcGVyYXRpb25zIGFuZCBwYXRoIGdsb2JzIGNhY2hlZCBieSB0aGUgRGF0YWJyaWNrcyBmaWxlc3lzdGVtIHNob3J0Y3V0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXIge1xuICAvKiogQ2FjaGVkIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucy4gT21pdCBmb3IgYGV4aXN0c2AsIGByZWFkRmlsZWAsIGByZWFkZGlyYCwgYW5kIGBzdGF0YC4gKi9cbiAgb3BlcmF0aW9ucz86IENhY2hlYWJsZUZpbGVTeXN0ZW1PcGVyYXRpb24gfCByZWFkb25seSBDYWNoZWFibGVGaWxlU3lzdGVtT3BlcmF0aW9uW107XG4gIC8qKiBBYnNvbHV0ZSBvciByb290LXJlbGF0aXZlIGdsb2JzIGFuZCBwcmVkaWNhdGVzLiBgfmAgZXhwYW5kcyBwZXIgcmVxdWVzdC4gKi9cbiAgcGF0aHM/OiBQYXRoTWF0Y2hJbnB1dCB8IHJlYWRvbmx5IFBhdGhNYXRjaElucHV0W107XG59XG5cbi8qKiBGaXhlZCBvciByZXF1ZXN0LWRlcGVuZGVudCBmaWxlc3lzdGVtIGNhY2hlIHNlbGVjdGlvbi4gKi9cbmV4cG9ydCB0eXBlIERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZSA9XG4gIHwgYm9vbGVhblxuICB8IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlclxuICB8IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlcltdXG4gIHwgKChcbiAgICAgIGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LFxuICAgICkgPT5cbiAgICAgIHwgYm9vbGVhblxuICAgICAgfCBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXJcbiAgICAgIHwgcmVhZG9ubHkgRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlRmlsdGVyW11cbiAgICAgIHwgdW5kZWZpbmVkXG4gICAgICB8IFByb21pc2U8XG4gICAgICAgICAgfCBib29sZWFuXG4gICAgICAgICAgfCBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXJcbiAgICAgICAgICB8IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlcltdXG4gICAgICAgICAgfCB1bmRlZmluZWRcbiAgICAgICAgPik7XG5cbi8qKiBNb3VudCBtYXAgcGx1cyBvcHRpb25hbCBNYXN0cmEgc2tpbGwgc2NhbiByb290cyByZXNvbHZlZCBmb3Igb25lIHJlcXVlc3QuICovXG5pbnRlcmZhY2UgV29ya3NwYWNlTW91bnRDb250cmlidXRpb24ge1xuICBtb3VudHM6IFJlY29yZDxzdHJpbmcsIFdvcmtzcGFjZUZpbGVzeXN0ZW0+O1xuICAvKiogUGF0aHMgd2l0aGluIHRoZSBjb21wb3NpdGUgbmFtZXNwYWNlIHdoZXJlIGBTS0lMTC5tZGAgZmlsZXMgYXJlIHNjYW5uZWQuICovXG4gIHNraWxsUGF0aHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqIEludGVybmFsIGZpbGVzeXN0ZW0gY29udHJpYnV0aW9uIHJlc29sdmVyLiAqL1xudHlwZSBXb3Jrc3BhY2VNb3VudFJlc29sdmVyID0gKFxuICBjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCxcbikgPT4gV29ya3NwYWNlTW91bnRDb250cmlidXRpb24gfCBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPjtcblxuLyoqXG4gKiBTYW5kYm94IHNlbGVjdGlvbiBmb3Ige0BsaW5rIGRhdGFicmlja3NXb3Jrc3BhY2V9LiBNb250eSBpcyB0aGUgZGVmYXVsdDtcbiAqIGBmYWxzZWAgZGlzYWJsZXMgY29tbWFuZCBleGVjdXRpb24sIGFuZCBhIE1hc3RyYSBwcm92aWRlciBvciByZXNvbHZlciBpcyBhblxuICogZXhwbGljaXQgcmVwbGFjZW1lbnQuXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb24gPVxuICB8IGZhbHNlXG4gIHwgXCJkYXRhYnJpY2tzXCJcbiAgfCBcIm1vbnR5XCJcbiAgfCBEYXRhYnJpY2tzV29ya3NwYWNlU2FuZGJveE9wdGlvbnNcbiAgfCBXb3Jrc3BhY2VTYW5kYm94XG4gIHwgV29ya3NwYWNlU2FuZGJveFJlc29sdmVyO1xuXG4vKiogTmF0aXZlIE1hc3RyYSB3b3Jrc3BhY2Ugb3B0aW9ucyBwbHVzIERhdGFicmlja3MgcGF0aCBzaG9ydGN1dHMuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFicmlja3NXb3Jrc3BhY2VPcHRpb25zIGV4dGVuZHMgT21pdDxcbiAgV29ya3NwYWNlQ29uZmlnLFxuICBcImZpbGVzeXN0ZW1cIiB8IFwibW91bnRzXCIgfCBcInNhbmRib3hcIiB8IFwic2tpbGxzXCJcbj4ge1xuICAvKipcbiAgICogU3RhcnQgZnJvbSB7QGxpbmsgREVGQVVMVF9EQVRBQlJJQ0tTX1dPUktTUEFDRV9QQVRIU30uIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIGFzc2lzdGFudFBhdGhzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIERhdGFicmlja3MgcGF0aHMgYXBwZW5kZWQgYWZ0ZXIgdGhlIGRlZmF1bHRzLiBBIHN0cmluZyBpcyBzaG9ydGhhbmQgZm9yXG4gICAqIGB7IHBhdGggfWA7IGEgcmVzb2x2ZXIgbWF5IHJldHVybiBlaXRoZXIgZm9ybSBwZXIgcmVxdWVzdC5cbiAgICovXG4gIHBhdGhzPzogcmVhZG9ubHkgRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhWYWx1ZVtdO1xuICAvKiogTmF0aXZlIE1hc3RyYSBmaWxlc3lzdGVtcyBjb21wb3NlZCBiZXNpZGUgdGhlIERhdGFicmlja3MgcGF0aHMuICovXG4gIG1vdW50cz86IFJlY29yZDxzdHJpbmcsIFdvcmtzcGFjZUZpbGVzeXN0ZW0+O1xuICAvKiogUmVwbGFjZSB0aGUgYXV0by1idWlsdCBkeW5hbWljIHNraWxscyByZXNvbHZlci4gKi9cbiAgc2tpbGxzPzogU2tpbGxzUmVzb2x2ZXI7XG4gIC8qKiBGaWxlc3lzdGVtIGNhY2hlIGZpbHRlcnMuIElnbm9yZWQgd2hlbiB0aGUgQXBwS2l0IGZpbGVzLWNhY2hlIHBsdWdpbiBpcyBhYnNlbnQuICovXG4gIGNhY2hlPzogRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlO1xuICAvKiogQXBwS2l0IHBsdWdpbiBjb250ZXh0IHVzZWQgdG8gZGlzY292ZXIgb3B0aW9uYWwgc2libGluZyBjYXBhYmlsaXRpZXMuICovXG4gIHBsdWdpbkNvbnRleHQ/OiBwbHVnaW5SZWdpc3RyeS5QbHVnaW5Db250ZXh0TGlrZTtcbiAgLyoqXG4gICAqIENvbW1hbmQgc2FuZGJveC4gRGVmYXVsdHMgdG8gTW9udHkuIFBhc3MgYFwiZGF0YWJyaWNrc1wiYCBvciBhbiBvcHRpb25zXG4gICAqIG9iamVjdCBmb3IgRGF0YWJyaWNrcyBTYW5kYm94LCBgZmFsc2VgIHRvIGRpc2FibGUgY29tbWFuZCBleGVjdXRpb24sIG9yIGFuXG4gICAqIGV4cGxpY2l0IE1hc3RyYSBzYW5kYm94L3Byb3ZpZGVyIHJlc29sdmVyLlxuICAgKi9cbiAgc2FuZGJveD86IFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb247XG4gIC8qKlxuICAgKiBFeHRyYSBMT0NBTCBza2lsbCByb290cyBtb3VudGVkIHJlYWQtb25seSBmb3IgZXZlcnkgcmVxdWVzdCdzIHNraWxsIGRpc2NvdmVyeS5cbiAgICogVXNlZCBieSB0aGUgcGx1Z2luIHRvIHN1cmZhY2UgcmVtb3RlIHNraWxscyBwcm92aXNpb25lZCB0byBhIGxvY2FsIHRlbXBcbiAgICogZGlyIGF0IHN0YXJ0dXAgKHNlZSBgcmVtb3RlLXNraWxscy50c2ApLiBEYXRhYnJpY2tzLWhvc3RlZCByZW1vdGUgc2tpbGxzXG4gICAqIG5lZWQgbm8gZW50cnkgaGVyZSAtIHRoZXkgbGFuZCBpbiB0aGUgQXNzaXN0YW50IHRyZWUgdGhlIGJ1aWx0LWluIG1vdW50XG4gICAqIGFscmVhZHkgc2NhbnMuXG4gICAqL1xuICBleHRyYVNraWxsUGF0aHM/OiBzdHJpbmdbXTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkZWZhdWx0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRGVmYXVsdCBEYXRhYnJpY2tzIHBhdGhzIGZvciBzaGFyZWQgYW5kIGN1cnJlbnQtdXNlciBBZ2VudCBTa2lsbHMuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0RBVEFCUklDS1NfV09SS1NQQUNFX1BBVEhTOiByZWFkb25seSBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aE9wdGlvbnNbXSA9IFtcbiAge1xuICAgIHBhdGg6IE9SR0FOSVpBVElPTl9BU1NJU1RBTlRfUEFUSCxcbiAgICByZWFkYWJsZTogdHJ1ZSxcbiAgICBza2lsbHM6IFtcInNraWxsc1wiXSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBjcmVhdGVSb290OiBmYWxzZSxcbiAgfSxcbiAge1xuICAgIHBhdGg6IFwiflwiLFxuICAgIHJlYWRhYmxlOiB0cnVlLFxuICAgIHNraWxsczogW1wiLmFzc2lzdGFudC9za2lsbHNcIl0sXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgY3JlYXRlUm9vdDogZmFsc2UsXG4gIH0sXG5dO1xuXG4vKipcbiAqIENyZWF0ZSBhIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfSB3aXRoIHBlci1yZXF1ZXN0IERhdGFicmlja3MgbW91bnRzLlxuICpcbiAqIEBleGFtcGxlIERlZmF1bHQgRGF0YWJyaWNrcyBwYXRoc1xuICogYGBgdHNcbiAqIGRhdGFicmlja3NXb3Jrc3BhY2UoKVxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgVXNlIG9ubHkgZXhwbGljaXQgcGF0aHNcbiAqIGBgYHRzXG4gKiBkYXRhYnJpY2tzV29ya3NwYWNlKHtcbiAqICAgYXNzaXN0YW50UGF0aHM6IGZhbHNlLFxuICogICBwYXRoczogW1wifi9wcm9qZWN0XCIsIFwiL3RtcC9wcm9qZWN0XCIsIFwiL1ZvbHVtZXMvbWFpbi9kZWZhdWx0L2RhdGFcIl0sXG4gKiB9KVxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgQnVpbGQgYSBzdGFuZGFyZCBNYXN0cmEgd29ya3NwYWNlIHlvdXJzZWxmXG4gKiBgYGB0c1xuICogbmV3IFdvcmtzcGFjZSh7XG4gKiAgIC4uLmRhdGFicmlja3NXb3Jrc3BhY2VDb25maWcoeyBwYXRoczogW1wifi9wcm9qZWN0XCJdIH0pLFxuICogICBzYW5kYm94OiBteVNhbmRib3gsXG4gKiB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRhYnJpY2tzV29ya3NwYWNlQ29uZmlnKFxuICBvcHRpb25zOiBEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucyA9IHt9LFxuKTogV29ya3NwYWNlQ29uZmlnIHtcbiAgY29uc3QgeyBpZCwgbmFtZSB9ID0gcmVzb2x2ZVdvcmtzcGFjZUlkZW50aXR5KG9wdGlvbnMpO1xuICBjb25zdCBmaWxlc3lzdGVtU291cmNlS2V5ID0gYCR7aWR9OiR7Kyt3b3Jrc3BhY2VTb3VyY2VTZXF1ZW5jZX1gO1xuICBjb25zdCBwYXRocyA9IHJlc29sdmVEYXRhYnJpY2tzV29ya3NwYWNlUGF0aHMob3B0aW9ucyk7XG4gIGNvbnN0IGNvbmZpZ3VyZWRQYXRocyA9IHBhdGhzLmxlbmd0aDtcbiAgY29uc3QgZXh0cmFTa2lsbFBhdGhzID0gb3B0aW9ucy5leHRyYVNraWxsUGF0aHMgPz8gW107XG4gIGNvbnN0IGZpbGVzQ2FjaGUgPSBwbHVnaW5SZWdpc3RyeS5pbnN0YW5jZShvcHRpb25zLnBsdWdpbkNvbnRleHQsIGZpbGVzQ2FjaGVQbHVnaW4pPy5leHBvcnRzKCk7XG4gIGNvbnN0IGNvbmZpZ3VyZWRDYWNoZSA9IG9wdGlvbnMuY2FjaGU7XG4gIGNvbnN0IG1vdW50RmlsZXNDYWNoZSA9IGNvbmZpZ3VyZWRDYWNoZSA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBmaWxlc0NhY2hlO1xuICBjb25zdCByZXRhaW5GaWxlc3lzdGVtU291cmNlID1cbiAgICBtb3VudEZpbGVzQ2FjaGUgIT09IHVuZGVmaW5lZCAmJlxuICAgIHR5cGVvZiBjb25maWd1cmVkQ2FjaGUgIT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHBhdGhzLmV2ZXJ5KChwYXRoKSA9PiB0eXBlb2YgcGF0aCAhPT0gXCJmdW5jdGlvblwiKTtcbiAgY29uc3QgcmVzb2x2ZXJzID0gYnVpbGRNb3VudFJlc29sdmVycyhcbiAgICBwYXRocyxcbiAgICBvcHRpb25zLm1vdW50cyxcbiAgICBsb2NhbFNraWxsTW91bnRSZXNvbHZlcnMoZXh0cmFTa2lsbFBhdGhzKSxcbiAgICBtb3VudEZpbGVzQ2FjaGUsXG4gICAgY29uZmlndXJlZENhY2hlLFxuICApO1xuICBjb25zdCByZXNvbHZlQ29udHJpYnV0aW9uID0gY29udHJpYnV0aW9uUmVzb2x2ZXIocmVzb2x2ZXJzKTtcbiAgY29uc3QgcmVzb2x2ZUZpbGVzeXN0ZW0gPSAoY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQpID0+XG4gICAgcmVzb2x2ZVdvcmtzcGFjZUZpbGVzeXN0ZW0oXG4gICAgICByZXNvbHZlQ29udHJpYnV0aW9uLFxuICAgICAgY29udGV4dCxcbiAgICAgIHJldGFpbkZpbGVzeXN0ZW1Tb3VyY2UgPyBtb3VudEZpbGVzQ2FjaGUgOiB1bmRlZmluZWQsXG4gICAgICBmaWxlc3lzdGVtU291cmNlS2V5LFxuICAgICk7XG4gIGNvbnN0IHNraWxsczogU2tpbGxzUmVzb2x2ZXIgPVxuICAgIG9wdGlvbnMuc2tpbGxzID8/XG4gICAgKGFzeW5jICh7IHJlcXVlc3RDb250ZXh0IH0pID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB7IHJlcXVlc3RDb250ZXh0IH07XG4gICAgICBjb25zdCBjb250cmlidXRpb24gPSBhd2FpdCByZXNvbHZlQ29udHJpYnV0aW9uKGNvbnRleHQpO1xuICAgICAgcmV0dXJuIHJlc29sdmVEaXN0aW5jdFNraWxsUGF0aHMoXG4gICAgICAgIGF3YWl0IHJlc29sdmVGaWxlc3lzdGVtKGNvbnRleHQpLFxuICAgICAgICBjb250cmlidXRpb24uc2tpbGxQYXRocyA/PyBbXSxcbiAgICAgICk7XG4gICAgfSk7XG4gIGNvbnN0IGNoZWNrU2tpbGxGaWxlTXRpbWUgPSBvcHRpb25zLmNoZWNrU2tpbGxGaWxlTXRpbWUgPz8gZmFsc2U7XG4gIGNvbnN0IGJtMjUgPSBvcHRpb25zLmJtMjUgPz8gdHJ1ZTtcbiAgY29uc3Qgc2FuZGJveCA9IHJlc29sdmVXb3Jrc3BhY2VTYW5kYm94KG9wdGlvbnMuc2FuZGJveCwgaWQsIG5hbWUpO1xuICBjb25zdCB0b29scyA9IHdvcmtzcGFjZVRvb2xzKG9wdGlvbnMudG9vbHMpO1xuICBsb2dnZXIuZGVidWcoXCJ3b3Jrc3BhY2U6Y3JlYXRlXCIsIHtcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIHJlc29sdmVyQ291bnQ6IHJlc29sdmVycy5sZW5ndGgsXG4gICAgY29uZmlndXJlZFBhdGhzLFxuICAgIGN1c3RvbU1vdW50czogT2JqZWN0LmtleXMob3B0aW9ucy5tb3VudHMgPz8ge30pLmxlbmd0aCxcbiAgICBjdXN0b21Ta2lsbHNSZXNvbHZlcjogQm9vbGVhbihvcHRpb25zLnNraWxscyksXG4gICAgY2hlY2tTa2lsbEZpbGVNdGltZSxcbiAgICBibTI1LFxuICAgIGV4dHJhU2tpbGxQYXRoczogZXh0cmFTa2lsbFBhdGhzLmxlbmd0aCxcbiAgICBzYW5kYm94OiBzYW5kYm94ID8gc2FuZGJveE5hbWUob3B0aW9ucy5zYW5kYm94KSA6IFwiZGlzYWJsZWRcIixcbiAgfSk7XG5cbiAgY29uc3Qge1xuICAgIGFzc2lzdGFudFBhdGhzOiBfYXNzaXN0YW50UGF0aHMsXG4gICAgcGF0aHM6IF9wYXRocyxcbiAgICBtb3VudHM6IF9tb3VudHMsXG4gICAgc2tpbGxzOiBfc2tpbGxzLFxuICAgIGNhY2hlOiBfY2FjaGUsXG4gICAgcGx1Z2luQ29udGV4dDogX3BsdWdpbkNvbnRleHQsXG4gICAgc2FuZGJveDogX3NhbmRib3gsXG4gICAgZXh0cmFTa2lsbFBhdGhzOiBfZXh0cmFTa2lsbFBhdGhzLFxuICAgIC4uLndvcmtzcGFjZU9wdGlvbnNcbiAgfSA9IG9wdGlvbnM7XG4gIHJldHVybiB7XG4gICAgLi4ud29ya3NwYWNlT3B0aW9ucyxcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIGZpbGVzeXN0ZW06IHJlc29sdmVGaWxlc3lzdGVtLFxuICAgIC4uLihyZXNvbHZlcnMubGVuZ3RoID4gMCB8fCBvcHRpb25zLnNraWxsc1xuICAgICAgPyB7XG4gICAgICAgICAgc2tpbGxzLFxuICAgICAgICAgIGNoZWNrU2tpbGxGaWxlTXRpbWUsXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICAgIC4uLihzYW5kYm94XG4gICAgICA/IHtcbiAgICAgICAgICBzYW5kYm94LFxuICAgICAgICAgIGluc3RydWN0aW9uczogeyBkeW5hbWljU2FuZGJveDogXCJyZXNvbHZlXCIgYXMgY29uc3QgfSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgYm0yNSxcbiAgICB0b29scyxcbiAgfTtcbn1cblxuLyoqIENyZWF0ZSBhIG5hdGl2ZSBNYXN0cmEge0BsaW5rIFdvcmtzcGFjZX0gZnJvbSB7QGxpbmsgZGF0YWJyaWNrc1dvcmtzcGFjZUNvbmZpZ30uICovXG5leHBvcnQgZnVuY3Rpb24gZGF0YWJyaWNrc1dvcmtzcGFjZShvcHRpb25zOiBEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucyA9IHt9KTogV29ya3NwYWNlIHtcbiAgY29uc3Qgd29ya3NwYWNlID0gbmV3IFdvcmtzcGFjZShkYXRhYnJpY2tzV29ya3NwYWNlQ29uZmlnKG9wdGlvbnMpKTtcbiAgZGF0YWJyaWNrc1dvcmtzcGFjZU9wdGlvbnMuc2V0KHdvcmtzcGFjZSwgb3B0aW9ucyk7XG4gIHJldHVybiB3b3Jrc3BhY2U7XG59XG5cbi8qKiBAaW50ZXJuYWwgQmluZCBhIGNhbGxlci1jcmVhdGVkIERhdGFicmlja3Mgd29ya3NwYWNlIHRvIGl0cyBBcHBLaXQgcGx1Z2luIGNvbnRleHQuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0KFxuICB3b3Jrc3BhY2U6IFdvcmtzcGFjZSxcbiAgcGx1Z2luQ29udGV4dDogcGx1Z2luUmVnaXN0cnkuUGx1Z2luQ29udGV4dExpa2UgfCB1bmRlZmluZWQsXG4pOiBXb3Jrc3BhY2Uge1xuICBjb25zdCBvcHRpb25zID0gZGF0YWJyaWNrc1dvcmtzcGFjZU9wdGlvbnMuZ2V0KHdvcmtzcGFjZSk7XG4gIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnBsdWdpbkNvbnRleHQgIT09IHVuZGVmaW5lZCB8fCBwbHVnaW5Db250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gd29ya3NwYWNlO1xuICB9XG4gIHJldHVybiBkYXRhYnJpY2tzV29ya3NwYWNlKHsgLi4ub3B0aW9ucywgcGx1Z2luQ29udGV4dCB9KTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGRlZmF1bHQgYW5kIGNhbGxlci1wcm92aWRlZCBEYXRhYnJpY2tzIHBhdGhzIGluIHByaW9yaXR5IG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURhdGFicmlja3NXb3Jrc3BhY2VQYXRocyhcbiAgb3B0aW9uczogUGljazxEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucywgXCJhc3Npc3RhbnRQYXRoc1wiIHwgXCJwYXRoc1wiPiA9IHt9LFxuKTogRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhWYWx1ZVtdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi4ob3B0aW9ucy5hc3Npc3RhbnRQYXRocyA9PT0gZmFsc2UgPyBbXSA6IERFRkFVTFRfREFUQUJSSUNLU19XT1JLU1BBQ0VfUEFUSFMpLFxuICAgIC4uLihvcHRpb25zLnBhdGhzID8/IFtdKSxcbiAgXTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcml2YXRlIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5mdW5jdGlvbiB3b3Jrc3BhY2VUb29scyhjb25maWd1cmVkOiBXb3Jrc3BhY2VUb29sc0NvbmZpZyB8IHVuZGVmaW5lZCk6IFdvcmtzcGFjZVRvb2xzQ29uZmlnIHtcbiAgcmV0dXJuIHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIHJlcXVpcmVBcHByb3ZhbDogZmFsc2UsXG4gICAgLi4uY29uZmlndXJlZCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVdvcmtzcGFjZVNhbmRib3goXG4gIHNlbGVjdGlvbjogV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbiB8IHVuZGVmaW5lZCxcbiAgd29ya3NwYWNlSWQ6IHN0cmluZyxcbiAgd29ya3NwYWNlTmFtZTogc3RyaW5nLFxuKTogV29ya3NwYWNlU2FuZGJveCB8IFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBzZWxlY3Rpb24gPz8gXCJtb250eVwiO1xuICBpZiAoY29uZmlndXJlZCA9PT0gZmFsc2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChjb25maWd1cmVkID09PSBcIm1vbnR5XCIpIHJldHVybiBuZXcgTW9udHlTYW5kYm94KCk7XG4gIGlmICh0eXBlb2YgY29uZmlndXJlZCA9PT0gXCJmdW5jdGlvblwiIHx8IGlzU2FuZGJveChjb25maWd1cmVkKSkgcmV0dXJuIGNvbmZpZ3VyZWQ7XG5cbiAgY29uc3Qgb3B0aW9uczogRGF0YWJyaWNrc1dvcmtzcGFjZVNhbmRib3hPcHRpb25zID1cbiAgICBjb25maWd1cmVkID09PSBcImRhdGFicmlja3NcIiA/IHsgcHJvdmlkZXI6IFwiZGF0YWJyaWNrc1wiIH0gOiBjb25maWd1cmVkO1xuICByZXR1cm4gKHsgcmVxdWVzdENvbnRleHQgfSkgPT4ge1xuICAgIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICAgIGlmICghdXNlcikge1xuICAgICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICAgIFwiRGF0YWJyaWNrcyBzYW5kYm94IHVzZXIgY29udGV4dFwiLFxuICAgICAgICBcIkludm9rZSBjb21tYW5kIHRvb2xzIGZyb20gYW4gYWdlbnQgdHVybiBzZXJ2ZWQgYnkgdGhlIE1hc3RyYSBwbHVnaW4uXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBjb25maWd1cmVkSWQgPVxuICAgICAgdHlwZW9mIG9wdGlvbnMuc2FuZGJveElkID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBvcHRpb25zLnNhbmRib3hJZCh7IHJlcXVlc3RDb250ZXh0IH0pXG4gICAgICAgIDogb3B0aW9ucy5zYW5kYm94SWQ7XG4gICAgY29uc3Qgc2FuZGJveElkID0gY29uZmlndXJlZElkID8/IGRlZmF1bHRTYW5kYm94SWQod29ya3NwYWNlSWQsIHVzZXIuaWQpO1xuICAgIGNvbnN0IGNsaWVudCA9XG4gICAgICB0eXBlb2Ygb3B0aW9ucy5jbGllbnQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IG9wdGlvbnMuY2xpZW50KHsgcmVxdWVzdENvbnRleHQgfSlcbiAgICAgICAgOiAob3B0aW9ucy5jbGllbnQgPz8gY3JlYXRlV29ya3NwYWNlQ2xpZW50KCkpO1xuICAgIGNvbnN0IHtcbiAgICAgIHByb3ZpZGVyOiBfcHJvdmlkZXIsXG4gICAgICBzYW5kYm94SWQ6IF9zYW5kYm94SWQsXG4gICAgICBjbGllbnQ6IF9jbGllbnQsXG4gICAgICAuLi5zYW5kYm94T3B0aW9uc1xuICAgIH0gPSBvcHRpb25zO1xuICAgIHJldHVybiBuZXcgRGF0YWJyaWNrc1NhbmRib3goe1xuICAgICAgLi4uc2FuZGJveE9wdGlvbnMsXG4gICAgICBjbGllbnQsXG4gICAgICBzYW5kYm94SWQsXG4gICAgICBkaXNwbGF5TmFtZTogb3B0aW9ucy5kaXNwbGF5TmFtZSA/PyBgTWFzdHJhICR7d29ya3NwYWNlTmFtZX1gLFxuICAgIH0pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0U2FuZGJveElkKHdvcmtzcGFjZUlkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZGlnZXN0ID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgIC51cGRhdGUob2JqZWN0LnRvU3RhYmxlS2V5KHsgd29ya3NwYWNlSWQsIHVzZXJJZCB9KSlcbiAgICAuZGlnZXN0KFwiaGV4XCIpXG4gICAgLnNsaWNlKDAsIDMyKTtcbiAgcmV0dXJuIGBtYXN0cmEtJHtkaWdlc3R9YDtcbn1cblxuZnVuY3Rpb24gaXNTYW5kYm94KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgV29ya3NwYWNlU2FuZGJveCB7XG4gIHJldHVybiBCb29sZWFuKFxuICAgIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBcImlkXCIgaW4gdmFsdWUgJiYgXCJwcm92aWRlclwiIGluIHZhbHVlICYmIFwic3RhdHVzXCIgaW4gdmFsdWUsXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNhbmRib3hOYW1lKHNlbGVjdGlvbjogV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbiB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGlmIChzZWxlY3Rpb24gPT09IHVuZGVmaW5lZCB8fCBzZWxlY3Rpb24gPT09IFwibW9udHlcIikgcmV0dXJuIFwibW9udHlcIjtcbiAgaWYgKHNlbGVjdGlvbiA9PT0gXCJkYXRhYnJpY2tzXCIpIHJldHVybiBcImRhdGFicmlja3NcIjtcbiAgaWYgKHNlbGVjdGlvbiA9PT0gZmFsc2UpIHJldHVybiBcImRpc2FibGVkXCI7XG4gIGlmICh0eXBlb2Ygc2VsZWN0aW9uID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBcInJlc29sdmVyXCI7XG4gIHJldHVybiBpc1NhbmRib3goc2VsZWN0aW9uKSA/IHNlbGVjdGlvbi5wcm92aWRlciA6IChzZWxlY3Rpb24ucHJvdmlkZXIgPz8gXCJkYXRhYnJpY2tzXCIpO1xufVxuXG4vKipcbiAqIFJldHVybiB3aGV0aGVyIHRoZSByZXF1ZXN0IHRva2VuIGNhcnJpZXMgYSBzY29wZSB0aGF0IGFsbG93cyB3b3Jrc3BhY2VcbiAqIGZpbGUgQVBJIGFjY2VzcyAoYHdvcmtzcGFjZWAgb3IgYGFsbC1hcGlzYCBvbiB7QGxpbmsgTUFTVFJBX1NDT1BFU19LRVl9KS5cbiAqL1xuZnVuY3Rpb24gaGFzV29ya3NwYWNlRmlsZVNjb3BlKHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9rZW4uaW5jbHVkZXNBY2Nlc3NUb2tlblNjb3BlKFxuICAgIHJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1NDT1BFU19LRVkpLFxuICAgIFdPUktTUEFDRV9GSUxFX1NDT1BFUyxcbiAgKTtcbn1cblxuLyoqIFJlc29sdmUgdGhlIHJlcXVlc3QgY2xpZW50IGFuZCBhdXRob3JpemF0aW9uLXNhZmUgZmlsZXMtY2FjaGUgc2NvcGUuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRmlsZXNDYWNoZVNjb3BlKGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0KTogUHJvbWlzZTxcbiAgfCB7XG4gICAgICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudDtcbiAgICAgIHNjb3BlOiBGaWxlc0NhY2hlU2NvcGU7XG4gICAgfVxuICB8IHVuZGVmaW5lZFxuPiB7XG4gIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gY29udGV4dC5yZXF1ZXN0Q29udGV4dDtcbiAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBjbGllbnQgPSB1c2VyPy5leGVjdXRpb25Db250ZXh0LmNsaWVudCBhcyBXb3Jrc3BhY2VDbGllbnQgfCB1bmRlZmluZWQ7XG4gIGlmICghcmVxdWVzdENvbnRleHQgfHwgIXVzZXIgfHwgIWNsaWVudCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICBjbGllbnQsXG4gICAgc2NvcGU6IHtcbiAgICAgIGhvc3Q6IChhd2FpdCBjbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKSxcbiAgICAgIHVzZXJLZXk6IHJlc29sdmVVc2VyS2V5KHJlcXVlc3RDb250ZXh0KSxcbiAgICAgIC4uLihwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX1dPUktTUEFDRV9JRD8udHJpbSgpXG4gICAgICAgID8geyB3b3Jrc3BhY2VJZDogcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19XT1JLU1BBQ0VfSUQudHJpbSgpIH1cbiAgICAgICAgOiB7fSksXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqIEpvaW4gb25lIHJlbGF0aXZlIHNraWxsIHJvb3QgdG8gaXRzIGFjdHVhbCBjb21wb3NpdGUgbW91bnQgcGF0aC4gKi9cbmZ1bmN0aW9uIG1vdW50ZWRTa2lsbFBhdGgobW91bnQ6IHN0cmluZywgc2tpbGxSb290OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAocG9zaXhQYXRoLmlzQWJzb2x1dGUoc2tpbGxSb290KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFNraWxsIHBhdGggbXVzdCBiZSByZWxhdGl2ZSB0byBpdHMgbW91bnQ6ICR7c2tpbGxSb290fWApO1xuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwb3NpeFBhdGgubm9ybWFsaXplKHNraWxsUm9vdCk7XG4gIGlmICghbm9ybWFsaXplZC5vaykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFNraWxsIHBhdGggZXNjYXBlcyBpdHMgbW91bnQ6ICR7c2tpbGxSb290fWApO1xuICB9XG4gIHJldHVybiBwb3NpeFBhdGguam9pbihwb3NpeFBhdGgubm9ybWFsaXplUm9vdChtb3VudCksIG5vcm1hbGl6ZWQucGF0aC5zbGljZSgxKSk7XG59XG5cbi8qKiBSZXR1cm4gd2hldGhlciBhIERhdGFicmlja3MgcGF0aCBiZWxvbmdzIHRvIHRoZSB3cml0YWJsZSBXb3Jrc3BhY2UgbmFtZXNwYWNlLiAqL1xuZnVuY3Rpb24gaXNXb3Jrc3BhY2VSb290KHJvb3Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBub3JtYWxpemVkID0gcG9zaXhQYXRoLm5vcm1hbGl6ZVJvb3Qocm9vdCk7XG4gIHJldHVybiBub3JtYWxpemVkID09PSBcIi9Xb3Jrc3BhY2VcIiB8fCBub3JtYWxpemVkLnN0YXJ0c1dpdGgoXCIvV29ya3NwYWNlL1wiKTtcbn1cblxuLyoqXG4gKiBNb3VudCByZXNvbHZlciBmb3IgdGhlIG5hbWVkIHNraWxsIGZvbGRlcnMuXG4gKlxuICogR2F0ZXMgb24gd29ya3NwYWNlIGZpbGUgc2NvcGUgKG9yIGRldmVsb3BtZW50IG1vZGUpLCB0aGVuIG1vdW50cyBldmVyeVxuICogZm9sZGVyIHdob3NlIGxvY2F0aW9uIHJlc29sdmVzIGZvciB0aGlzIHJlcXVlc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTa2lsbEZvbGRlck1vdW50cyhcbiAgcGF0aHM6IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VQYXRoVmFsdWVbXSxcbiAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4gIGZpbGVzQ2FjaGU6IEZpbGVzQ2FjaGVFeHBvcnRzIHwgdW5kZWZpbmVkLFxuICBjYWNoZUNvbmZpZzogRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4ge1xuICBjb25zdCBtb3VudHM6IFJlY29yZDxzdHJpbmcsIFdvcmtzcGFjZUZpbGVzeXN0ZW0+ID0ge307XG4gIGNvbnN0IHNraWxsUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gY29udGV4dC5yZXF1ZXN0Q29udGV4dDtcblxuICBjb25zdCBjYW5Nb3VudERhdGFicmlja3MgPSBCb29sZWFuKHJlcXVlc3RDb250ZXh0ICYmIHNob3VsZE1vdW50U2tpbGxGb2xkZXJzKHJlcXVlc3RDb250ZXh0KSk7XG4gIGNvbnN0IHNjb3BlZCA9IGNhbk1vdW50RGF0YWJyaWNrcyA/IGF3YWl0IHJlc29sdmVGaWxlc0NhY2hlU2NvcGUoY29udGV4dCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGNsaWVudCA9IHNjb3BlZD8uY2xpZW50O1xuICBjb25zdCBmaWxlU3lzdGVtQ2FjaGUgPVxuICAgIGZpbGVzQ2FjaGUgJiYgc2NvcGVkID8gYXdhaXQgZmlsZXNDYWNoZS5mb3JTY29wZShzY29wZWQuc2NvcGUpIDogdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBwYXRoXSBvZiBwYXRocy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBjb25maWd1cmVkID0gYXdhaXQgcmVzb2x2ZURhdGFicmlja3NXb3Jrc3BhY2VQYXRoKHBhdGgsIGNvbnRleHQpO1xuICAgIGlmICghY29uZmlndXJlZCkgY29udGludWU7XG4gICAgaWYgKHBvc2l4UGF0aC5pc1dpdGhpblJvb3QoU0NSQVRDSF9NT1VOVCwgY29uZmlndXJlZC5wYXRoKSkge1xuICAgICAgY29uc3QgbW91bnQgPSBjb25maWd1cmVkLm1vdW50ID8/IGNvbmZpZ3VyZWQucGF0aDtcbiAgICAgIG1vdW50c1ttb3VudF0gPSB1c2VyVGVtcEZpbGVzeXN0ZW0oY29udGV4dCwgY29uZmlndXJlZC5wYXRoKTtcbiAgICAgIGlmIChjb25maWd1cmVkLnJlYWRhYmxlICE9PSBmYWxzZSkge1xuICAgICAgICBza2lsbFBhdGhzLnB1c2goLi4uKGNvbmZpZ3VyZWQuc2tpbGxzID8/IFtdKS5tYXAoKHBhdGgpID0+IG1vdW50ZWRTa2lsbFBhdGgobW91bnQsIHBhdGgpKSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFjYW5Nb3VudERhdGFicmlja3MpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIndvcmtzcGFjZS1wYXRoOnNraXBwZWRcIiwge1xuICAgICAgICBwYXRoOiBjb25maWd1cmVkLnBhdGgsXG4gICAgICAgIHJlYXNvbjogIXJlcXVlc3RDb250ZXh0ID8gXCJuby1yZXF1ZXN0LWNvbnRleHRcIiA6IFwibWlzc2luZy13b3Jrc3BhY2Utc2NvcGVcIixcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgcmVzb2x2ZVNraWxsRm9sZGVyRmlsZXN5c3RlbShjb25maWd1cmVkLCBjb250ZXh0LCBjYWNoZUNvbmZpZywge1xuICAgICAgY2xpZW50LFxuICAgICAgZmlsZVN5c3RlbUNhY2hlLFxuICAgIH0pO1xuICAgIGlmICghcmVzb2x2ZWQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG1vdW50ID0gY29uZmlndXJlZC5tb3VudCA/PyByZXNvbHZlZC5yb290O1xuICAgIGlmICghbW91bnQpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIndvcmtzcGFjZS1wYXRoOnNraXBwZWRcIiwgeyBpbmRleCwgcmVhc29uOiBcIm1pc3NpbmctbW91bnRcIiB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBtb3VudHNbbW91bnRdID0gcmVzb2x2ZWQuZmlsZXN5c3RlbTtcbiAgICBpZiAoY29uZmlndXJlZC5yZWFkYWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgIHNraWxsUGF0aHMucHVzaCguLi4oY29uZmlndXJlZC5za2lsbHMgPz8gW1wiLlwiXSkubWFwKChwYXRoKSA9PiBtb3VudGVkU2tpbGxQYXRoKG1vdW50LCBwYXRoKSkpO1xuICAgIH1cbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhcInNraWxsLWZvbGRlcnM6bW91bnRlZFwiLCB7XG4gICAgbW91bnRLZXlzOiBPYmplY3Qua2V5cyhtb3VudHMpLFxuICAgIHNraWxsUGF0aHMsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgbW91bnRzLFxuICAgIHNraWxsUGF0aHMsXG4gIH07XG59XG5cbmludGVyZmFjZSBSZXNvbHZlZERhdGFicmlja3NXb3Jrc3BhY2VQYXRoIHtcbiAgcGF0aDogc3RyaW5nO1xuICBkaXNwbGF5TmFtZT86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHJlYWRhYmxlPzogYm9vbGVhbjtcbiAgc2tpbGxzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIHdyaXRhYmxlPzogYm9vbGVhbjtcbiAgY3JlYXRlUm9vdD86IGJvb2xlYW47XG4gIG1vdW50Pzogc3RyaW5nO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGgoXG4gIHZhbHVlOiBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aFZhbHVlLFxuICBjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCxcbik6IFByb21pc2U8UmVzb2x2ZWREYXRhYnJpY2tzV29ya3NwYWNlUGF0aCB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBzZWxlY3RlZCA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gYXdhaXQgdmFsdWUoY29udGV4dCkgOiB2YWx1ZTtcbiAgaWYgKHNlbGVjdGVkID09PSBmYWxzZSB8fCBzZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBjb25maWd1cmVkID0gdHlwZW9mIHNlbGVjdGVkID09PSBcInN0cmluZ1wiID8geyBwYXRoOiBzZWxlY3RlZCB9IDogc2VsZWN0ZWQ7XG4gIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gcmVxdWVzdENvbnRleHRWYWx1ZXMoY29udGV4dC5yZXF1ZXN0Q29udGV4dCk7XG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9IHJlc29sdmVIb21lUGF0aChjb25maWd1cmVkLnBhdGgsIHJlcXVlc3RDb250ZXh0KTtcbiAgaWYgKCFyZXNvbHZlZFBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlc29sdmVkTW91bnQgPSByZXNvbHZlSG9tZVBhdGgoY29uZmlndXJlZC5tb3VudCwgcmVxdWVzdENvbnRleHQpO1xuICByZXR1cm4ge1xuICAgIC4uLmNvbmZpZ3VyZWQsXG4gICAgcGF0aDogcmVzb2x2ZWRQYXRoLFxuICAgIC4uLihyZXNvbHZlZE1vdW50ID8geyBtb3VudDogcmVzb2x2ZWRNb3VudCB9IDoge30pLFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgb25lIHNraWxsIGZvbGRlciB0byBhIE1hc3RyYSBmaWxlc3lzdGVtLCBvciBgdW5kZWZpbmVkYCB0byBza2lwIGl0XG4gKiBmb3IgdGhpcyByZXF1ZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlU2tpbGxGb2xkZXJGaWxlc3lzdGVtKFxuICBmb2xkZXI6IFJlc29sdmVkRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGgsXG4gIGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LFxuICBjYWNoZUNvbmZpZzogRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlIHwgdW5kZWZpbmVkLFxuICBjYWNoZToge1xuICAgIGNsaWVudDogV29ya3NwYWNlQ2xpZW50IHwgdW5kZWZpbmVkO1xuICAgIGZpbGVTeXN0ZW1DYWNoZTogRmlsZVN5c3RlbUNhY2hlIHwgdW5kZWZpbmVkO1xuICB9LFxuKTogUHJvbWlzZTxcbiAgfCB7XG4gICAgICBmaWxlc3lzdGVtOiBXb3Jrc3BhY2VGaWxlc3lzdGVtO1xuICAgICAgcm9vdD86IHN0cmluZztcbiAgICB9XG4gIHwgdW5kZWZpbmVkXG4+IHtcbiAgLy8gQSBwYXRoIG1vdW50IG5lZWRzIHRoZSByZXF1ZXN0J3MgT0JPIGNsaWVudCB0byByZWFjaCB0aGUgd29ya3NwYWNlLlxuICBpZiAoIWNhY2hlLmNsaWVudCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInNraWxsLWZvbGRlcjpza2lwcGVkXCIsIHtcbiAgICAgIHBhdGg6IGZvbGRlci5wYXRoLFxuICAgICAgcmVhc29uOiBcIm1pc3Npbmctb2JvLWNsaWVudFwiLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3Qgcm9vdCA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoZm9sZGVyLnBhdGgpO1xuICBpZiAoIXJvb3QpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHdyaXRhYmxlID0gZm9sZGVyLndyaXRhYmxlID8/IGlzV29ya3NwYWNlUm9vdChyb290KTtcbiAgY29uc3QgY2FjaGVPcHRpb25zID0gY2FjaGUuZmlsZVN5c3RlbUNhY2hlXG4gICAgPyBhd2FpdCByZXNvbHZlRmlsZUNhY2hlT3B0aW9ucyhcbiAgICAgICAgY2FjaGVDb25maWcsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIHJvb3QsXG4gICAgICAgIGZvbGRlci5yZWFkYWJsZSA9PT0gZmFsc2UgPyBbXSA6IChmb2xkZXIuc2tpbGxzID8/IFtcIi5cIl0pLFxuICAgICAgKVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGRhdGFicmlja3NGaWxlc3lzdGVtKFxuICAgIGNhY2hlLmNsaWVudCxcbiAgICByb290LFxuICAgICF3cml0YWJsZSxcbiAgICBmb2xkZXIuY3JlYXRlUm9vdCA/PyBmb2xkZXIud3JpdGFibGUgPT09IHRydWUsXG4gICAgY2FjaGUuZmlsZVN5c3RlbUNhY2hlLFxuICAgIGNhY2hlT3B0aW9ucyxcbiAgICB7XG4gICAgICAuLi4oZm9sZGVyLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogZm9sZGVyLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAuLi4oZm9sZGVyLmRpc3BsYXlOYW1lID8geyBkaXNwbGF5TmFtZTogZm9sZGVyLmRpc3BsYXlOYW1lIH0gOiB7fSksXG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIHJlc29sdmVkID8geyAuLi5yZXNvbHZlZCwgcm9vdCB9IDogdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQ2FjaGVDb25maWcoXG4gIHZhbHVlOiBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGUgfCB1bmRlZmluZWQsXG4gIGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LFxuKTogUHJvbWlzZTxcbiAgYm9vbGVhbiB8IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlciB8IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlcltdIHwgdW5kZWZpbmVkXG4+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gdmFsdWUoY29udGV4dCkgOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdENvbnRleHRWYWx1ZXMocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gcmVxdWVzdENvbnRleHQ/LnRvSlNPTigpID8/IHt9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlSG9tZVBhdGgoXG4gIGlucHV0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHJlcXVlc3RDb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChpbnB1dCk7XG4gIGlmICghdmFsdWUgfHwgKHZhbHVlICE9PSBcIn5cIiAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIn4vXCIpKSkgcmV0dXJuIHZhbHVlID8/IHVuZGVmaW5lZDtcbiAgY29uc3QgZW1haWxWYWx1ZSA9IHJlcXVlc3RDb250ZXh0W01BU1RSQV9VU0VSX0VNQUlMX0tFWV07XG4gIGNvbnN0IGVtYWlsID0gdHlwZW9mIGVtYWlsVmFsdWUgPT09IFwic3RyaW5nXCIgPyBzdHJpbmdVdGlscy50cmltVG9OdWxsKGVtYWlsVmFsdWUpIDogdW5kZWZpbmVkO1xuICBpZiAoIWVtYWlsKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBob21lID0gcGVyc29uYWxXb3Jrc3BhY2VQYXRoKGVtYWlsKTtcbiAgcmV0dXJuIHZhbHVlID09PSBcIn5cIiA/IGhvbWUgOiBgJHtob21lfS8ke3ZhbHVlLnNsaWNlKDIpfWA7XG59XG5cbmZ1bmN0aW9uIHRvUG9saWN5QXJyYXk8VD4odmFsdWU6IFQgfCByZWFkb25seSBUW10gfCB1bmRlZmluZWQpOiByZWFkb25seSBUW10ge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAodmFsdWUgYXMgcmVhZG9ubHkgVFtdKSA6IFt2YWx1ZSBhcyBUXTtcbn1cblxuZnVuY3Rpb24gY2FjaGVGaWx0ZXJNYXRjaGVzKFxuICBwb2xpY3k6IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlcixcbiAgb3BlcmF0aW9uOiBDYWNoZWFibGVGaWxlU3lzdGVtT3BlcmF0aW9uLFxuICBwYXRoOiBzdHJpbmcsXG4gIHJlcXVlc3RDb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcm9vdD86IHN0cmluZyxcbik6IGJvb2xlYW4ge1xuICBjb25zdCBvcGVyYXRpb25zID0gdG9Qb2xpY3lBcnJheShwb2xpY3kub3BlcmF0aW9ucyA/PyBDQUNIRUFCTEVfRklMRVNZU1RFTV9PUEVSQVRJT05TKTtcbiAgaWYgKCFvcGVyYXRpb25zLmluY2x1ZGVzKG9wZXJhdGlvbikpIHJldHVybiBmYWxzZTtcbiAgaWYgKHBvbGljeS5wYXRocyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgaW5wdXRzOiBQYXRoTWF0Y2hJbnB1dFtdID0gW107XG4gIGZvciAoY29uc3QgaW5wdXQgb2YgdG9Qb2xpY3lBcnJheTxQYXRoTWF0Y2hJbnB1dD4ocG9saWN5LnBhdGhzKSkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlucHV0cy5wdXNoKGlucHV0KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBleHBhbmRlZCA9IHJlc29sdmVIb21lUGF0aChpbnB1dCwgcmVxdWVzdENvbnRleHQpO1xuICAgIGlmICghZXhwYW5kZWQpIGNvbnRpbnVlO1xuICAgIGlucHV0cy5wdXNoKFxuICAgICAgIXJvb3QgfHwgcG9zaXhQYXRoLmlzQWJzb2x1dGUoZXhwYW5kZWQpIHx8IGV4cGFuZGVkLnN0YXJ0c1dpdGgoXCIqKlwiKVxuICAgICAgICA/IGV4cGFuZGVkXG4gICAgICAgIDogYCR7cG9zaXhQYXRoLm5vcm1hbGl6ZVJvb3Qocm9vdCl9LyR7ZXhwYW5kZWQucmVwbGFjZSgvXlxcLlxcLy8sIFwiXCIpfWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gaW5wdXRzLmxlbmd0aCA+IDAgJiYgbWF0Y2gudG9QYXRoTWF0Y2hlciguLi5pbnB1dHMpKHBhdGgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRmlsZUNhY2hlT3B0aW9ucyhcbiAgY29uZmlndXJlZDogRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlIHwgdW5kZWZpbmVkLFxuICBjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCxcbiAgcm9vdDogc3RyaW5nLFxuICBza2lsbFBhdGhzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IFByb21pc2U8RmlsZVN5c3RlbUNhY2hlT3B0aW9ucyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IHJlcXVlc3RDb250ZXh0VmFsdWVzKGNvbnRleHQucmVxdWVzdENvbnRleHQpO1xuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHJlc29sdmVDYWNoZUNvbmZpZyhjb25maWd1cmVkLCBjb250ZXh0KTtcbiAgaWYgKHJlc29sdmVkID09PSBmYWxzZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHJlc29sdmVkID09PSB1bmRlZmluZWQgfHwgcmVzb2x2ZWQgPT09IHRydWUpIHtcbiAgICBjb25zdCByb290cyA9IHNraWxsUGF0aHMubWFwKChwYXRoKSA9PiBtb3VudGVkU2tpbGxQYXRoKHJvb3QsIHBhdGgpKTtcbiAgICByZXR1cm4ge1xuICAgICAgb3BlcmF0aW9uczogQ0FDSEVBQkxFX0ZJTEVTWVNURU1fT1BFUkFUSU9OUyxcbiAgICAgIGZpbHRlcjogKG9wZXJhdGlvbiwgcGF0aCkgPT5cbiAgICAgICAgb3BlcmF0aW9uICE9PSBcInJlYWRGaWxlXCIgfHxcbiAgICAgICAgcm9vdHMuc29tZSgoc2tpbGxSb290KSA9PiBwb3NpeFBhdGguaXNXaXRoaW5Sb290KHNraWxsUm9vdCwgcGF0aCkpLFxuICAgIH07XG4gIH1cbiAgY29uc3QgcG9saWNpZXMgPSB0b1BvbGljeUFycmF5KHJlc29sdmVkKTtcbiAgaWYgKHBvbGljaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgb3BlcmF0aW9ucyA9IFtcbiAgICAuLi5uZXcgU2V0KFxuICAgICAgcG9saWNpZXMuZmxhdE1hcCgocG9saWN5KSA9PlxuICAgICAgICB0b1BvbGljeUFycmF5KHBvbGljeS5vcGVyYXRpb25zID8/IENBQ0hFQUJMRV9GSUxFU1lTVEVNX09QRVJBVElPTlMpLFxuICAgICAgKSxcbiAgICApLFxuICBdO1xuICByZXR1cm4ge1xuICAgIG9wZXJhdGlvbnMsXG4gICAgZmlsdGVyOiAob3BlcmF0aW9uLCBwYXRoKSA9PlxuICAgICAgcG9saWNpZXMuc29tZSgocG9saWN5KSA9PiBjYWNoZUZpbHRlck1hdGNoZXMocG9saWN5LCBvcGVyYXRpb24sIHBhdGgsIHJlcXVlc3RDb250ZXh0LCByb290KSksXG4gIH07XG59XG5cbi8qKlxuICogRmlsbCBpbiBgaWRgIGFuZCBgbmFtZWAgd2hlbiBlaXRoZXIgaXMgb21pdHRlZCBvbiB7QGxpbmsgRGF0YWJyaWNrc1dvcmtzcGFjZU9wdGlvbnN9LlxuICogU2x1Z2lmaWVzIGBuYW1lYCBpbnRvIGBpZGA7IHRva2VuaXplcyBgaWRgIGludG8gYSBkaXNwbGF5IGBuYW1lYC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVdvcmtzcGFjZUlkZW50aXR5KG9wdGlvbnM6IERhdGFicmlja3NXb3Jrc3BhY2VPcHRpb25zKToge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG59IHtcbiAgbGV0IGlkID0gb3B0aW9ucy5pZDtcbiAgbGV0IG5hbWUgPSBvcHRpb25zLm5hbWU7XG4gIGlmICghaWQpIHtcbiAgICBpZCA9IG5hbWUgPyBzdHJpbmdVdGlscy50b1NsdWcobmFtZSkgOiBcIndvcmtzcGFjZVwiO1xuICB9XG4gIGlmICghbmFtZSkge1xuICAgIG5hbWUgPSBBcnJheS5mcm9tKHN0cmluZ1V0aWxzLnRva2VuaXplKGlkKSkuam9pbihcIiBcIik7XG4gIH1cbiAgcmV0dXJuIHsgaWQsIG5hbWUgfTtcbn1cblxuLyoqIENvbGxlY3QgdGhlIHNraWxsLWZvbGRlciByZXNvbHZlciBhbmQgYW55IGNhbGxlci1zdXBwbGllZCBvbmVzLiAqL1xuZnVuY3Rpb24gYnVpbGRNb3VudFJlc29sdmVycyhcbiAgcGF0aHM6IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VQYXRoVmFsdWVbXSxcbiAgbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBXb3Jrc3BhY2VGaWxlc3lzdGVtPiB8IHVuZGVmaW5lZCxcbiAgbG9jYWxNb3VudHM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSxcbiAgZmlsZXNDYWNoZTogRmlsZXNDYWNoZUV4cG9ydHMgfCB1bmRlZmluZWQsXG4gIGNhY2hlQ29uZmlnOiBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGUgfCB1bmRlZmluZWQsXG4pOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10ge1xuICBjb25zdCByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSA9IFtdO1xuICBjb25zdCBwYXRoQ291bnQgPSBwYXRocy5sZW5ndGg7XG4gIGlmIChwYXRoQ291bnQgPiAwKSB7XG4gICAgcmVzb2x2ZXJzLnB1c2goKGNvbnRleHQpID0+IHJlc29sdmVTa2lsbEZvbGRlck1vdW50cyhwYXRocywgY29udGV4dCwgZmlsZXNDYWNoZSwgY2FjaGVDb25maWcpKTtcbiAgfVxuICBpZiAobW91bnRzICYmIE9iamVjdC5rZXlzKG1vdW50cykubGVuZ3RoID4gMCkgcmVzb2x2ZXJzLnB1c2goKCkgPT4gKHsgbW91bnRzIH0pKTtcbiAgcmVzb2x2ZXJzLnB1c2goLi4ubG9jYWxNb3VudHMpO1xuICBsb2dnZXIuZGVidWcoXCJtb3VudHM6cmVzb2x2ZXJzXCIsIHtcbiAgICBwYXRoQ291bnQsXG4gICAgY3VzdG9tTW91bnRDb3VudDogT2JqZWN0LmtleXMobW91bnRzID8/IHt9KS5sZW5ndGgsXG4gICAgbG9jYWxNb3VudENvdW50OiBsb2NhbE1vdW50cy5sZW5ndGgsXG4gICAgdG90YWxSZXNvbHZlckNvdW50OiByZXNvbHZlcnMubGVuZ3RoLFxuICB9KTtcbiAgcmV0dXJuIHJlc29sdmVycztcbn1cblxuLyoqIFN0YWJsZSB1c2VyLXNjb3BlZCBsb2NhbCBzdG9yYWdlIHVuZGVyIHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0ncyB0ZW1wIGRpcmVjdG9yeS4gKi9cbmZ1bmN0aW9uIHVzZXJUZW1wRmlsZXN5c3RlbShcbiAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4gIHdvcmtzcGFjZVBhdGg6IHN0cmluZyxcbik6IFdvcmtzcGFjZUZpbGVzeXN0ZW0ge1xuICBjb25zdCB1c2VyS2V5ID0gcmVzb2x2ZVVzZXJLZXkoY29udGV4dC5yZXF1ZXN0Q29udGV4dCk7XG4gIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAudXBkYXRlKG9iamVjdC50b1N0YWJsZUtleSh7IHBhY2thZ2U6IFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCIsIHVzZXJLZXkgfSkpXG4gICAgLmRpZ2VzdChcImhleFwiKVxuICAgIC5zbGljZSgwLCAxNik7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwb3NpeFBhdGgubm9ybWFsaXplUm9vdCh3b3Jrc3BhY2VQYXRoKTtcbiAgY29uc3QgcmVsYXRpdmUgPSBub3JtYWxpemVkID09PSBTQ1JBVENIX01PVU5UID8gXCJcIiA6IG5vcm1hbGl6ZWQuc2xpY2UoYCR7U0NSQVRDSF9NT1VOVH0vYC5sZW5ndGgpO1xuICBjb25zdCBzb3VyY2UgPSBuZXcgTG9jYWxGaWxlU3lzdGVtKHtcbiAgICByb290OiBqb2luKHRtcGRpcigpLCBcImRieC10b29sc1wiLCBcIm1hc3RyYVwiLCBkaWdlc3QsIHJlbGF0aXZlKSxcbiAgICByZWFkT25seTogZmFsc2UsXG4gICAgY3JlYXRlUm9vdDogdHJ1ZSxcbiAgfSk7XG4gIHJldHVybiBmaWxlc3lzdGVtcyhzb3VyY2UsIHtcbiAgICBkaXNwbGF5TmFtZTogXCJUZW1wb3JhcnkgRmlsZXNcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiVXNlci1zY29wZWQgdGVtcG9yYXJ5IGZpbGVzIHJldGFpbmVkIHdoaWxlIHRoZSBob3N0IGtlZXBzIGl0cyBlcGhlbWVyYWwgdGVtcCBzdG9yYWdlLlwiLFxuICB9KTtcbn1cblxuLyoqIE1vdW50IHN0YXJ0dXAtcHJvdmlzaW9uZWQgbG9jYWwgc2tpbGwgcm9vdHMgaW50byBNYXN0cmEncyB3b3Jrc3BhY2UgZmlsZXN5c3RlbS4gKi9cbmZ1bmN0aW9uIGxvY2FsU2tpbGxNb3VudFJlc29sdmVycyhwYXRoczogcmVhZG9ubHkgc3RyaW5nW10pOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10ge1xuICByZXR1cm4gWy4uLm5ldyBTZXQocGF0aHMubWFwKChwYXRoKSA9PiBwYXRoLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pKV0ubWFwKChyb290KSA9PiB7XG4gICAgY29uc3QgbW91bnQgPSBwb3NpeFBhdGgubm9ybWFsaXplUm9vdChyb290KTtcbiAgICBjb25zdCBzb3VyY2UgPSBuZXcgTG9jYWxGaWxlU3lzdGVtKHtcbiAgICAgIHJvb3QsXG4gICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgIGNyZWF0ZVJvb3Q6IGZhbHNlLFxuICAgIH0pO1xuICAgIGNvbnN0IGZpbGVzeXN0ZW0gPSBmaWxlc3lzdGVtcyhzb3VyY2UsIHsgcmVhZE9ubHk6IHRydWUgfSk7XG4gICAgcmV0dXJuICgpID0+ICh7XG4gICAgICBtb3VudHM6IHsgW21vdW50XTogZmlsZXN5c3RlbSB9LFxuICAgICAgc2tpbGxQYXRoczogW21vdW50XSxcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogR2F0ZSBza2lsbC1mb2xkZXIgbW91bnRzIG9uIHRoZSByZXF1ZXN0J3MgdG9rZW4uXG4gKlxuICogQWx3YXlzIGFsbG93cyBtb3VudHMgaW4gZGV2ZWxvcG1lbnQ7IGluIG90aGVyIGVudmlyb25tZW50cyByZXF1aXJlc1xuICoge0BsaW5rIGhhc1dvcmtzcGFjZUZpbGVTY29wZX0uXG4gKi9cbmZ1bmN0aW9uIHNob3VsZE1vdW50U2tpbGxGb2xkZXJzKHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCk6IGJvb2xlYW4ge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikgcmV0dXJuIHRydWU7XG4gIHJldHVybiBoYXNXb3Jrc3BhY2VGaWxlU2NvcGUocmVxdWVzdENvbnRleHQpO1xufVxuXG4vKipcbiAqIFdyYXAgYSB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW19IGFzIGEgTWFzdHJhIGZpbGVzeXN0ZW0uIE1pc3Npbmcgb3JcbiAqIGluYWNjZXNzaWJsZSByb290cyByZXR1cm4gYHVuZGVmaW5lZGAgc28gb3RoZXIgYWNjZXNzaWJsZSByb290cyByZW1haW5cbiAqIHVzYWJsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGF0YWJyaWNrc0ZpbGVzeXN0ZW0oXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICByb290OiBzdHJpbmcsXG4gIHJlYWRPbmx5OiBib29sZWFuID0gdHJ1ZSxcbiAgY3JlYXRlUm9vdDogYm9vbGVhbiA9ICFyZWFkT25seSxcbiAgZmlsZVN5c3RlbUNhY2hlPzogRmlsZVN5c3RlbUNhY2hlLFxuICBjYWNoZU9wdGlvbnM/OiBGaWxlU3lzdGVtQ2FjaGVPcHRpb25zLFxuICBhZGFwdGVyT3B0aW9uczogUGljazxNYXN0cmFGaWxlU3lzdGVtQWRhcHRlck9wdGlvbnMsIFwiZGVzY3JpcHRpb25cIiB8IFwiZGlzcGxheU5hbWVcIj4gPSB7fSxcbik6IFByb21pc2U8XG4gIHwge1xuICAgICAgZmlsZXN5c3RlbTogV29ya3NwYWNlRmlsZXN5c3RlbTtcbiAgICB9XG4gIHwgdW5kZWZpbmVkXG4+IHtcbiAgY29uc3QgZnMgPSBuZXcgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0oe1xuICAgIGNsaWVudDogKCkgPT4gd29ya3NwYWNlQ2xpZW50LnRvTGVnYWN5V29ya3NwYWNlQ2xpZW50KHJlcXVlc3RXb3Jrc3BhY2VDbGllbnQoY2xpZW50KSksXG4gICAgcm9vdCxcbiAgICByZWFkT25seSxcbiAgICBjcmVhdGVSb290LFxuICB9KTtcbiAgY29uc3QgY2FjaGVkID1cbiAgICBmaWxlU3lzdGVtQ2FjaGUgJiYgY2FjaGVPcHRpb25zID8gc2hhcmVkRlMuY2FjaGUoZnMsIGZpbGVTeXN0ZW1DYWNoZSwgY2FjaGVPcHRpb25zKSA6IGZzO1xuICBjb25zdCBzb3VyY2UgPSB2ZXJpZnlGaXJzdEZpbGVTeXN0ZW1BY2Nlc3MoY2FjaGVkLCAoKSA9PiBmcy5zdGF0KFwiLlwiKSwgcm9vdCk7XG4gIGNvbnN0IGZpbGVzeXN0ZW0gPSBmaWxlc3lzdGVtcyhzb3VyY2UsIHsgLi4uYWRhcHRlck9wdGlvbnMsIHJlYWRPbmx5IH0pO1xuICB0cnkge1xuICAgIGF3YWl0IGZpbGVzeXN0ZW0uaW5pdCgpO1xuICAgIGlmIChhd2FpdCBmaWxlc3lzdGVtLmV4aXN0cyhcIi5cIikpIHtcbiAgICAgIHJldHVybiB7IGZpbGVzeXN0ZW0gfTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImRhdGFicmlja3MtbW91bnQ6c2tpcHBlZFwiLCB7XG4gICAgICByb290LFxuICAgICAgcmVhZE9ubHksXG4gICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiogQGludGVybmFsIEtlZXAgc2VydmljZSBjb250ZXh0IGZyb20gcmVwbGFjaW5nIHRoZSByZXF1ZXN0LXNjb3BlZCB3b3Jrc3BhY2UgY2xpZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3RXb3Jrc3BhY2VDbGllbnQoXG4gIGluaXRpYWxDbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgZXhlY3V0aW9uQ29udGV4dDogUmV0dXJuVHlwZTxcbiAgICB0eXBlb2YgYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHRcbiAgPiA9IGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCksXG4pOiBXb3Jrc3BhY2VDbGllbnQge1xuICBpZiAoXG4gICAgZXhlY3V0aW9uQ29udGV4dCAmJlxuICAgIFwiaXNVc2VyQ29udGV4dFwiIGluIGV4ZWN1dGlvbkNvbnRleHQgJiZcbiAgICBleGVjdXRpb25Db250ZXh0LmlzVXNlckNvbnRleHQgPT09IHRydWVcbiAgKSB7XG4gICAgcmV0dXJuIGV4ZWN1dGlvbkNvbnRleHQuY2xpZW50O1xuICB9XG4gIHJldHVybiBpbml0aWFsQ2xpZW50O1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlGaXJzdEZpbGVTeXN0ZW1BY2Nlc3M8VEZpbGVTeXN0ZW0gZXh0ZW5kcyBGaWxlU3lzdGVtPihcbiAgZmlsZXN5c3RlbTogVEZpbGVTeXN0ZW0sXG4gIHJlYWRQcm9iZTogKCkgPT4gUHJvbWlzZTx1bmtub3duPixcbiAgcm9vdDogc3RyaW5nLFxuKTogVEZpbGVTeXN0ZW0ge1xuICBsZXQgcmVhZENoZWNrOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICBsZXQgd3JpdGVWZXJpZmllZCA9IGZhbHNlO1xuICBjb25zdCBib3VuZE1ldGhvZHMgPSBuZXcgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPigpO1xuICBjb25zdCByZWFkT3BlcmF0aW9ucyA9IG5ldyBTZXQ8UHJvcGVydHlLZXk+KFtcImV4aXN0c1wiLCBcInJlYWRGaWxlXCIsIFwicmVhZGRpclwiLCBcInN0YXRcIl0pO1xuICBjb25zdCB3cml0ZU9wZXJhdGlvbnMgPSBuZXcgU2V0PFByb3BlcnR5S2V5PihbXG4gICAgXCJhcHBlbmRGaWxlXCIsXG4gICAgXCJjb3B5RmlsZVwiLFxuICAgIFwiZGVsZXRlRmlsZVwiLFxuICAgIFwibWtkaXJcIixcbiAgICBcIm1vdmVGaWxlXCIsXG4gICAgXCJybWRpclwiLFxuICAgIFwid3JpdGVGaWxlXCIsXG4gIF0pO1xuICBjb25zdCB2ZXJpZnlSZWFkID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHJlYWRDaGVjayA/Pz0gUHJvbWlzZS5yZXNvbHZlKHJlYWRQcm9iZSgpKS50aGVuKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlYWRDaGVjaztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmVhZENoZWNrID0gdW5kZWZpbmVkO1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiZGF0YWJyaWNrcy1tb3VudDpyZWFkLWNoZWNrLWZhaWxlZFwiLCB7XG4gICAgICAgIHJvb3QsXG4gICAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gbmV3IFByb3h5KGZpbGVzeXN0ZW0sIHtcbiAgICBnZXQodGFyZ2V0LCBwcm9wZXJ0eSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3BlcnR5LCB0YXJnZXQpO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdmFsdWU7XG4gICAgICBpZiAoYm91bmRNZXRob2RzLmhhcyhwcm9wZXJ0eSkpIHJldHVybiBib3VuZE1ldGhvZHMuZ2V0KHByb3BlcnR5KTtcbiAgICAgIGNvbnN0IGRlbGVnYXRlZCA9IHZhbHVlLmJpbmQodGFyZ2V0KSBhcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuICAgICAgbGV0IG1ldGhvZCA9IGRlbGVnYXRlZDtcbiAgICAgIGlmIChyZWFkT3BlcmF0aW9ucy5oYXMocHJvcGVydHkpKSB7XG4gICAgICAgIG1ldGhvZCA9IGFzeW5jICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgICBhd2FpdCB2ZXJpZnlSZWFkKCk7XG4gICAgICAgICAgcmV0dXJuIGRlbGVnYXRlZCguLi5hcmdzKTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAod3JpdGVPcGVyYXRpb25zLmhhcyhwcm9wZXJ0eSkpIHtcbiAgICAgICAgbWV0aG9kID0gYXN5bmMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWxlZ2F0ZWQoLi4uYXJncyk7XG4gICAgICAgICAgICBpZiAoIXdyaXRlVmVyaWZpZWQpIHtcbiAgICAgICAgICAgICAgd3JpdGVWZXJpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcImRhdGFicmlja3MtbW91bnQ6d3JpdGUtY2hlY2stcGFzc2VkXCIsIHsgcm9vdCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmICghd3JpdGVWZXJpZmllZCkge1xuICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXCJkYXRhYnJpY2tzLW1vdW50OndyaXRlLWNoZWNrLWZhaWxlZFwiLCB7XG4gICAgICAgICAgICAgICAgcm9vdCxcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyb3IpLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGJvdW5kTWV0aG9kcy5zZXQocHJvcGVydHksIG1ldGhvZCk7XG4gICAgICByZXR1cm4gbWV0aG9kO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFJ1biBldmVyeSBtb3VudCByZXNvbHZlciBmb3Igb25lIHJlcXVlc3QgYW5kIG1lcmdlIG1vdW50cyBwbHVzIHNraWxsIHBhdGhzLlxuICogTGF0ZXIgcmVzb2x2ZXJzIG92ZXJ3cml0ZSBtb3VudCBrZXlzIGZyb20gZWFybGllciBvbmVzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlQ29udHJpYnV0aW9uKFxuICByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSxcbiAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4pOiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPiB7XG4gIGNvbnN0IG1vdW50czogUmVjb3JkPHN0cmluZywgV29ya3NwYWNlRmlsZXN5c3RlbT4gPSB7fTtcbiAgY29uc3Qgc2tpbGxQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgcmVzb2x2ZXJdIG9mIHJlc29sdmVycy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBjb250cmlidXRpb24gPSBhd2FpdCByZXNvbHZlcihjb250ZXh0KTtcbiAgICBsb2dnZXIuZGVidWcoXCJtb3VudHM6cmVzb2x2ZXJcIiwge1xuICAgICAgaW5kZXgsXG4gICAgICBtb3VudEtleXM6IE9iamVjdC5rZXlzKGNvbnRyaWJ1dGlvbi5tb3VudHMpLFxuICAgICAgc2tpbGxQYXRoczogY29udHJpYnV0aW9uLnNraWxsUGF0aHMgPz8gW10sXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbihtb3VudHMsIGNvbnRyaWJ1dGlvbi5tb3VudHMpO1xuICAgIGlmIChjb250cmlidXRpb24uc2tpbGxQYXRocz8ubGVuZ3RoKSB7XG4gICAgICBza2lsbFBhdGhzLnB1c2goLi4uY29udHJpYnV0aW9uLnNraWxsUGF0aHMpO1xuICAgIH1cbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhcIm1vdW50czptZXJnZWRcIiwge1xuICAgIG1vdW50S2V5czogT2JqZWN0LmtleXMobW91bnRzKSxcbiAgICBza2lsbFBhdGhzLFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIG1vdW50cyxcbiAgICBza2lsbFBhdGhzLFxuICB9O1xufVxuXG4vKipcbiAqIER5bmFtaWMgZmlsZXN5c3RlbSByZXNvbHZlciBwYXNzZWQgdG8gTWFzdHJhIHtAbGluayBXb3Jrc3BhY2V9LlxuICpcbiAqIFJldHVybnMgYSB7QGxpbmsgQ29tcG9zaXRlRmlsZXN5c3RlbX0gb3ZlciBldmVyeSBwYXRoIHRoYXQgcmVzb2x2ZWQgZm9yIHRoZVxuICogcmVxdWVzdC4gQW4gZW1wdHkgY29tcG9zaXRlIGV4cG9zZXMgbm8gaW1wbGljaXQgbG9jYWwgc3RvcmFnZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVdvcmtzcGFjZUZpbGVzeXN0ZW0oXG4gIHJlc29sdmVDb250cmlidXRpb246IChjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCkgPT4gUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4sXG4gIGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LFxuICBmaWxlc0NhY2hlPzogRmlsZXNDYWNoZUV4cG9ydHMsXG4gIHNvdXJjZUtleT86IHN0cmluZyxcbik6IFByb21pc2U8V29ya3NwYWNlRmlsZXN5c3RlbT4ge1xuICBjb25zdCB7IG1vdW50cyB9ID0gYXdhaXQgcmVzb2x2ZUNvbnRyaWJ1dGlvbihjb250ZXh0KTtcbiAgY29uc3QgbW91bnRLZXlzID0gT2JqZWN0LmtleXMobW91bnRzKTtcbiAgaWYgKG1vdW50S2V5cy5sZW5ndGggPT09IDApIHtcbiAgICBsb2dnZXIuZGVidWcoXCJmaWxlc3lzdGVtOmVtcHR5XCIsIHtcbiAgICAgIGhhc1JlcXVlc3RDb250ZXh0OiBCb29sZWFuKGNvbnRleHQucmVxdWVzdENvbnRleHQpLFxuICAgIH0pO1xuICAgIHJldHVybiBmaWxlc3lzdGVtcyhuZXcgTWVtb3J5RmlsZVN5c3RlbSh7IHJvb3Q6IFwiL1wiLCByZWFkT25seTogdHJ1ZSB9KSwge1xuICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgfSk7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwiZmlsZXN5c3RlbTpjb21wb3NpdGVcIiwgeyBtb3VudEtleXMgfSk7XG4gIGNvbnN0IGxvYWQgPSAoKSA9PiBuZXcgTW91bnRlZENvbXBvc2l0ZUZpbGVzeXN0ZW0oeyBtb3VudHMgfSk7XG4gIGlmICghZmlsZXNDYWNoZSkgcmV0dXJuIGxvYWQoKTtcbiAgY29uc3Qgc2NvcGVkID0gYXdhaXQgcmVzb2x2ZUZpbGVzQ2FjaGVTY29wZShjb250ZXh0KTtcbiAgaWYgKCFzY29wZWQpIHJldHVybiBsb2FkKCk7XG4gIHJldHVybiBmaWxlc0NhY2hlLmZvckZpbGVTeXN0ZW0oc2NvcGVkLnNjb3BlLCB7IHBhdGhzOiBtb3VudEtleXMsIGtleTogc291cmNlS2V5IH0sIGxvYWQpO1xufVxuXG4vKipcbiAqIEV4cGFuZCBza2lsbCByb290cyBpbnRvIGNvbmNyZXRlIHNraWxsIGRpcmVjdG9yaWVzIGFuZCBrZWVwIHRoZSBmaXJzdFxuICogc2FtZS1uYW1lZCBkaXJlY3RvcnkuIE1hc3RyYSBzdGlsbCBvd25zIHBhcnNpbmcsIGluZGV4aW5nLCBhbmQgcmVmcmVzaGVzLFxuICogd2hpbGUgZWFybGllciBjb25maWd1cmVkIHJvb3RzIHJldGFpbiBwcmVjZWRlbmNlIG92ZXIgbGF0ZXIgcm9vdHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVEaXN0aW5jdFNraWxsUGF0aHMoXG4gIGZpbGVzeXN0ZW06IFdvcmtzcGFjZUZpbGVzeXN0ZW0sXG4gIHJvb3RzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qgc2VsZWN0ZWQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHJvb3Qgb2Ygcm9vdHMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZpbGVzeXN0ZW0ucmVhZGRpcihyb290KTtcbiAgICAgIGlmIChlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS50eXBlID09PSBcImZpbGVcIiAmJiBlbnRyeS5uYW1lID09PSBcIlNLSUxMLm1kXCIpKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBwb3NpeFBhdGguYmFzZW5hbWUocm9vdCk7XG4gICAgICAgIGlmICghc2VsZWN0ZWQuaGFzKG5hbWUpKSBzZWxlY3RlZC5zZXQobmFtZSwgcm9vdCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGlmIChlbnRyeS50eXBlICE9PSBcImRpcmVjdG9yeVwiIHx8IHNlbGVjdGVkLmhhcyhlbnRyeS5uYW1lKSkgY29udGludWU7XG4gICAgICAgIHNlbGVjdGVkLnNldChlbnRyeS5uYW1lLCBwb3NpeFBhdGguam9pbihyb290LCBlbnRyeS5uYW1lKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInNraWxsLXJvb3Q6c2tpcHBlZFwiLCB7XG4gICAgICAgIHJvb3QsXG4gICAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnJvciksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5zZWxlY3RlZC52YWx1ZXMoKV07XG59XG5cbi8qKiBNZW1vaXplIG9uZSBjb21wbGV0ZSBtb3VudCBjb250cmlidXRpb24gZm9yIGVhY2ggcmVxdWVzdCBjb250ZXh0LiAqL1xuZnVuY3Rpb24gY29udHJpYnV0aW9uUmVzb2x2ZXIoXG4gIHJlc29sdmVyczogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdLFxuKTogKGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0KSA9PiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPiB7XG4gIGNvbnN0IHNjb3BlZCA9IG5ldyBXZWFrTWFwPFJlcXVlc3RDb250ZXh0LCBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPj4oKTtcbiAgbGV0IHVuc2NvcGVkOiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPiB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIChjb250ZXh0KSA9PiB7XG4gICAgaWYgKCFjb250ZXh0LnJlcXVlc3RDb250ZXh0KSB7XG4gICAgICB1bnNjb3BlZCA/Pz0gcmVzb2x2ZVdvcmtzcGFjZUNvbnRyaWJ1dGlvbihyZXNvbHZlcnMsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIHVuc2NvcGVkO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZyA9IHNjb3BlZC5nZXQoY29udGV4dC5yZXF1ZXN0Q29udGV4dCk7XG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG4gICAgY29uc3QgcGVuZGluZyA9IHJlc29sdmVXb3Jrc3BhY2VDb250cmlidXRpb24ocmVzb2x2ZXJzLCBjb250ZXh0KTtcbiAgICBzY29wZWQuc2V0KGNvbnRleHQucmVxdWVzdENvbnRleHQsIHBlbmRpbmcpO1xuICAgIHJldHVybiBwZW5kaW5nO1xuICB9O1xufVxuIl19
730
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3Jrc3BhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0QsT0FBTyxFQUNMLFVBQVUsSUFBSSxnQkFBZ0IsR0FHL0IsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUF1QixNQUFNLGlCQUFpQixDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckYsT0FBTyxFQUNMLEVBQUUsSUFBSSxRQUFRLEVBQ2QsU0FBUyxFQUtULGdCQUFnQixHQUNqQixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFDTCxTQUFTLEdBT1YsTUFBTSx3QkFBd0IsQ0FBQztBQUVoQyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixlQUFlLEVBQ2YsY0FBYyxHQUVmLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCxXQUFXLEVBQ1gsMEJBQTBCLEdBRTNCLE1BQU0sa0JBQWtCLENBQUM7QUFD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Q0FBQyxDQUFDO1lBQzlELE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNwRCxJQUFJLFFBQVE7WUFBRSxPQUFPLFFBQVEsQ0FBQztRQUM5QixNQUFNLE9BQU8sR0FBRyw0QkFBNEIsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1hc3RyYSB3b3Jrc3BhY2UgZmFjdG9yeSBmb3IgRGF0YWJyaWNrcyBBcHBzLlxuICpcbiAqIEJ1aWxkcyBuYXRpdmUgTWFzdHJhIHdvcmtzcGFjZSBjb25maWd1cmF0aW9uIGZyb20gRGF0YWJyaWNrcyBwYXRocy4gUGF0aHNcbiAqIG1vdW50IGF0IHRoZSBzYW1lIHBhdGggYnkgZGVmYXVsdCwgYH5gIHJlc29sdmVzIHRvIHRoZSBjdXJyZW50IHVzZXInc1xuICogRGF0YWJyaWNrcyB3b3Jrc3BhY2UgaG9tZSwgYW5kIGAvdG1wWy9zdWJwYXRoXWAgcmVzb2x2ZXMgdG8gc3RhYmxlXG4gKiB1c2VyLXNjb3BlZCBzdG9yYWdlIHVuZGVyIHRoZSBob3N0J3MgZXBoZW1lcmFsIHRlbXAgZGlyZWN0b3J5LlxuICpcbiAqIERhdGFicmlja3MgbW91bnRzIHVzZSBgQGRieC10b29scy9kYXRhYnJpY2tzYCB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW19XG4gKiB3cmFwcGVkIGJ5IHtAbGluayBmaWxlc3lzdGVtc307IGluYWNjZXNzaWJsZSByb290cyBhcmUgc2tpcHBlZCBpbmRlcGVuZGVudGx5LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciwgY3JlYXRlV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBhcHBraXQsIHBsdWdpblJlZ2lzdHJ5IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQge1xuICBmaWxlc0NhY2hlIGFzIGZpbGVzQ2FjaGVQbHVnaW4sXG4gIHR5cGUgRmlsZXNDYWNoZUV4cG9ydHMsXG4gIHR5cGUgRmlsZXNDYWNoZVNjb3BlLFxufSBmcm9tIFwiQGRieC10b29scy9hcHBraXQvZmlsZXMtY2FjaGVcIjtcbmltcG9ydCB7IERhdGFicmlja3NGaWxlU3lzdGVtLCB3b3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRieC10b29scy9kYXRhYnJpY2tzXCI7XG5pbXBvcnQgeyBMb2NhbEZpbGVTeXN0ZW0gfSBmcm9tIFwiQGRieC10b29scy9mc1wiO1xuaW1wb3J0IHsgbWF0Y2gsIHR5cGUgUGF0aE1hdGNoSW5wdXQgfSBmcm9tIFwiQGRieC10b29scy9wYXRoXCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBsb2csIG9iamVjdCwgc3RyaW5nVXRpbHMsIHRva2VuIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIGZzIGFzIHNoYXJlZEZTLFxuICBwb3NpeFBhdGgsXG4gIHR5cGUgQ2FjaGVhYmxlRmlsZVN5c3RlbU9wZXJhdGlvbixcbiAgdHlwZSBGaWxlU3lzdGVtLFxuICB0eXBlIEZpbGVTeXN0ZW1DYWNoZSxcbiAgdHlwZSBGaWxlU3lzdGVtQ2FjaGVPcHRpb25zLFxuICBNZW1vcnlGaWxlU3lzdGVtLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZnNcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHtcbiAgV29ya3NwYWNlLFxuICB0eXBlIFNraWxsc1Jlc29sdmVyLFxuICB0eXBlIFdvcmtzcGFjZUNvbmZpZyxcbiAgdHlwZSBXb3Jrc3BhY2VGaWxlc3lzdGVtLFxuICB0eXBlIFdvcmtzcGFjZVNhbmRib3gsXG4gIHR5cGUgV29ya3NwYWNlU2FuZGJveFJlc29sdmVyLFxuICB0eXBlIFdvcmtzcGFjZVRvb2xzQ29uZmlnLFxufSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtzcGFjZVwiO1xuXG5pbXBvcnQge1xuICBNQVNUUkFfU0NPUEVTX0tFWSxcbiAgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLFxuICBNQVNUUkFfVVNFUl9LRVksXG4gIHJlc29sdmVVc2VyS2V5LFxuICB0eXBlIFVzZXIsXG59IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHtcbiAgZmlsZXN5c3RlbXMsXG4gIE1vdW50ZWRDb21wb3NpdGVGaWxlc3lzdGVtLFxuICB0eXBlIE1hc3RyYUZpbGVTeXN0ZW1BZGFwdGVyT3B0aW9ucyxcbn0gZnJvbSBcIi4vZmlsZXN5c3RlbXMudHNcIjtcbmltcG9ydCB7IE1vbnR5U2FuZGJveCB9IGZyb20gXCIuL21vbnR5LXNhbmRib3gudHNcIjtcbmltcG9ydCB7IERhdGFicmlja3NTYW5kYm94LCB0eXBlIERhdGFicmlja3NXb3Jrc3BhY2VTYW5kYm94T3B0aW9ucyB9IGZyb20gXCIuL3NhbmRib3gudHNcIjtcbmltcG9ydCB7IE9SR0FOSVpBVElPTl9BU1NJU1RBTlRfUEFUSCwgcGVyc29uYWxXb3Jrc3BhY2VQYXRoIH0gZnJvbSBcIi4vc2tpbGwtcGF0aHMudHNcIjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIE9BdXRoIHNjb3BlcyB0aGF0IGdhdGUgRGF0YWJyaWNrcyB3b3Jrc3BhY2UgZmlsZSBtb3VudHMuICovXG5jb25zdCBXT1JLU1BBQ0VfRklMRV9TQ09QRVMgPSBbXCJ3b3Jrc3BhY2VcIiwgXCJ3b3Jrc3BhY2Uud29ya3NwYWNlXCIsIFwiYWxsLWFwaXNcIl0gYXMgY29uc3Q7XG5jb25zdCBTQ1JBVENIX01PVU5UID0gXCIvdG1wXCI7XG5jb25zdCBDQUNIRUFCTEVfRklMRVNZU1RFTV9PUEVSQVRJT05TID0gW1xuICBcImV4aXN0c1wiLFxuICBcInJlYWRGaWxlXCIsXG4gIFwicmVhZGRpclwiLFxuICBcInN0YXRcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IENhY2hlYWJsZUZpbGVTeXN0ZW1PcGVyYXRpb25bXTtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS93b3Jrc3BhY2VzXCIpO1xubGV0IHdvcmtzcGFjZVNvdXJjZVNlcXVlbmNlID0gMDtcbmNvbnN0IGRhdGFicmlja3NXb3Jrc3BhY2VPcHRpb25zID0gbmV3IFdlYWtNYXA8V29ya3NwYWNlLCBEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucz4oKTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIFBlci1yZXF1ZXN0IGNvbnRleHQgZm9yIHdvcmtzcGFjZSBwYXRoIHJlc29sdmVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQge1xuICByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0O1xufVxuXG4vKipcbiAqIE9uZSBEYXRhYnJpY2tzIHBhdGggbW91bnRlZCBpbnRvIGEgTWFzdHJhIHdvcmtzcGFjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aE9wdGlvbnMge1xuICAvKiogQWJzb2x1dGUgRGF0YWJyaWNrcyBwYXRoIG9yIGB+YCBzaG9ydGN1dCBmb3IgdGhlIGN1cnJlbnQgdXNlcidzIHdvcmtzcGFjZSBob21lLiAqL1xuICBwYXRoOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1mcmllbmRseSBtb3VudCBuYW1lIHNob3duIGluIGZpbGVzeXN0ZW0gbGlzdGluZ3MuICovXG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICAvKiogTW91bnQgZGVzY3JpcHRpb24gc2hvd24gaW4gZmlsZXN5c3RlbSBsaXN0aW5ncyBhbmQgd29ya3NwYWNlIGluc3RydWN0aW9ucy4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTa2lsbCBwYXRocyByZWxhdGl2ZSB0byB0aGlzIGluY2x1ZGVkIGZpbGVzeXN0ZW0gcGF0aC4gT21pdCBmb3IgYVxuICAgKiBmaWxlLW9ubHkgbW91bnQuIEVhY2ggZW50cnkgaXMgam9pbmVkIHRvIHRoZSBhY3R1YWwgbW91bnQgcGF0aCBiZWZvcmVcbiAgICogTWFzdHJhIHJlY2VpdmVzIGl0LlxuICAgKi9cbiAgc2tpbGxzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKlxuICAgKiBBbGxvdyB3cml0ZSBhdHRlbXB0cyB0byBhIHtAbGluayBwYXRofSBtb3VudC4gRGVmYXVsdHMgdG8gYHRydWVgIGZvclxuICAgKiBgL1dvcmtzcGFjZWAgcm9vdHMgYW5kIGBmYWxzZWAgZWxzZXdoZXJlLiBEYXRhYnJpY2tzIHBlcm1pc3Npb25zIHN0aWxsXG4gICAqIGRldGVybWluZSB3aGV0aGVyIGVhY2ggbXV0YXRpb24gc3VjY2VlZHMuXG4gICAqL1xuICB3cml0YWJsZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDcmVhdGUgYSB3cml0YWJsZSB7QGxpbmsgcGF0aH0gcm9vdCB3aGVuIG1pc3NpbmcuIERlZmF1bHRzIHRvXG4gICAqIHtAbGluayB3cml0YWJsZX07IHNldCBgZmFsc2VgIGZvciBwcmUtZXhpc3Rpbmcgcm9vdHMgd2l0aCBjb25kaXRpb25hbCBhY2Nlc3MuXG4gICAqL1xuICBjcmVhdGVSb290PzogYm9vbGVhbjtcbiAgLyoqIE1vdW50IHBvaW50IGluIHRoZSBjb21wb3NpdGUgbmFtZXNwYWNlLiBEYXRhYnJpY2tzIHBhdGhzIGRlZmF1bHQgdG8gdGhlaXIgYWN0dWFsIHJvb3QuICovXG4gIG1vdW50Pzogc3RyaW5nO1xufVxuXG4vKiogU3RyaW5nIHNob3J0aGFuZCBvciBmdWxsIG9wdGlvbnMgZm9yIG9uZSBEYXRhYnJpY2tzIHdvcmtzcGFjZSBwYXRoLiAqL1xuZXhwb3J0IHR5cGUgRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGggPSBzdHJpbmcgfCBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aE9wdGlvbnM7XG5cbi8qKiBGaXhlZCBvciByZXF1ZXN0LWRlcGVuZGVudCBEYXRhYnJpY2tzIHBhdGggZW50cnkuICovXG5leHBvcnQgdHlwZSBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aFZhbHVlID1cbiAgfCBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aFxuICB8IGZhbHNlXG4gIHwgKChcbiAgICAgIGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LFxuICAgICkgPT5cbiAgICAgIHwgRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhcbiAgICAgIHwgZmFsc2VcbiAgICAgIHwgdW5kZWZpbmVkXG4gICAgICB8IFByb21pc2U8RGF0YWJyaWNrc1dvcmtzcGFjZVBhdGggfCBmYWxzZSB8IHVuZGVmaW5lZD4pO1xuXG4vKiogT3BlcmF0aW9ucyBhbmQgcGF0aCBnbG9icyBjYWNoZWQgYnkgdGhlIERhdGFicmlja3MgZmlsZXN5c3RlbSBzaG9ydGN1dC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlRmlsdGVyIHtcbiAgLyoqIENhY2hlZCBmaWxlc3lzdGVtIG9wZXJhdGlvbnMuIE9taXQgZm9yIGBleGlzdHNgLCBgcmVhZEZpbGVgLCBgcmVhZGRpcmAsIGFuZCBgc3RhdGAuICovXG4gIG9wZXJhdGlvbnM/OiBDYWNoZWFibGVGaWxlU3lzdGVtT3BlcmF0aW9uIHwgcmVhZG9ubHkgQ2FjaGVhYmxlRmlsZVN5c3RlbU9wZXJhdGlvbltdO1xuICAvKiogQWJzb2x1dGUgb3Igcm9vdC1yZWxhdGl2ZSBnbG9icyBhbmQgcHJlZGljYXRlcy4gYH5gIGV4cGFuZHMgcGVyIHJlcXVlc3QuICovXG4gIHBhdGhzPzogUGF0aE1hdGNoSW5wdXQgfCByZWFkb25seSBQYXRoTWF0Y2hJbnB1dFtdO1xufVxuXG4vKiogRml4ZWQgb3IgcmVxdWVzdC1kZXBlbmRlbnQgZmlsZXN5c3RlbSBjYWNoZSBzZWxlY3Rpb24uICovXG5leHBvcnQgdHlwZSBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGUgPVxuICB8IGJvb2xlYW5cbiAgfCBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXJcbiAgfCByZWFkb25seSBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXJbXVxuICB8ICgoXG4gICAgICBjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCxcbiAgICApID0+XG4gICAgICB8IGJvb2xlYW5cbiAgICAgIHwgRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlRmlsdGVyXG4gICAgICB8IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlcltdXG4gICAgICB8IHVuZGVmaW5lZFxuICAgICAgfCBQcm9taXNlPFxuICAgICAgICAgIHwgYm9vbGVhblxuICAgICAgICAgIHwgRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlRmlsdGVyXG4gICAgICAgICAgfCByZWFkb25seSBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXJbXVxuICAgICAgICAgIHwgdW5kZWZpbmVkXG4gICAgICAgID4pO1xuXG4vKiogTW91bnQgbWFwIHBsdXMgb3B0aW9uYWwgTWFzdHJhIHNraWxsIHNjYW4gcm9vdHMgcmVzb2x2ZWQgZm9yIG9uZSByZXF1ZXN0LiAqL1xuaW50ZXJmYWNlIFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uIHtcbiAgbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBXb3Jrc3BhY2VGaWxlc3lzdGVtPjtcbiAgLyoqIFBhdGhzIHdpdGhpbiB0aGUgY29tcG9zaXRlIG5hbWVzcGFjZSB3aGVyZSBgU0tJTEwubWRgIGZpbGVzIGFyZSBzY2FubmVkLiAqL1xuICBza2lsbFBhdGhzPzogc3RyaW5nW107XG59XG5cbi8qKiBJbnRlcm5hbCBmaWxlc3lzdGVtIGNvbnRyaWJ1dGlvbiByZXNvbHZlci4gKi9cbnR5cGUgV29ya3NwYWNlTW91bnRSZXNvbHZlciA9IChcbiAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4pID0+IFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uIHwgUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj47XG5cbi8qKlxuICogU2FuZGJveCBzZWxlY3Rpb24gZm9yIHtAbGluayBkYXRhYnJpY2tzV29ya3NwYWNlfS4gTW9udHkgaXMgdGhlIGRlZmF1bHQ7XG4gKiBgZmFsc2VgIGRpc2FibGVzIGNvbW1hbmQgZXhlY3V0aW9uLCBhbmQgYSBNYXN0cmEgcHJvdmlkZXIgb3IgcmVzb2x2ZXIgaXMgYW5cbiAqIGV4cGxpY2l0IHJlcGxhY2VtZW50LlxuICovXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VTYW5kYm94U2VsZWN0aW9uID1cbiAgfCBmYWxzZVxuICB8IFwiZGF0YWJyaWNrc1wiXG4gIHwgXCJtb250eVwiXG4gIHwgRGF0YWJyaWNrc1dvcmtzcGFjZVNhbmRib3hPcHRpb25zXG4gIHwgV29ya3NwYWNlU2FuZGJveFxuICB8IFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlcjtcblxuLyoqIE5hdGl2ZSBNYXN0cmEgd29ya3NwYWNlIG9wdGlvbnMgcGx1cyBEYXRhYnJpY2tzIHBhdGggc2hvcnRjdXRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucyBleHRlbmRzIE9taXQ8XG4gIFdvcmtzcGFjZUNvbmZpZyxcbiAgXCJmaWxlc3lzdGVtXCIgfCBcIm1vdW50c1wiIHwgXCJzYW5kYm94XCIgfCBcInNraWxsc1wiXG4+IHtcbiAgLyoqXG4gICAqIFN0YXJ0IGZyb20ge0BsaW5rIERFRkFVTFRfREFUQUJSSUNLU19XT1JLU1BBQ0VfUEFUSFN9LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICBhc3Npc3RhbnRQYXRocz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBEYXRhYnJpY2tzIHBhdGhzIGFwcGVuZGVkIGFmdGVyIHRoZSBkZWZhdWx0cy4gQSBzdHJpbmcgaXMgc2hvcnRoYW5kIGZvclxuICAgKiBgeyBwYXRoIH1gOyBhIHJlc29sdmVyIG1heSByZXR1cm4gZWl0aGVyIGZvcm0gcGVyIHJlcXVlc3QuXG4gICAqL1xuICBwYXRocz86IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VQYXRoVmFsdWVbXTtcbiAgLyoqIE5hdGl2ZSBNYXN0cmEgZmlsZXN5c3RlbXMgY29tcG9zZWQgYmVzaWRlIHRoZSBEYXRhYnJpY2tzIHBhdGhzLiAqL1xuICBtb3VudHM/OiBSZWNvcmQ8c3RyaW5nLCBXb3Jrc3BhY2VGaWxlc3lzdGVtPjtcbiAgLyoqIE5hdGl2ZSBNYXN0cmEgc2tpbGwgcGF0aHMgb3IgcmVzb2x2ZXIgY29tcG9zZWQgd2l0aCBwYXRoLWRlY2xhcmVkIHNraWxscy4gKi9cbiAgc2tpbGxzPzogU2tpbGxzUmVzb2x2ZXI7XG4gIC8qKiBGaWxlc3lzdGVtIGNhY2hlIGZpbHRlcnMuIElnbm9yZWQgd2hlbiB0aGUgQXBwS2l0IGZpbGVzLWNhY2hlIHBsdWdpbiBpcyBhYnNlbnQuICovXG4gIGNhY2hlPzogRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlO1xuICAvKiogQXBwS2l0IHBsdWdpbiBjb250ZXh0IHVzZWQgdG8gZGlzY292ZXIgb3B0aW9uYWwgc2libGluZyBjYXBhYmlsaXRpZXMuICovXG4gIHBsdWdpbkNvbnRleHQ/OiBwbHVnaW5SZWdpc3RyeS5QbHVnaW5Db250ZXh0TGlrZTtcbiAgLyoqXG4gICAqIENvbW1hbmQgc2FuZGJveC4gRGVmYXVsdHMgdG8gTW9udHkuIFBhc3MgYFwiZGF0YWJyaWNrc1wiYCBvciBhbiBvcHRpb25zXG4gICAqIG9iamVjdCBmb3IgRGF0YWJyaWNrcyBTYW5kYm94LCBgZmFsc2VgIHRvIGRpc2FibGUgY29tbWFuZCBleGVjdXRpb24sIG9yIGFuXG4gICAqIGV4cGxpY2l0IE1hc3RyYSBzYW5kYm94L3Byb3ZpZGVyIHJlc29sdmVyLlxuICAgKi9cbiAgc2FuZGJveD86IFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb247XG4gIC8qKlxuICAgKiBFeHRyYSBMT0NBTCBza2lsbCBwYXRocyBtb3VudGVkIHJlYWQtb25seSBmb3IgZXZlcnkgcmVxdWVzdCdzIHNraWxsIGRpc2NvdmVyeS5cbiAgICogVXNlZCBieSB0aGUgcGx1Z2luIHRvIHN1cmZhY2UgcmVtb3RlIHNraWxscyBwcm92aXNpb25lZCB0byBhIGxvY2FsIHRlbXBcbiAgICogZGlyIGF0IHN0YXJ0dXAgKHNlZSBgcmVtb3RlLXNraWxscy50c2ApLiBEYXRhYnJpY2tzLWhvc3RlZCByZW1vdGUgc2tpbGxzXG4gICAqIG5lZWQgbm8gZW50cnkgaGVyZSAtIHRoZXkgbGFuZCBpbiB0aGUgQXNzaXN0YW50IHRyZWUgdGhlIGJ1aWx0LWluIG1vdW50XG4gICAqIGFscmVhZHkgc2NhbnMuXG4gICAqL1xuICBleHRyYVNraWxsUGF0aHM/OiBzdHJpbmdbXTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkZWZhdWx0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRGVmYXVsdCBEYXRhYnJpY2tzIHBhdGhzIGZvciBzaGFyZWQgYW5kIGN1cnJlbnQtdXNlciBBZ2VudCBTa2lsbHMuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0RBVEFCUklDS1NfV09SS1NQQUNFX1BBVEhTOiByZWFkb25seSBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aE9wdGlvbnNbXSA9IFtcbiAge1xuICAgIHBhdGg6IE9SR0FOSVpBVElPTl9BU1NJU1RBTlRfUEFUSCxcbiAgICBza2lsbHM6IFtcInNraWxsc1wiXSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBjcmVhdGVSb290OiBmYWxzZSxcbiAgfSxcbiAge1xuICAgIHBhdGg6IFwiflwiLFxuICAgIHNraWxsczogW1wiLmFzc2lzdGFudC9za2lsbHNcIl0sXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgY3JlYXRlUm9vdDogZmFsc2UsXG4gIH0sXG5dO1xuXG4vKipcbiAqIENyZWF0ZSBhIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfSB3aXRoIHBlci1yZXF1ZXN0IERhdGFicmlja3MgbW91bnRzLlxuICpcbiAqIEBleGFtcGxlIERlZmF1bHQgRGF0YWJyaWNrcyBwYXRoc1xuICogYGBgdHNcbiAqIGRhdGFicmlja3NXb3Jrc3BhY2UoKVxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgVXNlIG9ubHkgZXhwbGljaXQgcGF0aHNcbiAqIGBgYHRzXG4gKiBkYXRhYnJpY2tzV29ya3NwYWNlKHtcbiAqICAgYXNzaXN0YW50UGF0aHM6IGZhbHNlLFxuICogICBwYXRoczogW1wifi9wcm9qZWN0XCIsIFwiL3RtcC9wcm9qZWN0XCIsIFwiL1ZvbHVtZXMvbWFpbi9kZWZhdWx0L2RhdGFcIl0sXG4gKiB9KVxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgQnVpbGQgYSBzdGFuZGFyZCBNYXN0cmEgd29ya3NwYWNlIHlvdXJzZWxmXG4gKiBgYGB0c1xuICogbmV3IFdvcmtzcGFjZSh7XG4gKiAgIC4uLmRhdGFicmlja3NXb3Jrc3BhY2VDb25maWcoeyBwYXRoczogW1wifi9wcm9qZWN0XCJdIH0pLFxuICogICBzYW5kYm94OiBteVNhbmRib3gsXG4gKiB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRhYnJpY2tzV29ya3NwYWNlQ29uZmlnKFxuICBvcHRpb25zOiBEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucyA9IHt9LFxuKTogV29ya3NwYWNlQ29uZmlnIHtcbiAgY29uc3QgeyBpZCwgbmFtZSB9ID0gcmVzb2x2ZVdvcmtzcGFjZUlkZW50aXR5KG9wdGlvbnMpO1xuICBjb25zdCBmaWxlc3lzdGVtU291cmNlS2V5ID0gYCR7aWR9OiR7Kyt3b3Jrc3BhY2VTb3VyY2VTZXF1ZW5jZX1gO1xuICBjb25zdCBwYXRocyA9IHJlc29sdmVEYXRhYnJpY2tzV29ya3NwYWNlUGF0aHMob3B0aW9ucyk7XG4gIGNvbnN0IGNvbmZpZ3VyZWRQYXRocyA9IHBhdGhzLmxlbmd0aDtcbiAgY29uc3QgZXh0cmFTa2lsbFBhdGhzID0gb3B0aW9ucy5leHRyYVNraWxsUGF0aHMgPz8gW107XG4gIGNvbnN0IGZpbGVzQ2FjaGUgPSBwbHVnaW5SZWdpc3RyeS5pbnN0YW5jZShvcHRpb25zLnBsdWdpbkNvbnRleHQsIGZpbGVzQ2FjaGVQbHVnaW4pPy5leHBvcnRzKCk7XG4gIGNvbnN0IGNvbmZpZ3VyZWRDYWNoZSA9IG9wdGlvbnMuY2FjaGU7XG4gIGNvbnN0IG1vdW50RmlsZXNDYWNoZSA9IGNvbmZpZ3VyZWRDYWNoZSA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBmaWxlc0NhY2hlO1xuICBjb25zdCByZXRhaW5GaWxlc3lzdGVtU291cmNlID1cbiAgICBtb3VudEZpbGVzQ2FjaGUgIT09IHVuZGVmaW5lZCAmJlxuICAgIHR5cGVvZiBjb25maWd1cmVkQ2FjaGUgIT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHBhdGhzLmV2ZXJ5KChwYXRoKSA9PiB0eXBlb2YgcGF0aCAhPT0gXCJmdW5jdGlvblwiKTtcbiAgY29uc3QgcmVzb2x2ZXJzID0gYnVpbGRNb3VudFJlc29sdmVycyhcbiAgICBwYXRocyxcbiAgICBvcHRpb25zLm1vdW50cyxcbiAgICBsb2NhbFNraWxsTW91bnRSZXNvbHZlcnMoZXh0cmFTa2lsbFBhdGhzKSxcbiAgICBtb3VudEZpbGVzQ2FjaGUsXG4gICAgY29uZmlndXJlZENhY2hlLFxuICApO1xuICBjb25zdCByZXNvbHZlQ29udHJpYnV0aW9uID0gY29udHJpYnV0aW9uUmVzb2x2ZXIocmVzb2x2ZXJzKTtcbiAgY29uc3QgcmVzb2x2ZUZpbGVzeXN0ZW0gPSAoY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQpID0+XG4gICAgcmVzb2x2ZVdvcmtzcGFjZUZpbGVzeXN0ZW0oXG4gICAgICByZXNvbHZlQ29udHJpYnV0aW9uLFxuICAgICAgY29udGV4dCxcbiAgICAgIHJldGFpbkZpbGVzeXN0ZW1Tb3VyY2UgPyBtb3VudEZpbGVzQ2FjaGUgOiB1bmRlZmluZWQsXG4gICAgICBmaWxlc3lzdGVtU291cmNlS2V5LFxuICAgICk7XG4gIGNvbnN0IGhhc1NraWxsUGF0aHMgPSBwYXRocy5zb21lKHBhdGhNYXlQcm92aWRlU2tpbGxzKSB8fCBleHRyYVNraWxsUGF0aHMubGVuZ3RoID4gMDtcbiAgY29uc3Qgc2tpbGxzOiBTa2lsbHNSZXNvbHZlciA9XG4gICAgb3B0aW9ucy5za2lsbHMgPz9cbiAgICAoYXN5bmMgKHsgcmVxdWVzdENvbnRleHQgfSkgPT4ge1xuICAgICAgY29uc3QgY29udGV4dCA9IHsgcmVxdWVzdENvbnRleHQgfTtcbiAgICAgIGNvbnN0IGNvbnRyaWJ1dGlvbiA9IGF3YWl0IHJlc29sdmVDb250cmlidXRpb24oY29udGV4dCk7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3RpbmN0U2tpbGxQYXRocyhcbiAgICAgICAgYXdhaXQgcmVzb2x2ZUZpbGVzeXN0ZW0oY29udGV4dCksXG4gICAgICAgIGNvbnRyaWJ1dGlvbi5za2lsbFBhdGhzID8/IFtdLFxuICAgICAgKTtcbiAgICB9KTtcbiAgY29uc3QgY2hlY2tTa2lsbEZpbGVNdGltZSA9IG9wdGlvbnMuY2hlY2tTa2lsbEZpbGVNdGltZSA/PyBmYWxzZTtcbiAgY29uc3QgYm0yNSA9IG9wdGlvbnMuYm0yNSA/PyB0cnVlO1xuICBjb25zdCBzYW5kYm94ID0gcmVzb2x2ZVdvcmtzcGFjZVNhbmRib3gob3B0aW9ucy5zYW5kYm94LCBpZCwgbmFtZSk7XG4gIGNvbnN0IHRvb2xzID0gd29ya3NwYWNlVG9vbHMob3B0aW9ucy50b29scyk7XG4gIGxvZ2dlci5kZWJ1ZyhcIndvcmtzcGFjZTpjcmVhdGVcIiwge1xuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgcmVzb2x2ZXJDb3VudDogcmVzb2x2ZXJzLmxlbmd0aCxcbiAgICBjb25maWd1cmVkUGF0aHMsXG4gICAgY3VzdG9tTW91bnRzOiBPYmplY3Qua2V5cyhvcHRpb25zLm1vdW50cyA/PyB7fSkubGVuZ3RoLFxuICAgIHNraWxsc0NvbmZpZ3VyZWQ6IG9wdGlvbnMuc2tpbGxzICE9PSB1bmRlZmluZWQgfHwgaGFzU2tpbGxQYXRocyxcbiAgICBjdXN0b21Ta2lsbHNSZXNvbHZlcjogb3B0aW9ucy5za2lsbHMgIT09IHVuZGVmaW5lZCxcbiAgICBjaGVja1NraWxsRmlsZU10aW1lLFxuICAgIGJtMjUsXG4gICAgZXh0cmFTa2lsbFBhdGhzOiBleHRyYVNraWxsUGF0aHMubGVuZ3RoLFxuICAgIHNhbmRib3g6IHNhbmRib3ggPyBzYW5kYm94TmFtZShvcHRpb25zLnNhbmRib3gpIDogXCJkaXNhYmxlZFwiLFxuICB9KTtcblxuICBjb25zdCB7XG4gICAgYXNzaXN0YW50UGF0aHM6IF9hc3Npc3RhbnRQYXRocyxcbiAgICBwYXRoczogX3BhdGhzLFxuICAgIG1vdW50czogX21vdW50cyxcbiAgICBza2lsbHM6IF9za2lsbHMsXG4gICAgY2FjaGU6IF9jYWNoZSxcbiAgICBwbHVnaW5Db250ZXh0OiBfcGx1Z2luQ29udGV4dCxcbiAgICBzYW5kYm94OiBfc2FuZGJveCxcbiAgICBleHRyYVNraWxsUGF0aHM6IF9leHRyYVNraWxsUGF0aHMsXG4gICAgLi4ud29ya3NwYWNlT3B0aW9uc1xuICB9ID0gb3B0aW9ucztcbiAgcmV0dXJuIHtcbiAgICAuLi53b3Jrc3BhY2VPcHRpb25zLFxuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgZmlsZXN5c3RlbTogcmVzb2x2ZUZpbGVzeXN0ZW0sXG4gICAgLi4uKG9wdGlvbnMuc2tpbGxzICE9PSB1bmRlZmluZWQgfHwgaGFzU2tpbGxQYXRoc1xuICAgICAgPyB7XG4gICAgICAgICAgc2tpbGxzLFxuICAgICAgICAgIGNoZWNrU2tpbGxGaWxlTXRpbWUsXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICAgIC4uLihzYW5kYm94XG4gICAgICA/IHtcbiAgICAgICAgICBzYW5kYm94LFxuICAgICAgICAgIGluc3RydWN0aW9uczogeyBkeW5hbWljU2FuZGJveDogXCJyZXNvbHZlXCIgYXMgY29uc3QgfSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgYm0yNSxcbiAgICB0b29scyxcbiAgfTtcbn1cblxuLyoqIENyZWF0ZSBhIG5hdGl2ZSBNYXN0cmEge0BsaW5rIFdvcmtzcGFjZX0gZnJvbSB7QGxpbmsgZGF0YWJyaWNrc1dvcmtzcGFjZUNvbmZpZ30uICovXG5leHBvcnQgZnVuY3Rpb24gZGF0YWJyaWNrc1dvcmtzcGFjZShvcHRpb25zOiBEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucyA9IHt9KTogV29ya3NwYWNlIHtcbiAgY29uc3Qgd29ya3NwYWNlID0gbmV3IFdvcmtzcGFjZShkYXRhYnJpY2tzV29ya3NwYWNlQ29uZmlnKG9wdGlvbnMpKTtcbiAgZGF0YWJyaWNrc1dvcmtzcGFjZU9wdGlvbnMuc2V0KHdvcmtzcGFjZSwgb3B0aW9ucyk7XG4gIHJldHVybiB3b3Jrc3BhY2U7XG59XG5cbi8qKiBAaW50ZXJuYWwgQmluZCBhIGNhbGxlci1jcmVhdGVkIERhdGFicmlja3Mgd29ya3NwYWNlIHRvIGl0cyBBcHBLaXQgcGx1Z2luIGNvbnRleHQuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0KFxuICB3b3Jrc3BhY2U6IFdvcmtzcGFjZSxcbiAgcGx1Z2luQ29udGV4dDogcGx1Z2luUmVnaXN0cnkuUGx1Z2luQ29udGV4dExpa2UgfCB1bmRlZmluZWQsXG4pOiBXb3Jrc3BhY2Uge1xuICBjb25zdCBvcHRpb25zID0gZGF0YWJyaWNrc1dvcmtzcGFjZU9wdGlvbnMuZ2V0KHdvcmtzcGFjZSk7XG4gIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnBsdWdpbkNvbnRleHQgIT09IHVuZGVmaW5lZCB8fCBwbHVnaW5Db250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gd29ya3NwYWNlO1xuICB9XG4gIHJldHVybiBkYXRhYnJpY2tzV29ya3NwYWNlKHsgLi4ub3B0aW9ucywgcGx1Z2luQ29udGV4dCB9KTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGRlZmF1bHQgYW5kIGNhbGxlci1wcm92aWRlZCBEYXRhYnJpY2tzIHBhdGhzIGluIHByaW9yaXR5IG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURhdGFicmlja3NXb3Jrc3BhY2VQYXRocyhcbiAgb3B0aW9uczogUGljazxEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucywgXCJhc3Npc3RhbnRQYXRoc1wiIHwgXCJwYXRoc1wiPiA9IHt9LFxuKTogRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhWYWx1ZVtdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi4ob3B0aW9ucy5hc3Npc3RhbnRQYXRocyA9PT0gZmFsc2UgPyBbXSA6IERFRkFVTFRfREFUQUJSSUNLU19XT1JLU1BBQ0VfUEFUSFMpLFxuICAgIC4uLihvcHRpb25zLnBhdGhzID8/IFtdKSxcbiAgXTtcbn1cblxuLyoqIFdoZXRoZXIgb25lIGluY2x1ZGVkIHBhdGggY2FuIGNvbnRyaWJ1dGUgTWFzdHJhIHNraWxsIHBhdGhzLiAqL1xuZnVuY3Rpb24gcGF0aE1heVByb3ZpZGVTa2lsbHMocGF0aDogRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhWYWx1ZSk6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIHBhdGggPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7XG4gIGlmIChwYXRoID09PSBmYWxzZSB8fCB0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gKHBhdGguc2tpbGxzPy5sZW5ndGggPz8gMCkgPiAwO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByaXZhdGUgaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmZ1bmN0aW9uIHdvcmtzcGFjZVRvb2xzKGNvbmZpZ3VyZWQ6IFdvcmtzcGFjZVRvb2xzQ29uZmlnIHwgdW5kZWZpbmVkKTogV29ya3NwYWNlVG9vbHNDb25maWcge1xuICByZXR1cm4ge1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgcmVxdWlyZUFwcHJvdmFsOiBmYWxzZSxcbiAgICAuLi5jb25maWd1cmVkLFxuICB9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlU2FuZGJveChcbiAgc2VsZWN0aW9uOiBXb3Jrc3BhY2VTYW5kYm94U2VsZWN0aW9uIHwgdW5kZWZpbmVkLFxuICB3b3Jrc3BhY2VJZDogc3RyaW5nLFxuICB3b3Jrc3BhY2VOYW1lOiBzdHJpbmcsXG4pOiBXb3Jrc3BhY2VTYW5kYm94IHwgV29ya3NwYWNlU2FuZGJveFJlc29sdmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29uZmlndXJlZCA9IHNlbGVjdGlvbiA/PyBcIm1vbnR5XCI7XG4gIGlmIChjb25maWd1cmVkID09PSBmYWxzZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGNvbmZpZ3VyZWQgPT09IFwibW9udHlcIikgcmV0dXJuIG5ldyBNb250eVNhbmRib3goKTtcbiAgaWYgKHR5cGVvZiBjb25maWd1cmVkID09PSBcImZ1bmN0aW9uXCIgfHwgaXNTYW5kYm94KGNvbmZpZ3VyZWQpKSByZXR1cm4gY29uZmlndXJlZDtcblxuICBjb25zdCBvcHRpb25zOiBEYXRhYnJpY2tzV29ya3NwYWNlU2FuZGJveE9wdGlvbnMgPVxuICAgIGNvbmZpZ3VyZWQgPT09IFwiZGF0YWJyaWNrc1wiID8geyBwcm92aWRlcjogXCJkYXRhYnJpY2tzXCIgfSA6IGNvbmZpZ3VyZWQ7XG4gIHJldHVybiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PiB7XG4gICAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9LRVkpIGFzIFVzZXIgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgICAgXCJEYXRhYnJpY2tzIHNhbmRib3ggdXNlciBjb250ZXh0XCIsXG4gICAgICAgIFwiSW52b2tlIGNvbW1hbmQgdG9vbHMgZnJvbSBhbiBhZ2VudCB0dXJuIHNlcnZlZCBieSB0aGUgTWFzdHJhIHBsdWdpbi5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZ3VyZWRJZCA9XG4gICAgICB0eXBlb2Ygb3B0aW9ucy5zYW5kYm94SWQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IG9wdGlvbnMuc2FuZGJveElkKHsgcmVxdWVzdENvbnRleHQgfSlcbiAgICAgICAgOiBvcHRpb25zLnNhbmRib3hJZDtcbiAgICBjb25zdCBzYW5kYm94SWQgPSBjb25maWd1cmVkSWQgPz8gZGVmYXVsdFNhbmRib3hJZCh3b3Jrc3BhY2VJZCwgdXNlci5pZCk7XG4gICAgY29uc3QgY2xpZW50ID1cbiAgICAgIHR5cGVvZiBvcHRpb25zLmNsaWVudCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gb3B0aW9ucy5jbGllbnQoeyByZXF1ZXN0Q29udGV4dCB9KVxuICAgICAgICA6IChvcHRpb25zLmNsaWVudCA/PyBjcmVhdGVXb3Jrc3BhY2VDbGllbnQoKSk7XG4gICAgY29uc3Qge1xuICAgICAgcHJvdmlkZXI6IF9wcm92aWRlcixcbiAgICAgIHNhbmRib3hJZDogX3NhbmRib3hJZCxcbiAgICAgIGNsaWVudDogX2NsaWVudCxcbiAgICAgIC4uLnNhbmRib3hPcHRpb25zXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgcmV0dXJuIG5ldyBEYXRhYnJpY2tzU2FuZGJveCh7XG4gICAgICAuLi5zYW5kYm94T3B0aW9ucyxcbiAgICAgIGNsaWVudCxcbiAgICAgIHNhbmRib3hJZCxcbiAgICAgIGRpc3BsYXlOYW1lOiBvcHRpb25zLmRpc3BsYXlOYW1lID8/IGBNYXN0cmEgJHt3b3Jrc3BhY2VOYW1lfWAsXG4gICAgfSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRTYW5kYm94SWQod29ya3NwYWNlSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBkaWdlc3QgPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgLnVwZGF0ZShvYmplY3QudG9TdGFibGVLZXkoeyB3b3Jrc3BhY2VJZCwgdXNlcklkIH0pKVxuICAgIC5kaWdlc3QoXCJoZXhcIilcbiAgICAuc2xpY2UoMCwgMzIpO1xuICByZXR1cm4gYG1hc3RyYS0ke2RpZ2VzdH1gO1xufVxuXG5mdW5jdGlvbiBpc1NhbmRib3godmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3Jrc3BhY2VTYW5kYm94IHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIFwiaWRcIiBpbiB2YWx1ZSAmJiBcInByb3ZpZGVyXCIgaW4gdmFsdWUgJiYgXCJzdGF0dXNcIiBpbiB2YWx1ZSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gc2FuZGJveE5hbWUoc2VsZWN0aW9uOiBXb3Jrc3BhY2VTYW5kYm94U2VsZWN0aW9uIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKHNlbGVjdGlvbiA9PT0gdW5kZWZpbmVkIHx8IHNlbGVjdGlvbiA9PT0gXCJtb250eVwiKSByZXR1cm4gXCJtb250eVwiO1xuICBpZiAoc2VsZWN0aW9uID09PSBcImRhdGFicmlja3NcIikgcmV0dXJuIFwiZGF0YWJyaWNrc1wiO1xuICBpZiAoc2VsZWN0aW9uID09PSBmYWxzZSkgcmV0dXJuIFwiZGlzYWJsZWRcIjtcbiAgaWYgKHR5cGVvZiBzZWxlY3Rpb24gPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFwicmVzb2x2ZXJcIjtcbiAgcmV0dXJuIGlzU2FuZGJveChzZWxlY3Rpb24pID8gc2VsZWN0aW9uLnByb3ZpZGVyIDogKHNlbGVjdGlvbi5wcm92aWRlciA/PyBcImRhdGFicmlja3NcIik7XG59XG5cbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgdGhlIHJlcXVlc3QgdG9rZW4gY2FycmllcyBhIHNjb3BlIHRoYXQgYWxsb3dzIHdvcmtzcGFjZVxuICogZmlsZSBBUEkgYWNjZXNzIChgd29ya3NwYWNlYCBvciBgYWxsLWFwaXNgIG9uIHtAbGluayBNQVNUUkFfU0NPUEVTX0tFWX0pLlxuICovXG5mdW5jdGlvbiBoYXNXb3Jrc3BhY2VGaWxlU2NvcGUocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0IHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b2tlbi5pbmNsdWRlc0FjY2Vzc1Rva2VuU2NvcGUoXG4gICAgcmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfU0NPUEVTX0tFWSksXG4gICAgV09SS1NQQUNFX0ZJTEVfU0NPUEVTLFxuICApO1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgcmVxdWVzdCBjbGllbnQgYW5kIGF1dGhvcml6YXRpb24tc2FmZSBmaWxlcy1jYWNoZSBzY29wZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVGaWxlc0NhY2hlU2NvcGUoY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQpOiBQcm9taXNlPFxuICB8IHtcbiAgICAgIGNsaWVudDogV29ya3NwYWNlQ2xpZW50O1xuICAgICAgc2NvcGU6IEZpbGVzQ2FjaGVTY29wZTtcbiAgICB9XG4gIHwgdW5kZWZpbmVkXG4+IHtcbiAgY29uc3QgcmVxdWVzdENvbnRleHQgPSBjb250ZXh0LnJlcXVlc3RDb250ZXh0O1xuICBjb25zdCB1c2VyID0gcmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfVVNFUl9LRVkpIGFzIFVzZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGNsaWVudCA9IHVzZXI/LmV4ZWN1dGlvbkNvbnRleHQuY2xpZW50IGFzIFdvcmtzcGFjZUNsaWVudCB8IHVuZGVmaW5lZDtcbiAgaWYgKCFyZXF1ZXN0Q29udGV4dCB8fCAhdXNlciB8fCAhY2xpZW50KSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIGNsaWVudCxcbiAgICBzY29wZToge1xuICAgICAgaG9zdDogKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpLFxuICAgICAgdXNlcktleTogcmVzb2x2ZVVzZXJLZXkocmVxdWVzdENvbnRleHQpLFxuICAgICAgLi4uKHByb2Nlc3MuZW52LkRBVEFCUklDS1NfV09SS1NQQUNFX0lEPy50cmltKClcbiAgICAgICAgPyB7IHdvcmtzcGFjZUlkOiBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX1dPUktTUEFDRV9JRC50cmltKCkgfVxuICAgICAgICA6IHt9KSxcbiAgICB9LFxuICB9O1xufVxuXG4vKiogSm9pbiBvbmUgcmVsYXRpdmUgc2tpbGwgcGF0aCB0byBpdHMgYWN0dWFsIGNvbXBvc2l0ZSBtb3VudCBwYXRoLiAqL1xuZnVuY3Rpb24gbW91bnRlZFNraWxsUGF0aChtb3VudDogc3RyaW5nLCBza2lsbFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChwb3NpeFBhdGguaXNBYnNvbHV0ZShza2lsbFBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgU2tpbGwgcGF0aCBtdXN0IGJlIHJlbGF0aXZlIHRvIGl0cyBtb3VudDogJHtza2lsbFBhdGh9YCk7XG4gIH1cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBvc2l4UGF0aC5ub3JtYWxpemUoc2tpbGxQYXRoKTtcbiAgaWYgKCFub3JtYWxpemVkLm9rKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgU2tpbGwgcGF0aCBlc2NhcGVzIGl0cyBtb3VudDogJHtza2lsbFBhdGh9YCk7XG4gIH1cbiAgcmV0dXJuIHBvc2l4UGF0aC5qb2luKHBvc2l4UGF0aC5ub3JtYWxpemVSb290KG1vdW50KSwgbm9ybWFsaXplZC5wYXRoLnNsaWNlKDEpKTtcbn1cblxuLyoqIFJldHVybiB3aGV0aGVyIGEgRGF0YWJyaWNrcyBwYXRoIGJlbG9uZ3MgdG8gdGhlIHdyaXRhYmxlIFdvcmtzcGFjZSBuYW1lc3BhY2UuICovXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVJvb3Qocm9vdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwb3NpeFBhdGgubm9ybWFsaXplUm9vdChyb290KTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQgPT09IFwiL1dvcmtzcGFjZVwiIHx8IG5vcm1hbGl6ZWQuc3RhcnRzV2l0aChcIi9Xb3Jrc3BhY2UvXCIpO1xufVxuXG4vKipcbiAqIE1vdW50IHJlc29sdmVyIGZvciBjb25maWd1cmVkIERhdGFicmlja3MgYW5kIHRlbXBvcmFyeSBwYXRocy5cbiAqXG4gKiBHYXRlcyBvbiB3b3Jrc3BhY2UgZmlsZSBzY29wZSAob3IgZGV2ZWxvcG1lbnQgbW9kZSksIHRoZW4gbW91bnRzIGV2ZXJ5XG4gKiBmb2xkZXIgd2hvc2UgbG9jYXRpb24gcmVzb2x2ZXMgZm9yIHRoaXMgcmVxdWVzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVdvcmtzcGFjZVBhdGhNb3VudHMoXG4gIHBhdGhzOiByZWFkb25seSBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aFZhbHVlW10sXG4gIGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LFxuICBmaWxlc0NhY2hlOiBGaWxlc0NhY2hlRXhwb3J0cyB8IHVuZGVmaW5lZCxcbiAgY2FjaGVDb25maWc6IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZSB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8V29ya3NwYWNlTW91bnRDb250cmlidXRpb24+IHtcbiAgY29uc3QgbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBXb3Jrc3BhY2VGaWxlc3lzdGVtPiA9IHt9O1xuICBjb25zdCBza2lsbFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IGNvbnRleHQucmVxdWVzdENvbnRleHQ7XG5cbiAgY29uc3QgY2FuTW91bnREYXRhYnJpY2tzID0gQm9vbGVhbihyZXF1ZXN0Q29udGV4dCAmJiBzaG91bGRNb3VudFNraWxsRm9sZGVycyhyZXF1ZXN0Q29udGV4dCkpO1xuICBjb25zdCBzY29wZWQgPSBjYW5Nb3VudERhdGFicmlja3MgPyBhd2FpdCByZXNvbHZlRmlsZXNDYWNoZVNjb3BlKGNvbnRleHQpIDogdW5kZWZpbmVkO1xuICBjb25zdCBjbGllbnQgPSBzY29wZWQ/LmNsaWVudDtcbiAgY29uc3QgZmlsZVN5c3RlbUNhY2hlID1cbiAgICBmaWxlc0NhY2hlICYmIHNjb3BlZCA/IGF3YWl0IGZpbGVzQ2FjaGUuZm9yU2NvcGUoc2NvcGVkLnNjb3BlKSA6IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgcGF0aF0gb2YgcGF0aHMuZW50cmllcygpKSB7XG4gICAgY29uc3QgY29uZmlndXJlZCA9IGF3YWl0IHJlc29sdmVEYXRhYnJpY2tzV29ya3NwYWNlUGF0aChwYXRoLCBjb250ZXh0KTtcbiAgICBpZiAoIWNvbmZpZ3VyZWQpIGNvbnRpbnVlO1xuICAgIGlmIChwb3NpeFBhdGguaXNXaXRoaW5Sb290KFNDUkFUQ0hfTU9VTlQsIGNvbmZpZ3VyZWQucGF0aCkpIHtcbiAgICAgIGNvbnN0IG1vdW50ID0gY29uZmlndXJlZC5tb3VudCA/PyBjb25maWd1cmVkLnBhdGg7XG4gICAgICBtb3VudHNbbW91bnRdID0gdXNlclRlbXBGaWxlc3lzdGVtKGNvbnRleHQsIGNvbmZpZ3VyZWQucGF0aCk7XG4gICAgICBza2lsbFBhdGhzLnB1c2goLi4uKGNvbmZpZ3VyZWQuc2tpbGxzID8/IFtdKS5tYXAoKHBhdGgpID0+IG1vdW50ZWRTa2lsbFBhdGgobW91bnQsIHBhdGgpKSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFjYW5Nb3VudERhdGFicmlja3MpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIndvcmtzcGFjZS1wYXRoOnNraXBwZWRcIiwge1xuICAgICAgICBwYXRoOiBjb25maWd1cmVkLnBhdGgsXG4gICAgICAgIHJlYXNvbjogIXJlcXVlc3RDb250ZXh0ID8gXCJuby1yZXF1ZXN0LWNvbnRleHRcIiA6IFwibWlzc2luZy13b3Jrc3BhY2Utc2NvcGVcIixcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgcmVzb2x2ZVNraWxsRm9sZGVyRmlsZXN5c3RlbShjb25maWd1cmVkLCBjb250ZXh0LCBjYWNoZUNvbmZpZywge1xuICAgICAgY2xpZW50LFxuICAgICAgZmlsZVN5c3RlbUNhY2hlLFxuICAgIH0pO1xuICAgIGlmICghcmVzb2x2ZWQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG1vdW50ID0gY29uZmlndXJlZC5tb3VudCA/PyByZXNvbHZlZC5yb290O1xuICAgIGlmICghbW91bnQpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIndvcmtzcGFjZS1wYXRoOnNraXBwZWRcIiwgeyBpbmRleCwgcmVhc29uOiBcIm1pc3NpbmctbW91bnRcIiB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBtb3VudHNbbW91bnRdID0gcmVzb2x2ZWQuZmlsZXN5c3RlbTtcbiAgICBza2lsbFBhdGhzLnB1c2goLi4uKGNvbmZpZ3VyZWQuc2tpbGxzID8/IFtdKS5tYXAoKHBhdGgpID0+IG1vdW50ZWRTa2lsbFBhdGgobW91bnQsIHBhdGgpKSk7XG4gIH1cblxuICBsb2dnZXIuZGVidWcoXCJ3b3Jrc3BhY2UtcGF0aHM6bW91bnRlZFwiLCB7XG4gICAgbW91bnRLZXlzOiBPYmplY3Qua2V5cyhtb3VudHMpLFxuICAgIHNraWxsUGF0aHMsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgbW91bnRzLFxuICAgIHNraWxsUGF0aHMsXG4gIH07XG59XG5cbmludGVyZmFjZSBSZXNvbHZlZERhdGFicmlja3NXb3Jrc3BhY2VQYXRoIHtcbiAgcGF0aDogc3RyaW5nO1xuICBkaXNwbGF5TmFtZT86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHNraWxscz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICB3cml0YWJsZT86IGJvb2xlYW47XG4gIGNyZWF0ZVJvb3Q/OiBib29sZWFuO1xuICBtb3VudD86IHN0cmluZztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZURhdGFicmlja3NXb3Jrc3BhY2VQYXRoKFxuICB2YWx1ZTogRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhWYWx1ZSxcbiAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4pOiBQcm9taXNlPFJlc29sdmVkRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGggfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgc2VsZWN0ZWQgPSB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IGF3YWl0IHZhbHVlKGNvbnRleHQpIDogdmFsdWU7XG4gIGlmIChzZWxlY3RlZCA9PT0gZmFsc2UgfHwgc2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgY29uZmlndXJlZCA9IHR5cGVvZiBzZWxlY3RlZCA9PT0gXCJzdHJpbmdcIiA/IHsgcGF0aDogc2VsZWN0ZWQgfSA6IHNlbGVjdGVkO1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IHJlcXVlc3RDb250ZXh0VmFsdWVzKGNvbnRleHQucmVxdWVzdENvbnRleHQpO1xuICBjb25zdCByZXNvbHZlZFBhdGggPSByZXNvbHZlSG9tZVBhdGgoY29uZmlndXJlZC5wYXRoLCByZXF1ZXN0Q29udGV4dCk7XG4gIGlmICghcmVzb2x2ZWRQYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCByZXNvbHZlZE1vdW50ID0gcmVzb2x2ZUhvbWVQYXRoKGNvbmZpZ3VyZWQubW91bnQsIHJlcXVlc3RDb250ZXh0KTtcbiAgcmV0dXJuIHtcbiAgICAuLi5jb25maWd1cmVkLFxuICAgIHBhdGg6IHJlc29sdmVkUGF0aCxcbiAgICAuLi4ocmVzb2x2ZWRNb3VudCA/IHsgbW91bnQ6IHJlc29sdmVkTW91bnQgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIG9uZSBza2lsbCBmb2xkZXIgdG8gYSBNYXN0cmEgZmlsZXN5c3RlbSwgb3IgYHVuZGVmaW5lZGAgdG8gc2tpcCBpdFxuICogZm9yIHRoaXMgcmVxdWVzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVNraWxsRm9sZGVyRmlsZXN5c3RlbShcbiAgZm9sZGVyOiBSZXNvbHZlZERhdGFicmlja3NXb3Jrc3BhY2VQYXRoLFxuICBjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCxcbiAgY2FjaGVDb25maWc6IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZSB8IHVuZGVmaW5lZCxcbiAgY2FjaGU6IHtcbiAgICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCB8IHVuZGVmaW5lZDtcbiAgICBmaWxlU3lzdGVtQ2FjaGU6IEZpbGVTeXN0ZW1DYWNoZSB8IHVuZGVmaW5lZDtcbiAgfSxcbik6IFByb21pc2U8XG4gIHwge1xuICAgICAgZmlsZXN5c3RlbTogV29ya3NwYWNlRmlsZXN5c3RlbTtcbiAgICAgIHJvb3Q/OiBzdHJpbmc7XG4gICAgfVxuICB8IHVuZGVmaW5lZFxuPiB7XG4gIC8vIEEgcGF0aCBtb3VudCBuZWVkcyB0aGUgcmVxdWVzdCdzIE9CTyBjbGllbnQgdG8gcmVhY2ggdGhlIHdvcmtzcGFjZS5cbiAgaWYgKCFjYWNoZS5jbGllbnQpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJ3b3Jrc3BhY2UtcGF0aDpza2lwcGVkXCIsIHtcbiAgICAgIHBhdGg6IGZvbGRlci5wYXRoLFxuICAgICAgcmVhc29uOiBcIm1pc3Npbmctb2JvLWNsaWVudFwiLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3Qgcm9vdCA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoZm9sZGVyLnBhdGgpO1xuICBpZiAoIXJvb3QpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHdyaXRhYmxlID0gZm9sZGVyLndyaXRhYmxlID8/IGlzV29ya3NwYWNlUm9vdChyb290KTtcbiAgY29uc3QgY2FjaGVPcHRpb25zID0gY2FjaGUuZmlsZVN5c3RlbUNhY2hlXG4gICAgPyBhd2FpdCByZXNvbHZlRmlsZUNhY2hlT3B0aW9ucyhjYWNoZUNvbmZpZywgY29udGV4dCwgcm9vdCwgZm9sZGVyLnNraWxscyA/PyBbXSlcbiAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBkYXRhYnJpY2tzRmlsZXN5c3RlbShcbiAgICBjYWNoZS5jbGllbnQsXG4gICAgcm9vdCxcbiAgICAhd3JpdGFibGUsXG4gICAgZm9sZGVyLmNyZWF0ZVJvb3QgPz8gZm9sZGVyLndyaXRhYmxlID09PSB0cnVlLFxuICAgIGNhY2hlLmZpbGVTeXN0ZW1DYWNoZSxcbiAgICBjYWNoZU9wdGlvbnMsXG4gICAge1xuICAgICAgLi4uKGZvbGRlci5kZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb246IGZvbGRlci5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgLi4uKGZvbGRlci5kaXNwbGF5TmFtZSA/IHsgZGlzcGxheU5hbWU6IGZvbGRlci5kaXNwbGF5TmFtZSB9IDoge30pLFxuICAgIH0sXG4gICk7XG4gIHJldHVybiByZXNvbHZlZCA/IHsgLi4ucmVzb2x2ZWQsIHJvb3QgfSA6IHVuZGVmaW5lZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNhY2hlQ29uZmlnKFxuICB2YWx1ZTogRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlIHwgdW5kZWZpbmVkLFxuICBjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCxcbik6IFByb21pc2U8XG4gIGJvb2xlYW4gfCBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXIgfCByZWFkb25seSBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXJbXSB8IHVuZGVmaW5lZFxuPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHZhbHVlKGNvbnRleHQpIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RDb250ZXh0VmFsdWVzKHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHJlcXVlc3RDb250ZXh0Py50b0pTT04oKSA/PyB7fTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUhvbWVQYXRoKFxuICBpbnB1dDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICByZXF1ZXN0Q29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB2YWx1ZSA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoaW5wdXQpO1xuICBpZiAoIXZhbHVlIHx8ICh2YWx1ZSAhPT0gXCJ+XCIgJiYgIXZhbHVlLnN0YXJ0c1dpdGgoXCJ+L1wiKSkpIHJldHVybiB2YWx1ZSA/PyB1bmRlZmluZWQ7XG4gIGNvbnN0IGVtYWlsVmFsdWUgPSByZXF1ZXN0Q29udGV4dFtNQVNUUkFfVVNFUl9FTUFJTF9LRVldO1xuICBjb25zdCBlbWFpbCA9IHR5cGVvZiBlbWFpbFZhbHVlID09PSBcInN0cmluZ1wiID8gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChlbWFpbFZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFlbWFpbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgaG9tZSA9IHBlcnNvbmFsV29ya3NwYWNlUGF0aChlbWFpbCk7XG4gIHJldHVybiB2YWx1ZSA9PT0gXCJ+XCIgPyBob21lIDogYCR7aG9tZX0vJHt2YWx1ZS5zbGljZSgyKX1gO1xufVxuXG5mdW5jdGlvbiB0b1BvbGljeUFycmF5PFQ+KHZhbHVlOiBUIHwgcmVhZG9ubHkgVFtdIHwgdW5kZWZpbmVkKTogcmVhZG9ubHkgVFtdIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gKHZhbHVlIGFzIHJlYWRvbmx5IFRbXSkgOiBbdmFsdWUgYXMgVF07XG59XG5cbmZ1bmN0aW9uIGNhY2hlRmlsdGVyTWF0Y2hlcyhcbiAgcG9saWN5OiBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXIsXG4gIG9wZXJhdGlvbjogQ2FjaGVhYmxlRmlsZVN5c3RlbU9wZXJhdGlvbixcbiAgcGF0aDogc3RyaW5nLFxuICByZXF1ZXN0Q29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHJvb3Q/OiBzdHJpbmcsXG4pOiBib29sZWFuIHtcbiAgY29uc3Qgb3BlcmF0aW9ucyA9IHRvUG9saWN5QXJyYXkocG9saWN5Lm9wZXJhdGlvbnMgPz8gQ0FDSEVBQkxFX0ZJTEVTWVNURU1fT1BFUkFUSU9OUyk7XG4gIGlmICghb3BlcmF0aW9ucy5pbmNsdWRlcyhvcGVyYXRpb24pKSByZXR1cm4gZmFsc2U7XG4gIGlmIChwb2xpY3kucGF0aHMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGlucHV0czogUGF0aE1hdGNoSW5wdXRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGlucHV0IG9mIHRvUG9saWN5QXJyYXk8UGF0aE1hdGNoSW5wdXQ+KHBvbGljeS5wYXRocykpIHtcbiAgICBpZiAodHlwZW9mIGlucHV0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICBpbnB1dHMucHVzaChpbnB1dCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgZXhwYW5kZWQgPSByZXNvbHZlSG9tZVBhdGgoaW5wdXQsIHJlcXVlc3RDb250ZXh0KTtcbiAgICBpZiAoIWV4cGFuZGVkKSBjb250aW51ZTtcbiAgICBpbnB1dHMucHVzaChcbiAgICAgICFyb290IHx8IHBvc2l4UGF0aC5pc0Fic29sdXRlKGV4cGFuZGVkKSB8fCBleHBhbmRlZC5zdGFydHNXaXRoKFwiKipcIilcbiAgICAgICAgPyBleHBhbmRlZFxuICAgICAgICA6IGAke3Bvc2l4UGF0aC5ub3JtYWxpemVSb290KHJvb3QpfS8ke2V4cGFuZGVkLnJlcGxhY2UoL15cXC5cXC8vLCBcIlwiKX1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGlucHV0cy5sZW5ndGggPiAwICYmIG1hdGNoLnRvUGF0aE1hdGNoZXIoLi4uaW5wdXRzKShwYXRoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUZpbGVDYWNoZU9wdGlvbnMoXG4gIGNvbmZpZ3VyZWQ6IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZSB8IHVuZGVmaW5lZCxcbiAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4gIHJvb3Q6IHN0cmluZyxcbiAgc2tpbGxQYXRoczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBQcm9taXNlPEZpbGVTeXN0ZW1DYWNoZU9wdGlvbnMgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVxdWVzdENvbnRleHQgPSByZXF1ZXN0Q29udGV4dFZhbHVlcyhjb250ZXh0LnJlcXVlc3RDb250ZXh0KTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCByZXNvbHZlQ2FjaGVDb25maWcoY29uZmlndXJlZCwgY29udGV4dCk7XG4gIGlmIChyZXNvbHZlZCA9PT0gZmFsc2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChyZXNvbHZlZCA9PT0gdW5kZWZpbmVkIHx8IHJlc29sdmVkID09PSB0cnVlKSB7XG4gICAgY29uc3Qgcm9vdHMgPSBza2lsbFBhdGhzLm1hcCgocGF0aCkgPT4gbW91bnRlZFNraWxsUGF0aChyb290LCBwYXRoKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wZXJhdGlvbnM6IENBQ0hFQUJMRV9GSUxFU1lTVEVNX09QRVJBVElPTlMsXG4gICAgICBmaWx0ZXI6IChvcGVyYXRpb24sIHBhdGgpID0+XG4gICAgICAgIG9wZXJhdGlvbiAhPT0gXCJyZWFkRmlsZVwiIHx8XG4gICAgICAgIHJvb3RzLnNvbWUoKHNraWxsUm9vdCkgPT4gcG9zaXhQYXRoLmlzV2l0aGluUm9vdChza2lsbFJvb3QsIHBhdGgpKSxcbiAgICB9O1xuICB9XG4gIGNvbnN0IHBvbGljaWVzID0gdG9Qb2xpY3lBcnJheShyZXNvbHZlZCk7XG4gIGlmIChwb2xpY2llcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG9wZXJhdGlvbnMgPSBbXG4gICAgLi4ubmV3IFNldChcbiAgICAgIHBvbGljaWVzLmZsYXRNYXAoKHBvbGljeSkgPT5cbiAgICAgICAgdG9Qb2xpY3lBcnJheShwb2xpY3kub3BlcmF0aW9ucyA/PyBDQUNIRUFCTEVfRklMRVNZU1RFTV9PUEVSQVRJT05TKSxcbiAgICAgICksXG4gICAgKSxcbiAgXTtcbiAgcmV0dXJuIHtcbiAgICBvcGVyYXRpb25zLFxuICAgIGZpbHRlcjogKG9wZXJhdGlvbiwgcGF0aCkgPT5cbiAgICAgIHBvbGljaWVzLnNvbWUoKHBvbGljeSkgPT4gY2FjaGVGaWx0ZXJNYXRjaGVzKHBvbGljeSwgb3BlcmF0aW9uLCBwYXRoLCByZXF1ZXN0Q29udGV4dCwgcm9vdCkpLFxuICB9O1xufVxuXG4vKipcbiAqIEZpbGwgaW4gYGlkYCBhbmQgYG5hbWVgIHdoZW4gZWl0aGVyIGlzIG9taXR0ZWQgb24ge0BsaW5rIERhdGFicmlja3NXb3Jrc3BhY2VPcHRpb25zfS5cbiAqIFNsdWdpZmllcyBgbmFtZWAgaW50byBgaWRgOyB0b2tlbml6ZXMgYGlkYCBpbnRvIGEgZGlzcGxheSBgbmFtZWAuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VJZGVudGl0eShvcHRpb25zOiBEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucyk6IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xufSB7XG4gIGxldCBpZCA9IG9wdGlvbnMuaWQ7XG4gIGxldCBuYW1lID0gb3B0aW9ucy5uYW1lO1xuICBpZiAoIWlkKSB7XG4gICAgaWQgPSBuYW1lID8gc3RyaW5nVXRpbHMudG9TbHVnKG5hbWUpIDogXCJ3b3Jrc3BhY2VcIjtcbiAgfVxuICBpZiAoIW5hbWUpIHtcbiAgICBuYW1lID0gQXJyYXkuZnJvbShzdHJpbmdVdGlscy50b2tlbml6ZShpZCkpLmpvaW4oXCIgXCIpO1xuICB9XG4gIHJldHVybiB7IGlkLCBuYW1lIH07XG59XG5cbi8qKiBDb2xsZWN0IHRoZSBEYXRhYnJpY2tzIHBhdGggcmVzb2x2ZXIgYW5kIGFueSBjYWxsZXItc3VwcGxpZWQgbW91bnRzLiAqL1xuZnVuY3Rpb24gYnVpbGRNb3VudFJlc29sdmVycyhcbiAgcGF0aHM6IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VQYXRoVmFsdWVbXSxcbiAgbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBXb3Jrc3BhY2VGaWxlc3lzdGVtPiB8IHVuZGVmaW5lZCxcbiAgbG9jYWxNb3VudHM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSxcbiAgZmlsZXNDYWNoZTogRmlsZXNDYWNoZUV4cG9ydHMgfCB1bmRlZmluZWQsXG4gIGNhY2hlQ29uZmlnOiBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGUgfCB1bmRlZmluZWQsXG4pOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10ge1xuICBjb25zdCByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSA9IFtdO1xuICBjb25zdCBwYXRoQ291bnQgPSBwYXRocy5sZW5ndGg7XG4gIGlmIChwYXRoQ291bnQgPiAwKSB7XG4gICAgcmVzb2x2ZXJzLnB1c2goKGNvbnRleHQpID0+XG4gICAgICByZXNvbHZlV29ya3NwYWNlUGF0aE1vdW50cyhwYXRocywgY29udGV4dCwgZmlsZXNDYWNoZSwgY2FjaGVDb25maWcpLFxuICAgICk7XG4gIH1cbiAgaWYgKG1vdW50cyAmJiBPYmplY3Qua2V5cyhtb3VudHMpLmxlbmd0aCA+IDApIHJlc29sdmVycy5wdXNoKCgpID0+ICh7IG1vdW50cyB9KSk7XG4gIHJlc29sdmVycy5wdXNoKC4uLmxvY2FsTW91bnRzKTtcbiAgbG9nZ2VyLmRlYnVnKFwibW91bnRzOnJlc29sdmVyc1wiLCB7XG4gICAgcGF0aENvdW50LFxuICAgIGN1c3RvbU1vdW50Q291bnQ6IE9iamVjdC5rZXlzKG1vdW50cyA/PyB7fSkubGVuZ3RoLFxuICAgIGxvY2FsTW91bnRDb3VudDogbG9jYWxNb3VudHMubGVuZ3RoLFxuICAgIHRvdGFsUmVzb2x2ZXJDb3VudDogcmVzb2x2ZXJzLmxlbmd0aCxcbiAgfSk7XG4gIHJldHVybiByZXNvbHZlcnM7XG59XG5cbi8qKiBTdGFibGUgdXNlci1zY29wZWQgbG9jYWwgc3RvcmFnZSB1bmRlciB0aGUgaG9zdCBvcGVyYXRpbmcgc3lzdGVtJ3MgdGVtcCBkaXJlY3RvcnkuICovXG5mdW5jdGlvbiB1c2VyVGVtcEZpbGVzeXN0ZW0oXG4gIGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LFxuICB3b3Jrc3BhY2VQYXRoOiBzdHJpbmcsXG4pOiBXb3Jrc3BhY2VGaWxlc3lzdGVtIHtcbiAgY29uc3QgdXNlcktleSA9IHJlc29sdmVVc2VyS2V5KGNvbnRleHQucmVxdWVzdENvbnRleHQpO1xuICBjb25zdCBkaWdlc3QgPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgLnVwZGF0ZShvYmplY3QudG9TdGFibGVLZXkoeyBwYWNrYWdlOiBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiLCB1c2VyS2V5IH0pKVxuICAgIC5kaWdlc3QoXCJoZXhcIilcbiAgICAuc2xpY2UoMCwgMTYpO1xuICBjb25zdCBub3JtYWxpemVkID0gcG9zaXhQYXRoLm5vcm1hbGl6ZVJvb3Qod29ya3NwYWNlUGF0aCk7XG4gIGNvbnN0IHJlbGF0aXZlID0gbm9ybWFsaXplZCA9PT0gU0NSQVRDSF9NT1VOVCA/IFwiXCIgOiBub3JtYWxpemVkLnNsaWNlKGAke1NDUkFUQ0hfTU9VTlR9L2AubGVuZ3RoKTtcbiAgY29uc3Qgc291cmNlID0gbmV3IExvY2FsRmlsZVN5c3RlbSh7XG4gICAgcm9vdDogam9pbih0bXBkaXIoKSwgXCJkYngtdG9vbHNcIiwgXCJtYXN0cmFcIiwgZGlnZXN0LCByZWxhdGl2ZSksXG4gICAgcmVhZE9ubHk6IGZhbHNlLFxuICAgIGNyZWF0ZVJvb3Q6IHRydWUsXG4gIH0pO1xuICByZXR1cm4gZmlsZXN5c3RlbXMoc291cmNlLCB7XG4gICAgZGlzcGxheU5hbWU6IFwiVGVtcG9yYXJ5IEZpbGVzXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlVzZXItc2NvcGVkIHRlbXBvcmFyeSBmaWxlcyByZXRhaW5lZCB3aGlsZSB0aGUgaG9zdCBrZWVwcyBpdHMgZXBoZW1lcmFsIHRlbXAgc3RvcmFnZS5cIixcbiAgfSk7XG59XG5cbi8qKiBNb3VudCBzdGFydHVwLXByb3Zpc2lvbmVkIGxvY2FsIHNraWxsIHBhdGhzIGludG8gTWFzdHJhJ3Mgd29ya3NwYWNlIGZpbGVzeXN0ZW0uICovXG5mdW5jdGlvbiBsb2NhbFNraWxsTW91bnRSZXNvbHZlcnMocGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdIHtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KHBhdGhzLm1hcCgocGF0aCkgPT4gcGF0aC50cmltKCkpLmZpbHRlcihCb29sZWFuKSldLm1hcCgocm9vdCkgPT4ge1xuICAgIGNvbnN0IG1vdW50ID0gcG9zaXhQYXRoLm5vcm1hbGl6ZVJvb3Qocm9vdCk7XG4gICAgY29uc3Qgc291cmNlID0gbmV3IExvY2FsRmlsZVN5c3RlbSh7XG4gICAgICByb290LFxuICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICBjcmVhdGVSb290OiBmYWxzZSxcbiAgICB9KTtcbiAgICBjb25zdCBmaWxlc3lzdGVtID0gZmlsZXN5c3RlbXMoc291cmNlLCB7IHJlYWRPbmx5OiB0cnVlIH0pO1xuICAgIHJldHVybiAoKSA9PiAoe1xuICAgICAgbW91bnRzOiB7IFttb3VudF06IGZpbGVzeXN0ZW0gfSxcbiAgICAgIHNraWxsUGF0aHM6IFttb3VudF0sXG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEdhdGUgc2tpbGwtZm9sZGVyIG1vdW50cyBvbiB0aGUgcmVxdWVzdCdzIHRva2VuLlxuICpcbiAqIEFsd2F5cyBhbGxvd3MgbW91bnRzIGluIGRldmVsb3BtZW50OyBpbiBvdGhlciBlbnZpcm9ubWVudHMgcmVxdWlyZXNcbiAqIHtAbGluayBoYXNXb3Jrc3BhY2VGaWxlU2NvcGV9LlxuICovXG5mdW5jdGlvbiBzaG91bGRNb3VudFNraWxsRm9sZGVycyhyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQpOiBib29sZWFuIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHJldHVybiB0cnVlO1xuICByZXR1cm4gaGFzV29ya3NwYWNlRmlsZVNjb3BlKHJlcXVlc3RDb250ZXh0KTtcbn1cblxuLyoqXG4gKiBXcmFwIGEge0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtfSBhcyBhIE1hc3RyYSBmaWxlc3lzdGVtLiBNaXNzaW5nIG9yXG4gKiBpbmFjY2Vzc2libGUgcm9vdHMgcmV0dXJuIGB1bmRlZmluZWRgIHNvIG90aGVyIGFjY2Vzc2libGUgcm9vdHMgcmVtYWluXG4gKiB1c2FibGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRhdGFicmlja3NGaWxlc3lzdGVtKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgcm9vdDogc3RyaW5nLFxuICByZWFkT25seTogYm9vbGVhbiA9IHRydWUsXG4gIGNyZWF0ZVJvb3Q6IGJvb2xlYW4gPSAhcmVhZE9ubHksXG4gIGZpbGVTeXN0ZW1DYWNoZT86IEZpbGVTeXN0ZW1DYWNoZSxcbiAgY2FjaGVPcHRpb25zPzogRmlsZVN5c3RlbUNhY2hlT3B0aW9ucyxcbiAgYWRhcHRlck9wdGlvbnM6IFBpY2s8TWFzdHJhRmlsZVN5c3RlbUFkYXB0ZXJPcHRpb25zLCBcImRlc2NyaXB0aW9uXCIgfCBcImRpc3BsYXlOYW1lXCI+ID0ge30sXG4pOiBQcm9taXNlPFxuICB8IHtcbiAgICAgIGZpbGVzeXN0ZW06IFdvcmtzcGFjZUZpbGVzeXN0ZW07XG4gICAgfVxuICB8IHVuZGVmaW5lZFxuPiB7XG4gIGNvbnN0IGZzID0gbmV3IERhdGFicmlja3NGaWxlU3lzdGVtKHtcbiAgICBjbGllbnQ6ICgpID0+IHdvcmtzcGFjZUNsaWVudC50b0xlZ2FjeVdvcmtzcGFjZUNsaWVudChyZXF1ZXN0V29ya3NwYWNlQ2xpZW50KGNsaWVudCkpLFxuICAgIHJvb3QsXG4gICAgcmVhZE9ubHksXG4gICAgY3JlYXRlUm9vdCxcbiAgfSk7XG4gIGNvbnN0IGNhY2hlZCA9XG4gICAgZmlsZVN5c3RlbUNhY2hlICYmIGNhY2hlT3B0aW9ucyA/IHNoYXJlZEZTLmNhY2hlKGZzLCBmaWxlU3lzdGVtQ2FjaGUsIGNhY2hlT3B0aW9ucykgOiBmcztcbiAgY29uc3Qgc291cmNlID0gdmVyaWZ5Rmlyc3RGaWxlU3lzdGVtQWNjZXNzKGNhY2hlZCwgKCkgPT4gZnMuc3RhdChcIi5cIiksIHJvb3QpO1xuICBjb25zdCBmaWxlc3lzdGVtID0gZmlsZXN5c3RlbXMoc291cmNlLCB7IC4uLmFkYXB0ZXJPcHRpb25zLCByZWFkT25seSB9KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmaWxlc3lzdGVtLmluaXQoKTtcbiAgICBpZiAoYXdhaXQgZmlsZXN5c3RlbS5leGlzdHMoXCIuXCIpKSB7XG4gICAgICByZXR1cm4geyBmaWxlc3lzdGVtIH07XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJkYXRhYnJpY2tzLW1vdW50OnNraXBwZWRcIiwge1xuICAgICAgcm9vdCxcbiAgICAgIHJlYWRPbmx5LFxuICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqIEBpbnRlcm5hbCBLZWVwIHNlcnZpY2UgY29udGV4dCBmcm9tIHJlcGxhY2luZyB0aGUgcmVxdWVzdC1zY29wZWQgd29ya3NwYWNlIGNsaWVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0V29ya3NwYWNlQ2xpZW50KFxuICBpbml0aWFsQ2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gIGV4ZWN1dGlvbkNvbnRleHQ6IFJldHVyblR5cGU8XG4gICAgdHlwZW9mIGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0XG4gID4gPSBhcHBraXQudHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpLFxuKTogV29ya3NwYWNlQ2xpZW50IHtcbiAgaWYgKFxuICAgIGV4ZWN1dGlvbkNvbnRleHQgJiZcbiAgICBcImlzVXNlckNvbnRleHRcIiBpbiBleGVjdXRpb25Db250ZXh0ICYmXG4gICAgZXhlY3V0aW9uQ29udGV4dC5pc1VzZXJDb250ZXh0ID09PSB0cnVlXG4gICkge1xuICAgIHJldHVybiBleGVjdXRpb25Db250ZXh0LmNsaWVudDtcbiAgfVxuICByZXR1cm4gaW5pdGlhbENsaWVudDtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5Rmlyc3RGaWxlU3lzdGVtQWNjZXNzPFRGaWxlU3lzdGVtIGV4dGVuZHMgRmlsZVN5c3RlbT4oXG4gIGZpbGVzeXN0ZW06IFRGaWxlU3lzdGVtLFxuICByZWFkUHJvYmU6ICgpID0+IFByb21pc2U8dW5rbm93bj4sXG4gIHJvb3Q6IHN0cmluZyxcbik6IFRGaWxlU3lzdGVtIHtcbiAgbGV0IHJlYWRDaGVjazogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgbGV0IHdyaXRlVmVyaWZpZWQgPSBmYWxzZTtcbiAgY29uc3QgYm91bmRNZXRob2RzID0gbmV3IE1hcDxQcm9wZXJ0eUtleSwgdW5rbm93bj4oKTtcbiAgY29uc3QgcmVhZE9wZXJhdGlvbnMgPSBuZXcgU2V0PFByb3BlcnR5S2V5PihbXCJleGlzdHNcIiwgXCJyZWFkRmlsZVwiLCBcInJlYWRkaXJcIiwgXCJzdGF0XCJdKTtcbiAgY29uc3Qgd3JpdGVPcGVyYXRpb25zID0gbmV3IFNldDxQcm9wZXJ0eUtleT4oW1xuICAgIFwiYXBwZW5kRmlsZVwiLFxuICAgIFwiY29weUZpbGVcIixcbiAgICBcImRlbGV0ZUZpbGVcIixcbiAgICBcIm1rZGlyXCIsXG4gICAgXCJtb3ZlRmlsZVwiLFxuICAgIFwicm1kaXJcIixcbiAgICBcIndyaXRlRmlsZVwiLFxuICBdKTtcbiAgY29uc3QgdmVyaWZ5UmVhZCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICByZWFkQ2hlY2sgPz89IFByb21pc2UucmVzb2x2ZShyZWFkUHJvYmUoKSkudGhlbigoKSA9PiB1bmRlZmluZWQpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCByZWFkQ2hlY2s7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJlYWRDaGVjayA9IHVuZGVmaW5lZDtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImRhdGFicmlja3MtbW91bnQ6cmVhZC1jaGVjay1mYWlsZWRcIiwge1xuICAgICAgICByb290LFxuICAgICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIG5ldyBQcm94eShmaWxlc3lzdGVtLCB7XG4gICAgZ2V0KHRhcmdldCwgcHJvcGVydHkpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgdGFyZ2V0KTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHZhbHVlO1xuICAgICAgaWYgKGJvdW5kTWV0aG9kcy5oYXMocHJvcGVydHkpKSByZXR1cm4gYm91bmRNZXRob2RzLmdldChwcm9wZXJ0eSk7XG4gICAgICBjb25zdCBkZWxlZ2F0ZWQgPSB2YWx1ZS5iaW5kKHRhcmdldCkgYXMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bjtcbiAgICAgIGxldCBtZXRob2QgPSBkZWxlZ2F0ZWQ7XG4gICAgICBpZiAocmVhZE9wZXJhdGlvbnMuaGFzKHByb3BlcnR5KSkge1xuICAgICAgICBtZXRob2QgPSBhc3luYyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdmVyaWZ5UmVhZCgpO1xuICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZWQoLi4uYXJncyk7XG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHdyaXRlT3BlcmF0aW9ucy5oYXMocHJvcGVydHkpKSB7XG4gICAgICAgIG1ldGhvZCA9IGFzeW5jICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVsZWdhdGVkKC4uLmFyZ3MpO1xuICAgICAgICAgICAgaWYgKCF3cml0ZVZlcmlmaWVkKSB7XG4gICAgICAgICAgICAgIHdyaXRlVmVyaWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXCJkYXRhYnJpY2tzLW1vdW50OndyaXRlLWNoZWNrLXBhc3NlZFwiLCB7IHJvb3QgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoIXdyaXRlVmVyaWZpZWQpIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFwiZGF0YWJyaWNrcy1tb3VudDp3cml0ZS1jaGVjay1mYWlsZWRcIiwge1xuICAgICAgICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVycm9yKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBib3VuZE1ldGhvZHMuc2V0KHByb3BlcnR5LCBtZXRob2QpO1xuICAgICAgcmV0dXJuIG1ldGhvZDtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBSdW4gZXZlcnkgbW91bnQgcmVzb2x2ZXIgZm9yIG9uZSByZXF1ZXN0IGFuZCBtZXJnZSBtb3VudHMgcGx1cyBza2lsbCBwYXRocy5cbiAqIExhdGVyIHJlc29sdmVycyBvdmVyd3JpdGUgbW91bnQga2V5cyBmcm9tIGVhcmxpZXIgb25lcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVdvcmtzcGFjZUNvbnRyaWJ1dGlvbihcbiAgcmVzb2x2ZXJzOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10sXG4gIGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4ge1xuICBjb25zdCBtb3VudHM6IFJlY29yZDxzdHJpbmcsIFdvcmtzcGFjZUZpbGVzeXN0ZW0+ID0ge307XG4gIGNvbnN0IHNraWxsUGF0aHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIHJlc29sdmVyXSBvZiByZXNvbHZlcnMuZW50cmllcygpKSB7XG4gICAgY29uc3QgY29udHJpYnV0aW9uID0gYXdhaXQgcmVzb2x2ZXIoY29udGV4dCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwibW91bnRzOnJlc29sdmVyXCIsIHtcbiAgICAgIGluZGV4LFxuICAgICAgbW91bnRLZXlzOiBPYmplY3Qua2V5cyhjb250cmlidXRpb24ubW91bnRzKSxcbiAgICAgIHNraWxsUGF0aHM6IGNvbnRyaWJ1dGlvbi5za2lsbFBhdGhzID8/IFtdLFxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24obW91bnRzLCBjb250cmlidXRpb24ubW91bnRzKTtcbiAgICBpZiAoY29udHJpYnV0aW9uLnNraWxsUGF0aHM/Lmxlbmd0aCkge1xuICAgICAgc2tpbGxQYXRocy5wdXNoKC4uLmNvbnRyaWJ1dGlvbi5za2lsbFBhdGhzKTtcbiAgICB9XG4gIH1cblxuICBsb2dnZXIuZGVidWcoXCJtb3VudHM6bWVyZ2VkXCIsIHtcbiAgICBtb3VudEtleXM6IE9iamVjdC5rZXlzKG1vdW50cyksXG4gICAgc2tpbGxQYXRocyxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudHMsXG4gICAgc2tpbGxQYXRocyxcbiAgfTtcbn1cblxuLyoqXG4gKiBEeW5hbWljIGZpbGVzeXN0ZW0gcmVzb2x2ZXIgcGFzc2VkIHRvIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfS5cbiAqXG4gKiBSZXR1cm5zIGEge0BsaW5rIENvbXBvc2l0ZUZpbGVzeXN0ZW19IG92ZXIgZXZlcnkgcGF0aCB0aGF0IHJlc29sdmVkIGZvciB0aGVcbiAqIHJlcXVlc3QuIEFuIGVtcHR5IGNvbXBvc2l0ZSBleHBvc2VzIG5vIGltcGxpY2l0IGxvY2FsIHN0b3JhZ2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VGaWxlc3lzdGVtKFxuICByZXNvbHZlQ29udHJpYnV0aW9uOiAoY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQpID0+IFByb21pc2U8V29ya3NwYWNlTW91bnRDb250cmlidXRpb24+LFxuICBjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCxcbiAgZmlsZXNDYWNoZT86IEZpbGVzQ2FjaGVFeHBvcnRzLFxuICBzb3VyY2VLZXk/OiBzdHJpbmcsXG4pOiBQcm9taXNlPFdvcmtzcGFjZUZpbGVzeXN0ZW0+IHtcbiAgY29uc3QgeyBtb3VudHMgfSA9IGF3YWl0IHJlc29sdmVDb250cmlidXRpb24oY29udGV4dCk7XG4gIGNvbnN0IG1vdW50S2V5cyA9IE9iamVjdC5rZXlzKG1vdW50cyk7XG4gIGlmIChtb3VudEtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiZmlsZXN5c3RlbTplbXB0eVwiLCB7XG4gICAgICBoYXNSZXF1ZXN0Q29udGV4dDogQm9vbGVhbihjb250ZXh0LnJlcXVlc3RDb250ZXh0KSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmlsZXN5c3RlbXMobmV3IE1lbW9yeUZpbGVTeXN0ZW0oeyByb290OiBcIi9cIiwgcmVhZE9ubHk6IHRydWUgfSksIHtcbiAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgIH0pO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImZpbGVzeXN0ZW06Y29tcG9zaXRlXCIsIHsgbW91bnRLZXlzIH0pO1xuICBjb25zdCBsb2FkID0gKCkgPT4gbmV3IE1vdW50ZWRDb21wb3NpdGVGaWxlc3lzdGVtKHsgbW91bnRzIH0pO1xuICBpZiAoIWZpbGVzQ2FjaGUpIHJldHVybiBsb2FkKCk7XG4gIGNvbnN0IHNjb3BlZCA9IGF3YWl0IHJlc29sdmVGaWxlc0NhY2hlU2NvcGUoY29udGV4dCk7XG4gIGlmICghc2NvcGVkKSByZXR1cm4gbG9hZCgpO1xuICByZXR1cm4gZmlsZXNDYWNoZS5mb3JGaWxlU3lzdGVtKHNjb3BlZC5zY29wZSwgeyBwYXRoczogbW91bnRLZXlzLCBrZXk6IHNvdXJjZUtleSB9LCBsb2FkKTtcbn1cblxuLyoqXG4gKiBFeHBhbmQgY29uZmlndXJlZCBza2lsbCBwYXRocyBpbnRvIGNvbmNyZXRlIHNraWxsIGRpcmVjdG9yaWVzIGFuZCBrZWVwIHRoZSBmaXJzdFxuICogc2FtZS1uYW1lZCBkaXJlY3RvcnkuIE1hc3RyYSBzdGlsbCBvd25zIHBhcnNpbmcsIGluZGV4aW5nLCBhbmQgcmVmcmVzaGVzLFxuICogd2hpbGUgZWFybGllciBjb25maWd1cmVkIHJvb3RzIHJldGFpbiBwcmVjZWRlbmNlIG92ZXIgbGF0ZXIgcm9vdHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVEaXN0aW5jdFNraWxsUGF0aHMoXG4gIGZpbGVzeXN0ZW06IFdvcmtzcGFjZUZpbGVzeXN0ZW0sXG4gIHBhdGhzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qgc2VsZWN0ZWQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZpbGVzeXN0ZW0ucmVhZGRpcihwYXRoKTtcbiAgICAgIGlmIChlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS50eXBlID09PSBcImZpbGVcIiAmJiBlbnRyeS5uYW1lID09PSBcIlNLSUxMLm1kXCIpKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBwb3NpeFBhdGguYmFzZW5hbWUocGF0aCk7XG4gICAgICAgIGlmICghc2VsZWN0ZWQuaGFzKG5hbWUpKSBzZWxlY3RlZC5zZXQobmFtZSwgcGF0aCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGlmIChlbnRyeS50eXBlICE9PSBcImRpcmVjdG9yeVwiIHx8IHNlbGVjdGVkLmhhcyhlbnRyeS5uYW1lKSkgY29udGludWU7XG4gICAgICAgIHNlbGVjdGVkLnNldChlbnRyeS5uYW1lLCBwb3NpeFBhdGguam9pbihwYXRoLCBlbnRyeS5uYW1lKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInNraWxsLXBhdGg6c2tpcHBlZFwiLCB7XG4gICAgICAgIHBhdGgsXG4gICAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnJvciksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5zZWxlY3RlZC52YWx1ZXMoKV07XG59XG5cbi8qKiBNZW1vaXplIG9uZSBjb21wbGV0ZSBtb3VudCBjb250cmlidXRpb24gZm9yIGVhY2ggcmVxdWVzdCBjb250ZXh0LiAqL1xuZnVuY3Rpb24gY29udHJpYnV0aW9uUmVzb2x2ZXIoXG4gIHJlc29sdmVyczogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdLFxuKTogKGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0KSA9PiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPiB7XG4gIGNvbnN0IHNjb3BlZCA9IG5ldyBXZWFrTWFwPFJlcXVlc3RDb250ZXh0LCBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPj4oKTtcbiAgbGV0IHVuc2NvcGVkOiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPiB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIChjb250ZXh0KSA9PiB7XG4gICAgaWYgKCFjb250ZXh0LnJlcXVlc3RDb250ZXh0KSB7XG4gICAgICB1bnNjb3BlZCA/Pz0gcmVzb2x2ZVdvcmtzcGFjZUNvbnRyaWJ1dGlvbihyZXNvbHZlcnMsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIHVuc2NvcGVkO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZyA9IHNjb3BlZC5nZXQoY29udGV4dC5yZXF1ZXN0Q29udGV4dCk7XG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG4gICAgY29uc3QgcGVuZGluZyA9IHJlc29sdmVXb3Jrc3BhY2VDb250cmlidXRpb24ocmVzb2x2ZXJzLCBjb250ZXh0KTtcbiAgICBzY29wZWQuc2V0KGNvbnRleHQucmVxdWVzdENvbnRleHQsIHBlbmRpbmcpO1xuICAgIHJldHVybiBwZW5kaW5nO1xuICB9O1xufVxuIl19
package/package.json CHANGED
@@ -34,20 +34,20 @@
34
34
  },
35
35
  "dependencies": {
36
36
  "@databricks/appkit": "0.81.0",
37
- "@dbx-tools/appkit": "^0.9.105",
38
- "@dbx-tools/core": "^0.9.105",
39
- "@dbx-tools/databricks": "^0.9.105",
40
- "@dbx-tools/fs": "^0.9.105",
41
- "@dbx-tools/genie": "^0.9.105",
42
- "@dbx-tools/model": "^0.9.105",
43
- "@dbx-tools/model-protocol": "^0.9.105",
44
- "@dbx-tools/path": "^0.9.105",
45
- "@dbx-tools/postgres": "^0.9.105",
46
- "@dbx-tools/shared-core": "^0.9.105",
47
- "@dbx-tools/shared-fs": "^0.9.105",
48
- "@dbx-tools/shared-genie": "^0.9.105",
49
- "@dbx-tools/shared-mastra": "^0.9.105",
50
- "@dbx-tools/shared-model": "^0.9.105",
37
+ "@dbx-tools/appkit": "^0.9.108",
38
+ "@dbx-tools/core": "^0.9.108",
39
+ "@dbx-tools/databricks": "^0.9.108",
40
+ "@dbx-tools/fs": "^0.9.108",
41
+ "@dbx-tools/genie": "^0.9.108",
42
+ "@dbx-tools/model": "^0.9.108",
43
+ "@dbx-tools/model-protocol": "^0.9.108",
44
+ "@dbx-tools/path": "^0.9.108",
45
+ "@dbx-tools/postgres": "^0.9.108",
46
+ "@dbx-tools/shared-core": "^0.9.108",
47
+ "@dbx-tools/shared-fs": "^0.9.108",
48
+ "@dbx-tools/shared-genie": "^0.9.108",
49
+ "@dbx-tools/shared-mastra": "^0.9.108",
50
+ "@dbx-tools/shared-model": "^0.9.108",
51
51
  "@mastra/ai-sdk": "1.10.5",
52
52
  "@mastra/core": "1.71.0",
53
53
  "@mastra/express": "1.5.15",
@@ -217,7 +217,7 @@
217
217
  "./package.json": "./package.json"
218
218
  }
219
219
  },
220
- "version": "0.9.105",
220
+ "version": "0.9.108",
221
221
  "types": "./lib/index.d.ts",
222
222
  "dbxToolsConfig": {
223
223
  "tags": [
package/src/workspaces.ts CHANGED
@@ -81,7 +81,7 @@ const databricksWorkspaceOptions = new WeakMap<Workspace, DatabricksWorkspaceOpt
81
81
 
82
82
  /* -------------------------------- types -------------------------------- */
83
83
 
84
- /** Per-request context for mount and skill-folder resolvers. */
84
+ /** Per-request context for workspace path resolvers. */
85
85
  export interface DatabricksWorkspaceContext {
86
86
  requestContext?: RequestContext;
87
87
  }
@@ -97,13 +97,9 @@ export interface DatabricksWorkspacePathOptions {
97
97
  /** Mount description shown in filesystem listings and workspace instructions. */
98
98
  description?: string;
99
99
  /**
100
- * Scan this mount for `SKILL.md` files. Defaults to `true`; `false` mounts
101
- * the location for file tools without adding it to skill discovery.
102
- */
103
- readable?: boolean;
104
- /**
105
- * Skill roots relative to this filesystem root. Defaults to `["."]`.
106
- * Each path is joined to the actual mount path before Mastra scans it.
100
+ * Skill paths relative to this included filesystem path. Omit for a
101
+ * file-only mount. Each entry is joined to the actual mount path before
102
+ * Mastra receives it.
107
103
  */
108
104
  skills?: readonly string[];
109
105
  /**
@@ -204,7 +200,7 @@ export interface DatabricksWorkspaceOptions extends Omit<
204
200
  paths?: readonly DatabricksWorkspacePathValue[];
205
201
  /** Native Mastra filesystems composed beside the Databricks paths. */
206
202
  mounts?: Record<string, WorkspaceFilesystem>;
207
- /** Replace the auto-built dynamic skills resolver. */
203
+ /** Native Mastra skill paths or resolver composed with path-declared skills. */
208
204
  skills?: SkillsResolver;
209
205
  /** Filesystem cache filters. Ignored when the AppKit files-cache plugin is absent. */
210
206
  cache?: DatabricksWorkspaceCache;
@@ -217,7 +213,7 @@ export interface DatabricksWorkspaceOptions extends Omit<
217
213
  */
218
214
  sandbox?: WorkspaceSandboxSelection;
219
215
  /**
220
- * Extra LOCAL skill roots mounted read-only for every request's skill discovery.
216
+ * Extra LOCAL skill paths mounted read-only for every request's skill discovery.
221
217
  * Used by the plugin to surface remote skills provisioned to a local temp
222
218
  * dir at startup (see `remote-skills.ts`). Databricks-hosted remote skills
223
219
  * need no entry here - they land in the Assistant tree the built-in mount
@@ -234,14 +230,12 @@ export interface DatabricksWorkspaceOptions extends Omit<
234
230
  export const DEFAULT_DATABRICKS_WORKSPACE_PATHS: readonly DatabricksWorkspacePathOptions[] = [
235
231
  {
236
232
  path: ORGANIZATION_ASSISTANT_PATH,
237
- readable: true,
238
233
  skills: ["skills"],
239
234
  writable: true,
240
235
  createRoot: false,
241
236
  },
242
237
  {
243
238
  path: "~",
244
- readable: true,
245
239
  skills: [".assistant/skills"],
246
240
  writable: true,
247
241
  createRoot: false,
@@ -302,6 +296,7 @@ export function databricksWorkspaceConfig(
302
296
  retainFilesystemSource ? mountFilesCache : undefined,
303
297
  filesystemSourceKey,
304
298
  );
299
+ const hasSkillPaths = paths.some(pathMayProvideSkills) || extraSkillPaths.length > 0;
305
300
  const skills: SkillsResolver =
306
301
  options.skills ??
307
302
  (async ({ requestContext }) => {
@@ -322,7 +317,8 @@ export function databricksWorkspaceConfig(
322
317
  resolverCount: resolvers.length,
323
318
  configuredPaths,
324
319
  customMounts: Object.keys(options.mounts ?? {}).length,
325
- customSkillsResolver: Boolean(options.skills),
320
+ skillsConfigured: options.skills !== undefined || hasSkillPaths,
321
+ customSkillsResolver: options.skills !== undefined,
326
322
  checkSkillFileMtime,
327
323
  bm25,
328
324
  extraSkillPaths: extraSkillPaths.length,
@@ -345,7 +341,7 @@ export function databricksWorkspaceConfig(
345
341
  id,
346
342
  name,
347
343
  filesystem: resolveFilesystem,
348
- ...(resolvers.length > 0 || options.skills
344
+ ...(options.skills !== undefined || hasSkillPaths
349
345
  ? {
350
346
  skills,
351
347
  checkSkillFileMtime,
@@ -393,6 +389,13 @@ export function resolveDatabricksWorkspacePaths(
393
389
  ];
394
390
  }
395
391
 
392
+ /** Whether one included path can contribute Mastra skill paths. */
393
+ function pathMayProvideSkills(path: DatabricksWorkspacePathValue): boolean {
394
+ if (typeof path === "function") return true;
395
+ if (path === false || typeof path === "string") return false;
396
+ return (path.skills?.length ?? 0) > 0;
397
+ }
398
+
396
399
  /* ---------------------------- private helpers ---------------------------- */
397
400
 
398
401
  function workspaceTools(configured: WorkspaceToolsConfig | undefined): WorkspaceToolsConfig {
@@ -504,14 +507,14 @@ async function resolveFilesCacheScope(context: DatabricksWorkspaceContext): Prom
504
507
  };
505
508
  }
506
509
 
507
- /** Join one relative skill root to its actual composite mount path. */
508
- function mountedSkillPath(mount: string, skillRoot: string): string {
509
- if (posixPath.isAbsolute(skillRoot)) {
510
- throw new TypeError(`Skill path must be relative to its mount: ${skillRoot}`);
510
+ /** Join one relative skill path to its actual composite mount path. */
511
+ function mountedSkillPath(mount: string, skillPath: string): string {
512
+ if (posixPath.isAbsolute(skillPath)) {
513
+ throw new TypeError(`Skill path must be relative to its mount: ${skillPath}`);
511
514
  }
512
- const normalized = posixPath.normalize(skillRoot);
515
+ const normalized = posixPath.normalize(skillPath);
513
516
  if (!normalized.ok) {
514
- throw new TypeError(`Skill path escapes its mount: ${skillRoot}`);
517
+ throw new TypeError(`Skill path escapes its mount: ${skillPath}`);
515
518
  }
516
519
  return posixPath.join(posixPath.normalizeRoot(mount), normalized.path.slice(1));
517
520
  }
@@ -523,12 +526,12 @@ function isWorkspaceRoot(root: string): boolean {
523
526
  }
524
527
 
525
528
  /**
526
- * Mount resolver for the named skill folders.
529
+ * Mount resolver for configured Databricks and temporary paths.
527
530
  *
528
531
  * Gates on workspace file scope (or development mode), then mounts every
529
532
  * folder whose location resolves for this request.
530
533
  */
531
- async function resolveSkillFolderMounts(
534
+ async function resolveWorkspacePathMounts(
532
535
  paths: readonly DatabricksWorkspacePathValue[],
533
536
  context: DatabricksWorkspaceContext,
534
537
  filesCache: FilesCacheExports | undefined,
@@ -550,9 +553,7 @@ async function resolveSkillFolderMounts(
550
553
  if (posixPath.isWithinRoot(SCRATCH_MOUNT, configured.path)) {
551
554
  const mount = configured.mount ?? configured.path;
552
555
  mounts[mount] = userTempFilesystem(context, configured.path);
553
- if (configured.readable !== false) {
554
- skillPaths.push(...(configured.skills ?? []).map((path) => mountedSkillPath(mount, path)));
555
- }
556
+ skillPaths.push(...(configured.skills ?? []).map((path) => mountedSkillPath(mount, path)));
556
557
  continue;
557
558
  }
558
559
  if (!canMountDatabricks) {
@@ -573,12 +574,10 @@ async function resolveSkillFolderMounts(
573
574
  continue;
574
575
  }
575
576
  mounts[mount] = resolved.filesystem;
576
- if (configured.readable !== false) {
577
- skillPaths.push(...(configured.skills ?? ["."]).map((path) => mountedSkillPath(mount, path)));
578
- }
577
+ skillPaths.push(...(configured.skills ?? []).map((path) => mountedSkillPath(mount, path)));
579
578
  }
580
579
 
581
- logger.debug("skill-folders:mounted", {
580
+ logger.debug("workspace-paths:mounted", {
582
581
  mountKeys: Object.keys(mounts),
583
582
  skillPaths,
584
583
  });
@@ -593,7 +592,6 @@ interface ResolvedDatabricksWorkspacePath {
593
592
  path: string;
594
593
  displayName?: string;
595
594
  description?: string;
596
- readable?: boolean;
597
595
  skills?: readonly string[];
598
596
  writable?: boolean;
599
597
  createRoot?: boolean;
@@ -639,7 +637,7 @@ async function resolveSkillFolderFilesystem(
639
637
  > {
640
638
  // A path mount needs the request's OBO client to reach the workspace.
641
639
  if (!cache.client) {
642
- logger.debug("skill-folder:skipped", {
640
+ logger.debug("workspace-path:skipped", {
643
641
  path: folder.path,
644
642
  reason: "missing-obo-client",
645
643
  });
@@ -649,12 +647,7 @@ async function resolveSkillFolderFilesystem(
649
647
  if (!root) return undefined;
650
648
  const writable = folder.writable ?? isWorkspaceRoot(root);
651
649
  const cacheOptions = cache.fileSystemCache
652
- ? await resolveFileCacheOptions(
653
- cacheConfig,
654
- context,
655
- root,
656
- folder.readable === false ? [] : (folder.skills ?? ["."]),
657
- )
650
+ ? await resolveFileCacheOptions(cacheConfig, context, root, folder.skills ?? [])
658
651
  : undefined;
659
652
  const resolved = await databricksFilesystem(
660
653
  cache.client,
@@ -782,7 +775,7 @@ function resolveWorkspaceIdentity(options: DatabricksWorkspaceOptions): {
782
775
  return { id, name };
783
776
  }
784
777
 
785
- /** Collect the skill-folder resolver and any caller-supplied ones. */
778
+ /** Collect the Databricks path resolver and any caller-supplied mounts. */
786
779
  function buildMountResolvers(
787
780
  paths: readonly DatabricksWorkspacePathValue[],
788
781
  mounts: Record<string, WorkspaceFilesystem> | undefined,
@@ -793,7 +786,9 @@ function buildMountResolvers(
793
786
  const resolvers: WorkspaceMountResolver[] = [];
794
787
  const pathCount = paths.length;
795
788
  if (pathCount > 0) {
796
- resolvers.push((context) => resolveSkillFolderMounts(paths, context, filesCache, cacheConfig));
789
+ resolvers.push((context) =>
790
+ resolveWorkspacePathMounts(paths, context, filesCache, cacheConfig),
791
+ );
797
792
  }
798
793
  if (mounts && Object.keys(mounts).length > 0) resolvers.push(() => ({ mounts }));
799
794
  resolvers.push(...localMounts);
@@ -830,7 +825,7 @@ function userTempFilesystem(
830
825
  });
831
826
  }
832
827
 
833
- /** Mount startup-provisioned local skill roots into Mastra's workspace filesystem. */
828
+ /** Mount startup-provisioned local skill paths into Mastra's workspace filesystem. */
834
829
  function localSkillMountResolvers(paths: readonly string[]): WorkspaceMountResolver[] {
835
830
  return [...new Set(paths.map((path) => path.trim()).filter(Boolean))].map((root) => {
836
831
  const mount = posixPath.normalizeRoot(root);
@@ -1055,30 +1050,30 @@ async function resolveWorkspaceFilesystem(
1055
1050
  }
1056
1051
 
1057
1052
  /**
1058
- * Expand skill roots into concrete skill directories and keep the first
1053
+ * Expand configured skill paths into concrete skill directories and keep the first
1059
1054
  * same-named directory. Mastra still owns parsing, indexing, and refreshes,
1060
1055
  * while earlier configured roots retain precedence over later roots.
1061
1056
  */
1062
1057
  async function resolveDistinctSkillPaths(
1063
1058
  filesystem: WorkspaceFilesystem,
1064
- roots: readonly string[],
1059
+ paths: readonly string[],
1065
1060
  ): Promise<string[]> {
1066
1061
  const selected = new Map<string, string>();
1067
- for (const root of roots) {
1062
+ for (const path of paths) {
1068
1063
  try {
1069
- const entries = await filesystem.readdir(root);
1064
+ const entries = await filesystem.readdir(path);
1070
1065
  if (entries.some((entry) => entry.type === "file" && entry.name === "SKILL.md")) {
1071
- const name = posixPath.basename(root);
1072
- if (!selected.has(name)) selected.set(name, root);
1066
+ const name = posixPath.basename(path);
1067
+ if (!selected.has(name)) selected.set(name, path);
1073
1068
  continue;
1074
1069
  }
1075
1070
  for (const entry of entries) {
1076
1071
  if (entry.type !== "directory" || selected.has(entry.name)) continue;
1077
- selected.set(entry.name, posixPath.join(root, entry.name));
1072
+ selected.set(entry.name, posixPath.join(path, entry.name));
1078
1073
  }
1079
1074
  } catch (error) {
1080
- logger.debug("skill-root:skipped", {
1081
- root,
1075
+ logger.debug("skill-path:skipped", {
1076
+ path,
1082
1077
  error: errorUtils.errorMessage(error),
1083
1078
  });
1084
1079
  }