@dbx-tools/appkit-mastra 0.6.225 → 0.6.227

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
@@ -732,6 +732,25 @@ The plugin resolves the active thread from `x-mastra-thread-id`, `?threadId=`,
732
732
  or a per-session fallback cookie. That keeps streaming, history, and clear
733
733
  operations aligned around the same conversation id.
734
734
 
735
+ ## Evaluate In Process
736
+
737
+ `eval.createMastraEvalDriver()` adapts a Mastra agent's native `generate()`
738
+ result to AppKit 0.81's `EvalDriver` contract without reducing a chat stream:
739
+
740
+ ```ts
741
+ import { runEval } from "@databricks/appkit/beta";
742
+ import { evaluation } from "@dbx-tools/appkit-mastra";
743
+
744
+ await runEval(definition, {
745
+ driver: evaluation.createMastraEvalDriver(agent),
746
+ });
747
+ ```
748
+
749
+ The driver keeps multi-turn memory on one thread, forwards timeout
750
+ cancellation, reports complete tool names/arguments and trace IDs, and starts a
751
+ new thread on `reset()`. It deliberately does not replace production feedback,
752
+ MLflow reporting, OTel tracing, or the official AI SDK chat route.
753
+
735
754
  ## Feedback And Observability
736
755
 
737
756
  `observability.buildObservability()` wires Mastra tracing when OTLP export is
@@ -971,6 +990,7 @@ client that talks to these routes.
971
990
  ## Modules
972
991
 
973
992
  - `plugin` - `MastraPlugin` and `mastra()` AppKit plugin factory.
993
+ - `evaluation` - in-process AppKit `EvalDriver` over Mastra `Agent.generate()`.
974
994
  - `agents` - `createAgent`, `tool`, `createTool`, agent build helpers, fallback
975
995
  defaults, and approval-gated tool inspection.
976
996
  - `config` - plugin config types and RequestContext key constants.
package/index.ts CHANGED
@@ -3,12 +3,13 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-mastra";
6
- export const PACKAGE_VERSION = "0.6.225";
6
+ export const PACKAGE_VERSION = "0.6.227";
7
7
  export * as agents from "./src/agents.ts";
8
8
  export * as chart from "./src/chart.ts";
9
9
  export * as chat from "./src/chat.ts";
10
10
  export * as config from "./src/config.ts";
11
11
  export * as defaults from "./src/defaults.ts";
12
+ export * as evaluation from "./src/evaluation.ts";
12
13
  export * as filesystems from "./src/filesystems.ts";
13
14
  export * as genie from "./src/genie.ts";
14
15
  export * as identity from "./src/identity.ts";
@@ -43,6 +44,7 @@ export type { ChartPlannerRequest, ChartToolOutput, PrepareChartOptions, FetchCh
43
44
  export { MASTRA_USER_KEY, MASTRA_USER_NAME_KEY, MASTRA_USER_EMAIL_KEY, MASTRA_REQUEST_ID_KEY, MASTRA_SCOPES_KEY, TRACE_REQUEST_CONTEXT_KEYS, MASTRA_CONFIG_SCHEMA } from "./src/config.ts";
44
45
  export type { User, MastraMemoryConfig, MastraMcpConfig, MastraPluginConfig } from "./src/config.ts";
45
46
  export { modelCatalogueDefaults, genieSuggestionDefaults, statementDataDefaults, chartFetchDefaults, feedbackWriteDefaults } from "./src/defaults.ts";
47
+ export type { MastraEvalDriverOptions } from "./src/evaluation.ts";
46
48
  export { MastraFileSystemAdapter } from "./src/filesystems.ts";
47
49
  export type { MastraFileSystemAdapterOptions } from "./src/filesystems.ts";
48
50
  export { DEFAULT_GENIE_ALIAS, GENIE_INSTRUCTIONS } from "./src/genie.ts";
package/lib/index.d.ts CHANGED
@@ -1,10 +1,11 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-mastra";
2
- export declare const PACKAGE_VERSION = "0.6.225";
2
+ export declare const PACKAGE_VERSION = "0.6.227";
3
3
  export * as agents from "./src/agents.ts";
4
4
  export * as chart from "./src/chart.ts";
5
5
  export * as chat from "./src/chat.ts";
6
6
  export * as config from "./src/config.ts";
7
7
  export * as defaults from "./src/defaults.ts";
8
+ export * as evaluation from "./src/evaluation.ts";
8
9
  export * as filesystems from "./src/filesystems.ts";
9
10
  export * as genie from "./src/genie.ts";
10
11
  export * as identity from "./src/identity.ts";
@@ -39,6 +40,7 @@ export type { ChartPlannerRequest, ChartToolOutput, PrepareChartOptions, FetchCh
39
40
  export { MASTRA_USER_KEY, MASTRA_USER_NAME_KEY, MASTRA_USER_EMAIL_KEY, MASTRA_REQUEST_ID_KEY, MASTRA_SCOPES_KEY, TRACE_REQUEST_CONTEXT_KEYS, MASTRA_CONFIG_SCHEMA } from "./src/config.ts";
40
41
  export type { User, MastraMemoryConfig, MastraMcpConfig, MastraPluginConfig } from "./src/config.ts";
41
42
  export { modelCatalogueDefaults, genieSuggestionDefaults, statementDataDefaults, chartFetchDefaults, feedbackWriteDefaults } from "./src/defaults.ts";
43
+ export type { MastraEvalDriverOptions } from "./src/evaluation.ts";
42
44
  export { MastraFileSystemAdapter } from "./src/filesystems.ts";
43
45
  export type { MastraFileSystemAdapterOptions } from "./src/filesystems.ts";
44
46
  export { DEFAULT_GENIE_ALIAS, GENIE_INSTRUCTIONS } from "./src/genie.ts";
package/lib/index.js CHANGED
@@ -2,12 +2,13 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-mastra";
5
- export const PACKAGE_VERSION = "0.6.225";
5
+ export const PACKAGE_VERSION = "0.6.227";
6
6
  export * as agents from "./src/agents.js";
7
7
  export * as chart from "./src/chart.js";
8
8
  export * as chat from "./src/chat.js";
9
9
  export * as config from "./src/config.js";
10
10
  export * as defaults from "./src/defaults.js";
11
+ export * as evaluation from "./src/evaluation.js";
11
12
  export * as filesystems from "./src/filesystems.js";
12
13
  export * as genie from "./src/genie.js";
13
14
  export * as identity from "./src/identity.js";
@@ -57,4 +58,4 @@ export { TYPOGRAPHY_RULE } from "./src/style.js";
57
58
  export { TITLE_INSTRUCTIONS } from "./src/summarize.js";
58
59
  export { TRACE_IO_LIMIT, MLFLOW_SPAN_INPUTS_ATTR, MLFLOW_SPAN_OUTPUTS_ATTR } from "./src/trace-io.js";
59
60
  export { DEFAULT_SKILL_FOLDERS } from "./src/workspaces.js";
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRywwQkFBMEIsQ0FBQztBQUM3RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssYUFBYSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hELE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssVUFBVSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7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c0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjYuMjI1XCI7XG5leHBvcnQgKiBhcyBhZ2VudHMgZnJvbSBcIi4vc3JjL2FnZW50cy50c1wiO1xuZXhwb3J0ICogYXMgY2hhcnQgZnJvbSBcIi4vc3JjL2NoYXJ0LnRzXCI7XG5leHBvcnQgKiBhcyBjaGF0IGZyb20gXCIuL3NyYy9jaGF0LnRzXCI7XG5leHBvcnQgKiBhcyBjb25maWcgZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0ICogYXMgZGVmYXVsdHMgZnJvbSBcIi4vc3JjL2RlZmF1bHRzLnRzXCI7XG5leHBvcnQgKiBhcyBmaWxlc3lzdGVtcyBmcm9tIFwiLi9zcmMvZmlsZXN5c3RlbXMudHNcIjtcbmV4cG9ydCAqIGFzIGdlbmllIGZyb20gXCIuL3NyYy9nZW5pZS50c1wiO1xuZXhwb3J0ICogYXMgaWRlbnRpdHkgZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgKiBhcyBtY3AgZnJvbSBcIi4vc3JjL21jcC50c1wiO1xuZXhwb3J0ICogYXMgbWVtb3J5IGZyb20gXCIuL3NyYy9tZW1vcnkudHNcIjtcbmV4cG9ydCAqIGFzIG1sZmxvdyBmcm9tIFwiLi9zcmMvbWxmbG93LnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbCBmcm9tIFwiLi9zcmMvbW9kZWwudHNcIjtcbmV4cG9ydCAqIGFzIG1vbnR5U2FuZGJveCBmcm9tIFwiLi9zcmMvbW9udHktc2FuZGJveC50c1wiO1xuZXhwb3J0ICogYXMgb2JzZXJ2YWJpbGl0eSBmcm9tIFwiLi9zcmMvb2JzZXJ2YWJpbGl0eS50c1wiO1xuZXhwb3J0ICogYXMgcGFnaW5hdGlvbiBmcm9tIFwiLi9zcmMvcGFnaW5hdGlvbi50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHByb2Nlc3NvcnMgZnJvbSBcIi4vc3JjL3Byb2Nlc3NvcnMudHNcIjtcbmV4cG9ydCAqIGFzIHJlbW90ZVNraWxscyBmcm9tIFwiLi9zcmMvcmVtb3RlLXNraWxscy50c1wiO1xuZXhwb3J0ICogYXMgcmVzdCBmcm9tIFwiLi9zcmMvcmVzdC50c1wiO1xuZXhwb3J0ICogYXMgc2FuZGJveCBmcm9tIFwiLi9zcmMvc2FuZGJveC50c1wiO1xuZXhwb3J0ICogYXMgc2VydmVyIGZyb20gXCIuL3NyYy9zZXJ2ZXIudHNcIjtcbmV4cG9ydCAqIGFzIHNlcnZpbmcgZnJvbSBcIi4vc3JjL3NlcnZpbmcudHNcIjtcbmV4cG9ydCAqIGFzIHNlcnZpbmdTYW5pdGl6ZSBmcm9tIFwiLi9zcmMvc2VydmluZy1zYW5pdGl6ZS50c1wiO1xuZXhwb3J0ICogYXMgc2tpbGxQYXRocyBmcm9tIFwiLi9zcmMvc2tpbGwtcGF0aHMudHNcIjtcbmV4cG9ydCAqIGFzIHN0YXRlbWVudCBmcm9tIFwiLi9zcmMvc3RhdGVtZW50LnRzXCI7XG5leHBvcnQgKiBhcyBzdG9yYWdlU2NoZW1hIGZyb20gXCIuL3NyYy9zdG9yYWdlLXNjaGVtYS50c1wiO1xuZXhwb3J0ICogYXMgc3R5bGUgZnJvbSBcIi4vc3JjL3N0eWxlLnRzXCI7XG5leHBvcnQgKiBhcyBzdW1tYXJpemUgZnJvbSBcIi4vc3JjL3N1bW1hcml6ZS50c1wiO1xuZXhwb3J0ICogYXMgdHJhY2VJbyBmcm9tIFwiLi9zcmMvdHJhY2UtaW8udHNcIjtcbmV4cG9ydCAqIGFzIHZhbGlkYXRpb24gZnJvbSBcIi4vc3JjL3ZhbGlkYXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIHdvcmtzcGFjZXMgZnJvbSBcIi4vc3JjL3dvcmtzcGFjZXMudHNcIjtcbmV4cG9ydCAqIGFzIHdyaXRlciBmcm9tIFwiLi9zcmMvd3JpdGVyLnRzXCI7XG5leHBvcnQgeyBGQUxMQkFDS19BR0VOVF9JRCwgREVGQVVMVF9BR0VOVF9NQVhfU1RFUFMsIERFRkFVTFRfU1RZTEVfSU5TVFJVQ1RJT05TIH0gZnJvbSBcIi4vc3JjL2FnZW50cy50c1wiO1xuZXhwb3J0IHR5cGUgeyBNYXN0cmFUb29scywgQXBwS2l0VG9vbE9wdGlvbnMsIFRvb2xraXRPcHRpb25zLCBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIsIE1hc3RyYVBsdWdpbnMsIE1hc3RyYVRvb2xzRm4sIE1hc3RyYUFnZW50V29ya3NwYWNlUmVzb2x2ZXIsIE1hc3RyYUFnZW50RGVmaW5pdGlvbiwgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uLCBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGUsIE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlLCBBZ2VudERlZmF1bHRNb2RlbCwgQnVpbHRBZ2VudHMgfSBmcm9tIFwiLi9zcmMvYWdlbnRzLnRzXCI7XG5leHBvcnQgeyBjaGFydFBsYW5TY2hlbWEsIGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWEsIGNoYXJ0VG9vbE91dHB1dFNjaGVtYSB9IGZyb20gXCIuL3NyYy9jaGFydC50c1wiO1xuZXhwb3J0IHR5cGUgeyBDaGFydFBsYW5uZXJSZXF1ZXN0LCBDaGFydFRvb2xPdXRwdXQsIFByZXBhcmVDaGFydE9wdGlvbnMsIEZldGNoQ2hhcnRPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2NoYXJ0LnRzXCI7XG5leHBvcnQgeyBNQVNUUkFfVVNFUl9LRVksIE1BU1RSQV9VU0VSX05BTUVfS0VZLCBNQVNUUkFfVVNFUl9FTUFJTF9LRVksIE1BU1RSQV9SRVFVRVNUX0lEX0tFWSwgTUFTVFJBX1NDT1BFU19LRVksIFRSQUNFX1JFUVVFU1RfQ09OVEVYVF9LRVlTLCBNQVNUUkFfQ09ORklHX1NDSEVNQSB9IGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCB0eXBlIHsgVXNlciwgTWFzdHJhTWVtb3J5Q29uZmlnLCBNYXN0cmFNY3BDb25maWcsIE1hc3RyYVBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCB7IG1vZGVsQ2F0YWxvZ3VlRGVmYXVsdHMsIGdlbmllU3VnZ2VzdGlvbkRlZmF1bHRzLCBzdGF0ZW1lbnREYXRhRGVmYXVsdHMsIGNoYXJ0RmV0Y2hEZWZhdWx0cywgZmVlZGJhY2tXcml0ZURlZmF1bHRzIH0gZnJvbSBcIi4vc3JjL2RlZmF1bHRzLnRzXCI7XG5leHBvcnQgeyBNYXN0cmFGaWxlU3lzdGVtQWRhcHRlciB9IGZyb20gXCIuL3NyYy9maWxlc3lzdGVtcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBNYXN0cmFGaWxlU3lzdGVtQWRhcHRlck9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZmlsZXN5c3RlbXMudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfR0VOSUVfQUxJQVMsIEdFTklFX0lOU1RSVUNUSU9OUyB9IGZyb20gXCIuL3NyYy9nZW5pZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBHZW5pZVNwYWNlQ29uZmlnLCBHZW5pZVNwYWNlc0NvbmZpZyB9IGZyb20gXCIuL3NyYy9nZW5pZS50c1wiO1xuZXhwb3J0IHsgSURFTlRJVFlfRU5WLCBJREVOVElUWV9NT0RFUywgREVGQVVMVF9JREVOVElUWV9NT0RFLCBVU0VSX0lEX0hFQURFUiwgVVNFUl9FTUFJTF9IRUFERVIsIHJlcXVlc3RVc2VySWQsIHJlcXVlc3RVc2VyRW1haWwsIHVzZVNlcnZpY2VQcmluY2lwYWwgfSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhSWRlbnRpdHlNb2RlIH0gZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgdHlwZSB7IFJlc29sdmVkTWNwIH0gZnJvbSBcIi4vc3JjL21jcC50c1wiO1xuZXhwb3J0IHsgTWVtb3J5QnVpbGRlciB9IGZyb20gXCIuL3NyYy9tZW1vcnkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTG9nRmVlZGJhY2tQYXJhbXMgfSBmcm9tIFwiLi9zcmMvbWxmbG93LnRzXCI7XG5leHBvcnQgeyBSRVNQT05TRVNfUFJPVklERVJfT1BUSU9OUyB9IGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0IHR5cGUgeyBCdWlsZE1vZGVsT3ZlcnJpZGVzIH0gZnJvbSBcIi4vc3JjL21vZGVsLnRzXCI7XG5leHBvcnQgeyBNb250eVNhbmRib3ggfSBmcm9tIFwiLi9zcmMvbW9udHktc2FuZGJveC50c1wiO1xuZXhwb3J0IHR5cGUgeyBNb250eVNhbmRib3hPcHRpb25zIH0gZnJvbSBcIi4vc3JjL21vbnR5LXNhbmRib3gudHNcIjtcbmV4cG9ydCB0eXBlIHsgQnVpbGRPYnNlcnZhYmlsaXR5T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9vYnNlcnZhYmlsaXR5LnRzXCI7XG5leHBvcnQgdHlwZSB7IFBlclBhZ2VCb3VuZHMgfSBmcm9tIFwiLi9zcmMvcGFnaW5hdGlvbi50c1wiO1xuZXhwb3J0IHsgTWFzdHJhUGx1Z2luLCBtYXN0cmEgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgeyBzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yIH0gZnJvbSBcIi4vc3JjL3Byb2Nlc3NvcnMudHNcIjtcbmV4cG9ydCB7IEFJVE9PTFNfU09VUkNFIH0gZnJvbSBcIi4vc3JjL3JlbW90ZS1za2lsbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgQWlUb29sc1NvdXJjZSwgUmVtb3RlU2tpbGxTb3VyY2VPcHRpb25zLCBSZW1vdGVTa2lsbFNvdXJjZSwgUmVtb3RlU2tpbGxzT3B0aW9uLCBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLCBQcm92aXNpb25lZFJlbW90ZVNraWxscywgUmVtb3RlU2tpbGxDYWNoZUVudHJ5LCBSZW1vdGVTa2lsbHNNZXRhZGF0YSB9IGZyb20gXCIuL3NyYy9yZW1vdGUtc2tpbGxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NGZXRjaEluaXQgfSBmcm9tIFwiLi9zcmMvcmVzdC50c1wiO1xuZXhwb3J0IHsgRGF0YWJyaWNrc1NhbmRib3ggfSBmcm9tIFwiLi9zcmMvc2FuZGJveC50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzU2FuZGJveE9wdGlvbnMsIERhdGFicmlja3NXb3Jrc3BhY2VTYW5kYm94T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9zYW5kYm94LnRzXCI7XG5leHBvcnQgeyBNYXN0cmFTZXJ2ZXIgfSBmcm9tIFwiLi9zcmMvc2VydmVyLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF0dHJpYnV0ZWRJZGVudGl0eSwgTWFzdHJhQXBpR2F0ZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc2VydmVyLnRzXCI7XG5leHBvcnQgeyBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZIH0gZnJvbSBcIi4vc3JjL3NlcnZpbmcudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxPdmVycmlkZVJlcXVlc3QgfSBmcm9tIFwiLi9zcmMvc2VydmluZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBTZXJ2aW5nQ2hhdE1lc3NhZ2UsIFJld3JpdHRlblNlcnZpbmdSZXF1ZXN0IH0gZnJvbSBcIi4vc3JjL3NlcnZpbmctc2FuaXRpemUudHNcIjtcbmV4cG9ydCB7IEFTU0lTVEFOVF9TSEFSRURfU0tJTExTX1BBVEggfSBmcm9tIFwiLi9zcmMvc2tpbGwtcGF0aHMudHNcIjtcbmV4cG9ydCB7IFNUQVRFTUVOVF9ST1dfQ0FQIH0gZnJvbSBcIi4vc3JjL3N0YXRlbWVudC50c1wiO1xuZXhwb3J0IHsgVFlQT0dSQVBIWV9SVUxFIH0gZnJvbSBcIi4vc3JjL3N0eWxlLnRzXCI7XG5leHBvcnQgeyBUSVRMRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvc3VtbWFyaXplLnRzXCI7XG5leHBvcnQgdHlwZSB7IFN1bW1hcml6ZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc3VtbWFyaXplLnRzXCI7XG5leHBvcnQgeyBUUkFDRV9JT19MSU1JVCwgTUxGTE9XX1NQQU5fSU5QVVRTX0FUVFIsIE1MRkxPV19TUEFOX09VVFBVVFNfQVRUUiB9IGZyb20gXCIuL3NyYy90cmFjZS1pby50c1wiO1xuZXhwb3J0IHR5cGUgeyBTY2hlbWFJc3N1ZXMgfSBmcm9tIFwiLi9zcmMvdmFsaWRhdGlvbi50c1wiO1xuZXhwb3J0IHsgREVGQVVMVF9TS0lMTF9GT0xERVJTIH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgV29ya3NwYWNlTW91bnRDb250ZXh0LCBTa2lsbEZvbGRlclZhbHVlLCBTa2lsbEZvbGRlck9wdGlvbnMsIFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uLCBXb3Jrc3BhY2VNb3VudFJlc29sdmVyLCBEZWZhdWx0U2tpbGxGb2xkZXJOYW1lLCBXb3Jrc3BhY2VTYW5kYm94U2VsZWN0aW9uLCBDcmVhdGVXb3Jrc3BhY2VPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZXMudHNcIjtcbiJdfQ==
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRywwQkFBMEIsQ0FBQztBQUM3RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssV0FBVyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssWUFBWSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxhQUFhLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7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LHFCQUFxQixFQUFFLE1BQU0scUJBQXFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuNi4yMjdcIjtcbmV4cG9ydCAqIGFzIGFnZW50cyBmcm9tIFwiLi9zcmMvYWdlbnRzLnRzXCI7XG5leHBvcnQgKiBhcyBjaGFydCBmcm9tIFwiLi9zcmMvY2hhcnQudHNcIjtcbmV4cG9ydCAqIGFzIGNoYXQgZnJvbSBcIi4vc3JjL2NoYXQudHNcIjtcbmV4cG9ydCAqIGFzIGNvbmZpZyBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgKiBhcyBkZWZhdWx0cyBmcm9tIFwiLi9zcmMvZGVmYXVsdHMudHNcIjtcbmV4cG9ydCAqIGFzIGV2YWx1YXRpb24gZnJvbSBcIi4vc3JjL2V2YWx1YXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIGZpbGVzeXN0ZW1zIGZyb20gXCIuL3NyYy9maWxlc3lzdGVtcy50c1wiO1xuZXhwb3J0ICogYXMgZ2VuaWUgZnJvbSBcIi4vc3JjL2dlbmllLnRzXCI7XG5leHBvcnQgKiBhcyBpZGVudGl0eSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCAqIGFzIG1jcCBmcm9tIFwiLi9zcmMvbWNwLnRzXCI7XG5leHBvcnQgKiBhcyBtZW1vcnkgZnJvbSBcIi4vc3JjL21lbW9yeS50c1wiO1xuZXhwb3J0ICogYXMgbWxmbG93IGZyb20gXCIuL3NyYy9tbGZsb3cudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsIGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0ICogYXMgbW9udHlTYW5kYm94IGZyb20gXCIuL3NyYy9tb250eS1zYW5kYm94LnRzXCI7XG5leHBvcnQgKiBhcyBvYnNlcnZhYmlsaXR5IGZyb20gXCIuL3NyYy9vYnNlcnZhYmlsaXR5LnRzXCI7XG5leHBvcnQgKiBhcyBwYWdpbmF0aW9uIGZyb20gXCIuL3NyYy9wYWdpbmF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyBwbHVnaW4gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0ICogYXMgcHJvY2Vzc29ycyBmcm9tIFwiLi9zcmMvcHJvY2Vzc29ycy50c1wiO1xuZXhwb3J0ICogYXMgcmVtb3RlU2tpbGxzIGZyb20gXCIuL3NyYy9yZW1vdGUtc2tpbGxzLnRzXCI7XG5leHBvcnQgKiBhcyByZXN0IGZyb20gXCIuL3NyYy9yZXN0LnRzXCI7XG5leHBvcnQgKiBhcyBzYW5kYm94IGZyb20gXCIuL3NyYy9zYW5kYm94LnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2ZXIgZnJvbSBcIi4vc3JjL3NlcnZlci50c1wiO1xuZXhwb3J0ICogYXMgc2VydmluZyBmcm9tIFwiLi9zcmMvc2VydmluZy50c1wiO1xuZXhwb3J0ICogYXMgc2VydmluZ1Nhbml0aXplIGZyb20gXCIuL3NyYy9zZXJ2aW5nLXNhbml0aXplLnRzXCI7XG5leHBvcnQgKiBhcyBza2lsbFBhdGhzIGZyb20gXCIuL3NyYy9za2lsbC1wYXRocy50c1wiO1xuZXhwb3J0ICogYXMgc3RhdGVtZW50IGZyb20gXCIuL3NyYy9zdGF0ZW1lbnQudHNcIjtcbmV4cG9ydCAqIGFzIHN0b3JhZ2VTY2hlbWEgZnJvbSBcIi4vc3JjL3N0b3JhZ2Utc2NoZW1hLnRzXCI7XG5leHBvcnQgKiBhcyBzdHlsZSBmcm9tIFwiLi9zcmMvc3R5bGUudHNcIjtcbmV4cG9ydCAqIGFzIHN1bW1hcml6ZSBmcm9tIFwiLi9zcmMvc3VtbWFyaXplLnRzXCI7XG5leHBvcnQgKiBhcyB0cmFjZUlvIGZyb20gXCIuL3NyYy90cmFjZS1pby50c1wiO1xuZXhwb3J0ICogYXMgdmFsaWRhdGlvbiBmcm9tIFwiLi9zcmMvdmFsaWRhdGlvbi50c1wiO1xuZXhwb3J0ICogYXMgd29ya3NwYWNlcyBmcm9tIFwiLi9zcmMvd29ya3NwYWNlcy50c1wiO1xuZXhwb3J0ICogYXMgd3JpdGVyIGZyb20gXCIuL3NyYy93cml0ZXIudHNcIjtcbmV4cG9ydCB7IEZBTExCQUNLX0FHRU5UX0lELCBERUZBVUxUX0FHRU5UX01BWF9TVEVQUywgREVGQVVMVF9TVFlMRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvYWdlbnRzLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1hc3RyYVRvb2xzLCBBcHBLaXRUb29sT3B0aW9ucywgVG9vbGtpdE9wdGlvbnMsIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciwgTWFzdHJhUGx1Z2lucywgTWFzdHJhVG9vbHNGbiwgTWFzdHJhQWdlbnRXb3Jrc3BhY2VSZXNvbHZlciwgTWFzdHJhQWdlbnREZWZpbml0aW9uLCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24sIE1hc3RyYVN0b3JhZ2VDb25maWdPdmVycmlkZSwgTWFzdHJhTWVtb3J5Q29uZmlnT3ZlcnJpZGUsIEFnZW50RGVmYXVsdE1vZGVsLCBCdWlsdEFnZW50cyB9IGZyb20gXCIuL3NyYy9hZ2VudHMudHNcIjtcbmV4cG9ydCB7IGNoYXJ0UGxhblNjaGVtYSwgY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYSwgY2hhcnRUb29sT3V0cHV0U2NoZW1hIH0gZnJvbSBcIi4vc3JjL2NoYXJ0LnRzXCI7XG5leHBvcnQgdHlwZSB7IENoYXJ0UGxhbm5lclJlcXVlc3QsIENoYXJ0VG9vbE91dHB1dCwgUHJlcGFyZUNoYXJ0T3B0aW9ucywgRmV0Y2hDaGFydE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvY2hhcnQudHNcIjtcbmV4cG9ydCB7IE1BU1RSQV9VU0VSX0tFWSwgTUFTVFJBX1VTRVJfTkFNRV9LRVksIE1BU1RSQV9VU0VSX0VNQUlMX0tFWSwgTUFTVFJBX1JFUVVFU1RfSURfS0VZLCBNQVNUUkFfU0NPUEVTX0tFWSwgVFJBQ0VfUkVRVUVTVF9DT05URVhUX0tFWVMsIE1BU1RSQV9DT05GSUdfU0NIRU1BIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBVc2VyLCBNYXN0cmFNZW1vcnlDb25maWcsIE1hc3RyYU1jcENvbmZpZywgTWFzdHJhUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHsgbW9kZWxDYXRhbG9ndWVEZWZhdWx0cywgZ2VuaWVTdWdnZXN0aW9uRGVmYXVsdHMsIHN0YXRlbWVudERhdGFEZWZhdWx0cywgY2hhcnRGZXRjaERlZmF1bHRzLCBmZWVkYmFja1dyaXRlRGVmYXVsdHMgfSBmcm9tIFwiLi9zcmMvZGVmYXVsdHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhRXZhbERyaXZlck9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZXZhbHVhdGlvbi50c1wiO1xuZXhwb3J0IHsgTWFzdHJhRmlsZVN5c3RlbUFkYXB0ZXIgfSBmcm9tIFwiLi9zcmMvZmlsZXN5c3RlbXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhRmlsZVN5c3RlbUFkYXB0ZXJPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2ZpbGVzeXN0ZW1zLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX0dFTklFX0FMSUFTLCBHRU5JRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB0eXBlIHsgR2VuaWVTcGFjZUNvbmZpZywgR2VuaWVTcGFjZXNDb25maWcgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB7IElERU5USVRZX0VOViwgSURFTlRJVFlfTU9ERVMsIERFRkFVTFRfSURFTlRJVFlfTU9ERSwgVVNFUl9JRF9IRUFERVIsIFVTRVJfRU1BSUxfSEVBREVSLCByZXF1ZXN0VXNlcklkLCByZXF1ZXN0VXNlckVtYWlsLCB1c2VTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1hc3RyYUlkZW50aXR5TW9kZSB9IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0IHR5cGUgeyBSZXNvbHZlZE1jcCB9IGZyb20gXCIuL3NyYy9tY3AudHNcIjtcbmV4cG9ydCB7IE1lbW9yeUJ1aWxkZXIgfSBmcm9tIFwiLi9zcmMvbWVtb3J5LnRzXCI7XG5leHBvcnQgdHlwZSB7IExvZ0ZlZWRiYWNrUGFyYW1zIH0gZnJvbSBcIi4vc3JjL21sZmxvdy50c1wiO1xuZXhwb3J0IHsgUkVTUE9OU0VTX1BST1ZJREVSX09QVElPTlMgfSBmcm9tIFwiLi9zcmMvbW9kZWwudHNcIjtcbmV4cG9ydCB0eXBlIHsgQnVpbGRNb2RlbE92ZXJyaWRlcyB9IGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0IHsgTW9udHlTYW5kYm94IH0gZnJvbSBcIi4vc3JjL21vbnR5LXNhbmRib3gudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9udHlTYW5kYm94T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9tb250eS1zYW5kYm94LnRzXCI7XG5leHBvcnQgdHlwZSB7IEJ1aWxkT2JzZXJ2YWJpbGl0eU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvb2JzZXJ2YWJpbGl0eS50c1wiO1xuZXhwb3J0IHR5cGUgeyBQZXJQYWdlQm91bmRzIH0gZnJvbSBcIi4vc3JjL3BhZ2luYXRpb24udHNcIjtcbmV4cG9ydCB7IE1hc3RyYVBsdWdpbiwgbWFzdHJhIH0gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0IHsgc3RyaXBTdGFsZUNoYXJ0c1Byb2Nlc3NvciB9IGZyb20gXCIuL3NyYy9wcm9jZXNzb3JzLnRzXCI7XG5leHBvcnQgeyBBSVRPT0xTX1NPVVJDRSB9IGZyb20gXCIuL3NyYy9yZW1vdGUtc2tpbGxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEFpVG9vbHNTb3VyY2UsIFJlbW90ZVNraWxsU291cmNlT3B0aW9ucywgUmVtb3RlU2tpbGxTb3VyY2UsIFJlbW90ZVNraWxsc09wdGlvbiwgUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucywgUHJvdmlzaW9uZWRSZW1vdGVTa2lsbHMsIFJlbW90ZVNraWxsQ2FjaGVFbnRyeSwgUmVtb3RlU2tpbGxzTWV0YWRhdGEgfSBmcm9tIFwiLi9zcmMvcmVtb3RlLXNraWxscy50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzRmV0Y2hJbml0IH0gZnJvbSBcIi4vc3JjL3Jlc3QudHNcIjtcbmV4cG9ydCB7IERhdGFicmlja3NTYW5kYm94IH0gZnJvbSBcIi4vc3JjL3NhbmRib3gudHNcIjtcbmV4cG9ydCB0eXBlIHsgRGF0YWJyaWNrc1NhbmRib3hPcHRpb25zLCBEYXRhYnJpY2tzV29ya3NwYWNlU2FuZGJveE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc2FuZGJveC50c1wiO1xuZXhwb3J0IHsgTWFzdHJhU2VydmVyIH0gZnJvbSBcIi4vc3JjL3NlcnZlci50c1wiO1xuZXhwb3J0IHR5cGUgeyBBdHRyaWJ1dGVkSWRlbnRpdHksIE1hc3RyYUFwaUdhdGVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3NlcnZlci50c1wiO1xuZXhwb3J0IHsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSB9IGZyb20gXCIuL3NyYy9zZXJ2aW5nLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsT3ZlcnJpZGVSZXF1ZXN0IH0gZnJvbSBcIi4vc3JjL3NlcnZpbmcudHNcIjtcbmV4cG9ydCB0eXBlIHsgU2VydmluZ0NoYXRNZXNzYWdlLCBSZXdyaXR0ZW5TZXJ2aW5nUmVxdWVzdCB9IGZyb20gXCIuL3NyYy9zZXJ2aW5nLXNhbml0aXplLnRzXCI7XG5leHBvcnQgeyBBU1NJU1RBTlRfU0hBUkVEX1NLSUxMU19QQVRIIH0gZnJvbSBcIi4vc3JjL3NraWxsLXBhdGhzLnRzXCI7XG5leHBvcnQgeyBTVEFURU1FTlRfUk9XX0NBUCB9IGZyb20gXCIuL3NyYy9zdGF0ZW1lbnQudHNcIjtcbmV4cG9ydCB7IFRZUE9HUkFQSFlfUlVMRSB9IGZyb20gXCIuL3NyYy9zdHlsZS50c1wiO1xuZXhwb3J0IHsgVElUTEVfSU5TVFJVQ1RJT05TIH0gZnJvbSBcIi4vc3JjL3N1bW1hcml6ZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBTdW1tYXJpemVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3N1bW1hcml6ZS50c1wiO1xuZXhwb3J0IHsgVFJBQ0VfSU9fTElNSVQsIE1MRkxPV19TUEFOX0lOUFVUU19BVFRSLCBNTEZMT1dfU1BBTl9PVVRQVVRTX0FUVFIgfSBmcm9tIFwiLi9zcmMvdHJhY2UtaW8udHNcIjtcbmV4cG9ydCB0eXBlIHsgU2NoZW1hSXNzdWVzIH0gZnJvbSBcIi4vc3JjL3ZhbGlkYXRpb24udHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfU0tJTExfRk9MREVSUyB9IGZyb20gXCIuL3NyYy93b3Jrc3BhY2VzLnRzXCI7XG5leHBvcnQgdHlwZSB7IFdvcmtzcGFjZU1vdW50Q29udGV4dCwgU2tpbGxGb2xkZXJWYWx1ZSwgU2tpbGxGb2xkZXJPcHRpb25zLCBXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbiwgV29ya3NwYWNlTW91bnRSZXNvbHZlciwgRGVmYXVsdFNraWxsRm9sZGVyTmFtZSwgV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbiwgQ3JlYXRlV29ya3NwYWNlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy93b3Jrc3BhY2VzLnRzXCI7XG4iXX0=
package/lib/src/agents.js CHANGED
@@ -15,6 +15,7 @@
15
15
  * @module
16
16
  */
17
17
  import { ConfigurationError } from "@databricks/appkit";
18
+ import { toolkit as appkitToolkit } from "@dbx-tools/appkit";
18
19
  import { object, string } from "@dbx-tools/shared-core";
19
20
  import { Agent } from "@mastra/core/agent";
20
21
  import { MASTRA_RESOURCE_ID_KEY } from "@mastra/core/request-context";
@@ -577,33 +578,7 @@ function adaptPluginToolkit(plugin, pluginName) {
577
578
  };
578
579
  }
579
580
  function toolkitEntriesFromDefinitions(pluginName, definitions, options = {}) {
580
- return Object.fromEntries(definitions.flatMap((definition) => {
581
- const key = toolkitName(definition.name, pluginName, options);
582
- if (key === null)
583
- return [];
584
- return [
585
- [
586
- key,
587
- {
588
- __toolkitRef: true,
589
- pluginName,
590
- localName: definition.name,
591
- def: { ...definition, name: key },
592
- annotations: definition.annotations,
593
- },
594
- ],
595
- ];
596
- }));
597
- }
598
- function toolkitName(localName, pluginName, options) {
599
- if (options.only && !options.only.includes(localName))
600
- return null;
601
- if (options.except?.includes(localName))
602
- return null;
603
- const renamed = options.rename?.[localName];
604
- if (renamed)
605
- return renamed;
606
- return `${options.prefix ?? `${pluginName}.`}${localName}`;
581
+ return appkitToolkit.entries(pluginName, definitions, options);
607
582
  }
608
583
  function isPromiseLike(value) {
609
584
  return typeof value?.then === "function";
@@ -625,11 +600,12 @@ function toolkitEntriesToMastraTools(entries, plugin) {
625
600
  function toolkitEntryToMastraTool(entry, plugin) {
626
601
  const annotations = entry.annotations ?? entry.def.annotations;
627
602
  const effect = annotations?.effect;
603
+ const requiresApproval = (effect !== undefined && effect !== "read") || annotations?.destructive === true;
628
604
  return createTool({
629
605
  id: `${entry.pluginName}__${entry.localName}`,
630
606
  description: entry.def.description,
631
607
  ...(entry.def.parameters ? { inputSchema: entry.def.parameters } : {}),
632
- ...(effect && effect !== "read" ? { requireApproval: true } : {}),
608
+ ...(requiresApproval ? { requireApproval: true } : {}),
633
609
  ...(annotations
634
610
  ? {
635
611
  mcp: {
@@ -650,4 +626,4 @@ function toolkitEntryToMastraTool(entry, plugin) {
650
626
  },
651
627
  });
652
628
  }
653
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FnZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQVN4RCxPQUFPLEVBQU8sTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBTzdELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUV0RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFJaEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUUzRSxPQUFPLEVBQUUsVUFBVSxFQUFFLDBCQUEwQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBbUJsRCx5RUFBeUU7QUFDekUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWhEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFDSCxNQUFNLFVBQVUsSUFBSSxDQUFDLElBQXVCO0lBQzFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyRCxPQUFPLFVB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LFFBQVEsS0FBSyxJQUFJO3dCQUNoRSxlQUFlLEVBQUUsTUFBTSxLQUFLLGFBQWEsSUFBSSxXQUFXLENBQUMsV0FBVyxLQUFLLElBQUk7d0JBQzdFLGNBQWMsRUFBRSxXQUFXLENBQUMsVUFBVTtxQkFDdkM7aUJBQ0Y7YUFDRjtZQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQWMsRUFBRSxPQUFnQixFQUFFLEVBQUU7WUFDbEQsTUFBTSxTQUFTLEdBQUcsT0FLTCxDQUFDO1lBQ2QsTUFBTSxVQUFVLEdBQUcsU0FBUyxFQUFFLGNBQWMsRUFBRSxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUMxRSxPQUFPLE1BQU0sQ0FBQyxnQkFBaUIsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFO2dCQUM5RSxHQUFHLENBQUMsT0FBTyxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDMUQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFnZW50IHJlZ2lzdHJhdGlvbiBmb3IgdGhlIE1hc3RyYSBBcHBLaXQgcGx1Z2luLlxuICpcbiAqIE1pcnJvcnMgdGhlIHNoYXBlIG9mIHRoZSBBcHBLaXQgYGFnZW50c2AgcGx1Z2luIChgY29uZmlnLmFnZW50c2AgbWFwXG4gKiBvZiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9ufSwgZHVhbC1mb3JtIGB0b29sc2AgYWNjZXB0aW5nIGEgcGxhaW5cbiAqIHJlY29yZCBvciBhIGAocGx1Z2lucykgPT4gdG9vbHNgIGNhbGxiYWNrKS4gUmVzb2x2ZXMgZWFjaCBkZWZpbml0aW9uXG4gKiBpbnRvIGEgTWFzdHJhIGBBZ2VudGAgaW5zdGFuY2UgZHVyaW5nIHBsdWdpbiBzZXR1cDsgdXNlci1zdXBwbGllZFxuICogdG9vbCBjYWxsYmFja3MgYXJlIGludm9rZWQgZXhhY3RseSBvbmNlIHdpdGggYSB0eXBlZFxuICoge0BsaW5rIE1hc3RyYVBsdWdpbnN9IG1hcCBidWlsdCBmcm9tIHJlZ2lzdGVyZWQgc2libGluZyBwbHVnaW5zLlxuICpcbiAqIFdoZW4gbm8gYWdlbnRzIGFyZSByZWdpc3RlcmVkIHRoZSBwbHVnaW4gZmFsbHMgYmFjayB0byBhIHNpbmdsZVxuICogYnVpbHQtaW4gYW5hbHlzdCBzbyB0aGUgYmFyZSBgbWFzdHJhKClgIGNhbGwgc3RpbGwgbW91bnRzIGEgd29ya2luZ1xuICogc3RyZWFtYWJsZSBhZ2VudCBmb3IgZGVtb3MuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHtcbiAgQWdlbnRUb29sRGVmaW5pdGlvbixcbiAgUGx1Z2luVG9vbGtpdFByb3ZpZGVyLFxuICBUb29sa2l0RW50cnksXG4gIFRvb2xraXRPcHRpb25zIGFzIEFwcEtpdFRvb2xraXRPcHRpb25zLFxuICBUb29sUHJvdmlkZXIsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvYmV0YVwiO1xuaW1wb3J0IHsgcGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBsb2csIG9iamVjdCwgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHtcbiAgQWdlbnRDb25maWcsXG4gIEFnZW50RXhlY3V0aW9uT3B0aW9ucyxcbiAgQWdlbnRJbnN0cnVjdGlvbnMsXG4gIFRvb2xzSW5wdXQsXG59IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB7IEFnZW50IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHsgTUFTVFJBX1JFU09VUkNFX0lEX0tFWSB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IFRvb2wgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Rvb2xzXCI7XG5pbXBvcnQgeyBjcmVhdGVUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2UgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtzcGFjZVwiO1xuaW1wb3J0IHR5cGUgeyBQZ1ZlY3RvckNvbmZpZywgUG9zdGdyZXNTdG9yZUNvbmZpZyB9IGZyb20gXCJAbWFzdHJhL3BnXCI7XG5cbmltcG9ydCB7IGJ1aWxkUmVuZGVyRGF0YVRvb2wgfSBmcm9tIFwiLi9jaGFydC50c1wiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXIsIHJlc29sdmVHZW5pZVNwYWNlcyB9IGZyb20gXCIuL2dlbmllLnRzXCI7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeUJ1aWxkZXIgfSBmcm9tIFwiLi9tZW1vcnkudHNcIjtcbmltcG9ydCB7IGJ1aWxkTW9kZWwsIFJFU1BPTlNFU19QUk9WSURFUl9PUFRJT05TIH0gZnJvbSBcIi4vbW9kZWwudHNcIjtcbmltcG9ydCB7IHN0cmlwU3RhbGVDaGFydHNQcm9jZXNzb3IgfSBmcm9tIFwiLi9wcm9jZXNzb3JzLnRzXCI7XG5pbXBvcnQgeyBUWVBPR1JBUEhZX1JVTEUgfSBmcm9tIFwiLi9zdHlsZS50c1wiO1xuaW1wb3J0IHsgYnVpbGRTdW1tYXJpemVUb29sIH0gZnJvbSBcIi4vc3VtbWFyaXplLnRzXCI7XG5pbXBvcnQgeyBjcmVhdGVXb3Jrc3BhY2UgfSBmcm9tIFwiLi93b3Jrc3BhY2VzLnRzXCI7XG5cbi8qKlxuICogVG9vbCByZWNvcmQgYWNjZXB0ZWQgYnkgZXZlcnkgTWFzdHJhIGBBZ2VudC50b29sc2AgZmllbGQgYW5kIGJ5IHRoZVxuICogYHRvb2xzKHBsdWdpbnMpYCBjYWxsYmFjayBvbiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9ufS5cbiAqXG4gKiBBbGlhcyBvZiBNYXN0cmEncyBgVG9vbHNJbnB1dGAsIHNvIGl0IGFscmVhZHkgYWNjZXB0czpcbiAqXG4gKiAtIE1hc3RyYSB0b29scyBidWlsdCB3aXRoIHtAbGluayBjcmVhdGVUb29sfSAob3IgYG5ldyBUb29sKC4uLilgKVxuICogLSBNYXN0cmEgdG9vbHMgYnVpbHQgd2l0aCB0aGUgQXBwS2l0LXNoYXBlZCB7QGxpbmsgdG9vbH0gd3JhcHBlclxuICogICBiZWxvd1xuICogLSBWZXJjZWwgQUkgU0RLIHRvb2xzIChgdG9vbCh7IC4uLiB9KWAgZnJvbSBgYWlgKVxuICogLSBQcm92aWRlci1kZWZpbmVkIHRvb2xzIChlLmcuIGBvcGVuYWkudG9vbHMud2ViU2VhcmNoKC4uLilgKVxuICpcbiAqIEV4aXN0aW5nIHRvb2wgbGlicmFyaWVzIGRyb3AgaW4gYXMtaXMgLSBub3RoaW5nIGluIHRoaXMgcGFja2FnZVxuICogZm9yY2VzIGEgcmVidWlsZC5cbiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhVG9vbHMgPSBUb29sc0lucHV0O1xuXG4vKiogUmUtZXhwb3J0IG9mIE1hc3RyYSdzIG5hdGl2ZSBgY3JlYXRlVG9vbGAgZm9yIGZ1bGwtZmVhdHVyZSBhY2Nlc3MuICovXG5leHBvcnQgeyBjcmVhdGVUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuXG4vKipcbiAqIEFwcEtpdC1zaGFwZWQgdG9vbCBmYWN0b3J5LiBMZXRzIHVzZXJzIG1peC1hbmQtbWF0Y2ggdG9vbHMgYWNyb3NzXG4gKiBBcHBLaXQncyBgYWdlbnRzYCBwbHVnaW4gYW5kIGBtYXN0cmFgIHdpdGggYSBzaW5nbGUgaW1wb3J0OlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyB0b29sIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuICogaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbiAqXG4gKiBnZXRfd2VhdGhlcjogdG9vbCh7XG4gKiAgIGRlc2NyaXB0aW9uOiBcIldlYXRoZXJcIixcbiAqICAgc2NoZW1hOiB6Lm9iamVjdCh7IGNpdHk6IHouc3RyaW5nKCkgfSksXG4gKiAgIGV4ZWN1dGU6IGFzeW5jICh7IGNpdHkgfSkgPT4gYFN1bm55IGluICR7Y2l0eX1gLFxuICogfSksXG4gKiBgYGBcbiAqXG4gKiBNYXBzIG9udG8gTWFzdHJhJ3MgYGNyZWF0ZVRvb2xgOlxuICpcbiAqIC0gYGRlc2NyaXB0aW9uYCAtPiBgZGVzY3JpcHRpb25gIChyZXF1aXJlZClcbiAqIC0gYHNjaGVtYWAgLT4gYGlucHV0U2NoZW1hYCAob3B0aW9uYWwpXG4gKiAtIGBleGVjdXRlKGlucHV0KWAgLT4gYGV4ZWN1dGUoaW5wdXQsIGN0eClgIC0gTWFzdHJhIGFscmVhZHkgY2FsbHNcbiAqICAgdGhlIGZpcnN0IGFyZyB3aXRoIHRoZSBwYXJzZWQgaW5wdXRzLCBzbyB0aGUgYm9keSBzaGFwZSBpc1xuICogICBpZGVudGljYWwuIFRoZSBNYXN0cmEgYGNvbnRleHRgIGFyZyBpcyBmb3J3YXJkZWQgYXMgdGhlIHNlY29uZFxuICogICBwYXJhbWV0ZXIgd2hlbiB0aGUgY2FsbGVyIGRlY2xhcmVzIGl0LlxuICogLSBgaWRgOiBvcHRpb25hbC4gRGVmYXVsdHMgdG8gYSBzdGFibGUgaWRlbnRpZmllciBkZXJpdmVkIGZyb21cbiAqICAgYGRlc2NyaXB0aW9uYCAoc2x1Z2lmaWVkLCB3aXRoIGEgc2hvcnQgaGFzaCBzdWZmaXggZm9yXG4gKiAgIHVuaXF1ZW5lc3MpLiBQYXNzIGFuIGV4cGxpY2l0IGBpZGAgd2hlbiB5b3UgbmVlZCBhIHN0YWJsZSBzdHJpbmdcbiAqICAgZm9yIHRyYWNpbmcgb3IgTUNQIGV4cG9zdXJlLlxuICpcbiAqIFJlYWNoIGZvciB7QGxpbmsgY3JlYXRlVG9vbH0gd2hlbiB5b3UgbmVlZCBNYXN0cmEtb25seSBmaWVsZHNcbiAqIChgb3V0cHV0U2NoZW1hYCwgYHN1c3BlbmRTY2hlbWFgLCBgcmVxdWlyZUFwcHJvdmFsYCwgYG1jcGAsIGV0Yy4pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9vbChvcHRzOiBBcHBLaXRUb29sT3B0aW9ucyk6IFRvb2wge1xuICBjb25zdCBpZCA9IG9wdHMuaWQgPz8gZGVyaXZlVG9vbElkKG9wdHMuZGVzY3JpcHRpb24pO1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQsXG4gICAgZGVzY3JpcHRpb246IG9wdHMuZGVzY3JpcHRpb24sXG4gICAgLi4uKG9wdHMuc2NoZW1hID8geyBpbnB1dFNjaGVtYTogb3B0cy5zY2hlbWEgYXMgbmV2ZXIgfSA6IHt9KSxcbiAgICBleGVjdXRlOiBvcHRzLmV4ZWN1dGUgYXMgbmV2ZXIsXG4gIH0pO1xufVxuXG4vKipcbiAqIElucHV0IHNoYXBlIGZvciB0aGUgQXBwS2l0LXN0eWxlIHtAbGluayB0b29sfSBmYWN0b3J5LiBBIHRyaW1tZWRcbiAqIHN1YnNldCBvZiBNYXN0cmEncyBgY3JlYXRlVG9vbGAgb3B0aW9ucyB0aGF0IG1pcnJvcnMgdGhlXG4gKiBgQGRhdGFicmlja3MvYXBwa2l0L2JldGFgIGB0b29sKHsgZGVzY3JpcHRpb24sIHNjaGVtYSwgZXhlY3V0ZSB9KWBcbiAqIHNpZ25hdHVyZS5cbiAqXG4gKiBHZW5lcmljcyBhcmUgaW50ZW50aW9uYWxseSBhYnNlbnQgLSBpbmZlcmVuY2UgZmxvd3MgdGhyb3VnaCB0aGVcbiAqIGNhbGxlcidzIGBzY2hlbWFgICh0eXBpY2FsbHkgYSBab2Qgb2JqZWN0KSwgYW5kIHRoZSBgZXhlY3V0ZWAgYm9keVxuICogZGVzdHJ1Y3R1cmVzIG5hdHVyYWxseSBmcm9tIHRoYXQuIFJlYWNoIGZvciB7QGxpbmsgY3JlYXRlVG9vbH0gd2hlblxuICogeW91IG5lZWQgdGhlIGZ1bGx5LXR5cGVkIGlucHV0L291dHB1dCBzY2hlbWFzIHdpcmVkIGV4cGxpY2l0bHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwS2l0VG9vbE9wdGlvbnMge1xuICAvKiogT3B0aW9uYWwgc3RhYmxlIGlkZW50aWZpZXI7IGF1dG8tZGVyaXZlZCBmcm9tIGBkZXNjcmlwdGlvbmAgd2hlbiBvbWl0dGVkLiAqL1xuICBpZD86IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIHNob3duIHRvIHRoZSBtb2RlbC4gUmVxdWlyZWQuICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBpbnB1dCBzY2hlbWEgKGFueSBTdGFuZGFyZCBTY2hlbWEgaW5zdGFuY2UsIGUuZy4gWm9kKS5cbiAgICogTWFwcyB0byBNYXN0cmEncyBgaW5wdXRTY2hlbWFgOyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgbW9kZWxcbiAgICogdmVyYmF0aW0uXG4gICAqL1xuICBzY2hlbWE/OiB1bmtub3duO1xuICAvKipcbiAgICogRXhlY3V0ZSBib2R5LiBGaXJzdCBhcmcgaXMgdGhlIHBhcnNlZCBpbnB1dCAodHlwZWQgb2ZmIGBzY2hlbWFgXG4gICAqIHdoZW4gc3VwcGxpZWQpLCBzZWNvbmQgYXJnIGlzIHRoZSBmdWxsIE1hc3RyYSBleGVjdXRpb24gY29udGV4dFxuICAgKiAocmVxdWVzdCBjb250ZXh0LCBhYm9ydCBzaWduYWwsIG1hc3RyYSBpbnN0YW5jZSkgaWYgeW91IG5lZWQgaXQuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBleGVjdXRlOiAoaW5wdXQ6IGFueSwgY29udGV4dD86IHVua25vd24pID0+IHVua25vd247XG59XG5cbi8qKlxuICogQnVpbGQgYSBkZXRlcm1pbmlzdGljIE1hc3RyYSB0b29sIGlkIGZyb20gYSBkZXNjcmlwdGlvbi5cbiAqIERlbGVnYXRlcyB0byB7QGxpbmsgc3RyaW5nLnRvVW5pcXVlU2x1Z306IHNsdWcgKyBhbHdheXMtb25cbiAqIDYtY2hhciBGTlYtMWEgYmFzZS0zMiBzdWZmaXggc28gdHdvIHRvb2xzIHdpdGggdGhlIHNhbWUgbGVhZGluZ1xuICogd29yZHMgZG9uJ3QgY29sbGlkZSBpbiB0cmFjZXMuIFN0YWJsZSBhY3Jvc3MgcnVucy5cbiAqL1xuZnVuY3Rpb24gZGVyaXZlVG9vbElkKGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3RyaW5nLnRvVW5pcXVlU2x1ZyhkZXNjcmlwdGlvbiwgeyBmYWxsYmFja1ByZWZpeDogXCJ0b29sXCIgfSk7XG59XG5cbi8qKlxuICogSWRlbnRpdHkgaGVscGVyIHRoYXQgYnJhbmRzIGEgZGVmaW5pdGlvbiBhcyBhIE1hc3RyYSBhZ2VudC4gTWlycm9yc1xuICogQXBwS2l0J3MgYGNyZWF0ZUFnZW50KGRlZilgIHNvIHRoZSByZWdpc3RyYXRpb24gc2hhcGUgbWF0Y2hlczpcbiAqXG4gKiBgYGB0c1xuICogY29uc3Qgc3VwcG9ydCA9IGNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiLFxuICogICBtb2RlbDogXCJkYXRhYnJpY2tzLWNsYXVkZS1zb25uZXQtNC02XCIsXG4gKiAgIHRvb2xzKHBsdWdpbnMpIHsgcmV0dXJuIHsgLi4uIH07IH0sXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEFkZHMgdGhlIHBhY2thZ2UncyBkZWZhdWx0IHdvcmtzcGFjZSB3aGVuIHRoZSBkZWZpbml0aW9uIG9taXRzIG9uZS4gVGhhdFxuICogd29ya3NwYWNlIGNhcnJpZXMgRGF0YWJyaWNrcyBza2lsbCBtb3VudHMgYW5kIERhdGFicmlja3MgU2FuZGJveCBjb21tYW5kXG4gKiBleGVjdXRpb24uIEFuIGV4cGxpY2l0IHdvcmtzcGFjZSByZW1haW5zIHRoZSBjYWxsZXIncyBjb21wbGV0ZSBvdmVycmlkZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFnZW50PFxuICBUUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVua25vd24gPSB1bmtub3duLFxuICBURGVmaW5pdGlvbiBleHRlbmRzIE1hc3RyYUFnZW50RGVmaW5pdGlvbjxUUmVxdWVzdENvbnRleHQ+ID1cbiAgICBNYXN0cmFBZ2VudERlZmluaXRpb248VFJlcXVlc3RDb250ZXh0Pixcbj4oZGVmOiBURGVmaW5pdGlvbik6IFREZWZpbml0aW9uIHtcbiAgaWYgKGRlZi53b3Jrc3BhY2UpIHJldHVybiB7IC4uLmRlZiB9O1xuICBjb25zdCB3b3Jrc3BhY2UgPSBjcmVhdGVXb3Jrc3BhY2UoKTtcbiAgbWFya0RlZmF1bHRXb3Jrc3BhY2Uod29ya3NwYWNlKTtcbiAgcmV0dXJuIHsgLi4uZGVmLCB3b3Jrc3BhY2UgfTtcbn1cblxuLyoqXG4gKiBCcmFuZCBmb3IgYSB7QGxpbmsgV29ya3NwYWNlfSB0aGF0IGBjcmVhdGVBZ2VudGAgYnVpbHQgd2l0aCBubyBjYWxsZXJcbiAqIG9wdGlvbnMsIHNvIHtAbGluayBidWlsZEFnZW50c30gbWF5IHJlYnVpbGQgaXQgd2l0aCBzdGFydHVwLXByb3Zpc2lvbmVkXG4gKiBgZXh0cmFTa2lsbFBhdGhzYCAoYSBjYWxsZXItc3VwcGxpZWQgd29ya3NwYWNlIGlzIG5ldmVyIHRvdWNoZWQpLlxuICovXG5jb25zdCBERUZBVUxUX1dPUktTUEFDRSA9IFN5bWJvbC5mb3IoXCJkYngtdG9vbHMvYXBwa2l0LW1hc3RyYS9kZWZhdWx0LXdvcmtzcGFjZVwiKTtcblxuLyoqIEJyYW5kIGB3b3Jrc3BhY2VgIGFzIHRoZSBhdXRvLWNyZWF0ZWQgZGVmYXVsdC4gKi9cbmZ1bmN0aW9uIG1hcmtEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZTogV29ya3NwYWNlKTogdm9pZCB7XG4gICh3b3Jrc3BhY2UgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3ltYm9sLCBib29sZWFuPilbREVGQVVMVF9XT1JLU1BBQ0VdID0gdHJ1ZTtcbn1cblxuLyoqIFdoZXRoZXIgYHdvcmtzcGFjZWAgd2FzIGF1dG8tY3JlYXRlZCBieSB7QGxpbmsgY3JlYXRlQWdlbnR9LiAqL1xuZnVuY3Rpb24gaXNEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZTogV29ya3NwYWNlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBCb29sZWFuKHdvcmtzcGFjZSAmJiAod29ya3NwYWNlIGFzIHVua25vd24gYXMgUmVjb3JkPHN5bWJvbCwgYm9vbGVhbj4pW0RFRkFVTFRfV09SS1NQQUNFXSk7XG59XG5cbi8qKlxuICogRmlsdGVyIC8gcmVuYW1lIG9wdGlvbnMgYWNjZXB0ZWQgYnkgZXZlcnkgcGx1Z2luJ3MgYC50b29sa2l0KClgXG4gKiBtZXRob2QsIGRpcmVjdGx5IHNvdXJjZWQgZnJvbSBBcHBLaXQncyBwdWJsaWMgYmV0YSBjb250cmFjdC5cbiAqL1xuZXhwb3J0IHR5cGUgVG9vbGtpdE9wdGlvbnMgPSBBcHBLaXRUb29sa2l0T3B0aW9ucztcblxuLyoqXG4gKiBUb29sa2l0IHByb3ZpZGVyIHNoYXBlIGV2ZXJ5IGVudHJ5IGluIHRoZSB7QGxpbmsgTWFzdHJhUGx1Z2luc30gbWFwXG4gKiBleHBvc2VzLiBJZGVudGljYWwgdG8gQXBwS2l0J3MgYFBsdWdpblRvb2xraXRQcm92aWRlcmAgLSBhbnkgQXBwS2l0XG4gKiBwbHVnaW4gdGhhdCBpbXBsZW1lbnRzIHRoZSBzdGFuZGFyZCBgVG9vbFByb3ZpZGVyYCBpbnRlcmZhY2VcbiAqIChgZ2V0QWdlbnRUb29sc2AgKyBgZXhlY3V0ZUFnZW50VG9vbGAgKyBgdG9vbGtpdGApIGlzIHJlYWNoYWJsZVxuICogdGhyb3VnaCB0aGlzIHN1cmZhY2UgYXV0b21hdGljYWxseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIge1xuICAvKipcbiAgICogUmV0dXJucyBhIE1hc3RyYS1zaGFwZWQgdG9vbHMgcmVjb3JkIGFkYXB0ZWQgZnJvbSB0aGUgcGx1Z2luJ3NcbiAgICogYWdlbnQgdG9vbHMuIEVhY2ggdG9vbCBkaXNwYXRjaGVzIGJhY2sgdGhyb3VnaCB0aGUgcGx1Z2luJ3NcbiAgICogYGV4ZWN1dGVBZ2VudFRvb2xgIHNvIE9CTyBhdXRoIGFuZCB0ZWxlbWV0cnkgc3BhbnMgc3RheSBpbnRhY3QuXG4gICAqL1xuICB0b29sa2l0KG9wdHM/OiBUb29sa2l0T3B0aW9ucyk6IE1hc3RyYVRvb2xzIHwgUHJvbWlzZTxNYXN0cmFUb29scz47XG59XG5cbi8qKlxuICogUGx1Z2luIG1hcCBoYW5kZWQgdG8gdGhlIGZ1bmN0aW9uIGZvcm0gb2ZcbiAqIHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb24udG9vbHN9LiBNaXJyb3JzIEFwcEtpdCdzIGBQbHVnaW5zYFxuICogdHlwZSBleGFjdGx5OiBhIHN0cmluZy1rZXllZCByZWNvcmQgd2hlcmUgZXZlcnkgdmFsdWUgZXhwb3Nlc1xuICogYC50b29sa2l0KG9wdHMpYC5cbiAqXG4gKiBJbXBsZW1lbnRlZCBhcyBhIHJ1bnRpbWUgUHJveHkgdGhhdCBhdXRvLWRpc2NvdmVycyBhbnkgcmVnaXN0ZXJlZFxuICogQXBwS2l0IHBsdWdpbiBpbXBsZW1lbnRpbmcgdGhlIHN0YW5kYXJkIGBUb29sUHJvdmlkZXJgIGludGVyZmFjZVxuICogKGBhbmFseXRpY3NgLCBgZmlsZXNgLCBgbGFrZWJhc2VgLCBgZ2VuaWVgLCBwbHVzIGFueSB0aGlyZC1wYXJ0eVxuICogcGx1Z2luIHRoYXQgZG9lcyB0aGUgc2FtZSkuIFVua25vd24gbmFtZXMgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYFxuICogYXQgcnVudGltZSwgc28gZ3VhcmQgd2l0aCBgPy5gIGFuZCBgPz8ge31gIHdoZW4gc3ByZWFkaW5nIGZyb20gYVxuICogcGx1Z2luIHRoYXQgbWF5IG5vdCBiZSByZWdpc3RlcmVkIGluIGV2ZXJ5IGVudmlyb25tZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY3JlYXRlQWdlbnQoe1xuICogICBpbnN0cnVjdGlvbnM6IFwiLi4uXCIsXG4gKiAgIGFzeW5jIHRvb2xzKHBsdWdpbnMpIHtcbiAqICAgICByZXR1cm4ge1xuICogICAgICAgLi4uKGF3YWl0IHBsdWdpbnMuYW5hbHl0aWNzLnRvb2xraXQoKSksXG4gKiAgICAgICAuLi4oYXdhaXQgcGx1Z2lucy5maWxlcy50b29sa2l0KHsgb25seTogW1widXBsb2Fkcy5yZWFkXCJdIH0pKSxcbiAqICAgICAgIGdldF93ZWF0aGVyOiB0b29sKHtcbiAqICAgICAgICAgZGVzY3JpcHRpb246IFwiV2VhdGhlclwiLFxuICogICAgICAgICBzY2hlbWE6IHoub2JqZWN0KHsgY2l0eTogei5zdHJpbmcoKSB9KSxcbiAqICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgY2l0eSB9KSA9PiBgU3VubnkgaW4gJHtjaXR5fWAsXG4gKiAgICAgICB9KSxcbiAqICAgICB9O1xuICogICB9LFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhUGx1Z2lucyA9IFJlY29yZDxzdHJpbmcsIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlcj47XG5cbi8qKiBGdW5jdGlvbiBmb3JtIG9mIHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb24udG9vbHN9LiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhVG9vbHNGbiA9IChwbHVnaW5zOiBNYXN0cmFQbHVnaW5zKSA9PiBNYXN0cmFUb29scyB8IFByb21pc2U8TWFzdHJhVG9vbHM+O1xuXG4vKiogRnVuY3Rpb24gZm9ybSBvZiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9uLndvcmtzcGFjZX07IGB1bmRlZmluZWRgIGRpc2FibGVzIGl0IGZvciB0aGlzIGFnZW50LiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhQWdlbnRXb3Jrc3BhY2VSZXNvbHZlciA9ICgpID0+IFdvcmtzcGFjZSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIGNvZGUtZGVmaW5lZCBNYXN0cmEgYWdlbnQuIE1pcnJvcnMgdGhlIHNoYXBlIEFwcEtpdCdzIGBhZ2VudHNgXG4gKiBwbHVnaW4gdXNlcyBmb3IgYEFnZW50RGVmaW5pdGlvbmAuIFRoZSByZWdpc3RyeSBrZXkgdW5kZXJcbiAqIGBjb25maWcuYWdlbnRzYCBpcyB0aGUgYGFnZW50SWRgIHRoZSBjbGllbnQgc3RyZWFtcyBhZ2FpbnN0OyBgbmFtZWBcbiAqIGlzIHB1cmVseSBpbmZvcm1hdGlvbmFsIChkZWZhdWx0cyB0byB0aGUga2V5KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXN0cmFBZ2VudERlZmluaXRpb248XG4gIFRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93biA9IHVua25vd24sXG4+IHtcbiAgLyoqIERpc3BsYXkgbmFtZSB1c2VkIGFzIGBBZ2VudC5uYW1lYC4gRGVmYXVsdHMgdG8gdGhlIHJlZ2lzdHJ5IGtleS4gKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIGxvbmctZm9ybSBkZXNjcmlwdGlvbjsgc3VyZmFjZWQgYXMgYEFnZW50LmRlc2NyaXB0aW9uYC4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBTdGF0aWMgb3IgcmVxdWVzdC1jb250ZXh0LWF3YXJlIHN5c3RlbSBpbnN0cnVjdGlvbnMuICovXG4gIGluc3RydWN0aW9uczogQWdlbnRDb25maWc8c3RyaW5nLCBUb29sc0lucHV0LCB1bmRlZmluZWQsIFRSZXF1ZXN0Q29udGV4dD5bXCJpbnN0cnVjdGlvbnNcIl07XG4gIC8qKiBOYXRpdmUgTWFzdHJhIHNjaGVtYSB0aGF0IHZhbGlkYXRlcyBhbmQgdHlwZXMgYXBwbGljYXRpb24gcmVxdWVzdCBjb250ZXh0LiAqL1xuICByZXF1ZXN0Q29udGV4dFNjaGVtYT86IEFnZW50Q29uZmlnPFxuICAgIHN0cmluZyxcbiAgICBUb29sc0lucHV0LFxuICAgIHVuZGVmaW5lZCxcbiAgICBUUmVxdWVzdENvbnRleHRcbiAgPltcInJlcXVlc3RDb250ZXh0U2NoZW1hXCJdO1xuICAvKipcbiAgICogTWFzdHJhLW5hdGl2ZSBwZXItY2FsbCBhcHByb3ZhbCBnYXRlIGZvciB0aGlzIGFnZW50J3MgdG9vbHMuIFN1cHBvcnRzIGFuXG4gICAqIGFzeW5jIENsYXNzaWZpZXItYmFja2VkIGZ1bmN0aW9uOyB0b29sLWxldmVsIGFwcHJvdmFsIHJlbWFpbnMgYXV0aG9yaXRhdGl2ZS5cbiAgICovXG4gIHJlcXVpcmVUb29sQXBwcm92YWw/OiBBZ2VudEV4ZWN1dGlvbk9wdGlvbnNbXCJyZXF1aXJlVG9vbEFwcHJvdmFsXCJdO1xuICAvKipcbiAgICogUGVyLWFnZW50IG1vZGVsIG92ZXJyaWRlLlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogZmFsbHMgYmFjayB0byB0aGUgd29ya3NwYWNlXG4gICAqICAgYC9zZXJ2aW5nLWVuZHBvaW50c2AgcmVzb2x2ZXIgdGhhdCB7QGxpbmsgYnVpbGRNb2RlbH0gY29uZmlndXJlc1xuICAgKiAgIGZyb20gdGhlIHBlci1yZXF1ZXN0IGBXb3Jrc3BhY2VDbGllbnRgLlxuICAgKiAtIGBzdHJpbmdgOiBzaG9ydGhhbmQgZm9yIFwidXNlIHRoZSBkZWZhdWx0IHJlc29sdmVyIGJ1dCBzd2FwIHRoZVxuICAgKiAgIGBtb2RlbElkYFwiIChlLmcuIGBcImRhdGFicmlja3MtbWV0YS1sbGFtYS0zLTMtNzBiLWluc3RydWN0XCJgKS5cbiAgICogLSBBbnkgb3RoZXIgTWFzdHJhIGBEeW5hbWljQXJndW1lbnQ8TWFzdHJhTW9kZWxDb25maWc+YDogcGFzc2VkXG4gICAqICAgc3RyYWlnaHQgdGhyb3VnaCB0byBgQWdlbnQubW9kZWxgLiBVc2UgdGhpcyB3aGVuIHlvdSBuZWVkIGZ1bGxcbiAgICogICBjb250cm9sIG92ZXIgYXV0aCBvciBwcm92aWRlcklkLlxuICAgKi9cbiAgbW9kZWw/OiBBZ2VudENvbmZpZzxzdHJpbmcsIFRvb2xzSW5wdXQsIHVuZGVmaW5lZCwgVFJlcXVlc3RDb250ZXh0PltcIm1vZGVsXCJdIHwgc3RyaW5nO1xuICAvKipcbiAgICogUGVyLWFnZW50IHRvb2wgcmVjb3JkLiBFaXRoZXIgYSBwbGFpbiBtYXAgb3IgYSBjYWxsYmFjayB0aGF0XG4gICAqIHJlY2VpdmVzIHRoZSB0eXBlZCB7QGxpbmsgTWFzdHJhUGx1Z2luc30gc2libGluZy1wbHVnaW4gaW5kZXggYW5kXG4gICAqIHJldHVybnMgYSBtYXAuIFRoZSBjYWxsYmFjayBydW5zIGV4YWN0bHkgb25jZSBhdCBhZ2VudCBzZXR1cDsgdGhlXG4gICAqIHJlc3VsdCBpcyBjYWNoZWQgZm9yIHRoZSBhZ2VudCdzIGxpZmV0aW1lLlxuICAgKi9cbiAgdG9vbHM/OiBNYXN0cmFUb29scyB8IE1hc3RyYVRvb2xzRm47XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgc2VtYW50aWMgcmVjYWxsIChQZ1ZlY3Rvcikgb3ZlcnJpZGUuIENhc2NhZGVzIGZyb21cbiAgICogYGNvbmZpZy5tZW1vcnlgOyB0aGUgYWdlbnQgdmFsdWUgd2lucyB3aGVuIHNldC5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCk6IGluaGVyaXQgYGNvbmZpZy5tZW1vcnlgLiBXaGVuIHRoYXQnc1xuICAgKiAgIGVuYWJsZWQsIHRoZSBhZ2VudCAqKnNoYXJlcyB0aGUgcGx1Z2luLWxldmVsIHNpbmdsZXRvbiBgUGdWZWN0b3JgXG4gICAqICAgaW5zdGFuY2UqKiAoY3Jvc3MtYWdlbnQgc2VtYW50aWMgcmVjYWxsIGFjcm9zcyB0aGUgc2FtZSBpbmRleCkuXG4gICAqIC0gYGZhbHNlYDogZGlzYWJsZSBzZW1hbnRpYyByZWNhbGwgZm9yIHRoaXMgYWdlbnQgb25seS5cbiAgICogLSBgdHJ1ZWA6IGVuYWJsZSB1c2luZyB0aGUgc2hhcmVkIHNpbmdsZXRvbiAoc2FtZSBhcyBkZWZhdWx0IHdoZW5cbiAgICogICBwbHVnaW4gbWVtb3J5IGlzIGVuYWJsZWQ7IHVzZWZ1bCB0byBvcHQgaW4gd2hlbiBwbHVnaW4gZGlzYWJsZWQpLlxuICAgKiAtIHtAbGluayBNYXN0cmFNZW1vcnlDb25maWd9IG9iamVjdDogZGVkaWNhdGVkIGBQZ1ZlY3RvcmAgZm9yIHRoaXNcbiAgICogICBhZ2VudCAocHJpdmF0ZSByZWNhbGwgaW5kZXgpLiBCeXBhc3NlcyB0aGUgc2hhcmVkIHNpbmdsZXRvbi5cbiAgICovXG4gIG1lbW9yeT86IGJvb2xlYW4gfCBNYXN0cmFNZW1vcnlDb25maWdPdmVycmlkZTtcbiAgLyoqXG4gICAqIFBlci1hZ2VudCB0aHJlYWQvbWVzc2FnZSBzdG9yYWdlIChgUG9zdGdyZXNTdG9yZWApIG92ZXJyaWRlLlxuICAgKiBDYXNjYWRlcyBmcm9tIGBjb25maWcuc3RvcmFnZWA7IHRoZSBhZ2VudCB2YWx1ZSB3aW5zIHdoZW4gc2V0LlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogaW5oZXJpdCBgY29uZmlnLnN0b3JhZ2VgLiBXaGVuIHRoYXQnc1xuICAgKiAgIGVuYWJsZWQsIHRoZSBhZ2VudCBnZXRzIGl0cyAqKm93biBwZXItYWdlbnQgYFBvc3RncmVzU3RvcmVgKipcbiAgICogICBrZXllZCBieSB7QGxpbmsgYWdlbnRTdG9yYWdlU2NoZW1hTmFtZX0gc28gdGhyZWFkcyBhbmRcbiAgICogICBtZXNzYWdlcyBzdGF5IGlzb2xhdGVkIGJldHdlZW4gYWdlbnRzIGluIHRoZSBzYW1lIGRhdGFiYXNlLlxuICAgKiAtIGBmYWxzZWA6IGRpc2FibGUgc3RvcmFnZSBmb3IgdGhpcyBhZ2VudCBvbmx5IChwdXJlbHkgaW4tbWVtb3J5KS5cbiAgICogLSBgdHJ1ZWA6IGVuYWJsZSB3aXRoIHRoZSBwZXItYWdlbnQgZGVmYXVsdCBzY2hlbWEuXG4gICAqIC0ge0BsaW5rIE1hc3RyYVN0b3JhZ2VDb25maWdPdmVycmlkZX0gb2JqZWN0OiBkZWRpY2F0ZWRcbiAgICogICBgUG9zdGdyZXNTdG9yZWAgY29uZmlnIChjdXN0b20gc2NoZW1hLCBjb25uZWN0aW9uLCBldGMuKS5cbiAgICovXG4gIHN0b3JhZ2U/OiBib29sZWFuIHwgTWFzdHJhU3RvcmFnZUNvbmZpZ092ZXJyaWRlO1xuICAvKipcbiAgICogTWFzdHJhIHtAbGluayBXb3Jrc3BhY2V9IGZvciB0aGlzIGFnZW50IChmaWxlc3lzdGVtLCBzYW5kYm94LCBvciBvdGhlclxuICAgKiBwcm92aWRlcnMpLiBBc3Npc3RhbnQgc2tpbGxzIGZyb20gRGF0YWJyaWNrcyB3b3Jrc3BhY2UgcGF0aHMgYXJlIHdpcmVkXG4gICAqIHZpYSB7QGxpbmsgY3JlYXRlV29ya3NwYWNlfS5cbiAgICovXG4gIHdvcmtzcGFjZT86IFdvcmtzcGFjZSB8IE1hc3RyYUFnZW50V29ya3NwYWNlUmVzb2x2ZXI7XG59XG5cbi8qKiBUeXBlLWVyYXNlZCByZWdpc3RyeSBtZW1iZXI7IGVhY2ggZGVmaW5pdGlvbiByZXRhaW5zIHR5cGluZyBhdCBgY3JlYXRlQWdlbnRgLiAqL1xuZXhwb3J0IHR5cGUgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uID0gTWFzdHJhQWdlbnREZWZpbml0aW9uPGFueT47XG5cbi8qKlxuICogRGlzdHJpYnV0aXZlIGBPbWl0YCBzbyB1bmlvbnMgaW4gYFBvc3RncmVzU3RvcmVDb25maWdgIC9cbiAqIGBQZ1ZlY3RvckNvbmZpZ2Aga2VlcCB0aGVpciBkaXNjcmltaW5hbnRzIGFmdGVyIHRoZSBvdmVycmlkZSB0eXBlc1xuICogc3RyaXAgYGlkYC4gVGhlIGJ1aWx0LWluIGBPbWl0YCBjb2xsYXBzZXMgdW5pb25zIHRvIG9uZSBzaGFwZSB3aXRoXG4gKiBjb21tb24gZmllbGRzIG9ubHksIHdoaWNoIGxvc2VzIHRoZSBjb25uZWN0aW9uLXN0eWxlIGRpc2NyaW1pbmFudHMuXG4gKi9cbnR5cGUgRGlzdHJpYnV0aXZlT21pdDxULCBLIGV4dGVuZHMga2V5b2YgbmV2ZXI+ID0gVCBleHRlbmRzIHVua25vd24gPyBPbWl0PFQsIEs+IDogbmV2ZXI7XG5cbi8qKlxuICogYFBvc3RncmVzU3RvcmVDb25maWdgIG1pbnVzIGBpZGAgLSBwZXItYWdlbnQgb3ZlcnJpZGVzIGFjY2VwdCBhbnlcbiAqIE1hc3RyYS1zdXBwb3J0ZWQgc3RvcmFnZSBzaGFwZS4gYGlkYCBpcyBmaWxsZWQgaW4gYXV0b21hdGljYWxseVxuICogZnJvbSB0aGUgYWdlbnQgcmVnaXN0cnkga2V5IHNvIHRyYWNlcyBzdGF5IHN0YWJsZS5cbiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhU3RvcmFnZUNvbmZpZ092ZXJyaWRlID0gRGlzdHJpYnV0aXZlT21pdDxQb3N0Z3Jlc1N0b3JlQ29uZmlnLCBcImlkXCI+ICYge1xuICBpZD86IHN0cmluZztcbn07XG5cbi8qKlxuICogYFBnVmVjdG9yQ29uZmlnYCBtaW51cyBgaWRgIC0gcGVyLWFnZW50IG92ZXJyaWRlcyBhY2NlcHQgYW55XG4gKiBNYXN0cmEtc3VwcG9ydGVkIHZlY3RvciBzaGFwZS4gYGlkYCBpcyBmaWxsZWQgaW4gYXV0b21hdGljYWxseVxuICogZnJvbSB0aGUgYWdlbnQgcmVnaXN0cnkga2V5LlxuICovXG5leHBvcnQgdHlwZSBNYXN0cmFNZW1vcnlDb25maWdPdmVycmlkZSA9IERpc3RyaWJ1dGl2ZU9taXQ8UGdWZWN0b3JDb25maWcsIFwiaWRcIj4gJiB7XG4gIGlkPzogc3RyaW5nO1xufTtcblxuLyoqIEhvdyBhbiBhZ2VudCdzIHVucGlubmVkIG1vZGVsIGlzIHJlc29sdmVkLiAqL1xuZXhwb3J0IHR5cGUgQWdlbnREZWZhdWx0TW9kZWwgPVxuICB7IGtpbmQ6IFwiYXV0b1wiIH0gfCB7IGtpbmQ6IFwiY29uZmlndXJlZFwiOyBtb2RlbDogc3RyaW5nIH0gfCB7IGtpbmQ6IFwiZHluYW1pY1wiIH07XG5cbi8qKiBPdXRwdXQgb2Yge0BsaW5rIGJ1aWxkQWdlbnRzfTogcmVzb2x2ZWQgYWdlbnRzIHBsdXMgdGhlIGRlZmF1bHQgaWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWx0QWdlbnRzIHtcbiAgYWdlbnRzOiBSZWNvcmQ8c3RyaW5nLCBBZ2VudD47XG4gIGRlZmF1bHRBZ2VudElkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEZWZhdWx0IG1vZGVsIGludGVudCBwZXIgYWdlbnQgaWQuIEFuIHVuY29uZmlndXJlZCBhZ2VudCBpcyBgXCJhdXRvXCJgIGFuZFxuICAgKiByZXNvbHZlcyB0aGUgaGlnaGVzdC1yYW5rZWQgbGl2ZSBlbmRwb2ludDsgYSBzdHJpbmcgaXMgYFwiY29uZmlndXJlZFwiYDsgYVxuICAgKiBjdXN0b20gZnVuY3Rpb24gaXMgYFwiZHluYW1pY1wiYC4gQ29uc3VtZWQgYnkgdGhlIHBsdWdpbidzXG4gICAqIGBHRVQgL2RlZmF1bHQtbW9kZWxgIHJvdXRlLlxuICAgKi9cbiAgZGVmYXVsdE1vZGVsczogUmVjb3JkPHN0cmluZywgQWdlbnREZWZhdWx0TW9kZWw+O1xuICAvKipcbiAgICogQW1iaWVudCB0b29scyBzaGFyZWQgYWNyb3NzIGV2ZXJ5IGFnZW50ICh0aGUgYnVpbHQtaW4gc3lzdGVtIHRvb2xzXG4gICAqIHNwcmVhZCB3aXRoIGBjb25maWcudG9vbHNgKS4gU3VyZmFjZWQgc28gdGhlIG9wdGlvbmFsIE1DUCBzZXJ2ZXJcbiAgICogY2FuIHJlLWV4cG9zZSB0aGVtIHdoZW4ge0BsaW5rIE1hc3RyYU1jcENvbmZpZy50b29sc30gaXMgZW5hYmxlZC5cbiAgICovXG4gIGFtYmllbnRUb29sczogTWFzdHJhVG9vbHM7XG59XG5cbi8qKiBGYWxsYmFjayBhZ2VudCBpZCB1c2VkIHdoZW4gYGNvbmZpZy5hZ2VudHNgIGlzIG9taXR0ZWQgZW50aXJlbHkuICovXG5leHBvcnQgY29uc3QgRkFMTEJBQ0tfQUdFTlRfSUQgPSBcImRlZmF1bHRcIjtcblxuLyoqXG4gKiBEZWZhdWx0IHBlci10dXJuIHN0ZXAgY2VpbGluZyBhcHBsaWVkIHRvIGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnRcbiAqIHdoZW4ge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5hZ2VudE1heFN0ZXBzfSBpcyB1bnNldC4gU2l6ZWQgdG9cbiAqIGZpdCBhIGRlY29tcG9zZWQgR2VuaWUgdHVybiAoZ3JvdW5kaW5nICsgc2V2ZXJhbCBgYXNrX2dlbmllYFxuICogY2FsbHMgKyBgcHJlcGFyZV9jaGFydGAgcGVyIGRhdGFzZXQgKyB0aGUgZmluYWwtdGV4dCByZXBseSkgd2l0aFxuICogaGVhZHJvb20gZm9yIHRoZSBtb2RlbCB0byBjaGFpbiBhIGNvdXBsZSBvZiBmb2xsb3ctdXBzIGJlZm9yZVxuICogYW5zd2VyaW5nIC0gd2VsbCBhYm92ZSBNYXN0cmEncyBvd24gYGFnZW50LmdlbmVyYXRlYCBkZWZhdWx0IG9mXG4gKiA1LCB3aGljaCB3b3VsZCBjdXQgbXVsdGktc3RlcCBvcmNoZXN0cmF0aW9uIG9mZiBtaWQtbG9vcC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQUdFTlRfTUFYX1NURVBTID0gMjU7XG5cbmNvbnN0IEZBTExCQUNLX0FHRU5UX0lOU1RSVUNUSU9OUyA9IGBZb3UgYXJlIGEgZGF0YSBhbmFseXN0LiBUaGUgdXNlciB3aWxsIGFzayBxdWVzdGlvbnMgYWJvdXRcbmJ1c2luZXNzIG1ldHJpY3MgYW5kIG1heSBzaGFyZSBwZXJzb25hbCBwcmVmZXJlbmNlcyB5b3Ugc2hvdWxkIHJlbWVtYmVyIGFjcm9zcyB0dXJucy5cblxuUnVsZXM6XG5cbjEuIFF1b3RlIG51bWJlcnMgZXhhY3RseS4gTmV2ZXIgaW52ZW50IGRhdGEuXG4yLiBXaGVuIHRoZSB1c2VyIHN0YXRlcyBhIHByZWZlcmVuY2Ugb3IgZHVyYWJsZSBmYWN0IGFib3V0IHRoZW1zZWx2ZXNcbiAgIChcIkknbSBpbiBFVSBzbyB1c2UgRVVSXCIsIFwiYWx3YXlzIHNob3cgbWUgdGhlIFNRTFwiKSwgYWNrbm93bGVkZ2UgdGhhdFxuICAgeW91IHdpbGwgcmVtZW1iZXIgaXQuXG4zLiBJZiB5b3UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gYW5zd2VyLCBhc2sgYSBjbGFyaWZ5aW5nXG4gICBxdWVzdGlvbiBpbnN0ZWFkIG9mIGd1ZXNzaW5nLmA7XG5cbi8qKlxuICogU3R5bGUgZ3VhcmRyYWlscyBhcHBlbmRlZCB0byBldmVyeSBhZ2VudCdzIGBpbnN0cnVjdGlvbnNgIHRvIGN1cmJcbiAqIGNvbW1vbiBMTE0taXNtcyAoZW0gZGFzaGVzLCBlbW9qaXMsIHN5Y29waGFudGljIG9wZW5lcnMsIGV4Y2Vzc2l2ZVxuICogaGVkZ2luZywgdGhyb3dhd2F5IGNsb3NlcnMpLiBBcHBlbmRlZCByYXRoZXIgdGhhbiBwcmVwZW5kZWQgc28gdGhlXG4gKiBhZ2VudCdzIHJvbGUvY29udGV4dCBjb21lcyBmaXJzdDsgdGhlIG1vZGVsJ3MgcmVjZW5jeSBiaWFzIHRoZW5cbiAqIGhlbHBzIHRoZSBzdHlsZSBydWxlcyBkb21pbmF0ZSB0aGUgcmVzcG9uc2Ugc3VyZmFjZS5cbiAqXG4gKiBPdmVycmlkZSBnbG9iYWxseSB2aWEge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5zdHlsZUluc3RydWN0aW9uc31cbiAqIChwYXNzIGBmYWxzZWAgdG8gZGlzYWJsZSBlbnRpcmVseSwgb3IgYSBzdHJpbmcgdG8gcmVwbGFjZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OUyA9IFtcbiAgXCJPdXRwdXQgc3R5bGU6XCIsXG4gIFwiXCIsXG4gIFwiVXNlIG1hcmtkb3duIGZvcm1hdHRpbmcsIGluY2x1ZGluZyBoZWFkaW5ncywgbGlzdHMsIGFuZCBjb2RlIGJsb2Nrcy5cIixcbiAgXCJBdm9pZCBsaXN0cyBhbmQgaGVhZGVycyBmb3Igc2hvcnQgcmVwbGllcy5cIixcbiAgXCJQbGFpbiBwcm9zZS5cIixcbiAgVFlQT0dSQVBIWV9SVUxFLFxuICBcIlNraXAgb3BlbmVycyBsaWtlICdHcmVhdCBxdWVzdGlvbicsICdBYnNvbHV0ZWx5JywgYW5kICdJJ2QgYmUgaGFwcHkgdG8gaGVscCcuXCIsXG4gIFwiU2tpcCBjbG9zZXJzIGxpa2UgJ0xldCBtZSBrbm93IGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMnLlwiLFxuICBcIlNraXAgc2VsZi1kaXNjbGFpbWVycyBsaWtlICdJIHNob3VsZCBtZW50aW9uJyBhbmQgJ0l0J3MgaW1wb3J0YW50IHRvIG5vdGUnLlwiLFxuICBcIkFuc3dlciBkaXJlY3RseS5cIixcbiAgXCJEbyBub3QgaW5jbHVkZSBhIHByZWFtYmxlIGJlZm9yZSB0aGUgYWN0dWFsIGFuc3dlci5cIixcbiAgXCJVc2UgbGlzdHMgYW5kIGhlYWRlcnMgb25seSB3aGVuIHRoZXkgY2xhcmlmeSBhIG11bHRpLXBhcnQgYW5zd2VyLlwiLFxuXS5qb2luKFwiXFxuXCIpO1xuXG4vKipcbiAqIFJlc29sdmUgdGhlIHN0eWxlIGJsb2NrIHRvIGFwcGVuZCB0byBldmVyeSBhZ2VudCdzIGluc3RydWN0aW9ucy5cbiAqIFJldHVybnMgYG51bGxgIHdoZW4gdGhlIGNhbGxlciBvcHRlZCBvdXQgKGBzdHlsZUluc3RydWN0aW9uczogZmFsc2VgKS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVN0eWxlSW5zdHJ1Y3Rpb25zKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChjb25maWcuc3R5bGVJbnN0cnVjdGlvbnMgPT09IGZhbHNlKSByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiBjb25maWcuc3R5bGVJbnN0cnVjdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gY29uZmlnLnN0eWxlSW5zdHJ1Y3Rpb25zO1xuICB9XG5cbiAgcmV0dXJuIERFRkFVTFRfU1RZTEVfSU5TVFJVQ1RJT05TO1xufVxuXG4vKiogQXBwZW5kIHRoZSBzdHlsZSBibG9jayB3aXRob3V0IG5hcnJvd2luZyBNYXN0cmEncyBuYXRpdmUgaW5zdHJ1Y3Rpb24gc2hhcGVzLiAqL1xuZnVuY3Rpb24gYXBwZW5kU3R5bGVJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogQWdlbnRJbnN0cnVjdGlvbnMsXG4gIHN0eWxlOiBzdHJpbmcgfCBudWxsLFxuKTogQWdlbnRJbnN0cnVjdGlvbnMge1xuICBpZiAoIXN0eWxlKSByZXR1cm4gaW5zdHJ1Y3Rpb25zO1xuICBpZiAodHlwZW9mIGluc3RydWN0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBgJHtpbnN0cnVjdGlvbnMudHJpbUVuZCgpfVxcblxcbiR7c3R5bGV9YDtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShpbnN0cnVjdGlvbnMpKSB7XG4gICAgaWYgKGluc3RydWN0aW9ucy5ldmVyeSgoaW5zdHJ1Y3Rpb24pID0+IHR5cGVvZiBpbnN0cnVjdGlvbiA9PT0gXCJzdHJpbmdcIikpIHtcbiAgICAgIHJldHVybiBbLi4uaW5zdHJ1Y3Rpb25zLCBzdHlsZV0gYXMgQWdlbnRJbnN0cnVjdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiBbLi4uaW5zdHJ1Y3Rpb25zLCB7IHJvbGU6IFwic3lzdGVtXCIsIGNvbnRlbnQ6IHN0eWxlIH1dIGFzIEFnZW50SW5zdHJ1Y3Rpb25zO1xuICB9XG4gIHJldHVybiBbaW5zdHJ1Y3Rpb25zLCB7IHJvbGU6IFwic3lzdGVtXCIsIGNvbnRlbnQ6IHN0eWxlIH1dIGFzIEFnZW50SW5zdHJ1Y3Rpb25zO1xufVxuXG4vKipcbiAqIENvbXBvc2Ugc3RhdGljIG9yIHJlcXVlc3QtY29udGV4dC1hd2FyZSBpbnN0cnVjdGlvbnMgd2l0aCB0aGUgc2hhcmVkIHN0eWxlXG4gKiBwb2xpY3kgd2hpbGUgcHJlc2VydmluZyBNYXN0cmEncyBuYXRpdmUgZ2VuZXJpYyBpbmZlcmVuY2UuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VJbnN0cnVjdGlvbnM8VFJlcXVlc3RDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmtub3duPihcbiAgYWdlbnRJbnN0cnVjdGlvbnM6IEFnZW50Q29uZmlnPHN0cmluZywgVG9vbHNJbnB1dCwgdW5kZWZpbmVkLCBUUmVxdWVzdENvbnRleHQ+W1wiaW5zdHJ1Y3Rpb25zXCJdLFxuICBzdHlsZTogc3RyaW5nIHwgbnVsbCxcbik6IEFnZW50Q29uZmlnPHN0cmluZywgVG9vbHNJbnB1dCwgdW5kZWZpbmVkLCBUUmVxdWVzdENvbnRleHQ+W1wiaW5zdHJ1Y3Rpb25zXCJdIHtcbiAgaWYgKHR5cGVvZiBhZ2VudEluc3RydWN0aW9ucyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGFwcGVuZFN0eWxlSW5zdHJ1Y3Rpb25zKGFnZW50SW5zdHJ1Y3Rpb25zLCBzdHlsZSkgYXMgQWdlbnRDb25maWc8XG4gICAgICBzdHJpbmcsXG4gICAgICBUb29sc0lucHV0LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgVFJlcXVlc3RDb250ZXh0XG4gICAgPltcImluc3RydWN0aW9uc1wiXTtcbiAgfVxuICByZXR1cm4gKGFzeW5jIChhcmdzKSA9PlxuICAgIGFwcGVuZFN0eWxlSW5zdHJ1Y3Rpb25zKGF3YWl0IGFnZW50SW5zdHJ1Y3Rpb25zKGFyZ3MpLCBzdHlsZSkpIGFzIEFnZW50Q29uZmlnPFxuICAgIHN0cmluZyxcbiAgICBUb29sc0lucHV0LFxuICAgIHVuZGVmaW5lZCxcbiAgICBUUmVxdWVzdENvbnRleHRcbiAgPltcImluc3RydWN0aW9uc1wiXTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZWQgZGVzY3JpcHRpb24gZm9yIGFuIGFnZW50IHdob3NlIGRlZmluaXRpb24gb21pdHMgb25lLiBLZXB0XG4gKiBnZW5lcmljICh0aGUgYWdlbnQncyBvd24gbmFtZSBpcyB0aGUgb25seSByZWxpYWJsZSBzaWduYWwgYXQgYnVpbGRcbiAqIHRpbWUpIHNvIGl0IHJlYWRzIHNlbnNpYmx5IGFzIHRoZSBgYXNrXzxpZD5gIE1DUCB0b29sJ3MgZGVzY3JpcHRpb25cbiAqIGFuZCBpbiBhZ2VudCBtZXRhZGF0YS5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdEFnZW50RGVzY3JpcHRpb24obmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBDb252ZXJzYXRpb25hbCBBSSBhZ2VudCBcIiR7bmFtZX1cIi5gO1xufVxuXG4vKipcbiAqIFJlc29sdmUgZXZlcnkgZW50cnkgaW4gYGNvbmZpZy5hZ2VudHNgIGludG8gYSBNYXN0cmEgYEFnZW50YFxuICogaW5zdGFuY2UuIFdoZW4gYGNvbmZpZy5hZ2VudHNgIGlzIG9taXR0ZWQgdGhlIHBsdWdpbiByZWdpc3RlcnMgYVxuICogc2luZ2xlIGJ1aWx0LWluIGBkZWZhdWx0YCBhbmFseXN0IHNvIHRoZSBiYXJlIGBtYXN0cmEoKWAgY2FsbCBzdGlsbFxuICogeWllbGRzIGEgd29ya2luZyBhZ2VudC5cbiAqXG4gKiBQZXItYWdlbnQgdG9vbCBjYWxsYmFja3MgYXJlIGludm9rZWQgb25jZSB3aXRoIGEgdHlwZWRcbiAqIHtAbGluayBNYXN0cmFQbHVnaW5zfSBpbmRleCBidWlsdCBmcm9tIHJlZ2lzdGVyZWQgc2libGluZyBwbHVnaW5zXG4gKiAoY3VycmVudGx5IGBnZW5pZWA7IGV4dGVuZCBgTWFzdHJhUGx1Z2luc2AgdG8gc3VyZmFjZSBtb3JlKS5cbiAqXG4gKiBAdGhyb3dzIHdoZW4gYGNvbmZpZy5kZWZhdWx0QWdlbnRgIGlzIHNldCB0byBhbiBpZCB0aGF0IGlzbid0IGluIHRoZVxuICogICByZXNvbHZlZCByZWdpc3RyeTsgdGhpcyBpcyBhIHdpcmluZyBidWcsIG5vdCBhIHJ1bnRpbWUgY29uZGl0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRBZ2VudHMob3B0czoge1xuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZztcbiAgY29udGV4dDogcGx1Z2luLlBsdWdpbkNvbnRleHRMaWtlIHwgdW5kZWZpbmVkO1xuICBtZW1vcnlCdWlsZGVyPzogTWVtb3J5QnVpbGRlcjtcbiAgbG9nOiBsb2cuTG9nZ2VyO1xuICAvKipcbiAgICogTG9jYWwgc2tpbGwgc2NhbiBwYXRocyAocmVtb3RlIHNraWxscyBwcm92aXNpb25lZCB0byBhIHRlbXAgZGlyIGF0XG4gICAqIHN0YXJ0dXApIGZvbGRlZCBpbnRvIGV2ZXJ5IGFnZW50IHRoYXQgdXNlcyB0aGUgYXV0by1jcmVhdGVkIGRlZmF1bHRcbiAgICogd29ya3NwYWNlLlxuICAgKi9cbiAgZXh0cmFTa2lsbFBhdGhzPzogc3RyaW5nW107XG59KTogUHJvbWlzZTxCdWlsdEFnZW50cz4ge1xuICBjb25zdCB7IGNvbmZpZywgY29udGV4dCwgbWVtb3J5QnVpbGRlciwgbG9nLCBleHRyYVNraWxsUGF0aHMgfSA9IG9wdHM7XG4gIGNvbnN0IGRlZmluaXRpb25zID0gcmVzb2x2ZURlZmluaXRpb25zKGNvbmZpZyk7XG4gIGNvbnN0IGlkcyA9IE9iamVjdC5rZXlzKGRlZmluaXRpb25zKTtcbiAgY29uc3QgZGVmYXVsdEFnZW50SWQgPSBjb25maWcuZGVmYXVsdEFnZW50ID8/IGlkc1swXSA/PyBGQUxMQkFDS19BR0VOVF9JRDtcblxuICBjb25zdCBwbHVnaW5zID0gYnVpbGRQbHVnaW5zTWFwKGNvbmZpZywgY29udGV4dCk7XG4gIC8vIFN5c3RlbS1kZWZhdWx0IGFtYmllbnQgdG9vbHMgZXZlcnkgYWdlbnQgZ2V0cyBvdXQgb2YgdGhlIGJveDpcbiAgLy8gYHJlbmRlcl9kYXRhYCBmb3IgaW5saW5lIHZpc3VhbGl6YXRpb25zIGFuZCBgc3VtbWFyaXplYCBmb3JcbiAgLy8gb2ZmbG9hZGluZyB0ZXh0IGNvbmRlbnNpbmcgdG8gdGhlIGZhc3QgLyBzbWFsbCBjaGF0IHRpZXIuIFRoZVxuICAvLyB1c2VyIGNhbiBzaGFkb3cgZWl0aGVyIGJ5IGluY2x1ZGluZyBhIHNhbWUtbmFtZWQgdG9vbCBpbiB0aGVpciBvd25cbiAgLy8gYGNvbmZpZy50b29sc2Agb3IgcGVyLWFnZW50IGB0b29sc2AuIE9yZGVyIGluIHtAbGluayByZXNvbHZlVG9vbHN9XG4gIC8vIGlzIGBzeXN0ZW0gLT4gdXNlci1hbWJpZW50IC0+IHBlci1hZ2VudGAsIGxhc3Qgd3JpdGUgd2lucy5cbiAgY29uc3Qgc3lzdGVtVG9vbHM6IE1hc3RyYVRvb2xzID0ge1xuICAgIHJlbmRlcl9kYXRhOiBidWlsZFJlbmRlckRhdGFUb29sKGNvbmZpZyksXG4gICAgc3VtbWFyaXplOiBidWlsZFN1bW1hcml6ZVRvb2woY29uZmlnKSxcbiAgfTtcbiAgY29uc3QgYW1iaWVudFRvb2xzID0ge1xuICAgIC4uLnN5c3RlbVRvb2xzLFxuICAgIC4uLihjb25maWcudG9vbHMgPz8ge30pLFxuICB9O1xuICBjb25zdCBzdHlsZSA9IHJlc29sdmVTdHlsZUluc3RydWN0aW9ucyhjb25maWcpO1xuICAvLyBEZWZhdWx0LW9uIHByb3RlY3Rpb24gYWdhaW5zdCB0aGUgbW9kZWwgY29weWluZyB0dXJuLXNjb3BlZFxuICAvLyBjaGFydElkcyBmcm9tIHByaW9yIGFzc2lzdGFudCB0b29sIHJlc3VsdHMgaW50byB0aGUgbmV3XG4gIC8vIHR1cm4ncyBgW2NoYXJ0OjxpZD5dYCBtYXJrZXJzLiBPcHQgb3V0IHBlci1wbHVnaW4gdmlhXG4gIC8vIGBjb25maWcuc3RyaXBTdGFsZUNoYXJ0czogZmFsc2VgLlxuICBjb25zdCBpbnB1dFByb2Nlc3NvcnMgPSBbXG4gICAgLi4uKGNvbmZpZy5zdHJpcFN0YWxlQ2hhcnRzID09PSBmYWxzZSA/IFtdIDogW3N0cmlwU3RhbGVDaGFydHNQcm9jZXNzb3JdKSxcbiAgXTtcbiAgY29uc3QgYWdlbnRzOiBSZWNvcmQ8c3RyaW5nLCBBZ2VudD4gPSB7fTtcbiAgY29uc3QgZGVmYXVsdE1vZGVsczogUmVjb3JkPHN0cmluZywgQWdlbnREZWZhdWx0TW9kZWw+ID0ge307XG4gIGNvbnN0IGFwcHJvdmFsR2F0ZWRCeUFnZW50OiBBcnJheTx7IGFnZW50SWQ6IHN0cmluZzsgdG9vbElkczogc3RyaW5nW10gfT4gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtpZCwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhkZWZpbml0aW9ucykpIHtcbiAgICBjb25zdCB0b29scyA9IGF3YWl0IHJlc29sdmVUb29scyhkZWYudG9vbHMsIHBsdWdpbnMsIGFtYmllbnRUb29scyk7XG4gICAgbGV0IHdvcmtzcGFjZSA9IHJlc29sdmVBZ2VudFdvcmtzcGFjZShkZWYud29ya3NwYWNlKTtcbiAgICBpZiAoXG4gICAgICAoZGVmLndvcmtzcGFjZSA9PT0gdW5kZWZpbmVkICYmICF3b3Jrc3BhY2UpIHx8XG4gICAgICAoKGV4dHJhU2tpbGxQYXRocz8ubGVuZ3RoIHx8IGNvbmZpZy5zYW5kYm94ICE9PSB1bmRlZmluZWQpICYmIGlzRGVmYXVsdFdvcmtzcGFjZSh3b3Jrc3BhY2UpKVxuICAgICkge1xuICAgICAgd29ya3NwYWNlID0gY3JlYXRlV29ya3NwYWNlKHtcbiAgICAgICAgZXh0cmFTa2lsbFBhdGhzLFxuICAgICAgICBzYW5kYm94OlxuICAgICAgICAgIGNvbmZpZy5zYW5kYm94ID09PSB1bmRlZmluZWQgfHwgY29uZmlnLnNhbmRib3ggPT09IHRydWUgPyBcImRhdGFicmlja3NcIiA6IGNvbmZpZy5zYW5kYm94LFxuICAgICAgfSk7XG4gICAgICBtYXJrRGVmYXVsdFdvcmtzcGFjZSh3b3Jrc3BhY2UpO1xuICAgIH1cbiAgICBjb25zdCBnYXRlZCA9IGFwcHJvdmFsR2F0ZWRUb29sSWRzKHRvb2xzKTtcbiAgICBpZiAoZ2F0ZWQubGVuZ3RoID4gMCkgYXBwcm92YWxHYXRlZEJ5QWdlbnQucHVzaCh7IGFnZW50SWQ6IGlkLCB0b29sSWRzOiBnYXRlZCB9KTtcbiAgICBjb25zdCBtZW1vcnkgPSBtZW1vcnlCdWlsZGVyPy5mb3JBZ2VudChpZCwgZGVmKTtcbiAgICBhZ2VudHNbaWRdID0gbmV3IEFnZW50KHtcbiAgICAgIGlkLFxuICAgICAgbmFtZTogZGVmLm5hbWUgPz8gaWQsXG4gICAgICAvLyBBbHdheXMgY2FycnkgYSBub24tZW1wdHkgZGVzY3JpcHRpb246IGl0J3Mgc3VyZmFjZWQgdG8gTUNQXG4gICAgICAvLyBjbGllbnRzICh3aGljaCByZWplY3QgYSBkZXNjcmlwdGlvbi1sZXNzIGFnZW50KSBhbmQgaW4gYWdlbnRcbiAgICAgIC8vIG1ldGFkYXRhLiBGYWxsIGJhY2sgdG8gYSBnZW5lcmF0ZWQgb25lIHdoZW4gdGhlIGRlZmluaXRpb25cbiAgICAgIC8vIG9taXRzIGl0LlxuICAgICAgZGVzY3JpcHRpb246IGRlZi5kZXNjcmlwdGlvbj8udHJpbSgpIHx8IGRlZmF1bHRBZ2VudERlc2NyaXB0aW9uKGRlZi5uYW1lID8/IGlkKSxcbiAgICAgIGluc3RydWN0aW9uczogY29tcG9zZUluc3RydWN0aW9ucyhkZWYuaW5zdHJ1Y3Rpb25zLCBzdHlsZSksXG4gICAgICAuLi4oZGVmLnJlcXVlc3RDb250ZXh0U2NoZW1hID8geyByZXF1ZXN0Q29udGV4dFNjaGVtYTogZGVmLnJlcXVlc3RDb250ZXh0U2NoZW1hIH0gOiB7fSksXG4gICAgICBtb2RlbDogcmVzb2x2ZU1vZGVsKGNvbmZpZywgZGVmLm1vZGVsKSxcbiAgICAgIGRlZmF1bHRPcHRpb25zOiB7XG4gICAgICAgIG1heFN0ZXBzOiBjb25maWcuYWdlbnRNYXhTdGVwcyA/PyBERUZBVUxUX0FHRU5UX01BWF9TVEVQUyxcbiAgICAgICAgcHJvdmlkZXJPcHRpb25zOiBSRVNQT05TRVNfUFJPVklERVJfT1BUSU9OUyxcbiAgICAgICAgLi4uKGRlZi5yZXF1aXJlVG9vbEFwcHJvdmFsICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHsgcmVxdWlyZVRvb2xBcHByb3ZhbDogZGVmLnJlcXVpcmVUb29sQXBwcm92YWwgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSxcbiAgICAgIHRvb2xzLFxuICAgICAgLi4uKG1lbW9yeSA/IHsgbWVtb3J5IH0gOiB7fSksXG4gICAgICAuLi4od29ya3NwYWNlID8geyB3b3Jrc3BhY2UgfSA6IHt9KSxcbiAgICAgIGlucHV0UHJvY2Vzc29ycyxcbiAgICB9KTtcbiAgICAvLyBTdXJmYWNlIHRoZSBlZmZlY3RpdmUgZGVmYXVsdCBtb2RlbCBwZXIgYWdlbnQgc28gb3BlcmF0b3JzIGNhblxuICAgIC8vIHNlZSBhdCBhIGdsYW5jZSB3aGljaCBlbmRwb2ludCBlYWNoIGFnZW50IHBvaW50cyBhdCB3aXRob3V0XG4gICAgLy8gaGF2aW5nIHRvIGZpcmUgYSByZXF1ZXN0IGFuZCBpbnNwZWN0IGEgdHJhY2UuIFRoZSB2YWx1ZSBpcyB0aGVcbiAgICAvLyAqc3RhdGljKiBkZWZhdWx0OyBwZXItcmVxdWVzdCBvdmVycmlkZXMgKGhlYWRlciAvIHF1ZXJ5IC9cbiAgICAvLyBib2R5KSBhbmQgdGhlIHdvcmtzcGFjZS1jYXRhbG9ndWUgZnV6enkgbWF0Y2ggc3RpbGwgYXBwbHkgYXRcbiAgICAvLyBjYWxsIHRpbWUuXG4gICAgY29uc3QgZGVmYXVsdE1vZGVsID0gZGVzY3JpYmVBZ2VudERlZmF1bHRNb2RlbChjb25maWcsIGRlZik7XG4gICAgZGVmYXVsdE1vZGVsc1tpZF0gPSBkZWZhdWx0TW9kZWw7XG4gICAgbG9nLmluZm8oXCJhZ2VudCByZWdpc3RlcmVkXCIsIHtcbiAgICAgIGlkLFxuICAgICAgbmFtZTogZGVmLm5hbWUgPz8gaWQsXG4gICAgICBkZWZhdWx0TW9kZWw6XG4gICAgICAgIGRlZmF1bHRNb2RlbC5raW5kID09PSBcImNvbmZpZ3VyZWRcIiA/IGRlZmF1bHRNb2RlbC5tb2RlbCA6IGA8JHtkZWZhdWx0TW9kZWwua2luZH0+YCxcbiAgICAgIHRvb2xzOiBPYmplY3Qua2V5cyh0b29scyksXG4gICAgfSk7XG4gIH1cblxuICBpZiAoIWFnZW50c1tkZWZhdWx0QWdlbnRJZF0pIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgIGBtYXN0cmEgZGVmYXVsdEFnZW50IFwiJHtkZWZhdWx0QWdlbnRJZH1cImAsXG4gICAgICBgUmVnaXN0ZXJlZCBhZ2VudHM6ICR7aWRzLmpvaW4oXCIsIFwiKSB8fCBcIm5vbmVcIn0uYCxcbiAgICApO1xuICB9XG5cbiAgYXNzZXJ0QXBwcm92YWxHYXRlZFRvb2xzSGF2ZVN0b3JhZ2UoYXBwcm92YWxHYXRlZEJ5QWdlbnQsIG1lbW9yeUJ1aWxkZXIpO1xuXG4gIGxvZy5pbmZvKFwiYWdlbnRzIHJlYWR5XCIsIHsgaWRzLCBkZWZhdWx0QWdlbnRJZCB9KTtcbiAgcmV0dXJuIHsgYWdlbnRzLCBkZWZhdWx0QWdlbnRJZCwgZGVmYXVsdE1vZGVscywgYW1iaWVudFRvb2xzIH07XG59XG5cbi8qKlxuICogVG9vbCBpZHMgb24gYHRvb2xzYCB0aGF0IGFyZSBhcHByb3ZhbC1nYXRlZCAoYHJlcXVpcmVBcHByb3ZhbDogdHJ1ZWApLlxuICogS2V5cyBhcmUgdXNlZCBhcyBhIGZhbGxiYWNrIHdoZW4gYSB0b29sIG9taXRzIGFuIGV4cGxpY2l0IGBpZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHByb3ZhbEdhdGVkVG9vbElkcyh0b29sczogTWFzdHJhVG9vbHMpOiBzdHJpbmdbXSB7XG4gIGlmICghdG9vbHMgfHwgdHlwZW9mIHRvb2xzICE9PSBcIm9iamVjdFwiKSByZXR1cm4gW107XG4gIHJldHVybiBbXG4gICAgLi4ub2JqZWN0XG4gICAgICAuc2VxdWVuY2UoT2JqZWN0LmVudHJpZXModG9vbHMpKVxuICAgICAgLmZpbHRlcigoWywgdG9vbF0pID0+IGlzQXBwcm92YWxHYXRlZFRvb2wodG9vbCkpXG4gICAgICAubWFwKChba2V5LCB0b29sXSkgPT4gcmVzb2x2ZVRvb2xJZCh0b29sLCBrZXkpKSxcbiAgXTtcbn1cblxuLyoqIFRydWUgd2hlbiBhIE1hc3RyYSAvIEFJIFNESyB0b29sIHBhdXNlcyBmb3IgaHVtYW4gYXBwcm92YWwgYmVmb3JlIGV4ZWN1dGUuICovXG5mdW5jdGlvbiBpc0FwcHJvdmFsR2F0ZWRUb29sKHRvb2w6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCF0b29sIHx8IHR5cGVvZiB0b29sICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAodG9vbCBhcyB7IHJlcXVpcmVBcHByb3ZhbD86IGJvb2xlYW4gfSkucmVxdWlyZUFwcHJvdmFsID09PSB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlVG9vbElkKHRvb2w6IHVua25vd24sIGZhbGxiYWNrS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAodG9vbCAmJiB0eXBlb2YgdG9vbCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgKHRvb2wgYXMgeyBpZD86IHN0cmluZyB9KS5pZCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiAodG9vbCBhcyB7IGlkOiBzdHJpbmcgfSkuaWQ7XG4gIH1cbiAgcmV0dXJuIGZhbGxiYWNrS2V5O1xufVxuXG4vKipcbiAqIEFwcHJvdmFsLWdhdGVkIHRvb2xzIHN1c3BlbmQgdGhlIGFnZW50IGxvb3AgdW50aWwgYSBodW1hbiBhcHByb3Zlcy5cbiAqIE1hc3RyYSBwZXJzaXN0cyB0aG9zZSBzdXNwZW5kZWQgcnVucyBpbiBNYXN0cmEtaW5zdGFuY2UtbGV2ZWwgc3RvcmFnZVxuICogKGBtZW1vcnlCdWlsZGVyLmluc3RhbmNlU3RvcmFnZSgpYCksIG5vdCBwZXItYWdlbnQgbWVtb3J5IC0gc28gYm9vdFxuICogbXVzdCBmYWlsIGZhc3Qgd2hlbiBzdWNoIGEgdG9vbCBpcyByZWdpc3RlcmVkIHdpdGhvdXQgc3RvcmFnZS5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0QXBwcm92YWxHYXRlZFRvb2xzSGF2ZVN0b3JhZ2UoXG4gIGdhdGVkOiBBcnJheTx7IGFnZW50SWQ6IHN0cmluZzsgdG9vbElkczogc3RyaW5nW10gfT4sXG4gIG1lbW9yeUJ1aWxkZXI6IE1lbW9yeUJ1aWxkZXIgfCB1bmRlZmluZWQsXG4pOiB2b2lkIHtcbiAgaWYgKGdhdGVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICBpZiAobWVtb3J5QnVpbGRlcj8uaW5zdGFuY2VTdG9yYWdlKCkpIHJldHVybjtcblxuICBjb25zdCBkZXRhaWwgPSBnYXRlZFxuICAgIC5tYXAoKHsgYWdlbnRJZCwgdG9vbElkcyB9KSA9PiBgJHthZ2VudElkfTogJHt0b29sSWRzLmpvaW4oXCIsIFwiKX1gKVxuICAgIC5qb2luKFwiOyBcIik7XG4gIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgXCJtYXN0cmE6IGFwcHJvdmFsLWdhdGVkIHRvb2xzIHJlcXVpcmUgcGx1Z2luIHN0b3JhZ2UgKFBvc3RncmVzU3RvcmUpIHRvIHBlcnNpc3Qgc3VzcGVuZGVkIHJ1bnMuIFwiICtcbiAgICAgIGBBZmZlY3RlZCBhZ2VudHMvdG9vbHM6ICR7ZGV0YWlsfS4gYCArXG4gICAgICBcIlJlZ2lzdGVyIGxha2ViYXNlKCkgYmVmb3JlIG1hc3RyYSgpIHNvIHN0b3JhZ2UgYXV0by1lbmFibGVzLCBvciBwYXNzIHN0b3JhZ2U6IHRydWUgZXhwbGljaXRseS5cIixcbiAgKTtcbn1cblxuLyoqXG4gKiBEZXNjcmliZSBob3cgYW4gYWdlbnQgcmVzb2x2ZXMgaXRzIHVucGlubmVkIG1vZGVsOlxuICpcbiAqICAgMS4gUGVyLWFnZW50IGBkZWYubW9kZWxgIChzdHJpbmcgc3VnYXIgaXMgY29uZmlndXJlZDsgYSBmdW5jdGlvbiBpc1xuICogICAgICBkeW5hbWljKS5cbiAqICAgMi4gUGx1Z2luLWxldmVsIGBjb25maWcuZGVmYXVsdE1vZGVsYCAoc2FtZSBydWxlcykuXG4gKiAgIDMuIGBEQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRWAgZW52IHZhci5cbiAqICAgNC4gQXV0b21hdGljIGxpdmUtY2F0YWxvZ3VlIHJhbmtpbmcgd2hlbiBub25lIGlzIHNldC5cbiAqXG4gKiBVc2VkIGZvciB0aGUgc3RhcnR1cCBgYWdlbnQgcmVnaXN0ZXJlZGAgbG9nIHNvIG9wZXJhdG9ycyBjYW4gc2VlXG4gKiBgZGVmYXVsdE1vZGVsRmFsbGJhY2tzYCByZW1haW5zIGFuIG9wZXJhdG9yLXBpbm5lZCBjYW5kaWRhdGUgbGlzdCBpbnNpZGUgdGhlXG4gKiBhdXRvbWF0aWMgbGl2ZSBsb29rdXA7IGl0IGlzIG5vdCBhZHZlcnRpc2VkIGFzIGEgbW9kZWwgdW50aWwgYXZhaWxhYmlsaXR5IGlzXG4gKiBjaGVja2VkLlxuICovXG5mdW5jdGlvbiBkZXNjcmliZUFnZW50RGVmYXVsdE1vZGVsKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgZGVmOiBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24sXG4pOiBBZ2VudERlZmF1bHRNb2RlbCB7XG4gIGNvbnN0IGVmZmVjdGl2ZSA9IGRlZi5tb2RlbCA/PyBjb25maWcuZGVmYXVsdE1vZGVsO1xuICBpZiAodHlwZW9mIGVmZmVjdGl2ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHsga2luZDogXCJjb25maWd1cmVkXCIsIG1vZGVsOiBlZmZlY3RpdmUgfTtcbiAgaWYgKGVmZmVjdGl2ZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4geyBraW5kOiBcImR5bmFtaWNcIiB9O1xuICBjb25zdCBlbnZpcm9ubWVudCA9IHByb2Nlc3MuZW52LkRBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FO1xuICByZXR1cm4gZW52aXJvbm1lbnQgPyB7IGtpbmQ6IFwiY29uZmlndXJlZFwiLCBtb2RlbDogZW52aXJvbm1lbnQgfSA6IHsga2luZDogXCJhdXRvXCIgfTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgYGNvbmZpZy5hZ2VudHNgIGludG8gYSBgUmVjb3JkPGlkLCBkZWZpbml0aW9uPmAuIEFjY2VwdHNcbiAqIGFueSBvZiB0aGUgdGhyZWUgc2hhcGVzIGRvY3VtZW50ZWQgb25cbiAqIHtAbGluayBNYXN0cmFQbHVnaW5Db25maWcuYWdlbnRzfTpcbiAqXG4gKiAtIFJlY29yZCAtIHJldHVybmVkIGFzLWlzIHdoZW4gbm9uLWVtcHR5LlxuICogLSBTaW5nbGUgZGVmaW5pdGlvbiAoZGV0ZWN0ZWQgdmlhIHRoZSByZXF1aXJlZCBgaW5zdHJ1Y3Rpb25zYFxuICogICBmaWVsZCkgLSBrZXllZCBieSBgc2x1Z2lmeShkZWYubmFtZSlgIG9yIGBGQUxMQkFDS19BR0VOVF9JRGAuXG4gKiAtIEFycmF5IC0ga2V5ZWQgYnkgYHNsdWdpZnkoZGVmLm5hbWUpYCBvciBgYWdlbnRfJHtpfWA7IGR1cGxpY2F0ZVxuICogICBzbHVncyBmYWlsIGxvdWRseSBzbyB1c2VycyBrbm93IHRvIHNldCBleHBsaWNpdCBuYW1lcy5cbiAqXG4gKiBPbWl0dGVkIG9yIGVtcHR5IGlucHV0cyBmYWxsIGJhY2sgdG8gYSBzaW5nbGUgYnVpbHQtaW4gYW5hbHlzdCBzb1xuICogdGhlIGJhcmUgYG1hc3RyYSgpYCBjYWxsIHN0aWxsIG1vdW50cyBhIHdvcmtpbmcgY2hhdCByb3V0ZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZURlZmluaXRpb25zKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogUmVjb3JkPHN0cmluZywgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uPiB7XG4gIGNvbnN0IGlucHV0ID0gY29uZmlnLmFnZW50cztcbiAgaWYgKCFpbnB1dCkgcmV0dXJuIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICBpZiAoaW5wdXQubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsbGJhY2tEZWZpbml0aW9ucygpO1xuICAgIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uPiA9IHt9O1xuICAgIGlucHV0LmZvckVhY2goKGRlZiwgaSkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gZGVyaXZlQWdlbnRLZXkoZGVmLCBpKTtcbiAgICAgIGlmIChvdXRba2V5XSkge1xuICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgICAgICAgIGBtYXN0cmE6IGR1cGxpY2F0ZSBhZ2VudCBpZCBcIiR7a2V5fVwiIGRlcml2ZWQgZnJvbSBuYW1lIFwiJHtkZWYubmFtZSA/PyBcIlwifVwiOyBgICtcbiAgICAgICAgICAgIGBzZXQgdW5pcXVlIFxcYG5hbWVcXGBzIG9uIGVhY2ggZGVmaW5pdGlvbmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBvdXRba2V5XSA9IGRlZjtcbiAgICB9KTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLy8gU2luZ2xlLWRlZmluaXRpb24gc2hvcnRoYW5kOiBhbiBhZ2VudCBvd25zIHRoZSByZXF1aXJlZCBgaW5zdHJ1Y3Rpb25zYFxuICAvLyBmaWVsZCAoc3RhdGljIG9yIGR5bmFtaWMpOyBhIHJlY29yZC1vZi1hZ2VudHMgbmV2ZXIgb3ducyBpdCBkaXJlY3RseS5cbiAgaWYgKFwiaW5zdHJ1Y3Rpb25zXCIgaW4gaW5wdXQpIHtcbiAgICBjb25zdCBkZWYgPSBpbnB1dCBhcyBBbnlNYXN0cmFBZ2VudERlZmluaXRpb247XG4gICAgY29uc3Qga2V5ID0gZGVyaXZlQWdlbnRLZXkoZGVmKTtcbiAgICByZXR1cm4geyBba2V5XTogZGVmIH07XG4gIH1cblxuICBjb25zdCByZWNvcmQgPSBpbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24+O1xuICBpZiAoT2JqZWN0LmtleXMocmVjb3JkKS5sZW5ndGggPT09IDApIHJldHVybiBmYWxsYmFja0RlZmluaXRpb25zKCk7XG4gIHJldHVybiByZWNvcmQ7XG59XG5cbi8qKiBEZXJpdmUgYSByZWdpc3RyeSBpZCBmcm9tIGEgZGVmaW5pdGlvbidzIGBuYW1lYCwgd2l0aCBhIGZhbGxiYWNrLiAqL1xuZnVuY3Rpb24gZGVyaXZlQWdlbnRLZXkoZGVmOiBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24sIGluZGV4PzogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGRlZi5uYW1lKSB7XG4gICAgY29uc3Qgc2x1ZyA9IHN0cmluZy50b0lkZW50aWZpZXIoZGVmLm5hbWUpO1xuICAgIGlmIChzbHVnKSByZXR1cm4gc2x1ZztcbiAgfVxuICByZXR1cm4gaW5kZXggPT09IHVuZGVmaW5lZCA/IEZBTExCQUNLX0FHRU5UX0lEIDogYGFnZW50XyR7aW5kZXh9YDtcbn1cblxuLyoqIEJ1aWx0LWluIGZhbGxiYWNrIHJlZ2lzdHJ5IHVzZWQgd2hlbiBgYWdlbnRzYCBpcyBvbWl0dGVkIC8gZW1wdHkuICovXG5mdW5jdGlvbiBmYWxsYmFja0RlZmluaXRpb25zKCk6IFJlY29yZDxzdHJpbmcsIEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbj4ge1xuICByZXR1cm4ge1xuICAgIFtGQUxMQkFDS19BR0VOVF9JRF06IHtcbiAgICAgIG5hbWU6IFwiRGVmYXVsdCBBZ2VudFwiLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBGQUxMQkFDS19BR0VOVF9JTlNUUlVDVElPTlMsXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSBlZmZlY3RpdmUgbW9kZWwgc3BlYyBmb3IgYW4gYWdlbnQuIEZhbGxiYWNrIGxhZGRlciwgaW5cbiAqIG9yZGVyOlxuICpcbiAqICAgMS4gUGVyLWFnZW50IGBkZWYubW9kZWxgIChzdHJpbmcgc3VnYXIgb3IgYER5bmFtaWNBcmd1bWVudGApLlxuICogICAyLiBQbHVnaW4tbGV2ZWwgYGNvbmZpZy5kZWZhdWx0TW9kZWxgIChzdHJpbmcgc3VnYXIgb3JcbiAqICAgICAgYER5bmFtaWNBcmd1bWVudGApIC0gbWlycm9ycyBBcHBLaXQncyBgYWdlbnRzKHsgZGVmYXVsdE1vZGVsIH0pYC5cbiAqICAgMy4gVGhlIGF1dG8tcmVzb2x2ZXIgdGhhdCBtaW50cyB1c2VyLXNjb3BlZCB0b2tlbnMgYWdhaW5zdFxuICogICAgICBgL3NlcnZpbmctZW5kcG9pbnRzYCB2aWEge0BsaW5rIGJ1aWxkTW9kZWx9LlxuICpcbiAqIFN0cmluZyB2YWx1ZXMgYXJlIHRyZWF0ZWQgYXMgYG1vZGVsSWRgIHN1Z2FyIGFuZCB0aHJlYWRlZCB0aHJvdWdoXG4gKiBgYnVpbGRNb2RlbGAncyBvdmVycmlkZSBob29rIHNvIHRoZSBydW50aW1lIGZ1enp5IG1hdGNoZXIgYW5kIHRoZVxuICogcGVyLXJlcXVlc3QgYFgtTWFzdHJhLU1vZGVsYCBvdmVycmlkZSBsYXllciBvbiB0b3Agb2YgdGhlIHN0YXRpY1xuICogY2hvaWNlLiBOb24tc3RyaW5nIGBEeW5hbWljQXJndW1lbnRgcyBhcmUgcGFzc2VkIHRocm91Z2ggdmVyYmF0aW07XG4gKiBjYWxsZXJzIHRoYXQgbmVlZCBmdWxsIGNvbnRyb2wgb3ZlciBgcHJvdmlkZXJJZGAgLyBgaGVhZGVyc2AgL1xuICogYG1vZGVsSWRgIGJ5cGFzcyB0aGUgcmVzb2x2ZXIgcGlwZWxpbmUgZW50aXJlbHkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVNb2RlbChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIG92ZXJyaWRlOiBBbnlNYXN0cmFBZ2VudERlZmluaXRpb25bXCJtb2RlbFwiXSxcbik6IEFnZW50Q29uZmlnW1wibW9kZWxcIl0ge1xuICBjb25zdCBlZmZlY3RpdmUgPSBvdmVycmlkZSA/PyBjb25maWcuZGVmYXVsdE1vZGVsO1xuICBpZiAoZWZmZWN0aXZlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gKHsgcmVxdWVzdENvbnRleHQgfSkgPT4gYnVpbGRNb2RlbChjb25maWcsIHJlcXVlc3RDb250ZXh0KTtcbiAgfVxuICBpZiAodHlwZW9mIGVmZmVjdGl2ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IG1vZGVsSWQgPSBlZmZlY3RpdmU7XG4gICAgcmV0dXJuICh7IHJlcXVlc3RDb250ZXh0IH0pID0+IGJ1aWxkTW9kZWwoY29uZmlnLCByZXF1ZXN0Q29udGV4dCwgeyBtb2RlbElkIH0pO1xuICB9XG4gIHJldHVybiBlZmZlY3RpdmU7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGRlZmluaXRpb24ncyBgdG9vbHNgIGZpZWxkIHRvIGEgZmxhdCBgTWFzdHJhVG9vbHNgIHJlY29yZCxcbiAqIG1lcmdpbmcgaW4gcGx1Z2luLWxldmVsIGFtYmllbnQgdG9vbHMgKHBlci1hZ2VudCB0b29scyB3aW4gb24ga2V5XG4gKiBjb2xsaXNpb24pLiBDYWxsYmFjayBlcnJvcnMgcHJvcGFnYXRlIHZlcmJhdGltIHNvIHRoZSBvcmlnaW5hbCBzdGFja1xuICogc3Vydml2ZXMgLSB0aGUgY2FsbGVyIGFscmVhZHkga25vd3Mgd2hpY2ggYWdlbnQgd2FzIHJlZ2lzdGVyaW5nLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlVG9vbHMoXG4gIGRlZlRvb2xzOiBBbnlNYXN0cmFBZ2VudERlZmluaXRpb25bXCJ0b29sc1wiXSxcbiAgcGx1Z2luczogTWFzdHJhUGx1Z2lucyxcbiAgYW1iaWVudFRvb2xzOiBNYXN0cmFUb29scyxcbik6IFByb21pc2U8TWFzdHJhVG9vbHM+IHtcbiAgaWYgKCFkZWZUb29scykgcmV0dXJuIHsgLi4uYW1iaWVudFRvb2xzIH07XG4gIGNvbnN0IHJlc29sdmVkID0gdHlwZW9mIGRlZlRvb2xzID09PSBcImZ1bmN0aW9uXCIgPyBhd2FpdCBkZWZUb29scyhwbHVnaW5zKSA6IGRlZlRvb2xzO1xuICByZXR1cm4geyAuLi5hbWJpZW50VG9vbHMsIC4uLnJlc29sdmVkIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVBZ2VudFdvcmtzcGFjZShcbiAgd29ya3NwYWNlOiBBbnlNYXN0cmFBZ2VudERlZmluaXRpb25bXCJ3b3Jrc3BhY2VcIl0sXG4pOiBXb3Jrc3BhY2UgfCB1bmRlZmluZWQge1xuICBpZiAoIXdvcmtzcGFjZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHR5cGVvZiB3b3Jrc3BhY2UgPT09IFwiZnVuY3Rpb25cIiA/IHdvcmtzcGFjZSgpIDogd29ya3NwYWNlO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSB7QGxpbmsgTWFzdHJhUGx1Z2luc30gcnVudGltZSBwcm94eSBoYW5kZWQgdG9cbiAqIGB0b29scyhwbHVnaW5zKWAgY2FsbGJhY2tzLlxuICpcbiAqIEltcGxlbWVudGVkIGFzIGEgYFByb3h5YCBvdmVyIHRoZSBBcHBLaXQgcGx1Z2luIGNvbnRleHQgc29cbiAqIGBwbHVnaW5zLjxuYW1lPmAgcmVzb2x2ZXMgYXQgZmlyc3QgYWNjZXNzLiBBbnkgc2libGluZyBwbHVnaW4gdGhhdFxuICogaW1wbGVtZW50cyBBcHBLaXQncyBzdGFuZGFyZCBgVG9vbFByb3ZpZGVyYCBpbnRlcmZhY2VcbiAqIChgdG9vbGtpdChvcHRzPylgICsgYGV4ZWN1dGVBZ2VudFRvb2wobmFtZSwgYXJncywgc2lnbmFsPywgY29udGV4dD8pYCkgaXNcbiAqIGF1dG8tYWRhcHRlZCBpbnRvIE1hc3RyYSB0b29scy4gVW5rbm93biBuYW1lcyByZXR1cm4gYHVuZGVmaW5lZGAsXG4gKiBtYXRjaGluZyBBcHBLaXQncyBgUGx1Z2luc2Agc2VtYW50aWNzIHNvIGBwbHVnaW5zLmZvbz8udG9vbGtpdCgpYFxuICogcmVtYWlucyBzYWZlIGluIGVudmlyb25tZW50cyB3aGVyZSBgZm9vYCBpc24ndCByZWdpc3RlcmVkLlxuICpcbiAqIGBnZW5pZWAgaXMgc3BlY2lhbC1jYXNlZCB0byBzd2FwIHRoZSBnZW5lcmljIEFwcEtpdCB0b29sa2l0ICh3aGljaFxuICogcnVucyBgZXhlY3V0ZUFnZW50VG9vbGAgYW5kIG9ubHkgZW1pdHMgYSBzaW5nbGUgZmluYWwgYHRvb2wtcmVzdWx0YFxuICogY2h1bmsgcGVyIGNhbGwpIGZvciB0aGUgc3RyZWFtaW5nLWF3YXJlIHRvb2xzIGJ1aWx0IGJ5XG4gKiB7QGxpbmsgYnVpbGRHZW5pZVRvb2xraXRQcm92aWRlcn0uIFRoZSBzdHJlYW1pbmcgdmFyaWFudCBmb3J3YXJkcyBlYWNoXG4gKiBHZW5pZSB3aXJlIGV2ZW50IChzdGF0dXMsIFNRTCwgcm93IGNvdW50cywgZXJyb3JzKSBvdXQgdGhyb3VnaCB0aGVcbiAqIE1hc3RyYSBgY3R4LndyaXRlcmAsIHNvIHRoZSBVSSBnZXRzIGB0b29sLW91dHB1dGAgY2h1bmtzIGluIHJlYWxcbiAqIHRpbWUgaW5zdGVhZCBvZiBzdGFyaW5nIGF0IGEgc3Bpbm5lciBmb3IgdGhlIGZ1bGwgR2VuaWUgcm91bmQtdHJpcC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRQbHVnaW5zTWFwKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgY29udGV4dDogcGx1Z2luLlBsdWdpbkNvbnRleHRMaWtlIHwgdW5kZWZpbmVkLFxuKTogTWFzdHJhUGx1Z2lucyB7XG4gIGNvbnN0IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciB8IG51bGw+KCk7XG4gIHJldHVybiBuZXcgUHJveHkoe30gYXMgTWFzdHJhUGx1Z2lucywge1xuICAgIGdldChfdGFyZ2V0LCBwcm9wTmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wTmFtZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGlmIChjYWNoZS5oYXMocHJvcE5hbWUpKSByZXR1cm4gY2FjaGUuZ2V0KHByb3BOYW1lKSA/PyB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBwcm92aWRlciA9IHJlc29sdmVQcm92aWRlcihjb25maWcsIGNvbnRleHQsIHByb3BOYW1lKTtcbiAgICAgIGNhY2hlLnNldChwcm9wTmFtZSwgcHJvdmlkZXIpO1xuICAgICAgcmV0dXJuIHByb3ZpZGVyID8/IHVuZGVmaW5lZDtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSByaWdodCB7QGxpbmsgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyfSBmb3IgYSBzaWJsaW5nXG4gKiBwbHVnaW4gbG9va3VwLiBSZXR1cm5zIHRoZSBHZW5pZSBhZ2VudC1iYWNrZWQgYWRhcHRlciB3aGVuXG4gKiB0aGUgY2FsbGVyIGFza3MgZm9yIGBnZW5pZWAgQU5EIGF0IGxlYXN0IG9uZSBzcGFjZSBpcyByZWFjaGFibGVcbiAqIHZpYSB7QGxpbmsgcmVzb2x2ZUdlbmllU3BhY2VzfSAodGhlIGV4cGxpY2l0XG4gKiBgY29uZmlnLmdlbmllU3BhY2VzYCwgdGhlIHJlZ2lzdGVyZWQgQXBwS2l0IGBnZW5pZSgpYCBwbHVnaW4nc1xuICogYHNwYWNlc2AgY29uZmlnLCBvciB0aGUgYERBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSURgIGVudiB2YXIpLlxuICogRmFsbHMgYmFjayB0byB0aGUgZ2VuZXJpYyBBcHBLaXQgYFRvb2xQcm92aWRlcmAgYWRhcHRlciBmb3JcbiAqIGV2ZXJ5IG90aGVyIHBsdWdpbiBuYW1lLiBgY29uZmlnYCBpcyB0aHJlYWRlZCB0aHJvdWdoIHNvIHRoZVxuICogR2VuaWUgYWdlbnQgaW5oZXJpdHMgdGhlIHNhbWUgbW9kZWwgcmVzb2x2ZXIgLyBmYWxsYmFja1xuICogbGFkZGVyIHRoZSBjYWxsaW5nIGFnZW50cyB1c2UuXG4gKlxuICogVGhlIEdlbmllIHRvb2xzIHRhbGsgdG8gR2VuaWUgZGlyZWN0bHkgdGhyb3VnaCBgQGRieC10b29scy9nZW5pZWBcbiAqIChgZ2VuaWVFdmVudENoYXRgKSBhbmQgdGhlIHdvcmtzcGFjZSBgc3RhdGVtZW50RXhlY3V0aW9uLmdldFN0YXRlbWVudGBcbiAqIEFQSTsgQXBwS2l0J3Mgc3RvY2sgYGdlbmllYCBwbHVnaW4gY29udHJpYnV0ZXMgb25seSBpdHMgcmVzb3VyY2VcbiAqIG1hbmlmZXN0IGFuZCBgc3BhY2VzYCBjb25maWcsIHNvIGFuIGBhcHAueWFtbGAgcmVzb3VyY2UgYmluZGluZyBhbmQgYVxuICogYGdlbmllKHsgc3BhY2VzIH0pYCByZWNvcmQgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nIGhlcmUgYXMgdGhleSBkbyB0aGVyZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVByb3ZpZGVyKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgY29udGV4dDogcGx1Z2luLlBsdWdpbkNvbnRleHRMaWtlIHwgdW5kZWZpbmVkLFxuICBwcm9wTmFtZTogc3RyaW5nLFxuKTogTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyIHwgbnVsbCB7XG4gIGlmIChwcm9wTmFtZSA9PT0gXCJnZW5pZVwiKSB7XG4gICAgY29uc3Qgc3BhY2VzID0gcmVzb2x2ZUdlbmllU3BhY2VzKGNvbmZpZywgY29udGV4dCk7XG4gICAgaWYgKE9iamVjdC5rZXlzKHNwYWNlcykubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gYnVpbGRHZW5pZVRvb2xraXRQcm92aWRlcih7XG4gICAgICBzcGFjZXMsXG4gICAgICBjb25maWcsXG4gICAgfSkgYXMgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyO1xuICB9XG4gIGNvbnN0IHBsdWdpbiA9IGNvbnRleHQ/LmdldFBsdWdpbnMoKS5nZXQocHJvcE5hbWUpO1xuICByZXR1cm4gYWRhcHRQbHVnaW5Ub29sa2l0KHBsdWdpbiwgcHJvcE5hbWUpO1xufVxuXG50eXBlIENvbnRleHR1YWxUb29sUHJvdmlkZXIgPSBQYXJ0aWFsPFBpY2s8VG9vbFByb3ZpZGVyLCBcImdldEFnZW50VG9vbHNcIj4+ICYge1xuICB0b29sa2l0PzogKFxuICAgIG9wdHM/OiBUb29sa2l0T3B0aW9ucyxcbiAgKSA9PlxuICAgIHwgUmV0dXJuVHlwZTxQbHVnaW5Ub29sa2l0UHJvdmlkZXJbXCJ0b29sa2l0XCJdPlxuICAgIHwgUHJvbWlzZTxSZXR1cm5UeXBlPFBsdWdpblRvb2xraXRQcm92aWRlcltcInRvb2xraXRcIl0+PjtcbiAgZXhlY3V0ZUFnZW50VG9vbD86IChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgYXJnczogdW5rbm93bixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgICBjb250ZXh0PzogeyByZXNvdXJjZUlkPzogc3RyaW5nIH0sXG4gICkgPT4gUHJvbWlzZTx1bmtub3duPjtcbn07XG5cbi8qKlxuICogQWRhcHQgYW4gQXBwS2l0IGBUb29sUHJvdmlkZXJgIHBsdWdpbiBpbnN0YW5jZSBpbnRvIGFcbiAqIHtAbGluayBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXJ9LiBSZXR1cm5zIGBudWxsYCBmb3IgYW55IHBsdWdpblxuICogdGhhdCBkb2Vzbid0IGltcGxlbWVudCBgZXhlY3V0ZUFnZW50VG9vbGAgcGx1cyBlaXRoZXIgQXBwS2l0J3MgbmF0aXZlXG4gKiBgdG9vbGtpdGAgb3IgYGdldEFnZW50VG9vbHNgIHN1cmZhY2UuXG4gKi9cbmZ1bmN0aW9uIGFkYXB0UGx1Z2luVG9vbGtpdChcbiAgcGx1Z2luOiB1bmtub3duLFxuICBwbHVnaW5OYW1lOiBzdHJpbmcsXG4pOiBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIgfCBudWxsIHtcbiAgaWYgKCFwbHVnaW4gfHwgdHlwZW9mIHBsdWdpbiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHAgPSBwbHVnaW4gYXMgQ29udGV4dHVhbFRvb2xQcm92aWRlcjtcbiAgaWYgKFxuICAgIHR5cGVvZiBwLmV4ZWN1dGVBZ2VudFRvb2wgIT09IFwiZnVuY3Rpb25cIiB8fFxuICAgICh0eXBlb2YgcC50b29sa2l0ICE9PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIHAuZ2V0QWdlbnRUb29scyAhPT0gXCJmdW5jdGlvblwiKVxuICApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHRvb2xraXQob3B0cz86IFRvb2xraXRPcHRpb25zKTogTWFzdHJhVG9vbHMgfCBQcm9taXNlPE1hc3RyYVRvb2xzPiB7XG4gICAgICBjb25zdCBlbnRyaWVzID1cbiAgICAgICAgdHlwZW9mIHAudG9vbGtpdCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBwLnRvb2xraXQob3B0cylcbiAgICAgICAgICA6IHRvb2xraXRFbnRyaWVzRnJvbURlZmluaXRpb25zKHBsdWdpbk5hbWUsIHAuZ2V0QWdlbnRUb29scyEoKSwgb3B0cyk7XG4gICAgICBpZiAoaXNQcm9taXNlTGlrZShlbnRyaWVzKSkge1xuICAgICAgICByZXR1cm4gZW50cmllcy50aGVuKChyZXNvbHZlZCkgPT4gdG9vbGtpdEVudHJpZXNUb01hc3RyYVRvb2xzKHJlc29sdmVkLCBwKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdG9vbGtpdEVudHJpZXNUb01hc3RyYVRvb2xzKGVudHJpZXMsIHApO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRvb2xraXRFbnRyaWVzRnJvbURlZmluaXRpb25zKFxuICBwbHVnaW5OYW1lOiBzdHJpbmcsXG4gIGRlZmluaXRpb25zOiBBZ2VudFRvb2xEZWZpbml0aW9uW10sXG4gIG9wdGlvbnM6IFRvb2xraXRPcHRpb25zID0ge30sXG4pOiBSZWNvcmQ8c3RyaW5nLCBUb29sa2l0RW50cnk+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBkZWZpbml0aW9ucy5mbGF0TWFwKChkZWZpbml0aW9uKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSB0b29sa2l0TmFtZShkZWZpbml0aW9uLm5hbWUsIHBsdWdpbk5hbWUsIG9wdGlvbnMpO1xuICAgICAgaWYgKGtleSA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgW1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBfX3Rvb2xraXRSZWY6IHRydWUgYXMgY29uc3QsXG4gICAgICAgICAgICBwbHVnaW5OYW1lLFxuICAgICAgICAgICAgbG9jYWxOYW1lOiBkZWZpbml0aW9uLm5hbWUsXG4gICAgICAgICAgICBkZWY6IHsgLi4uZGVmaW5pdGlvbiwgbmFtZToga2V5IH0sXG4gICAgICAgICAgICBhbm5vdGF0aW9uczogZGVmaW5pdGlvbi5hbm5vdGF0aW9ucyxcbiAgICAgICAgICB9IHNhdGlzZmllcyBUb29sa2l0RW50cnksXG4gICAgICAgIF0sXG4gICAgICBdO1xuICAgIH0pLFxuICApO1xufVxuXG5mdW5jdGlvbiB0b29sa2l0TmFtZShcbiAgbG9jYWxOYW1lOiBzdHJpbmcsXG4gIHBsdWdpbk5hbWU6IHN0cmluZyxcbiAgb3B0aW9uczogVG9vbGtpdE9wdGlvbnMsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKG9wdGlvbnMub25seSAmJiAhb3B0aW9ucy5vbmx5LmluY2x1ZGVzKGxvY2FsTmFtZSkpIHJldHVybiBudWxsO1xuICBpZiAob3B0aW9ucy5leGNlcHQ/LmluY2x1ZGVzKGxvY2FsTmFtZSkpIHJldHVybiBudWxsO1xuICBjb25zdCByZW5hbWVkID0gb3B0aW9ucy5yZW5hbWU/Lltsb2NhbE5hbWVdO1xuICBpZiAocmVuYW1lZCkgcmV0dXJuIHJlbmFtZWQ7XG4gIHJldHVybiBgJHtvcHRpb25zLnByZWZpeCA/PyBgJHtwbHVnaW5OYW1lfS5gfSR7bG9jYWxOYW1lfWA7XG59XG5cbmZ1bmN0aW9uIGlzUHJvbWlzZUxpa2U8VD4odmFsdWU6IFQgfCBQcm9taXNlPFQ+KTogdmFsdWUgaXMgUHJvbWlzZTxUPiB7XG4gIHJldHVybiB0eXBlb2YgKHZhbHVlIGFzIHsgdGhlbj86IHVua25vd24gfSk/LnRoZW4gPT09IFwiZnVuY3Rpb25cIjtcbn1cblxuZnVuY3Rpb24gdG9vbGtpdEVudHJpZXNUb01hc3RyYVRvb2xzKFxuICBlbnRyaWVzOiBSZWNvcmQ8c3RyaW5nLCBUb29sa2l0RW50cnk+LFxuICBwbHVnaW46IENvbnRleHR1YWxUb29sUHJvdmlkZXIsXG4pOiBNYXN0cmFUb29scyB7XG4gIGNvbnN0IHRvb2xzOiBNYXN0cmFUb29scyA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhlbnRyaWVzKSkge1xuICAgIHRvb2xzW2tleV0gPSB0b29sa2l0RW50cnlUb01hc3RyYVRvb2woZW50cnksIHBsdWdpbik7XG4gIH1cbiAgcmV0dXJuIHRvb2xzO1xufVxuXG4vKipcbiAqIFdyYXAgYSBzaW5nbGUge0BsaW5rIEFwcEtpdFRvb2xraXRFbnRyeX0gYXMgYSBNYXN0cmEgdG9vbCB3aG9zZVxuICogYGV4ZWN1dGVgIGRpc3BhdGNoZXMgYmFjayB0aHJvdWdoIGBwbHVnaW4uZXhlY3V0ZUFnZW50VG9vbCguLi4pYCBzb1xuICogQXBwS2l0J3MgT0JPIGF1dGggKGBhc1VzZXJgKSwgdGVsZW1ldHJ5IHNwYW5zLCBhbmQgdGhlIE1hc3RyYSBtZW1vcnkgcmVzb3VyY2VcbiAqIGlkIHN0YXkgaW50YWN0LiBKU09OIFNjaGVtYSBwYXJhbWV0ZXJzIHBhc3MgdGhyb3VnaCB1bmNoYW5nZWQgLSBNYXN0cmEnc1xuICogYFB1YmxpY1NjaGVtYWAgYWNjZXB0cyBgSlNPTlNjaGVtYTdgIGRpcmVjdGx5IHZpYSBgQG1hc3RyYS9zY2hlbWEtY29tcGF0YC5cbiAqL1xuZnVuY3Rpb24gdG9vbGtpdEVudHJ5VG9NYXN0cmFUb29sKGVudHJ5OiBUb29sa2l0RW50cnksIHBsdWdpbjogQ29udGV4dHVhbFRvb2xQcm92aWRlcik6IFRvb2wge1xuICBjb25zdCBhbm5vdGF0aW9ucyA9IGVudHJ5LmFubm90YXRpb25zID8/IGVudHJ5LmRlZi5hbm5vdGF0aW9ucztcbiAgY29uc3QgZWZmZWN0ID0gYW5ub3RhdGlvbnM/LmVmZmVjdDtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiBgJHtlbnRyeS5wbHVnaW5OYW1lfV9fJHtlbnRyeS5sb2NhbE5hbWV9YCxcbiAgICBkZXNjcmlwdGlvbjogZW50cnkuZGVmLmRlc2NyaXB0aW9uLFxuICAgIC4uLihlbnRyeS5kZWYucGFyYW1ldGVycyA/IHsgaW5wdXRTY2hlbWE6IGVudHJ5LmRlZi5wYXJhbWV0ZXJzIGFzIG5ldmVyIH0gOiB7fSksXG4gICAgLi4uKGVmZmVjdCAmJiBlZmZlY3QgIT09IFwicmVhZFwiID8geyByZXF1aXJlQXBwcm92YWw6IHRydWUgfSA6IHt9KSxcbiAgICAuLi4oYW5ub3RhdGlvbnNcbiAgICAgID8ge1xuICAgICAgICAgIG1jcDoge1xuICAgICAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICAgICAgcmVhZE9ubHlIaW50OiBlZmZlY3QgPT09IFwicmVhZFwiIHx8IGFubm90YXRpb25zLnJlYWRPbmx5ID09PSB0cnVlLFxuICAgICAgICAgICAgICBkZXN0cnVjdGl2ZUhpbnQ6IGVmZmVjdCA9PT0gXCJkZXN0cnVjdGl2ZVwiIHx8IGFubm90YXRpb25zLmRlc3RydWN0aXZlID09PSB0cnVlLFxuICAgICAgICAgICAgICBpZGVtcG90ZW50SGludDogYW5ub3RhdGlvbnMuaWRlbXBvdGVudCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0OiB1bmtub3duLCBjb250ZXh0OiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBleGVjdXRpb24gPSBjb250ZXh0IGFzXG4gICAgICAgIHwge1xuICAgICAgICAgICAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0PzogeyBnZXQoa2V5OiBzdHJpbmcpOiB1bmtub3duIH07XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJlc291cmNlSWQgPSBleGVjdXRpb24/LnJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1JFU09VUkNFX0lEX0tFWSk7XG4gICAgICByZXR1cm4gcGx1Z2luLmV4ZWN1dGVBZ2VudFRvb2whKGVudHJ5LmxvY2FsTmFtZSwgaW5wdXQsIGV4ZWN1dGlvbj8uYWJvcnRTaWduYWwsIHtcbiAgICAgICAgLi4uKHR5cGVvZiByZXNvdXJjZUlkID09PSBcInN0cmluZ1wiID8geyByZXNvdXJjZUlkIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn1cbiJdfQ==
629
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FnZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQVF4RCxPQUFPLEVBQVUsT0FBTyxJQUFJLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JFLE9BQU8sRUFBTyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFPN0QsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXRFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUloRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFakQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRTNFLE9BQU8sRUFBRSxVQUFVLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFtQmxELHlFQUF5RTtBQUN6RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFaEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThCRztBQUNILE1BQU0sVUFBVSxJQUFJLENBQUMsSUFBdUI7SUFDMUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUs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Q0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBbUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDL0UsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RELEdBQUcsQ0FBQyxXQUFXO1lBQ2IsQ0FBQyxDQUFDO2dCQUNFLEdBQUcsRUFBRTtvQkFDSCxXQUFXLEVBQUU7d0JBQ1gsWUFBWSxFQUFFLE1BQU0sS0FBSyxNQUFNLElBQUksV0FBVyxDQUFDLFFBQVEsS0FBSyxJQUFJO3dCQUNoRSxlQUFlLEVBQUUsTUFBTSxLQUFLLGFBQWEsSUFBSSxXQUFXLENBQUMsV0FBVyxLQUFLLElBQUk7d0JBQzdFLGNBQWMsRUFBRSxXQUFXLENBQUMsVUFBVTtxQkFDdkM7aUJBQ0Y7YUFDRjtZQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQWMsRUFBRSxPQUFnQixFQUFFLEVBQUU7WUFDbEQsTUFBTSxTQUFTLEdBQUcsT0FLTCxDQUFDO1lBQ2QsTUFBTSxVQUFVLEdBQUcsU0FBUyxFQUFFLGNBQWMsRUFBRSxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUMxRSxPQUFPLE1BQU0sQ0FBQyxnQkFBaUIsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFO2dCQUM5RSxHQUFHLENBQUMsT0FBTyxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDMUQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFnZW50IHJlZ2lzdHJhdGlvbiBmb3IgdGhlIE1hc3RyYSBBcHBLaXQgcGx1Z2luLlxuICpcbiAqIE1pcnJvcnMgdGhlIHNoYXBlIG9mIHRoZSBBcHBLaXQgYGFnZW50c2AgcGx1Z2luIChgY29uZmlnLmFnZW50c2AgbWFwXG4gKiBvZiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9ufSwgZHVhbC1mb3JtIGB0b29sc2AgYWNjZXB0aW5nIGEgcGxhaW5cbiAqIHJlY29yZCBvciBhIGAocGx1Z2lucykgPT4gdG9vbHNgIGNhbGxiYWNrKS4gUmVzb2x2ZXMgZWFjaCBkZWZpbml0aW9uXG4gKiBpbnRvIGEgTWFzdHJhIGBBZ2VudGAgaW5zdGFuY2UgZHVyaW5nIHBsdWdpbiBzZXR1cDsgdXNlci1zdXBwbGllZFxuICogdG9vbCBjYWxsYmFja3MgYXJlIGludm9rZWQgZXhhY3RseSBvbmNlIHdpdGggYSB0eXBlZFxuICoge0BsaW5rIE1hc3RyYVBsdWdpbnN9IG1hcCBidWlsdCBmcm9tIHJlZ2lzdGVyZWQgc2libGluZyBwbHVnaW5zLlxuICpcbiAqIFdoZW4gbm8gYWdlbnRzIGFyZSByZWdpc3RlcmVkIHRoZSBwbHVnaW4gZmFsbHMgYmFjayB0byBhIHNpbmdsZVxuICogYnVpbHQtaW4gYW5hbHlzdCBzbyB0aGUgYmFyZSBgbWFzdHJhKClgIGNhbGwgc3RpbGwgbW91bnRzIGEgd29ya2luZ1xuICogc3RyZWFtYWJsZSBhZ2VudCBmb3IgZGVtb3MuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHtcbiAgQWdlbnRUb29sRGVmaW5pdGlvbixcbiAgUGx1Z2luVG9vbGtpdFByb3ZpZGVyLFxuICBUb29sa2l0RW50cnksXG4gIFRvb2xraXRPcHRpb25zIGFzIEFwcEtpdFRvb2xraXRPcHRpb25zLFxuICBUb29sUHJvdmlkZXIsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvYmV0YVwiO1xuaW1wb3J0IHsgcGx1Z2luLCB0b29sa2l0IGFzIGFwcGtpdFRvb2xraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGxvZywgb2JqZWN0LCBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUge1xuICBBZ2VudENvbmZpZyxcbiAgQWdlbnRFeGVjdXRpb25PcHRpb25zLFxuICBBZ2VudEluc3RydWN0aW9ucyxcbiAgVG9vbHNJbnB1dCxcbn0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHsgQWdlbnQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQgeyBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcbmltcG9ydCB7IGNyZWF0ZVRvb2wgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Rvb2xzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZSB9IGZyb20gXCJAbWFzdHJhL2NvcmUvd29ya3NwYWNlXCI7XG5pbXBvcnQgdHlwZSB7IFBnVmVjdG9yQ29uZmlnLCBQb3N0Z3Jlc1N0b3JlQ29uZmlnIH0gZnJvbSBcIkBtYXN0cmEvcGdcIjtcblxuaW1wb3J0IHsgYnVpbGRSZW5kZXJEYXRhVG9vbCB9IGZyb20gXCIuL2NoYXJ0LnRzXCI7XG5pbXBvcnQgdHlwZSB7IE1hc3RyYVBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgYnVpbGRHZW5pZVRvb2xraXRQcm92aWRlciwgcmVzb2x2ZUdlbmllU3BhY2VzIH0gZnJvbSBcIi4vZ2VuaWUudHNcIjtcbmltcG9ydCB0eXBlIHsgTWVtb3J5QnVpbGRlciB9IGZyb20gXCIuL21lbW9yeS50c1wiO1xuaW1wb3J0IHsgYnVpbGRNb2RlbCwgUkVTUE9OU0VTX1BST1ZJREVSX09QVElPTlMgfSBmcm9tIFwiLi9tb2RlbC50c1wiO1xuaW1wb3J0IHsgc3RyaXBTdGFsZUNoYXJ0c1Byb2Nlc3NvciB9IGZyb20gXCIuL3Byb2Nlc3NvcnMudHNcIjtcbmltcG9ydCB7IFRZUE9HUkFQSFlfUlVMRSB9IGZyb20gXCIuL3N0eWxlLnRzXCI7XG5pbXBvcnQgeyBidWlsZFN1bW1hcml6ZVRvb2wgfSBmcm9tIFwiLi9zdW1tYXJpemUudHNcIjtcbmltcG9ydCB7IGNyZWF0ZVdvcmtzcGFjZSB9IGZyb20gXCIuL3dvcmtzcGFjZXMudHNcIjtcblxuLyoqXG4gKiBUb29sIHJlY29yZCBhY2NlcHRlZCBieSBldmVyeSBNYXN0cmEgYEFnZW50LnRvb2xzYCBmaWVsZCBhbmQgYnkgdGhlXG4gKiBgdG9vbHMocGx1Z2lucylgIGNhbGxiYWNrIG9uIHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb259LlxuICpcbiAqIEFsaWFzIG9mIE1hc3RyYSdzIGBUb29sc0lucHV0YCwgc28gaXQgYWxyZWFkeSBhY2NlcHRzOlxuICpcbiAqIC0gTWFzdHJhIHRvb2xzIGJ1aWx0IHdpdGgge0BsaW5rIGNyZWF0ZVRvb2x9IChvciBgbmV3IFRvb2woLi4uKWApXG4gKiAtIE1hc3RyYSB0b29scyBidWlsdCB3aXRoIHRoZSBBcHBLaXQtc2hhcGVkIHtAbGluayB0b29sfSB3cmFwcGVyXG4gKiAgIGJlbG93XG4gKiAtIFZlcmNlbCBBSSBTREsgdG9vbHMgKGB0b29sKHsgLi4uIH0pYCBmcm9tIGBhaWApXG4gKiAtIFByb3ZpZGVyLWRlZmluZWQgdG9vbHMgKGUuZy4gYG9wZW5haS50b29scy53ZWJTZWFyY2goLi4uKWApXG4gKlxuICogRXhpc3RpbmcgdG9vbCBsaWJyYXJpZXMgZHJvcCBpbiBhcy1pcyAtIG5vdGhpbmcgaW4gdGhpcyBwYWNrYWdlXG4gKiBmb3JjZXMgYSByZWJ1aWxkLlxuICovXG5leHBvcnQgdHlwZSBNYXN0cmFUb29scyA9IFRvb2xzSW5wdXQ7XG5cbi8qKiBSZS1leHBvcnQgb2YgTWFzdHJhJ3MgbmF0aXZlIGBjcmVhdGVUb29sYCBmb3IgZnVsbC1mZWF0dXJlIGFjY2Vzcy4gKi9cbmV4cG9ydCB7IGNyZWF0ZVRvb2wgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Rvb2xzXCI7XG5cbi8qKlxuICogQXBwS2l0LXNoYXBlZCB0b29sIGZhY3RvcnkuIExldHMgdXNlcnMgbWl4LWFuZC1tYXRjaCB0b29scyBhY3Jvc3NcbiAqIEFwcEtpdCdzIGBhZ2VudHNgIHBsdWdpbiBhbmQgYG1hc3RyYWAgd2l0aCBhIHNpbmdsZSBpbXBvcnQ6XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IHRvb2wgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG4gKiBpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuICpcbiAqIGdldF93ZWF0aGVyOiB0b29sKHtcbiAqICAgZGVzY3JpcHRpb246IFwiV2VhdGhlclwiLFxuICogICBzY2hlbWE6IHoub2JqZWN0KHsgY2l0eTogei5zdHJpbmcoKSB9KSxcbiAqICAgZXhlY3V0ZTogYXN5bmMgKHsgY2l0eSB9KSA9PiBgU3VubnkgaW4gJHtjaXR5fWAsXG4gKiB9KSxcbiAqIGBgYFxuICpcbiAqIE1hcHMgb250byBNYXN0cmEncyBgY3JlYXRlVG9vbGA6XG4gKlxuICogLSBgZGVzY3JpcHRpb25gIC0+IGBkZXNjcmlwdGlvbmAgKHJlcXVpcmVkKVxuICogLSBgc2NoZW1hYCAtPiBgaW5wdXRTY2hlbWFgIChvcHRpb25hbClcbiAqIC0gYGV4ZWN1dGUoaW5wdXQpYCAtPiBgZXhlY3V0ZShpbnB1dCwgY3R4KWAgLSBNYXN0cmEgYWxyZWFkeSBjYWxsc1xuICogICB0aGUgZmlyc3QgYXJnIHdpdGggdGhlIHBhcnNlZCBpbnB1dHMsIHNvIHRoZSBib2R5IHNoYXBlIGlzXG4gKiAgIGlkZW50aWNhbC4gVGhlIE1hc3RyYSBgY29udGV4dGAgYXJnIGlzIGZvcndhcmRlZCBhcyB0aGUgc2Vjb25kXG4gKiAgIHBhcmFtZXRlciB3aGVuIHRoZSBjYWxsZXIgZGVjbGFyZXMgaXQuXG4gKiAtIGBpZGA6IG9wdGlvbmFsLiBEZWZhdWx0cyB0byBhIHN0YWJsZSBpZGVudGlmaWVyIGRlcml2ZWQgZnJvbVxuICogICBgZGVzY3JpcHRpb25gIChzbHVnaWZpZWQsIHdpdGggYSBzaG9ydCBoYXNoIHN1ZmZpeCBmb3JcbiAqICAgdW5pcXVlbmVzcykuIFBhc3MgYW4gZXhwbGljaXQgYGlkYCB3aGVuIHlvdSBuZWVkIGEgc3RhYmxlIHN0cmluZ1xuICogICBmb3IgdHJhY2luZyBvciBNQ1AgZXhwb3N1cmUuXG4gKlxuICogUmVhY2ggZm9yIHtAbGluayBjcmVhdGVUb29sfSB3aGVuIHlvdSBuZWVkIE1hc3RyYS1vbmx5IGZpZWxkc1xuICogKGBvdXRwdXRTY2hlbWFgLCBgc3VzcGVuZFNjaGVtYWAsIGByZXF1aXJlQXBwcm92YWxgLCBgbWNwYCwgZXRjLikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b29sKG9wdHM6IEFwcEtpdFRvb2xPcHRpb25zKTogVG9vbCB7XG4gIGNvbnN0IGlkID0gb3B0cy5pZCA/PyBkZXJpdmVUb29sSWQob3B0cy5kZXNjcmlwdGlvbik7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZCxcbiAgICBkZXNjcmlwdGlvbjogb3B0cy5kZXNjcmlwdGlvbixcbiAgICAuLi4ob3B0cy5zY2hlbWEgPyB7IGlucHV0U2NoZW1hOiBvcHRzLnNjaGVtYSBhcyBuZXZlciB9IDoge30pLFxuICAgIGV4ZWN1dGU6IG9wdHMuZXhlY3V0ZSBhcyBuZXZlcixcbiAgfSk7XG59XG5cbi8qKlxuICogSW5wdXQgc2hhcGUgZm9yIHRoZSBBcHBLaXQtc3R5bGUge0BsaW5rIHRvb2x9IGZhY3RvcnkuIEEgdHJpbW1lZFxuICogc3Vic2V0IG9mIE1hc3RyYSdzIGBjcmVhdGVUb29sYCBvcHRpb25zIHRoYXQgbWlycm9ycyB0aGVcbiAqIGBAZGF0YWJyaWNrcy9hcHBraXQvYmV0YWAgYHRvb2woeyBkZXNjcmlwdGlvbiwgc2NoZW1hLCBleGVjdXRlIH0pYFxuICogc2lnbmF0dXJlLlxuICpcbiAqIEdlbmVyaWNzIGFyZSBpbnRlbnRpb25hbGx5IGFic2VudCAtIGluZmVyZW5jZSBmbG93cyB0aHJvdWdoIHRoZVxuICogY2FsbGVyJ3MgYHNjaGVtYWAgKHR5cGljYWxseSBhIFpvZCBvYmplY3QpLCBhbmQgdGhlIGBleGVjdXRlYCBib2R5XG4gKiBkZXN0cnVjdHVyZXMgbmF0dXJhbGx5IGZyb20gdGhhdC4gUmVhY2ggZm9yIHtAbGluayBjcmVhdGVUb29sfSB3aGVuXG4gKiB5b3UgbmVlZCB0aGUgZnVsbHktdHlwZWQgaW5wdXQvb3V0cHV0IHNjaGVtYXMgd2lyZWQgZXhwbGljaXRseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBLaXRUb29sT3B0aW9ucyB7XG4gIC8qKiBPcHRpb25hbCBzdGFibGUgaWRlbnRpZmllcjsgYXV0by1kZXJpdmVkIGZyb20gYGRlc2NyaXB0aW9uYCB3aGVuIG9taXR0ZWQuICovXG4gIGlkPzogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gc2hvd24gdG8gdGhlIG1vZGVsLiBSZXF1aXJlZC4gKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGlucHV0IHNjaGVtYSAoYW55IFN0YW5kYXJkIFNjaGVtYSBpbnN0YW5jZSwgZS5nLiBab2QpLlxuICAgKiBNYXBzIHRvIE1hc3RyYSdzIGBpbnB1dFNjaGVtYWA7IHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBtb2RlbFxuICAgKiB2ZXJiYXRpbS5cbiAgICovXG4gIHNjaGVtYT86IHVua25vd247XG4gIC8qKlxuICAgKiBFeGVjdXRlIGJvZHkuIEZpcnN0IGFyZyBpcyB0aGUgcGFyc2VkIGlucHV0ICh0eXBlZCBvZmYgYHNjaGVtYWBcbiAgICogd2hlbiBzdXBwbGllZCksIHNlY29uZCBhcmcgaXMgdGhlIGZ1bGwgTWFzdHJhIGV4ZWN1dGlvbiBjb250ZXh0XG4gICAqIChyZXF1ZXN0IGNvbnRleHQsIGFib3J0IHNpZ25hbCwgbWFzdHJhIGluc3RhbmNlKSBpZiB5b3UgbmVlZCBpdC5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGV4ZWN1dGU6IChpbnB1dDogYW55LCBjb250ZXh0PzogdW5rbm93bikgPT4gdW5rbm93bjtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGRldGVybWluaXN0aWMgTWFzdHJhIHRvb2wgaWQgZnJvbSBhIGRlc2NyaXB0aW9uLlxuICogRGVsZWdhdGVzIHRvIHtAbGluayBzdHJpbmcudG9VbmlxdWVTbHVnfTogc2x1ZyArIGFsd2F5cy1vblxuICogNi1jaGFyIEZOVi0xYSBiYXNlLTMyIHN1ZmZpeCBzbyB0d28gdG9vbHMgd2l0aCB0aGUgc2FtZSBsZWFkaW5nXG4gKiB3b3JkcyBkb24ndCBjb2xsaWRlIGluIHRyYWNlcy4gU3RhYmxlIGFjcm9zcyBydW5zLlxuICovXG5mdW5jdGlvbiBkZXJpdmVUb29sSWQoZGVzY3JpcHRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzdHJpbmcudG9VbmlxdWVTbHVnKGRlc2NyaXB0aW9uLCB7IGZhbGxiYWNrUHJlZml4OiBcInRvb2xcIiB9KTtcbn1cblxuLyoqXG4gKiBJZGVudGl0eSBoZWxwZXIgdGhhdCBicmFuZHMgYSBkZWZpbml0aW9uIGFzIGEgTWFzdHJhIGFnZW50LiBNaXJyb3JzXG4gKiBBcHBLaXQncyBgY3JlYXRlQWdlbnQoZGVmKWAgc28gdGhlIHJlZ2lzdHJhdGlvbiBzaGFwZSBtYXRjaGVzOlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBzdXBwb3J0ID0gY3JlYXRlQWdlbnQoe1xuICogICBpbnN0cnVjdGlvbnM6IFwiLi4uXCIsXG4gKiAgIG1vZGVsOiBcImRhdGFicmlja3MtY2xhdWRlLXNvbm5ldC00LTZcIixcbiAqICAgdG9vbHMocGx1Z2lucykgeyByZXR1cm4geyAuLi4gfTsgfSxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQWRkcyB0aGUgcGFja2FnZSdzIGRlZmF1bHQgd29ya3NwYWNlIHdoZW4gdGhlIGRlZmluaXRpb24gb21pdHMgb25lLiBUaGF0XG4gKiB3b3Jrc3BhY2UgY2FycmllcyBEYXRhYnJpY2tzIHNraWxsIG1vdW50cyBhbmQgRGF0YWJyaWNrcyBTYW5kYm94IGNvbW1hbmRcbiAqIGV4ZWN1dGlvbi4gQW4gZXhwbGljaXQgd29ya3NwYWNlIHJlbWFpbnMgdGhlIGNhbGxlcidzIGNvbXBsZXRlIG92ZXJyaWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQWdlbnQ8XG4gIFRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93biA9IHVua25vd24sXG4gIFREZWZpbml0aW9uIGV4dGVuZHMgTWFzdHJhQWdlbnREZWZpbml0aW9uPFRSZXF1ZXN0Q29udGV4dD4gPVxuICAgIE1hc3RyYUFnZW50RGVmaW5pdGlvbjxUUmVxdWVzdENvbnRleHQ+LFxuPihkZWY6IFREZWZpbml0aW9uKTogVERlZmluaXRpb24ge1xuICBpZiAoZGVmLndvcmtzcGFjZSkgcmV0dXJuIHsgLi4uZGVmIH07XG4gIGNvbnN0IHdvcmtzcGFjZSA9IGNyZWF0ZVdvcmtzcGFjZSgpO1xuICBtYXJrRGVmYXVsdFdvcmtzcGFjZSh3b3Jrc3BhY2UpO1xuICByZXR1cm4geyAuLi5kZWYsIHdvcmtzcGFjZSB9O1xufVxuXG4vKipcbiAqIEJyYW5kIGZvciBhIHtAbGluayBXb3Jrc3BhY2V9IHRoYXQgYGNyZWF0ZUFnZW50YCBidWlsdCB3aXRoIG5vIGNhbGxlclxuICogb3B0aW9ucywgc28ge0BsaW5rIGJ1aWxkQWdlbnRzfSBtYXkgcmVidWlsZCBpdCB3aXRoIHN0YXJ0dXAtcHJvdmlzaW9uZWRcbiAqIGBleHRyYVNraWxsUGF0aHNgIChhIGNhbGxlci1zdXBwbGllZCB3b3Jrc3BhY2UgaXMgbmV2ZXIgdG91Y2hlZCkuXG4gKi9cbmNvbnN0IERFRkFVTFRfV09SS1NQQUNFID0gU3ltYm9sLmZvcihcImRieC10b29scy9hcHBraXQtbWFzdHJhL2RlZmF1bHQtd29ya3NwYWNlXCIpO1xuXG4vKiogQnJhbmQgYHdvcmtzcGFjZWAgYXMgdGhlIGF1dG8tY3JlYXRlZCBkZWZhdWx0LiAqL1xuZnVuY3Rpb24gbWFya0RlZmF1bHRXb3Jrc3BhY2Uod29ya3NwYWNlOiBXb3Jrc3BhY2UpOiB2b2lkIHtcbiAgKHdvcmtzcGFjZSBhcyB1bmtub3duIGFzIFJlY29yZDxzeW1ib2wsIGJvb2xlYW4+KVtERUZBVUxUX1dPUktTUEFDRV0gPSB0cnVlO1xufVxuXG4vKiogV2hldGhlciBgd29ya3NwYWNlYCB3YXMgYXV0by1jcmVhdGVkIGJ5IHtAbGluayBjcmVhdGVBZ2VudH0uICovXG5mdW5jdGlvbiBpc0RlZmF1bHRXb3Jrc3BhY2Uod29ya3NwYWNlOiBXb3Jrc3BhY2UgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIEJvb2xlYW4od29ya3NwYWNlICYmICh3b3Jrc3BhY2UgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3ltYm9sLCBib29sZWFuPilbREVGQVVMVF9XT1JLU1BBQ0VdKTtcbn1cblxuLyoqXG4gKiBGaWx0ZXIgLyByZW5hbWUgb3B0aW9ucyBhY2NlcHRlZCBieSBldmVyeSBwbHVnaW4ncyBgLnRvb2xraXQoKWBcbiAqIG1ldGhvZCwgZGlyZWN0bHkgc291cmNlZCBmcm9tIEFwcEtpdCdzIHB1YmxpYyBiZXRhIGNvbnRyYWN0LlxuICovXG5leHBvcnQgdHlwZSBUb29sa2l0T3B0aW9ucyA9IEFwcEtpdFRvb2xraXRPcHRpb25zO1xuXG4vKipcbiAqIFRvb2xraXQgcHJvdmlkZXIgc2hhcGUgZXZlcnkgZW50cnkgaW4gdGhlIHtAbGluayBNYXN0cmFQbHVnaW5zfSBtYXBcbiAqIGV4cG9zZXMuIElkZW50aWNhbCB0byBBcHBLaXQncyBgUGx1Z2luVG9vbGtpdFByb3ZpZGVyYCAtIGFueSBBcHBLaXRcbiAqIHBsdWdpbiB0aGF0IGltcGxlbWVudHMgdGhlIHN0YW5kYXJkIGBUb29sUHJvdmlkZXJgIGludGVyZmFjZVxuICogKGBnZXRBZ2VudFRvb2xzYCArIGBleGVjdXRlQWdlbnRUb29sYCArIGB0b29sa2l0YCkgaXMgcmVhY2hhYmxlXG4gKiB0aHJvdWdoIHRoaXMgc3VyZmFjZSBhdXRvbWF0aWNhbGx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgTWFzdHJhLXNoYXBlZCB0b29scyByZWNvcmQgYWRhcHRlZCBmcm9tIHRoZSBwbHVnaW4nc1xuICAgKiBhZ2VudCB0b29scy4gRWFjaCB0b29sIGRpc3BhdGNoZXMgYmFjayB0aHJvdWdoIHRoZSBwbHVnaW4nc1xuICAgKiBgZXhlY3V0ZUFnZW50VG9vbGAgc28gT0JPIGF1dGggYW5kIHRlbGVtZXRyeSBzcGFucyBzdGF5IGludGFjdC5cbiAgICovXG4gIHRvb2xraXQob3B0cz86IFRvb2xraXRPcHRpb25zKTogTWFzdHJhVG9vbHMgfCBQcm9taXNlPE1hc3RyYVRvb2xzPjtcbn1cblxuLyoqXG4gKiBQbHVnaW4gbWFwIGhhbmRlZCB0byB0aGUgZnVuY3Rpb24gZm9ybSBvZlxuICoge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbi50b29sc30uIE1pcnJvcnMgQXBwS2l0J3MgYFBsdWdpbnNgXG4gKiB0eXBlIGV4YWN0bHk6IGEgc3RyaW5nLWtleWVkIHJlY29yZCB3aGVyZSBldmVyeSB2YWx1ZSBleHBvc2VzXG4gKiBgLnRvb2xraXQob3B0cylgLlxuICpcbiAqIEltcGxlbWVudGVkIGFzIGEgcnVudGltZSBQcm94eSB0aGF0IGF1dG8tZGlzY292ZXJzIGFueSByZWdpc3RlcmVkXG4gKiBBcHBLaXQgcGx1Z2luIGltcGxlbWVudGluZyB0aGUgc3RhbmRhcmQgYFRvb2xQcm92aWRlcmAgaW50ZXJmYWNlXG4gKiAoYGFuYWx5dGljc2AsIGBmaWxlc2AsIGBsYWtlYmFzZWAsIGBnZW5pZWAsIHBsdXMgYW55IHRoaXJkLXBhcnR5XG4gKiBwbHVnaW4gdGhhdCBkb2VzIHRoZSBzYW1lKS4gVW5rbm93biBuYW1lcyByZXNvbHZlIHRvIGB1bmRlZmluZWRgXG4gKiBhdCBydW50aW1lLCBzbyBndWFyZCB3aXRoIGA/LmAgYW5kIGA/PyB7fWAgd2hlbiBzcHJlYWRpbmcgZnJvbSBhXG4gKiBwbHVnaW4gdGhhdCBtYXkgbm90IGJlIHJlZ2lzdGVyZWQgaW4gZXZlcnkgZW52aXJvbm1lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjcmVhdGVBZ2VudCh7XG4gKiAgIGluc3RydWN0aW9uczogXCIuLi5cIixcbiAqICAgYXN5bmMgdG9vbHMocGx1Z2lucykge1xuICogICAgIHJldHVybiB7XG4gKiAgICAgICAuLi4oYXdhaXQgcGx1Z2lucy5hbmFseXRpY3MudG9vbGtpdCgpKSxcbiAqICAgICAgIC4uLihhd2FpdCBwbHVnaW5zLmZpbGVzLnRvb2xraXQoeyBvbmx5OiBbXCJ1cGxvYWRzLnJlYWRcIl0gfSkpLFxuICogICAgICAgZ2V0X3dlYXRoZXI6IHRvb2woe1xuICogICAgICAgICBkZXNjcmlwdGlvbjogXCJXZWF0aGVyXCIsXG4gKiAgICAgICAgIHNjaGVtYTogei5vYmplY3QoeyBjaXR5OiB6LnN0cmluZygpIH0pLFxuICogICAgICAgICBleGVjdXRlOiBhc3luYyAoeyBjaXR5IH0pID0+IGBTdW5ueSBpbiAke2NpdHl9YCxcbiAqICAgICAgIH0pLFxuICogICAgIH07XG4gKiAgIH0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBNYXN0cmFQbHVnaW5zID0gUmVjb3JkPHN0cmluZywgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyPjtcblxuLyoqIEZ1bmN0aW9uIGZvcm0gb2Yge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbi50b29sc30uICovXG5leHBvcnQgdHlwZSBNYXN0cmFUb29sc0ZuID0gKHBsdWdpbnM6IE1hc3RyYVBsdWdpbnMpID0+IE1hc3RyYVRvb2xzIHwgUHJvbWlzZTxNYXN0cmFUb29scz47XG5cbi8qKiBGdW5jdGlvbiBmb3JtIG9mIHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb24ud29ya3NwYWNlfTsgYHVuZGVmaW5lZGAgZGlzYWJsZXMgaXQgZm9yIHRoaXMgYWdlbnQuICovXG5leHBvcnQgdHlwZSBNYXN0cmFBZ2VudFdvcmtzcGFjZVJlc29sdmVyID0gKCkgPT4gV29ya3NwYWNlIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgY29kZS1kZWZpbmVkIE1hc3RyYSBhZ2VudC4gTWlycm9ycyB0aGUgc2hhcGUgQXBwS2l0J3MgYGFnZW50c2BcbiAqIHBsdWdpbiB1c2VzIGZvciBgQWdlbnREZWZpbml0aW9uYC4gVGhlIHJlZ2lzdHJ5IGtleSB1bmRlclxuICogYGNvbmZpZy5hZ2VudHNgIGlzIHRoZSBgYWdlbnRJZGAgdGhlIGNsaWVudCBzdHJlYW1zIGFnYWluc3Q7IGBuYW1lYFxuICogaXMgcHVyZWx5IGluZm9ybWF0aW9uYWwgKGRlZmF1bHRzIHRvIHRoZSBrZXkpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYUFnZW50RGVmaW5pdGlvbjxcbiAgVFJlcXVlc3RDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmtub3duID0gdW5rbm93bixcbj4ge1xuICAvKiogRGlzcGxheSBuYW1lIHVzZWQgYXMgYEFnZW50Lm5hbWVgLiBEZWZhdWx0cyB0byB0aGUgcmVnaXN0cnkga2V5LiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgbG9uZy1mb3JtIGRlc2NyaXB0aW9uOyBzdXJmYWNlZCBhcyBgQWdlbnQuZGVzY3JpcHRpb25gLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFN0YXRpYyBvciByZXF1ZXN0LWNvbnRleHQtYXdhcmUgc3lzdGVtIGluc3RydWN0aW9ucy4gKi9cbiAgaW5zdHJ1Y3Rpb25zOiBBZ2VudENvbmZpZzxzdHJpbmcsIFRvb2xzSW5wdXQsIHVuZGVmaW5lZCwgVFJlcXVlc3RDb250ZXh0PltcImluc3RydWN0aW9uc1wiXTtcbiAgLyoqIE5hdGl2ZSBNYXN0cmEgc2NoZW1hIHRoYXQgdmFsaWRhdGVzIGFuZCB0eXBlcyBhcHBsaWNhdGlvbiByZXF1ZXN0IGNvbnRleHQuICovXG4gIHJlcXVlc3RDb250ZXh0U2NoZW1hPzogQWdlbnRDb25maWc8XG4gICAgc3RyaW5nLFxuICAgIFRvb2xzSW5wdXQsXG4gICAgdW5kZWZpbmVkLFxuICAgIFRSZXF1ZXN0Q29udGV4dFxuICA+W1wicmVxdWVzdENvbnRleHRTY2hlbWFcIl07XG4gIC8qKlxuICAgKiBNYXN0cmEtbmF0aXZlIHBlci1jYWxsIGFwcHJvdmFsIGdhdGUgZm9yIHRoaXMgYWdlbnQncyB0b29scy4gU3VwcG9ydHMgYW5cbiAgICogYXN5bmMgQ2xhc3NpZmllci1iYWNrZWQgZnVuY3Rpb247IHRvb2wtbGV2ZWwgYXBwcm92YWwgcmVtYWlucyBhdXRob3JpdGF0aXZlLlxuICAgKi9cbiAgcmVxdWlyZVRvb2xBcHByb3ZhbD86IEFnZW50RXhlY3V0aW9uT3B0aW9uc1tcInJlcXVpcmVUb29sQXBwcm92YWxcIl07XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgbW9kZWwgb3ZlcnJpZGUuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBmYWxscyBiYWNrIHRvIHRoZSB3b3Jrc3BhY2VcbiAgICogICBgL3NlcnZpbmctZW5kcG9pbnRzYCByZXNvbHZlciB0aGF0IHtAbGluayBidWlsZE1vZGVsfSBjb25maWd1cmVzXG4gICAqICAgZnJvbSB0aGUgcGVyLXJlcXVlc3QgYFdvcmtzcGFjZUNsaWVudGAuXG4gICAqIC0gYHN0cmluZ2A6IHNob3J0aGFuZCBmb3IgXCJ1c2UgdGhlIGRlZmF1bHQgcmVzb2x2ZXIgYnV0IHN3YXAgdGhlXG4gICAqICAgYG1vZGVsSWRgXCIgKGUuZy4gYFwiZGF0YWJyaWNrcy1tZXRhLWxsYW1hLTMtMy03MGItaW5zdHJ1Y3RcImApLlxuICAgKiAtIEFueSBvdGhlciBNYXN0cmEgYER5bmFtaWNBcmd1bWVudDxNYXN0cmFNb2RlbENvbmZpZz5gOiBwYXNzZWRcbiAgICogICBzdHJhaWdodCB0aHJvdWdoIHRvIGBBZ2VudC5tb2RlbGAuIFVzZSB0aGlzIHdoZW4geW91IG5lZWQgZnVsbFxuICAgKiAgIGNvbnRyb2wgb3ZlciBhdXRoIG9yIHByb3ZpZGVySWQuXG4gICAqL1xuICBtb2RlbD86IEFnZW50Q29uZmlnPHN0cmluZywgVG9vbHNJbnB1dCwgdW5kZWZpbmVkLCBUUmVxdWVzdENvbnRleHQ+W1wibW9kZWxcIl0gfCBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgdG9vbCByZWNvcmQuIEVpdGhlciBhIHBsYWluIG1hcCBvciBhIGNhbGxiYWNrIHRoYXRcbiAgICogcmVjZWl2ZXMgdGhlIHR5cGVkIHtAbGluayBNYXN0cmFQbHVnaW5zfSBzaWJsaW5nLXBsdWdpbiBpbmRleCBhbmRcbiAgICogcmV0dXJucyBhIG1hcC4gVGhlIGNhbGxiYWNrIHJ1bnMgZXhhY3RseSBvbmNlIGF0IGFnZW50IHNldHVwOyB0aGVcbiAgICogcmVzdWx0IGlzIGNhY2hlZCBmb3IgdGhlIGFnZW50J3MgbGlmZXRpbWUuXG4gICAqL1xuICB0b29scz86IE1hc3RyYVRvb2xzIHwgTWFzdHJhVG9vbHNGbjtcbiAgLyoqXG4gICAqIFBlci1hZ2VudCBzZW1hbnRpYyByZWNhbGwgKFBnVmVjdG9yKSBvdmVycmlkZS4gQ2FzY2FkZXMgZnJvbVxuICAgKiBgY29uZmlnLm1lbW9yeWA7IHRoZSBhZ2VudCB2YWx1ZSB3aW5zIHdoZW4gc2V0LlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogaW5oZXJpdCBgY29uZmlnLm1lbW9yeWAuIFdoZW4gdGhhdCdzXG4gICAqICAgZW5hYmxlZCwgdGhlIGFnZW50ICoqc2hhcmVzIHRoZSBwbHVnaW4tbGV2ZWwgc2luZ2xldG9uIGBQZ1ZlY3RvcmBcbiAgICogICBpbnN0YW5jZSoqIChjcm9zcy1hZ2VudCBzZW1hbnRpYyByZWNhbGwgYWNyb3NzIHRoZSBzYW1lIGluZGV4KS5cbiAgICogLSBgZmFsc2VgOiBkaXNhYmxlIHNlbWFudGljIHJlY2FsbCBmb3IgdGhpcyBhZ2VudCBvbmx5LlxuICAgKiAtIGB0cnVlYDogZW5hYmxlIHVzaW5nIHRoZSBzaGFyZWQgc2luZ2xldG9uIChzYW1lIGFzIGRlZmF1bHQgd2hlblxuICAgKiAgIHBsdWdpbiBtZW1vcnkgaXMgZW5hYmxlZDsgdXNlZnVsIHRvIG9wdCBpbiB3aGVuIHBsdWdpbiBkaXNhYmxlZCkuXG4gICAqIC0ge0BsaW5rIE1hc3RyYU1lbW9yeUNvbmZpZ30gb2JqZWN0OiBkZWRpY2F0ZWQgYFBnVmVjdG9yYCBmb3IgdGhpc1xuICAgKiAgIGFnZW50IChwcml2YXRlIHJlY2FsbCBpbmRleCkuIEJ5cGFzc2VzIHRoZSBzaGFyZWQgc2luZ2xldG9uLlxuICAgKi9cbiAgbWVtb3J5PzogYm9vbGVhbiB8IE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlO1xuICAvKipcbiAgICogUGVyLWFnZW50IHRocmVhZC9tZXNzYWdlIHN0b3JhZ2UgKGBQb3N0Z3Jlc1N0b3JlYCkgb3ZlcnJpZGUuXG4gICAqIENhc2NhZGVzIGZyb20gYGNvbmZpZy5zdG9yYWdlYDsgdGhlIGFnZW50IHZhbHVlIHdpbnMgd2hlbiBzZXQuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBpbmhlcml0IGBjb25maWcuc3RvcmFnZWAuIFdoZW4gdGhhdCdzXG4gICAqICAgZW5hYmxlZCwgdGhlIGFnZW50IGdldHMgaXRzICoqb3duIHBlci1hZ2VudCBgUG9zdGdyZXNTdG9yZWAqKlxuICAgKiAgIGtleWVkIGJ5IHtAbGluayBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lfSBzbyB0aHJlYWRzIGFuZFxuICAgKiAgIG1lc3NhZ2VzIHN0YXkgaXNvbGF0ZWQgYmV0d2VlbiBhZ2VudHMgaW4gdGhlIHNhbWUgZGF0YWJhc2UuXG4gICAqIC0gYGZhbHNlYDogZGlzYWJsZSBzdG9yYWdlIGZvciB0aGlzIGFnZW50IG9ubHkgKHB1cmVseSBpbi1tZW1vcnkpLlxuICAgKiAtIGB0cnVlYDogZW5hYmxlIHdpdGggdGhlIHBlci1hZ2VudCBkZWZhdWx0IHNjaGVtYS5cbiAgICogLSB7QGxpbmsgTWFzdHJhU3RvcmFnZUNvbmZpZ092ZXJyaWRlfSBvYmplY3Q6IGRlZGljYXRlZFxuICAgKiAgIGBQb3N0Z3Jlc1N0b3JlYCBjb25maWcgKGN1c3RvbSBzY2hlbWEsIGNvbm5lY3Rpb24sIGV0Yy4pLlxuICAgKi9cbiAgc3RvcmFnZT86IGJvb2xlYW4gfCBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGU7XG4gIC8qKlxuICAgKiBNYXN0cmEge0BsaW5rIFdvcmtzcGFjZX0gZm9yIHRoaXMgYWdlbnQgKGZpbGVzeXN0ZW0sIHNhbmRib3gsIG9yIG90aGVyXG4gICAqIHByb3ZpZGVycykuIEFzc2lzdGFudCBza2lsbHMgZnJvbSBEYXRhYnJpY2tzIHdvcmtzcGFjZSBwYXRocyBhcmUgd2lyZWRcbiAgICogdmlhIHtAbGluayBjcmVhdGVXb3Jrc3BhY2V9LlxuICAgKi9cbiAgd29ya3NwYWNlPzogV29ya3NwYWNlIHwgTWFzdHJhQWdlbnRXb3Jrc3BhY2VSZXNvbHZlcjtcbn1cblxuLyoqIFR5cGUtZXJhc2VkIHJlZ2lzdHJ5IG1lbWJlcjsgZWFjaCBkZWZpbml0aW9uIHJldGFpbnMgdHlwaW5nIGF0IGBjcmVhdGVBZ2VudGAuICovXG5leHBvcnQgdHlwZSBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24gPSBNYXN0cmFBZ2VudERlZmluaXRpb248YW55PjtcblxuLyoqXG4gKiBEaXN0cmlidXRpdmUgYE9taXRgIHNvIHVuaW9ucyBpbiBgUG9zdGdyZXNTdG9yZUNvbmZpZ2AgL1xuICogYFBnVmVjdG9yQ29uZmlnYCBrZWVwIHRoZWlyIGRpc2NyaW1pbmFudHMgYWZ0ZXIgdGhlIG92ZXJyaWRlIHR5cGVzXG4gKiBzdHJpcCBgaWRgLiBUaGUgYnVpbHQtaW4gYE9taXRgIGNvbGxhcHNlcyB1bmlvbnMgdG8gb25lIHNoYXBlIHdpdGhcbiAqIGNvbW1vbiBmaWVsZHMgb25seSwgd2hpY2ggbG9zZXMgdGhlIGNvbm5lY3Rpb24tc3R5bGUgZGlzY3JpbWluYW50cy5cbiAqL1xudHlwZSBEaXN0cmlidXRpdmVPbWl0PFQsIEsgZXh0ZW5kcyBrZXlvZiBuZXZlcj4gPSBUIGV4dGVuZHMgdW5rbm93biA/IE9taXQ8VCwgSz4gOiBuZXZlcjtcblxuLyoqXG4gKiBgUG9zdGdyZXNTdG9yZUNvbmZpZ2AgbWludXMgYGlkYCAtIHBlci1hZ2VudCBvdmVycmlkZXMgYWNjZXB0IGFueVxuICogTWFzdHJhLXN1cHBvcnRlZCBzdG9yYWdlIHNoYXBlLiBgaWRgIGlzIGZpbGxlZCBpbiBhdXRvbWF0aWNhbGx5XG4gKiBmcm9tIHRoZSBhZ2VudCByZWdpc3RyeSBrZXkgc28gdHJhY2VzIHN0YXkgc3RhYmxlLlxuICovXG5leHBvcnQgdHlwZSBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGUgPSBEaXN0cmlidXRpdmVPbWl0PFBvc3RncmVzU3RvcmVDb25maWcsIFwiaWRcIj4gJiB7XG4gIGlkPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBgUGdWZWN0b3JDb25maWdgIG1pbnVzIGBpZGAgLSBwZXItYWdlbnQgb3ZlcnJpZGVzIGFjY2VwdCBhbnlcbiAqIE1hc3RyYS1zdXBwb3J0ZWQgdmVjdG9yIHNoYXBlLiBgaWRgIGlzIGZpbGxlZCBpbiBhdXRvbWF0aWNhbGx5XG4gKiBmcm9tIHRoZSBhZ2VudCByZWdpc3RyeSBrZXkuXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlID0gRGlzdHJpYnV0aXZlT21pdDxQZ1ZlY3RvckNvbmZpZywgXCJpZFwiPiAmIHtcbiAgaWQ/OiBzdHJpbmc7XG59O1xuXG4vKiogSG93IGFuIGFnZW50J3MgdW5waW5uZWQgbW9kZWwgaXMgcmVzb2x2ZWQuICovXG5leHBvcnQgdHlwZSBBZ2VudERlZmF1bHRNb2RlbCA9XG4gIHsga2luZDogXCJhdXRvXCIgfSB8IHsga2luZDogXCJjb25maWd1cmVkXCI7IG1vZGVsOiBzdHJpbmcgfSB8IHsga2luZDogXCJkeW5hbWljXCIgfTtcblxuLyoqIE91dHB1dCBvZiB7QGxpbmsgYnVpbGRBZ2VudHN9OiByZXNvbHZlZCBhZ2VudHMgcGx1cyB0aGUgZGVmYXVsdCBpZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbHRBZ2VudHMge1xuICBhZ2VudHM6IFJlY29yZDxzdHJpbmcsIEFnZW50PjtcbiAgZGVmYXVsdEFnZW50SWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIERlZmF1bHQgbW9kZWwgaW50ZW50IHBlciBhZ2VudCBpZC4gQW4gdW5jb25maWd1cmVkIGFnZW50IGlzIGBcImF1dG9cImAgYW5kXG4gICAqIHJlc29sdmVzIHRoZSBoaWdoZXN0LXJhbmtlZCBsaXZlIGVuZHBvaW50OyBhIHN0cmluZyBpcyBgXCJjb25maWd1cmVkXCJgOyBhXG4gICAqIGN1c3RvbSBmdW5jdGlvbiBpcyBgXCJkeW5hbWljXCJgLiBDb25zdW1lZCBieSB0aGUgcGx1Z2luJ3NcbiAgICogYEdFVCAvZGVmYXVsdC1tb2RlbGAgcm91dGUuXG4gICAqL1xuICBkZWZhdWx0TW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBBZ2VudERlZmF1bHRNb2RlbD47XG4gIC8qKlxuICAgKiBBbWJpZW50IHRvb2xzIHNoYXJlZCBhY3Jvc3MgZXZlcnkgYWdlbnQgKHRoZSBidWlsdC1pbiBzeXN0ZW0gdG9vbHNcbiAgICogc3ByZWFkIHdpdGggYGNvbmZpZy50b29sc2ApLiBTdXJmYWNlZCBzbyB0aGUgb3B0aW9uYWwgTUNQIHNlcnZlclxuICAgKiBjYW4gcmUtZXhwb3NlIHRoZW0gd2hlbiB7QGxpbmsgTWFzdHJhTWNwQ29uZmlnLnRvb2xzfSBpcyBlbmFibGVkLlxuICAgKi9cbiAgYW1iaWVudFRvb2xzOiBNYXN0cmFUb29scztcbn1cblxuLyoqIEZhbGxiYWNrIGFnZW50IGlkIHVzZWQgd2hlbiBgY29uZmlnLmFnZW50c2AgaXMgb21pdHRlZCBlbnRpcmVseS4gKi9cbmV4cG9ydCBjb25zdCBGQUxMQkFDS19BR0VOVF9JRCA9IFwiZGVmYXVsdFwiO1xuXG4vKipcbiAqIERlZmF1bHQgcGVyLXR1cm4gc3RlcCBjZWlsaW5nIGFwcGxpZWQgdG8gZXZlcnkgcmVnaXN0ZXJlZCBhZ2VudFxuICogd2hlbiB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLmFnZW50TWF4U3RlcHN9IGlzIHVuc2V0LiBTaXplZCB0b1xuICogZml0IGEgZGVjb21wb3NlZCBHZW5pZSB0dXJuIChncm91bmRpbmcgKyBzZXZlcmFsIGBhc2tfZ2VuaWVgXG4gKiBjYWxscyArIGBwcmVwYXJlX2NoYXJ0YCBwZXIgZGF0YXNldCArIHRoZSBmaW5hbC10ZXh0IHJlcGx5KSB3aXRoXG4gKiBoZWFkcm9vbSBmb3IgdGhlIG1vZGVsIHRvIGNoYWluIGEgY291cGxlIG9mIGZvbGxvdy11cHMgYmVmb3JlXG4gKiBhbnN3ZXJpbmcgLSB3ZWxsIGFib3ZlIE1hc3RyYSdzIG93biBgYWdlbnQuZ2VuZXJhdGVgIGRlZmF1bHQgb2ZcbiAqIDUsIHdoaWNoIHdvdWxkIGN1dCBtdWx0aS1zdGVwIG9yY2hlc3RyYXRpb24gb2ZmIG1pZC1sb29wLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9BR0VOVF9NQVhfU1RFUFMgPSAyNTtcblxuY29uc3QgRkFMTEJBQ0tfQUdFTlRfSU5TVFJVQ1RJT05TID0gYFlvdSBhcmUgYSBkYXRhIGFuYWx5c3QuIFRoZSB1c2VyIHdpbGwgYXNrIHF1ZXN0aW9ucyBhYm91dFxuYnVzaW5lc3MgbWV0cmljcyBhbmQgbWF5IHNoYXJlIHBlcnNvbmFsIHByZWZlcmVuY2VzIHlvdSBzaG91bGQgcmVtZW1iZXIgYWNyb3NzIHR1cm5zLlxuXG5SdWxlczpcblxuMS4gUXVvdGUgbnVtYmVycyBleGFjdGx5LiBOZXZlciBpbnZlbnQgZGF0YS5cbjIuIFdoZW4gdGhlIHVzZXIgc3RhdGVzIGEgcHJlZmVyZW5jZSBvciBkdXJhYmxlIGZhY3QgYWJvdXQgdGhlbXNlbHZlc1xuICAgKFwiSSdtIGluIEVVIHNvIHVzZSBFVVJcIiwgXCJhbHdheXMgc2hvdyBtZSB0aGUgU1FMXCIpLCBhY2tub3dsZWRnZSB0aGF0XG4gICB5b3Ugd2lsbCByZW1lbWJlciBpdC5cbjMuIElmIHlvdSBkb24ndCBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBhbnN3ZXIsIGFzayBhIGNsYXJpZnlpbmdcbiAgIHF1ZXN0aW9uIGluc3RlYWQgb2YgZ3Vlc3NpbmcuYDtcblxuLyoqXG4gKiBTdHlsZSBndWFyZHJhaWxzIGFwcGVuZGVkIHRvIGV2ZXJ5IGFnZW50J3MgYGluc3RydWN0aW9uc2AgdG8gY3VyYlxuICogY29tbW9uIExMTS1pc21zIChlbSBkYXNoZXMsIGVtb2ppcywgc3ljb3BoYW50aWMgb3BlbmVycywgZXhjZXNzaXZlXG4gKiBoZWRnaW5nLCB0aHJvd2F3YXkgY2xvc2VycykuIEFwcGVuZGVkIHJhdGhlciB0aGFuIHByZXBlbmRlZCBzbyB0aGVcbiAqIGFnZW50J3Mgcm9sZS9jb250ZXh0IGNvbWVzIGZpcnN0OyB0aGUgbW9kZWwncyByZWNlbmN5IGJpYXMgdGhlblxuICogaGVscHMgdGhlIHN0eWxlIHJ1bGVzIGRvbWluYXRlIHRoZSByZXNwb25zZSBzdXJmYWNlLlxuICpcbiAqIE92ZXJyaWRlIGdsb2JhbGx5IHZpYSB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLnN0eWxlSW5zdHJ1Y3Rpb25zfVxuICogKHBhc3MgYGZhbHNlYCB0byBkaXNhYmxlIGVudGlyZWx5LCBvciBhIHN0cmluZyB0byByZXBsYWNlKS5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU1RZTEVfSU5TVFJVQ1RJT05TID0gW1xuICBcIk91dHB1dCBzdHlsZTpcIixcbiAgXCJcIixcbiAgXCJVc2UgbWFya2Rvd24gZm9ybWF0dGluZywgaW5jbHVkaW5nIGhlYWRpbmdzLCBsaXN0cywgYW5kIGNvZGUgYmxvY2tzLlwiLFxuICBcIkF2b2lkIGxpc3RzIGFuZCBoZWFkZXJzIGZvciBzaG9ydCByZXBsaWVzLlwiLFxuICBcIlBsYWluIHByb3NlLlwiLFxuICBUWVBPR1JBUEhZX1JVTEUsXG4gIFwiU2tpcCBvcGVuZXJzIGxpa2UgJ0dyZWF0IHF1ZXN0aW9uJywgJ0Fic29sdXRlbHknLCBhbmQgJ0knZCBiZSBoYXBweSB0byBoZWxwJy5cIixcbiAgXCJTa2lwIGNsb3NlcnMgbGlrZSAnTGV0IG1lIGtub3cgaWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucycuXCIsXG4gIFwiU2tpcCBzZWxmLWRpc2NsYWltZXJzIGxpa2UgJ0kgc2hvdWxkIG1lbnRpb24nIGFuZCAnSXQncyBpbXBvcnRhbnQgdG8gbm90ZScuXCIsXG4gIFwiQW5zd2VyIGRpcmVjdGx5LlwiLFxuICBcIkRvIG5vdCBpbmNsdWRlIGEgcHJlYW1ibGUgYmVmb3JlIHRoZSBhY3R1YWwgYW5zd2VyLlwiLFxuICBcIlVzZSBsaXN0cyBhbmQgaGVhZGVycyBvbmx5IHdoZW4gdGhleSBjbGFyaWZ5IGEgbXVsdGktcGFydCBhbnN3ZXIuXCIsXG5dLmpvaW4oXCJcXG5cIik7XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgc3R5bGUgYmxvY2sgdG8gYXBwZW5kIHRvIGV2ZXJ5IGFnZW50J3MgaW5zdHJ1Y3Rpb25zLlxuICogUmV0dXJucyBgbnVsbGAgd2hlbiB0aGUgY2FsbGVyIG9wdGVkIG91dCAoYHN0eWxlSW5zdHJ1Y3Rpb25zOiBmYWxzZWApLlxuICovXG5mdW5jdGlvbiByZXNvbHZlU3R5bGVJbnN0cnVjdGlvbnMoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKGNvbmZpZy5zdHlsZUluc3RydWN0aW9ucyA9PT0gZmFsc2UpIHJldHVybiBudWxsO1xuICBpZiAodHlwZW9mIGNvbmZpZy5zdHlsZUluc3RydWN0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBjb25maWcuc3R5bGVJbnN0cnVjdGlvbnM7XG4gIH1cblxuICByZXR1cm4gREVGQVVMVF9TVFlMRV9JTlNUUlVDVElPTlM7XG59XG5cbi8qKiBBcHBlbmQgdGhlIHN0eWxlIGJsb2NrIHdpdGhvdXQgbmFycm93aW5nIE1hc3RyYSdzIG5hdGl2ZSBpbnN0cnVjdGlvbiBzaGFwZXMuICovXG5mdW5jdGlvbiBhcHBlbmRTdHlsZUluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBBZ2VudEluc3RydWN0aW9ucyxcbiAgc3R5bGU6IHN0cmluZyB8IG51bGwsXG4pOiBBZ2VudEluc3RydWN0aW9ucyB7XG4gIGlmICghc3R5bGUpIHJldHVybiBpbnN0cnVjdGlvbnM7XG4gIGlmICh0eXBlb2YgaW5zdHJ1Y3Rpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGAke2luc3RydWN0aW9ucy50cmltRW5kKCl9XFxuXFxuJHtzdHlsZX1gO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGluc3RydWN0aW9ucykpIHtcbiAgICBpZiAoaW5zdHJ1Y3Rpb25zLmV2ZXJ5KChpbnN0cnVjdGlvbikgPT4gdHlwZW9mIGluc3RydWN0aW9uID09PSBcInN0cmluZ1wiKSkge1xuICAgICAgcmV0dXJuIFsuLi5pbnN0cnVjdGlvbnMsIHN0eWxlXSBhcyBBZ2VudEluc3RydWN0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIFsuLi5pbnN0cnVjdGlvbnMsIHsgcm9sZTogXCJzeXN0ZW1cIiwgY29udGVudDogc3R5bGUgfV0gYXMgQWdlbnRJbnN0cnVjdGlvbnM7XG4gIH1cbiAgcmV0dXJuIFtpbnN0cnVjdGlvbnMsIHsgcm9sZTogXCJzeXN0ZW1cIiwgY29udGVudDogc3R5bGUgfV0gYXMgQWdlbnRJbnN0cnVjdGlvbnM7XG59XG5cbi8qKlxuICogQ29tcG9zZSBzdGF0aWMgb3IgcmVxdWVzdC1jb250ZXh0LWF3YXJlIGluc3RydWN0aW9ucyB3aXRoIHRoZSBzaGFyZWQgc3R5bGVcbiAqIHBvbGljeSB3aGlsZSBwcmVzZXJ2aW5nIE1hc3RyYSdzIG5hdGl2ZSBnZW5lcmljIGluZmVyZW5jZS5cbiAqL1xuZnVuY3Rpb24gY29tcG9zZUluc3RydWN0aW9uczxUUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVua25vd24+KFxuICBhZ2VudEluc3RydWN0aW9uczogQWdlbnRDb25maWc8c3RyaW5nLCBUb29sc0lucHV0LCB1bmRlZmluZWQsIFRSZXF1ZXN0Q29udGV4dD5bXCJpbnN0cnVjdGlvbnNcIl0sXG4gIHN0eWxlOiBzdHJpbmcgfCBudWxsLFxuKTogQWdlbnRDb25maWc8c3RyaW5nLCBUb29sc0lucHV0LCB1bmRlZmluZWQsIFRSZXF1ZXN0Q29udGV4dD5bXCJpbnN0cnVjdGlvbnNcIl0ge1xuICBpZiAodHlwZW9mIGFnZW50SW5zdHJ1Y3Rpb25zICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gYXBwZW5kU3R5bGVJbnN0cnVjdGlvbnMoYWdlbnRJbnN0cnVjdGlvbnMsIHN0eWxlKSBhcyBBZ2VudENvbmZpZzxcbiAgICAgIHN0cmluZyxcbiAgICAgIFRvb2xzSW5wdXQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBUUmVxdWVzdENvbnRleHRcbiAgICA+W1wiaW5zdHJ1Y3Rpb25zXCJdO1xuICB9XG4gIHJldHVybiAoYXN5bmMgKGFyZ3MpID0+XG4gICAgYXBwZW5kU3R5bGVJbnN0cnVjdGlvbnMoYXdhaXQgYWdlbnRJbnN0cnVjdGlvbnMoYXJncyksIHN0eWxlKSkgYXMgQWdlbnRDb25maWc8XG4gICAgc3RyaW5nLFxuICAgIFRvb2xzSW5wdXQsXG4gICAgdW5kZWZpbmVkLFxuICAgIFRSZXF1ZXN0Q29udGV4dFxuICA+W1wiaW5zdHJ1Y3Rpb25zXCJdO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlZCBkZXNjcmlwdGlvbiBmb3IgYW4gYWdlbnQgd2hvc2UgZGVmaW5pdGlvbiBvbWl0cyBvbmUuIEtlcHRcbiAqIGdlbmVyaWMgKHRoZSBhZ2VudCdzIG93biBuYW1lIGlzIHRoZSBvbmx5IHJlbGlhYmxlIHNpZ25hbCBhdCBidWlsZFxuICogdGltZSkgc28gaXQgcmVhZHMgc2Vuc2libHkgYXMgdGhlIGBhc2tfPGlkPmAgTUNQIHRvb2wncyBkZXNjcmlwdGlvblxuICogYW5kIGluIGFnZW50IG1ldGFkYXRhLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0QWdlbnREZXNjcmlwdGlvbihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYENvbnZlcnNhdGlvbmFsIEFJIGFnZW50IFwiJHtuYW1lfVwiLmA7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBldmVyeSBlbnRyeSBpbiBgY29uZmlnLmFnZW50c2AgaW50byBhIE1hc3RyYSBgQWdlbnRgXG4gKiBpbnN0YW5jZS4gV2hlbiBgY29uZmlnLmFnZW50c2AgaXMgb21pdHRlZCB0aGUgcGx1Z2luIHJlZ2lzdGVycyBhXG4gKiBzaW5nbGUgYnVpbHQtaW4gYGRlZmF1bHRgIGFuYWx5c3Qgc28gdGhlIGJhcmUgYG1hc3RyYSgpYCBjYWxsIHN0aWxsXG4gKiB5aWVsZHMgYSB3b3JraW5nIGFnZW50LlxuICpcbiAqIFBlci1hZ2VudCB0b29sIGNhbGxiYWNrcyBhcmUgaW52b2tlZCBvbmNlIHdpdGggYSB0eXBlZFxuICoge0BsaW5rIE1hc3RyYVBsdWdpbnN9IGluZGV4IGJ1aWx0IGZyb20gcmVnaXN0ZXJlZCBzaWJsaW5nIHBsdWdpbnNcbiAqIChjdXJyZW50bHkgYGdlbmllYDsgZXh0ZW5kIGBNYXN0cmFQbHVnaW5zYCB0byBzdXJmYWNlIG1vcmUpLlxuICpcbiAqIEB0aHJvd3Mgd2hlbiBgY29uZmlnLmRlZmF1bHRBZ2VudGAgaXMgc2V0IHRvIGFuIGlkIHRoYXQgaXNuJ3QgaW4gdGhlXG4gKiAgIHJlc29sdmVkIHJlZ2lzdHJ5OyB0aGlzIGlzIGEgd2lyaW5nIGJ1Zywgbm90IGEgcnVudGltZSBjb25kaXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZEFnZW50cyhvcHRzOiB7XG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnO1xuICBjb250ZXh0OiBwbHVnaW4uUGx1Z2luQ29udGV4dExpa2UgfCB1bmRlZmluZWQ7XG4gIG1lbW9yeUJ1aWxkZXI/OiBNZW1vcnlCdWlsZGVyO1xuICBsb2c6IGxvZy5Mb2dnZXI7XG4gIC8qKlxuICAgKiBMb2NhbCBza2lsbCBzY2FuIHBhdGhzIChyZW1vdGUgc2tpbGxzIHByb3Zpc2lvbmVkIHRvIGEgdGVtcCBkaXIgYXRcbiAgICogc3RhcnR1cCkgZm9sZGVkIGludG8gZXZlcnkgYWdlbnQgdGhhdCB1c2VzIHRoZSBhdXRvLWNyZWF0ZWQgZGVmYXVsdFxuICAgKiB3b3Jrc3BhY2UuXG4gICAqL1xuICBleHRyYVNraWxsUGF0aHM/OiBzdHJpbmdbXTtcbn0pOiBQcm9taXNlPEJ1aWx0QWdlbnRzPiB7XG4gIGNvbnN0IHsgY29uZmlnLCBjb250ZXh0LCBtZW1vcnlCdWlsZGVyLCBsb2csIGV4dHJhU2tpbGxQYXRocyB9ID0gb3B0cztcbiAgY29uc3QgZGVmaW5pdGlvbnMgPSByZXNvbHZlRGVmaW5pdGlvbnMoY29uZmlnKTtcbiAgY29uc3QgaWRzID0gT2JqZWN0LmtleXMoZGVmaW5pdGlvbnMpO1xuICBjb25zdCBkZWZhdWx0QWdlbnRJZCA9IGNvbmZpZy5kZWZhdWx0QWdlbnQgPz8gaWRzWzBdID8/IEZBTExCQUNLX0FHRU5UX0lEO1xuXG4gIGNvbnN0IHBsdWdpbnMgPSBidWlsZFBsdWdpbnNNYXAoY29uZmlnLCBjb250ZXh0KTtcbiAgLy8gU3lzdGVtLWRlZmF1bHQgYW1iaWVudCB0b29scyBldmVyeSBhZ2VudCBnZXRzIG91dCBvZiB0aGUgYm94OlxuICAvLyBgcmVuZGVyX2RhdGFgIGZvciBpbmxpbmUgdmlzdWFsaXphdGlvbnMgYW5kIGBzdW1tYXJpemVgIGZvclxuICAvLyBvZmZsb2FkaW5nIHRleHQgY29uZGVuc2luZyB0byB0aGUgZmFzdCAvIHNtYWxsIGNoYXQgdGllci4gVGhlXG4gIC8vIHVzZXIgY2FuIHNoYWRvdyBlaXRoZXIgYnkgaW5jbHVkaW5nIGEgc2FtZS1uYW1lZCB0b29sIGluIHRoZWlyIG93blxuICAvLyBgY29uZmlnLnRvb2xzYCBvciBwZXItYWdlbnQgYHRvb2xzYC4gT3JkZXIgaW4ge0BsaW5rIHJlc29sdmVUb29sc31cbiAgLy8gaXMgYHN5c3RlbSAtPiB1c2VyLWFtYmllbnQgLT4gcGVyLWFnZW50YCwgbGFzdCB3cml0ZSB3aW5zLlxuICBjb25zdCBzeXN0ZW1Ub29sczogTWFzdHJhVG9vbHMgPSB7XG4gICAgcmVuZGVyX2RhdGE6IGJ1aWxkUmVuZGVyRGF0YVRvb2woY29uZmlnKSxcbiAgICBzdW1tYXJpemU6IGJ1aWxkU3VtbWFyaXplVG9vbChjb25maWcpLFxuICB9O1xuICBjb25zdCBhbWJpZW50VG9vbHMgPSB7XG4gICAgLi4uc3lzdGVtVG9vbHMsXG4gICAgLi4uKGNvbmZpZy50b29scyA/PyB7fSksXG4gIH07XG4gIGNvbnN0IHN0eWxlID0gcmVzb2x2ZVN0eWxlSW5zdHJ1Y3Rpb25zKGNvbmZpZyk7XG4gIC8vIERlZmF1bHQtb24gcHJvdGVjdGlvbiBhZ2FpbnN0IHRoZSBtb2RlbCBjb3B5aW5nIHR1cm4tc2NvcGVkXG4gIC8vIGNoYXJ0SWRzIGZyb20gcHJpb3IgYXNzaXN0YW50IHRvb2wgcmVzdWx0cyBpbnRvIHRoZSBuZXdcbiAgLy8gdHVybidzIGBbY2hhcnQ6PGlkPl1gIG1hcmtlcnMuIE9wdCBvdXQgcGVyLXBsdWdpbiB2aWFcbiAgLy8gYGNvbmZpZy5zdHJpcFN0YWxlQ2hhcnRzOiBmYWxzZWAuXG4gIGNvbnN0IGlucHV0UHJvY2Vzc29ycyA9IFtcbiAgICAuLi4oY29uZmlnLnN0cmlwU3RhbGVDaGFydHMgPT09IGZhbHNlID8gW10gOiBbc3RyaXBTdGFsZUNoYXJ0c1Byb2Nlc3Nvcl0pLFxuICBdO1xuICBjb25zdCBhZ2VudHM6IFJlY29yZDxzdHJpbmcsIEFnZW50PiA9IHt9O1xuICBjb25zdCBkZWZhdWx0TW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBBZ2VudERlZmF1bHRNb2RlbD4gPSB7fTtcbiAgY29uc3QgYXBwcm92YWxHYXRlZEJ5QWdlbnQ6IEFycmF5PHsgYWdlbnRJZDogc3RyaW5nOyB0b29sSWRzOiBzdHJpbmdbXSB9PiA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2lkLCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKGRlZmluaXRpb25zKSkge1xuICAgIGNvbnN0IHRvb2xzID0gYXdhaXQgcmVzb2x2ZVRvb2xzKGRlZi50b29scywgcGx1Z2lucywgYW1iaWVudFRvb2xzKTtcbiAgICBsZXQgd29ya3NwYWNlID0gcmVzb2x2ZUFnZW50V29ya3NwYWNlKGRlZi53b3Jrc3BhY2UpO1xuICAgIGlmIChcbiAgICAgIChkZWYud29ya3NwYWNlID09PSB1bmRlZmluZWQgJiYgIXdvcmtzcGFjZSkgfHxcbiAgICAgICgoZXh0cmFTa2lsbFBhdGhzPy5sZW5ndGggfHwgY29uZmlnLnNhbmRib3ggIT09IHVuZGVmaW5lZCkgJiYgaXNEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZSkpXG4gICAgKSB7XG4gICAgICB3b3Jrc3BhY2UgPSBjcmVhdGVXb3Jrc3BhY2Uoe1xuICAgICAgICBleHRyYVNraWxsUGF0aHMsXG4gICAgICAgIHNhbmRib3g6XG4gICAgICAgICAgY29uZmlnLnNhbmRib3ggPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc2FuZGJveCA9PT0gdHJ1ZSA/IFwiZGF0YWJyaWNrc1wiIDogY29uZmlnLnNhbmRib3gsXG4gICAgICB9KTtcbiAgICAgIG1hcmtEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZSk7XG4gICAgfVxuICAgIGNvbnN0IGdhdGVkID0gYXBwcm92YWxHYXRlZFRvb2xJZHModG9vbHMpO1xuICAgIGlmIChnYXRlZC5sZW5ndGggPiAwKSBhcHByb3ZhbEdhdGVkQnlBZ2VudC5wdXNoKHsgYWdlbnRJZDogaWQsIHRvb2xJZHM6IGdhdGVkIH0pO1xuICAgIGNvbnN0IG1lbW9yeSA9IG1lbW9yeUJ1aWxkZXI/LmZvckFnZW50KGlkLCBkZWYpO1xuICAgIGFnZW50c1tpZF0gPSBuZXcgQWdlbnQoe1xuICAgICAgaWQsXG4gICAgICBuYW1lOiBkZWYubmFtZSA/PyBpZCxcbiAgICAgIC8vIEFsd2F5cyBjYXJyeSBhIG5vbi1lbXB0eSBkZXNjcmlwdGlvbjogaXQncyBzdXJmYWNlZCB0byBNQ1BcbiAgICAgIC8vIGNsaWVudHMgKHdoaWNoIHJlamVjdCBhIGRlc2NyaXB0aW9uLWxlc3MgYWdlbnQpIGFuZCBpbiBhZ2VudFxuICAgICAgLy8gbWV0YWRhdGEuIEZhbGwgYmFjayB0byBhIGdlbmVyYXRlZCBvbmUgd2hlbiB0aGUgZGVmaW5pdGlvblxuICAgICAgLy8gb21pdHMgaXQuXG4gICAgICBkZXNjcmlwdGlvbjogZGVmLmRlc2NyaXB0aW9uPy50cmltKCkgfHwgZGVmYXVsdEFnZW50RGVzY3JpcHRpb24oZGVmLm5hbWUgPz8gaWQpLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBjb21wb3NlSW5zdHJ1Y3Rpb25zKGRlZi5pbnN0cnVjdGlvbnMsIHN0eWxlKSxcbiAgICAgIC4uLihkZWYucmVxdWVzdENvbnRleHRTY2hlbWEgPyB7IHJlcXVlc3RDb250ZXh0U2NoZW1hOiBkZWYucmVxdWVzdENvbnRleHRTY2hlbWEgfSA6IHt9KSxcbiAgICAgIG1vZGVsOiByZXNvbHZlTW9kZWwoY29uZmlnLCBkZWYubW9kZWwpLFxuICAgICAgZGVmYXVsdE9wdGlvbnM6IHtcbiAgICAgICAgbWF4U3RlcHM6IGNvbmZpZy5hZ2VudE1heFN0ZXBzID8/IERFRkFVTFRfQUdFTlRfTUFYX1NURVBTLFxuICAgICAgICBwcm92aWRlck9wdGlvbnM6IFJFU1BPTlNFU19QUk9WSURFUl9PUFRJT05TLFxuICAgICAgICAuLi4oZGVmLnJlcXVpcmVUb29sQXBwcm92YWwgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8geyByZXF1aXJlVG9vbEFwcHJvdmFsOiBkZWYucmVxdWlyZVRvb2xBcHByb3ZhbCB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgICAgdG9vbHMsXG4gICAgICAuLi4obWVtb3J5ID8geyBtZW1vcnkgfSA6IHt9KSxcbiAgICAgIC4uLih3b3Jrc3BhY2UgPyB7IHdvcmtzcGFjZSB9IDoge30pLFxuICAgICAgaW5wdXRQcm9jZXNzb3JzLFxuICAgIH0pO1xuICAgIC8vIFN1cmZhY2UgdGhlIGVmZmVjdGl2ZSBkZWZhdWx0IG1vZGVsIHBlciBhZ2VudCBzbyBvcGVyYXRvcnMgY2FuXG4gICAgLy8gc2VlIGF0IGEgZ2xhbmNlIHdoaWNoIGVuZHBvaW50IGVhY2ggYWdlbnQgcG9pbnRzIGF0IHdpdGhvdXRcbiAgICAvLyBoYXZpbmcgdG8gZmlyZSBhIHJlcXVlc3QgYW5kIGluc3BlY3QgYSB0cmFjZS4gVGhlIHZhbHVlIGlzIHRoZVxuICAgIC8vICpzdGF0aWMqIGRlZmF1bHQ7IHBlci1yZXF1ZXN0IG92ZXJyaWRlcyAoaGVhZGVyIC8gcXVlcnkgL1xuICAgIC8vIGJvZHkpIGFuZCB0aGUgd29ya3NwYWNlLWNhdGFsb2d1ZSBmdXp6eSBtYXRjaCBzdGlsbCBhcHBseSBhdFxuICAgIC8vIGNhbGwgdGltZS5cbiAgICBjb25zdCBkZWZhdWx0TW9kZWwgPSBkZXNjcmliZUFnZW50RGVmYXVsdE1vZGVsKGNvbmZpZywgZGVmKTtcbiAgICBkZWZhdWx0TW9kZWxzW2lkXSA9IGRlZmF1bHRNb2RlbDtcbiAgICBsb2cuaW5mbyhcImFnZW50IHJlZ2lzdGVyZWRcIiwge1xuICAgICAgaWQsXG4gICAgICBuYW1lOiBkZWYubmFtZSA/PyBpZCxcbiAgICAgIGRlZmF1bHRNb2RlbDpcbiAgICAgICAgZGVmYXVsdE1vZGVsLmtpbmQgPT09IFwiY29uZmlndXJlZFwiID8gZGVmYXVsdE1vZGVsLm1vZGVsIDogYDwke2RlZmF1bHRNb2RlbC5raW5kfT5gLFxuICAgICAgdG9vbHM6IE9iamVjdC5rZXlzKHRvb2xzKSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmICghYWdlbnRzW2RlZmF1bHRBZ2VudElkXSkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgYG1hc3RyYSBkZWZhdWx0QWdlbnQgXCIke2RlZmF1bHRBZ2VudElkfVwiYCxcbiAgICAgIGBSZWdpc3RlcmVkIGFnZW50czogJHtpZHMuam9pbihcIiwgXCIpIHx8IFwibm9uZVwifS5gLFxuICAgICk7XG4gIH1cblxuICBhc3NlcnRBcHByb3ZhbEdhdGVkVG9vbHNIYXZlU3RvcmFnZShhcHByb3ZhbEdhdGVkQnlBZ2VudCwgbWVtb3J5QnVpbGRlcik7XG5cbiAgbG9nLmluZm8oXCJhZ2VudHMgcmVhZHlcIiwgeyBpZHMsIGRlZmF1bHRBZ2VudElkIH0pO1xuICByZXR1cm4geyBhZ2VudHMsIGRlZmF1bHRBZ2VudElkLCBkZWZhdWx0TW9kZWxzLCBhbWJpZW50VG9vbHMgfTtcbn1cblxuLyoqXG4gKiBUb29sIGlkcyBvbiBgdG9vbHNgIHRoYXQgYXJlIGFwcHJvdmFsLWdhdGVkIChgcmVxdWlyZUFwcHJvdmFsOiB0cnVlYCkuXG4gKiBLZXlzIGFyZSB1c2VkIGFzIGEgZmFsbGJhY2sgd2hlbiBhIHRvb2wgb21pdHMgYW4gZXhwbGljaXQgYGlkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcHJvdmFsR2F0ZWRUb29sSWRzKHRvb2xzOiBNYXN0cmFUb29scyk6IHN0cmluZ1tdIHtcbiAgaWYgKCF0b29scyB8fCB0eXBlb2YgdG9vbHMgIT09IFwib2JqZWN0XCIpIHJldHVybiBbXTtcbiAgcmV0dXJuIFtcbiAgICAuLi5vYmplY3RcbiAgICAgIC5zZXF1ZW5jZShPYmplY3QuZW50cmllcyh0b29scykpXG4gICAgICAuZmlsdGVyKChbLCB0b29sXSkgPT4gaXNBcHByb3ZhbEdhdGVkVG9vbCh0b29sKSlcbiAgICAgIC5tYXAoKFtrZXksIHRvb2xdKSA9PiByZXNvbHZlVG9vbElkKHRvb2wsIGtleSkpLFxuICBdO1xufVxuXG4vKiogVHJ1ZSB3aGVuIGEgTWFzdHJhIC8gQUkgU0RLIHRvb2wgcGF1c2VzIGZvciBodW1hbiBhcHByb3ZhbCBiZWZvcmUgZXhlY3V0ZS4gKi9cbmZ1bmN0aW9uIGlzQXBwcm92YWxHYXRlZFRvb2wodG9vbDogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIXRvb2wgfHwgdHlwZW9mIHRvb2wgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuICh0b29sIGFzIHsgcmVxdWlyZUFwcHJvdmFsPzogYm9vbGVhbiB9KS5yZXF1aXJlQXBwcm92YWwgPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUb29sSWQodG9vbDogdW5rbm93biwgZmFsbGJhY2tLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICh0b29sICYmIHR5cGVvZiB0b29sID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiAodG9vbCBhcyB7IGlkPzogc3RyaW5nIH0pLmlkID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuICh0b29sIGFzIHsgaWQ6IHN0cmluZyB9KS5pZDtcbiAgfVxuICByZXR1cm4gZmFsbGJhY2tLZXk7XG59XG5cbi8qKlxuICogQXBwcm92YWwtZ2F0ZWQgdG9vbHMgc3VzcGVuZCB0aGUgYWdlbnQgbG9vcCB1bnRpbCBhIGh1bWFuIGFwcHJvdmVzLlxuICogTWFzdHJhIHBlcnNpc3RzIHRob3NlIHN1c3BlbmRlZCBydW5zIGluIE1hc3RyYS1pbnN0YW5jZS1sZXZlbCBzdG9yYWdlXG4gKiAoYG1lbW9yeUJ1aWxkZXIuaW5zdGFuY2VTdG9yYWdlKClgKSwgbm90IHBlci1hZ2VudCBtZW1vcnkgLSBzbyBib290XG4gKiBtdXN0IGZhaWwgZmFzdCB3aGVuIHN1Y2ggYSB0b29sIGlzIHJlZ2lzdGVyZWQgd2l0aG91dCBzdG9yYWdlLlxuICovXG5mdW5jdGlvbiBhc3NlcnRBcHByb3ZhbEdhdGVkVG9vbHNIYXZlU3RvcmFnZShcbiAgZ2F0ZWQ6IEFycmF5PHsgYWdlbnRJZDogc3RyaW5nOyB0b29sSWRzOiBzdHJpbmdbXSB9PixcbiAgbWVtb3J5QnVpbGRlcjogTWVtb3J5QnVpbGRlciB8IHVuZGVmaW5lZCxcbik6IHZvaWQge1xuICBpZiAoZ2F0ZWQubGVuZ3RoID09PSAwKSByZXR1cm47XG4gIGlmIChtZW1vcnlCdWlsZGVyPy5pbnN0YW5jZVN0b3JhZ2UoKSkgcmV0dXJuO1xuXG4gIGNvbnN0IGRldGFpbCA9IGdhdGVkXG4gICAgLm1hcCgoeyBhZ2VudElkLCB0b29sSWRzIH0pID0+IGAke2FnZW50SWR9OiAke3Rvb2xJZHMuam9pbihcIiwgXCIpfWApXG4gICAgLmpvaW4oXCI7IFwiKTtcbiAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcbiAgICBcIm1hc3RyYTogYXBwcm92YWwtZ2F0ZWQgdG9vbHMgcmVxdWlyZSBwbHVnaW4gc3RvcmFnZSAoUG9zdGdyZXNTdG9yZSkgdG8gcGVyc2lzdCBzdXNwZW5kZWQgcnVucy4gXCIgK1xuICAgICAgYEFmZmVjdGVkIGFnZW50cy90b29sczogJHtkZXRhaWx9LiBgICtcbiAgICAgIFwiUmVnaXN0ZXIgbGFrZWJhc2UoKSBiZWZvcmUgbWFzdHJhKCkgc28gc3RvcmFnZSBhdXRvLWVuYWJsZXMsIG9yIHBhc3Mgc3RvcmFnZTogdHJ1ZSBleHBsaWNpdGx5LlwiLFxuICApO1xufVxuXG4vKipcbiAqIERlc2NyaWJlIGhvdyBhbiBhZ2VudCByZXNvbHZlcyBpdHMgdW5waW5uZWQgbW9kZWw6XG4gKlxuICogICAxLiBQZXItYWdlbnQgYGRlZi5tb2RlbGAgKHN0cmluZyBzdWdhciBpcyBjb25maWd1cmVkOyBhIGZ1bmN0aW9uIGlzXG4gKiAgICAgIGR5bmFtaWMpLlxuICogICAyLiBQbHVnaW4tbGV2ZWwgYGNvbmZpZy5kZWZhdWx0TW9kZWxgIChzYW1lIHJ1bGVzKS5cbiAqICAgMy4gYERBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FYCBlbnYgdmFyLlxuICogICA0LiBBdXRvbWF0aWMgbGl2ZS1jYXRhbG9ndWUgcmFua2luZyB3aGVuIG5vbmUgaXMgc2V0LlxuICpcbiAqIFVzZWQgZm9yIHRoZSBzdGFydHVwIGBhZ2VudCByZWdpc3RlcmVkYCBsb2cgc28gb3BlcmF0b3JzIGNhbiBzZWVcbiAqIGBkZWZhdWx0TW9kZWxGYWxsYmFja3NgIHJlbWFpbnMgYW4gb3BlcmF0b3ItcGlubmVkIGNhbmRpZGF0ZSBsaXN0IGluc2lkZSB0aGVcbiAqIGF1dG9tYXRpYyBsaXZlIGxvb2t1cDsgaXQgaXMgbm90IGFkdmVydGlzZWQgYXMgYSBtb2RlbCB1bnRpbCBhdmFpbGFiaWxpdHkgaXNcbiAqIGNoZWNrZWQuXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlQWdlbnREZWZhdWx0TW9kZWwoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBkZWY6IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbixcbik6IEFnZW50RGVmYXVsdE1vZGVsIHtcbiAgY29uc3QgZWZmZWN0aXZlID0gZGVmLm1vZGVsID8/IGNvbmZpZy5kZWZhdWx0TW9kZWw7XG4gIGlmICh0eXBlb2YgZWZmZWN0aXZlID09PSBcInN0cmluZ1wiKSByZXR1cm4geyBraW5kOiBcImNvbmZpZ3VyZWRcIiwgbW9kZWw6IGVmZmVjdGl2ZSB9O1xuICBpZiAoZWZmZWN0aXZlICE9PSB1bmRlZmluZWQpIHJldHVybiB7IGtpbmQ6IFwiZHluYW1pY1wiIH07XG4gIGNvbnN0IGVudmlyb25tZW50ID0gcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUU7XG4gIHJldHVybiBlbnZpcm9ubWVudCA/IHsga2luZDogXCJjb25maWd1cmVkXCIsIG1vZGVsOiBlbnZpcm9ubWVudCB9IDogeyBraW5kOiBcImF1dG9cIiB9O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBgY29uZmlnLmFnZW50c2AgaW50byBhIGBSZWNvcmQ8aWQsIGRlZmluaXRpb24+YC4gQWNjZXB0c1xuICogYW55IG9mIHRoZSB0aHJlZSBzaGFwZXMgZG9jdW1lbnRlZCBvblxuICoge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5hZ2VudHN9OlxuICpcbiAqIC0gUmVjb3JkIC0gcmV0dXJuZWQgYXMtaXMgd2hlbiBub24tZW1wdHkuXG4gKiAtIFNpbmdsZSBkZWZpbml0aW9uIChkZXRlY3RlZCB2aWEgdGhlIHJlcXVpcmVkIGBpbnN0cnVjdGlvbnNgXG4gKiAgIGZpZWxkKSAtIGtleWVkIGJ5IGBzbHVnaWZ5KGRlZi5uYW1lKWAgb3IgYEZBTExCQUNLX0FHRU5UX0lEYC5cbiAqIC0gQXJyYXkgLSBrZXllZCBieSBgc2x1Z2lmeShkZWYubmFtZSlgIG9yIGBhZ2VudF8ke2l9YDsgZHVwbGljYXRlXG4gKiAgIHNsdWdzIGZhaWwgbG91ZGx5IHNvIHVzZXJzIGtub3cgdG8gc2V0IGV4cGxpY2l0IG5hbWVzLlxuICpcbiAqIE9taXR0ZWQgb3IgZW1wdHkgaW5wdXRzIGZhbGwgYmFjayB0byBhIHNpbmdsZSBidWlsdC1pbiBhbmFseXN0IHNvXG4gKiB0aGUgYmFyZSBgbWFzdHJhKClgIGNhbGwgc3RpbGwgbW91bnRzIGEgd29ya2luZyBjaGF0IHJvdXRlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlRGVmaW5pdGlvbnMoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBSZWNvcmQ8c3RyaW5nLCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24+IHtcbiAgY29uc3QgaW5wdXQgPSBjb25maWcuYWdlbnRzO1xuICBpZiAoIWlucHV0KSByZXR1cm4gZmFsbGJhY2tEZWZpbml0aW9ucygpO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgIGlmIChpbnB1dC5sZW5ndGggPT09IDApIHJldHVybiBmYWxsYmFja0RlZmluaXRpb25zKCk7XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24+ID0ge307XG4gICAgaW5wdXQuZm9yRWFjaCgoZGVmLCBpKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBkZXJpdmVBZ2VudEtleShkZWYsIGkpO1xuICAgICAgaWYgKG91dFtrZXldKSB7XG4gICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgICAgICAgYG1hc3RyYTogZHVwbGljYXRlIGFnZW50IGlkIFwiJHtrZXl9XCIgZGVyaXZlZCBmcm9tIG5hbWUgXCIke2RlZi5uYW1lID8/IFwiXCJ9XCI7IGAgK1xuICAgICAgICAgICAgYHNldCB1bmlxdWUgXFxgbmFtZVxcYHMgb24gZWFjaCBkZWZpbml0aW9uYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG91dFtrZXldID0gZGVmO1xuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvLyBTaW5nbGUtZGVmaW5pdGlvbiBzaG9ydGhhbmQ6IGFuIGFnZW50IG93bnMgdGhlIHJlcXVpcmVkIGBpbnN0cnVjdGlvbnNgXG4gIC8vIGZpZWxkIChzdGF0aWMgb3IgZHluYW1pYyk7IGEgcmVjb3JkLW9mLWFnZW50cyBuZXZlciBvd25zIGl0IGRpcmVjdGx5LlxuICBpZiAoXCJpbnN0cnVjdGlvbnNcIiBpbiBpbnB1dCkge1xuICAgIGNvbnN0IGRlZiA9IGlucHV0IGFzIEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbjtcbiAgICBjb25zdCBrZXkgPSBkZXJpdmVBZ2VudEtleShkZWYpO1xuICAgIHJldHVybiB7IFtrZXldOiBkZWYgfTtcbiAgfVxuXG4gIGNvbnN0IHJlY29yZCA9IGlucHV0IGFzIFJlY29yZDxzdHJpbmcsIEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbj47XG4gIGlmIChPYmplY3Qua2V5cyhyZWNvcmQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTtcbiAgcmV0dXJuIHJlY29yZDtcbn1cblxuLyoqIERlcml2ZSBhIHJlZ2lzdHJ5IGlkIGZyb20gYSBkZWZpbml0aW9uJ3MgYG5hbWVgLCB3aXRoIGEgZmFsbGJhY2suICovXG5mdW5jdGlvbiBkZXJpdmVBZ2VudEtleShkZWY6IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbiwgaW5kZXg/OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoZGVmLm5hbWUpIHtcbiAgICBjb25zdCBzbHVnID0gc3RyaW5nLnRvSWRlbnRpZmllcihkZWYubmFtZSk7XG4gICAgaWYgKHNsdWcpIHJldHVybiBzbHVnO1xuICB9XG4gIHJldHVybiBpbmRleCA9PT0gdW5kZWZpbmVkID8gRkFMTEJBQ0tfQUdFTlRfSUQgOiBgYWdlbnRfJHtpbmRleH1gO1xufVxuXG4vKiogQnVpbHQtaW4gZmFsbGJhY2sgcmVnaXN0cnkgdXNlZCB3aGVuIGBhZ2VudHNgIGlzIG9taXR0ZWQgLyBlbXB0eS4gKi9cbmZ1bmN0aW9uIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTogUmVjb3JkPHN0cmluZywgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uPiB7XG4gIHJldHVybiB7XG4gICAgW0ZBTExCQUNLX0FHRU5UX0lEXToge1xuICAgICAgbmFtZTogXCJEZWZhdWx0IEFnZW50XCIsXG4gICAgICBpbnN0cnVjdGlvbnM6IEZBTExCQUNLX0FHRU5UX0lOU1RSVUNUSU9OUyxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIGVmZmVjdGl2ZSBtb2RlbCBzcGVjIGZvciBhbiBhZ2VudC4gRmFsbGJhY2sgbGFkZGVyLCBpblxuICogb3JkZXI6XG4gKlxuICogICAxLiBQZXItYWdlbnQgYGRlZi5tb2RlbGAgKHN0cmluZyBzdWdhciBvciBgRHluYW1pY0FyZ3VtZW50YCkuXG4gKiAgIDIuIFBsdWdpbi1sZXZlbCBgY29uZmlnLmRlZmF1bHRNb2RlbGAgKHN0cmluZyBzdWdhciBvclxuICogICAgICBgRHluYW1pY0FyZ3VtZW50YCkgLSBtaXJyb3JzIEFwcEtpdCdzIGBhZ2VudHMoeyBkZWZhdWx0TW9kZWwgfSlgLlxuICogICAzLiBUaGUgYXV0by1yZXNvbHZlciB0aGF0IG1pbnRzIHVzZXItc2NvcGVkIHRva2VucyBhZ2FpbnN0XG4gKiAgICAgIGAvc2VydmluZy1lbmRwb2ludHNgIHZpYSB7QGxpbmsgYnVpbGRNb2RlbH0uXG4gKlxuICogU3RyaW5nIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyBgbW9kZWxJZGAgc3VnYXIgYW5kIHRocmVhZGVkIHRocm91Z2hcbiAqIGBidWlsZE1vZGVsYCdzIG92ZXJyaWRlIGhvb2sgc28gdGhlIHJ1bnRpbWUgZnV6enkgbWF0Y2hlciBhbmQgdGhlXG4gKiBwZXItcmVxdWVzdCBgWC1NYXN0cmEtTW9kZWxgIG92ZXJyaWRlIGxheWVyIG9uIHRvcCBvZiB0aGUgc3RhdGljXG4gKiBjaG9pY2UuIE5vbi1zdHJpbmcgYER5bmFtaWNBcmd1bWVudGBzIGFyZSBwYXNzZWQgdGhyb3VnaCB2ZXJiYXRpbTtcbiAqIGNhbGxlcnMgdGhhdCBuZWVkIGZ1bGwgY29udHJvbCBvdmVyIGBwcm92aWRlcklkYCAvIGBoZWFkZXJzYCAvXG4gKiBgbW9kZWxJZGAgYnlwYXNzIHRoZSByZXNvbHZlciBwaXBlbGluZSBlbnRpcmVseS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU1vZGVsKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgb3ZlcnJpZGU6IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbltcIm1vZGVsXCJdLFxuKTogQWdlbnRDb25maWdbXCJtb2RlbFwiXSB7XG4gIGNvbnN0IGVmZmVjdGl2ZSA9IG92ZXJyaWRlID8/IGNvbmZpZy5kZWZhdWx0TW9kZWw7XG4gIGlmIChlZmZlY3RpdmUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PiBidWlsZE1vZGVsKGNvbmZpZywgcmVxdWVzdENvbnRleHQpO1xuICB9XG4gIGlmICh0eXBlb2YgZWZmZWN0aXZlID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgbW9kZWxJZCA9IGVmZmVjdGl2ZTtcbiAgICByZXR1cm4gKHsgcmVxdWVzdENvbnRleHQgfSkgPT4gYnVpbGRNb2RlbChjb25maWcsIHJlcXVlc3RDb250ZXh0LCB7IG1vZGVsSWQgfSk7XG4gIH1cbiAgcmV0dXJuIGVmZmVjdGl2ZTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgZGVmaW5pdGlvbidzIGB0b29sc2AgZmllbGQgdG8gYSBmbGF0IGBNYXN0cmFUb29sc2AgcmVjb3JkLFxuICogbWVyZ2luZyBpbiBwbHVnaW4tbGV2ZWwgYW1iaWVudCB0b29scyAocGVyLWFnZW50IHRvb2xzIHdpbiBvbiBrZXlcbiAqIGNvbGxpc2lvbikuIENhbGxiYWNrIGVycm9ycyBwcm9wYWdhdGUgdmVyYmF0aW0gc28gdGhlIG9yaWdpbmFsIHN0YWNrXG4gKiBzdXJ2aXZlcyAtIHRoZSBjYWxsZXIgYWxyZWFkeSBrbm93cyB3aGljaCBhZ2VudCB3YXMgcmVnaXN0ZXJpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVUb29scyhcbiAgZGVmVG9vbHM6IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbltcInRvb2xzXCJdLFxuICBwbHVnaW5zOiBNYXN0cmFQbHVnaW5zLFxuICBhbWJpZW50VG9vbHM6IE1hc3RyYVRvb2xzLFxuKTogUHJvbWlzZTxNYXN0cmFUb29scz4ge1xuICBpZiAoIWRlZlRvb2xzKSByZXR1cm4geyAuLi5hbWJpZW50VG9vbHMgfTtcbiAgY29uc3QgcmVzb2x2ZWQgPSB0eXBlb2YgZGVmVG9vbHMgPT09IFwiZnVuY3Rpb25cIiA/IGF3YWl0IGRlZlRvb2xzKHBsdWdpbnMpIDogZGVmVG9vbHM7XG4gIHJldHVybiB7IC4uLmFtYmllbnRUb29scywgLi4ucmVzb2x2ZWQgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFnZW50V29ya3NwYWNlKFxuICB3b3Jrc3BhY2U6IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbltcIndvcmtzcGFjZVwiXSxcbik6IFdvcmtzcGFjZSB8IHVuZGVmaW5lZCB7XG4gIGlmICghd29ya3NwYWNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIHdvcmtzcGFjZSA9PT0gXCJmdW5jdGlvblwiID8gd29ya3NwYWNlKCkgOiB3b3Jrc3BhY2U7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHtAbGluayBNYXN0cmFQbHVnaW5zfSBydW50aW1lIHByb3h5IGhhbmRlZCB0b1xuICogYHRvb2xzKHBsdWdpbnMpYCBjYWxsYmFja3MuXG4gKlxuICogSW1wbGVtZW50ZWQgYXMgYSBgUHJveHlgIG92ZXIgdGhlIEFwcEtpdCBwbHVnaW4gY29udGV4dCBzb1xuICogYHBsdWdpbnMuPG5hbWU+YCByZXNvbHZlcyBhdCBmaXJzdCBhY2Nlc3MuIEFueSBzaWJsaW5nIHBsdWdpbiB0aGF0XG4gKiBpbXBsZW1lbnRzIEFwcEtpdCdzIHN0YW5kYXJkIGBUb29sUHJvdmlkZXJgIGludGVyZmFjZVxuICogKGB0b29sa2l0KG9wdHM/KWAgKyBgZXhlY3V0ZUFnZW50VG9vbChuYW1lLCBhcmdzLCBzaWduYWw/LCBjb250ZXh0PylgKSBpc1xuICogYXV0by1hZGFwdGVkIGludG8gTWFzdHJhIHRvb2xzLiBVbmtub3duIG5hbWVzIHJldHVybiBgdW5kZWZpbmVkYCxcbiAqIG1hdGNoaW5nIEFwcEtpdCdzIGBQbHVnaW5zYCBzZW1hbnRpY3Mgc28gYHBsdWdpbnMuZm9vPy50b29sa2l0KClgXG4gKiByZW1haW5zIHNhZmUgaW4gZW52aXJvbm1lbnRzIHdoZXJlIGBmb29gIGlzbid0IHJlZ2lzdGVyZWQuXG4gKlxuICogYGdlbmllYCBpcyBzcGVjaWFsLWNhc2VkIHRvIHN3YXAgdGhlIGdlbmVyaWMgQXBwS2l0IHRvb2xraXQgKHdoaWNoXG4gKiBydW5zIGBleGVjdXRlQWdlbnRUb29sYCBhbmQgb25seSBlbWl0cyBhIHNpbmdsZSBmaW5hbCBgdG9vbC1yZXN1bHRgXG4gKiBjaHVuayBwZXIgY2FsbCkgZm9yIHRoZSBzdHJlYW1pbmctYXdhcmUgdG9vbHMgYnVpbHQgYnlcbiAqIHtAbGluayBidWlsZEdlbmllVG9vbGtpdFByb3ZpZGVyfS4gVGhlIHN0cmVhbWluZyB2YXJpYW50IGZvcndhcmRzIGVhY2hcbiAqIEdlbmllIHdpcmUgZXZlbnQgKHN0YXR1cywgU1FMLCByb3cgY291bnRzLCBlcnJvcnMpIG91dCB0aHJvdWdoIHRoZVxuICogTWFzdHJhIGBjdHgud3JpdGVyYCwgc28gdGhlIFVJIGdldHMgYHRvb2wtb3V0cHV0YCBjaHVua3MgaW4gcmVhbFxuICogdGltZSBpbnN0ZWFkIG9mIHN0YXJpbmcgYXQgYSBzcGlubmVyIGZvciB0aGUgZnVsbCBHZW5pZSByb3VuZC10cmlwLlxuICovXG5mdW5jdGlvbiBidWlsZFBsdWdpbnNNYXAoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBjb250ZXh0OiBwbHVnaW4uUGx1Z2luQ29udGV4dExpa2UgfCB1bmRlZmluZWQsXG4pOiBNYXN0cmFQbHVnaW5zIHtcbiAgY29uc3QgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyIHwgbnVsbD4oKTtcbiAgcmV0dXJuIG5ldyBQcm94eSh7fSBhcyBNYXN0cmFQbHVnaW5zLCB7XG4gICAgZ2V0KF90YXJnZXQsIHByb3BOYW1lKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3BOYW1lICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgaWYgKGNhY2hlLmhhcyhwcm9wTmFtZSkpIHJldHVybiBjYWNoZS5nZXQocHJvcE5hbWUpID8/IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHByb3ZpZGVyID0gcmVzb2x2ZVByb3ZpZGVyKGNvbmZpZywgY29udGV4dCwgcHJvcE5hbWUpO1xuICAgICAgY2FjaGUuc2V0KHByb3BOYW1lLCBwcm92aWRlcik7XG4gICAgICByZXR1cm4gcHJvdmlkZXIgPz8gdW5kZWZpbmVkO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIHJpZ2h0IHtAbGluayBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXJ9IGZvciBhIHNpYmxpbmdcbiAqIHBsdWdpbiBsb29rdXAuIFJldHVybnMgdGhlIEdlbmllIGFnZW50LWJhY2tlZCBhZGFwdGVyIHdoZW5cbiAqIHRoZSBjYWxsZXIgYXNrcyBmb3IgYGdlbmllYCBBTkQgYXQgbGVhc3Qgb25lIHNwYWNlIGlzIHJlYWNoYWJsZVxuICogdmlhIHtAbGluayByZXNvbHZlR2VuaWVTcGFjZXN9ICh0aGUgZXhwbGljaXRcbiAqIGBjb25maWcuZ2VuaWVTcGFjZXNgLCB0aGUgcmVnaXN0ZXJlZCBBcHBLaXQgYGdlbmllKClgIHBsdWdpbidzXG4gKiBgc3BhY2VzYCBjb25maWcsIG9yIHRoZSBgREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRGAgZW52IHZhcikuXG4gKiBGYWxscyBiYWNrIHRvIHRoZSBnZW5lcmljIEFwcEtpdCBgVG9vbFByb3ZpZGVyYCBhZGFwdGVyIGZvclxuICogZXZlcnkgb3RoZXIgcGx1Z2luIG5hbWUuIGBjb25maWdgIGlzIHRocmVhZGVkIHRocm91Z2ggc28gdGhlXG4gKiBHZW5pZSBhZ2VudCBpbmhlcml0cyB0aGUgc2FtZSBtb2RlbCByZXNvbHZlciAvIGZhbGxiYWNrXG4gKiBsYWRkZXIgdGhlIGNhbGxpbmcgYWdlbnRzIHVzZS5cbiAqXG4gKiBUaGUgR2VuaWUgdG9vbHMgdGFsayB0byBHZW5pZSBkaXJlY3RseSB0aHJvdWdoIGBAZGJ4LXRvb2xzL2dlbmllYFxuICogKGBnZW5pZUV2ZW50Q2hhdGApIGFuZCB0aGUgd29ya3NwYWNlIGBzdGF0ZW1lbnRFeGVjdXRpb24uZ2V0U3RhdGVtZW50YFxuICogQVBJOyBBcHBLaXQncyBzdG9jayBgZ2VuaWVgIHBsdWdpbiBjb250cmlidXRlcyBvbmx5IGl0cyByZXNvdXJjZVxuICogbWFuaWZlc3QgYW5kIGBzcGFjZXNgIGNvbmZpZywgc28gYW4gYGFwcC55YW1sYCByZXNvdXJjZSBiaW5kaW5nIGFuZCBhXG4gKiBgZ2VuaWUoeyBzcGFjZXMgfSlgIHJlY29yZCBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgaGVyZSBhcyB0aGV5IGRvIHRoZXJlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlUHJvdmlkZXIoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBjb250ZXh0OiBwbHVnaW4uUGx1Z2luQ29udGV4dExpa2UgfCB1bmRlZmluZWQsXG4gIHByb3BOYW1lOiBzdHJpbmcsXG4pOiBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIgfCBudWxsIHtcbiAgaWYgKHByb3BOYW1lID09PSBcImdlbmllXCIpIHtcbiAgICBjb25zdCBzcGFjZXMgPSByZXNvbHZlR2VuaWVTcGFjZXMoY29uZmlnLCBjb250ZXh0KTtcbiAgICBpZiAoT2JqZWN0LmtleXMoc3BhY2VzKS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgIHJldHVybiBidWlsZEdlbmllVG9vbGtpdFByb3ZpZGVyKHtcbiAgICAgIHNwYWNlcyxcbiAgICAgIGNvbmZpZyxcbiAgICB9KSBhcyBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXI7XG4gIH1cbiAgY29uc3QgcGx1Z2luID0gY29udGV4dD8uZ2V0UGx1Z2lucygpLmdldChwcm9wTmFtZSk7XG4gIHJldHVybiBhZGFwdFBsdWdpblRvb2xraXQocGx1Z2luLCBwcm9wTmFtZSk7XG59XG5cbnR5cGUgQ29udGV4dHVhbFRvb2xQcm92aWRlciA9IFBhcnRpYWw8UGljazxUb29sUHJvdmlkZXIsIFwiZ2V0QWdlbnRUb29sc1wiPj4gJiB7XG4gIHRvb2xraXQ/OiAoXG4gICAgb3B0cz86IFRvb2xraXRPcHRpb25zLFxuICApID0+XG4gICAgfCBSZXR1cm5UeXBlPFBsdWdpblRvb2xraXRQcm92aWRlcltcInRvb2xraXRcIl0+XG4gICAgfCBQcm9taXNlPFJldHVyblR5cGU8UGx1Z2luVG9vbGtpdFByb3ZpZGVyW1widG9vbGtpdFwiXT4+O1xuICBleGVjdXRlQWdlbnRUb29sPzogKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBhcmdzOiB1bmtub3duLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICAgIGNvbnRleHQ/OiB7IHJlc291cmNlSWQ/OiBzdHJpbmcgfSxcbiAgKSA9PiBQcm9taXNlPHVua25vd24+O1xufTtcblxuLyoqXG4gKiBBZGFwdCBhbiBBcHBLaXQgYFRvb2xQcm92aWRlcmAgcGx1Z2luIGluc3RhbmNlIGludG8gYVxuICoge0BsaW5rIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlcn0uIFJldHVybnMgYG51bGxgIGZvciBhbnkgcGx1Z2luXG4gKiB0aGF0IGRvZXNuJ3QgaW1wbGVtZW50IGBleGVjdXRlQWdlbnRUb29sYCBwbHVzIGVpdGhlciBBcHBLaXQncyBuYXRpdmVcbiAqIGB0b29sa2l0YCBvciBgZ2V0QWdlbnRUb29sc2Agc3VyZmFjZS5cbiAqL1xuZnVuY3Rpb24gYWRhcHRQbHVnaW5Ub29sa2l0KFxuICBwbHVnaW46IHVua25vd24sXG4gIHBsdWdpbk5hbWU6IHN0cmluZyxcbik6IE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciB8IG51bGwge1xuICBpZiAoIXBsdWdpbiB8fCB0eXBlb2YgcGx1Z2luICE9PSBcIm9iamVjdFwiKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcCA9IHBsdWdpbiBhcyBDb250ZXh0dWFsVG9vbFByb3ZpZGVyO1xuICBpZiAoXG4gICAgdHlwZW9mIHAuZXhlY3V0ZUFnZW50VG9vbCAhPT0gXCJmdW5jdGlvblwiIHx8XG4gICAgKHR5cGVvZiBwLnRvb2xraXQgIT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgcC5nZXRBZ2VudFRvb2xzICE9PSBcImZ1bmN0aW9uXCIpXG4gICkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB7XG4gICAgdG9vbGtpdChvcHRzPzogVG9vbGtpdE9wdGlvbnMpOiBNYXN0cmFUb29scyB8IFByb21pc2U8TWFzdHJhVG9vbHM+IHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPVxuICAgICAgICB0eXBlb2YgcC50b29sa2l0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHAudG9vbGtpdChvcHRzKVxuICAgICAgICAgIDogdG9vbGtpdEVudHJpZXNGcm9tRGVmaW5pdGlvbnMocGx1Z2luTmFtZSwgcC5nZXRBZ2VudFRvb2xzISgpLCBvcHRzKTtcbiAgICAgIGlmIChpc1Byb21pc2VMaWtlKGVudHJpZXMpKSB7XG4gICAgICAgIHJldHVybiBlbnRyaWVzLnRoZW4oKHJlc29sdmVkKSA9PiB0b29sa2l0RW50cmllc1RvTWFzdHJhVG9vbHMocmVzb2x2ZWQsIHApKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0b29sa2l0RW50cmllc1RvTWFzdHJhVG9vbHMoZW50cmllcywgcCk7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdG9vbGtpdEVudHJpZXNGcm9tRGVmaW5pdGlvbnMoXG4gIHBsdWdpbk5hbWU6IHN0cmluZyxcbiAgZGVmaW5pdGlvbnM6IEFnZW50VG9vbERlZmluaXRpb25bXSxcbiAgb3B0aW9uczogVG9vbGtpdE9wdGlvbnMgPSB7fSxcbik6IFJlY29yZDxzdHJpbmcsIFRvb2xraXRFbnRyeT4ge1xuICByZXR1cm4gYXBwa2l0VG9vbGtpdC5lbnRyaWVzKHBsdWdpbk5hbWUsIGRlZmluaXRpb25zLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gaXNQcm9taXNlTGlrZTxUPih2YWx1ZTogVCB8IFByb21pc2U8VD4pOiB2YWx1ZSBpcyBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIHR5cGVvZiAodmFsdWUgYXMgeyB0aGVuPzogdW5rbm93biB9KT8udGhlbiA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG5mdW5jdGlvbiB0b29sa2l0RW50cmllc1RvTWFzdHJhVG9vbHMoXG4gIGVudHJpZXM6IFJlY29yZDxzdHJpbmcsIFRvb2xraXRFbnRyeT4sXG4gIHBsdWdpbjogQ29udGV4dHVhbFRvb2xQcm92aWRlcixcbik6IE1hc3RyYVRvb2xzIHtcbiAgY29uc3QgdG9vbHM6IE1hc3RyYVRvb2xzID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpKSB7XG4gICAgdG9vbHNba2V5XSA9IHRvb2xraXRFbnRyeVRvTWFzdHJhVG9vbChlbnRyeSwgcGx1Z2luKTtcbiAgfVxuICByZXR1cm4gdG9vbHM7XG59XG5cbi8qKlxuICogV3JhcCBhIHNpbmdsZSB7QGxpbmsgQXBwS2l0VG9vbGtpdEVudHJ5fSBhcyBhIE1hc3RyYSB0b29sIHdob3NlXG4gKiBgZXhlY3V0ZWAgZGlzcGF0Y2hlcyBiYWNrIHRocm91Z2ggYHBsdWdpbi5leGVjdXRlQWdlbnRUb29sKC4uLilgIHNvXG4gKiBBcHBLaXQncyBPQk8gYXV0aCAoYGFzVXNlcmApLCB0ZWxlbWV0cnkgc3BhbnMsIGFuZCB0aGUgTWFzdHJhIG1lbW9yeSByZXNvdXJjZVxuICogaWQgc3RheSBpbnRhY3QuIEpTT04gU2NoZW1hIHBhcmFtZXRlcnMgcGFzcyB0aHJvdWdoIHVuY2hhbmdlZCAtIE1hc3RyYSdzXG4gKiBgUHVibGljU2NoZW1hYCBhY2NlcHRzIGBKU09OU2NoZW1hN2AgZGlyZWN0bHkgdmlhIGBAbWFzdHJhL3NjaGVtYS1jb21wYXRgLlxuICovXG5mdW5jdGlvbiB0b29sa2l0RW50cnlUb01hc3RyYVRvb2woZW50cnk6IFRvb2xraXRFbnRyeSwgcGx1Z2luOiBDb250ZXh0dWFsVG9vbFByb3ZpZGVyKTogVG9vbCB7XG4gIGNvbnN0IGFubm90YXRpb25zID0gZW50cnkuYW5ub3RhdGlvbnMgPz8gZW50cnkuZGVmLmFubm90YXRpb25zO1xuICBjb25zdCBlZmZlY3QgPSBhbm5vdGF0aW9ucz8uZWZmZWN0O1xuICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID1cbiAgICAoZWZmZWN0ICE9PSB1bmRlZmluZWQgJiYgZWZmZWN0ICE9PSBcInJlYWRcIikgfHwgYW5ub3RhdGlvbnM/LmRlc3RydWN0aXZlID09PSB0cnVlO1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQ6IGAke2VudHJ5LnBsdWdpbk5hbWV9X18ke2VudHJ5LmxvY2FsTmFtZX1gLFxuICAgIGRlc2NyaXB0aW9uOiBlbnRyeS5kZWYuZGVzY3JpcHRpb24sXG4gICAgLi4uKGVudHJ5LmRlZi5wYXJhbWV0ZXJzID8geyBpbnB1dFNjaGVtYTogZW50cnkuZGVmLnBhcmFtZXRlcnMgYXMgbmV2ZXIgfSA6IHt9KSxcbiAgICAuLi4ocmVxdWlyZXNBcHByb3ZhbCA/IHsgcmVxdWlyZUFwcHJvdmFsOiB0cnVlIH0gOiB7fSksXG4gICAgLi4uKGFubm90YXRpb25zXG4gICAgICA/IHtcbiAgICAgICAgICBtY3A6IHtcbiAgICAgICAgICAgIGFubm90YXRpb25zOiB7XG4gICAgICAgICAgICAgIHJlYWRPbmx5SGludDogZWZmZWN0ID09PSBcInJlYWRcIiB8fCBhbm5vdGF0aW9ucy5yZWFkT25seSA9PT0gdHJ1ZSxcbiAgICAgICAgICAgICAgZGVzdHJ1Y3RpdmVIaW50OiBlZmZlY3QgPT09IFwiZGVzdHJ1Y3RpdmVcIiB8fCBhbm5vdGF0aW9ucy5kZXN0cnVjdGl2ZSA9PT0gdHJ1ZSxcbiAgICAgICAgICAgICAgaWRlbXBvdGVudEhpbnQ6IGFubm90YXRpb25zLmlkZW1wb3RlbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4ge1xuICAgICAgY29uc3QgZXhlY3V0aW9uID0gY29udGV4dCBhc1xuICAgICAgICB8IHtcbiAgICAgICAgICAgIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG4gICAgICAgICAgICByZXF1ZXN0Q29udGV4dD86IHsgZ2V0KGtleTogc3RyaW5nKTogdW5rbm93biB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXNvdXJjZUlkID0gZXhlY3V0aW9uPy5yZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVkpO1xuICAgICAgcmV0dXJuIHBsdWdpbi5leGVjdXRlQWdlbnRUb29sIShlbnRyeS5sb2NhbE5hbWUsIGlucHV0LCBleGVjdXRpb24/LmFib3J0U2lnbmFsLCB7XG4gICAgICAgIC4uLih0eXBlb2YgcmVzb3VyY2VJZCA9PT0gXCJzdHJpbmdcIiA/IHsgcmVzb3VyY2VJZCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
@@ -0,0 +1,20 @@
1
+ /**
2
+ * AppKit evaluation driver for an in-process Mastra agent.
3
+ *
4
+ * @module
5
+ */
6
+ import type { EvalDriver } from "@databricks/appkit/beta";
7
+ import type { Agent } from "@mastra/core/agent";
8
+ import type { RequestContext } from "@mastra/core/request-context";
9
+ /** Configuration for an in-process Mastra evaluation driver. */
10
+ export interface MastraEvalDriverOptions {
11
+ /** Stable memory resource used by every turn from this driver. */
12
+ resourceId?: string;
13
+ /** Override request-context construction for isolated evaluation environments. */
14
+ createRequestContext?: (options: {
15
+ threadId: string;
16
+ resourceId: string;
17
+ }) => Promise<RequestContext>;
18
+ }
19
+ /** Drive AppKit evaluations through Mastra without reducing a chat stream. */
20
+ export declare function createMastraEvalDriver(agent: Agent, options?: MastraEvalDriverOptions): EvalDriver;
@@ -0,0 +1,56 @@
1
+ /**
2
+ * AppKit evaluation driver for an in-process Mastra agent.
3
+ *
4
+ * @module
5
+ */
6
+ import { error, hash, object } from "@dbx-tools/shared-core";
7
+ import { createRequestContext } from "./server.js";
8
+ /** Drive AppKit evaluations through Mastra without reducing a chat stream. */
9
+ export function createMastraEvalDriver(agent, options = {}) {
10
+ const resourceId = options.resourceId ?? `eval:${agent.id}`;
11
+ const requestContextFactory = options.createRequestContext ?? createRequestContext;
12
+ let threadId = hash.id();
13
+ return {
14
+ async send(message, sendOptions) {
15
+ try {
16
+ const requestContext = await requestContextFactory({ threadId, resourceId });
17
+ const result = await agent.generate(message, {
18
+ requestContext,
19
+ memory: { thread: threadId, resource: resourceId },
20
+ ...(sendOptions?.signal ? { abortSignal: sendOptions.signal } : {}),
21
+ });
22
+ const toolCallDetails = result.toolCalls.map((call) => {
23
+ const payload = object.isRecord(call.payload)
24
+ ? call.payload
25
+ : {};
26
+ const args = payload.args;
27
+ return {
28
+ name: String(payload.toolName ?? ""),
29
+ args: object.isRecord(args) ? args : {},
30
+ };
31
+ });
32
+ return {
33
+ reply: result.text,
34
+ toolCalls: toolCallDetails.map(({ name }) => name),
35
+ toolCallDetails,
36
+ succeeded: result.error === undefined && result.suspendPayload === undefined,
37
+ sessionId: threadId,
38
+ ...(result.traceId ? { traceId: result.traceId } : {}),
39
+ };
40
+ }
41
+ catch (caught) {
42
+ return {
43
+ reply: error.errorMessage(caught),
44
+ toolCalls: [],
45
+ toolCallDetails: [],
46
+ succeeded: false,
47
+ sessionId: threadId,
48
+ };
49
+ }
50
+ },
51
+ reset() {
52
+ threadId = hash.id();
53
+ },
54
+ };
55
+ }
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbHVhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ldmFsdWF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFHSCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUk3RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFhbkQsOEVBQThFO0FBQzlFLE1BQU0sVUFBVSxzQkFBc0IsQ0FDcEMsS0FBWSxFQUNaLFVBQW1DLEVBQUU7SUFFckMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxRQUFRLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUM1RCxNQUFNLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsSUFBSSxvQkFBb0IsQ0FBQztJQUNuRixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7SUFFekIsT0FBTztRQUNMLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVc7WUFDN0IsSUFBSSxDQUFDO2dCQUNILE1BQU0sY0FBYyxHQUFHLE1BQU0scUJBQXFCLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztnQkFDN0UsTUFBTSxNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRTtvQkFDM0MsY0FBYztvQkFDZCxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUU7b0JBQ2xELEdBQUcsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztpQkFDcEUsQ0FBQyxDQUFDO2dCQUNILE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQ3BELE1BQU0sT0FBTyxHQUE0QixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7d0JBQ3BFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTzt3QkFDZCxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNQLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7b0JBQzFCLE9BQU87d0JBQ0wsSUFBSSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQzt3QkFDcEMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRTtxQkFDeEMsQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FBQztnQkFDSCxPQUFPO29CQUNMLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSTtvQkFDbEIsU0FBUyxFQUFFLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUM7b0JBQ2xELGVBQWU7b0JBQ2YsU0FBUyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxjQUFjLEtBQUssU0FBUztvQkFDNUUsU0FBUyxFQUFFLFFBQVE7b0JBQ25CLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztpQkFDdkQsQ0FBQztZQUNKLENBQUM7WUFBQyxPQUFPLE1BQU0sRUFBRSxDQUFDO2dCQUNoQixPQUFPO29CQUNMLEtBQUssRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztvQkFDakMsU0FBUyxFQUFFLEVBQUU7b0JBQ2IsZUFBZSxFQUFFLEVBQUU7b0JBQ25CLFNBQVMsRUFBRSxLQUFLO29CQUNoQixTQUFTLEVBQUUsUUFBUTtpQkFDcEIsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBQ0QsS0FBSztZQUNILFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDdkIsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcHBLaXQgZXZhbHVhdGlvbiBkcml2ZXIgZm9yIGFuIGluLXByb2Nlc3MgTWFzdHJhIGFnZW50LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IERyaXZlUmVzdWx0LCBFdmFsRHJpdmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG5pbXBvcnQgeyBlcnJvciwgaGFzaCwgb2JqZWN0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcblxuaW1wb3J0IHsgY3JlYXRlUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi9zZXJ2ZXIudHNcIjtcblxuLyoqIENvbmZpZ3VyYXRpb24gZm9yIGFuIGluLXByb2Nlc3MgTWFzdHJhIGV2YWx1YXRpb24gZHJpdmVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXN0cmFFdmFsRHJpdmVyT3B0aW9ucyB7XG4gIC8qKiBTdGFibGUgbWVtb3J5IHJlc291cmNlIHVzZWQgYnkgZXZlcnkgdHVybiBmcm9tIHRoaXMgZHJpdmVyLiAqL1xuICByZXNvdXJjZUlkPzogc3RyaW5nO1xuICAvKiogT3ZlcnJpZGUgcmVxdWVzdC1jb250ZXh0IGNvbnN0cnVjdGlvbiBmb3IgaXNvbGF0ZWQgZXZhbHVhdGlvbiBlbnZpcm9ubWVudHMuICovXG4gIGNyZWF0ZVJlcXVlc3RDb250ZXh0PzogKG9wdGlvbnM6IHtcbiAgICB0aHJlYWRJZDogc3RyaW5nO1xuICAgIHJlc291cmNlSWQ6IHN0cmluZztcbiAgfSkgPT4gUHJvbWlzZTxSZXF1ZXN0Q29udGV4dD47XG59XG5cbi8qKiBEcml2ZSBBcHBLaXQgZXZhbHVhdGlvbnMgdGhyb3VnaCBNYXN0cmEgd2l0aG91dCByZWR1Y2luZyBhIGNoYXQgc3RyZWFtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1hc3RyYUV2YWxEcml2ZXIoXG4gIGFnZW50OiBBZ2VudCxcbiAgb3B0aW9uczogTWFzdHJhRXZhbERyaXZlck9wdGlvbnMgPSB7fSxcbik6IEV2YWxEcml2ZXIge1xuICBjb25zdCByZXNvdXJjZUlkID0gb3B0aW9ucy5yZXNvdXJjZUlkID8/IGBldmFsOiR7YWdlbnQuaWR9YDtcbiAgY29uc3QgcmVxdWVzdENvbnRleHRGYWN0b3J5ID0gb3B0aW9ucy5jcmVhdGVSZXF1ZXN0Q29udGV4dCA/PyBjcmVhdGVSZXF1ZXN0Q29udGV4dDtcbiAgbGV0IHRocmVhZElkID0gaGFzaC5pZCgpO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgc2VuZChtZXNzYWdlLCBzZW5kT3B0aW9ucyk6IFByb21pc2U8RHJpdmVSZXN1bHQ+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gYXdhaXQgcmVxdWVzdENvbnRleHRGYWN0b3J5KHsgdGhyZWFkSWQsIHJlc291cmNlSWQgfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFnZW50LmdlbmVyYXRlKG1lc3NhZ2UsIHtcbiAgICAgICAgICByZXF1ZXN0Q29udGV4dCxcbiAgICAgICAgICBtZW1vcnk6IHsgdGhyZWFkOiB0aHJlYWRJZCwgcmVzb3VyY2U6IHJlc291cmNlSWQgfSxcbiAgICAgICAgICAuLi4oc2VuZE9wdGlvbnM/LnNpZ25hbCA/IHsgYWJvcnRTaWduYWw6IHNlbmRPcHRpb25zLnNpZ25hbCB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdG9vbENhbGxEZXRhaWxzID0gcmVzdWx0LnRvb2xDYWxscy5tYXAoKGNhbGwpID0+IHtcbiAgICAgICAgICBjb25zdCBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IG9iamVjdC5pc1JlY29yZChjYWxsLnBheWxvYWQpXG4gICAgICAgICAgICA/IGNhbGwucGF5bG9hZFxuICAgICAgICAgICAgOiB7fTtcbiAgICAgICAgICBjb25zdCBhcmdzID0gcGF5bG9hZC5hcmdzO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBTdHJpbmcocGF5bG9hZC50b29sTmFtZSA/PyBcIlwiKSxcbiAgICAgICAgICAgIGFyZ3M6IG9iamVjdC5pc1JlY29yZChhcmdzKSA/IGFyZ3MgOiB7fSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXBseTogcmVzdWx0LnRleHQsXG4gICAgICAgICAgdG9vbENhbGxzOiB0b29sQ2FsbERldGFpbHMubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSksXG4gICAgICAgICAgdG9vbENhbGxEZXRhaWxzLFxuICAgICAgICAgIHN1Y2NlZWRlZDogcmVzdWx0LmVycm9yID09PSB1bmRlZmluZWQgJiYgcmVzdWx0LnN1c3BlbmRQYXlsb2FkID09PSB1bmRlZmluZWQsXG4gICAgICAgICAgc2Vzc2lvbklkOiB0aHJlYWRJZCxcbiAgICAgICAgICAuLi4ocmVzdWx0LnRyYWNlSWQgPyB7IHRyYWNlSWQ6IHJlc3VsdC50cmFjZUlkIH0gOiB7fSksXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChjYXVnaHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXBseTogZXJyb3IuZXJyb3JNZXNzYWdlKGNhdWdodCksXG4gICAgICAgICAgdG9vbENhbGxzOiBbXSxcbiAgICAgICAgICB0b29sQ2FsbERldGFpbHM6IFtdLFxuICAgICAgICAgIHN1Y2NlZWRlZDogZmFsc2UsXG4gICAgICAgICAgc2Vzc2lvbklkOiB0aHJlYWRJZCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlc2V0KCkge1xuICAgICAgdGhyZWFkSWQgPSBoYXNoLmlkKCk7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"root":["../src/agents.ts","../src/chart.ts","../src/chat.ts","../src/config.ts","../src/defaults.ts","../src/filesystems.ts","../src/genie.ts","../src/identity.ts","../src/mcp.ts","../src/memory.ts","../src/mlflow.ts","../src/model.ts","../src/monty-sandbox.ts","../src/observability.ts","../src/pagination.ts","../src/plugin.ts","../src/processors.ts","../src/remote-skills.ts","../src/rest.ts","../src/sandbox.ts","../src/server.ts","../src/serving-sanitize.ts","../src/serving.ts","../src/skill-paths.ts","../src/statement.ts","../src/storage-schema.ts","../src/style.ts","../src/summarize.ts","../src/trace-io.ts","../src/validation.ts","../src/workspaces.ts","../src/writer.ts","../index.ts"],"version":"5.9.3"}
1
+ {"root":["../src/agents.ts","../src/chart.ts","../src/chat.ts","../src/config.ts","../src/defaults.ts","../src/evaluation.ts","../src/filesystems.ts","../src/genie.ts","../src/identity.ts","../src/mcp.ts","../src/memory.ts","../src/mlflow.ts","../src/model.ts","../src/monty-sandbox.ts","../src/observability.ts","../src/pagination.ts","../src/plugin.ts","../src/processors.ts","../src/remote-skills.ts","../src/rest.ts","../src/sandbox.ts","../src/server.ts","../src/serving-sanitize.ts","../src/serving.ts","../src/skill-paths.ts","../src/statement.ts","../src/storage-schema.ts","../src/style.ts","../src/summarize.ts","../src/trace-io.ts","../src/validation.ts","../src/workspaces.ts","../src/writer.ts","../index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -24,26 +24,27 @@
24
24
  "@types/node": "^24.6.0",
25
25
  "@types/pg": "^8",
26
26
  "skills": "^1",
27
- "typescript": "^5.9.3"
27
+ "typescript": "^5.9.3",
28
+ "vitest": "3.2.4"
28
29
  },
29
30
  "peerDependencies": {
30
31
  "skills": "^1"
31
32
  },
32
33
  "dependencies": {
33
- "@databricks/appkit": "^0.60.0",
34
- "@dbx-tools/appkit": "0.6.225",
35
- "@dbx-tools/core": "0.6.225",
36
- "@dbx-tools/databricks": "0.6.225",
37
- "@dbx-tools/fs": "0.6.225",
38
- "@dbx-tools/genie": "0.6.225",
39
- "@dbx-tools/model": "0.6.225",
40
- "@dbx-tools/model-rs": "0.6.225",
41
- "@dbx-tools/path": "0.6.225",
42
- "@dbx-tools/shared-core": "0.6.225",
43
- "@dbx-tools/shared-fs": "0.6.225",
44
- "@dbx-tools/shared-genie": "0.6.225",
45
- "@dbx-tools/shared-mastra": "0.6.225",
46
- "@dbx-tools/shared-model": "0.6.225",
34
+ "@databricks/appkit": "0.81.0",
35
+ "@dbx-tools/appkit": "0.6.227",
36
+ "@dbx-tools/core": "0.6.227",
37
+ "@dbx-tools/databricks": "0.6.227",
38
+ "@dbx-tools/fs": "0.6.227",
39
+ "@dbx-tools/genie": "0.6.227",
40
+ "@dbx-tools/model": "0.6.227",
41
+ "@dbx-tools/model-rs": "0.6.227",
42
+ "@dbx-tools/path": "0.6.227",
43
+ "@dbx-tools/shared-core": "0.6.227",
44
+ "@dbx-tools/shared-fs": "0.6.227",
45
+ "@dbx-tools/shared-genie": "0.6.227",
46
+ "@dbx-tools/shared-mastra": "0.6.227",
47
+ "@dbx-tools/shared-model": "0.6.227",
47
48
  "@mastra/ai-sdk": "1.10.5",
48
49
  "@mastra/core": "1.71.0",
49
50
  "@mastra/express": "1.5.14",
@@ -74,7 +75,7 @@
74
75
  "./package.json": "./package.json"
75
76
  }
76
77
  },
77
- "version": "0.6.225",
78
+ "version": "0.6.227",
78
79
  "types": "./lib/index.d.ts",
79
80
  "type": "module",
80
81
  "exports": {
package/src/agents.ts CHANGED
@@ -23,7 +23,7 @@ import type {
23
23
  ToolkitOptions as AppKitToolkitOptions,
24
24
  ToolProvider,
25
25
  } from "@databricks/appkit/beta";
26
- import { plugin } from "@dbx-tools/appkit";
26
+ import { plugin, toolkit as appkitToolkit } from "@dbx-tools/appkit";
27
27
  import { log, object, string } from "@dbx-tools/shared-core";
28
28
  import type {
29
29
  AgentConfig,
@@ -952,36 +952,7 @@ function toolkitEntriesFromDefinitions(
952
952
  definitions: AgentToolDefinition[],
953
953
  options: ToolkitOptions = {},
954
954
  ): Record<string, ToolkitEntry> {
955
- return Object.fromEntries(
956
- definitions.flatMap((definition) => {
957
- const key = toolkitName(definition.name, pluginName, options);
958
- if (key === null) return [];
959
- return [
960
- [
961
- key,
962
- {
963
- __toolkitRef: true as const,
964
- pluginName,
965
- localName: definition.name,
966
- def: { ...definition, name: key },
967
- annotations: definition.annotations,
968
- } satisfies ToolkitEntry,
969
- ],
970
- ];
971
- }),
972
- );
973
- }
974
-
975
- function toolkitName(
976
- localName: string,
977
- pluginName: string,
978
- options: ToolkitOptions,
979
- ): string | null {
980
- if (options.only && !options.only.includes(localName)) return null;
981
- if (options.except?.includes(localName)) return null;
982
- const renamed = options.rename?.[localName];
983
- if (renamed) return renamed;
984
- return `${options.prefix ?? `${pluginName}.`}${localName}`;
955
+ return appkitToolkit.entries(pluginName, definitions, options);
985
956
  }
986
957
 
987
958
  function isPromiseLike<T>(value: T | Promise<T>): value is Promise<T> {
@@ -1009,11 +980,13 @@ function toolkitEntriesToMastraTools(
1009
980
  function toolkitEntryToMastraTool(entry: ToolkitEntry, plugin: ContextualToolProvider): Tool {
1010
981
  const annotations = entry.annotations ?? entry.def.annotations;
1011
982
  const effect = annotations?.effect;
983
+ const requiresApproval =
984
+ (effect !== undefined && effect !== "read") || annotations?.destructive === true;
1012
985
  return createTool({
1013
986
  id: `${entry.pluginName}__${entry.localName}`,
1014
987
  description: entry.def.description,
1015
988
  ...(entry.def.parameters ? { inputSchema: entry.def.parameters as never } : {}),
1016
- ...(effect && effect !== "read" ? { requireApproval: true } : {}),
989
+ ...(requiresApproval ? { requireApproval: true } : {}),
1017
990
  ...(annotations
1018
991
  ? {
1019
992
  mcp: {
@@ -0,0 +1,75 @@
1
+ /**
2
+ * AppKit evaluation driver for an in-process Mastra agent.
3
+ *
4
+ * @module
5
+ */
6
+
7
+ import type { DriveResult, EvalDriver } from "@databricks/appkit/beta";
8
+ import { error, hash, object } from "@dbx-tools/shared-core";
9
+ import type { Agent } from "@mastra/core/agent";
10
+ import type { RequestContext } from "@mastra/core/request-context";
11
+
12
+ import { createRequestContext } from "./server.ts";
13
+
14
+ /** Configuration for an in-process Mastra evaluation driver. */
15
+ export interface MastraEvalDriverOptions {
16
+ /** Stable memory resource used by every turn from this driver. */
17
+ resourceId?: string;
18
+ /** Override request-context construction for isolated evaluation environments. */
19
+ createRequestContext?: (options: {
20
+ threadId: string;
21
+ resourceId: string;
22
+ }) => Promise<RequestContext>;
23
+ }
24
+
25
+ /** Drive AppKit evaluations through Mastra without reducing a chat stream. */
26
+ export function createMastraEvalDriver(
27
+ agent: Agent,
28
+ options: MastraEvalDriverOptions = {},
29
+ ): EvalDriver {
30
+ const resourceId = options.resourceId ?? `eval:${agent.id}`;
31
+ const requestContextFactory = options.createRequestContext ?? createRequestContext;
32
+ let threadId = hash.id();
33
+
34
+ return {
35
+ async send(message, sendOptions): Promise<DriveResult> {
36
+ try {
37
+ const requestContext = await requestContextFactory({ threadId, resourceId });
38
+ const result = await agent.generate(message, {
39
+ requestContext,
40
+ memory: { thread: threadId, resource: resourceId },
41
+ ...(sendOptions?.signal ? { abortSignal: sendOptions.signal } : {}),
42
+ });
43
+ const toolCallDetails = result.toolCalls.map((call) => {
44
+ const payload: Record<string, unknown> = object.isRecord(call.payload)
45
+ ? call.payload
46
+ : {};
47
+ const args = payload.args;
48
+ return {
49
+ name: String(payload.toolName ?? ""),
50
+ args: object.isRecord(args) ? args : {},
51
+ };
52
+ });
53
+ return {
54
+ reply: result.text,
55
+ toolCalls: toolCallDetails.map(({ name }) => name),
56
+ toolCallDetails,
57
+ succeeded: result.error === undefined && result.suspendPayload === undefined,
58
+ sessionId: threadId,
59
+ ...(result.traceId ? { traceId: result.traceId } : {}),
60
+ };
61
+ } catch (caught) {
62
+ return {
63
+ reply: error.errorMessage(caught),
64
+ toolCalls: [],
65
+ toolCallDetails: [],
66
+ succeeded: false,
67
+ sessionId: threadId,
68
+ };
69
+ }
70
+ },
71
+ reset() {
72
+ threadId = hash.id();
73
+ },
74
+ };
75
+ }