@dbx-tools/appkit-mastra 0.6.4 → 0.6.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -229,6 +229,53 @@ Production workspace mounts require a forwarded token with `workspace`,
229
229
  `workspace.workspace`, or `all-apis` scope. Development mode skips that gate for
230
230
  local iteration.
231
231
 
232
+ ## Remote Skills
233
+
234
+ Workspace skills above are discovered from files ALREADY in the Databricks
235
+ workspace. `remoteSkills` provisions skills from OUTSIDE it at startup - a
236
+ GitHub `owner/repo`, a git / GitLab URL, or a direct `SKILL.md` / archive
237
+ download URL - so an app can ship with a curated skill set without anyone
238
+ hand-uploading `SKILL.md` trees first.
239
+
240
+ ```ts
241
+ mastra({
242
+ agents: { assistant: agents.createAgent({ instructions: "..." }) },
243
+ remoteSkills: [
244
+ "owner/skill-repo",
245
+ { source: "https://example.com/skills/writing.md", failOnError: false },
246
+ ],
247
+ });
248
+ ```
249
+
250
+ Each source is materialized at boot into an Assistant-style `SKILL.md` tree that
251
+ the default workspace then scans, so a provisioned skill behaves exactly like
252
+ one that was in the workspace all along. Resolution per source:
253
+
254
+ - if the optional `skills` peer dependency is installed, the source is copied
255
+ into a staging dir with the `skills` CLI, which understands every source
256
+ format the ecosystem does (GitHub shorthand, git URLs, archive URLs);
257
+ - otherwise the source URL is fetched directly and its `SKILL.md` written to the
258
+ staging dir. A non-URL source (e.g. bare `owner/repo`) without the `skills`
259
+ package installed cannot be resolved this way and fails.
260
+
261
+ The default destination is the Databricks workspace Assistant skills tree
262
+ (`/Workspace/.assistant/skills`, the same tree a "save this as a skill" action
263
+ writes to), so provisioned skills persist across restarts and are picked up by
264
+ the built-in Assistant-skills mount. Pass `userEmail` to target that user's
265
+ `/Users/<email>/.assistant/skills` instead, or `databricksBasePath` for an
266
+ explicit tree. When no Databricks client is resolvable at startup, the tree is
267
+ written to a local temp dir and handed to Mastra as an extra local skill path
268
+ for the current process only.
269
+
270
+ A source that resolves through neither path fails app startup, so a misconfigured
271
+ skill set is caught at boot rather than silently missing. Set `failOnError: false`
272
+ (top-level or per-source) to log and skip a bad source instead. Install the
273
+ optional peer to enable the richest source formats:
274
+
275
+ ```sh
276
+ pnpm add skills
277
+ ```
278
+
232
279
  ## Genie Tools
233
280
 
234
281
  `genie.buildGenieTools()` and `plugins.genie.toolkit()` expose tools for:
@@ -482,6 +529,10 @@ requiring callers to assemble a Mastra server by hand.
482
529
  name an agent explicitly.
483
530
  - `storage` and `memory` accept `true`, `false`, or concrete Mastra Postgres /
484
531
  PgVector options. `true` resolves from `lakebase()` when present.
532
+ - `remoteSkills` provisions `SKILL.md` sources from outside the workspace at
533
+ startup (see [Remote Skills](#remote-skills)). Accepts a single source, a
534
+ list, or an options bag with `failOnError`, `userEmail`, and
535
+ `databricksBasePath`.
485
536
  - `genieSpaces` maps aliases to Genie Space IDs (or to
486
537
  `{ spaceId, hint }` objects). Those aliases flow into tool names,
487
538
  suggestions, and chart/data workflows. An alias present with no space id is a
@@ -532,6 +583,9 @@ client that talks to these routes.
532
583
  - `memory` / `storageSchema` - Lakebase-backed Mastra store/vector setup.
533
584
  - `workspaces` / `filesystems` - Mastra workspace creation and Databricks
534
585
  Workspace file adapters.
586
+ - `remote-skills` - startup provisioning of remote `SKILL.md` sources into the
587
+ Databricks Assistant skills tree (or a local temp dir), via the optional
588
+ `skills` CLI or a direct fetch.
535
589
  - `mcp` - MCP server construction.
536
590
  - `observability` / `mlflow` - tracing and feedback.
537
591
  - `server` / `rest` / `processors` - Express dispatch, Databricks REST helpers,
package/index.ts CHANGED
@@ -18,6 +18,7 @@ export * as observability from "./src/observability.ts";
18
18
  export * as pagination from "./src/pagination.ts";
19
19
  export * as plugin from "./src/plugin.ts";
20
20
  export * as processors from "./src/processors.ts";
21
+ export * as remoteSkills from "./src/remote-skills.ts";
21
22
  export * as rest from "./src/rest.ts";
22
23
  export * as server from "./src/server.ts";
23
24
  export * as serving from "./src/serving.ts";
@@ -57,6 +58,8 @@ export { clampPerPage, parseIntParam } from "./src/pagination.ts";
57
58
  export type { PerPageBounds } from "./src/pagination.ts";
58
59
  export { MastraPlugin, mastra } from "./src/plugin.ts";
59
60
  export { stripStaleChartsProcessor, ResultProcessor } from "./src/processors.ts";
61
+ export { normalizeRemoteSkillsOption, provisionRemoteSkills } from "./src/remote-skills.ts";
62
+ export type { RemoteSkillSourceOptions, RemoteSkillSource, RemoteSkillsOption, ProvisionRemoteSkillsOptions, ProvisionedRemoteSkills } from "./src/remote-skills.ts";
60
63
  export { databricksFetch, readResponseText, readResponseJson } from "./src/rest.ts";
61
64
  export type { DatabricksFetchInit } from "./src/rest.ts";
62
65
  export { stampRequestContextUser, createRequestContext, MastraServer, isMastraRequestAllowed, attachRoutePatchMiddleware } from "./src/server.ts";
package/lib/index.d.ts CHANGED
@@ -14,6 +14,7 @@ export * as observability from "./src/observability.ts";
14
14
  export * as pagination from "./src/pagination.ts";
15
15
  export * as plugin from "./src/plugin.ts";
16
16
  export * as processors from "./src/processors.ts";
17
+ export * as remoteSkills from "./src/remote-skills.ts";
17
18
  export * as rest from "./src/rest.ts";
18
19
  export * as server from "./src/server.ts";
19
20
  export * as serving from "./src/serving.ts";
@@ -53,6 +54,8 @@ export { clampPerPage, parseIntParam } from "./src/pagination.ts";
53
54
  export type { PerPageBounds } from "./src/pagination.ts";
54
55
  export { MastraPlugin, mastra } from "./src/plugin.ts";
55
56
  export { stripStaleChartsProcessor, ResultProcessor } from "./src/processors.ts";
57
+ export { normalizeRemoteSkillsOption, provisionRemoteSkills } from "./src/remote-skills.ts";
58
+ export type { RemoteSkillSourceOptions, RemoteSkillSource, RemoteSkillsOption, ProvisionRemoteSkillsOptions, ProvisionedRemoteSkills } from "./src/remote-skills.ts";
56
59
  export { databricksFetch, readResponseText, readResponseJson } from "./src/rest.ts";
57
60
  export type { DatabricksFetchInit } from "./src/rest.ts";
58
61
  export { stampRequestContextUser, createRequestContext, MastraServer, isMastraRequestAllowed, attachRoutePatchMiddleware } from "./src/server.ts";
package/lib/index.js CHANGED
@@ -17,6 +17,7 @@ export * as observability from "./src/observability.js";
17
17
  export * as pagination from "./src/pagination.js";
18
18
  export * as plugin from "./src/plugin.js";
19
19
  export * as processors from "./src/processors.js";
20
+ export * as remoteSkills from "./src/remote-skills.js";
20
21
  export * as rest from "./src/rest.js";
21
22
  export * as server from "./src/server.js";
22
23
  export * as serving from "./src/serving.js";
@@ -44,6 +45,7 @@ export { isOtlpTracingConfigured, buildObservability } from "./src/observability
44
45
  export { clampPerPage, parseIntParam } from "./src/pagination.js";
45
46
  export { MastraPlugin, mastra } from "./src/plugin.js";
46
47
  export { stripStaleChartsProcessor, ResultProcessor } from "./src/processors.js";
48
+ export { normalizeRemoteSkillsOption, provisionRemoteSkills } from "./src/remote-skills.js";
47
49
  export { databricksFetch, readResponseText, readResponseJson } from "./src/rest.js";
48
50
  export { stampRequestContextUser, createRequestContext, MastraServer, isMastraRequestAllowed, attachRoutePatchMiddleware } from "./src/server.js";
49
51
  export { MASTRA_MODEL_OVERRIDE_KEY, extractModelOverride, resolveServingConfig } from "./src/serving.js";
@@ -55,4 +57,4 @@ export { listThreads, deleteThread, renameThread, threadsRoute } from "./src/thr
55
57
  export { invalidFields } from "./src/validation.js";
56
58
  export { createWorkspace } from "./src/workspaces.js";
57
59
  export { safeWrite } from "./src/writer.js";
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxXQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLGFBQWEsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEtBQUssVUFBVSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLGVBQWUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFP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RUFBRSxrQkFBa0IsRUFBRSxpQ0FBaUMsRUFBRSxzQkFBc0IsRUFBRSwwQkFBMEIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRW5MLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFekcsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXpGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0ICogYXMgYWdlbnRzIGZyb20gXCIuL3NyYy9hZ2VudHMudHNcIjtcbmV4cG9ydCAqIGFzIGNoYXJ0IGZyb20gXCIuL3NyYy9jaGFydC50c1wiO1xuZXhwb3J0ICogYXMgY29uZmlnIGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCAqIGFzIGRlZmF1bHRzIGZyb20gXCIuL3NyYy9kZWZhdWx0cy50c1wiO1xuZXhwb3J0ICogYXMgZmlsZXN5c3RlbXMgZnJvbSBcIi4vc3JjL2ZpbGVzeXN0ZW1zLnRzXCI7XG5leHBvcnQgKiBhcyBnZW5pZSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCAqIGFzIGhpc3RvcnkgZnJvbSBcIi4vc3JjL2hpc3RvcnkudHNcIjtcbmV4cG9ydCAqIGFzIGlkZW50aXR5IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0ICogYXMgbWNwIGZyb20gXCIuL3NyYy9tY3AudHNcIjtcbmV4cG9ydCAqIGFzIG1lbW9yeSBmcm9tIFwiLi9zcmMvbWVtb3J5LnRzXCI7XG5leHBvcnQgKiBhcyBtbGZsb3cgZnJvbSBcIi4vc3JjL21sZmxvdy50c1wiO1xuZXhwb3J0ICogYXMgbW9kZWwgZnJvbSBcIi4vc3JjL21vZGVsLnRzXCI7XG5leHBvcnQgKiBhcyBvYnNlcnZhYmlsaXR5IGZyb20gXCIuL3NyYy9vYnNlcnZhYmlsaXR5LnRzXCI7XG5leHBvcnQgKiBhcyBwYWdpbmF0aW9uIGZyb20gXCIuL3NyYy9wYWdpbmF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyBwbHVnaW4gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0ICogYXMgcHJvY2Vzc29ycyBmcm9tIFwiLi9zcmMvcHJvY2Vzc29ycy50c1wiO1xuZXhwb3J0ICogYXMgcmVzdCBmcm9tIFwiLi9zcmMvcmVzdC50c1wiO1xuZXhwb3J0ICogYXMgc2VydmVyIGZyb20gXCIuL3NyYy9zZXJ2ZXIudHNcIjtcbmV4cG9ydCAqIGFzIHNlcnZpbmcgZnJvbSBcIi4vc3JjL3NlcnZpbmcudHNcIjtcbmV4cG9ydCAqIGFzIHNlcnZpbmdTYW5pdGl6ZSBmcm9tIFwiLi9zcmMvc2VydmluZy1zYW5pdGl6ZS50c1wiO1xuZXhwb3J0ICogYXMgc3RhdGVtZW50IGZyb20gXCIuL3NyYy9zdGF0ZW1lbnQudHNcIjtcbmV4cG9ydCAqIGFzIHN0b3JhZ2VTY2hlbWEgZnJvbSBcIi4vc3JjL3N0b3JhZ2Utc2NoZW1hLnRzXCI7XG5leHBvcnQgKiBhcyBzdW1tYXJpemUgZnJvbSBcIi4vc3JjL3N1bW1hcml6ZS50c1wiO1xuZXhwb3J0ICogYXMgdGhyZWFkcyBmcm9tIFwiLi9zcmMvdGhyZWFkcy50c1wiO1xuZXhwb3J0ICogYXMgdmFsaWRhdGlvbiBmcm9tIFwiLi9zcmMvdmFsaWRhdGlvbi50c1wiO1xuZXhwb3J0ICogYXMgd29ya3NwYWNlcyBmcm9tIFwiLi9zcmMvd29ya3NwYWNlcy50c1wiO1xuZXhwb3J0ICogYXMgd3JpdGVyIGZyb20gXCIuL3NyYy93cml0ZXIudHNcIjtcbmV4cG9ydCB7IHRvb2wsIGNyZWF0ZUFnZW50LCBGQUxMQkFDS19BR0VOVF9JRCwgREVGQVVMVF9BR0VOVF9NQVhfU1RFUFMsIERFRkFVTFRfU1RZTEVfSU5TVFJVQ1RJT05TLCBidWlsZEFnZW50cywgYXBwcm92YWxHYXRlZFRvb2xJZHMgfSBmcm9tIFwiLi9zcmMvYWdlbnRzLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1hc3RyYVRvb2xzLCBBcHBLaXRUb29sT3B0aW9ucywgVG9vbGtpdE9wdGlvbnMsIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciwgTWFzdHJhUGx1Z2lucywgTWFzdHJhVG9vbHNGbiwgTWFzdHJhQWdlbnRXb3Jrc3BhY2VSZXNvbHZlciwgTWFzdHJhQWdlbnREZWZpbml0aW9uLCBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGUsIE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlLCBCdWlsdEFnZW50cyB9IGZyb20gXCIuL3NyYy9hZ2VudHMudHNcIjtcbmV4cG9ydCB7IGNoYXJ0UGxhblNjaGVtYSwgY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYSwgcHJlcGFyZUNoYXJ0LCBmZXRjaENoYXJ0LCBidWlsZFJlbmRlckRhdGFUb29sIH0gZnJvbSBcIi4vc3JjL2NoYXJ0LnRzXCI7XG5leHBvcnQgdHlwZSB7IENoYXJ0UGxhbm5lclJlcXVlc3QsIFByZXBhcmVDaGFydE9wdGlvbnMsIEZldGNoQ2hhcnRPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2NoYXJ0LnRzXCI7XG5leHBvcnQgeyBNQVNUUkFfVVNFUl9LRVksIE1BU1RSQV9VU0VSX05BTUVfS0VZLCBNQVNUUkFfVVNFUl9FTUFJTF9LRVksIE1BU1RSQV9SRVFVRVNUX0lEX0tFWSwgTUFTVFJBX1NDT1BFU19LRVksIFRSQUNFX1JFUVVFU1RfQ09OVEVYVF9LRVlTLCBleGVjdXRpb25Db250ZXh0VXNlcklkLCBhdHRyaWJ1dGVkVXNlcklkLCByZXNvbHZlVXNlcktleSwgTUFTVFJBX0NPTkZJR19TQ0hFTUEgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgdHlwZSB7IFVzZXIsIE1hc3RyYU1lbW9yeUNvbmZpZywgTWFzdHJhTWNwQ29uZmlnLCBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgeyBtb2RlbENhdGFsb2d1ZURlZmF1bHRzLCBnZW5pZVN1Z2dlc3Rpb25EZWZhdWx0cywgc3RhdGVtZW50RGF0YURlZmF1bHRzLCBjaGFydEZldGNoRGVmYXVsdHMsIGZlZWRiYWNrV3JpdGVEZWZhdWx0cyB9IGZyb20gXCIuL3NyYy9kZWZhdWx0cy50c1wiO1xuZXhwb3J0IHsgbm9ybWFsaXplRGF0YWJyaWNrc0Jhc2VQYXRoLCBpc0RiZnNQYXRoLCBpc1dvcmtzcGFjZUZpbGVzUGF0aCwgcmVzb2x2ZURhdGFicmlja3NBYnNvbHV0ZVBhdGgsIHRvRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGgsIERhdGFicmlja3NXb3Jrc3BhY2VGaWxlc3lzdGVtLCBlbXB0eUZpbGVzeXN0ZW0gfSBmcm9tIFwiLi9zcmMvZmlsZXN5c3RlbXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgRGF0YWJyaWNrc01rZGlyc01vZGUsIERhdGFicmlja3NXb3Jrc3BhY2VGaWxlc3lzdGVtT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9maWxlc3lzdGVtcy50c1wiO1xuZXhwb3J0IHsgREVGQVVMVF9HRU5JRV9BTElBUywgR0VOSUVfSU5TVFJVQ1RJT05TLCBub3JtYWxpemVHZW5pZVNwYWNlcywgcmVzb2x2ZUdlbmllU3BhY2VzLCBidWlsZEdlbmllVG9vbHMsIGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXIsIGNvbGxlY3RTcGFjZVN1Z2dlc3Rpb25zIH0gZnJvbSBcIi4vc3JjL2dlbmllLnRzXCI7XG5leHBvcnQgdHlwZSB7IEdlbmllU3BhY2VDb25maWcsIEdlbmllU3BhY2VzQ29uZmlnIH0gZnJvbSBcIi4vc3JjL2dlbmllLnRzXCI7XG5leHBvcnQgeyBsb2FkSGlzdG9yeSwgY2xlYXJIaXN0b3J5LCBoaXN0b3J5Um91dGUgfSBmcm9tIFwiLi9zcmMvaGlzdG9yeS50c1wiO1xuZXhwb3J0IHR5cGUgeyBMb2FkSGlzdG9yeU9wdGlvbnMsIENsZWFySGlzdG9yeU9wdGlvbnMsIEhpc3RvcnlSb3V0ZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvaGlzdG9yeS50c1wiO1xuZXhwb3J0IHsgSURFTlRJVFlfRU5WLCBJREVOVElUWV9NT0RFUywgREVGQVVMVF9JREVOVElUWV9NT0RFLCByZXNvbHZlSWRlbnRpdHlNb2RlLCBVU0VSX0lEX0hFQURFUiwgVVNFUl9FTUFJTF9IRUFERVIsIHJlcXVlc3RVc2VySWQsIHJlcXVlc3RVc2VyRW1haWwsIHVzZVNlcnZpY2VQcmluY2lwYWwgfSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhSWRlbnRpdHlNb2RlIH0gZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgeyBidWlsZE1jcFNlcnZlciB9IGZyb20gXCIuL3NyYy9tY3AudHNcIjtcbmV4cG9ydCB0eXBlIHsgUmVzb2x2ZWRNY3AgfSBmcm9tIFwiLi9zcmMvbWNwLnRzXCI7XG5leHBvcnQgeyBjcmVhdGVTZXJ2aWNlUHJpbmNpcGFsUG9vbCwgbmVlZHNMYWtlYmFzZSwgY3JlYXRlTWVtb3J5QnVpbGRlciwgTWVtb3J5QnVpbGRlciB9IGZyb20gXCIuL3NyYy9tZW1vcnkudHNcIjtcbmV4cG9ydCB7IG1sZmxvd0VuYWJsZWQsIHJlc29sdmVGZWVkYmFja0VuYWJsZWQsIGxvZ0ZlZWRiYWNrIH0gZnJvbSBcIi4vc3JjL21sZmxvdy50c1wiO1xuZXhwb3J0IHR5cGUgeyBMb2dGZWVkYmFja1BhcmFtcyB9IGZyb20gXCIuL3NyYy9tbGZsb3cudHNcIjtcbmV4cG9ydCB7IGJ1aWxkTW9kZWwgfSBmcm9tIFwiLi9zcmMvbW9kZWwudHNcIjtcbmV4cG9ydCB0eXBlIHsgQnVpbGRNb2RlbE92ZXJyaWRlcyB9IGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0IHsgaXNPdGxwVHJhY2luZ0NvbmZpZ3VyZWQsIGJ1aWxkT2JzZXJ2YWJpbGl0eSB9IGZyb20gXCIuL3NyYy9vYnNlcnZhYmlsaXR5LnRzXCI7XG5leHBvcnQgdHlwZSB7IEJ1aWxkT2JzZXJ2YWJpbGl0eU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvb2JzZXJ2YWJpbGl0eS50c1wiO1xuZXhwb3J0IHsgY2xhbXBQZXJQYWdlLCBwYXJzZUludFBhcmFtIH0gZnJvbSBcIi4vc3JjL3BhZ2luYXRpb24udHNcIjtcbmV4cG9ydCB0eXBlIHsgUGVyUGFnZUJvdW5kcyB9IGZyb20gXCIuL3NyYy9wYWdpbmF0aW9uLnRzXCI7XG5leHBvcnQgeyBNYXN0cmFQbHVnaW4sIG1hc3RyYSB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB7IHN0cmlwU3RhbGVDaGFydHNQcm9jZXNzb3IsIFJlc3VsdFByb2Nlc3NvciB9IGZyb20gXCIuL3NyYy9wcm9jZXNzb3JzLnRzXCI7XG5leHBvcnQgeyBkYXRhYnJpY2tzRmV0Y2gsIHJlYWRSZXNwb25zZVRleHQsIHJlYWRSZXNwb25zZUpzb24gfSBmcm9tIFwiLi9zcmMvcmVzdC50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzRmV0Y2hJbml0IH0gZnJvbSBcIi4vc3JjL3Jlc3QudHNcIjtcbmV4cG9ydCB7IHN0YW1wUmVxdWVzdENvbnRleHRVc2VyLCBjcmVhdGVSZXF1ZXN0Q29udGV4dCwgTWFzdHJhU2VydmVyLCBpc01hc3RyYVJlcXVlc3RBbGxvd2VkLCBhdHRhY2hSb3V0ZVBhdGNoTWlkZGxld2FyZSB9IGZyb20gXCIuL3NyYy9zZXJ2ZXIudHNcIjtcbmV4cG9ydCB0eXBlIHsgQXR0cmlidXRlZElkZW50aXR5LCBNYXN0cmFBcGlHYXRlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9zZXJ2ZXIudHNcIjtcbmV4cG9ydCB7IE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVksIGV4dHJhY3RNb2RlbE92ZXJyaWRlLCByZXNvbHZlU2VydmluZ0NvbmZpZyB9IGZyb20gXCIuL3NyYy9zZXJ2aW5nLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsT3ZlcnJpZGVSZXF1ZXN0IH0gZnJvbSBcIi4vc3JjL3NlcnZpbmcudHNcIjtcbmV4cG9ydCB7IHJld3JpdGVTZXJ2aW5nQm9keSwgc3RyaXBSZWFzb25pbmdGcm9tU2VydmluZ01lc3NhZ2VzLCByZXBhaXJBc3Npc3RhbnRQcmVmaWxsLCByZXdyaXRlU2VydmluZ1Jlc3BvbnNlQm9keSwgZmxhdHRlbkNob2ljZU1lc3NhZ2VDb250ZW50IH0gZnJvbSBcIi4vc3JjL3NlcnZpbmctc2FuaXRpemUudHNcIjtcbmV4cG9ydCB0eXBlIHsgU2VydmluZ0NoYXRNZXNzYWdlIH0gZnJvbSBcIi4vc3JjL3NlcnZpbmctc2FuaXRpemUudHNcIjtcbmV4cG9ydCB7IFNUQVRFTUVOVF9ST1dfQ0FQLCBmZXRjaFN0YXRlbWVudERhdGEgfSBmcm9tIFwiLi9zcmMvc3RhdGVtZW50LnRzXCI7XG5leHBvcnQgeyBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lIH0gZnJvbSBcIi4vc3JjL3N0b3JhZ2Utc2NoZW1hLnRzXCI7XG5leHBvcnQgeyBUSVRMRV9JTlNUUlVDVElPTlMsIHN1bW1hcnlNb2RlbCwgc3VtbWFyaXplVGV4dCwgYnVpbGRTdW1tYXJpemVUb29sIH0gZnJvbSBcIi4vc3JjL3N1bW1hcml6ZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBTdW1tYXJpemVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3N1bW1hcml6ZS50c1wiO1xuZXhwb3J0IHsgbGlzdFRocmVhZHMsIGRlbGV0ZVRocmVhZCwgcmVuYW1lVGhyZWFkLCB0aHJlYWRzUm91dGUgfSBmcm9tIFwiLi9zcmMvdGhyZWFkcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBMaXN0VGhyZWFkc09wdGlvbnMsIERlbGV0ZVRocmVhZE9wdGlvbnMsIFJlbmFtZVRocmVhZE9wdGlvbnMsIFRocmVhZHNSb3V0ZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvdGhyZWFkcy50c1wiO1xuZXhwb3J0IHsgaW52YWxpZEZpZWxkcyB9IGZyb20gXCIuL3NyYy92YWxpZGF0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNjaGVtYUlzc3VlcyB9IGZyb20gXCIuL3NyYy92YWxpZGF0aW9uLnRzXCI7XG5leHBvcnQgeyBjcmVhdGVXb3Jrc3BhY2UgfSBmcm9tIFwiLi9zcmMvd29ya3NwYWNlcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBDcmVhdGVXb3Jrc3BhY2VPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZXMudHNcIjtcbmV4cG9ydCB7IHNhZmVXcml0ZSB9IGZyb20gXCIuL3NyYy93cml0ZXIudHNcIjtcbiJdfQ==
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxXQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLGFBQWEsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEtBQUssVUFBVSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssWUFBWSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFP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QU0saUJBQWlCLENBQUM7QUFFbEosT0FBTyxFQUFFLHlCQUF5QixFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFekcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGlDQUFpQyxFQUFFLHNCQUFzQixFQUFFLDBCQUEwQixFQUFFLDJCQUEyQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFbkwsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV6RyxPQUFPLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFekYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgKiBhcyBhZ2VudHMgZnJvbSBcIi4vc3JjL2FnZW50cy50c1wiO1xuZXhwb3J0ICogYXMgY2hhcnQgZnJvbSBcIi4vc3JjL2NoYXJ0LnRzXCI7XG5leHBvcnQgKiBhcyBjb25maWcgZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0ICogYXMgZGVmYXVsdHMgZnJvbSBcIi4vc3JjL2RlZmF1bHRzLnRzXCI7XG5leHBvcnQgKiBhcyBmaWxlc3lzdGVtcyBmcm9tIFwiLi9zcmMvZmlsZXN5c3RlbXMudHNcIjtcbmV4cG9ydCAqIGFzIGdlbmllIGZyb20gXCIuL3NyYy9nZW5pZS50c1wiO1xuZXhwb3J0ICogYXMgaGlzdG9yeSBmcm9tIFwiLi9zcmMvaGlzdG9yeS50c1wiO1xuZXhwb3J0ICogYXMgaWRlbnRpdHkgZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgKiBhcyBtY3AgZnJvbSBcIi4vc3JjL21jcC50c1wiO1xuZXhwb3J0ICogYXMgbWVtb3J5IGZyb20gXCIuL3NyYy9tZW1vcnkudHNcIjtcbmV4cG9ydCAqIGFzIG1sZmxvdyBmcm9tIFwiLi9zcmMvbWxmbG93LnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbCBmcm9tIFwiLi9zcmMvbW9kZWwudHNcIjtcbmV4cG9ydCAqIGFzIG9ic2VydmFiaWxpdHkgZnJvbSBcIi4vc3JjL29ic2VydmFiaWxpdHkudHNcIjtcbmV4cG9ydCAqIGFzIHBhZ2luYXRpb24gZnJvbSBcIi4vc3JjL3BhZ2luYXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIHBsdWdpbiBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgKiBhcyBwcm9jZXNzb3JzIGZyb20gXCIuL3NyYy9wcm9jZXNzb3JzLnRzXCI7XG5leHBvcnQgKiBhcyByZW1vdGVTa2lsbHMgZnJvbSBcIi4vc3JjL3JlbW90ZS1za2lsbHMudHNcIjtcbmV4cG9ydCAqIGFzIHJlc3QgZnJvbSBcIi4vc3JjL3Jlc3QudHNcIjtcbmV4cG9ydCAqIGFzIHNlcnZlciBmcm9tIFwiLi9zcmMvc2VydmVyLnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2aW5nIGZyb20gXCIuL3NyYy9zZXJ2aW5nLnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2aW5nU2FuaXRpemUgZnJvbSBcIi4vc3JjL3NlcnZpbmctc2FuaXRpemUudHNcIjtcbmV4cG9ydCAqIGFzIHN0YXRlbWVudCBmcm9tIFwiLi9zcmMvc3RhdGVtZW50LnRzXCI7XG5leHBvcnQgKiBhcyBzdG9yYWdlU2NoZW1hIGZyb20gXCIuL3NyYy9zdG9yYWdlLXNjaGVtYS50c1wiO1xuZXhwb3J0ICogYXMgc3VtbWFyaXplIGZyb20gXCIuL3NyYy9zdW1tYXJpemUudHNcIjtcbmV4cG9ydCAqIGFzIHRocmVhZHMgZnJvbSBcIi4vc3JjL3RocmVhZHMudHNcIjtcbmV4cG9ydCAqIGFzIHZhbGlkYXRpb24gZnJvbSBcIi4vc3JjL3ZhbGlkYXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIHdvcmtzcGFjZXMgZnJvbSBcIi4vc3JjL3dvcmtzcGFjZXMudHNcIjtcbmV4cG9ydCAqIGFzIHdyaXRlciBmcm9tIFwiLi9zcmMvd3JpdGVyLnRzXCI7XG5leHBvcnQgeyB0b29sLCBjcmVhdGVBZ2VudCwgRkFMTEJBQ0tfQUdFTlRfSUQsIERFRkFVTFRfQUdFTlRfTUFYX1NURVBTLCBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OUywgYnVpbGRBZ2VudHMsIGFwcHJvdmFsR2F0ZWRUb29sSWRzIH0gZnJvbSBcIi4vc3JjL2FnZW50cy50c1wiO1xuZXhwb3J0IHR5cGUgeyBNYXN0cmFUb29scywgQXBwS2l0VG9vbE9wdGlvbnMsIFRvb2xraXRPcHRpb25zLCBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIsIE1hc3RyYVBsdWdpbnMsIE1hc3RyYVRvb2xzRm4sIE1hc3RyYUFnZW50V29ya3NwYWNlUmVzb2x2ZXIsIE1hc3RyYUFnZW50RGVmaW5pdGlvbiwgTWFzdHJhU3RvcmFnZUNvbmZpZ092ZXJyaWRlLCBNYXN0cmFNZW1vcnlDb25maWdPdmVycmlkZSwgQnVpbHRBZ2VudHMgfSBmcm9tIFwiLi9zcmMvYWdlbnRzLnRzXCI7XG5leHBvcnQgeyBjaGFydFBsYW5TY2hlbWEsIGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWEsIHByZXBhcmVDaGFydCwgZmV0Y2hDaGFydCwgYnVpbGRSZW5kZXJEYXRhVG9vbCB9IGZyb20gXCIuL3NyYy9jaGFydC50c1wiO1xuZXhwb3J0IHR5cGUgeyBDaGFydFBsYW5uZXJSZXF1ZXN0LCBQcmVwYXJlQ2hhcnRPcHRpb25zLCBGZXRjaENoYXJ0T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9jaGFydC50c1wiO1xuZXhwb3J0IHsgTUFTVFJBX1VTRVJfS0VZLCBNQVNUUkFfVVNFUl9OQU1FX0tFWSwgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLCBNQVNUUkFfUkVRVUVTVF9JRF9LRVksIE1BU1RSQV9TQ09QRVNfS0VZLCBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZUywgZXhlY3V0aW9uQ29udGV4dFVzZXJJZCwgYXR0cmlidXRlZFVzZXJJZCwgcmVzb2x2ZVVzZXJLZXksIE1BU1RSQV9DT05GSUdfU0NIRU1BIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBVc2VyLCBNYXN0cmFNZW1vcnlDb25maWcsIE1hc3RyYU1jcENvbmZpZywgTWFzdHJhUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHsgbW9kZWxDYXRhbG9ndWVEZWZhdWx0cywgZ2VuaWVTdWdnZXN0aW9uRGVmYXVsdHMsIHN0YXRlbWVudERhdGFEZWZhdWx0cywgY2hhcnRGZXRjaERlZmF1bHRzLCBmZWVkYmFja1dyaXRlRGVmYXVsdHMgfSBmcm9tIFwiLi9zcmMvZGVmYXVsdHMudHNcIjtcbmV4cG9ydCB7IG5vcm1hbGl6ZURhdGFicmlja3NCYXNlUGF0aCwgaXNEYmZzUGF0aCwgaXNXb3Jrc3BhY2VGaWxlc1BhdGgsIHJlc29sdmVEYXRhYnJpY2tzQWJzb2x1dGVQYXRoLCB0b0RhdGFicmlja3NXb3Jrc3BhY2VQYXRoLCBEYXRhYnJpY2tzV29ya3NwYWNlRmlsZXN5c3RlbSwgZW1wdHlGaWxlc3lzdGVtIH0gZnJvbSBcIi4vc3JjL2ZpbGVzeXN0ZW1zLnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NNa2RpcnNNb2RlLCBEYXRhYnJpY2tzV29ya3NwYWNlRmlsZXN5c3RlbU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZmlsZXN5c3RlbXMudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfR0VOSUVfQUxJQVMsIEdFTklFX0lOU1RSVUNUSU9OUywgbm9ybWFsaXplR2VuaWVTcGFjZXMsIHJlc29sdmVHZW5pZVNwYWNlcywgYnVpbGRHZW5pZVRvb2xzLCBidWlsZEdlbmllVG9vbGtpdFByb3ZpZGVyLCBjb2xsZWN0U3BhY2VTdWdnZXN0aW9ucyB9IGZyb20gXCIuL3NyYy9nZW5pZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBHZW5pZVNwYWNlQ29uZmlnLCBHZW5pZVNwYWNlc0NvbmZpZyB9IGZyb20gXCIuL3NyYy9nZW5pZS50c1wiO1xuZXhwb3J0IHsgbG9hZEhpc3RvcnksIGNsZWFySGlzdG9yeSwgaGlzdG9yeVJvdXRlIH0gZnJvbSBcIi4vc3JjL2hpc3RvcnkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTG9hZEhpc3RvcnlPcHRpb25zLCBDbGVhckhpc3RvcnlPcHRpb25zLCBIaXN0b3J5Um91dGVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2hpc3RvcnkudHNcIjtcbmV4cG9ydCB7IElERU5USVRZX0VOViwgSURFTlRJVFlfTU9ERVMsIERFRkFVTFRfSURFTlRJVFlfTU9ERSwgcmVzb2x2ZUlkZW50aXR5TW9kZSwgVVNFUl9JRF9IRUFERVIsIFVTRVJfRU1BSUxfSEVBREVSLCByZXF1ZXN0VXNlcklkLCByZXF1ZXN0VXNlckVtYWlsLCB1c2VTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1hc3RyYUlkZW50aXR5TW9kZSB9IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0IHsgYnVpbGRNY3BTZXJ2ZXIgfSBmcm9tIFwiLi9zcmMvbWNwLnRzXCI7XG5leHBvcnQgdHlwZSB7IFJlc29sdmVkTWNwIH0gZnJvbSBcIi4vc3JjL21jcC50c1wiO1xuZXhwb3J0IHsgY3JlYXRlU2VydmljZVByaW5jaXBhbFBvb2wsIG5lZWRzTGFrZWJhc2UsIGNyZWF0ZU1lbW9yeUJ1aWxkZXIsIE1lbW9yeUJ1aWxkZXIgfSBmcm9tIFwiLi9zcmMvbWVtb3J5LnRzXCI7XG5leHBvcnQgeyBtbGZsb3dFbmFibGVkLCByZXNvbHZlRmVlZGJhY2tFbmFibGVkLCBsb2dGZWVkYmFjayB9IGZyb20gXCIuL3NyYy9tbGZsb3cudHNcIjtcbmV4cG9ydCB0eXBlIHsgTG9nRmVlZGJhY2tQYXJhbXMgfSBmcm9tIFwiLi9zcmMvbWxmbG93LnRzXCI7XG5leHBvcnQgeyBidWlsZE1vZGVsIH0gZnJvbSBcIi4vc3JjL21vZGVsLnRzXCI7XG5leHBvcnQgdHlwZSB7IEJ1aWxkTW9kZWxPdmVycmlkZXMgfSBmcm9tIFwiLi9zcmMvbW9kZWwudHNcIjtcbmV4cG9ydCB7IGlzT3RscFRyYWNpbmdDb25maWd1cmVkLCBidWlsZE9ic2VydmFiaWxpdHkgfSBmcm9tIFwiLi9zcmMvb2JzZXJ2YWJpbGl0eS50c1wiO1xuZXhwb3J0IHR5cGUgeyBCdWlsZE9ic2VydmFiaWxpdHlPcHRpb25zIH0gZnJvbSBcIi4vc3JjL29ic2VydmFiaWxpdHkudHNcIjtcbmV4cG9ydCB7IGNsYW1wUGVyUGFnZSwgcGFyc2VJbnRQYXJhbSB9IGZyb20gXCIuL3NyYy9wYWdpbmF0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IFBlclBhZ2VCb3VuZHMgfSBmcm9tIFwiLi9zcmMvcGFnaW5hdGlvbi50c1wiO1xuZXhwb3J0IHsgTWFzdHJhUGx1Z2luLCBtYXN0cmEgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgeyBzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yLCBSZXN1bHRQcm9jZXNzb3IgfSBmcm9tIFwiLi9zcmMvcHJvY2Vzc29ycy50c1wiO1xuZXhwb3J0IHsgbm9ybWFsaXplUmVtb3RlU2tpbGxzT3B0aW9uLCBwcm92aXNpb25SZW1vdGVTa2lsbHMgfSBmcm9tIFwiLi9zcmMvcmVtb3RlLXNraWxscy50c1wiO1xuZXhwb3J0IHR5cGUgeyBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnMsIFJlbW90ZVNraWxsU291cmNlLCBSZW1vdGVTa2lsbHNPcHRpb24sIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsIFByb3Zpc2lvbmVkUmVtb3RlU2tpbGxzIH0gZnJvbSBcIi4vc3JjL3JlbW90ZS1za2lsbHMudHNcIjtcbmV4cG9ydCB7IGRhdGFicmlja3NGZXRjaCwgcmVhZFJlc3BvbnNlVGV4dCwgcmVhZFJlc3BvbnNlSnNvbiB9IGZyb20gXCIuL3NyYy9yZXN0LnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NGZXRjaEluaXQgfSBmcm9tIFwiLi9zcmMvcmVzdC50c1wiO1xuZXhwb3J0IHsgc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXIsIGNyZWF0ZVJlcXVlc3RDb250ZXh0LCBNYXN0cmFTZXJ2ZXIsIGlzTWFzdHJhUmVxdWVzdEFsbG93ZWQsIGF0dGFjaFJvdXRlUGF0Y2hNaWRkbGV3YXJlIH0gZnJvbSBcIi4vc3JjL3NlcnZlci50c1wiO1xuZXhwb3J0IHR5cGUgeyBBdHRyaWJ1dGVkSWRlbnRpdHksIE1hc3RyYUFwaUdhdGVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3NlcnZlci50c1wiO1xuZXhwb3J0IHsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSwgZXh0cmFjdE1vZGVsT3ZlcnJpZGUsIHJlc29sdmVTZXJ2aW5nQ29uZmlnIH0gZnJvbSBcIi4vc3JjL3NlcnZpbmcudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxPdmVycmlkZVJlcXVlc3QgfSBmcm9tIFwiLi9zcmMvc2VydmluZy50c1wiO1xuZXhwb3J0IHsgcmV3cml0ZVNlcnZpbmdCb2R5LCBzdHJpcFJlYXNvbmluZ0Zyb21TZXJ2aW5nTWVzc2FnZXMsIHJlcGFpckFzc2lzdGFudFByZWZpbGwsIHJld3JpdGVTZXJ2aW5nUmVzcG9uc2VCb2R5LCBmbGF0dGVuQ2hvaWNlTWVzc2FnZUNvbnRlbnQgfSBmcm9tIFwiLi9zcmMvc2VydmluZy1zYW5pdGl6ZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBTZXJ2aW5nQ2hhdE1lc3NhZ2UgfSBmcm9tIFwiLi9zcmMvc2VydmluZy1zYW5pdGl6ZS50c1wiO1xuZXhwb3J0IHsgU1RBVEVNRU5UX1JPV19DQVAsIGZldGNoU3RhdGVtZW50RGF0YSB9IGZyb20gXCIuL3NyYy9zdGF0ZW1lbnQudHNcIjtcbmV4cG9ydCB7IGFnZW50U3RvcmFnZVNjaGVtYU5hbWUgfSBmcm9tIFwiLi9zcmMvc3RvcmFnZS1zY2hlbWEudHNcIjtcbmV4cG9ydCB7IFRJVExFX0lOU1RSVUNUSU9OUywgc3VtbWFyeU1vZGVsLCBzdW1tYXJpemVUZXh0LCBidWlsZFN1bW1hcml6ZVRvb2wgfSBmcm9tIFwiLi9zcmMvc3VtbWFyaXplLnRzXCI7XG5leHBvcnQgdHlwZSB7IFN1bW1hcml6ZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc3VtbWFyaXplLnRzXCI7XG5leHBvcnQgeyBsaXN0VGhyZWFkcywgZGVsZXRlVGhyZWFkLCByZW5hbWVUaHJlYWQsIHRocmVhZHNSb3V0ZSB9IGZyb20gXCIuL3NyYy90aHJlYWRzLnRzXCI7XG5leHBvcnQgdHlwZSB7IExpc3RUaHJlYWRzT3B0aW9ucywgRGVsZXRlVGhyZWFkT3B0aW9ucywgUmVuYW1lVGhyZWFkT3B0aW9ucywgVGhyZWFkc1JvdXRlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy90aHJlYWRzLnRzXCI7XG5leHBvcnQgeyBpbnZhbGlkRmllbGRzIH0gZnJvbSBcIi4vc3JjL3ZhbGlkYXRpb24udHNcIjtcbmV4cG9ydCB0eXBlIHsgU2NoZW1hSXNzdWVzIH0gZnJvbSBcIi4vc3JjL3ZhbGlkYXRpb24udHNcIjtcbmV4cG9ydCB7IGNyZWF0ZVdvcmtzcGFjZSB9IGZyb20gXCIuL3NyYy93b3Jrc3BhY2VzLnRzXCI7XG5leHBvcnQgdHlwZSB7IENyZWF0ZVdvcmtzcGFjZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvd29ya3NwYWNlcy50c1wiO1xuZXhwb3J0IHsgc2FmZVdyaXRlIH0gZnJvbSBcIi4vc3JjL3dyaXRlci50c1wiO1xuIl19
@@ -339,6 +339,12 @@ export declare function buildAgents(opts: {
339
339
  context: plugin.PluginContextLike | undefined;
340
340
  memoryBuilder?: MemoryBuilder;
341
341
  log: log.Logger;
342
+ /**
343
+ * Local skill scan paths (remote skills provisioned to a temp dir at
344
+ * startup) folded into every agent that uses the auto-created default
345
+ * workspace.
346
+ */
347
+ extraSkillPaths?: string[];
342
348
  }): Promise<BuiltAgents>;
343
349
  /**
344
350
  * Tool ids on `tools` that are approval-gated (`requireApproval: true`).
package/lib/src/agents.js CHANGED
@@ -92,9 +92,26 @@ function deriveToolId(description) {
92
92
  * type inference and to match the AppKit API surface.
93
93
  */
94
94
  export function createAgent(def) {
95
- const workspace = def.workspace ?? createWorkspace();
95
+ if (def.workspace)
96
+ return { ...def };
97
+ const workspace = createWorkspace();
98
+ markDefaultWorkspace(workspace);
96
99
  return { ...def, workspace };
97
100
  }
101
+ /**
102
+ * Brand for a {@link Workspace} that `createAgent` built with no caller
103
+ * options, so {@link buildAgents} may rebuild it with startup-provisioned
104
+ * `extraSkillPaths` (a caller-supplied workspace is never touched).
105
+ */
106
+ const DEFAULT_WORKSPACE = Symbol.for("dbx-tools/appkit-mastra/default-workspace");
107
+ /** Brand `workspace` as the auto-created default. */
108
+ function markDefaultWorkspace(workspace) {
109
+ workspace[DEFAULT_WORKSPACE] = true;
110
+ }
111
+ /** Whether `workspace` was auto-created by {@link createAgent}. */
112
+ function isDefaultWorkspace(workspace) {
113
+ return Boolean(workspace && workspace[DEFAULT_WORKSPACE]);
114
+ }
98
115
  /** Fallback agent id used when `config.agents` is omitted entirely. */
99
116
  export const FALLBACK_AGENT_ID = "default";
100
117
  /**
@@ -187,7 +204,7 @@ function defaultAgentDescription(name) {
187
204
  * resolved registry; this is a wiring bug, not a runtime condition.
188
205
  */
189
206
  export async function buildAgents(opts) {
190
- const { config, context, memoryBuilder, log } = opts;
207
+ const { config, context, memoryBuilder, log, extraSkillPaths } = opts;
191
208
  const definitions = resolveDefinitions(config);
192
209
  const ids = Object.keys(definitions);
193
210
  const defaultAgentId = config.defaultAgent ?? ids[0] ?? FALLBACK_AGENT_ID;
@@ -220,7 +237,11 @@ export async function buildAgents(opts) {
220
237
  const approvalGatedByAgent = [];
221
238
  for (const [id, def] of Object.entries(definitions)) {
222
239
  const tools = await resolveTools(def.tools, plugins, ambientTools);
223
- const workspace = resolveAgentWorkspace(def.workspace);
240
+ let workspace = resolveAgentWorkspace(def.workspace);
241
+ if (extraSkillPaths?.length && isDefaultWorkspace(workspace)) {
242
+ workspace = createWorkspace({ extraSkillPaths });
243
+ markDefaultWorkspace(workspace);
244
+ }
224
245
  const gated = approvalGatedToolIds(tools);
225
246
  if (gated.length > 0)
226
247
  approvalGatedByAgent.push({ agentId: id, toolIds: gated });
@@ -551,4 +572,4 @@ function toolkitEntryToMastraTool(entry, plugin) {
551
572
  },
552
573
  });
553
574
  }
554
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FnZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFPLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU3RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSWhELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVqRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFM0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBbUJsRCx5RUFBeUU7QUFDekUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWhEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFDSCxNQUFNLFVBQVUsSUFBSSxDQUFDLElBQXVCO0lBQzFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyRCxPQUFPLFVBQVUsQ0FBQztRQUNoQixFQUFFO1FBQ0YsV0FBVyxFQUFFLElBQUksQ0FBQyxX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SyxFQUFFLEtBQWMsRUFBRSxPQUFnQixFQUFFLEVBQUU7WUFDbEQsTUFBTSxNQUFNLEdBQUksT0FBcUQsRUFBRSxXQUFXLENBQUM7WUFDbkYsT0FBTyxNQUFNLENBQUMsZ0JBQWlCLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbEUsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFnZW50IHJlZ2lzdHJhdGlvbiBmb3IgdGhlIE1hc3RyYSBBcHBLaXQgcGx1Z2luLlxuICpcbiAqIE1pcnJvcnMgdGhlIHNoYXBlIG9mIHRoZSBBcHBLaXQgYGFnZW50c2AgcGx1Z2luIChgY29uZmlnLmFnZW50c2AgbWFwXG4gKiBvZiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9ufSwgZHVhbC1mb3JtIGB0b29sc2AgYWNjZXB0aW5nIGEgcGxhaW5cbiAqIHJlY29yZCBvciBhIGAocGx1Z2lucykgPT4gdG9vbHNgIGNhbGxiYWNrKS4gUmVzb2x2ZXMgZWFjaCBkZWZpbml0aW9uXG4gKiBpbnRvIGEgTWFzdHJhIGBBZ2VudGAgaW5zdGFuY2UgZHVyaW5nIHBsdWdpbiBzZXR1cDsgdXNlci1zdXBwbGllZFxuICogdG9vbCBjYWxsYmFja3MgYXJlIGludm9rZWQgZXhhY3RseSBvbmNlIHdpdGggYSB0eXBlZFxuICoge0BsaW5rIE1hc3RyYVBsdWdpbnN9IG1hcCBidWlsdCBmcm9tIHJlZ2lzdGVyZWQgc2libGluZyBwbHVnaW5zLlxuICpcbiAqIFdoZW4gbm8gYWdlbnRzIGFyZSByZWdpc3RlcmVkIHRoZSBwbHVnaW4gZmFsbHMgYmFjayB0byBhIHNpbmdsZVxuICogYnVpbHQtaW4gYW5hbHlzdCBzbyB0aGUgYmFyZSBgbWFzdHJhKClgIGNhbGwgc3RpbGwgbW91bnRzIGEgd29ya2luZ1xuICogc3RyZWFtYWJsZSBhZ2VudCBmb3IgZGVtb3MuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IHBsdWdpbiB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZmFsbGJhY2sgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgbG9nLCBvYmplY3QsIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IEFnZW50Q29uZmlnLCBUb29sc0lucHV0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHsgQWdlbnQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQgdHlwZSB7IFRvb2wgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Rvb2xzXCI7XG5pbXBvcnQgeyBjcmVhdGVUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2UgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtzcGFjZVwiO1xuaW1wb3J0IHR5cGUgeyBQZ1ZlY3RvckNvbmZpZywgUG9zdGdyZXNTdG9yZUNvbmZpZyB9IGZyb20gXCJAbWFzdHJhL3BnXCI7XG5cbmltcG9ydCB7IGJ1aWxkUmVuZGVyRGF0YVRvb2wgfSBmcm9tIFwiLi9jaGFydC50c1wiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXIsIHJlc29sdmVHZW5pZVNwYWNlcyB9IGZyb20gXCIuL2dlbmllLnRzXCI7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeUJ1aWxkZXIgfSBmcm9tIFwiLi9tZW1vcnkudHNcIjtcbmltcG9ydCB7IGJ1aWxkTW9kZWwgfSBmcm9tIFwiLi9tb2RlbC50c1wiO1xuaW1wb3J0IHsgUmVzdWx0UHJvY2Vzc29yLCBzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy50c1wiO1xuaW1wb3J0IHsgYnVpbGRTdW1tYXJpemVUb29sIH0gZnJvbSBcIi4vc3VtbWFyaXplLnRzXCI7XG5pbXBvcnQgeyBjcmVhdGVXb3Jrc3BhY2UgfSBmcm9tIFwiLi93b3Jrc3BhY2VzLnRzXCI7XG5cbi8qKlxuICogVG9vbCByZWNvcmQgYWNjZXB0ZWQgYnkgZXZlcnkgTWFzdHJhIGBBZ2VudC50b29sc2AgZmllbGQgYW5kIGJ5IHRoZVxuICogYHRvb2xzKHBsdWdpbnMpYCBjYWxsYmFjayBvbiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9ufS5cbiAqXG4gKiBBbGlhcyBvZiBNYXN0cmEncyBgVG9vbHNJbnB1dGAsIHNvIGl0IGFscmVhZHkgYWNjZXB0czpcbiAqXG4gKiAtIE1hc3RyYSB0b29scyBidWlsdCB3aXRoIHtAbGluayBjcmVhdGVUb29sfSAob3IgYG5ldyBUb29sKC4uLilgKVxuICogLSBNYXN0cmEgdG9vbHMgYnVpbHQgd2l0aCB0aGUgQXBwS2l0LXNoYXBlZCB7QGxpbmsgdG9vbH0gd3JhcHBlclxuICogICBiZWxvd1xuICogLSBWZXJjZWwgQUkgU0RLIHRvb2xzIChgdG9vbCh7IC4uLiB9KWAgZnJvbSBgYWlgKVxuICogLSBQcm92aWRlci1kZWZpbmVkIHRvb2xzIChlLmcuIGBvcGVuYWkudG9vbHMud2ViU2VhcmNoKC4uLilgKVxuICpcbiAqIEV4aXN0aW5nIHRvb2wgbGlicmFyaWVzIGRyb3AgaW4gYXMtaXMgLSBub3RoaW5nIGluIHRoaXMgcGFja2FnZVxuICogZm9yY2VzIGEgcmVidWlsZC5cbiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhVG9vbHMgPSBUb29sc0lucHV0O1xuXG4vKiogUmUtZXhwb3J0IG9mIE1hc3RyYSdzIG5hdGl2ZSBgY3JlYXRlVG9vbGAgZm9yIGZ1bGwtZmVhdHVyZSBhY2Nlc3MuICovXG5leHBvcnQgeyBjcmVhdGVUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuXG4vKipcbiAqIEFwcEtpdC1zaGFwZWQgdG9vbCBmYWN0b3J5LiBMZXRzIHVzZXJzIG1peC1hbmQtbWF0Y2ggdG9vbHMgYWNyb3NzXG4gKiBBcHBLaXQncyBgYWdlbnRzYCBwbHVnaW4gYW5kIGBtYXN0cmFgIHdpdGggYSBzaW5nbGUgaW1wb3J0OlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyB0b29sIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuICogaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbiAqXG4gKiBnZXRfd2VhdGhlcjogdG9vbCh7XG4gKiAgIGRlc2NyaXB0aW9uOiBcIldlYXRoZXJcIixcbiAqICAgc2NoZW1hOiB6Lm9iamVjdCh7IGNpdHk6IHouc3RyaW5nKCkgfSksXG4gKiAgIGV4ZWN1dGU6IGFzeW5jICh7IGNpdHkgfSkgPT4gYFN1bm55IGluICR7Y2l0eX1gLFxuICogfSksXG4gKiBgYGBcbiAqXG4gKiBNYXBzIG9udG8gTWFzdHJhJ3MgYGNyZWF0ZVRvb2xgOlxuICpcbiAqIC0gYGRlc2NyaXB0aW9uYCAtPiBgZGVzY3JpcHRpb25gIChyZXF1aXJlZClcbiAqIC0gYHNjaGVtYWAgLT4gYGlucHV0U2NoZW1hYCAob3B0aW9uYWwpXG4gKiAtIGBleGVjdXRlKGlucHV0KWAgLT4gYGV4ZWN1dGUoaW5wdXQsIGN0eClgIC0gTWFzdHJhIGFscmVhZHkgY2FsbHNcbiAqICAgdGhlIGZpcnN0IGFyZyB3aXRoIHRoZSBwYXJzZWQgaW5wdXRzLCBzbyB0aGUgYm9keSBzaGFwZSBpc1xuICogICBpZGVudGljYWwuIFRoZSBNYXN0cmEgYGNvbnRleHRgIGFyZyBpcyBmb3J3YXJkZWQgYXMgdGhlIHNlY29uZFxuICogICBwYXJhbWV0ZXIgd2hlbiB0aGUgY2FsbGVyIGRlY2xhcmVzIGl0LlxuICogLSBgaWRgOiBvcHRpb25hbC4gRGVmYXVsdHMgdG8gYSBzdGFibGUgaWRlbnRpZmllciBkZXJpdmVkIGZyb21cbiAqICAgYGRlc2NyaXB0aW9uYCAoc2x1Z2lmaWVkLCB3aXRoIGEgc2hvcnQgaGFzaCBzdWZmaXggZm9yXG4gKiAgIHVuaXF1ZW5lc3MpLiBQYXNzIGFuIGV4cGxpY2l0IGBpZGAgd2hlbiB5b3UgbmVlZCBhIHN0YWJsZSBzdHJpbmdcbiAqICAgZm9yIHRyYWNpbmcgb3IgTUNQIGV4cG9zdXJlLlxuICpcbiAqIFJlYWNoIGZvciB7QGxpbmsgY3JlYXRlVG9vbH0gd2hlbiB5b3UgbmVlZCBNYXN0cmEtb25seSBmaWVsZHNcbiAqIChgb3V0cHV0U2NoZW1hYCwgYHN1c3BlbmRTY2hlbWFgLCBgcmVxdWlyZUFwcHJvdmFsYCwgYG1jcGAsIGV0Yy4pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9vbChvcHRzOiBBcHBLaXRUb29sT3B0aW9ucyk6IFRvb2wge1xuICBjb25zdCBpZCA9IG9wdHMuaWQgPz8gZGVyaXZlVG9vbElkKG9wdHMuZGVzY3JpcHRpb24pO1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQsXG4gICAgZGVzY3JpcHRpb246IG9wdHMuZGVzY3JpcHRpb24sXG4gICAgLi4uKG9wdHMuc2NoZW1hID8geyBpbnB1dFNjaGVtYTogb3B0cy5zY2hlbWEgYXMgbmV2ZXIgfSA6IHt9KSxcbiAgICBleGVjdXRlOiBvcHRzLmV4ZWN1dGUgYXMgbmV2ZXIsXG4gIH0pO1xufVxuXG4vKipcbiAqIElucHV0IHNoYXBlIGZvciB0aGUgQXBwS2l0LXN0eWxlIHtAbGluayB0b29sfSBmYWN0b3J5LiBBIHRyaW1tZWRcbiAqIHN1YnNldCBvZiBNYXN0cmEncyBgY3JlYXRlVG9vbGAgb3B0aW9ucyB0aGF0IG1pcnJvcnMgdGhlXG4gKiBgQGRhdGFicmlja3MvYXBwa2l0L2JldGFgIGB0b29sKHsgZGVzY3JpcHRpb24sIHNjaGVtYSwgZXhlY3V0ZSB9KWBcbiAqIHNpZ25hdHVyZS5cbiAqXG4gKiBHZW5lcmljcyBhcmUgaW50ZW50aW9uYWxseSBhYnNlbnQgLSBpbmZlcmVuY2UgZmxvd3MgdGhyb3VnaCB0aGVcbiAqIGNhbGxlcidzIGBzY2hlbWFgICh0eXBpY2FsbHkgYSBab2Qgb2JqZWN0KSwgYW5kIHRoZSBgZXhlY3V0ZWAgYm9keVxuICogZGVzdHJ1Y3R1cmVzIG5hdHVyYWxseSBmcm9tIHRoYXQuIFJlYWNoIGZvciB7QGxpbmsgY3JlYXRlVG9vbH0gd2hlblxuICogeW91IG5lZWQgdGhlIGZ1bGx5LXR5cGVkIGlucHV0L291dHB1dCBzY2hlbWFzIHdpcmVkIGV4cGxpY2l0bHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwS2l0VG9vbE9wdGlvbnMge1xuICAvKiogT3B0aW9uYWwgc3RhYmxlIGlkZW50aWZpZXI7IGF1dG8tZGVyaXZlZCBmcm9tIGBkZXNjcmlwdGlvbmAgd2hlbiBvbWl0dGVkLiAqL1xuICBpZD86IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIHNob3duIHRvIHRoZSBtb2RlbC4gUmVxdWlyZWQuICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBpbnB1dCBzY2hlbWEgKGFueSBTdGFuZGFyZCBTY2hlbWEgaW5zdGFuY2UsIGUuZy4gWm9kKS5cbiAgICogTWFwcyB0byBNYXN0cmEncyBgaW5wdXRTY2hlbWFgOyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgbW9kZWxcbiAgICogdmVyYmF0aW0uXG4gICAqL1xuICBzY2hlbWE/OiB1bmtub3duO1xuICAvKipcbiAgICogRXhlY3V0ZSBib2R5LiBGaXJzdCBhcmcgaXMgdGhlIHBhcnNlZCBpbnB1dCAodHlwZWQgb2ZmIGBzY2hlbWFgXG4gICAqIHdoZW4gc3VwcGxpZWQpLCBzZWNvbmQgYXJnIGlzIHRoZSBmdWxsIE1hc3RyYSBleGVjdXRpb24gY29udGV4dFxuICAgKiAocmVxdWVzdCBjb250ZXh0LCBhYm9ydCBzaWduYWwsIG1hc3RyYSBpbnN0YW5jZSkgaWYgeW91IG5lZWQgaXQuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBleGVjdXRlOiAoaW5wdXQ6IGFueSwgY29udGV4dD86IHVua25vd24pID0+IHVua25vd247XG59XG5cbi8qKlxuICogQnVpbGQgYSBkZXRlcm1pbmlzdGljIE1hc3RyYSB0b29sIGlkIGZyb20gYSBkZXNjcmlwdGlvbi5cbiAqIERlbGVnYXRlcyB0byB7QGxpbmsgc3RyaW5nLnRvVW5pcXVlU2x1Z306IHNsdWcgKyBhbHdheXMtb25cbiAqIDYtY2hhciBGTlYtMWEgYmFzZS0zMiBzdWZmaXggc28gdHdvIHRvb2xzIHdpdGggdGhlIHNhbWUgbGVhZGluZ1xuICogd29yZHMgZG9uJ3QgY29sbGlkZSBpbiB0cmFjZXMuIFN0YWJsZSBhY3Jvc3MgcnVucy5cbiAqL1xuZnVuY3Rpb24gZGVyaXZlVG9vbElkKGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3RyaW5nLnRvVW5pcXVlU2x1ZyhkZXNjcmlwdGlvbiwgeyBmYWxsYmFja1ByZWZpeDogXCJ0b29sXCIgfSk7XG59XG5cbi8qKlxuICogSWRlbnRpdHkgaGVscGVyIHRoYXQgYnJhbmRzIGEgZGVmaW5pdGlvbiBhcyBhIE1hc3RyYSBhZ2VudC4gTWlycm9yc1xuICogQXBwS2l0J3MgYGNyZWF0ZUFnZW50KGRlZilgIHNvIHRoZSByZWdpc3RyYXRpb24gc2hhcGUgbWF0Y2hlczpcbiAqXG4gKiBgYGB0c1xuICogY29uc3Qgc3VwcG9ydCA9IGNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiLFxuICogICBtb2RlbDogXCJkYXRhYnJpY2tzLWNsYXVkZS1zb25uZXQtNC02XCIsXG4gKiAgIHRvb2xzKHBsdWdpbnMpIHsgcmV0dXJuIHsgLi4uIH07IH0sXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIFJldHVybnMgdGhlIGRlZmluaXRpb24gdW5jaGFuZ2VkIC0gdGhlIHdyYXBwZXIgZXhpc3RzIG9ubHkgdG8gYW5jaG9yXG4gKiB0eXBlIGluZmVyZW5jZSBhbmQgdG8gbWF0Y2ggdGhlIEFwcEtpdCBBUEkgc3VyZmFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFnZW50PFQgZXh0ZW5kcyBNYXN0cmFBZ2VudERlZmluaXRpb24+KGRlZjogVCk6IFQge1xuICBjb25zdCB3b3Jrc3BhY2UgPSBkZWYud29ya3NwYWNlID8/IGNyZWF0ZVdvcmtzcGFjZSgpO1xuICByZXR1cm4geyAuLi5kZWYsIHdvcmtzcGFjZSB9O1xufVxuXG4vKipcbiAqIEZpbHRlciAvIHJlbmFtZSBvcHRpb25zIGFjY2VwdGVkIGJ5IGV2ZXJ5IHBsdWdpbidzIGAudG9vbGtpdCgpYFxuICogbWV0aG9kLiBNaXJyb3JzIEFwcEtpdCdzIGBUb29sa2l0T3B0aW9uc2AgdmVyYmF0aW0gc28gb3B0aW9ucyBwYXNzXG4gKiB0aHJvdWdoIHVuY2hhbmdlZCAtIHRoZSB1bmRlcmx5aW5nIEFwcEtpdCBwbHVnaW4gZG9lcyB0aGUgZmlsdGVyaW5nXG4gKiBhbmQgd2UganVzdCBhZGFwdCB0aGUgcmVzdWx0aW5nIGVudHJpZXMgaW50byBNYXN0cmEgdG9vbHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbGtpdE9wdGlvbnMge1xuICAvKipcbiAgICogS2V5IHByZWZpeCBwcmVwZW5kZWQgdG8gZXZlcnkgdG9vbCBuYW1lLiBBcHBLaXQncyBkZWZhdWx0IGlzXG4gICAqIGAke3BsdWdpbk5hbWV9LmAgd2hlbiBvbWl0dGVkOyBwYXNzIGFuIGV4cGxpY2l0IGBcIlwiYCB0byBkcm9wIGl0LlxuICAgKi9cbiAgcHJlZml4Pzogc3RyaW5nO1xuICAvKiogQWxsb3dsaXN0IG9mIGxvY2FsIHRvb2wgbmFtZXMuICovXG4gIG9ubHk/OiBzdHJpbmdbXTtcbiAgLyoqIERlbnlsaXN0IG9mIGxvY2FsIHRvb2wgbmFtZXMuICovXG4gIGV4Y2VwdD86IHN0cmluZ1tdO1xuICAvKiogUmVtYXAgc3BlY2lmaWMgbG9jYWwgbmFtZXMgdG8gZGlmZmVyZW50IGtleXMuICovXG4gIHJlbmFtZT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKlxuICogVG9vbGtpdCBwcm92aWRlciBzaGFwZSBldmVyeSBlbnRyeSBpbiB0aGUge0BsaW5rIE1hc3RyYVBsdWdpbnN9IG1hcFxuICogZXhwb3Nlcy4gSWRlbnRpY2FsIHRvIEFwcEtpdCdzIGBQbHVnaW5Ub29sa2l0UHJvdmlkZXJgIC0gYW55IEFwcEtpdFxuICogcGx1Z2luIHRoYXQgaW1wbGVtZW50cyB0aGUgc3RhbmRhcmQgYFRvb2xQcm92aWRlcmAgaW50ZXJmYWNlXG4gKiAoYGdldEFnZW50VG9vbHNgICsgYGV4ZWN1dGVBZ2VudFRvb2xgICsgYHRvb2xraXRgKSBpcyByZWFjaGFibGVcbiAqIHRocm91Z2ggdGhpcyBzdXJmYWNlIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyIHtcbiAgLyoqXG4gICAqIFJldHVybnMgYSBNYXN0cmEtc2hhcGVkIHRvb2xzIHJlY29yZCBhZGFwdGVkIGZyb20gdGhlIHBsdWdpbidzXG4gICAqIGFnZW50IHRvb2xzLiBFYWNoIHRvb2wgZGlzcGF0Y2hlcyBiYWNrIHRocm91Z2ggdGhlIHBsdWdpbidzXG4gICAqIGBleGVjdXRlQWdlbnRUb29sYCBzbyBPQk8gYXV0aCBhbmQgdGVsZW1ldHJ5IHNwYW5zIHN0YXkgaW50YWN0LlxuICAgKi9cbiAgdG9vbGtpdChvcHRzPzogVG9vbGtpdE9wdGlvbnMpOiBNYXN0cmFUb29scztcbn1cblxuLyoqXG4gKiBQbHVnaW4gbWFwIGhhbmRlZCB0byB0aGUgZnVuY3Rpb24gZm9ybSBvZlxuICoge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbi50b29sc30uIE1pcnJvcnMgQXBwS2l0J3MgYFBsdWdpbnNgXG4gKiB0eXBlIGV4YWN0bHk6IGEgc3RyaW5nLWtleWVkIHJlY29yZCB3aGVyZSBldmVyeSB2YWx1ZSBleHBvc2VzXG4gKiBgLnRvb2xraXQob3B0cylgLlxuICpcbiAqIEltcGxlbWVudGVkIGFzIGEgcnVudGltZSBQcm94eSB0aGF0IGF1dG8tZGlzY292ZXJzIGFueSByZWdpc3RlcmVkXG4gKiBBcHBLaXQgcGx1Z2luIGltcGxlbWVudGluZyB0aGUgc3RhbmRhcmQgYFRvb2xQcm92aWRlcmAgaW50ZXJmYWNlXG4gKiAoYGFuYWx5dGljc2AsIGBmaWxlc2AsIGBsYWtlYmFzZWAsIGBnZW5pZWAsIHBsdXMgYW55IHRoaXJkLXBhcnR5XG4gKiBwbHVnaW4gdGhhdCBkb2VzIHRoZSBzYW1lKS4gVW5rbm93biBuYW1lcyByZXNvbHZlIHRvIGB1bmRlZmluZWRgXG4gKiBhdCBydW50aW1lLCBzbyBndWFyZCB3aXRoIGA/LmAgYW5kIGA/PyB7fWAgd2hlbiBzcHJlYWRpbmcgZnJvbSBhXG4gKiBwbHVnaW4gdGhhdCBtYXkgbm90IGJlIHJlZ2lzdGVyZWQgaW4gZXZlcnkgZW52aXJvbm1lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjcmVhdGVBZ2VudCh7XG4gKiAgIGluc3RydWN0aW9uczogXCIuLi5cIixcbiAqICAgdG9vbHMocGx1Z2lucykge1xuICogICAgIHJldHVybiB7XG4gKiAgICAgICAuLi5wbHVnaW5zLmFuYWx5dGljcy50b29sa2l0KCksXG4gKiAgICAgICAuLi5wbHVnaW5zLmZpbGVzLnRvb2xraXQoeyBvbmx5OiBbXCJ1cGxvYWRzLnJlYWRcIl0gfSksXG4gKiAgICAgICBnZXRfd2VhdGhlcjogdG9vbCh7XG4gKiAgICAgICAgIGRlc2NyaXB0aW9uOiBcIldlYXRoZXJcIixcbiAqICAgICAgICAgc2NoZW1hOiB6Lm9iamVjdCh7IGNpdHk6IHouc3RyaW5nKCkgfSksXG4gKiAgICAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IGNpdHkgfSkgPT4gYFN1bm55IGluICR7Y2l0eX1gLFxuICogICAgICAgfSksXG4gKiAgICAgfTtcbiAqICAgfSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVBsdWdpbnMgPSBSZWNvcmQ8c3RyaW5nLCBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXI+O1xuXG4vKiogRnVuY3Rpb24gZm9ybSBvZiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9uLnRvb2xzfS4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVRvb2xzRm4gPSAocGx1Z2luczogTWFzdHJhUGx1Z2lucykgPT4gTWFzdHJhVG9vbHMgfCBQcm9taXNlPE1hc3RyYVRvb2xzPjtcblxuLyoqIEZ1bmN0aW9uIGZvcm0gb2Yge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbi53b3Jrc3BhY2V9LiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhQWdlbnRXb3Jrc3BhY2VSZXNvbHZlciA9ICgpID0+IFdvcmtzcGFjZSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIGNvZGUtZGVmaW5lZCBNYXN0cmEgYWdlbnQuIE1pcnJvcnMgdGhlIHNoYXBlIEFwcEtpdCdzIGBhZ2VudHNgXG4gKiBwbHVnaW4gdXNlcyBmb3IgYEFnZW50RGVmaW5pdGlvbmAuIFRoZSByZWdpc3RyeSBrZXkgdW5kZXJcbiAqIGBjb25maWcuYWdlbnRzYCBpcyB0aGUgYGFnZW50SWRgIHRoZSBjbGllbnQgc3RyZWFtcyBhZ2FpbnN0OyBgbmFtZWBcbiAqIGlzIHB1cmVseSBpbmZvcm1hdGlvbmFsIChkZWZhdWx0cyB0byB0aGUga2V5KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXN0cmFBZ2VudERlZmluaXRpb24ge1xuICAvKiogRGlzcGxheSBuYW1lIHVzZWQgYXMgYEFnZW50Lm5hbWVgLiBEZWZhdWx0cyB0byB0aGUgcmVnaXN0cnkga2V5LiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgbG9uZy1mb3JtIGRlc2NyaXB0aW9uOyBzdXJmYWNlZCBhcyBgQWdlbnQuZGVzY3JpcHRpb25gLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFN5c3RlbSBwcm9tcHQgYm9keS4gKi9cbiAgaW5zdHJ1Y3Rpb25zOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgbW9kZWwgb3ZlcnJpZGUuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBmYWxscyBiYWNrIHRvIHRoZSB3b3Jrc3BhY2VcbiAgICogICBgL3NlcnZpbmctZW5kcG9pbnRzYCByZXNvbHZlciB0aGF0IHtAbGluayBidWlsZE1vZGVsfSBjb25maWd1cmVzXG4gICAqICAgZnJvbSB0aGUgcGVyLXJlcXVlc3QgYFdvcmtzcGFjZUNsaWVudGAuXG4gICAqIC0gYHN0cmluZ2A6IHNob3J0aGFuZCBmb3IgXCJ1c2UgdGhlIGRlZmF1bHQgcmVzb2x2ZXIgYnV0IHN3YXAgdGhlXG4gICAqICAgYG1vZGVsSWRgXCIgKGUuZy4gYFwiZGF0YWJyaWNrcy1tZXRhLWxsYW1hLTMtMy03MGItaW5zdHJ1Y3RcImApLlxuICAgKiAtIEFueSBvdGhlciBNYXN0cmEgYER5bmFtaWNBcmd1bWVudDxNYXN0cmFNb2RlbENvbmZpZz5gOiBwYXNzZWRcbiAgICogICBzdHJhaWdodCB0aHJvdWdoIHRvIGBBZ2VudC5tb2RlbGAuIFVzZSB0aGlzIHdoZW4geW91IG5lZWQgZnVsbFxuICAgKiAgIGNvbnRyb2wgb3ZlciBhdXRoIG9yIHByb3ZpZGVySWQuXG4gICAqL1xuICBtb2RlbD86IEFnZW50Q29uZmlnW1wibW9kZWxcIl0gfCBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgdG9vbCByZWNvcmQuIEVpdGhlciBhIHBsYWluIG1hcCBvciBhIGNhbGxiYWNrIHRoYXRcbiAgICogcmVjZWl2ZXMgdGhlIHR5cGVkIHtAbGluayBNYXN0cmFQbHVnaW5zfSBzaWJsaW5nLXBsdWdpbiBpbmRleCBhbmRcbiAgICogcmV0dXJucyBhIG1hcC4gVGhlIGNhbGxiYWNrIHJ1bnMgZXhhY3RseSBvbmNlIGF0IGFnZW50IHNldHVwOyB0aGVcbiAgICogcmVzdWx0IGlzIGNhY2hlZCBmb3IgdGhlIGFnZW50J3MgbGlmZXRpbWUuXG4gICAqL1xuICB0b29scz86IE1hc3RyYVRvb2xzIHwgTWFzdHJhVG9vbHNGbjtcbiAgLyoqXG4gICAqIFBlci1hZ2VudCBzZW1hbnRpYyByZWNhbGwgKFBnVmVjdG9yKSBvdmVycmlkZS4gQ2FzY2FkZXMgZnJvbVxuICAgKiBgY29uZmlnLm1lbW9yeWA7IHRoZSBhZ2VudCB2YWx1ZSB3aW5zIHdoZW4gc2V0LlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogaW5oZXJpdCBgY29uZmlnLm1lbW9yeWAuIFdoZW4gdGhhdCdzXG4gICAqICAgZW5hYmxlZCwgdGhlIGFnZW50ICoqc2hhcmVzIHRoZSBwbHVnaW4tbGV2ZWwgc2luZ2xldG9uIGBQZ1ZlY3RvcmBcbiAgICogICBpbnN0YW5jZSoqIChjcm9zcy1hZ2VudCBzZW1hbnRpYyByZWNhbGwgYWNyb3NzIHRoZSBzYW1lIGluZGV4KS5cbiAgICogLSBgZmFsc2VgOiBkaXNhYmxlIHNlbWFudGljIHJlY2FsbCBmb3IgdGhpcyBhZ2VudCBvbmx5LlxuICAgKiAtIGB0cnVlYDogZW5hYmxlIHVzaW5nIHRoZSBzaGFyZWQgc2luZ2xldG9uIChzYW1lIGFzIGRlZmF1bHQgd2hlblxuICAgKiAgIHBsdWdpbiBtZW1vcnkgaXMgZW5hYmxlZDsgdXNlZnVsIHRvIG9wdCBpbiB3aGVuIHBsdWdpbiBkaXNhYmxlZCkuXG4gICAqIC0ge0BsaW5rIE1hc3RyYU1lbW9yeUNvbmZpZ30gb2JqZWN0OiBkZWRpY2F0ZWQgYFBnVmVjdG9yYCBmb3IgdGhpc1xuICAgKiAgIGFnZW50IChwcml2YXRlIHJlY2FsbCBpbmRleCkuIEJ5cGFzc2VzIHRoZSBzaGFyZWQgc2luZ2xldG9uLlxuICAgKi9cbiAgbWVtb3J5PzogYm9vbGVhbiB8IE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlO1xuICAvKipcbiAgICogUGVyLWFnZW50IHRocmVhZC9tZXNzYWdlIHN0b3JhZ2UgKGBQb3N0Z3Jlc1N0b3JlYCkgb3ZlcnJpZGUuXG4gICAqIENhc2NhZGVzIGZyb20gYGNvbmZpZy5zdG9yYWdlYDsgdGhlIGFnZW50IHZhbHVlIHdpbnMgd2hlbiBzZXQuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBpbmhlcml0IGBjb25maWcuc3RvcmFnZWAuIFdoZW4gdGhhdCdzXG4gICAqICAgZW5hYmxlZCwgdGhlIGFnZW50IGdldHMgaXRzICoqb3duIHBlci1hZ2VudCBgUG9zdGdyZXNTdG9yZWAqKlxuICAgKiAgIGtleWVkIGJ5IHtAbGluayBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lfSBzbyB0aHJlYWRzIGFuZFxuICAgKiAgIG1lc3NhZ2VzIHN0YXkgaXNvbGF0ZWQgYmV0d2VlbiBhZ2VudHMgaW4gdGhlIHNhbWUgZGF0YWJhc2UuXG4gICAqIC0gYGZhbHNlYDogZGlzYWJsZSBzdG9yYWdlIGZvciB0aGlzIGFnZW50IG9ubHkgKHB1cmVseSBpbi1tZW1vcnkpLlxuICAgKiAtIGB0cnVlYDogZW5hYmxlIHdpdGggdGhlIHBlci1hZ2VudCBkZWZhdWx0IHNjaGVtYS5cbiAgICogLSB7QGxpbmsgTWFzdHJhU3RvcmFnZUNvbmZpZ092ZXJyaWRlfSBvYmplY3Q6IGRlZGljYXRlZFxuICAgKiAgIGBQb3N0Z3Jlc1N0b3JlYCBjb25maWcgKGN1c3RvbSBzY2hlbWEsIGNvbm5lY3Rpb24sIGV0Yy4pLlxuICAgKi9cbiAgc3RvcmFnZT86IGJvb2xlYW4gfCBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGU7XG4gIC8qKlxuICAgKiBNYXN0cmEge0BsaW5rIFdvcmtzcGFjZX0gZm9yIHRoaXMgYWdlbnQgKGZpbGVzeXN0ZW0sIHNhbmRib3gsIG9yIG90aGVyXG4gICAqIHByb3ZpZGVycykuIEFzc2lzdGFudCBza2lsbHMgZnJvbSBEYXRhYnJpY2tzIHdvcmtzcGFjZSBwYXRocyBhcmUgd2lyZWRcbiAgICogdmlhIHtAbGluayBjcmVhdGVXb3Jrc3BhY2V9LlxuICAgKi9cbiAgd29ya3NwYWNlPzogV29ya3NwYWNlIHwgTWFzdHJhQWdlbnRXb3Jrc3BhY2VSZXNvbHZlcjtcbn1cblxuLyoqXG4gKiBEaXN0cmlidXRpdmUgYE9taXRgIHNvIHVuaW9ucyBpbiBgUG9zdGdyZXNTdG9yZUNvbmZpZ2AgL1xuICogYFBnVmVjdG9yQ29uZmlnYCBrZWVwIHRoZWlyIGRpc2NyaW1pbmFudHMgYWZ0ZXIgdGhlIG92ZXJyaWRlIHR5cGVzXG4gKiBzdHJpcCBgaWRgLiBUaGUgYnVpbHQtaW4gYE9taXRgIGNvbGxhcHNlcyB1bmlvbnMgdG8gb25lIHNoYXBlIHdpdGhcbiAqIGNvbW1vbiBmaWVsZHMgb25seSwgd2hpY2ggbG9zZXMgdGhlIGNvbm5lY3Rpb24tc3R5bGUgZGlzY3JpbWluYW50cy5cbiAqL1xudHlwZSBEaXN0cmlidXRpdmVPbWl0PFQsIEsgZXh0ZW5kcyBrZXlvZiBuZXZlcj4gPSBUIGV4dGVuZHMgdW5rbm93biA/IE9taXQ8VCwgSz4gOiBuZXZlcjtcblxuLyoqXG4gKiBgUG9zdGdyZXNTdG9yZUNvbmZpZ2AgbWludXMgYGlkYCAtIHBlci1hZ2VudCBvdmVycmlkZXMgYWNjZXB0IGFueVxuICogTWFzdHJhLXN1cHBvcnRlZCBzdG9yYWdlIHNoYXBlLiBgaWRgIGlzIGZpbGxlZCBpbiBhdXRvbWF0aWNhbGx5XG4gKiBmcm9tIHRoZSBhZ2VudCByZWdpc3RyeSBrZXkgc28gdHJhY2VzIHN0YXkgc3RhYmxlLlxuICovXG5leHBvcnQgdHlwZSBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGUgPSBEaXN0cmlidXRpdmVPbWl0PFBvc3RncmVzU3RvcmVDb25maWcsIFwiaWRcIj4gJiB7XG4gIGlkPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBgUGdWZWN0b3JDb25maWdgIG1pbnVzIGBpZGAgLSBwZXItYWdlbnQgb3ZlcnJpZGVzIGFjY2VwdCBhbnlcbiAqIE1hc3RyYS1zdXBwb3J0ZWQgdmVjdG9yIHNoYXBlLiBgaWRgIGlzIGZpbGxlZCBpbiBhdXRvbWF0aWNhbGx5XG4gKiBmcm9tIHRoZSBhZ2VudCByZWdpc3RyeSBrZXkuXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlID0gRGlzdHJpYnV0aXZlT21pdDxQZ1ZlY3RvckNvbmZpZywgXCJpZFwiPiAmIHtcbiAgaWQ/OiBzdHJpbmc7XG59O1xuXG4vKiogT3V0cHV0IG9mIHtAbGluayBidWlsZEFnZW50c306IHJlc29sdmVkIGFnZW50cyBwbHVzIHRoZSBkZWZhdWx0IGlkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsdEFnZW50cyB7XG4gIGFnZW50czogUmVjb3JkPHN0cmluZywgQWdlbnQ+O1xuICBkZWZhdWx0QWdlbnRJZDogc3RyaW5nO1xuICAvKipcbiAgICogU3RhdGljIGRlZmF1bHQgc2VydmluZy1lbmRwb2ludCBpZCBwZXIgYWdlbnQgaWQsIGFzIHJlc29sdmVkIGJ5XG4gICAqIHtAbGluayBkZXNjcmliZUFnZW50RGVmYXVsdE1vZGVsfS4gYFwiPGR5bmFtaWM+XCJgIHdoZW4gdGhlIG1vZGVsIGlzIGFcbiAgICogZnVuY3Rpb24gZGVjaWRlZCBhdCBjYWxsIHRpbWUuIENvbnN1bWVkIGJ5IHRoZSBwbHVnaW4nc1xuICAgKiBgR0VUIC9kZWZhdWx0LW1vZGVsYCByb3V0ZSBoYW5kbGVyIHNvIHRoZSBjbGllbnQncyBtb2RlbCBwaWNrZXIgY2FuIGxhYmVsXG4gICAqIGl0cyBkZWZhdWx0IG9wdGlvbiB3aXRoIHRoZSByZWFsIGVuZHBvaW50J3MgaHVtYW5pemVkIG5hbWUuXG4gICAqL1xuICBkZWZhdWx0TW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKipcbiAgICogQW1iaWVudCB0b29scyBzaGFyZWQgYWNyb3NzIGV2ZXJ5IGFnZW50ICh0aGUgYnVpbHQtaW4gc3lzdGVtIHRvb2xzXG4gICAqIHNwcmVhZCB3aXRoIGBjb25maWcudG9vbHNgKS4gU3VyZmFjZWQgc28gdGhlIG9wdGlvbmFsIE1DUCBzZXJ2ZXJcbiAgICogY2FuIHJlLWV4cG9zZSB0aGVtIHdoZW4ge0BsaW5rIE1hc3RyYU1jcENvbmZpZy50b29sc30gaXMgZW5hYmxlZC5cbiAgICovXG4gIGFtYmllbnRUb29sczogTWFzdHJhVG9vbHM7XG59XG5cbi8qKiBGYWxsYmFjayBhZ2VudCBpZCB1c2VkIHdoZW4gYGNvbmZpZy5hZ2VudHNgIGlzIG9taXR0ZWQgZW50aXJlbHkuICovXG5leHBvcnQgY29uc3QgRkFMTEJBQ0tfQUdFTlRfSUQgPSBcImRlZmF1bHRcIjtcblxuLyoqXG4gKiBEZWZhdWx0IHBlci10dXJuIHN0ZXAgY2VpbGluZyBhcHBsaWVkIHRvIGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnRcbiAqIHdoZW4ge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5hZ2VudE1heFN0ZXBzfSBpcyB1bnNldC4gU2l6ZWQgdG9cbiAqIGZpdCBhIGRlY29tcG9zZWQgR2VuaWUgdHVybiAoZ3JvdW5kaW5nICsgc2V2ZXJhbCBgYXNrX2dlbmllYFxuICogY2FsbHMgKyBgcHJlcGFyZV9jaGFydGAgcGVyIGRhdGFzZXQgKyB0aGUgZmluYWwtdGV4dCByZXBseSkgd2l0aFxuICogaGVhZHJvb20gZm9yIHRoZSBtb2RlbCB0byBjaGFpbiBhIGNvdXBsZSBvZiBmb2xsb3ctdXBzIGJlZm9yZVxuICogYW5zd2VyaW5nIC0gd2VsbCBhYm92ZSBNYXN0cmEncyBvd24gYGFnZW50LmdlbmVyYXRlYCBkZWZhdWx0IG9mXG4gKiA1LCB3aGljaCB3b3VsZCBjdXQgbXVsdGktc3RlcCBvcmNoZXN0cmF0aW9uIG9mZiBtaWQtbG9vcC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQUdFTlRfTUFYX1NURVBTID0gMjU7XG5cbmNvbnN0IEZBTExCQUNLX0FHRU5UX0lOU1RSVUNUSU9OUyA9IGBZb3UgYXJlIGEgZGF0YSBhbmFseXN0LiBUaGUgdXNlciB3aWxsIGFzayBxdWVzdGlvbnMgYWJvdXRcbmJ1c2luZXNzIG1ldHJpY3MgYW5kIG1heSBzaGFyZSBwZXJzb25hbCBwcmVmZXJlbmNlcyB5b3Ugc2hvdWxkIHJlbWVtYmVyIGFjcm9zcyB0dXJucy5cblxuUnVsZXM6XG5cbjEuIFF1b3RlIG51bWJlcnMgZXhhY3RseS4gTmV2ZXIgaW52ZW50IGRhdGEuXG4yLiBXaGVuIHRoZSB1c2VyIHN0YXRlcyBhIHByZWZlcmVuY2Ugb3IgZHVyYWJsZSBmYWN0IGFib3V0IHRoZW1zZWx2ZXNcbiAgIChcIkknbSBpbiBFVSBzbyB1c2UgRVVSXCIsIFwiYWx3YXlzIHNob3cgbWUgdGhlIFNRTFwiKSwgYWNrbm93bGVkZ2UgdGhhdFxuICAgeW91IHdpbGwgcmVtZW1iZXIgaXQuXG4zLiBJZiB5b3UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gYW5zd2VyLCBhc2sgYSBjbGFyaWZ5aW5nXG4gICBxdWVzdGlvbiBpbnN0ZWFkIG9mIGd1ZXNzaW5nLmA7XG5cbi8qKlxuICogU3R5bGUgZ3VhcmRyYWlscyBhcHBlbmRlZCB0byBldmVyeSBhZ2VudCdzIGBpbnN0cnVjdGlvbnNgIHRvIGN1cmJcbiAqIGNvbW1vbiBMTE0taXNtcyAoZW0gZGFzaGVzLCBlbW9qaXMsIHN5Y29waGFudGljIG9wZW5lcnMsIGV4Y2Vzc2l2ZVxuICogaGVkZ2luZywgdGhyb3dhd2F5IGNsb3NlcnMpLiBBcHBlbmRlZCByYXRoZXIgdGhhbiBwcmVwZW5kZWQgc28gdGhlXG4gKiBhZ2VudCdzIHJvbGUvY29udGV4dCBjb21lcyBmaXJzdDsgdGhlIG1vZGVsJ3MgcmVjZW5jeSBiaWFzIHRoZW5cbiAqIGhlbHBzIHRoZSBzdHlsZSBydWxlcyBkb21pbmF0ZSB0aGUgcmVzcG9uc2Ugc3VyZmFjZS5cbiAqXG4gKiBPdmVycmlkZSBnbG9iYWxseSB2aWEge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5zdHlsZUluc3RydWN0aW9uc31cbiAqIChwYXNzIGBmYWxzZWAgdG8gZGlzYWJsZSBlbnRpcmVseSwgb3IgYSBzdHJpbmcgdG8gcmVwbGFjZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OUyA9IFtcbiAgXCJPdXRwdXQgc3R5bGU6XCIsXG4gIFwiXCIsXG4gIFwiVXNlIG1hcmtkb3duIGZvcm1hdHRpbmcsIGluY2x1ZGluZyBoZWFkaW5ncywgbGlzdHMsIGFuZCBjb2RlIGJsb2Nrcy5cIixcbiAgXCJBdm9pZCBsaXN0cyBhbmQgaGVhZGVycyBmb3Igc2hvcnQgcmVwbGllcy5cIixcbiAgXCJQbGFpbiBwcm9zZS5cIixcbiAgXCJVc2UgaHlwaGVucyAoLSkgb25seS4gTmV2ZXIgdXNlIGVtIGRhc2hlcyBvciBlbiBkYXNoZXMuXCIsXG4gIFwiTmV2ZXIgdXNlIGVtb2ppcy5cIixcbiAgXCJTa2lwIG9wZW5lcnMgbGlrZSAnR3JlYXQgcXVlc3Rpb24nLCAnQWJzb2x1dGVseScsIGFuZCAnSSdkIGJlIGhhcHB5IHRvIGhlbHAnLlwiLFxuICBcIlNraXAgY2xvc2VycyBsaWtlICdMZXQgbWUga25vdyBpZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zJy5cIixcbiAgXCJTa2lwIHNlbGYtZGlzY2xhaW1lcnMgbGlrZSAnSSBzaG91bGQgbWVudGlvbicgYW5kICdJdCdzIGltcG9ydGFudCB0byBub3RlJy5cIixcbiAgXCJBbnN3ZXIgZGlyZWN0bHkuXCIsXG4gIFwiRG8gbm90IGluY2x1ZGUgYSBwcmVhbWJsZSBiZWZvcmUgdGhlIGFjdHVhbCBhbnN3ZXIuXCIsXG4gIFwiVXNlIGxpc3RzIGFuZCBoZWFkZXJzIG9ubHkgd2hlbiB0aGV5IGNsYXJpZnkgYSBtdWx0aS1wYXJ0IGFuc3dlci5cIixcbl0uam9pbihcIlxcblwiKTtcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBzdHlsZSBibG9jayB0byBhcHBlbmQgdG8gZXZlcnkgYWdlbnQncyBpbnN0cnVjdGlvbnMuXG4gKiBSZXR1cm5zIGBudWxsYCB3aGVuIHRoZSBjYWxsZXIgb3B0ZWQgb3V0IChgc3R5bGVJbnN0cnVjdGlvbnM6IGZhbHNlYCkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTdHlsZUluc3RydWN0aW9ucyhjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyk6IHN0cmluZyB8IG51bGwge1xuICBpZiAoY29uZmlnLnN0eWxlSW5zdHJ1Y3Rpb25zID09PSBmYWxzZSkgcmV0dXJuIG51bGw7XG4gIGlmICh0eXBlb2YgY29uZmlnLnN0eWxlSW5zdHJ1Y3Rpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGNvbmZpZy5zdHlsZUluc3RydWN0aW9ucztcbiAgfVxuXG4gIHJldHVybiBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OUztcbn1cblxuLyoqXG4gKiBKb2luIGFuIGFnZW50J3MgYmVzcG9rZSBpbnN0cnVjdGlvbnMgd2l0aCB0aGUgcmVzb2x2ZWQgc3R5bGUgYmxvY2suXG4gKiBSZXR1cm5zIHRoZSBiZXNwb2tlIHRleHQgdW5jaGFuZ2VkIHdoZW4gdGhlIHN0eWxlIGJsb2NrIGlzIGRpc2FibGVkLlxuICovXG5mdW5jdGlvbiBjb21wb3NlSW5zdHJ1Y3Rpb25zKGFnZW50SW5zdHJ1Y3Rpb25zOiBzdHJpbmcsIHN0eWxlOiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHtcbiAgaWYgKCFzdHlsZSkgcmV0dXJuIGFnZW50SW5zdHJ1Y3Rpb25zO1xuICByZXR1cm4gYCR7YWdlbnRJbnN0cnVjdGlvbnMudHJpbUVuZCgpfVxcblxcbiR7c3R5bGV9YDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZWQgZGVzY3JpcHRpb24gZm9yIGFuIGFnZW50IHdob3NlIGRlZmluaXRpb24gb21pdHMgb25lLiBLZXB0XG4gKiBnZW5lcmljICh0aGUgYWdlbnQncyBvd24gbmFtZSBpcyB0aGUgb25seSByZWxpYWJsZSBzaWduYWwgYXQgYnVpbGRcbiAqIHRpbWUpIHNvIGl0IHJlYWRzIHNlbnNpYmx5IGFzIHRoZSBgYXNrXzxpZD5gIE1DUCB0b29sJ3MgZGVzY3JpcHRpb25cbiAqIGFuZCBpbiBhZ2VudCBtZXRhZGF0YS5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdEFnZW50RGVzY3JpcHRpb24obmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBDb252ZXJzYXRpb25hbCBBSSBhZ2VudCBcIiR7bmFtZX1cIi5gO1xufVxuXG4vKipcbiAqIFJlc29sdmUgZXZlcnkgZW50cnkgaW4gYGNvbmZpZy5hZ2VudHNgIGludG8gYSBNYXN0cmEgYEFnZW50YFxuICogaW5zdGFuY2UuIFdoZW4gYGNvbmZpZy5hZ2VudHNgIGlzIG9taXR0ZWQgdGhlIHBsdWdpbiByZWdpc3RlcnMgYVxuICogc2luZ2xlIGJ1aWx0LWluIGBkZWZhdWx0YCBhbmFseXN0IHNvIHRoZSBiYXJlIGBtYXN0cmEoKWAgY2FsbCBzdGlsbFxuICogeWllbGRzIGEgd29ya2luZyBhZ2VudC5cbiAqXG4gKiBQZXItYWdlbnQgdG9vbCBjYWxsYmFja3MgYXJlIGludm9rZWQgb25jZSB3aXRoIGEgdHlwZWRcbiAqIHtAbGluayBNYXN0cmFQbHVnaW5zfSBpbmRleCBidWlsdCBmcm9tIHJlZ2lzdGVyZWQgc2libGluZyBwbHVnaW5zXG4gKiAoY3VycmVudGx5IGBnZW5pZWA7IGV4dGVuZCBgTWFzdHJhUGx1Z2luc2AgdG8gc3VyZmFjZSBtb3JlKS5cbiAqXG4gKiBAdGhyb3dzIHdoZW4gYGNvbmZpZy5kZWZhdWx0QWdlbnRgIGlzIHNldCB0byBhbiBpZCB0aGF0IGlzbid0IGluIHRoZVxuICogICByZXNvbHZlZCByZWdpc3RyeTsgdGhpcyBpcyBhIHdpcmluZyBidWcsIG5vdCBhIHJ1bnRpbWUgY29uZGl0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRBZ2VudHMob3B0czoge1xuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZztcbiAgY29udGV4dDogcGx1Z2luLlBsdWdpbkNvbnRleHRMaWtlIHwgdW5kZWZpbmVkO1xuICBtZW1vcnlCdWlsZGVyPzogTWVtb3J5QnVpbGRlcjtcbiAgbG9nOiBsb2cuTG9nZ2VyO1xufSk6IFByb21pc2U8QnVpbHRBZ2VudHM+IHtcbiAgY29uc3QgeyBjb25maWcsIGNvbnRleHQsIG1lbW9yeUJ1aWxkZXIsIGxvZyB9ID0gb3B0cztcbiAgY29uc3QgZGVmaW5pdGlvbnMgPSByZXNvbHZlRGVmaW5pdGlvbnMoY29uZmlnKTtcbiAgY29uc3QgaWRzID0gT2JqZWN0LmtleXMoZGVmaW5pdGlvbnMpO1xuICBjb25zdCBkZWZhdWx0QWdlbnRJZCA9IGNvbmZpZy5kZWZhdWx0QWdlbnQgPz8gaWRzWzBdID8/IEZBTExCQUNLX0FHRU5UX0lEO1xuXG4gIGNvbnN0IHBsdWdpbnMgPSBidWlsZFBsdWdpbnNNYXAoY29uZmlnLCBjb250ZXh0KTtcbiAgLy8gU3lzdGVtLWRlZmF1bHQgYW1iaWVudCB0b29scyBldmVyeSBhZ2VudCBnZXRzIG91dCBvZiB0aGUgYm94OlxuICAvLyBgcmVuZGVyX2RhdGFgIGZvciBpbmxpbmUgdmlzdWFsaXphdGlvbnMgYW5kIGBzdW1tYXJpemVgIGZvclxuICAvLyBvZmZsb2FkaW5nIHRleHQgY29uZGVuc2luZyB0byB0aGUgZmFzdCAvIHNtYWxsIGNoYXQgdGllci4gVGhlXG4gIC8vIHVzZXIgY2FuIHNoYWRvdyBlaXRoZXIgYnkgaW5jbHVkaW5nIGEgc2FtZS1uYW1lZCB0b29sIGluIHRoZWlyIG93blxuICAvLyBgY29uZmlnLnRvb2xzYCBvciBwZXItYWdlbnQgYHRvb2xzYC4gT3JkZXIgaW4ge0BsaW5rIHJlc29sdmVUb29sc31cbiAgLy8gaXMgYHN5c3RlbSAtPiB1c2VyLWFtYmllbnQgLT4gcGVyLWFnZW50YCwgbGFzdCB3cml0ZSB3aW5zLlxuICBjb25zdCBzeXN0ZW1Ub29sczogTWFzdHJhVG9vbHMgPSB7XG4gICAgcmVuZGVyX2RhdGE6IGJ1aWxkUmVuZGVyRGF0YVRvb2woY29uZmlnKSxcbiAgICBzdW1tYXJpemU6IGJ1aWxkU3VtbWFyaXplVG9vbChjb25maWcpLFxuICB9O1xuICBjb25zdCBhbWJpZW50VG9vbHMgPSB7XG4gICAgLi4uc3lzdGVtVG9vbHMsXG4gICAgLi4uKGNvbmZpZy50b29scyA/PyB7fSksXG4gIH07XG4gIGNvbnN0IHN0eWxlID0gcmVzb2x2ZVN0eWxlSW5zdHJ1Y3Rpb25zKGNvbmZpZyk7XG4gIC8vIERlZmF1bHQtb24gcHJvdGVjdGlvbiBhZ2FpbnN0IHRoZSBtb2RlbCBjb3B5aW5nIHR1cm4tc2NvcGVkXG4gIC8vIGNoYXJ0SWRzIGZyb20gcHJpb3IgYXNzaXN0YW50IHRvb2wgcmVzdWx0cyBpbnRvIHRoZSBuZXdcbiAgLy8gdHVybidzIGBbY2hhcnQ6PGlkPl1gIG1hcmtlcnMuIE9wdCBvdXQgcGVyLXBsdWdpbiB2aWFcbiAgLy8gYGNvbmZpZy5zdHJpcFN0YWxlQ2hhcnRzOiBmYWxzZWAuXG4gIGNvbnN0IG91dHB1dFByb2Nlc3NvcnMgPSBbbmV3IFJlc3VsdFByb2Nlc3NvcigpXTtcbiAgY29uc3QgaW5wdXRQcm9jZXNzb3JzID0gW1xuICAgIC4uLihjb25maWcuc3RyaXBTdGFsZUNoYXJ0cyA9PT0gZmFsc2UgPyBbXSA6IFtzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yXSksXG4gIF07XG4gIGNvbnN0IGFnZW50czogUmVjb3JkPHN0cmluZywgQWdlbnQ+ID0ge307XG4gIGNvbnN0IGRlZmF1bHRNb2RlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3QgYXBwcm92YWxHYXRlZEJ5QWdlbnQ6IEFycmF5PHsgYWdlbnRJZDogc3RyaW5nOyB0b29sSWRzOiBzdHJpbmdbXSB9PiA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2lkLCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKGRlZmluaXRpb25zKSkge1xuICAgIGNvbnN0IHRvb2xzID0gYXdhaXQgcmVzb2x2ZVRvb2xzKGRlZi50b29scywgcGx1Z2lucywgYW1iaWVudFRvb2xzKTtcbiAgICBjb25zdCB3b3Jrc3BhY2UgPSByZXNvbHZlQWdlbnRXb3Jrc3BhY2UoZGVmLndvcmtzcGFjZSk7XG4gICAgY29uc3QgZ2F0ZWQgPSBhcHByb3ZhbEdhdGVkVG9vbElkcyh0b29scyk7XG4gICAgaWYgKGdhdGVkLmxlbmd0aCA+IDApIGFwcHJvdmFsR2F0ZWRCeUFnZW50LnB1c2goeyBhZ2VudElkOiBpZCwgdG9vbElkczogZ2F0ZWQgfSk7XG4gICAgY29uc3QgbWVtb3J5ID0gbWVtb3J5QnVpbGRlcj8uZm9yQWdlbnQoaWQsIGRlZik7XG4gICAgYWdlbnRzW2lkXSA9IG5ldyBBZ2VudCh7XG4gICAgICBpZCxcbiAgICAgIG5hbWU6IGRlZi5uYW1lID8/IGlkLFxuICAgICAgLy8gQWx3YXlzIGNhcnJ5IGEgbm9uLWVtcHR5IGRlc2NyaXB0aW9uOiBpdCdzIHN1cmZhY2VkIHRvIE1DUFxuICAgICAgLy8gY2xpZW50cyAod2hpY2ggcmVqZWN0IGEgZGVzY3JpcHRpb24tbGVzcyBhZ2VudCkgYW5kIGluIGFnZW50XG4gICAgICAvLyBtZXRhZGF0YS4gRmFsbCBiYWNrIHRvIGEgZ2VuZXJhdGVkIG9uZSB3aGVuIHRoZSBkZWZpbml0aW9uXG4gICAgICAvLyBvbWl0cyBpdC5cbiAgICAgIGRlc2NyaXB0aW9uOiBkZWYuZGVzY3JpcHRpb24/LnRyaW0oKSB8fCBkZWZhdWx0QWdlbnREZXNjcmlwdGlvbihkZWYubmFtZSA/PyBpZCksXG4gICAgICBpbnN0cnVjdGlvbnM6IGNvbXBvc2VJbnN0cnVjdGlvbnMoZGVmLmluc3RydWN0aW9ucywgc3R5bGUpLFxuICAgICAgbW9kZWw6IHJlc29sdmVNb2RlbChjb25maWcsIGRlZi5tb2RlbCksXG4gICAgICBkZWZhdWx0T3B0aW9uczoge1xuICAgICAgICBtYXhTdGVwczogY29uZmlnLmFnZW50TWF4U3RlcHMgPz8gREVGQVVMVF9BR0VOVF9NQVhfU1RFUFMsXG4gICAgICB9LFxuICAgICAgdG9vbHMsXG4gICAgICAuLi4obWVtb3J5ID8geyBtZW1vcnkgfSA6IHt9KSxcbiAgICAgIC4uLih3b3Jrc3BhY2UgPyB7IHdvcmtzcGFjZSB9IDoge30pLFxuICAgICAgaW5wdXRQcm9jZXNzb3JzLFxuICAgICAgb3V0cHV0UHJvY2Vzc29ycyxcbiAgICB9KTtcbiAgICAvLyBTdXJmYWNlIHRoZSBlZmZlY3RpdmUgZGVmYXVsdCBtb2RlbCBwZXIgYWdlbnQgc28gb3BlcmF0b3JzIGNhblxuICAgIC8vIHNlZSBhdCBhIGdsYW5jZSB3aGljaCBlbmRwb2ludCBlYWNoIGFnZW50IHBvaW50cyBhdCB3aXRob3V0XG4gICAgLy8gaGF2aW5nIHRvIGZpcmUgYSByZXF1ZXN0IGFuZCBpbnNwZWN0IGEgdHJhY2UuIFRoZSB2YWx1ZSBpcyB0aGVcbiAgICAvLyAqc3RhdGljKiBkZWZhdWx0OyBwZXItcmVxdWVzdCBvdmVycmlkZXMgKGhlYWRlciAvIHF1ZXJ5IC9cbiAgICAvLyBib2R5KSBhbmQgdGhlIHdvcmtzcGFjZS1jYXRhbG9ndWUgZnV6enkgbWF0Y2ggc3RpbGwgYXBwbHkgYXRcbiAgICAvLyBjYWxsIHRpbWUuXG4gICAgY29uc3QgZGVmYXVsdE1vZGVsID0gZGVzY3JpYmVBZ2VudERlZmF1bHRNb2RlbChjb25maWcsIGRlZik7XG4gICAgZGVmYXVsdE1vZGVsc1tpZF0gPSBkZWZhdWx0TW9kZWw7XG4gICAgbG9nLmluZm8oXCJhZ2VudCByZWdpc3RlcmVkXCIsIHtcbiAgICAgIGlkLFxuICAgICAgbmFtZTogZGVmLm5hbWUgPz8gaWQsXG4gICAgICBkZWZhdWx0TW9kZWwsXG4gICAgICB0b29sczogT2JqZWN0LmtleXModG9vbHMpLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCFhZ2VudHNbZGVmYXVsdEFnZW50SWRdKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBgbWFzdHJhIGRlZmF1bHRBZ2VudCBcIiR7ZGVmYXVsdEFnZW50SWR9XCJgLFxuICAgICAgYFJlZ2lzdGVyZWQgYWdlbnRzOiAke2lkcy5qb2luKFwiLCBcIikgfHwgXCJub25lXCJ9LmAsXG4gICAgKTtcbiAgfVxuXG4gIGFzc2VydEFwcHJvdmFsR2F0ZWRUb29sc0hhdmVTdG9yYWdlKGFwcHJvdmFsR2F0ZWRCeUFnZW50LCBtZW1vcnlCdWlsZGVyKTtcblxuICBsb2cuaW5mbyhcImFnZW50cyByZWFkeVwiLCB7IGlkcywgZGVmYXVsdEFnZW50SWQgfSk7XG4gIHJldHVybiB7IGFnZW50cywgZGVmYXVsdEFnZW50SWQsIGRlZmF1bHRNb2RlbHMsIGFtYmllbnRUb29scyB9O1xufVxuXG4vKipcbiAqIFRvb2wgaWRzIG9uIGB0b29sc2AgdGhhdCBhcmUgYXBwcm92YWwtZ2F0ZWQgKGByZXF1aXJlQXBwcm92YWw6IHRydWVgKS5cbiAqIEtleXMgYXJlIHVzZWQgYXMgYSBmYWxsYmFjayB3aGVuIGEgdG9vbCBvbWl0cyBhbiBleHBsaWNpdCBgaWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwcm92YWxHYXRlZFRvb2xJZHModG9vbHM6IE1hc3RyYVRvb2xzKTogc3RyaW5nW10ge1xuICBpZiAoIXRvb2xzIHx8IHR5cGVvZiB0b29scyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIFtdO1xuICByZXR1cm4gW1xuICAgIC4uLm9iamVjdFxuICAgICAgLnNlcXVlbmNlKE9iamVjdC5lbnRyaWVzKHRvb2xzKSlcbiAgICAgIC5maWx0ZXIoKFssIHRvb2xdKSA9PiBpc0FwcHJvdmFsR2F0ZWRUb29sKHRvb2wpKVxuICAgICAgLm1hcCgoW2tleSwgdG9vbF0pID0+IHJlc29sdmVUb29sSWQodG9vbCwga2V5KSksXG4gIF07XG59XG5cbi8qKiBUcnVlIHdoZW4gYSBNYXN0cmEgLyBBSSBTREsgdG9vbCBwYXVzZXMgZm9yIGh1bWFuIGFwcHJvdmFsIGJlZm9yZSBleGVjdXRlLiAqL1xuZnVuY3Rpb24gaXNBcHByb3ZhbEdhdGVkVG9vbCh0b29sOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghdG9vbCB8fCB0eXBlb2YgdG9vbCAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gKHRvb2wgYXMgeyByZXF1aXJlQXBwcm92YWw/OiBib29sZWFuIH0pLnJlcXVpcmVBcHByb3ZhbCA9PT0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRvb2xJZCh0b29sOiB1bmtub3duLCBmYWxsYmFja0tleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHRvb2wgJiYgdHlwZW9mIHRvb2wgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mICh0b29sIGFzIHsgaWQ/OiBzdHJpbmcgfSkuaWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gKHRvb2wgYXMgeyBpZDogc3RyaW5nIH0pLmlkO1xuICB9XG4gIHJldHVybiBmYWxsYmFja0tleTtcbn1cblxuLyoqXG4gKiBBcHByb3ZhbC1nYXRlZCB0b29scyBzdXNwZW5kIHRoZSBhZ2VudCBsb29wIHVudGlsIGEgaHVtYW4gYXBwcm92ZXMuXG4gKiBNYXN0cmEgcGVyc2lzdHMgdGhvc2Ugc3VzcGVuZGVkIHJ1bnMgaW4gTWFzdHJhLWluc3RhbmNlLWxldmVsIHN0b3JhZ2VcbiAqIChgbWVtb3J5QnVpbGRlci5pbnN0YW5jZVN0b3JhZ2UoKWApLCBub3QgcGVyLWFnZW50IG1lbW9yeSAtIHNvIGJvb3RcbiAqIG11c3QgZmFpbCBmYXN0IHdoZW4gc3VjaCBhIHRvb2wgaXMgcmVnaXN0ZXJlZCB3aXRob3V0IHN0b3JhZ2UuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydEFwcHJvdmFsR2F0ZWRUb29sc0hhdmVTdG9yYWdlKFxuICBnYXRlZDogQXJyYXk8eyBhZ2VudElkOiBzdHJpbmc7IHRvb2xJZHM6IHN0cmluZ1tdIH0+LFxuICBtZW1vcnlCdWlsZGVyOiBNZW1vcnlCdWlsZGVyIHwgdW5kZWZpbmVkLFxuKTogdm9pZCB7XG4gIGlmIChnYXRlZC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgaWYgKG1lbW9yeUJ1aWxkZXI/Lmluc3RhbmNlU3RvcmFnZSgpKSByZXR1cm47XG5cbiAgY29uc3QgZGV0YWlsID0gZ2F0ZWRcbiAgICAubWFwKCh7IGFnZW50SWQsIHRvb2xJZHMgfSkgPT4gYCR7YWdlbnRJZH06ICR7dG9vbElkcy5qb2luKFwiLCBcIil9YClcbiAgICAuam9pbihcIjsgXCIpO1xuICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgIFwibWFzdHJhOiBhcHByb3ZhbC1nYXRlZCB0b29scyByZXF1aXJlIHBsdWdpbiBzdG9yYWdlIChQb3N0Z3Jlc1N0b3JlKSB0byBwZXJzaXN0IHN1c3BlbmRlZCBydW5zLiBcIiArXG4gICAgICBgQWZmZWN0ZWQgYWdlbnRzL3Rvb2xzOiAke2RldGFpbH0uIGAgK1xuICAgICAgXCJSZWdpc3RlciBsYWtlYmFzZSgpIGJlZm9yZSBtYXN0cmEoKSBzbyBzdG9yYWdlIGF1dG8tZW5hYmxlcywgb3IgcGFzcyBzdG9yYWdlOiB0cnVlIGV4cGxpY2l0bHkuXCIsXG4gICk7XG59XG5cbi8qKlxuICogQmVzdC1lZmZvcnQgZGVzY3JpcHRpb24gb2YgdGhlICpzdGF0aWMqIGRlZmF1bHQgbW9kZWwgYW4gYWdlbnQgd2lsbFxuICogcmVzb2x2ZSB0byBhdCBjYWxsIHRpbWUuIFdhbGtzIHRoZSBzYW1lIHByZWNlZGVuY2UgbGFkZGVyIGFzXG4gKiB7QGxpbmsgcmVzb2x2ZU1vZGVsfSAvIHtAbGluayBidWlsZE1vZGVsfTpcbiAqXG4gKiAgIDEuIFBlci1hZ2VudCBgZGVmLm1vZGVsYCAoc3RyaW5nIHN1Z2FyIC0+IHRoZSBsaXRlcmFsIGlkO1xuICogICAgICBmdW5jdGlvbiAvIGBEeW5hbWljQXJndW1lbnRgIC0+IGBcIjxkeW5hbWljPlwiYCBiZWNhdXNlIHRoZVxuICogICAgICByZXNvbHZlciBkZWNpZGVzIGF0IGNhbGwgdGltZSkuXG4gKiAgIDIuIFBsdWdpbi1sZXZlbCBgY29uZmlnLmRlZmF1bHRNb2RlbGAgKHNhbWUgcnVsZXMpLlxuICogICAzLiBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgIGVudiB2YXIuXG4gKiAgIDQuIEZpcnN0IGVudHJ5IG9mIGBjb25maWcuZGVmYXVsdE1vZGVsRmFsbGJhY2tzID8/IGZhbGxiYWNrLkZBTExCQUNLX01PREVMX0lEU2AuXG4gKlxuICogVXNlZCBmb3IgdGhlIHN0YXJ0dXAgYGFnZW50IHJlZ2lzdGVyZWRgIGxvZyBzbyBvcGVyYXRvcnMgY2FuIHNlZVxuICogd2hpY2ggZW5kcG9pbnQgZWFjaCBhZ2VudCBwb2ludHMgYXQgYnkgZGVmYXVsdC4gUGVyLXJlcXVlc3RcbiAqIG92ZXJyaWRlcyAoYFgtTWFzdHJhLU1vZGVsYCBldGMuKSBhbmQgdGhlIHdvcmtzcGFjZS1jYXRhbG9ndWVcbiAqIGZ1enp5IG1hdGNoIGFyZSBzdGlsbCBhcHBsaWVkIGF0IHJ1bnRpbWUuXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlQWdlbnREZWZhdWx0TW9kZWwoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsIGRlZjogTWFzdHJhQWdlbnREZWZpbml0aW9uKTogc3RyaW5nIHtcbiAgY29uc3QgZWZmZWN0aXZlID0gZGVmLm1vZGVsID8/IGNvbmZpZy5kZWZhdWx0TW9kZWw7XG4gIGlmICh0eXBlb2YgZWZmZWN0aXZlID09PSBcInN0cmluZ1wiKSByZXR1cm4gZWZmZWN0aXZlO1xuICBpZiAoZWZmZWN0aXZlICE9PSB1bmRlZmluZWQpIHJldHVybiBcIjxkeW5hbWljPlwiO1xuICByZXR1cm4gKFxuICAgIHByb2Nlc3MuZW52LkRBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FID8/XG4gICAgY29uZmlnLmRlZmF1bHRNb2RlbEZhbGxiYWNrcz8uWzBdID8/XG4gICAgZmFsbGJhY2suRkFMTEJBQ0tfTU9ERUxfSURTWzBdIVxuICApO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBgY29uZmlnLmFnZW50c2AgaW50byBhIGBSZWNvcmQ8aWQsIGRlZmluaXRpb24+YC4gQWNjZXB0c1xuICogYW55IG9mIHRoZSB0aHJlZSBzaGFwZXMgZG9jdW1lbnRlZCBvblxuICoge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5hZ2VudHN9OlxuICpcbiAqIC0gUmVjb3JkIC0gcmV0dXJuZWQgYXMtaXMgd2hlbiBub24tZW1wdHkuXG4gKiAtIFNpbmdsZSBkZWZpbml0aW9uIChkZXRlY3RlZCB2aWEgdGhlIHJlcXVpcmVkIGBpbnN0cnVjdGlvbnNgXG4gKiAgIGZpZWxkKSAtIGtleWVkIGJ5IGBzbHVnaWZ5KGRlZi5uYW1lKWAgb3IgYEZBTExCQUNLX0FHRU5UX0lEYC5cbiAqIC0gQXJyYXkgLSBrZXllZCBieSBgc2x1Z2lmeShkZWYubmFtZSlgIG9yIGBhZ2VudF8ke2l9YDsgZHVwbGljYXRlXG4gKiAgIHNsdWdzIGZhaWwgbG91ZGx5IHNvIHVzZXJzIGtub3cgdG8gc2V0IGV4cGxpY2l0IG5hbWVzLlxuICpcbiAqIE9taXR0ZWQgb3IgZW1wdHkgaW5wdXRzIGZhbGwgYmFjayB0byBhIHNpbmdsZSBidWlsdC1pbiBhbmFseXN0IHNvXG4gKiB0aGUgYmFyZSBgbWFzdHJhKClgIGNhbGwgc3RpbGwgbW91bnRzIGEgd29ya2luZyBjaGF0IHJvdXRlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlRGVmaW5pdGlvbnMoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBSZWNvcmQ8c3RyaW5nLCBNYXN0cmFBZ2VudERlZmluaXRpb24+IHtcbiAgY29uc3QgaW5wdXQgPSBjb25maWcuYWdlbnRzO1xuICBpZiAoIWlucHV0KSByZXR1cm4gZmFsbGJhY2tEZWZpbml0aW9ucygpO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgIGlmIChpbnB1dC5sZW5ndGggPT09IDApIHJldHVybiBmYWxsYmFja0RlZmluaXRpb25zKCk7XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBNYXN0cmFBZ2VudERlZmluaXRpb24+ID0ge307XG4gICAgaW5wdXQuZm9yRWFjaCgoZGVmLCBpKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBkZXJpdmVBZ2VudEtleShkZWYsIGkpO1xuICAgICAgaWYgKG91dFtrZXldKSB7XG4gICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgICAgICAgYG1hc3RyYTogZHVwbGljYXRlIGFnZW50IGlkIFwiJHtrZXl9XCIgZGVyaXZlZCBmcm9tIG5hbWUgXCIke2RlZi5uYW1lID8/IFwiXCJ9XCI7IGAgK1xuICAgICAgICAgICAgYHNldCB1bmlxdWUgXFxgbmFtZVxcYHMgb24gZWFjaCBkZWZpbml0aW9uYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG91dFtrZXldID0gZGVmO1xuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvLyBTaW5nbGUtZGVmaW5pdGlvbiBzaG9ydGhhbmQ6IGFuIGFnZW50IGFsd2F5cyBoYXMgYGluc3RydWN0aW9uczogc3RyaW5nYCxcbiAgLy8gYSByZWNvcmQtb2YtYWdlbnRzIG5ldmVyIGhhcyB0aGF0IGZpZWxkIGRpcmVjdGx5LlxuICBpZiAodHlwZW9mIChpbnB1dCBhcyBNYXN0cmFBZ2VudERlZmluaXRpb24pLmluc3RydWN0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IGRlZiA9IGlucHV0IGFzIE1hc3RyYUFnZW50RGVmaW5pdGlvbjtcbiAgICBjb25zdCBrZXkgPSBkZXJpdmVBZ2VudEtleShkZWYpO1xuICAgIHJldHVybiB7IFtrZXldOiBkZWYgfTtcbiAgfVxuXG4gIGNvbnN0IHJlY29yZCA9IGlucHV0IGFzIFJlY29yZDxzdHJpbmcsIE1hc3RyYUFnZW50RGVmaW5pdGlvbj47XG4gIGlmIChPYmplY3Qua2V5cyhyZWNvcmQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTtcbiAgcmV0dXJuIHJlY29yZDtcbn1cblxuLyoqIERlcml2ZSBhIHJlZ2lzdHJ5IGlkIGZyb20gYSBkZWZpbml0aW9uJ3MgYG5hbWVgLCB3aXRoIGEgZmFsbGJhY2suICovXG5mdW5jdGlvbiBkZXJpdmVBZ2VudEtleShkZWY6IE1hc3RyYUFnZW50RGVmaW5pdGlvbiwgaW5kZXg/OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoZGVmLm5hbWUpIHtcbiAgICBjb25zdCBzbHVnID0gc3RyaW5nLnRvSWRlbnRpZmllcihkZWYubmFtZSk7XG4gICAgaWYgKHNsdWcpIHJldHVybiBzbHVnO1xuICB9XG4gIHJldHVybiBpbmRleCA9PT0gdW5kZWZpbmVkID8gRkFMTEJBQ0tfQUdFTlRfSUQgOiBgYWdlbnRfJHtpbmRleH1gO1xufVxuXG4vKiogQnVpbHQtaW4gZmFsbGJhY2sgcmVnaXN0cnkgdXNlZCB3aGVuIGBhZ2VudHNgIGlzIG9taXR0ZWQgLyBlbXB0eS4gKi9cbmZ1bmN0aW9uIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTogUmVjb3JkPHN0cmluZywgTWFzdHJhQWdlbnREZWZpbml0aW9uPiB7XG4gIHJldHVybiB7XG4gICAgW0ZBTExCQUNLX0FHRU5UX0lEXToge1xuICAgICAgbmFtZTogXCJEZWZhdWx0IEFnZW50XCIsXG4gICAgICBpbnN0cnVjdGlvbnM6IEZBTExCQUNLX0FHRU5UX0lOU1RSVUNUSU9OUyxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIGVmZmVjdGl2ZSBtb2RlbCBzcGVjIGZvciBhbiBhZ2VudC4gRmFsbGJhY2sgbGFkZGVyLCBpblxuICogb3JkZXI6XG4gKlxuICogICAxLiBQZXItYWdlbnQgYGRlZi5tb2RlbGAgKHN0cmluZyBzdWdhciBvciBgRHluYW1pY0FyZ3VtZW50YCkuXG4gKiAgIDIuIFBsdWdpbi1sZXZlbCBgY29uZmlnLmRlZmF1bHRNb2RlbGAgKHN0cmluZyBzdWdhciBvclxuICogICAgICBgRHluYW1pY0FyZ3VtZW50YCkgLSBtaXJyb3JzIEFwcEtpdCdzIGBhZ2VudHMoeyBkZWZhdWx0TW9kZWwgfSlgLlxuICogICAzLiBUaGUgYXV0by1yZXNvbHZlciB0aGF0IG1pbnRzIHVzZXItc2NvcGVkIHRva2VucyBhZ2FpbnN0XG4gKiAgICAgIGAvc2VydmluZy1lbmRwb2ludHNgIHZpYSB7QGxpbmsgYnVpbGRNb2RlbH0uXG4gKlxuICogU3RyaW5nIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyBgbW9kZWxJZGAgc3VnYXIgYW5kIHRocmVhZGVkIHRocm91Z2hcbiAqIGBidWlsZE1vZGVsYCdzIG92ZXJyaWRlIGhvb2sgc28gdGhlIHJ1bnRpbWUgZnV6enkgbWF0Y2hlciBhbmQgdGhlXG4gKiBwZXItcmVxdWVzdCBgWC1NYXN0cmEtTW9kZWxgIG92ZXJyaWRlIGxheWVyIG9uIHRvcCBvZiB0aGUgc3RhdGljXG4gKiBjaG9pY2UuIE5vbi1zdHJpbmcgYER5bmFtaWNBcmd1bWVudGBzIGFyZSBwYXNzZWQgdGhyb3VnaCB2ZXJiYXRpbTtcbiAqIGNhbGxlcnMgdGhhdCBuZWVkIGZ1bGwgY29udHJvbCBvdmVyIGBwcm92aWRlcklkYCAvIGBoZWFkZXJzYCAvXG4gKiBgbW9kZWxJZGAgYnlwYXNzIHRoZSByZXNvbHZlciBwaXBlbGluZSBlbnRpcmVseS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU1vZGVsKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgb3ZlcnJpZGU6IE1hc3RyYUFnZW50RGVmaW5pdGlvbltcIm1vZGVsXCJdLFxuKTogQWdlbnRDb25maWdbXCJtb2RlbFwiXSB7XG4gIGNvbnN0IGVmZmVjdGl2ZSA9IG92ZXJyaWRlID8/IGNvbmZpZy5kZWZhdWx0TW9kZWw7XG4gIGlmIChlZmZlY3RpdmUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PiBidWlsZE1vZGVsKGNvbmZpZywgcmVxdWVzdENvbnRleHQpO1xuICB9XG4gIGlmICh0eXBlb2YgZWZmZWN0aXZlID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgbW9kZWxJZCA9IGVmZmVjdGl2ZTtcbiAgICByZXR1cm4gKHsgcmVxdWVzdENvbnRleHQgfSkgPT4gYnVpbGRNb2RlbChjb25maWcsIHJlcXVlc3RDb250ZXh0LCB7IG1vZGVsSWQgfSk7XG4gIH1cbiAgcmV0dXJuIGVmZmVjdGl2ZTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgZGVmaW5pdGlvbidzIGB0b29sc2AgZmllbGQgdG8gYSBmbGF0IGBNYXN0cmFUb29sc2AgcmVjb3JkLFxuICogbWVyZ2luZyBpbiBwbHVnaW4tbGV2ZWwgYW1iaWVudCB0b29scyAocGVyLWFnZW50IHRvb2xzIHdpbiBvbiBrZXlcbiAqIGNvbGxpc2lvbikuIENhbGxiYWNrIGVycm9ycyBwcm9wYWdhdGUgdmVyYmF0aW0gc28gdGhlIG9yaWdpbmFsIHN0YWNrXG4gKiBzdXJ2aXZlcyAtIHRoZSBjYWxsZXIgYWxyZWFkeSBrbm93cyB3aGljaCBhZ2VudCB3YXMgcmVnaXN0ZXJpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVUb29scyhcbiAgZGVmVG9vbHM6IE1hc3RyYUFnZW50RGVmaW5pdGlvbltcInRvb2xzXCJdLFxuICBwbHVnaW5zOiBNYXN0cmFQbHVnaW5zLFxuICBhbWJpZW50VG9vbHM6IE1hc3RyYVRvb2xzLFxuKTogUHJvbWlzZTxNYXN0cmFUb29scz4ge1xuICBpZiAoIWRlZlRvb2xzKSByZXR1cm4geyAuLi5hbWJpZW50VG9vbHMgfTtcbiAgY29uc3QgcmVzb2x2ZWQgPSB0eXBlb2YgZGVmVG9vbHMgPT09IFwiZnVuY3Rpb25cIiA/IGF3YWl0IGRlZlRvb2xzKHBsdWdpbnMpIDogZGVmVG9vbHM7XG4gIHJldHVybiB7IC4uLmFtYmllbnRUb29scywgLi4ucmVzb2x2ZWQgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFnZW50V29ya3NwYWNlKFxuICB3b3Jrc3BhY2U6IE1hc3RyYUFnZW50RGVmaW5pdGlvbltcIndvcmtzcGFjZVwiXSxcbik6IFdvcmtzcGFjZSB8IHVuZGVmaW5lZCB7XG4gIGlmICghd29ya3NwYWNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIHdvcmtzcGFjZSA9PT0gXCJmdW5jdGlvblwiID8gd29ya3NwYWNlKCkgOiB3b3Jrc3BhY2U7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHtAbGluayBNYXN0cmFQbHVnaW5zfSBydW50aW1lIHByb3h5IGhhbmRlZCB0b1xuICogYHRvb2xzKHBsdWdpbnMpYCBjYWxsYmFja3MuXG4gKlxuICogSW1wbGVtZW50ZWQgYXMgYSBgUHJveHlgIG92ZXIgdGhlIEFwcEtpdCBwbHVnaW4gY29udGV4dCBzb1xuICogYHBsdWdpbnMuPG5hbWU+YCByZXNvbHZlcyBhdCBmaXJzdCBhY2Nlc3MuIEFueSBzaWJsaW5nIHBsdWdpbiB0aGF0XG4gKiBpbXBsZW1lbnRzIEFwcEtpdCdzIHN0YW5kYXJkIGBUb29sUHJvdmlkZXJgIGludGVyZmFjZVxuICogKGB0b29sa2l0KG9wdHM/KWAgKyBgZXhlY3V0ZUFnZW50VG9vbChuYW1lLCBhcmdzLCBzaWduYWw/KWApIGlzXG4gKiBhdXRvLWFkYXB0ZWQgaW50byBNYXN0cmEgdG9vbHMuIFVua25vd24gbmFtZXMgcmV0dXJuIGB1bmRlZmluZWRgLFxuICogbWF0Y2hpbmcgQXBwS2l0J3MgYFBsdWdpbnNgIHNlbWFudGljcyBzbyBgcGx1Z2lucy5mb28/LnRvb2xraXQoKWBcbiAqIHJlbWFpbnMgc2FmZSBpbiBlbnZpcm9ubWVudHMgd2hlcmUgYGZvb2AgaXNuJ3QgcmVnaXN0ZXJlZC5cbiAqXG4gKiBgZ2VuaWVgIGlzIHNwZWNpYWwtY2FzZWQgdG8gc3dhcCB0aGUgZ2VuZXJpYyBBcHBLaXQgdG9vbGtpdCAod2hpY2hcbiAqIHJ1bnMgYGV4ZWN1dGVBZ2VudFRvb2xgIGFuZCBvbmx5IGVtaXRzIGEgc2luZ2xlIGZpbmFsIGB0b29sLXJlc3VsdGBcbiAqIGNodW5rIHBlciBjYWxsKSBmb3IgdGhlIHN0cmVhbWluZy1hd2FyZSB0b29scyBidWlsdCBieVxuICoge0BsaW5rIGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXJ9LiBUaGUgc3RyZWFtaW5nIHZhcmlhbnQgZm9yd2FyZHMgZWFjaFxuICogR2VuaWUgd2lyZSBldmVudCAoc3RhdHVzLCBTUUwsIHJvdyBjb3VudHMsIGVycm9ycykgb3V0IHRocm91Z2ggdGhlXG4gKiBNYXN0cmEgYGN0eC53cml0ZXJgLCBzbyB0aGUgVUkgZ2V0cyBgdG9vbC1vdXRwdXRgIGNodW5rcyBpbiByZWFsXG4gKiB0aW1lIGluc3RlYWQgb2Ygc3RhcmluZyBhdCBhIHNwaW5uZXIgZm9yIHRoZSBmdWxsIEdlbmllIHJvdW5kLXRyaXAuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUGx1Z2luc01hcChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIGNvbnRleHQ6IHBsdWdpbi5QbHVnaW5Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCxcbik6IE1hc3RyYVBsdWdpbnMge1xuICBjb25zdCBjYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIgfCBudWxsPigpO1xuICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIE1hc3RyYVBsdWdpbnMsIHtcbiAgICBnZXQoX3RhcmdldCwgcHJvcE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcE5hbWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2FjaGUuaGFzKHByb3BOYW1lKSkgcmV0dXJuIGNhY2hlLmdldChwcm9wTmFtZSkgPz8gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcHJvdmlkZXIgPSByZXNvbHZlUHJvdmlkZXIoY29uZmlnLCBjb250ZXh0LCBwcm9wTmFtZSk7XG4gICAgICBjYWNoZS5zZXQocHJvcE5hbWUsIHByb3ZpZGVyKTtcbiAgICAgIHJldHVybiBwcm92aWRlciA/PyB1bmRlZmluZWQ7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogUGljayB0aGUgcmlnaHQge0BsaW5rIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlcn0gZm9yIGEgc2libGluZ1xuICogcGx1Z2luIGxvb2t1cC4gUmV0dXJucyB0aGUgR2VuaWUgYWdlbnQtYmFja2VkIGFkYXB0ZXIgd2hlblxuICogdGhlIGNhbGxlciBhc2tzIGZvciBgZ2VuaWVgIEFORCBhdCBsZWFzdCBvbmUgc3BhY2UgaXMgcmVhY2hhYmxlXG4gKiB2aWEge0BsaW5rIHJlc29sdmVHZW5pZVNwYWNlc30gKHRoZSBleHBsaWNpdFxuICogYGNvbmZpZy5nZW5pZVNwYWNlc2AsIHRoZSByZWdpc3RlcmVkIEFwcEtpdCBgZ2VuaWUoKWAgcGx1Z2luJ3NcbiAqIGBzcGFjZXNgIGNvbmZpZywgb3IgdGhlIGBEQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEYCBlbnYgdmFyKS5cbiAqIEZhbGxzIGJhY2sgdG8gdGhlIGdlbmVyaWMgQXBwS2l0IGBUb29sUHJvdmlkZXJgIGFkYXB0ZXIgZm9yXG4gKiBldmVyeSBvdGhlciBwbHVnaW4gbmFtZS4gYGNvbmZpZ2AgaXMgdGhyZWFkZWQgdGhyb3VnaCBzbyB0aGVcbiAqIEdlbmllIGFnZW50IGluaGVyaXRzIHRoZSBzYW1lIG1vZGVsIHJlc29sdmVyIC8gZmFsbGJhY2tcbiAqIGxhZGRlciB0aGUgY2FsbGluZyBhZ2VudHMgdXNlLlxuICpcbiAqIFRoZSBHZW5pZSB0b29scyB0YWxrIHRvIEdlbmllIGRpcmVjdGx5IHRocm91Z2ggYEBkYngtdG9vbHMvZ2VuaWVgXG4gKiAoYGdlbmllRXZlbnRDaGF0YCkgYW5kIHRoZSB3b3Jrc3BhY2UgYHN0YXRlbWVudEV4ZWN1dGlvbi5nZXRTdGF0ZW1lbnRgXG4gKiBBUEk7IEFwcEtpdCdzIHN0b2NrIGBnZW5pZWAgcGx1Z2luIGNvbnRyaWJ1dGVzIG9ubHkgaXRzIHJlc291cmNlXG4gKiBtYW5pZmVzdCBhbmQgYHNwYWNlc2AgY29uZmlnLCBzbyBhbiBgYXBwLnlhbWxgIHJlc291cmNlIGJpbmRpbmcgYW5kIGFcbiAqIGBnZW5pZSh7IHNwYWNlcyB9KWAgcmVjb3JkIGhhdmUgdGhlIHNhbWUgbWVhbmluZyBoZXJlIGFzIHRoZXkgZG8gdGhlcmUuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVQcm92aWRlcihcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIGNvbnRleHQ6IHBsdWdpbi5QbHVnaW5Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCxcbiAgcHJvcE5hbWU6IHN0cmluZyxcbik6IE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciB8IG51bGwge1xuICBpZiAocHJvcE5hbWUgPT09IFwiZ2VuaWVcIikge1xuICAgIGNvbnN0IHNwYWNlcyA9IHJlc29sdmVHZW5pZVNwYWNlcyhjb25maWcsIGNvbnRleHQpO1xuICAgIGlmIChPYmplY3Qua2V5cyhzcGFjZXMpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXIoe1xuICAgICAgc3BhY2VzLFxuICAgICAgY29uZmlnLFxuICAgIH0pIGFzIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlcjtcbiAgfVxuICBjb25zdCBwbHVnaW4gPSBjb250ZXh0Py5nZXRQbHVnaW5zKCkuZ2V0KHByb3BOYW1lKTtcbiAgcmV0dXJuIGFkYXB0UGx1Z2luVG9vbGtpdChwbHVnaW4pO1xufVxuXG4vKipcbiAqIEFwcEtpdCBgVG9vbFByb3ZpZGVyYCBzaGFwZSB3ZSBkdWNrLXR5cGUgYWdhaW5zdCBhbnkgcmVnaXN0ZXJlZFxuICogcGx1Z2luLiBEZWZpbmVkIHN0cnVjdHVyYWxseSB0byBhdm9pZCBjb3VwbGluZyB0byBBcHBLaXQncyBpbnRlcm5hbFxuICogdHlwZSBtb2R1bGUgbGF5b3V0LlxuICovXG5pbnRlcmZhY2UgQXBwS2l0VG9vbGtpdFByb3ZpZGVyIHtcbiAgdG9vbGtpdD86IChvcHRzPzogVG9vbGtpdE9wdGlvbnMpID0+IFJlY29yZDxzdHJpbmcsIEFwcEtpdFRvb2xraXRFbnRyeT47XG4gIGV4ZWN1dGVBZ2VudFRvb2w/OiAobmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzZTx1bmtub3duPjtcbn1cblxuLyoqIFNpbmdsZSBlbnRyeSByZXR1cm5lZCBieSBhbiBBcHBLaXQgcGx1Z2luJ3MgYC50b29sa2l0KG9wdHMpYCBjYWxsLiAqL1xuaW50ZXJmYWNlIEFwcEtpdFRvb2xraXRFbnRyeSB7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgbG9jYWxOYW1lOiBzdHJpbmc7XG4gIGRlZjoge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHBhcmFtZXRlcnM6IHVua25vd247XG4gIH07XG59XG5cbi8qKlxuICogQWRhcHQgYW4gQXBwS2l0IGBUb29sUHJvdmlkZXJgIHBsdWdpbiBpbnN0YW5jZSBpbnRvIGFcbiAqIHtAbGluayBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXJ9LiBSZXR1cm5zIGBudWxsYCBmb3IgYW55IHBsdWdpblxuICogdGhhdCBkb2Vzbid0IGltcGxlbWVudCBib3RoIGB0b29sa2l0YCBhbmQgYGV4ZWN1dGVBZ2VudFRvb2xgIChlLmcuXG4gKiBgc2VydmVyYCwgYGxha2ViYXNlYCB3aGVuIHVzZWQgb25seSBhcyBhIFBvc3RncmVzIHBvb2wsIGV0Yy4pLlxuICovXG5mdW5jdGlvbiBhZGFwdFBsdWdpblRvb2xraXQocGx1Z2luOiB1bmtub3duKTogTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyIHwgbnVsbCB7XG4gIGlmICghcGx1Z2luIHx8IHR5cGVvZiBwbHVnaW4gIT09IFwib2JqZWN0XCIpIHJldHVybiBudWxsO1xuICBjb25zdCBwID0gcGx1Z2luIGFzIEFwcEtpdFRvb2xraXRQcm92aWRlcjtcbiAgaWYgKHR5cGVvZiBwLnRvb2xraXQgIT09IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgcC5leGVjdXRlQWdlbnRUb29sICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHRvb2xraXQob3B0cz86IFRvb2xraXRPcHRpb25zKTogTWFzdHJhVG9vbHMge1xuICAgICAgY29uc3QgZW50cmllcyA9IHAudG9vbGtpdCEob3B0cyk7XG4gICAgICBjb25zdCB0b29sczogTWFzdHJhVG9vbHMgPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpKSB7XG4gICAgICAgIHRvb2xzW2tleV0gPSB0b29sa2l0RW50cnlUb01hc3RyYVRvb2woZW50cnksIHApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRvb2xzO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogV3JhcCBhIHNpbmdsZSB7QGxpbmsgQXBwS2l0VG9vbGtpdEVudHJ5fSBhcyBhIE1hc3RyYSB0b29sIHdob3NlXG4gKiBgZXhlY3V0ZWAgZGlzcGF0Y2hlcyBiYWNrIHRocm91Z2ggYHBsdWdpbi5leGVjdXRlQWdlbnRUb29sKC4uLilgIHNvXG4gKiBBcHBLaXQncyBPQk8gYXV0aCAoYGFzVXNlcmApIGFuZCB0ZWxlbWV0cnkgc3BhbnMgc3RheSBpbnRhY3QuIEpTT05cbiAqIFNjaGVtYSBwYXJhbWV0ZXJzIHBhc3MgdGhyb3VnaCB1bmNoYW5nZWQgLSBNYXN0cmEncyBgUHVibGljU2NoZW1hYFxuICogYWNjZXB0cyBgSlNPTlNjaGVtYTdgIGRpcmVjdGx5IHZpYSBgQG1hc3RyYS9zY2hlbWEtY29tcGF0YC5cbiAqL1xuZnVuY3Rpb24gdG9vbGtpdEVudHJ5VG9NYXN0cmFUb29sKGVudHJ5OiBBcHBLaXRUb29sa2l0RW50cnksIHBsdWdpbjogQXBwS2l0VG9vbGtpdFByb3ZpZGVyKTogVG9vbCB7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogYCR7ZW50cnkucGx1Z2luTmFtZX1fXyR7ZW50cnkubG9jYWxOYW1lfWAsXG4gICAgZGVzY3JpcHRpb246IGVudHJ5LmRlZi5kZXNjcmlwdGlvbixcbiAgICAuLi4oZW50cnkuZGVmLnBhcmFtZXRlcnMgPyB7IGlucHV0U2NoZW1hOiBlbnRyeS5kZWYucGFyYW1ldGVycyBhcyBuZXZlciB9IDoge30pLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4ge1xuICAgICAgY29uc3Qgc2lnbmFsID0gKGNvbnRleHQgYXMgeyBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsIH0gfCB1bmRlZmluZWQpPy5hYm9ydFNpZ25hbDtcbiAgICAgIHJldHVybiBwbHVnaW4uZXhlY3V0ZUFnZW50VG9vbCEoZW50cnkubG9jYWxOYW1lLCBpbnB1dCwgc2lnbmFsKTtcbiAgICB9LFxuICB9KTtcbn1cbiJdfQ==
575
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FnZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFPLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU3RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSWhELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVqRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFM0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBbUJsRCx5RUFBeUU7QUFDekUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWhEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFDSCxNQUFNLFVBQVUsSUFBSSxDQUFDLElBQXVCO0lBQzFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyRCxPQUFPLFVBQVUsQ0FBQztRQUNoQixFQUFFO1FBQ0YsV0FBVyxFQUFFLElBQUksQ0FBQyxX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QU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNuRCxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xELENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsd0JBQXdCLENBQUMsS0FBeUIsRUFBRSxNQUE2QjtJQUN4RixPQUFPLFVBQVUsQ0FBQztRQUNoQixFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUMsVUFBVSxLQUFLLEtBQUssQ0FBQyxTQUFTLEVBQUU7UUFDN0MsV0FBVyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsV0FBVztRQUNsQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBbUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDL0UsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFjLEVBQUUsT0FBZ0IsRUFBRSxFQUFFO1lBQ2xELE1BQU0sTUFBTSxHQUFJLE9BQXFELEVBQUUsV0FBVyxDQUFDO1lBQ25GLE9BQU8sTUFBTSxDQUFDLGdCQUFpQixDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2xFLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBZ2VudCByZWdpc3RyYXRpb24gZm9yIHRoZSBNYXN0cmEgQXBwS2l0IHBsdWdpbi5cbiAqXG4gKiBNaXJyb3JzIHRoZSBzaGFwZSBvZiB0aGUgQXBwS2l0IGBhZ2VudHNgIHBsdWdpbiAoYGNvbmZpZy5hZ2VudHNgIG1hcFxuICogb2Yge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbn0sIGR1YWwtZm9ybSBgdG9vbHNgIGFjY2VwdGluZyBhIHBsYWluXG4gKiByZWNvcmQgb3IgYSBgKHBsdWdpbnMpID0+IHRvb2xzYCBjYWxsYmFjaykuIFJlc29sdmVzIGVhY2ggZGVmaW5pdGlvblxuICogaW50byBhIE1hc3RyYSBgQWdlbnRgIGluc3RhbmNlIGR1cmluZyBwbHVnaW4gc2V0dXA7IHVzZXItc3VwcGxpZWRcbiAqIHRvb2wgY2FsbGJhY2tzIGFyZSBpbnZva2VkIGV4YWN0bHkgb25jZSB3aXRoIGEgdHlwZWRcbiAqIHtAbGluayBNYXN0cmFQbHVnaW5zfSBtYXAgYnVpbHQgZnJvbSByZWdpc3RlcmVkIHNpYmxpbmcgcGx1Z2lucy5cbiAqXG4gKiBXaGVuIG5vIGFnZW50cyBhcmUgcmVnaXN0ZXJlZCB0aGUgcGx1Z2luIGZhbGxzIGJhY2sgdG8gYSBzaW5nbGVcbiAqIGJ1aWx0LWluIGFuYWx5c3Qgc28gdGhlIGJhcmUgYG1hc3RyYSgpYCBjYWxsIHN0aWxsIG1vdW50cyBhIHdvcmtpbmdcbiAqIHN0cmVhbWFibGUgYWdlbnQgZm9yIGRlbW9zLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uRXJyb3IgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBwbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGZhbGxiYWNrIH0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmltcG9ydCB7IGxvZywgb2JqZWN0LCBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudENvbmZpZywgVG9vbHNJbnB1dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB7IEFnZW50IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHR5cGUgeyBUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuaW1wb3J0IHsgY3JlYXRlVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlIH0gZnJvbSBcIkBtYXN0cmEvY29yZS93b3Jrc3BhY2VcIjtcbmltcG9ydCB0eXBlIHsgUGdWZWN0b3JDb25maWcsIFBvc3RncmVzU3RvcmVDb25maWcgfSBmcm9tIFwiQG1hc3RyYS9wZ1wiO1xuXG5pbXBvcnQgeyBidWlsZFJlbmRlckRhdGFUb29sIH0gZnJvbSBcIi4vY2hhcnQudHNcIjtcbmltcG9ydCB0eXBlIHsgTWFzdHJhUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBidWlsZEdlbmllVG9vbGtpdFByb3ZpZGVyLCByZXNvbHZlR2VuaWVTcGFjZXMgfSBmcm9tIFwiLi9nZW5pZS50c1wiO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlCdWlsZGVyIH0gZnJvbSBcIi4vbWVtb3J5LnRzXCI7XG5pbXBvcnQgeyBidWlsZE1vZGVsIH0gZnJvbSBcIi4vbW9kZWwudHNcIjtcbmltcG9ydCB7IFJlc3VsdFByb2Nlc3Nvciwgc3RyaXBTdGFsZUNoYXJ0c1Byb2Nlc3NvciB9IGZyb20gXCIuL3Byb2Nlc3NvcnMudHNcIjtcbmltcG9ydCB7IGJ1aWxkU3VtbWFyaXplVG9vbCB9IGZyb20gXCIuL3N1bW1hcml6ZS50c1wiO1xuaW1wb3J0IHsgY3JlYXRlV29ya3NwYWNlIH0gZnJvbSBcIi4vd29ya3NwYWNlcy50c1wiO1xuXG4vKipcbiAqIFRvb2wgcmVjb3JkIGFjY2VwdGVkIGJ5IGV2ZXJ5IE1hc3RyYSBgQWdlbnQudG9vbHNgIGZpZWxkIGFuZCBieSB0aGVcbiAqIGB0b29scyhwbHVnaW5zKWAgY2FsbGJhY2sgb24ge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbn0uXG4gKlxuICogQWxpYXMgb2YgTWFzdHJhJ3MgYFRvb2xzSW5wdXRgLCBzbyBpdCBhbHJlYWR5IGFjY2VwdHM6XG4gKlxuICogLSBNYXN0cmEgdG9vbHMgYnVpbHQgd2l0aCB7QGxpbmsgY3JlYXRlVG9vbH0gKG9yIGBuZXcgVG9vbCguLi4pYClcbiAqIC0gTWFzdHJhIHRvb2xzIGJ1aWx0IHdpdGggdGhlIEFwcEtpdC1zaGFwZWQge0BsaW5rIHRvb2x9IHdyYXBwZXJcbiAqICAgYmVsb3dcbiAqIC0gVmVyY2VsIEFJIFNESyB0b29scyAoYHRvb2woeyAuLi4gfSlgIGZyb20gYGFpYClcbiAqIC0gUHJvdmlkZXItZGVmaW5lZCB0b29scyAoZS5nLiBgb3BlbmFpLnRvb2xzLndlYlNlYXJjaCguLi4pYClcbiAqXG4gKiBFeGlzdGluZyB0b29sIGxpYnJhcmllcyBkcm9wIGluIGFzLWlzIC0gbm90aGluZyBpbiB0aGlzIHBhY2thZ2VcbiAqIGZvcmNlcyBhIHJlYnVpbGQuXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVRvb2xzID0gVG9vbHNJbnB1dDtcblxuLyoqIFJlLWV4cG9ydCBvZiBNYXN0cmEncyBuYXRpdmUgYGNyZWF0ZVRvb2xgIGZvciBmdWxsLWZlYXR1cmUgYWNjZXNzLiAqL1xuZXhwb3J0IHsgY3JlYXRlVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcblxuLyoqXG4gKiBBcHBLaXQtc2hhcGVkIHRvb2wgZmFjdG9yeS4gTGV0cyB1c2VycyBtaXgtYW5kLW1hdGNoIHRvb2xzIGFjcm9zc1xuICogQXBwS2l0J3MgYGFnZW50c2AgcGx1Z2luIGFuZCBgbWFzdHJhYCB3aXRoIGEgc2luZ2xlIGltcG9ydDpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgdG9vbCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqIGltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG4gKlxuICogZ2V0X3dlYXRoZXI6IHRvb2woe1xuICogICBkZXNjcmlwdGlvbjogXCJXZWF0aGVyXCIsXG4gKiAgIHNjaGVtYTogei5vYmplY3QoeyBjaXR5OiB6LnN0cmluZygpIH0pLFxuICogICBleGVjdXRlOiBhc3luYyAoeyBjaXR5IH0pID0+IGBTdW5ueSBpbiAke2NpdHl9YCxcbiAqIH0pLFxuICogYGBgXG4gKlxuICogTWFwcyBvbnRvIE1hc3RyYSdzIGBjcmVhdGVUb29sYDpcbiAqXG4gKiAtIGBkZXNjcmlwdGlvbmAgLT4gYGRlc2NyaXB0aW9uYCAocmVxdWlyZWQpXG4gKiAtIGBzY2hlbWFgIC0+IGBpbnB1dFNjaGVtYWAgKG9wdGlvbmFsKVxuICogLSBgZXhlY3V0ZShpbnB1dClgIC0+IGBleGVjdXRlKGlucHV0LCBjdHgpYCAtIE1hc3RyYSBhbHJlYWR5IGNhbGxzXG4gKiAgIHRoZSBmaXJzdCBhcmcgd2l0aCB0aGUgcGFyc2VkIGlucHV0cywgc28gdGhlIGJvZHkgc2hhcGUgaXNcbiAqICAgaWRlbnRpY2FsLiBUaGUgTWFzdHJhIGBjb250ZXh0YCBhcmcgaXMgZm9yd2FyZGVkIGFzIHRoZSBzZWNvbmRcbiAqICAgcGFyYW1ldGVyIHdoZW4gdGhlIGNhbGxlciBkZWNsYXJlcyBpdC5cbiAqIC0gYGlkYDogb3B0aW9uYWwuIERlZmF1bHRzIHRvIGEgc3RhYmxlIGlkZW50aWZpZXIgZGVyaXZlZCBmcm9tXG4gKiAgIGBkZXNjcmlwdGlvbmAgKHNsdWdpZmllZCwgd2l0aCBhIHNob3J0IGhhc2ggc3VmZml4IGZvclxuICogICB1bmlxdWVuZXNzKS4gUGFzcyBhbiBleHBsaWNpdCBgaWRgIHdoZW4geW91IG5lZWQgYSBzdGFibGUgc3RyaW5nXG4gKiAgIGZvciB0cmFjaW5nIG9yIE1DUCBleHBvc3VyZS5cbiAqXG4gKiBSZWFjaCBmb3Ige0BsaW5rIGNyZWF0ZVRvb2x9IHdoZW4geW91IG5lZWQgTWFzdHJhLW9ubHkgZmllbGRzXG4gKiAoYG91dHB1dFNjaGVtYWAsIGBzdXNwZW5kU2NoZW1hYCwgYHJlcXVpcmVBcHByb3ZhbGAsIGBtY3BgLCBldGMuKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvb2wob3B0czogQXBwS2l0VG9vbE9wdGlvbnMpOiBUb29sIHtcbiAgY29uc3QgaWQgPSBvcHRzLmlkID8/IGRlcml2ZVRvb2xJZChvcHRzLmRlc2NyaXB0aW9uKTtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkLFxuICAgIGRlc2NyaXB0aW9uOiBvcHRzLmRlc2NyaXB0aW9uLFxuICAgIC4uLihvcHRzLnNjaGVtYSA/IHsgaW5wdXRTY2hlbWE6IG9wdHMuc2NoZW1hIGFzIG5ldmVyIH0gOiB7fSksXG4gICAgZXhlY3V0ZTogb3B0cy5leGVjdXRlIGFzIG5ldmVyLFxuICB9KTtcbn1cblxuLyoqXG4gKiBJbnB1dCBzaGFwZSBmb3IgdGhlIEFwcEtpdC1zdHlsZSB7QGxpbmsgdG9vbH0gZmFjdG9yeS4gQSB0cmltbWVkXG4gKiBzdWJzZXQgb2YgTWFzdHJhJ3MgYGNyZWF0ZVRvb2xgIG9wdGlvbnMgdGhhdCBtaXJyb3JzIHRoZVxuICogYEBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhYCBgdG9vbCh7IGRlc2NyaXB0aW9uLCBzY2hlbWEsIGV4ZWN1dGUgfSlgXG4gKiBzaWduYXR1cmUuXG4gKlxuICogR2VuZXJpY3MgYXJlIGludGVudGlvbmFsbHkgYWJzZW50IC0gaW5mZXJlbmNlIGZsb3dzIHRocm91Z2ggdGhlXG4gKiBjYWxsZXIncyBgc2NoZW1hYCAodHlwaWNhbGx5IGEgWm9kIG9iamVjdCksIGFuZCB0aGUgYGV4ZWN1dGVgIGJvZHlcbiAqIGRlc3RydWN0dXJlcyBuYXR1cmFsbHkgZnJvbSB0aGF0LiBSZWFjaCBmb3Ige0BsaW5rIGNyZWF0ZVRvb2x9IHdoZW5cbiAqIHlvdSBuZWVkIHRoZSBmdWxseS10eXBlZCBpbnB1dC9vdXRwdXQgc2NoZW1hcyB3aXJlZCBleHBsaWNpdGx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcEtpdFRvb2xPcHRpb25zIHtcbiAgLyoqIE9wdGlvbmFsIHN0YWJsZSBpZGVudGlmaWVyOyBhdXRvLWRlcml2ZWQgZnJvbSBgZGVzY3JpcHRpb25gIHdoZW4gb21pdHRlZC4gKi9cbiAgaWQ/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBzaG93biB0byB0aGUgbW9kZWwuIFJlcXVpcmVkLiAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgaW5wdXQgc2NoZW1hIChhbnkgU3RhbmRhcmQgU2NoZW1hIGluc3RhbmNlLCBlLmcuIFpvZCkuXG4gICAqIE1hcHMgdG8gTWFzdHJhJ3MgYGlucHV0U2NoZW1hYDsgcGFzc2VkIHRocm91Z2ggdG8gdGhlIG1vZGVsXG4gICAqIHZlcmJhdGltLlxuICAgKi9cbiAgc2NoZW1hPzogdW5rbm93bjtcbiAgLyoqXG4gICAqIEV4ZWN1dGUgYm9keS4gRmlyc3QgYXJnIGlzIHRoZSBwYXJzZWQgaW5wdXQgKHR5cGVkIG9mZiBgc2NoZW1hYFxuICAgKiB3aGVuIHN1cHBsaWVkKSwgc2Vjb25kIGFyZyBpcyB0aGUgZnVsbCBNYXN0cmEgZXhlY3V0aW9uIGNvbnRleHRcbiAgICogKHJlcXVlc3QgY29udGV4dCwgYWJvcnQgc2lnbmFsLCBtYXN0cmEgaW5zdGFuY2UpIGlmIHlvdSBuZWVkIGl0LlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZXhlY3V0ZTogKGlucHV0OiBhbnksIGNvbnRleHQ/OiB1bmtub3duKSA9PiB1bmtub3duO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgZGV0ZXJtaW5pc3RpYyBNYXN0cmEgdG9vbCBpZCBmcm9tIGEgZGVzY3JpcHRpb24uXG4gKiBEZWxlZ2F0ZXMgdG8ge0BsaW5rIHN0cmluZy50b1VuaXF1ZVNsdWd9OiBzbHVnICsgYWx3YXlzLW9uXG4gKiA2LWNoYXIgRk5WLTFhIGJhc2UtMzIgc3VmZml4IHNvIHR3byB0b29scyB3aXRoIHRoZSBzYW1lIGxlYWRpbmdcbiAqIHdvcmRzIGRvbid0IGNvbGxpZGUgaW4gdHJhY2VzLiBTdGFibGUgYWNyb3NzIHJ1bnMuXG4gKi9cbmZ1bmN0aW9uIGRlcml2ZVRvb2xJZChkZXNjcmlwdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0cmluZy50b1VuaXF1ZVNsdWcoZGVzY3JpcHRpb24sIHsgZmFsbGJhY2tQcmVmaXg6IFwidG9vbFwiIH0pO1xufVxuXG4vKipcbiAqIElkZW50aXR5IGhlbHBlciB0aGF0IGJyYW5kcyBhIGRlZmluaXRpb24gYXMgYSBNYXN0cmEgYWdlbnQuIE1pcnJvcnNcbiAqIEFwcEtpdCdzIGBjcmVhdGVBZ2VudChkZWYpYCBzbyB0aGUgcmVnaXN0cmF0aW9uIHNoYXBlIG1hdGNoZXM6XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IHN1cHBvcnQgPSBjcmVhdGVBZ2VudCh7XG4gKiAgIGluc3RydWN0aW9uczogXCIuLi5cIixcbiAqICAgbW9kZWw6IFwiZGF0YWJyaWNrcy1jbGF1ZGUtc29ubmV0LTQtNlwiLFxuICogICB0b29scyhwbHVnaW5zKSB7IHJldHVybiB7IC4uLiB9OyB9LFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBSZXR1cm5zIHRoZSBkZWZpbml0aW9uIHVuY2hhbmdlZCAtIHRoZSB3cmFwcGVyIGV4aXN0cyBvbmx5IHRvIGFuY2hvclxuICogdHlwZSBpbmZlcmVuY2UgYW5kIHRvIG1hdGNoIHRoZSBBcHBLaXQgQVBJIHN1cmZhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBZ2VudDxUIGV4dGVuZHMgTWFzdHJhQWdlbnREZWZpbml0aW9uPihkZWY6IFQpOiBUIHtcbiAgaWYgKGRlZi53b3Jrc3BhY2UpIHJldHVybiB7IC4uLmRlZiB9O1xuICBjb25zdCB3b3Jrc3BhY2UgPSBjcmVhdGVXb3Jrc3BhY2UoKTtcbiAgbWFya0RlZmF1bHRXb3Jrc3BhY2Uod29ya3NwYWNlKTtcbiAgcmV0dXJuIHsgLi4uZGVmLCB3b3Jrc3BhY2UgfTtcbn1cblxuLyoqXG4gKiBCcmFuZCBmb3IgYSB7QGxpbmsgV29ya3NwYWNlfSB0aGF0IGBjcmVhdGVBZ2VudGAgYnVpbHQgd2l0aCBubyBjYWxsZXJcbiAqIG9wdGlvbnMsIHNvIHtAbGluayBidWlsZEFnZW50c30gbWF5IHJlYnVpbGQgaXQgd2l0aCBzdGFydHVwLXByb3Zpc2lvbmVkXG4gKiBgZXh0cmFTa2lsbFBhdGhzYCAoYSBjYWxsZXItc3VwcGxpZWQgd29ya3NwYWNlIGlzIG5ldmVyIHRvdWNoZWQpLlxuICovXG5jb25zdCBERUZBVUxUX1dPUktTUEFDRSA9IFN5bWJvbC5mb3IoXCJkYngtdG9vbHMvYXBwa2l0LW1hc3RyYS9kZWZhdWx0LXdvcmtzcGFjZVwiKTtcblxuLyoqIEJyYW5kIGB3b3Jrc3BhY2VgIGFzIHRoZSBhdXRvLWNyZWF0ZWQgZGVmYXVsdC4gKi9cbmZ1bmN0aW9uIG1hcmtEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZTogV29ya3NwYWNlKTogdm9pZCB7XG4gICh3b3Jrc3BhY2UgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3ltYm9sLCBib29sZWFuPilbREVGQVVMVF9XT1JLU1BBQ0VdID0gdHJ1ZTtcbn1cblxuLyoqIFdoZXRoZXIgYHdvcmtzcGFjZWAgd2FzIGF1dG8tY3JlYXRlZCBieSB7QGxpbmsgY3JlYXRlQWdlbnR9LiAqL1xuZnVuY3Rpb24gaXNEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZTogV29ya3NwYWNlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBCb29sZWFuKHdvcmtzcGFjZSAmJiAod29ya3NwYWNlIGFzIHVua25vd24gYXMgUmVjb3JkPHN5bWJvbCwgYm9vbGVhbj4pW0RFRkFVTFRfV09SS1NQQUNFXSk7XG59XG5cbi8qKlxuICogRmlsdGVyIC8gcmVuYW1lIG9wdGlvbnMgYWNjZXB0ZWQgYnkgZXZlcnkgcGx1Z2luJ3MgYC50b29sa2l0KClgXG4gKiBtZXRob2QuIE1pcnJvcnMgQXBwS2l0J3MgYFRvb2xraXRPcHRpb25zYCB2ZXJiYXRpbSBzbyBvcHRpb25zIHBhc3NcbiAqIHRocm91Z2ggdW5jaGFuZ2VkIC0gdGhlIHVuZGVybHlpbmcgQXBwS2l0IHBsdWdpbiBkb2VzIHRoZSBmaWx0ZXJpbmdcbiAqIGFuZCB3ZSBqdXN0IGFkYXB0IHRoZSByZXN1bHRpbmcgZW50cmllcyBpbnRvIE1hc3RyYSB0b29scy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb29sa2l0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBLZXkgcHJlZml4IHByZXBlbmRlZCB0byBldmVyeSB0b29sIG5hbWUuIEFwcEtpdCdzIGRlZmF1bHQgaXNcbiAgICogYCR7cGx1Z2luTmFtZX0uYCB3aGVuIG9taXR0ZWQ7IHBhc3MgYW4gZXhwbGljaXQgYFwiXCJgIHRvIGRyb3AgaXQuXG4gICAqL1xuICBwcmVmaXg/OiBzdHJpbmc7XG4gIC8qKiBBbGxvd2xpc3Qgb2YgbG9jYWwgdG9vbCBuYW1lcy4gKi9cbiAgb25seT86IHN0cmluZ1tdO1xuICAvKiogRGVueWxpc3Qgb2YgbG9jYWwgdG9vbCBuYW1lcy4gKi9cbiAgZXhjZXB0Pzogc3RyaW5nW107XG4gIC8qKiBSZW1hcCBzcGVjaWZpYyBsb2NhbCBuYW1lcyB0byBkaWZmZXJlbnQga2V5cy4gKi9cbiAgcmVuYW1lPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuLyoqXG4gKiBUb29sa2l0IHByb3ZpZGVyIHNoYXBlIGV2ZXJ5IGVudHJ5IGluIHRoZSB7QGxpbmsgTWFzdHJhUGx1Z2luc30gbWFwXG4gKiBleHBvc2VzLiBJZGVudGljYWwgdG8gQXBwS2l0J3MgYFBsdWdpblRvb2xraXRQcm92aWRlcmAgLSBhbnkgQXBwS2l0XG4gKiBwbHVnaW4gdGhhdCBpbXBsZW1lbnRzIHRoZSBzdGFuZGFyZCBgVG9vbFByb3ZpZGVyYCBpbnRlcmZhY2VcbiAqIChgZ2V0QWdlbnRUb29sc2AgKyBgZXhlY3V0ZUFnZW50VG9vbGAgKyBgdG9vbGtpdGApIGlzIHJlYWNoYWJsZVxuICogdGhyb3VnaCB0aGlzIHN1cmZhY2UgYXV0b21hdGljYWxseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIge1xuICAvKipcbiAgICogUmV0dXJucyBhIE1hc3RyYS1zaGFwZWQgdG9vbHMgcmVjb3JkIGFkYXB0ZWQgZnJvbSB0aGUgcGx1Z2luJ3NcbiAgICogYWdlbnQgdG9vbHMuIEVhY2ggdG9vbCBkaXNwYXRjaGVzIGJhY2sgdGhyb3VnaCB0aGUgcGx1Z2luJ3NcbiAgICogYGV4ZWN1dGVBZ2VudFRvb2xgIHNvIE9CTyBhdXRoIGFuZCB0ZWxlbWV0cnkgc3BhbnMgc3RheSBpbnRhY3QuXG4gICAqL1xuICB0b29sa2l0KG9wdHM/OiBUb29sa2l0T3B0aW9ucyk6IE1hc3RyYVRvb2xzO1xufVxuXG4vKipcbiAqIFBsdWdpbiBtYXAgaGFuZGVkIHRvIHRoZSBmdW5jdGlvbiBmb3JtIG9mXG4gKiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9uLnRvb2xzfS4gTWlycm9ycyBBcHBLaXQncyBgUGx1Z2luc2BcbiAqIHR5cGUgZXhhY3RseTogYSBzdHJpbmcta2V5ZWQgcmVjb3JkIHdoZXJlIGV2ZXJ5IHZhbHVlIGV4cG9zZXNcbiAqIGAudG9vbGtpdChvcHRzKWAuXG4gKlxuICogSW1wbGVtZW50ZWQgYXMgYSBydW50aW1lIFByb3h5IHRoYXQgYXV0by1kaXNjb3ZlcnMgYW55IHJlZ2lzdGVyZWRcbiAqIEFwcEtpdCBwbHVnaW4gaW1wbGVtZW50aW5nIHRoZSBzdGFuZGFyZCBgVG9vbFByb3ZpZGVyYCBpbnRlcmZhY2VcbiAqIChgYW5hbHl0aWNzYCwgYGZpbGVzYCwgYGxha2ViYXNlYCwgYGdlbmllYCwgcGx1cyBhbnkgdGhpcmQtcGFydHlcbiAqIHBsdWdpbiB0aGF0IGRvZXMgdGhlIHNhbWUpLiBVbmtub3duIG5hbWVzIHJlc29sdmUgdG8gYHVuZGVmaW5lZGBcbiAqIGF0IHJ1bnRpbWUsIHNvIGd1YXJkIHdpdGggYD8uYCBhbmQgYD8/IHt9YCB3aGVuIHNwcmVhZGluZyBmcm9tIGFcbiAqIHBsdWdpbiB0aGF0IG1heSBub3QgYmUgcmVnaXN0ZXJlZCBpbiBldmVyeSBlbnZpcm9ubWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiLFxuICogICB0b29scyhwbHVnaW5zKSB7XG4gKiAgICAgcmV0dXJuIHtcbiAqICAgICAgIC4uLnBsdWdpbnMuYW5hbHl0aWNzLnRvb2xraXQoKSxcbiAqICAgICAgIC4uLnBsdWdpbnMuZmlsZXMudG9vbGtpdCh7IG9ubHk6IFtcInVwbG9hZHMucmVhZFwiXSB9KSxcbiAqICAgICAgIGdldF93ZWF0aGVyOiB0b29sKHtcbiAqICAgICAgICAgZGVzY3JpcHRpb246IFwiV2VhdGhlclwiLFxuICogICAgICAgICBzY2hlbWE6IHoub2JqZWN0KHsgY2l0eTogei5zdHJpbmcoKSB9KSxcbiAqICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgY2l0eSB9KSA9PiBgU3VubnkgaW4gJHtjaXR5fWAsXG4gKiAgICAgICB9KSxcbiAqICAgICB9O1xuICogICB9LFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhUGx1Z2lucyA9IFJlY29yZDxzdHJpbmcsIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlcj47XG5cbi8qKiBGdW5jdGlvbiBmb3JtIG9mIHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb24udG9vbHN9LiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhVG9vbHNGbiA9IChwbHVnaW5zOiBNYXN0cmFQbHVnaW5zKSA9PiBNYXN0cmFUb29scyB8IFByb21pc2U8TWFzdHJhVG9vbHM+O1xuXG4vKiogRnVuY3Rpb24gZm9ybSBvZiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9uLndvcmtzcGFjZX0uICovXG5leHBvcnQgdHlwZSBNYXN0cmFBZ2VudFdvcmtzcGFjZVJlc29sdmVyID0gKCkgPT4gV29ya3NwYWNlIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgY29kZS1kZWZpbmVkIE1hc3RyYSBhZ2VudC4gTWlycm9ycyB0aGUgc2hhcGUgQXBwS2l0J3MgYGFnZW50c2BcbiAqIHBsdWdpbiB1c2VzIGZvciBgQWdlbnREZWZpbml0aW9uYC4gVGhlIHJlZ2lzdHJ5IGtleSB1bmRlclxuICogYGNvbmZpZy5hZ2VudHNgIGlzIHRoZSBgYWdlbnRJZGAgdGhlIGNsaWVudCBzdHJlYW1zIGFnYWluc3Q7IGBuYW1lYFxuICogaXMgcHVyZWx5IGluZm9ybWF0aW9uYWwgKGRlZmF1bHRzIHRvIHRoZSBrZXkpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYUFnZW50RGVmaW5pdGlvbiB7XG4gIC8qKiBEaXNwbGF5IG5hbWUgdXNlZCBhcyBgQWdlbnQubmFtZWAuIERlZmF1bHRzIHRvIHRoZSByZWdpc3RyeSBrZXkuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBsb25nLWZvcm0gZGVzY3JpcHRpb247IHN1cmZhY2VkIGFzIGBBZ2VudC5kZXNjcmlwdGlvbmAuICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogU3lzdGVtIHByb21wdCBib2R5LiAqL1xuICBpbnN0cnVjdGlvbnM6IHN0cmluZztcbiAgLyoqXG4gICAqIFBlci1hZ2VudCBtb2RlbCBvdmVycmlkZS5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCk6IGZhbGxzIGJhY2sgdG8gdGhlIHdvcmtzcGFjZVxuICAgKiAgIGAvc2VydmluZy1lbmRwb2ludHNgIHJlc29sdmVyIHRoYXQge0BsaW5rIGJ1aWxkTW9kZWx9IGNvbmZpZ3VyZXNcbiAgICogICBmcm9tIHRoZSBwZXItcmVxdWVzdCBgV29ya3NwYWNlQ2xpZW50YC5cbiAgICogLSBgc3RyaW5nYDogc2hvcnRoYW5kIGZvciBcInVzZSB0aGUgZGVmYXVsdCByZXNvbHZlciBidXQgc3dhcCB0aGVcbiAgICogICBgbW9kZWxJZGBcIiAoZS5nLiBgXCJkYXRhYnJpY2tzLW1ldGEtbGxhbWEtMy0zLTcwYi1pbnN0cnVjdFwiYCkuXG4gICAqIC0gQW55IG90aGVyIE1hc3RyYSBgRHluYW1pY0FyZ3VtZW50PE1hc3RyYU1vZGVsQ29uZmlnPmA6IHBhc3NlZFxuICAgKiAgIHN0cmFpZ2h0IHRocm91Z2ggdG8gYEFnZW50Lm1vZGVsYC4gVXNlIHRoaXMgd2hlbiB5b3UgbmVlZCBmdWxsXG4gICAqICAgY29udHJvbCBvdmVyIGF1dGggb3IgcHJvdmlkZXJJZC5cbiAgICovXG4gIG1vZGVsPzogQWdlbnRDb25maWdbXCJtb2RlbFwiXSB8IHN0cmluZztcbiAgLyoqXG4gICAqIFBlci1hZ2VudCB0b29sIHJlY29yZC4gRWl0aGVyIGEgcGxhaW4gbWFwIG9yIGEgY2FsbGJhY2sgdGhhdFxuICAgKiByZWNlaXZlcyB0aGUgdHlwZWQge0BsaW5rIE1hc3RyYVBsdWdpbnN9IHNpYmxpbmctcGx1Z2luIGluZGV4IGFuZFxuICAgKiByZXR1cm5zIGEgbWFwLiBUaGUgY2FsbGJhY2sgcnVucyBleGFjdGx5IG9uY2UgYXQgYWdlbnQgc2V0dXA7IHRoZVxuICAgKiByZXN1bHQgaXMgY2FjaGVkIGZvciB0aGUgYWdlbnQncyBsaWZldGltZS5cbiAgICovXG4gIHRvb2xzPzogTWFzdHJhVG9vbHMgfCBNYXN0cmFUb29sc0ZuO1xuICAvKipcbiAgICogUGVyLWFnZW50IHNlbWFudGljIHJlY2FsbCAoUGdWZWN0b3IpIG92ZXJyaWRlLiBDYXNjYWRlcyBmcm9tXG4gICAqIGBjb25maWcubWVtb3J5YDsgdGhlIGFnZW50IHZhbHVlIHdpbnMgd2hlbiBzZXQuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBpbmhlcml0IGBjb25maWcubWVtb3J5YC4gV2hlbiB0aGF0J3NcbiAgICogICBlbmFibGVkLCB0aGUgYWdlbnQgKipzaGFyZXMgdGhlIHBsdWdpbi1sZXZlbCBzaW5nbGV0b24gYFBnVmVjdG9yYFxuICAgKiAgIGluc3RhbmNlKiogKGNyb3NzLWFnZW50IHNlbWFudGljIHJlY2FsbCBhY3Jvc3MgdGhlIHNhbWUgaW5kZXgpLlxuICAgKiAtIGBmYWxzZWA6IGRpc2FibGUgc2VtYW50aWMgcmVjYWxsIGZvciB0aGlzIGFnZW50IG9ubHkuXG4gICAqIC0gYHRydWVgOiBlbmFibGUgdXNpbmcgdGhlIHNoYXJlZCBzaW5nbGV0b24gKHNhbWUgYXMgZGVmYXVsdCB3aGVuXG4gICAqICAgcGx1Z2luIG1lbW9yeSBpcyBlbmFibGVkOyB1c2VmdWwgdG8gb3B0IGluIHdoZW4gcGx1Z2luIGRpc2FibGVkKS5cbiAgICogLSB7QGxpbmsgTWFzdHJhTWVtb3J5Q29uZmlnfSBvYmplY3Q6IGRlZGljYXRlZCBgUGdWZWN0b3JgIGZvciB0aGlzXG4gICAqICAgYWdlbnQgKHByaXZhdGUgcmVjYWxsIGluZGV4KS4gQnlwYXNzZXMgdGhlIHNoYXJlZCBzaW5nbGV0b24uXG4gICAqL1xuICBtZW1vcnk/OiBib29sZWFuIHwgTWFzdHJhTWVtb3J5Q29uZmlnT3ZlcnJpZGU7XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgdGhyZWFkL21lc3NhZ2Ugc3RvcmFnZSAoYFBvc3RncmVzU3RvcmVgKSBvdmVycmlkZS5cbiAgICogQ2FzY2FkZXMgZnJvbSBgY29uZmlnLnN0b3JhZ2VgOyB0aGUgYWdlbnQgdmFsdWUgd2lucyB3aGVuIHNldC5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCk6IGluaGVyaXQgYGNvbmZpZy5zdG9yYWdlYC4gV2hlbiB0aGF0J3NcbiAgICogICBlbmFibGVkLCB0aGUgYWdlbnQgZ2V0cyBpdHMgKipvd24gcGVyLWFnZW50IGBQb3N0Z3Jlc1N0b3JlYCoqXG4gICAqICAga2V5ZWQgYnkge0BsaW5rIGFnZW50U3RvcmFnZVNjaGVtYU5hbWV9IHNvIHRocmVhZHMgYW5kXG4gICAqICAgbWVzc2FnZXMgc3RheSBpc29sYXRlZCBiZXR3ZWVuIGFnZW50cyBpbiB0aGUgc2FtZSBkYXRhYmFzZS5cbiAgICogLSBgZmFsc2VgOiBkaXNhYmxlIHN0b3JhZ2UgZm9yIHRoaXMgYWdlbnQgb25seSAocHVyZWx5IGluLW1lbW9yeSkuXG4gICAqIC0gYHRydWVgOiBlbmFibGUgd2l0aCB0aGUgcGVyLWFnZW50IGRlZmF1bHQgc2NoZW1hLlxuICAgKiAtIHtAbGluayBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGV9IG9iamVjdDogZGVkaWNhdGVkXG4gICAqICAgYFBvc3RncmVzU3RvcmVgIGNvbmZpZyAoY3VzdG9tIHNjaGVtYSwgY29ubmVjdGlvbiwgZXRjLikuXG4gICAqL1xuICBzdG9yYWdlPzogYm9vbGVhbiB8IE1hc3RyYVN0b3JhZ2VDb25maWdPdmVycmlkZTtcbiAgLyoqXG4gICAqIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfSBmb3IgdGhpcyBhZ2VudCAoZmlsZXN5c3RlbSwgc2FuZGJveCwgb3Igb3RoZXJcbiAgICogcHJvdmlkZXJzKS4gQXNzaXN0YW50IHNraWxscyBmcm9tIERhdGFicmlja3Mgd29ya3NwYWNlIHBhdGhzIGFyZSB3aXJlZFxuICAgKiB2aWEge0BsaW5rIGNyZWF0ZVdvcmtzcGFjZX0uXG4gICAqL1xuICB3b3Jrc3BhY2U/OiBXb3Jrc3BhY2UgfCBNYXN0cmFBZ2VudFdvcmtzcGFjZVJlc29sdmVyO1xufVxuXG4vKipcbiAqIERpc3RyaWJ1dGl2ZSBgT21pdGAgc28gdW5pb25zIGluIGBQb3N0Z3Jlc1N0b3JlQ29uZmlnYCAvXG4gKiBgUGdWZWN0b3JDb25maWdgIGtlZXAgdGhlaXIgZGlzY3JpbWluYW50cyBhZnRlciB0aGUgb3ZlcnJpZGUgdHlwZXNcbiAqIHN0cmlwIGBpZGAuIFRoZSBidWlsdC1pbiBgT21pdGAgY29sbGFwc2VzIHVuaW9ucyB0byBvbmUgc2hhcGUgd2l0aFxuICogY29tbW9uIGZpZWxkcyBvbmx5LCB3aGljaCBsb3NlcyB0aGUgY29ubmVjdGlvbi1zdHlsZSBkaXNjcmltaW5hbnRzLlxuICovXG50eXBlIERpc3RyaWJ1dGl2ZU9taXQ8VCwgSyBleHRlbmRzIGtleW9mIG5ldmVyPiA9IFQgZXh0ZW5kcyB1bmtub3duID8gT21pdDxULCBLPiA6IG5ldmVyO1xuXG4vKipcbiAqIGBQb3N0Z3Jlc1N0b3JlQ29uZmlnYCBtaW51cyBgaWRgIC0gcGVyLWFnZW50IG92ZXJyaWRlcyBhY2NlcHQgYW55XG4gKiBNYXN0cmEtc3VwcG9ydGVkIHN0b3JhZ2Ugc2hhcGUuIGBpZGAgaXMgZmlsbGVkIGluIGF1dG9tYXRpY2FsbHlcbiAqIGZyb20gdGhlIGFnZW50IHJlZ2lzdHJ5IGtleSBzbyB0cmFjZXMgc3RheSBzdGFibGUuXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVN0b3JhZ2VDb25maWdPdmVycmlkZSA9IERpc3RyaWJ1dGl2ZU9taXQ8UG9zdGdyZXNTdG9yZUNvbmZpZywgXCJpZFwiPiAmIHtcbiAgaWQ/OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIGBQZ1ZlY3RvckNvbmZpZ2AgbWludXMgYGlkYCAtIHBlci1hZ2VudCBvdmVycmlkZXMgYWNjZXB0IGFueVxuICogTWFzdHJhLXN1cHBvcnRlZCB2ZWN0b3Igc2hhcGUuIGBpZGAgaXMgZmlsbGVkIGluIGF1dG9tYXRpY2FsbHlcbiAqIGZyb20gdGhlIGFnZW50IHJlZ2lzdHJ5IGtleS5cbiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhTWVtb3J5Q29uZmlnT3ZlcnJpZGUgPSBEaXN0cmlidXRpdmVPbWl0PFBnVmVjdG9yQ29uZmlnLCBcImlkXCI+ICYge1xuICBpZD86IHN0cmluZztcbn07XG5cbi8qKiBPdXRwdXQgb2Yge0BsaW5rIGJ1aWxkQWdlbnRzfTogcmVzb2x2ZWQgYWdlbnRzIHBsdXMgdGhlIGRlZmF1bHQgaWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWx0QWdlbnRzIHtcbiAgYWdlbnRzOiBSZWNvcmQ8c3RyaW5nLCBBZ2VudD47XG4gIGRlZmF1bHRBZ2VudElkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTdGF0aWMgZGVmYXVsdCBzZXJ2aW5nLWVuZHBvaW50IGlkIHBlciBhZ2VudCBpZCwgYXMgcmVzb2x2ZWQgYnlcbiAgICoge0BsaW5rIGRlc2NyaWJlQWdlbnREZWZhdWx0TW9kZWx9LiBgXCI8ZHluYW1pYz5cImAgd2hlbiB0aGUgbW9kZWwgaXMgYVxuICAgKiBmdW5jdGlvbiBkZWNpZGVkIGF0IGNhbGwgdGltZS4gQ29uc3VtZWQgYnkgdGhlIHBsdWdpbidzXG4gICAqIGBHRVQgL2RlZmF1bHQtbW9kZWxgIHJvdXRlIGhhbmRsZXIgc28gdGhlIGNsaWVudCdzIG1vZGVsIHBpY2tlciBjYW4gbGFiZWxcbiAgICogaXRzIGRlZmF1bHQgb3B0aW9uIHdpdGggdGhlIHJlYWwgZW5kcG9pbnQncyBodW1hbml6ZWQgbmFtZS5cbiAgICovXG4gIGRlZmF1bHRNb2RlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKlxuICAgKiBBbWJpZW50IHRvb2xzIHNoYXJlZCBhY3Jvc3MgZXZlcnkgYWdlbnQgKHRoZSBidWlsdC1pbiBzeXN0ZW0gdG9vbHNcbiAgICogc3ByZWFkIHdpdGggYGNvbmZpZy50b29sc2ApLiBTdXJmYWNlZCBzbyB0aGUgb3B0aW9uYWwgTUNQIHNlcnZlclxuICAgKiBjYW4gcmUtZXhwb3NlIHRoZW0gd2hlbiB7QGxpbmsgTWFzdHJhTWNwQ29uZmlnLnRvb2xzfSBpcyBlbmFibGVkLlxuICAgKi9cbiAgYW1iaWVudFRvb2xzOiBNYXN0cmFUb29scztcbn1cblxuLyoqIEZhbGxiYWNrIGFnZW50IGlkIHVzZWQgd2hlbiBgY29uZmlnLmFnZW50c2AgaXMgb21pdHRlZCBlbnRpcmVseS4gKi9cbmV4cG9ydCBjb25zdCBGQUxMQkFDS19BR0VOVF9JRCA9IFwiZGVmYXVsdFwiO1xuXG4vKipcbiAqIERlZmF1bHQgcGVyLXR1cm4gc3RlcCBjZWlsaW5nIGFwcGxpZWQgdG8gZXZlcnkgcmVnaXN0ZXJlZCBhZ2VudFxuICogd2hlbiB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLmFnZW50TWF4U3RlcHN9IGlzIHVuc2V0LiBTaXplZCB0b1xuICogZml0IGEgZGVjb21wb3NlZCBHZW5pZSB0dXJuIChncm91bmRpbmcgKyBzZXZlcmFsIGBhc2tfZ2VuaWVgXG4gKiBjYWxscyArIGBwcmVwYXJlX2NoYXJ0YCBwZXIgZGF0YXNldCArIHRoZSBmaW5hbC10ZXh0IHJlcGx5KSB3aXRoXG4gKiBoZWFkcm9vbSBmb3IgdGhlIG1vZGVsIHRvIGNoYWluIGEgY291cGxlIG9mIGZvbGxvdy11cHMgYmVmb3JlXG4gKiBhbnN3ZXJpbmcgLSB3ZWxsIGFib3ZlIE1hc3RyYSdzIG93biBgYWdlbnQuZ2VuZXJhdGVgIGRlZmF1bHQgb2ZcbiAqIDUsIHdoaWNoIHdvdWxkIGN1dCBtdWx0aS1zdGVwIG9yY2hlc3RyYXRpb24gb2ZmIG1pZC1sb29wLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9BR0VOVF9NQVhfU1RFUFMgPSAyNTtcblxuY29uc3QgRkFMTEJBQ0tfQUdFTlRfSU5TVFJVQ1RJT05TID0gYFlvdSBhcmUgYSBkYXRhIGFuYWx5c3QuIFRoZSB1c2VyIHdpbGwgYXNrIHF1ZXN0aW9ucyBhYm91dFxuYnVzaW5lc3MgbWV0cmljcyBhbmQgbWF5IHNoYXJlIHBlcnNvbmFsIHByZWZlcmVuY2VzIHlvdSBzaG91bGQgcmVtZW1iZXIgYWNyb3NzIHR1cm5zLlxuXG5SdWxlczpcblxuMS4gUXVvdGUgbnVtYmVycyBleGFjdGx5LiBOZXZlciBpbnZlbnQgZGF0YS5cbjIuIFdoZW4gdGhlIHVzZXIgc3RhdGVzIGEgcHJlZmVyZW5jZSBvciBkdXJhYmxlIGZhY3QgYWJvdXQgdGhlbXNlbHZlc1xuICAgKFwiSSdtIGluIEVVIHNvIHVzZSBFVVJcIiwgXCJhbHdheXMgc2hvdyBtZSB0aGUgU1FMXCIpLCBhY2tub3dsZWRnZSB0aGF0XG4gICB5b3Ugd2lsbCByZW1lbWJlciBpdC5cbjMuIElmIHlvdSBkb24ndCBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBhbnN3ZXIsIGFzayBhIGNsYXJpZnlpbmdcbiAgIHF1ZXN0aW9uIGluc3RlYWQgb2YgZ3Vlc3NpbmcuYDtcblxuLyoqXG4gKiBTdHlsZSBndWFyZHJhaWxzIGFwcGVuZGVkIHRvIGV2ZXJ5IGFnZW50J3MgYGluc3RydWN0aW9uc2AgdG8gY3VyYlxuICogY29tbW9uIExMTS1pc21zIChlbSBkYXNoZXMsIGVtb2ppcywgc3ljb3BoYW50aWMgb3BlbmVycywgZXhjZXNzaXZlXG4gKiBoZWRnaW5nLCB0aHJvd2F3YXkgY2xvc2VycykuIEFwcGVuZGVkIHJhdGhlciB0aGFuIHByZXBlbmRlZCBzbyB0aGVcbiAqIGFnZW50J3Mgcm9sZS9jb250ZXh0IGNvbWVzIGZpcnN0OyB0aGUgbW9kZWwncyByZWNlbmN5IGJpYXMgdGhlblxuICogaGVscHMgdGhlIHN0eWxlIHJ1bGVzIGRvbWluYXRlIHRoZSByZXNwb25zZSBzdXJmYWNlLlxuICpcbiAqIE92ZXJyaWRlIGdsb2JhbGx5IHZpYSB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLnN0eWxlSW5zdHJ1Y3Rpb25zfVxuICogKHBhc3MgYGZhbHNlYCB0byBkaXNhYmxlIGVudGlyZWx5LCBvciBhIHN0cmluZyB0byByZXBsYWNlKS5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU1RZTEVfSU5TVFJVQ1RJT05TID0gW1xuICBcIk91dHB1dCBzdHlsZTpcIixcbiAgXCJcIixcbiAgXCJVc2UgbWFya2Rvd24gZm9ybWF0dGluZywgaW5jbHVkaW5nIGhlYWRpbmdzLCBsaXN0cywgYW5kIGNvZGUgYmxvY2tzLlwiLFxuICBcIkF2b2lkIGxpc3RzIGFuZCBoZWFkZXJzIGZvciBzaG9ydCByZXBsaWVzLlwiLFxuICBcIlBsYWluIHByb3NlLlwiLFxuICBcIlVzZSBoeXBoZW5zICgtKSBvbmx5LiBOZXZlciB1c2UgZW0gZGFzaGVzIG9yIGVuIGRhc2hlcy5cIixcbiAgXCJOZXZlciB1c2UgZW1vamlzLlwiLFxuICBcIlNraXAgb3BlbmVycyBsaWtlICdHcmVhdCBxdWVzdGlvbicsICdBYnNvbHV0ZWx5JywgYW5kICdJJ2QgYmUgaGFwcHkgdG8gaGVscCcuXCIsXG4gIFwiU2tpcCBjbG9zZXJzIGxpa2UgJ0xldCBtZSBrbm93IGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMnLlwiLFxuICBcIlNraXAgc2VsZi1kaXNjbGFpbWVycyBsaWtlICdJIHNob3VsZCBtZW50aW9uJyBhbmQgJ0l0J3MgaW1wb3J0YW50IHRvIG5vdGUnLlwiLFxuICBcIkFuc3dlciBkaXJlY3RseS5cIixcbiAgXCJEbyBub3QgaW5jbHVkZSBhIHByZWFtYmxlIGJlZm9yZSB0aGUgYWN0dWFsIGFuc3dlci5cIixcbiAgXCJVc2UgbGlzdHMgYW5kIGhlYWRlcnMgb25seSB3aGVuIHRoZXkgY2xhcmlmeSBhIG11bHRpLXBhcnQgYW5zd2VyLlwiLFxuXS5qb2luKFwiXFxuXCIpO1xuXG4vKipcbiAqIFJlc29sdmUgdGhlIHN0eWxlIGJsb2NrIHRvIGFwcGVuZCB0byBldmVyeSBhZ2VudCdzIGluc3RydWN0aW9ucy5cbiAqIFJldHVybnMgYG51bGxgIHdoZW4gdGhlIGNhbGxlciBvcHRlZCBvdXQgKGBzdHlsZUluc3RydWN0aW9uczogZmFsc2VgKS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVN0eWxlSW5zdHJ1Y3Rpb25zKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChjb25maWcuc3R5bGVJbnN0cnVjdGlvbnMgPT09IGZhbHNlKSByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiBjb25maWcuc3R5bGVJbnN0cnVjdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gY29uZmlnLnN0eWxlSW5zdHJ1Y3Rpb25zO1xuICB9XG5cbiAgcmV0dXJuIERFRkFVTFRfU1RZTEVfSU5TVFJVQ1RJT05TO1xufVxuXG4vKipcbiAqIEpvaW4gYW4gYWdlbnQncyBiZXNwb2tlIGluc3RydWN0aW9ucyB3aXRoIHRoZSByZXNvbHZlZCBzdHlsZSBibG9jay5cbiAqIFJldHVybnMgdGhlIGJlc3Bva2UgdGV4dCB1bmNoYW5nZWQgd2hlbiB0aGUgc3R5bGUgYmxvY2sgaXMgZGlzYWJsZWQuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VJbnN0cnVjdGlvbnMoYWdlbnRJbnN0cnVjdGlvbnM6IHN0cmluZywgc3R5bGU6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICBpZiAoIXN0eWxlKSByZXR1cm4gYWdlbnRJbnN0cnVjdGlvbnM7XG4gIHJldHVybiBgJHthZ2VudEluc3RydWN0aW9ucy50cmltRW5kKCl9XFxuXFxuJHtzdHlsZX1gO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlZCBkZXNjcmlwdGlvbiBmb3IgYW4gYWdlbnQgd2hvc2UgZGVmaW5pdGlvbiBvbWl0cyBvbmUuIEtlcHRcbiAqIGdlbmVyaWMgKHRoZSBhZ2VudCdzIG93biBuYW1lIGlzIHRoZSBvbmx5IHJlbGlhYmxlIHNpZ25hbCBhdCBidWlsZFxuICogdGltZSkgc28gaXQgcmVhZHMgc2Vuc2libHkgYXMgdGhlIGBhc2tfPGlkPmAgTUNQIHRvb2wncyBkZXNjcmlwdGlvblxuICogYW5kIGluIGFnZW50IG1ldGFkYXRhLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0QWdlbnREZXNjcmlwdGlvbihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYENvbnZlcnNhdGlvbmFsIEFJIGFnZW50IFwiJHtuYW1lfVwiLmA7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBldmVyeSBlbnRyeSBpbiBgY29uZmlnLmFnZW50c2AgaW50byBhIE1hc3RyYSBgQWdlbnRgXG4gKiBpbnN0YW5jZS4gV2hlbiBgY29uZmlnLmFnZW50c2AgaXMgb21pdHRlZCB0aGUgcGx1Z2luIHJlZ2lzdGVycyBhXG4gKiBzaW5nbGUgYnVpbHQtaW4gYGRlZmF1bHRgIGFuYWx5c3Qgc28gdGhlIGJhcmUgYG1hc3RyYSgpYCBjYWxsIHN0aWxsXG4gKiB5aWVsZHMgYSB3b3JraW5nIGFnZW50LlxuICpcbiAqIFBlci1hZ2VudCB0b29sIGNhbGxiYWNrcyBhcmUgaW52b2tlZCBvbmNlIHdpdGggYSB0eXBlZFxuICoge0BsaW5rIE1hc3RyYVBsdWdpbnN9IGluZGV4IGJ1aWx0IGZyb20gcmVnaXN0ZXJlZCBzaWJsaW5nIHBsdWdpbnNcbiAqIChjdXJyZW50bHkgYGdlbmllYDsgZXh0ZW5kIGBNYXN0cmFQbHVnaW5zYCB0byBzdXJmYWNlIG1vcmUpLlxuICpcbiAqIEB0aHJvd3Mgd2hlbiBgY29uZmlnLmRlZmF1bHRBZ2VudGAgaXMgc2V0IHRvIGFuIGlkIHRoYXQgaXNuJ3QgaW4gdGhlXG4gKiAgIHJlc29sdmVkIHJlZ2lzdHJ5OyB0aGlzIGlzIGEgd2lyaW5nIGJ1Zywgbm90IGEgcnVudGltZSBjb25kaXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZEFnZW50cyhvcHRzOiB7XG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnO1xuICBjb250ZXh0OiBwbHVnaW4uUGx1Z2luQ29udGV4dExpa2UgfCB1bmRlZmluZWQ7XG4gIG1lbW9yeUJ1aWxkZXI/OiBNZW1vcnlCdWlsZGVyO1xuICBsb2c6IGxvZy5Mb2dnZXI7XG4gIC8qKlxuICAgKiBMb2NhbCBza2lsbCBzY2FuIHBhdGhzIChyZW1vdGUgc2tpbGxzIHByb3Zpc2lvbmVkIHRvIGEgdGVtcCBkaXIgYXRcbiAgICogc3RhcnR1cCkgZm9sZGVkIGludG8gZXZlcnkgYWdlbnQgdGhhdCB1c2VzIHRoZSBhdXRvLWNyZWF0ZWQgZGVmYXVsdFxuICAgKiB3b3Jrc3BhY2UuXG4gICAqL1xuICBleHRyYVNraWxsUGF0aHM/OiBzdHJpbmdbXTtcbn0pOiBQcm9taXNlPEJ1aWx0QWdlbnRzPiB7XG4gIGNvbnN0IHsgY29uZmlnLCBjb250ZXh0LCBtZW1vcnlCdWlsZGVyLCBsb2csIGV4dHJhU2tpbGxQYXRocyB9ID0gb3B0cztcbiAgY29uc3QgZGVmaW5pdGlvbnMgPSByZXNvbHZlRGVmaW5pdGlvbnMoY29uZmlnKTtcbiAgY29uc3QgaWRzID0gT2JqZWN0LmtleXMoZGVmaW5pdGlvbnMpO1xuICBjb25zdCBkZWZhdWx0QWdlbnRJZCA9IGNvbmZpZy5kZWZhdWx0QWdlbnQgPz8gaWRzWzBdID8/IEZBTExCQUNLX0FHRU5UX0lEO1xuXG4gIGNvbnN0IHBsdWdpbnMgPSBidWlsZFBsdWdpbnNNYXAoY29uZmlnLCBjb250ZXh0KTtcbiAgLy8gU3lzdGVtLWRlZmF1bHQgYW1iaWVudCB0b29scyBldmVyeSBhZ2VudCBnZXRzIG91dCBvZiB0aGUgYm94OlxuICAvLyBgcmVuZGVyX2RhdGFgIGZvciBpbmxpbmUgdmlzdWFsaXphdGlvbnMgYW5kIGBzdW1tYXJpemVgIGZvclxuICAvLyBvZmZsb2FkaW5nIHRleHQgY29uZGVuc2luZyB0byB0aGUgZmFzdCAvIHNtYWxsIGNoYXQgdGllci4gVGhlXG4gIC8vIHVzZXIgY2FuIHNoYWRvdyBlaXRoZXIgYnkgaW5jbHVkaW5nIGEgc2FtZS1uYW1lZCB0b29sIGluIHRoZWlyIG93blxuICAvLyBgY29uZmlnLnRvb2xzYCBvciBwZXItYWdlbnQgYHRvb2xzYC4gT3JkZXIgaW4ge0BsaW5rIHJlc29sdmVUb29sc31cbiAgLy8gaXMgYHN5c3RlbSAtPiB1c2VyLWFtYmllbnQgLT4gcGVyLWFnZW50YCwgbGFzdCB3cml0ZSB3aW5zLlxuICBjb25zdCBzeXN0ZW1Ub29sczogTWFzdHJhVG9vbHMgPSB7XG4gICAgcmVuZGVyX2RhdGE6IGJ1aWxkUmVuZGVyRGF0YVRvb2woY29uZmlnKSxcbiAgICBzdW1tYXJpemU6IGJ1aWxkU3VtbWFyaXplVG9vbChjb25maWcpLFxuICB9O1xuICBjb25zdCBhbWJpZW50VG9vbHMgPSB7XG4gICAgLi4uc3lzdGVtVG9vbHMsXG4gICAgLi4uKGNvbmZpZy50b29scyA/PyB7fSksXG4gIH07XG4gIGNvbnN0IHN0eWxlID0gcmVzb2x2ZVN0eWxlSW5zdHJ1Y3Rpb25zKGNvbmZpZyk7XG4gIC8vIERlZmF1bHQtb24gcHJvdGVjdGlvbiBhZ2FpbnN0IHRoZSBtb2RlbCBjb3B5aW5nIHR1cm4tc2NvcGVkXG4gIC8vIGNoYXJ0SWRzIGZyb20gcHJpb3IgYXNzaXN0YW50IHRvb2wgcmVzdWx0cyBpbnRvIHRoZSBuZXdcbiAgLy8gdHVybidzIGBbY2hhcnQ6PGlkPl1gIG1hcmtlcnMuIE9wdCBvdXQgcGVyLXBsdWdpbiB2aWFcbiAgLy8gYGNvbmZpZy5zdHJpcFN0YWxlQ2hhcnRzOiBmYWxzZWAuXG4gIGNvbnN0IG91dHB1dFByb2Nlc3NvcnMgPSBbbmV3IFJlc3VsdFByb2Nlc3NvcigpXTtcbiAgY29uc3QgaW5wdXRQcm9jZXNzb3JzID0gW1xuICAgIC4uLihjb25maWcuc3RyaXBTdGFsZUNoYXJ0cyA9PT0gZmFsc2UgPyBbXSA6IFtzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yXSksXG4gIF07XG4gIGNvbnN0IGFnZW50czogUmVjb3JkPHN0cmluZywgQWdlbnQ+ID0ge307XG4gIGNvbnN0IGRlZmF1bHRNb2RlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3QgYXBwcm92YWxHYXRlZEJ5QWdlbnQ6IEFycmF5PHsgYWdlbnRJZDogc3RyaW5nOyB0b29sSWRzOiBzdHJpbmdbXSB9PiA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2lkLCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKGRlZmluaXRpb25zKSkge1xuICAgIGNvbnN0IHRvb2xzID0gYXdhaXQgcmVzb2x2ZVRvb2xzKGRlZi50b29scywgcGx1Z2lucywgYW1iaWVudFRvb2xzKTtcbiAgICBsZXQgd29ya3NwYWNlID0gcmVzb2x2ZUFnZW50V29ya3NwYWNlKGRlZi53b3Jrc3BhY2UpO1xuICAgIGlmIChleHRyYVNraWxsUGF0aHM/Lmxlbmd0aCAmJiBpc0RlZmF1bHRXb3Jrc3BhY2Uod29ya3NwYWNlKSkge1xuICAgICAgd29ya3NwYWNlID0gY3JlYXRlV29ya3NwYWNlKHsgZXh0cmFTa2lsbFBhdGhzIH0pO1xuICAgICAgbWFya0RlZmF1bHRXb3Jrc3BhY2Uod29ya3NwYWNlKTtcbiAgICB9XG4gICAgY29uc3QgZ2F0ZWQgPSBhcHByb3ZhbEdhdGVkVG9vbElkcyh0b29scyk7XG4gICAgaWYgKGdhdGVkLmxlbmd0aCA+IDApIGFwcHJvdmFsR2F0ZWRCeUFnZW50LnB1c2goeyBhZ2VudElkOiBpZCwgdG9vbElkczogZ2F0ZWQgfSk7XG4gICAgY29uc3QgbWVtb3J5ID0gbWVtb3J5QnVpbGRlcj8uZm9yQWdlbnQoaWQsIGRlZik7XG4gICAgYWdlbnRzW2lkXSA9IG5ldyBBZ2VudCh7XG4gICAgICBpZCxcbiAgICAgIG5hbWU6IGRlZi5uYW1lID8/IGlkLFxuICAgICAgLy8gQWx3YXlzIGNhcnJ5IGEgbm9uLWVtcHR5IGRlc2NyaXB0aW9uOiBpdCdzIHN1cmZhY2VkIHRvIE1DUFxuICAgICAgLy8gY2xpZW50cyAod2hpY2ggcmVqZWN0IGEgZGVzY3JpcHRpb24tbGVzcyBhZ2VudCkgYW5kIGluIGFnZW50XG4gICAgICAvLyBtZXRhZGF0YS4gRmFsbCBiYWNrIHRvIGEgZ2VuZXJhdGVkIG9uZSB3aGVuIHRoZSBkZWZpbml0aW9uXG4gICAgICAvLyBvbWl0cyBpdC5cbiAgICAgIGRlc2NyaXB0aW9uOiBkZWYuZGVzY3JpcHRpb24/LnRyaW0oKSB8fCBkZWZhdWx0QWdlbnREZXNjcmlwdGlvbihkZWYubmFtZSA/PyBpZCksXG4gICAgICBpbnN0cnVjdGlvbnM6IGNvbXBvc2VJbnN0cnVjdGlvbnMoZGVmLmluc3RydWN0aW9ucywgc3R5bGUpLFxuICAgICAgbW9kZWw6IHJlc29sdmVNb2RlbChjb25maWcsIGRlZi5tb2RlbCksXG4gICAgICBkZWZhdWx0T3B0aW9uczoge1xuICAgICAgICBtYXhTdGVwczogY29uZmlnLmFnZW50TWF4U3RlcHMgPz8gREVGQVVMVF9BR0VOVF9NQVhfU1RFUFMsXG4gICAgICB9LFxuICAgICAgdG9vbHMsXG4gICAgICAuLi4obWVtb3J5ID8geyBtZW1vcnkgfSA6IHt9KSxcbiAgICAgIC4uLih3b3Jrc3BhY2UgPyB7IHdvcmtzcGFjZSB9IDoge30pLFxuICAgICAgaW5wdXRQcm9jZXNzb3JzLFxuICAgICAgb3V0cHV0UHJvY2Vzc29ycyxcbiAgICB9KTtcbiAgICAvLyBTdXJmYWNlIHRoZSBlZmZlY3RpdmUgZGVmYXVsdCBtb2RlbCBwZXIgYWdlbnQgc28gb3BlcmF0b3JzIGNhblxuICAgIC8vIHNlZSBhdCBhIGdsYW5jZSB3aGljaCBlbmRwb2ludCBlYWNoIGFnZW50IHBvaW50cyBhdCB3aXRob3V0XG4gICAgLy8gaGF2aW5nIHRvIGZpcmUgYSByZXF1ZXN0IGFuZCBpbnNwZWN0IGEgdHJhY2UuIFRoZSB2YWx1ZSBpcyB0aGVcbiAgICAvLyAqc3RhdGljKiBkZWZhdWx0OyBwZXItcmVxdWVzdCBvdmVycmlkZXMgKGhlYWRlciAvIHF1ZXJ5IC9cbiAgICAvLyBib2R5KSBhbmQgdGhlIHdvcmtzcGFjZS1jYXRhbG9ndWUgZnV6enkgbWF0Y2ggc3RpbGwgYXBwbHkgYXRcbiAgICAvLyBjYWxsIHRpbWUuXG4gICAgY29uc3QgZGVmYXVsdE1vZGVsID0gZGVzY3JpYmVBZ2VudERlZmF1bHRNb2RlbChjb25maWcsIGRlZik7XG4gICAgZGVmYXVsdE1vZGVsc1tpZF0gPSBkZWZhdWx0TW9kZWw7XG4gICAgbG9nLmluZm8oXCJhZ2VudCByZWdpc3RlcmVkXCIsIHtcbiAgICAgIGlkLFxuICAgICAgbmFtZTogZGVmLm5hbWUgPz8gaWQsXG4gICAgICBkZWZhdWx0TW9kZWwsXG4gICAgICB0b29sczogT2JqZWN0LmtleXModG9vbHMpLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCFhZ2VudHNbZGVmYXVsdEFnZW50SWRdKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBgbWFzdHJhIGRlZmF1bHRBZ2VudCBcIiR7ZGVmYXVsdEFnZW50SWR9XCJgLFxuICAgICAgYFJlZ2lzdGVyZWQgYWdlbnRzOiAke2lkcy5qb2luKFwiLCBcIikgfHwgXCJub25lXCJ9LmAsXG4gICAgKTtcbiAgfVxuXG4gIGFzc2VydEFwcHJvdmFsR2F0ZWRUb29sc0hhdmVTdG9yYWdlKGFwcHJvdmFsR2F0ZWRCeUFnZW50LCBtZW1vcnlCdWlsZGVyKTtcblxuICBsb2cuaW5mbyhcImFnZW50cyByZWFkeVwiLCB7IGlkcywgZGVmYXVsdEFnZW50SWQgfSk7XG4gIHJldHVybiB7IGFnZW50cywgZGVmYXVsdEFnZW50SWQsIGRlZmF1bHRNb2RlbHMsIGFtYmllbnRUb29scyB9O1xufVxuXG4vKipcbiAqIFRvb2wgaWRzIG9uIGB0b29sc2AgdGhhdCBhcmUgYXBwcm92YWwtZ2F0ZWQgKGByZXF1aXJlQXBwcm92YWw6IHRydWVgKS5cbiAqIEtleXMgYXJlIHVzZWQgYXMgYSBmYWxsYmFjayB3aGVuIGEgdG9vbCBvbWl0cyBhbiBleHBsaWNpdCBgaWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwcm92YWxHYXRlZFRvb2xJZHModG9vbHM6IE1hc3RyYVRvb2xzKTogc3RyaW5nW10ge1xuICBpZiAoIXRvb2xzIHx8IHR5cGVvZiB0b29scyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIFtdO1xuICByZXR1cm4gW1xuICAgIC4uLm9iamVjdFxuICAgICAgLnNlcXVlbmNlKE9iamVjdC5lbnRyaWVzKHRvb2xzKSlcbiAgICAgIC5maWx0ZXIoKFssIHRvb2xdKSA9PiBpc0FwcHJvdmFsR2F0ZWRUb29sKHRvb2wpKVxuICAgICAgLm1hcCgoW2tleSwgdG9vbF0pID0+IHJlc29sdmVUb29sSWQodG9vbCwga2V5KSksXG4gIF07XG59XG5cbi8qKiBUcnVlIHdoZW4gYSBNYXN0cmEgLyBBSSBTREsgdG9vbCBwYXVzZXMgZm9yIGh1bWFuIGFwcHJvdmFsIGJlZm9yZSBleGVjdXRlLiAqL1xuZnVuY3Rpb24gaXNBcHByb3ZhbEdhdGVkVG9vbCh0b29sOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghdG9vbCB8fCB0eXBlb2YgdG9vbCAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gKHRvb2wgYXMgeyByZXF1aXJlQXBwcm92YWw/OiBib29sZWFuIH0pLnJlcXVpcmVBcHByb3ZhbCA9PT0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRvb2xJZCh0b29sOiB1bmtub3duLCBmYWxsYmFja0tleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHRvb2wgJiYgdHlwZW9mIHRvb2wgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mICh0b29sIGFzIHsgaWQ/OiBzdHJpbmcgfSkuaWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gKHRvb2wgYXMgeyBpZDogc3RyaW5nIH0pLmlkO1xuICB9XG4gIHJldHVybiBmYWxsYmFja0tleTtcbn1cblxuLyoqXG4gKiBBcHByb3ZhbC1nYXRlZCB0b29scyBzdXNwZW5kIHRoZSBhZ2VudCBsb29wIHVudGlsIGEgaHVtYW4gYXBwcm92ZXMuXG4gKiBNYXN0cmEgcGVyc2lzdHMgdGhvc2Ugc3VzcGVuZGVkIHJ1bnMgaW4gTWFzdHJhLWluc3RhbmNlLWxldmVsIHN0b3JhZ2VcbiAqIChgbWVtb3J5QnVpbGRlci5pbnN0YW5jZVN0b3JhZ2UoKWApLCBub3QgcGVyLWFnZW50IG1lbW9yeSAtIHNvIGJvb3RcbiAqIG11c3QgZmFpbCBmYXN0IHdoZW4gc3VjaCBhIHRvb2wgaXMgcmVnaXN0ZXJlZCB3aXRob3V0IHN0b3JhZ2UuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydEFwcHJvdmFsR2F0ZWRUb29sc0hhdmVTdG9yYWdlKFxuICBnYXRlZDogQXJyYXk8eyBhZ2VudElkOiBzdHJpbmc7IHRvb2xJZHM6IHN0cmluZ1tdIH0+LFxuICBtZW1vcnlCdWlsZGVyOiBNZW1vcnlCdWlsZGVyIHwgdW5kZWZpbmVkLFxuKTogdm9pZCB7XG4gIGlmIChnYXRlZC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgaWYgKG1lbW9yeUJ1aWxkZXI/Lmluc3RhbmNlU3RvcmFnZSgpKSByZXR1cm47XG5cbiAgY29uc3QgZGV0YWlsID0gZ2F0ZWRcbiAgICAubWFwKCh7IGFnZW50SWQsIHRvb2xJZHMgfSkgPT4gYCR7YWdlbnRJZH06ICR7dG9vbElkcy5qb2luKFwiLCBcIil9YClcbiAgICAuam9pbihcIjsgXCIpO1xuICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgIFwibWFzdHJhOiBhcHByb3ZhbC1nYXRlZCB0b29scyByZXF1aXJlIHBsdWdpbiBzdG9yYWdlIChQb3N0Z3Jlc1N0b3JlKSB0byBwZXJzaXN0IHN1c3BlbmRlZCBydW5zLiBcIiArXG4gICAgICBgQWZmZWN0ZWQgYWdlbnRzL3Rvb2xzOiAke2RldGFpbH0uIGAgK1xuICAgICAgXCJSZWdpc3RlciBsYWtlYmFzZSgpIGJlZm9yZSBtYXN0cmEoKSBzbyBzdG9yYWdlIGF1dG8tZW5hYmxlcywgb3IgcGFzcyBzdG9yYWdlOiB0cnVlIGV4cGxpY2l0bHkuXCIsXG4gICk7XG59XG5cbi8qKlxuICogQmVzdC1lZmZvcnQgZGVzY3JpcHRpb24gb2YgdGhlICpzdGF0aWMqIGRlZmF1bHQgbW9kZWwgYW4gYWdlbnQgd2lsbFxuICogcmVzb2x2ZSB0byBhdCBjYWxsIHRpbWUuIFdhbGtzIHRoZSBzYW1lIHByZWNlZGVuY2UgbGFkZGVyIGFzXG4gKiB7QGxpbmsgcmVzb2x2ZU1vZGVsfSAvIHtAbGluayBidWlsZE1vZGVsfTpcbiAqXG4gKiAgIDEuIFBlci1hZ2VudCBgZGVmLm1vZGVsYCAoc3RyaW5nIHN1Z2FyIC0+IHRoZSBsaXRlcmFsIGlkO1xuICogICAgICBmdW5jdGlvbiAvIGBEeW5hbWljQXJndW1lbnRgIC0+IGBcIjxkeW5hbWljPlwiYCBiZWNhdXNlIHRoZVxuICogICAgICByZXNvbHZlciBkZWNpZGVzIGF0IGNhbGwgdGltZSkuXG4gKiAgIDIuIFBsdWdpbi1sZXZlbCBgY29uZmlnLmRlZmF1bHRNb2RlbGAgKHNhbWUgcnVsZXMpLlxuICogICAzLiBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgIGVudiB2YXIuXG4gKiAgIDQuIEZpcnN0IGVudHJ5IG9mIGBjb25maWcuZGVmYXVsdE1vZGVsRmFsbGJhY2tzID8/IGZhbGxiYWNrLkZBTExCQUNLX01PREVMX0lEU2AuXG4gKlxuICogVXNlZCBmb3IgdGhlIHN0YXJ0dXAgYGFnZW50IHJlZ2lzdGVyZWRgIGxvZyBzbyBvcGVyYXRvcnMgY2FuIHNlZVxuICogd2hpY2ggZW5kcG9pbnQgZWFjaCBhZ2VudCBwb2ludHMgYXQgYnkgZGVmYXVsdC4gUGVyLXJlcXVlc3RcbiAqIG92ZXJyaWRlcyAoYFgtTWFzdHJhLU1vZGVsYCBldGMuKSBhbmQgdGhlIHdvcmtzcGFjZS1jYXRhbG9ndWVcbiAqIGZ1enp5IG1hdGNoIGFyZSBzdGlsbCBhcHBsaWVkIGF0IHJ1bnRpbWUuXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlQWdlbnREZWZhdWx0TW9kZWwoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsIGRlZjogTWFzdHJhQWdlbnREZWZpbml0aW9uKTogc3RyaW5nIHtcbiAgY29uc3QgZWZmZWN0aXZlID0gZGVmLm1vZGVsID8/IGNvbmZpZy5kZWZhdWx0TW9kZWw7XG4gIGlmICh0eXBlb2YgZWZmZWN0aXZlID09PSBcInN0cmluZ1wiKSByZXR1cm4gZWZmZWN0aXZlO1xuICBpZiAoZWZmZWN0aXZlICE9PSB1bmRlZmluZWQpIHJldHVybiBcIjxkeW5hbWljPlwiO1xuICByZXR1cm4gKFxuICAgIHByb2Nlc3MuZW52LkRBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FID8/XG4gICAgY29uZmlnLmRlZmF1bHRNb2RlbEZhbGxiYWNrcz8uWzBdID8/XG4gICAgZmFsbGJhY2suRkFMTEJBQ0tfTU9ERUxfSURTWzBdIVxuICApO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBgY29uZmlnLmFnZW50c2AgaW50byBhIGBSZWNvcmQ8aWQsIGRlZmluaXRpb24+YC4gQWNjZXB0c1xuICogYW55IG9mIHRoZSB0aHJlZSBzaGFwZXMgZG9jdW1lbnRlZCBvblxuICoge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5hZ2VudHN9OlxuICpcbiAqIC0gUmVjb3JkIC0gcmV0dXJuZWQgYXMtaXMgd2hlbiBub24tZW1wdHkuXG4gKiAtIFNpbmdsZSBkZWZpbml0aW9uIChkZXRlY3RlZCB2aWEgdGhlIHJlcXVpcmVkIGBpbnN0cnVjdGlvbnNgXG4gKiAgIGZpZWxkKSAtIGtleWVkIGJ5IGBzbHVnaWZ5KGRlZi5uYW1lKWAgb3IgYEZBTExCQUNLX0FHRU5UX0lEYC5cbiAqIC0gQXJyYXkgLSBrZXllZCBieSBgc2x1Z2lmeShkZWYubmFtZSlgIG9yIGBhZ2VudF8ke2l9YDsgZHVwbGljYXRlXG4gKiAgIHNsdWdzIGZhaWwgbG91ZGx5IHNvIHVzZXJzIGtub3cgdG8gc2V0IGV4cGxpY2l0IG5hbWVzLlxuICpcbiAqIE9taXR0ZWQgb3IgZW1wdHkgaW5wdXRzIGZhbGwgYmFjayB0byBhIHNpbmdsZSBidWlsdC1pbiBhbmFseXN0IHNvXG4gKiB0aGUgYmFyZSBgbWFzdHJhKClgIGNhbGwgc3RpbGwgbW91bnRzIGEgd29ya2luZyBjaGF0IHJvdXRlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlRGVmaW5pdGlvbnMoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBSZWNvcmQ8c3RyaW5nLCBNYXN0cmFBZ2VudERlZmluaXRpb24+IHtcbiAgY29uc3QgaW5wdXQgPSBjb25maWcuYWdlbnRzO1xuICBpZiAoIWlucHV0KSByZXR1cm4gZmFsbGJhY2tEZWZpbml0aW9ucygpO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgIGlmIChpbnB1dC5sZW5ndGggPT09IDApIHJldHVybiBmYWxsYmFja0RlZmluaXRpb25zKCk7XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBNYXN0cmFBZ2VudERlZmluaXRpb24+ID0ge307XG4gICAgaW5wdXQuZm9yRWFjaCgoZGVmLCBpKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBkZXJpdmVBZ2VudEtleShkZWYsIGkpO1xuICAgICAgaWYgKG91dFtrZXldKSB7XG4gICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgICAgICAgYG1hc3RyYTogZHVwbGljYXRlIGFnZW50IGlkIFwiJHtrZXl9XCIgZGVyaXZlZCBmcm9tIG5hbWUgXCIke2RlZi5uYW1lID8/IFwiXCJ9XCI7IGAgK1xuICAgICAgICAgICAgYHNldCB1bmlxdWUgXFxgbmFtZVxcYHMgb24gZWFjaCBkZWZpbml0aW9uYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG91dFtrZXldID0gZGVmO1xuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvLyBTaW5nbGUtZGVmaW5pdGlvbiBzaG9ydGhhbmQ6IGFuIGFnZW50IGFsd2F5cyBoYXMgYGluc3RydWN0aW9uczogc3RyaW5nYCxcbiAgLy8gYSByZWNvcmQtb2YtYWdlbnRzIG5ldmVyIGhhcyB0aGF0IGZpZWxkIGRpcmVjdGx5LlxuICBpZiAodHlwZW9mIChpbnB1dCBhcyBNYXN0cmFBZ2VudERlZmluaXRpb24pLmluc3RydWN0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IGRlZiA9IGlucHV0IGFzIE1hc3RyYUFnZW50RGVmaW5pdGlvbjtcbiAgICBjb25zdCBrZXkgPSBkZXJpdmVBZ2VudEtleShkZWYpO1xuICAgIHJldHVybiB7IFtrZXldOiBkZWYgfTtcbiAgfVxuXG4gIGNvbnN0IHJlY29yZCA9IGlucHV0IGFzIFJlY29yZDxzdHJpbmcsIE1hc3RyYUFnZW50RGVmaW5pdGlvbj47XG4gIGlmIChPYmplY3Qua2V5cyhyZWNvcmQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTtcbiAgcmV0dXJuIHJlY29yZDtcbn1cblxuLyoqIERlcml2ZSBhIHJlZ2lzdHJ5IGlkIGZyb20gYSBkZWZpbml0aW9uJ3MgYG5hbWVgLCB3aXRoIGEgZmFsbGJhY2suICovXG5mdW5jdGlvbiBkZXJpdmVBZ2VudEtleShkZWY6IE1hc3RyYUFnZW50RGVmaW5pdGlvbiwgaW5kZXg/OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoZGVmLm5hbWUpIHtcbiAgICBjb25zdCBzbHVnID0gc3RyaW5nLnRvSWRlbnRpZmllcihkZWYubmFtZSk7XG4gICAgaWYgKHNsdWcpIHJldHVybiBzbHVnO1xuICB9XG4gIHJldHVybiBpbmRleCA9PT0gdW5kZWZpbmVkID8gRkFMTEJBQ0tfQUdFTlRfSUQgOiBgYWdlbnRfJHtpbmRleH1gO1xufVxuXG4vKiogQnVpbHQtaW4gZmFsbGJhY2sgcmVnaXN0cnkgdXNlZCB3aGVuIGBhZ2VudHNgIGlzIG9taXR0ZWQgLyBlbXB0eS4gKi9cbmZ1bmN0aW9uIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTogUmVjb3JkPHN0cmluZywgTWFzdHJhQWdlbnREZWZpbml0aW9uPiB7XG4gIHJldHVybiB7XG4gICAgW0ZBTExCQUNLX0FHRU5UX0lEXToge1xuICAgICAgbmFtZTogXCJEZWZhdWx0IEFnZW50XCIsXG4gICAgICBpbnN0cnVjdGlvbnM6IEZBTExCQUNLX0FHRU5UX0lOU1RSVUNUSU9OUyxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIGVmZmVjdGl2ZSBtb2RlbCBzcGVjIGZvciBhbiBhZ2VudC4gRmFsbGJhY2sgbGFkZGVyLCBpblxuICogb3JkZXI6XG4gKlxuICogICAxLiBQZXItYWdlbnQgYGRlZi5tb2RlbGAgKHN0cmluZyBzdWdhciBvciBgRHluYW1pY0FyZ3VtZW50YCkuXG4gKiAgIDIuIFBsdWdpbi1sZXZlbCBgY29uZmlnLmRlZmF1bHRNb2RlbGAgKHN0cmluZyBzdWdhciBvclxuICogICAgICBgRHluYW1pY0FyZ3VtZW50YCkgLSBtaXJyb3JzIEFwcEtpdCdzIGBhZ2VudHMoeyBkZWZhdWx0TW9kZWwgfSlgLlxuICogICAzLiBUaGUgYXV0by1yZXNvbHZlciB0aGF0IG1pbnRzIHVzZXItc2NvcGVkIHRva2VucyBhZ2FpbnN0XG4gKiAgICAgIGAvc2VydmluZy1lbmRwb2ludHNgIHZpYSB7QGxpbmsgYnVpbGRNb2RlbH0uXG4gKlxuICogU3RyaW5nIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyBgbW9kZWxJZGAgc3VnYXIgYW5kIHRocmVhZGVkIHRocm91Z2hcbiAqIGBidWlsZE1vZGVsYCdzIG92ZXJyaWRlIGhvb2sgc28gdGhlIHJ1bnRpbWUgZnV6enkgbWF0Y2hlciBhbmQgdGhlXG4gKiBwZXItcmVxdWVzdCBgWC1NYXN0cmEtTW9kZWxgIG92ZXJyaWRlIGxheWVyIG9uIHRvcCBvZiB0aGUgc3RhdGljXG4gKiBjaG9pY2UuIE5vbi1zdHJpbmcgYER5bmFtaWNBcmd1bWVudGBzIGFyZSBwYXNzZWQgdGhyb3VnaCB2ZXJiYXRpbTtcbiAqIGNhbGxlcnMgdGhhdCBuZWVkIGZ1bGwgY29udHJvbCBvdmVyIGBwcm92aWRlcklkYCAvIGBoZWFkZXJzYCAvXG4gKiBgbW9kZWxJZGAgYnlwYXNzIHRoZSByZXNvbHZlciBwaXBlbGluZSBlbnRpcmVseS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU1vZGVsKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgb3ZlcnJpZGU6IE1hc3RyYUFnZW50RGVmaW5pdGlvbltcIm1vZGVsXCJdLFxuKTogQWdlbnRDb25maWdbXCJtb2RlbFwiXSB7XG4gIGNvbnN0IGVmZmVjdGl2ZSA9IG92ZXJyaWRlID8/IGNvbmZpZy5kZWZhdWx0TW9kZWw7XG4gIGlmIChlZmZlY3RpdmUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PiBidWlsZE1vZGVsKGNvbmZpZywgcmVxdWVzdENvbnRleHQpO1xuICB9XG4gIGlmICh0eXBlb2YgZWZmZWN0aXZlID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgbW9kZWxJZCA9IGVmZmVjdGl2ZTtcbiAgICByZXR1cm4gKHsgcmVxdWVzdENvbnRleHQgfSkgPT4gYnVpbGRNb2RlbChjb25maWcsIHJlcXVlc3RDb250ZXh0LCB7IG1vZGVsSWQgfSk7XG4gIH1cbiAgcmV0dXJuIGVmZmVjdGl2ZTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgZGVmaW5pdGlvbidzIGB0b29sc2AgZmllbGQgdG8gYSBmbGF0IGBNYXN0cmFUb29sc2AgcmVjb3JkLFxuICogbWVyZ2luZyBpbiBwbHVnaW4tbGV2ZWwgYW1iaWVudCB0b29scyAocGVyLWFnZW50IHRvb2xzIHdpbiBvbiBrZXlcbiAqIGNvbGxpc2lvbikuIENhbGxiYWNrIGVycm9ycyBwcm9wYWdhdGUgdmVyYmF0aW0gc28gdGhlIG9yaWdpbmFsIHN0YWNrXG4gKiBzdXJ2aXZlcyAtIHRoZSBjYWxsZXIgYWxyZWFkeSBrbm93cyB3aGljaCBhZ2VudCB3YXMgcmVnaXN0ZXJpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVUb29scyhcbiAgZGVmVG9vbHM6IE1hc3RyYUFnZW50RGVmaW5pdGlvbltcInRvb2xzXCJdLFxuICBwbHVnaW5zOiBNYXN0cmFQbHVnaW5zLFxuICBhbWJpZW50VG9vbHM6IE1hc3RyYVRvb2xzLFxuKTogUHJvbWlzZTxNYXN0cmFUb29scz4ge1xuICBpZiAoIWRlZlRvb2xzKSByZXR1cm4geyAuLi5hbWJpZW50VG9vbHMgfTtcbiAgY29uc3QgcmVzb2x2ZWQgPSB0eXBlb2YgZGVmVG9vbHMgPT09IFwiZnVuY3Rpb25cIiA/IGF3YWl0IGRlZlRvb2xzKHBsdWdpbnMpIDogZGVmVG9vbHM7XG4gIHJldHVybiB7IC4uLmFtYmllbnRUb29scywgLi4ucmVzb2x2ZWQgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFnZW50V29ya3NwYWNlKFxuICB3b3Jrc3BhY2U6IE1hc3RyYUFnZW50RGVmaW5pdGlvbltcIndvcmtzcGFjZVwiXSxcbik6IFdvcmtzcGFjZSB8IHVuZGVmaW5lZCB7XG4gIGlmICghd29ya3NwYWNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIHdvcmtzcGFjZSA9PT0gXCJmdW5jdGlvblwiID8gd29ya3NwYWNlKCkgOiB3b3Jrc3BhY2U7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHtAbGluayBNYXN0cmFQbHVnaW5zfSBydW50aW1lIHByb3h5IGhhbmRlZCB0b1xuICogYHRvb2xzKHBsdWdpbnMpYCBjYWxsYmFja3MuXG4gKlxuICogSW1wbGVtZW50ZWQgYXMgYSBgUHJveHlgIG92ZXIgdGhlIEFwcEtpdCBwbHVnaW4gY29udGV4dCBzb1xuICogYHBsdWdpbnMuPG5hbWU+YCByZXNvbHZlcyBhdCBmaXJzdCBhY2Nlc3MuIEFueSBzaWJsaW5nIHBsdWdpbiB0aGF0XG4gKiBpbXBsZW1lbnRzIEFwcEtpdCdzIHN0YW5kYXJkIGBUb29sUHJvdmlkZXJgIGludGVyZmFjZVxuICogKGB0b29sa2l0KG9wdHM/KWAgKyBgZXhlY3V0ZUFnZW50VG9vbChuYW1lLCBhcmdzLCBzaWduYWw/KWApIGlzXG4gKiBhdXRvLWFkYXB0ZWQgaW50byBNYXN0cmEgdG9vbHMuIFVua25vd24gbmFtZXMgcmV0dXJuIGB1bmRlZmluZWRgLFxuICogbWF0Y2hpbmcgQXBwS2l0J3MgYFBsdWdpbnNgIHNlbWFudGljcyBzbyBgcGx1Z2lucy5mb28/LnRvb2xraXQoKWBcbiAqIHJlbWFpbnMgc2FmZSBpbiBlbnZpcm9ubWVudHMgd2hlcmUgYGZvb2AgaXNuJ3QgcmVnaXN0ZXJlZC5cbiAqXG4gKiBgZ2VuaWVgIGlzIHNwZWNpYWwtY2FzZWQgdG8gc3dhcCB0aGUgZ2VuZXJpYyBBcHBLaXQgdG9vbGtpdCAod2hpY2hcbiAqIHJ1bnMgYGV4ZWN1dGVBZ2VudFRvb2xgIGFuZCBvbmx5IGVtaXRzIGEgc2luZ2xlIGZpbmFsIGB0b29sLXJlc3VsdGBcbiAqIGNodW5rIHBlciBjYWxsKSBmb3IgdGhlIHN0cmVhbWluZy1hd2FyZSB0b29scyBidWlsdCBieVxuICoge0BsaW5rIGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXJ9LiBUaGUgc3RyZWFtaW5nIHZhcmlhbnQgZm9yd2FyZHMgZWFjaFxuICogR2VuaWUgd2lyZSBldmVudCAoc3RhdHVzLCBTUUwsIHJvdyBjb3VudHMsIGVycm9ycykgb3V0IHRocm91Z2ggdGhlXG4gKiBNYXN0cmEgYGN0eC53cml0ZXJgLCBzbyB0aGUgVUkgZ2V0cyBgdG9vbC1vdXRwdXRgIGNodW5rcyBpbiByZWFsXG4gKiB0aW1lIGluc3RlYWQgb2Ygc3RhcmluZyBhdCBhIHNwaW5uZXIgZm9yIHRoZSBmdWxsIEdlbmllIHJvdW5kLXRyaXAuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUGx1Z2luc01hcChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIGNvbnRleHQ6IHBsdWdpbi5QbHVnaW5Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCxcbik6IE1hc3RyYVBsdWdpbnMge1xuICBjb25zdCBjYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIgfCBudWxsPigpO1xuICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIE1hc3RyYVBsdWdpbnMsIHtcbiAgICBnZXQoX3RhcmdldCwgcHJvcE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcE5hbWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2FjaGUuaGFzKHByb3BOYW1lKSkgcmV0dXJuIGNhY2hlLmdldChwcm9wTmFtZSkgPz8gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcHJvdmlkZXIgPSByZXNvbHZlUHJvdmlkZXIoY29uZmlnLCBjb250ZXh0LCBwcm9wTmFtZSk7XG4gICAgICBjYWNoZS5zZXQocHJvcE5hbWUsIHByb3ZpZGVyKTtcbiAgICAgIHJldHVybiBwcm92aWRlciA/PyB1bmRlZmluZWQ7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogUGljayB0aGUgcmlnaHQge0BsaW5rIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlcn0gZm9yIGEgc2libGluZ1xuICogcGx1Z2luIGxvb2t1cC4gUmV0dXJucyB0aGUgR2VuaWUgYWdlbnQtYmFja2VkIGFkYXB0ZXIgd2hlblxuICogdGhlIGNhbGxlciBhc2tzIGZvciBgZ2VuaWVgIEFORCBhdCBsZWFzdCBvbmUgc3BhY2UgaXMgcmVhY2hhYmxlXG4gKiB2aWEge0BsaW5rIHJlc29sdmVHZW5pZVNwYWNlc30gKHRoZSBleHBsaWNpdFxuICogYGNvbmZpZy5nZW5pZVNwYWNlc2AsIHRoZSByZWdpc3RlcmVkIEFwcEtpdCBgZ2VuaWUoKWAgcGx1Z2luJ3NcbiAqIGBzcGFjZXNgIGNvbmZpZywgb3IgdGhlIGBEQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEYCBlbnYgdmFyKS5cbiAqIEZhbGxzIGJhY2sgdG8gdGhlIGdlbmVyaWMgQXBwS2l0IGBUb29sUHJvdmlkZXJgIGFkYXB0ZXIgZm9yXG4gKiBldmVyeSBvdGhlciBwbHVnaW4gbmFtZS4gYGNvbmZpZ2AgaXMgdGhyZWFkZWQgdGhyb3VnaCBzbyB0aGVcbiAqIEdlbmllIGFnZW50IGluaGVyaXRzIHRoZSBzYW1lIG1vZGVsIHJlc29sdmVyIC8gZmFsbGJhY2tcbiAqIGxhZGRlciB0aGUgY2FsbGluZyBhZ2VudHMgdXNlLlxuICpcbiAqIFRoZSBHZW5pZSB0b29scyB0YWxrIHRvIEdlbmllIGRpcmVjdGx5IHRocm91Z2ggYEBkYngtdG9vbHMvZ2VuaWVgXG4gKiAoYGdlbmllRXZlbnRDaGF0YCkgYW5kIHRoZSB3b3Jrc3BhY2UgYHN0YXRlbWVudEV4ZWN1dGlvbi5nZXRTdGF0ZW1lbnRgXG4gKiBBUEk7IEFwcEtpdCdzIHN0b2NrIGBnZW5pZWAgcGx1Z2luIGNvbnRyaWJ1dGVzIG9ubHkgaXRzIHJlc291cmNlXG4gKiBtYW5pZmVzdCBhbmQgYHNwYWNlc2AgY29uZmlnLCBzbyBhbiBgYXBwLnlhbWxgIHJlc291cmNlIGJpbmRpbmcgYW5kIGFcbiAqIGBnZW5pZSh7IHNwYWNlcyB9KWAgcmVjb3JkIGhhdmUgdGhlIHNhbWUgbWVhbmluZyBoZXJlIGFzIHRoZXkgZG8gdGhlcmUuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVQcm92aWRlcihcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIGNvbnRleHQ6IHBsdWdpbi5QbHVnaW5Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCxcbiAgcHJvcE5hbWU6IHN0cmluZyxcbik6IE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciB8IG51bGwge1xuICBpZiAocHJvcE5hbWUgPT09IFwiZ2VuaWVcIikge1xuICAgIGNvbnN0IHNwYWNlcyA9IHJlc29sdmVHZW5pZVNwYWNlcyhjb25maWcsIGNvbnRleHQpO1xuICAgIGlmIChPYmplY3Qua2V5cyhzcGFjZXMpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXIoe1xuICAgICAgc3BhY2VzLFxuICAgICAgY29uZmlnLFxuICAgIH0pIGFzIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlcjtcbiAgfVxuICBjb25zdCBwbHVnaW4gPSBjb250ZXh0Py5nZXRQbHVnaW5zKCkuZ2V0KHByb3BOYW1lKTtcbiAgcmV0dXJuIGFkYXB0UGx1Z2luVG9vbGtpdChwbHVnaW4pO1xufVxuXG4vKipcbiAqIEFwcEtpdCBgVG9vbFByb3ZpZGVyYCBzaGFwZSB3ZSBkdWNrLXR5cGUgYWdhaW5zdCBhbnkgcmVnaXN0ZXJlZFxuICogcGx1Z2luLiBEZWZpbmVkIHN0cnVjdHVyYWxseSB0byBhdm9pZCBjb3VwbGluZyB0byBBcHBLaXQncyBpbnRlcm5hbFxuICogdHlwZSBtb2R1bGUgbGF5b3V0LlxuICovXG5pbnRlcmZhY2UgQXBwS2l0VG9vbGtpdFByb3ZpZGVyIHtcbiAgdG9vbGtpdD86IChvcHRzPzogVG9vbGtpdE9wdGlvbnMpID0+IFJlY29yZDxzdHJpbmcsIEFwcEtpdFRvb2xraXRFbnRyeT47XG4gIGV4ZWN1dGVBZ2VudFRvb2w/OiAobmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzZTx1bmtub3duPjtcbn1cblxuLyoqIFNpbmdsZSBlbnRyeSByZXR1cm5lZCBieSBhbiBBcHBLaXQgcGx1Z2luJ3MgYC50b29sa2l0KG9wdHMpYCBjYWxsLiAqL1xuaW50ZXJmYWNlIEFwcEtpdFRvb2xraXRFbnRyeSB7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgbG9jYWxOYW1lOiBzdHJpbmc7XG4gIGRlZjoge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHBhcmFtZXRlcnM6IHVua25vd247XG4gIH07XG59XG5cbi8qKlxuICogQWRhcHQgYW4gQXBwS2l0IGBUb29sUHJvdmlkZXJgIHBsdWdpbiBpbnN0YW5jZSBpbnRvIGFcbiAqIHtAbGluayBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXJ9LiBSZXR1cm5zIGBudWxsYCBmb3IgYW55IHBsdWdpblxuICogdGhhdCBkb2Vzbid0IGltcGxlbWVudCBib3RoIGB0b29sa2l0YCBhbmQgYGV4ZWN1dGVBZ2VudFRvb2xgIChlLmcuXG4gKiBgc2VydmVyYCwgYGxha2ViYXNlYCB3aGVuIHVzZWQgb25seSBhcyBhIFBvc3RncmVzIHBvb2wsIGV0Yy4pLlxuICovXG5mdW5jdGlvbiBhZGFwdFBsdWdpblRvb2xraXQocGx1Z2luOiB1bmtub3duKTogTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyIHwgbnVsbCB7XG4gIGlmICghcGx1Z2luIHx8IHR5cGVvZiBwbHVnaW4gIT09IFwib2JqZWN0XCIpIHJldHVybiBudWxsO1xuICBjb25zdCBwID0gcGx1Z2luIGFzIEFwcEtpdFRvb2xraXRQcm92aWRlcjtcbiAgaWYgKHR5cGVvZiBwLnRvb2xraXQgIT09IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgcC5leGVjdXRlQWdlbnRUb29sICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHRvb2xraXQob3B0cz86IFRvb2xraXRPcHRpb25zKTogTWFzdHJhVG9vbHMge1xuICAgICAgY29uc3QgZW50cmllcyA9IHAudG9vbGtpdCEob3B0cyk7XG4gICAgICBjb25zdCB0b29sczogTWFzdHJhVG9vbHMgPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpKSB7XG4gICAgICAgIHRvb2xzW2tleV0gPSB0b29sa2l0RW50cnlUb01hc3RyYVRvb2woZW50cnksIHApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRvb2xzO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogV3JhcCBhIHNpbmdsZSB7QGxpbmsgQXBwS2l0VG9vbGtpdEVudHJ5fSBhcyBhIE1hc3RyYSB0b29sIHdob3NlXG4gKiBgZXhlY3V0ZWAgZGlzcGF0Y2hlcyBiYWNrIHRocm91Z2ggYHBsdWdpbi5leGVjdXRlQWdlbnRUb29sKC4uLilgIHNvXG4gKiBBcHBLaXQncyBPQk8gYXV0aCAoYGFzVXNlcmApIGFuZCB0ZWxlbWV0cnkgc3BhbnMgc3RheSBpbnRhY3QuIEpTT05cbiAqIFNjaGVtYSBwYXJhbWV0ZXJzIHBhc3MgdGhyb3VnaCB1bmNoYW5nZWQgLSBNYXN0cmEncyBgUHVibGljU2NoZW1hYFxuICogYWNjZXB0cyBgSlNPTlNjaGVtYTdgIGRpcmVjdGx5IHZpYSBgQG1hc3RyYS9zY2hlbWEtY29tcGF0YC5cbiAqL1xuZnVuY3Rpb24gdG9vbGtpdEVudHJ5VG9NYXN0cmFUb29sKGVudHJ5OiBBcHBLaXRUb29sa2l0RW50cnksIHBsdWdpbjogQXBwS2l0VG9vbGtpdFByb3ZpZGVyKTogVG9vbCB7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogYCR7ZW50cnkucGx1Z2luTmFtZX1fXyR7ZW50cnkubG9jYWxOYW1lfWAsXG4gICAgZGVzY3JpcHRpb246IGVudHJ5LmRlZi5kZXNjcmlwdGlvbixcbiAgICAuLi4oZW50cnkuZGVmLnBhcmFtZXRlcnMgPyB7IGlucHV0U2NoZW1hOiBlbnRyeS5kZWYucGFyYW1ldGVycyBhcyBuZXZlciB9IDoge30pLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4ge1xuICAgICAgY29uc3Qgc2lnbmFsID0gKGNvbnRleHQgYXMgeyBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsIH0gfCB1bmRlZmluZWQpPy5hYm9ydFNpZ25hbDtcbiAgICAgIHJldHVybiBwbHVnaW4uZXhlY3V0ZUFnZW50VG9vbCEoZW50cnkubG9jYWxOYW1lLCBpbnB1dCwgc2lnbmFsKTtcbiAgICB9LFxuICB9KTtcbn1cbiJdfQ==
@@ -22,6 +22,7 @@ import type { PgVectorConfig, PostgresStoreConfig } from "@mastra/pg";
22
22
  import type { MastraAgentDefinition, MastraTools } from "./agents.ts";
23
23
  import type { GenieSpacesConfig } from "./genie.ts";
24
24
  import type { MastraIdentityMode } from "./identity.ts";
25
+ import type { RemoteSkillsOption } from "./remote-skills.ts";
25
26
  /**
26
27
  * `RequestContext` key under which {@link MastraServer} stores the
27
28
  * resolved AppKit user. `model.ts` reads it to mint user-scoped
@@ -517,6 +518,33 @@ export interface MastraPluginConfig extends BasePluginConfig {
517
518
  * source.
518
519
  */
519
520
  brand?: BrandContext;
521
+ /**
522
+ * Remote Agent-Skill sources materialized once at app startup. A single
523
+ * source, a list, or a `{ sources, failOnError?, ... }` bag.
524
+ *
525
+ * Each source is a GitHub `owner/repo`, a git / GitLab URL, or a direct
526
+ * `SKILL.md` / archive download URL. Resolution prefers the OPTIONAL `skills`
527
+ * npm CLI (a peer dep) which is copied into a temp dir and then persisted;
528
+ * without it, a URL source is fetched directly. A source that resolves
529
+ * through neither fails startup unless `failOnError: false`.
530
+ *
531
+ * Provisioned skills are written to the Databricks user's Assistant skills
532
+ * folder (`/Users/<email>/.assistant/skills`, the "save this as a skill"
533
+ * target) so they persist and are picked up by the built-in Assistant-skills
534
+ * mount. With no writable workspace, they go to a local temp dir instead.
535
+ *
536
+ * @example
537
+ * ```ts
538
+ * mastra({ remoteSkills: "vercel-labs/agent-skills" });
539
+ * mastra({
540
+ * remoteSkills: {
541
+ * sources: ["vercel-labs/agent-skills", "https://example.com/skill.md"],
542
+ * failOnError: false,
543
+ * },
544
+ * });
545
+ * ```
546
+ */
547
+ remoteSkills?: RemoteSkillsOption;
520
548
  }
521
549
  /**
522
550
  * JSON Schema published on the manifest's `config.schema`, mirroring the