@dbx-tools/appkit-mastra 0.9.163 → 0.9.166
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/index.ts +2 -2
- package/lib/index.d.ts +2 -2
- package/lib/index.js +3 -3
- package/lib/src/genie-chat.d.ts +2 -0
- package/lib/src/genie-chat.js +39 -4
- package/lib/src/telemetry.js +15 -2
- package/package.json +16 -16
- package/src/genie-chat.ts +41 -4
- package/src/telemetry.ts +15 -0
package/index.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
|
|
5
5
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-mastra";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.166";
|
|
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";
|
|
@@ -54,7 +54,7 @@ export { filesystems, MastraFileSystemAdapter, MountedCompositeFilesystem, scrat
|
|
|
54
54
|
export type { MastraFileSystemAdapterOptions } from "./src/filesystems.ts";
|
|
55
55
|
export { FOLLOW_UP_USER_TEXT_KEY, FOLLOW_UP_NATIVE_QUESTIONS_KEY, FOLLOW_UP_RUN_ID_KEY, resolveFollowUpSuggestionsConfig, suggestFollowUps, buildFollowUpSuggestionsProcessor, buildFollowUpSuggestionsTransform, buildSuggestFollowUpsTool } from "./src/follow-up-suggestions.ts";
|
|
56
56
|
export type { ResolvedFollowUpSuggestionsConfig, SuggestFollowUpsOptions, FollowUpSuggester } from "./src/follow-up-suggestions.ts";
|
|
57
|
-
export { genieAnswerText, visibleGenieQuestion, genieMessageToUiMessages, listGenieThreads, listGenieThreadMessages, genieChatStream, deleteGenieThread, deleteGenieThreadMessage } from "./src/genie-chat.ts";
|
|
57
|
+
export { genieAnswerText, visibleGenieQuestion, visibleGenieThreadTitle, genieMessageToUiMessages, listGenieThreads, listGenieThreadMessages, genieChatStream, deleteGenieThread, deleteGenieThreadMessage } from "./src/genie-chat.ts";
|
|
58
58
|
export type { GenieChatSpace } from "./src/genie-chat.ts";
|
|
59
59
|
export { DEFAULT_GENIE_ALIAS, askGenieToolId, GENIE_INSTRUCTIONS, normalizeGenieSpaces, resolveGenieSpaces, buildGenieTools, buildGenieToolkitProvider, collectSpaceSuggestions } from "./src/genie.ts";
|
|
60
60
|
export type { GenieSpaceConfig, GenieSpacesConfig } from "./src/genie.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-mastra";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.166";
|
|
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";
|
|
@@ -50,7 +50,7 @@ export { filesystems, MastraFileSystemAdapter, MountedCompositeFilesystem, scrat
|
|
|
50
50
|
export type { MastraFileSystemAdapterOptions } from "./src/filesystems.ts";
|
|
51
51
|
export { FOLLOW_UP_USER_TEXT_KEY, FOLLOW_UP_NATIVE_QUESTIONS_KEY, FOLLOW_UP_RUN_ID_KEY, resolveFollowUpSuggestionsConfig, suggestFollowUps, buildFollowUpSuggestionsProcessor, buildFollowUpSuggestionsTransform, buildSuggestFollowUpsTool } from "./src/follow-up-suggestions.ts";
|
|
52
52
|
export type { ResolvedFollowUpSuggestionsConfig, SuggestFollowUpsOptions, FollowUpSuggester } from "./src/follow-up-suggestions.ts";
|
|
53
|
-
export { genieAnswerText, visibleGenieQuestion, genieMessageToUiMessages, listGenieThreads, listGenieThreadMessages, genieChatStream, deleteGenieThread, deleteGenieThreadMessage } from "./src/genie-chat.ts";
|
|
53
|
+
export { genieAnswerText, visibleGenieQuestion, visibleGenieThreadTitle, genieMessageToUiMessages, listGenieThreads, listGenieThreadMessages, genieChatStream, deleteGenieThread, deleteGenieThreadMessage } from "./src/genie-chat.ts";
|
|
54
54
|
export type { GenieChatSpace } from "./src/genie-chat.ts";
|
|
55
55
|
export { DEFAULT_GENIE_ALIAS, askGenieToolId, GENIE_INSTRUCTIONS, normalizeGenieSpaces, resolveGenieSpaces, buildGenieTools, buildGenieToolkitProvider, collectSpaceSuggestions } from "./src/genie.ts";
|
|
56
56
|
export type { GenieSpaceConfig, GenieSpacesConfig } from "./src/genie.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Regenerated from the exporting modules in ./src.
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-mastra";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.166";
|
|
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";
|
|
@@ -46,7 +46,7 @@ export { createMastraEvalDriver } from "./src/evaluation.js";
|
|
|
46
46
|
export { resolveFeedbackMode } from "./src/feedback-mode.js";
|
|
47
47
|
export { filesystems, MastraFileSystemAdapter, MountedCompositeFilesystem, scratchFilesystem } from "./src/filesystems.js";
|
|
48
48
|
export { FOLLOW_UP_USER_TEXT_KEY, FOLLOW_UP_NATIVE_QUESTIONS_KEY, FOLLOW_UP_RUN_ID_KEY, resolveFollowUpSuggestionsConfig, suggestFollowUps, buildFollowUpSuggestionsProcessor, buildFollowUpSuggestionsTransform, buildSuggestFollowUpsTool } from "./src/follow-up-suggestions.js";
|
|
49
|
-
export { genieAnswerText, visibleGenieQuestion, genieMessageToUiMessages, listGenieThreads, listGenieThreadMessages, genieChatStream, deleteGenieThread, deleteGenieThreadMessage } from "./src/genie-chat.js";
|
|
49
|
+
export { genieAnswerText, visibleGenieQuestion, visibleGenieThreadTitle, genieMessageToUiMessages, listGenieThreads, listGenieThreadMessages, genieChatStream, deleteGenieThread, deleteGenieThreadMessage } from "./src/genie-chat.js";
|
|
50
50
|
export { DEFAULT_GENIE_ALIAS, askGenieToolId, GENIE_INSTRUCTIONS, normalizeGenieSpaces, resolveGenieSpaces, buildGenieTools, buildGenieToolkitProvider, collectSpaceSuggestions } from "./src/genie.js";
|
|
51
51
|
export { IDENTITY_ENV, resolveIdentityMode } from "./src/identity.js";
|
|
52
52
|
export { buildMcpServer } from "./src/mcp.js";
|
|
@@ -72,4 +72,4 @@ export { MLFLOW_TRACE_TAG_PREFIX, MLFLOW_AGENT_TAG, MLFLOW_GENIE_TAG, MLFLOW_OBO
|
|
|
72
72
|
export { invalidFields } from "./src/validation.js";
|
|
73
73
|
export { DEFAULT_DATABRICKS_WORKSPACE_PATHS, databricksWorkspaceConfig, databricksWorkspace, bindDatabricksWorkspaceContext, resolveDatabricksWorkspacePaths, inlineSkillsFromLocalMounts, requestWorkspaceClient } from "./src/workspaces.js";
|
|
74
74
|
export { safeWriteProgress } from "./src/writer.js";
|
|
75
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRywwQkFBMEIsQ0FBQztBQUM3RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssWUFBWSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxtQkFBbUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEtBQUssU0FBUyxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssWUFBWSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxhQUFhLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FB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QUFFOW9CLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSw0QkFBNEIsRUFBRSx3QkFBd0IsRUFBRSx1QkFBdUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pULE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUseUJBQXlCLEVBQUUsbUJBQW1CLEVBQUUsOEJBQThCLEVBQUUsK0JBQStCLEVBQUUsMkJBQTJCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUUvTyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjE2M1wiO1xuZXhwb3J0ICogYXMgYWdlbnRzIGZyb20gXCIuL3NyYy9hZ2VudHMudHNcIjtcbmV4cG9ydCAqIGFzIGNoYXJ0IGZyb20gXCIuL3NyYy9jaGFydC50c1wiO1xuZXhwb3J0ICogYXMgY2hhdCBmcm9tIFwiLi9zcmMvY2hhdC50c1wiO1xuZXhwb3J0ICogYXMgY29uZmlnIGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCAqIGFzIGRlZmF1bHRzIGZyb20gXCIuL3NyYy9kZWZhdWx0cy50c1wiO1xuZXhwb3J0ICogYXMgZXZhbHVhdGlvbiBmcm9tIFwiLi9zcmMvZXZhbHVhdGlvbi50c1wiO1xuZXhwb3J0ICogYXMgZmVlZGJhY2tNb2RlIGZyb20gXCIuL3NyYy9mZWVkYmFjay1tb2RlLnRzXCI7XG5leHBvcnQgKiBhcyBmb2xsb3dVcFN1Z2dlc3Rpb25zIGZyb20gXCIuL3NyYy9mb2xsb3ctdXAtc3VnZ2VzdGlvbnMudHNcIjtcbmV4cG9ydCAqIGFzIGdlbmllQ2hhdCBmcm9tIFwiLi9zcmMvZ2VuaWUtY2hhdC50c1wiO1xuZXhwb3J0ICogYXMgZ2VuaWUgZnJvbSBcIi4vc3JjL2dlbmllLnRzXCI7XG5leHBvcnQgKiBhcyBpZGVudGl0eSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCAqIGFzIG1jcCBmcm9tIFwiLi9zcmMvbWNwLnRzXCI7XG5leHBvcnQgKiBhcyBtZW1vcnkgZnJvbSBcIi4vc3JjL21lbW9yeS50c1wiO1xuZXhwb3J0ICogYXMgbWxmbG93IGZyb20gXCIuL3NyYy9tbGZsb3cudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsIGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0ICogYXMgbW9udHlTYW5kYm94IGZyb20gXCIuL3NyYy9tb250eS1zYW5kYm94LnRzXCI7XG5leHBvcnQgKiBhcyBvYnNlcnZhYmlsaXR5IGZyb20gXCIuL3NyYy9vYnNlcnZhYmlsaXR5LnRzXCI7XG5leHBvcnQgKiBhcyBwbHVnaW4gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0ICogYXMgcHJvY2Vzc29ycyBmcm9tIFwiLi9zcmMvcHJvY2Vzc29ycy50c1wiO1xuZXhwb3J0ICogYXMgcmVtb3RlU2tpbGxzIGZyb20gXCIuL3NyYy9yZW1vdGUtc2tpbGxzLnRzXCI7XG5leHBvcnQgKiBhcyByZXF1ZXN0Q29udGV4dCBmcm9tIFwiLi9zcmMvcmVxdWVzdC1jb250ZXh0LnRzXCI7XG5leHBvcnQgKiBhcyByZXN0IGZyb20gXCIuL3NyYy9yZXN0LnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2ZXIgZnJvbSBcIi4vc3JjL3NlcnZlci50c1wiO1xuZXhwb3J0ICogYXMgc2VydmluZyBmcm9tIFwiLi9zcmMvc2VydmluZy50c1wiO1xuZXhwb3J0ICogYXMgc2tpbGxQYXRocyBmcm9tIFwiLi9zcmMvc2tpbGwtcGF0aHMudHNcIjtcbmV4cG9ydCAqIGFzIHN0YXRlbWVudCBmcm9tIFwiLi9zcmMvc3RhdGVtZW50LnRzXCI7XG5leHBvcnQgKiBhcyBzdG9yYWdlU2NoZW1hIGZyb20gXCIuL3NyYy9zdG9yYWdlLXNjaGVtYS50c1wiO1xuZXhwb3J0ICogYXMgc3R5bGUgZnJvbSBcIi4vc3JjL3N0eWxlLnRzXCI7XG5leHBvcnQgKiBhcyBzdW1tYXJpemUgZnJvbSBcIi4vc3JjL3N1bW1hcml6ZS50c1wiO1xuZXhwb3J0ICogYXMgdGVsZW1ldHJ5IGZyb20gXCIuL3NyYy90ZWxlbWV0cnkudHNcIjtcbmV4cG9ydCAqIGFzIHRyYWNlQXR0cmlidXRlcyBmcm9tIFwiLi9zcmMvdHJhY2UtYXR0cmlidXRlcy50c1wiO1xuZXhwb3J0ICogYXMgdmFsaWRhdGlvbiBmcm9tIFwiLi9zcmMvdmFsaWRhdGlvbi50c1wiO1xuZXhwb3J0ICogYXMgd29ya3NwYWNlcyBmcm9tIFwiLi9zcmMvd29ya3NwYWNlcy50c1wiO1xuZXhwb3J0ICogYXMgd3JpdGVyIGZyb20gXCIuL3NyYy93cml0ZXIudHNcIjtcbmV4cG9ydCB7IHRvb2wsIGNyZWF0ZUFnZW50LCBGQUxMQkFDS19BR0VOVF9JRCwgREVGQVVMVF9BR0VOVF9NQVhfU1RFUFMsIERFRkFVTFRfVE9PTF9XT1JLRkxPV19JTlNUUlVDVElPTlMsIENPREVfTU9ERV9ST1VUSU5HX0lOU1RSVUNUSU9OUywgREVGQVVMVF9TVFlMRV9JTlNUUlVDVElPTlMsIGJ1aWxkQWdlbnRzLCBhcHByb3ZhbEdhdGVkVG9vbElkcyB9IGZyb20gXCIuL3NyYy9hZ2VudHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhVG9vbHMsIEFwcEtpdFRvb2xPcHRpb25zLCBUb29sa2l0T3B0aW9ucywgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyLCBNYXN0cmFQbHVnaW5zLCBNYXN0cmFUb29sc0ZuLCBNYXN0cmFBZ2VudFdvcmtzcGFjZVJlc29sdmVyLCBNYXN0cmFBZ2VudERlZmluaXRpb24sIEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbiwgTWFzdHJhU3RvcmFnZUNvbmZpZ092ZXJyaWRlLCBNYXN0cmFNZW1vcnlDb25maWdPdmVycmlkZSwgQWdlbnREZWZhdWx0TW9kZWwsIEJ1aWx0QWdlbnRzLCBNYXN0cmFPdXRwdXRQcm9jZXNzb3JGYWN0b3J5IH0gZnJvbSBcIi4vc3JjL2FnZW50cy50c1wiO1xuZXhwb3J0IHsgY2hhcnRQbGFuU2NoZW1hLCBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hLCBjaGFydFRvb2xPdXRwdXRTY2hlbWEsIHByZXBhcmVDaGFydCwgZmV0Y2hDaGFydCwgcGxhblRvRWNoYXJ0c09wdGlvbiwgYnVpbGRSZW5kZXJEYXRhVG9vbCB9IGZyb20gXCIuL3NyYy9jaGFydC50c1wiO1xuZXhwb3J0IHR5cGUgeyBDaGFydFBsYW5uZXJSZXF1ZXN0LCBDaGFydFRvb2xPdXRwdXQsIFByZXBhcmVDaGFydE9wdGlvbnMsIEZldGNoQ2hhcnRPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2NoYXJ0LnRzXCI7XG5leHBvcnQgeyBhZ2VudEFib3J0U2lnbmFsLCBhZ2VudENoYXRSb3V0ZXMgfSBmcm9tIFwiLi9zcmMvY2hhdC50c1wiO1xuZXhwb3J0IHsgTUFTVFJBX1VTRVJfS0VZLCBNQVNUUkFfVVNFUl9OQU1FX0tFWSwgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLCBNQVNUUkFfQVVUSF9NT0RFX0tFWSwgTUFTVFJBX1JFUVVFU1RfSURfS0VZLCBNQVNUUkFfU0NPUEVTX0tFWSwgVFJBQ0VfUkVRVUVTVF9DT05URVhUX0tFWVMsIGV4ZWN1dGlvbkNvbnRleHRVc2VySWQsIGF0dHJpYnV0ZWRVc2VySWQsIHJlc29sdmVVc2VyS2V5LCBNQVNUUkFfQ09ORklHX1NDSEVNQSB9IGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCB0eXBlIHsgVXNlciwgTWFzdHJhTWVtb3J5Q29uZmlnLCBNYXN0cmFXb3Jrc3BhY2VTa2lsbHNDb25maWcsIE1hc3RyYUNvZGVNb2RlVHJhbnNwb3J0LCBNYXN0cmFDb2RlTW9kZUNvbmZpZywgTWFzdHJhTWNwQ29uZmlnLCBGb2xsb3dVcFN1Z2dlc3Rpb25zQ29uZmlnLCBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgeyBtb2RlbENhdGFsb2d1ZURlZmF1bHRzLCBnZW5pZVN1Z2dlc3Rpb25EZWZhdWx0cywgZ2VuaWVDb252ZXJzYXRpb25SZWFkRGVmYXVsdHMsIGdlbmllQ29udmVyc2F0aW9uV3JpdGVEZWZhdWx0cywgc3RhdGVtZW50RGF0YURlZmF1bHRzLCBjaGFydEZldGNoRGVmYXVsdHMsIGZlZWRiYWNrV3JpdGVEZWZhdWx0cyB9IGZyb20gXCIuL3NyYy9kZWZhdWx0cy50c1wiO1xuZXhwb3J0IHsgY3JlYXRlTWFzdHJhRXZhbERyaXZlciB9IGZyb20gXCIuL3NyYy9ldmFsdWF0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1hc3RyYUV2YWxEcml2ZXJPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2V2YWx1YXRpb24udHNcIjtcbmV4cG9ydCB7IHJlc29sdmVGZWVkYmFja01vZGUgfSBmcm9tIFwiLi9zcmMvZmVlZGJhY2stbW9kZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBGZWVkYmFja0F2YWlsYWJpbGl0eSB9IGZyb20gXCIuL3NyYy9mZWVkYmFjay1tb2RlLnRzXCI7XG5leHBvcnQgeyBmaWxlc3lzdGVtcywgTWFzdHJhRmlsZVN5c3RlbUFkYXB0ZXIsIE1vdW50ZWRDb21wb3NpdGVGaWxlc3lzdGVtLCBzY3JhdGNoRmlsZXN5c3RlbSB9IGZyb20gXCIuL3NyYy9maWxlc3lzdGVtcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBNYXN0cmFGaWxlU3lzdGVtQWRhcHRlck9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZmlsZXN5c3RlbXMudHNcIjtcbmV4cG9ydCB7IEZPTExPV19VUF9VU0VSX1RFWFRfS0VZLCBGT0xMT1dfVVBfTkFUSVZFX1FVRVNUSU9OU19LRVksIEZPTExPV19VUF9SVU5fSURfS0VZLCByZXNvbHZlRm9sbG93VXBTdWdnZXN0aW9uc0NvbmZpZywgc3VnZ2VzdEZvbGxvd1VwcywgYnVpbGRGb2xsb3dVcFN1Z2dlc3Rpb25zUHJvY2Vzc29yLCBidWlsZEZvbGxvd1VwU3VnZ2VzdGlvbnNUcmFuc2Zvcm0sIGJ1aWxkU3VnZ2VzdEZvbGxvd1Vwc1Rvb2wgfSBmcm9tIFwiLi9zcmMvZm9sbG93LXVwLXN1Z2dlc3Rpb25zLnRzXCI7XG5leHBvcnQgdHlwZSB7IFJlc29sdmVkRm9sbG93VXBTdWdnZXN0aW9uc0NvbmZpZywgU3VnZ2VzdEZvbGxvd1Vwc09wdGlvbnMsIEZvbGxvd1VwU3VnZ2VzdGVyIH0gZnJvbSBcIi4vc3JjL2ZvbGxvdy11cC1zdWdnZXN0aW9ucy50c1wiO1xuZXhwb3J0IHsgZ2VuaWVBbnN3ZXJUZXh0LCB2aXNpYmxlR2VuaWVRdWVzdGlvbiwgZ2VuaWVNZXNzYWdlVG9VaU1lc3NhZ2VzLCBsaXN0R2VuaWVUaHJlYWRzLCBsaXN0R2VuaWVUaHJlYWRNZXNzYWdlcywgZ2VuaWVDaGF0U3RyZWFtLCBkZWxldGVHZW5pZVRocmVhZCwgZGVsZXRlR2VuaWVUaHJlYWRNZXNzYWdlIH0gZnJvbSBcIi4vc3JjL2dlbmllLWNoYXQudHNcIjtcbmV4cG9ydCB0eXBlIHsgR2VuaWVDaGF0U3BhY2UgfSBmcm9tIFwiLi9zcmMvZ2VuaWUtY2hhdC50c1wiO1xuZXhwb3J0IHsgREVGQVVMVF9HRU5JRV9BTElBUywgYXNrR2VuaWVUb29sSWQsIEdFTklFX0lOU1RSVUNUSU9OUywgbm9ybWFsaXplR2VuaWVTcGFjZXMsIHJlc29sdmVHZW5pZVNwYWNlcywgYnVpbGRHZW5pZVRvb2xzLCBidWlsZEdlbmllVG9vbGtpdFByb3ZpZGVyLCBjb2xsZWN0U3BhY2VTdWdnZXN0aW9ucyB9IGZyb20gXCIuL3NyYy9nZW5pZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBHZW5pZVNwYWNlQ29uZmlnLCBHZW5pZVNwYWNlc0NvbmZpZyB9IGZyb20gXCIuL3NyYy9nZW5pZS50c1wiO1xuZXhwb3J0IHsgSURFTlRJVFlfRU5WLCByZXNvbHZlSWRlbnRpdHlNb2RlIH0gZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgeyBidWlsZE1jcFNlcnZlciB9IGZyb20gXCIuL3NyYy9tY3AudHNcIjtcbmV4cG9ydCB0eXBlIHsgUmVzb2x2ZWRNY3AgfSBmcm9tIFwiLi9zcmMvbWNwLnRzXCI7XG5leHBvcnQgeyByZXF1ZXN0TWVtb3J5U2NvcGUsIHdpdGhSZXF1ZXN0TWVtb3J5U2NvcGUsIHdpdGhTb2Z0U3RvcmFnZUluaXQsIG5lZWRzTGFrZWJhc2UsIGNyZWF0ZU1lbW9yeUJ1aWxkZXIsIGNyZWF0ZU1hc3RyYUxha2ViYXNlUG9vbCwgTWVtb3J5QnVpbGRlciB9IGZyb20gXCIuL3NyYy9tZW1vcnkudHNcIjtcbmV4cG9ydCB7IEFnZW50VHJhY2VTcGFuUHJvY2Vzc29yLCB1Y1RyYWNlUHJlZml4RnJvbUV4cGVyaW1lbnRUYWdzLCByZXNldFVjVHJhY2VQcmVmaXhDYWNoZSwgbWxmbG93QXNzZXNzbWVudFRyYWNlSWQsIGRpcmVjdE1sZmxvd1RyYWNraW5nVXJpLCBkaXJlY3RNbGZsb3dUcmFjZUxvY2F0aW9uLCBkaXJlY3RNbGZsb3dUcmFjaW5nQ29uZmlndXJlZCwgYXBwTWxmbG93VHJhY2VJbmZvQ29uZmlndXJlZCwgaW5pdGlhbGl6ZUFwcE1sZmxvd1RyYWNlSW5mbywgaW5pdGlhbGl6ZVJlcXVlc3RNbGZsb3dUcmFjZUluZm8sIHBlcnNpc3RBcHBNbGZsb3dUcmFjZUluZm8sIHJlc2V0QXBwTWxmbG93VHJhY2VJbmZvLCBpbml0aWFsaXplRGlyZWN0TWxmbG93VHJhY2luZywgdXBkYXRlQWN0aXZlTWxmbG93VHJhY2UsIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlVGFncywgZGlyZWN0TWxmbG93VHJhY2luZ0FjdGl2ZSwgZmx1c2hEaXJlY3RNbGZsb3dUcmFjaW5nLCBtbGZsb3dFbmFibGVkLCBtbGZsb3dFeHBlcmltZW50TWFuYWdlclVybCwgbG9nRmVlZGJhY2sgfSBmcm9tIFwiLi9zcmMvbWxmbG93LnRzXCI7XG5leHBvcnQgdHlwZSB7IEFwcE1sZmxvd1RyYWNlSW5mbywgTG9nRmVlZGJhY2tQYXJhbXMgfSBmcm9tIFwiLi9zcmMvbWxmbG93LnRzXCI7XG5leHBvcnQgeyBSRVNQT05TRVNfUFJPVklERVJfT1BUSU9OUywgc2VydmluZ0FwaSwgcmVzb2x2ZU1vZGVsV29ya3NwYWNlQ2xpZW50LCByZXNvbHZlRGVmYXVsdE1vZGVsSWQsIGJ1aWxkTW9kZWwgfSBmcm9tIFwiLi9zcmMvbW9kZWwudHNcIjtcbmV4cG9ydCB0eXBlIHsgQnVpbGRNb2RlbE92ZXJyaWRlcyB9IGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0IHsgbW9udHlNYXhQcm9jZXNzZXMsIE1vbnR5U2FuZGJveCB9IGZyb20gXCIuL3NyYy9tb250eS1zYW5kYm94LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vbnR5U2FuZGJveE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvbW9udHktc2FuZGJveC50c1wiO1xuZXhwb3J0IHsgaXNPdGxwVHJhY2luZ0NvbmZpZ3VyZWQsIGNvbmZpZ3VyZU90ZWxQcm9wYWdhdGlvbiwgYnVpbGRPYnNlcnZhYmlsaXR5IH0gZnJvbSBcIi4vc3JjL29ic2VydmFiaWxpdHkudHNcIjtcbmV4cG9ydCB0eXBlIHsgQnVpbGRPYnNlcnZhYmlsaXR5T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9vYnNlcnZhYmlsaXR5LnRzXCI7XG5leHBvcnQgeyBNYXN0cmFQbHVnaW4sIG1hc3RyYSB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB7IHN0cmlwU3RhbGVDaGFydHNQcm9jZXNzb3IgfSBmcm9tIFwiLi9zcmMvcHJvY2Vzc29ycy50c1wiO1xuZXhwb3J0IHsgQUlUT09MU19TS0lMTFNfTU9VTlQsIFJFTU9URV9TS0lMTFNfTU9VTlQsIEFJVE9PTFNfUkVGUkVTSF9UVExfTVMsIEFJVE9PTFNfU09VUkNFLCBub3JtYWxpemVSZW1vdGVTa2lsbHNPcHRpb24sIHByb3Zpc2lvblJlbW90ZVNraWxscyB9IGZyb20gXCIuL3NyYy9yZW1vdGUtc2tpbGxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEFpVG9vbHNTb3VyY2UsIFJlbW90ZVNraWxsU291cmNlT3B0aW9ucywgUmVtb3RlU2tpbGxTb3VyY2UsIFJlbW90ZVNraWxsc09wdGlvbiwgTG9jYWxTa2lsbERpcmVjdG9yeU1vdW50LCBNZW1vcnlTa2lsbE1vdW50LCBMb2NhbFNraWxsTW91bnQsIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsIFByb3Zpc2lvbmVkUmVtb3RlU2tpbGxzLCBSZW1vdGVTa2lsbENhY2hlRW50cnksIFJlbW90ZVNraWxsc01ldGFkYXRhIH0gZnJvbSBcIi4vc3JjL3JlbW90ZS1za2lsbHMudHNcIjtcbmV4cG9ydCB7IE1BU1RSQV9PUklHSU5fS0VZIH0gZnJvbSBcIi4vc3JjL3JlcXVlc3QtY29udGV4dC50c1wiO1xuZXhwb3J0IHsgZGF0YWJyaWNrc0ZldGNoLCByZWFkUmVzcG9uc2VUZXh0LCByZWFkUmVzcG9uc2VKc29uIH0gZnJvbSBcIi4vc3JjL3Jlc3QudHNcIjtcbmV4cG9ydCB0eXBlIHsgRGF0YWJyaWNrc0ZldGNoSW5pdCB9IGZyb20gXCIuL3NyYy9yZXN0LnRzXCI7XG5leHBvcnQgeyBjbGVhclRydXN0ZWRSZXF1ZXN0Q29udGV4dCwgcmVxdWVzdE9yaWdpbiwgc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXIsIGNyZWF0ZVJlcXVlc3RDb250ZXh0LCBNYXN0cmFTZXJ2ZXIsIGlzTWFzdHJhUmVxdWVzdEFsbG93ZWQsIGF0dGFjaFJvdXRlUGF0Y2hNaWRkbGV3YXJlLCBhdHRhY2hTdGFsZVJlc3VtZVJlY292ZXJ5IH0gZnJvbSBcIi4vc3JjL3NlcnZlci50c1wiO1xuZXhwb3J0IHR5cGUgeyBBdHRyaWJ1dGVkSWRlbnRpdHksIE1hc3RyYUFwaUdhdGVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3NlcnZlci50c1wiO1xuZXhwb3J0IHsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSwgTUFTVFJBX1JFU09MVkVEX01PREVMX0tFWSwgZXh0cmFjdE1vZGVsT3ZlcnJpZGUsIHJlc29sdmVTZXJ2aW5nQ29uZmlnIH0gZnJvbSBcIi4vc3JjL3NlcnZpbmcudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxPdmVycmlkZVJlcXVlc3QgfSBmcm9tIFwiLi9zcmMvc2VydmluZy50c1wiO1xuZXhwb3J0IHsgT1JHQU5JWkFUSU9OX0FTU0lTVEFOVF9QQVRILCBPUkdBTklaQVRJT05fU0tJTExTX1BBVEgsIHBlcnNvbmFsV29ya3NwYWNlUGF0aCwgcGVyc29uYWxTa2lsbHNQYXRoIH0gZnJvbSBcIi4vc3JjL3NraWxsLXBhdGhzLnRzXCI7XG5leHBvcnQgeyBTVEFURU1FTlRfUk9XX0NBUCwgZmV0Y2hTdGF0ZW1lbnREYXRhLCBmZXRjaFN0YXRlbWVudEVtYmVkRGF0YSB9IGZyb20gXCIuL3NyYy9zdGF0ZW1lbnQudHNcIjtcbmV4cG9ydCB0eXBlIHsgU3RhdGVtZW50RW1iZWREYXRhIH0gZnJvbSBcIi4vc3JjL3N0YXRlbWVudC50c1wiO1xuZXhwb3J0IHsgYWdlbnRTdG9yYWdlU2NoZW1hTmFtZSB9IGZyb20gXCIuL3NyYy9zdG9yYWdlLXNjaGVtYS50c1wiO1xuZXhwb3J0IHsgVFlQT0dSQVBIWV9SVUxFIH0gZnJvbSBcIi4vc3JjL3N0eWxlLnRzXCI7XG5leHBvcnQgeyBUSVRMRV9JTlNUUlVDVElPTlMsIHN1bW1hcnlNb2RlbCwgc3VtbWFyaXplVGV4dCwgYnVpbGRTdW1tYXJpemVUb29sIH0gZnJvbSBcIi4vc3JjL3N1bW1hcml6ZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBTdW1tYXJpemVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3N1bW1hcml6ZS50c1wiO1xuZXhwb3J0IHsgVFJBQ0VfSU9fTElNSVQsIE1MRkxPV19TUEFOX0lOUFVUU19BVFRSLCBNTEZMT1dfU1BBTl9PVVRQVVRTX0FUVFIsIENIQVRfTUVTU0FHRVNfQVRUUiwgQ0hBVF9SRVNQT05TRV9BVFRSLCBDSEFUX0lERU5USVRZX0FUVFIsIENIQVRfR0VOSUVfVVNFRF9BVFRSLCBNTEZMT1dfU1BBTl9UWVBFX0FUVFIsIEdFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSLCBNTEZMT1dfU0VTU0lPTl9BVFRSLCBNTEZMT1dfU1BBTl9UWVBFX0FHRU5ULCBNTEZMT1dfU1BBTl9UWVBFX0dFTklFLCBzdGFtcEdlbmllVG9vbFNwYW4sIGFjdGl2ZUNoYXRUcmFjaW5nT3B0aW9ucywgcmVjb3JkQWN0aXZlVHJhY2VUYWcsIHJlY29yZEFjdGl2ZVRyYWNlVGFncywgcmVjb3JkQWN0aXZlVHJhY2VNb2RlbCwgcmVjb3JkQWN0aXZlVHJhY2VVc2VyLCByZWNvcmRBY3RpdmVUcmFjZUF1dGgsIHRleHRPbmx5Q2hhdElucHV0LCBhc3Npc3RhbnRUZXh0RnJvbVNzZSwgYXNzaXN0YW50VGV4dEZyb21Kc29uLCBBcHBNbGZsb3dUcmFjZUluZm9TcGFuUHJvY2Vzc29yLCByZWdpc3RlckFwcE1sZmxvd1RyYWNlSW5mb1Byb2Nlc3NvciwgY2hhdFR1cm5UZWxlbWV0cnlNaWRkbGV3YXJlLCBhdHRhY2hDaGF0VHVyblRlbGVtZXRyeSB9IGZyb20gXCIuL3NyYy90ZWxlbWV0cnkudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zLCBDaGF0VHJhY2VUYWdWYWx1ZSB9IGZyb20gXCIuL3NyYy90ZWxlbWV0cnkudHNcIjtcbmV4cG9ydCB7IE1MRkxPV19UUkFDRV9UQUdfUFJFRklYLCBNTEZMT1dfQUdFTlRfVEFHLCBNTEZMT1dfR0VOSUVfVEFHLCBNTEZMT1dfT0JPX0FVVEhfVEFHLCBNTEZMT1dfU1BfQVVUSF9UQUcsIE1MRkxPV19MT0NBTF9UQUcsIE1MRkxPV19BR0VOVF9UQUdfQVRUUiwgTUxGTE9XX0dFTklFX1RBR19BVFRSLCBBUFBLSVRfQUdFTlRfVFJBQ0VfUk9PVF9BVFRSLCBNTEZMT1dfT0JPX0FVVEhfVEFHX0FUVFIsIE1MRkxPV19TUF9BVVRIX1RBR19BVFRSLCBNTEZMT1dfTE9DQUxfVEFHX0FUVFIgfSBmcm9tIFwiLi9zcmMvdHJhY2UtYXR0cmlidXRlcy50c1wiO1xuZXhwb3J0IHsgaW52YWxpZEZpZWxkcyB9IGZyb20gXCIuL3NyYy92YWxpZGF0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNjaGVtYUlzc3VlcyB9IGZyb20gXCIuL3NyYy92YWxpZGF0aW9uLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX0RBVEFCUklDS1NfV09SS1NQQUNFX1BBVEhTLCBkYXRhYnJpY2tzV29ya3NwYWNlQ29uZmlnLCBkYXRhYnJpY2tzV29ya3NwYWNlLCBiaW5kRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsIHJlc29sdmVEYXRhYnJpY2tzV29ya3NwYWNlUGF0aHMsIGlubGluZVNraWxsc0Zyb21Mb2NhbE1vdW50cywgcmVxdWVzdFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCIuL3NyYy93b3Jrc3BhY2VzLnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LCBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aE9wdGlvbnMsIERhdGFicmlja3NXb3Jrc3BhY2VQYXRoLCBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aFZhbHVlLCBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXIsIERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZSwgV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbiwgRGF0YWJyaWNrc1dvcmtzcGFjZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvd29ya3NwYWNlcy50c1wiO1xuZXhwb3J0IHsgc2FmZVdyaXRlUHJvZ3Jlc3MgfSBmcm9tIFwiLi9zcmMvd3JpdGVyLnRzXCI7XG4iXX0=
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRywwQkFBMEIsQ0FBQztBQUM3RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssWUFBWSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxtQkFBbUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEtBQUssU0FBUyxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssWUFBWSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxhQUFhLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FB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b0JBQW9CLENBQUM7QUFFOW9CLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSw0QkFBNEIsRUFBRSx3QkFBd0IsRUFBRSx1QkFBdUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pULE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUseUJBQXlCLEVBQUUsbUJBQW1CLEVBQUUsOEJBQThCLEVBQUUsK0JBQStCLEVBQUUsMkJBQTJCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUUvTyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjE2NlwiO1xuZXhwb3J0ICogYXMgYWdlbnRzIGZyb20gXCIuL3NyYy9hZ2VudHMudHNcIjtcbmV4cG9ydCAqIGFzIGNoYXJ0IGZyb20gXCIuL3NyYy9jaGFydC50c1wiO1xuZXhwb3J0ICogYXMgY2hhdCBmcm9tIFwiLi9zcmMvY2hhdC50c1wiO1xuZXhwb3J0ICogYXMgY29uZmlnIGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCAqIGFzIGRlZmF1bHRzIGZyb20gXCIuL3NyYy9kZWZhdWx0cy50c1wiO1xuZXhwb3J0ICogYXMgZXZhbHVhdGlvbiBmcm9tIFwiLi9zcmMvZXZhbHVhdGlvbi50c1wiO1xuZXhwb3J0ICogYXMgZmVlZGJhY2tNb2RlIGZyb20gXCIuL3NyYy9mZWVkYmFjay1tb2RlLnRzXCI7XG5leHBvcnQgKiBhcyBmb2xsb3dVcFN1Z2dlc3Rpb25zIGZyb20gXCIuL3NyYy9mb2xsb3ctdXAtc3VnZ2VzdGlvbnMudHNcIjtcbmV4cG9ydCAqIGFzIGdlbmllQ2hhdCBmcm9tIFwiLi9zcmMvZ2VuaWUtY2hhdC50c1wiO1xuZXhwb3J0ICogYXMgZ2VuaWUgZnJvbSBcIi4vc3JjL2dlbmllLnRzXCI7XG5leHBvcnQgKiBhcyBpZGVudGl0eSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCAqIGFzIG1jcCBmcm9tIFwiLi9zcmMvbWNwLnRzXCI7XG5leHBvcnQgKiBhcyBtZW1vcnkgZnJvbSBcIi4vc3JjL21lbW9yeS50c1wiO1xuZXhwb3J0ICogYXMgbWxmbG93IGZyb20gXCIuL3NyYy9tbGZsb3cudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsIGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0ICogYXMgbW9udHlTYW5kYm94IGZyb20gXCIuL3NyYy9tb250eS1zYW5kYm94LnRzXCI7XG5leHBvcnQgKiBhcyBvYnNlcnZhYmlsaXR5IGZyb20gXCIuL3NyYy9vYnNlcnZhYmlsaXR5LnRzXCI7XG5leHBvcnQgKiBhcyBwbHVnaW4gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0ICogYXMgcHJvY2Vzc29ycyBmcm9tIFwiLi9zcmMvcHJvY2Vzc29ycy50c1wiO1xuZXhwb3J0ICogYXMgcmVtb3RlU2tpbGxzIGZyb20gXCIuL3NyYy9yZW1vdGUtc2tpbGxzLnRzXCI7XG5leHBvcnQgKiBhcyByZXF1ZXN0Q29udGV4dCBmcm9tIFwiLi9zcmMvcmVxdWVzdC1jb250ZXh0LnRzXCI7XG5leHBvcnQgKiBhcyByZXN0IGZyb20gXCIuL3NyYy9yZXN0LnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2ZXIgZnJvbSBcIi4vc3JjL3NlcnZlci50c1wiO1xuZXhwb3J0ICogYXMgc2VydmluZyBmcm9tIFwiLi9zcmMvc2VydmluZy50c1wiO1xuZXhwb3J0ICogYXMgc2tpbGxQYXRocyBmcm9tIFwiLi9zcmMvc2tpbGwtcGF0aHMudHNcIjtcbmV4cG9ydCAqIGFzIHN0YXRlbWVudCBmcm9tIFwiLi9zcmMvc3RhdGVtZW50LnRzXCI7XG5leHBvcnQgKiBhcyBzdG9yYWdlU2NoZW1hIGZyb20gXCIuL3NyYy9zdG9yYWdlLXNjaGVtYS50c1wiO1xuZXhwb3J0ICogYXMgc3R5bGUgZnJvbSBcIi4vc3JjL3N0eWxlLnRzXCI7XG5leHBvcnQgKiBhcyBzdW1tYXJpemUgZnJvbSBcIi4vc3JjL3N1bW1hcml6ZS50c1wiO1xuZXhwb3J0ICogYXMgdGVsZW1ldHJ5IGZyb20gXCIuL3NyYy90ZWxlbWV0cnkudHNcIjtcbmV4cG9ydCAqIGFzIHRyYWNlQXR0cmlidXRlcyBmcm9tIFwiLi9zcmMvdHJhY2UtYXR0cmlidXRlcy50c1wiO1xuZXhwb3J0ICogYXMgdmFsaWRhdGlvbiBmcm9tIFwiLi9zcmMvdmFsaWRhdGlvbi50c1wiO1xuZXhwb3J0ICogYXMgd29ya3NwYWNlcyBmcm9tIFwiLi9zcmMvd29ya3NwYWNlcy50c1wiO1xuZXhwb3J0ICogYXMgd3JpdGVyIGZyb20gXCIuL3NyYy93cml0ZXIudHNcIjtcbmV4cG9ydCB7IHRvb2wsIGNyZWF0ZUFnZW50LCBGQUxMQkFDS19BR0VOVF9JRCwgREVGQVVMVF9BR0VOVF9NQVhfU1RFUFMsIERFRkFVTFRfVE9PTF9XT1JLRkxPV19JTlNUUlVDVElPTlMsIENPREVfTU9ERV9ST1VUSU5HX0lOU1RSVUNUSU9OUywgREVGQVVMVF9TVFlMRV9JTlNUUlVDVElPTlMsIGJ1aWxkQWdlbnRzLCBhcHByb3ZhbEdhdGVkVG9vbElkcyB9IGZyb20gXCIuL3NyYy9hZ2VudHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhVG9vbHMsIEFwcEtpdFRvb2xPcHRpb25zLCBUb29sa2l0T3B0aW9ucywgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyLCBNYXN0cmFQbHVnaW5zLCBNYXN0cmFUb29sc0ZuLCBNYXN0cmFBZ2VudFdvcmtzcGFjZVJlc29sdmVyLCBNYXN0cmFBZ2VudERlZmluaXRpb24sIEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbiwgTWFzdHJhU3RvcmFnZUNvbmZpZ092ZXJyaWRlLCBNYXN0cmFNZW1vcnlDb25maWdPdmVycmlkZSwgQWdlbnREZWZhdWx0TW9kZWwsIEJ1aWx0QWdlbnRzLCBNYXN0cmFPdXRwdXRQcm9jZXNzb3JGYWN0b3J5IH0gZnJvbSBcIi4vc3JjL2FnZW50cy50c1wiO1xuZXhwb3J0IHsgY2hhcnRQbGFuU2NoZW1hLCBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hLCBjaGFydFRvb2xPdXRwdXRTY2hlbWEsIHByZXBhcmVDaGFydCwgZmV0Y2hDaGFydCwgcGxhblRvRWNoYXJ0c09wdGlvbiwgYnVpbGRSZW5kZXJEYXRhVG9vbCB9IGZyb20gXCIuL3NyYy9jaGFydC50c1wiO1xuZXhwb3J0IHR5cGUgeyBDaGFydFBsYW5uZXJSZXF1ZXN0LCBDaGFydFRvb2xPdXRwdXQsIFByZXBhcmVDaGFydE9wdGlvbnMsIEZldGNoQ2hhcnRPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2NoYXJ0LnRzXCI7XG5leHBvcnQgeyBhZ2VudEFib3J0U2lnbmFsLCBhZ2VudENoYXRSb3V0ZXMgfSBmcm9tIFwiLi9zcmMvY2hhdC50c1wiO1xuZXhwb3J0IHsgTUFTVFJBX1VTRVJfS0VZLCBNQVNUUkFfVVNFUl9OQU1FX0tFWSwgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLCBNQVNUUkFfQVVUSF9NT0RFX0tFWSwgTUFTVFJBX1JFUVVFU1RfSURfS0VZLCBNQVNUUkFfU0NPUEVTX0tFWSwgVFJBQ0VfUkVRVUVTVF9DT05URVhUX0tFWVMsIGV4ZWN1dGlvbkNvbnRleHRVc2VySWQsIGF0dHJpYnV0ZWRVc2VySWQsIHJlc29sdmVVc2VyS2V5LCBNQVNUUkFfQ09ORklHX1NDSEVNQSB9IGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCB0eXBlIHsgVXNlciwgTWFzdHJhTWVtb3J5Q29uZmlnLCBNYXN0cmFXb3Jrc3BhY2VTa2lsbHNDb25maWcsIE1hc3RyYUNvZGVNb2RlVHJhbnNwb3J0LCBNYXN0cmFDb2RlTW9kZUNvbmZpZywgTWFzdHJhTWNwQ29uZmlnLCBGb2xsb3dVcFN1Z2dlc3Rpb25zQ29uZmlnLCBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgeyBtb2RlbENhdGFsb2d1ZURlZmF1bHRzLCBnZW5pZVN1Z2dlc3Rpb25EZWZhdWx0cywgZ2VuaWVDb252ZXJzYXRpb25SZWFkRGVmYXVsdHMsIGdlbmllQ29udmVyc2F0aW9uV3JpdGVEZWZhdWx0cywgc3RhdGVtZW50RGF0YURlZmF1bHRzLCBjaGFydEZldGNoRGVmYXVsdHMsIGZlZWRiYWNrV3JpdGVEZWZhdWx0cyB9IGZyb20gXCIuL3NyYy9kZWZhdWx0cy50c1wiO1xuZXhwb3J0IHsgY3JlYXRlTWFzdHJhRXZhbERyaXZlciB9IGZyb20gXCIuL3NyYy9ldmFsdWF0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1hc3RyYUV2YWxEcml2ZXJPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2V2YWx1YXRpb24udHNcIjtcbmV4cG9ydCB7IHJlc29sdmVGZWVkYmFja01vZGUgfSBmcm9tIFwiLi9zcmMvZmVlZGJhY2stbW9kZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBGZWVkYmFja0F2YWlsYWJpbGl0eSB9IGZyb20gXCIuL3NyYy9mZWVkYmFjay1tb2RlLnRzXCI7XG5leHBvcnQgeyBmaWxlc3lzdGVtcywgTWFzdHJhRmlsZVN5c3RlbUFkYXB0ZXIsIE1vdW50ZWRDb21wb3NpdGVGaWxlc3lzdGVtLCBzY3JhdGNoRmlsZXN5c3RlbSB9IGZyb20gXCIuL3NyYy9maWxlc3lzdGVtcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBNYXN0cmFGaWxlU3lzdGVtQWRhcHRlck9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZmlsZXN5c3RlbXMudHNcIjtcbmV4cG9ydCB7IEZPTExPV19VUF9VU0VSX1RFWFRfS0VZLCBGT0xMT1dfVVBfTkFUSVZFX1FVRVNUSU9OU19LRVksIEZPTExPV19VUF9SVU5fSURfS0VZLCByZXNvbHZlRm9sbG93VXBTdWdnZXN0aW9uc0NvbmZpZywgc3VnZ2VzdEZvbGxvd1VwcywgYnVpbGRGb2xsb3dVcFN1Z2dlc3Rpb25zUHJvY2Vzc29yLCBidWlsZEZvbGxvd1VwU3VnZ2VzdGlvbnNUcmFuc2Zvcm0sIGJ1aWxkU3VnZ2VzdEZvbGxvd1Vwc1Rvb2wgfSBmcm9tIFwiLi9zcmMvZm9sbG93LXVwLXN1Z2dlc3Rpb25zLnRzXCI7XG5leHBvcnQgdHlwZSB7IFJlc29sdmVkRm9sbG93VXBTdWdnZXN0aW9uc0NvbmZpZywgU3VnZ2VzdEZvbGxvd1Vwc09wdGlvbnMsIEZvbGxvd1VwU3VnZ2VzdGVyIH0gZnJvbSBcIi4vc3JjL2ZvbGxvdy11cC1zdWdnZXN0aW9ucy50c1wiO1xuZXhwb3J0IHsgZ2VuaWVBbnN3ZXJUZXh0LCB2aXNpYmxlR2VuaWVRdWVzdGlvbiwgdmlzaWJsZUdlbmllVGhyZWFkVGl0bGUsIGdlbmllTWVzc2FnZVRvVWlNZXNzYWdlcywgbGlzdEdlbmllVGhyZWFkcywgbGlzdEdlbmllVGhyZWFkTWVzc2FnZXMsIGdlbmllQ2hhdFN0cmVhbSwgZGVsZXRlR2VuaWVUaHJlYWQsIGRlbGV0ZUdlbmllVGhyZWFkTWVzc2FnZSB9IGZyb20gXCIuL3NyYy9nZW5pZS1jaGF0LnRzXCI7XG5leHBvcnQgdHlwZSB7IEdlbmllQ2hhdFNwYWNlIH0gZnJvbSBcIi4vc3JjL2dlbmllLWNoYXQudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfR0VOSUVfQUxJQVMsIGFza0dlbmllVG9vbElkLCBHRU5JRV9JTlNUUlVDVElPTlMsIG5vcm1hbGl6ZUdlbmllU3BhY2VzLCByZXNvbHZlR2VuaWVTcGFjZXMsIGJ1aWxkR2VuaWVUb29scywgYnVpbGRHZW5pZVRvb2xraXRQcm92aWRlciwgY29sbGVjdFNwYWNlU3VnZ2VzdGlvbnMgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB0eXBlIHsgR2VuaWVTcGFjZUNvbmZpZywgR2VuaWVTcGFjZXNDb25maWcgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB7IElERU5USVRZX0VOViwgcmVzb2x2ZUlkZW50aXR5TW9kZSB9IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0IHsgYnVpbGRNY3BTZXJ2ZXIgfSBmcm9tIFwiLi9zcmMvbWNwLnRzXCI7XG5leHBvcnQgdHlwZSB7IFJlc29sdmVkTWNwIH0gZnJvbSBcIi4vc3JjL21jcC50c1wiO1xuZXhwb3J0IHsgcmVxdWVzdE1lbW9yeVNjb3BlLCB3aXRoUmVxdWVzdE1lbW9yeVNjb3BlLCB3aXRoU29mdFN0b3JhZ2VJbml0LCBuZWVkc0xha2ViYXNlLCBjcmVhdGVNZW1vcnlCdWlsZGVyLCBjcmVhdGVNYXN0cmFMYWtlYmFzZVBvb2wsIE1lbW9yeUJ1aWxkZXIgfSBmcm9tIFwiLi9zcmMvbWVtb3J5LnRzXCI7XG5leHBvcnQgeyBBZ2VudFRyYWNlU3BhblByb2Nlc3NvciwgdWNUcmFjZVByZWZpeEZyb21FeHBlcmltZW50VGFncywgcmVzZXRVY1RyYWNlUHJlZml4Q2FjaGUsIG1sZmxvd0Fzc2Vzc21lbnRUcmFjZUlkLCBkaXJlY3RNbGZsb3dUcmFja2luZ1VyaSwgZGlyZWN0TWxmbG93VHJhY2VMb2NhdGlvbiwgZGlyZWN0TWxmbG93VHJhY2luZ0NvbmZpZ3VyZWQsIGFwcE1sZmxvd1RyYWNlSW5mb0NvbmZpZ3VyZWQsIGluaXRpYWxpemVBcHBNbGZsb3dUcmFjZUluZm8sIGluaXRpYWxpemVSZXF1ZXN0TWxmbG93VHJhY2VJbmZvLCBwZXJzaXN0QXBwTWxmbG93VHJhY2VJbmZvLCByZXNldEFwcE1sZmxvd1RyYWNlSW5mbywgaW5pdGlhbGl6ZURpcmVjdE1sZmxvd1RyYWNpbmcsIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlLCB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZVRhZ3MsIGRpcmVjdE1sZmxvd1RyYWNpbmdBY3RpdmUsIGZsdXNoRGlyZWN0TWxmbG93VHJhY2luZywgbWxmbG93RW5hYmxlZCwgbWxmbG93RXhwZXJpbWVudE1hbmFnZXJVcmwsIGxvZ0ZlZWRiYWNrIH0gZnJvbSBcIi4vc3JjL21sZmxvdy50c1wiO1xuZXhwb3J0IHR5cGUgeyBBcHBNbGZsb3dUcmFjZUluZm8sIExvZ0ZlZWRiYWNrUGFyYW1zIH0gZnJvbSBcIi4vc3JjL21sZmxvdy50c1wiO1xuZXhwb3J0IHsgUkVTUE9OU0VTX1BST1ZJREVSX09QVElPTlMsIHNlcnZpbmdBcGksIHJlc29sdmVNb2RlbFdvcmtzcGFjZUNsaWVudCwgcmVzb2x2ZURlZmF1bHRNb2RlbElkLCBidWlsZE1vZGVsIH0gZnJvbSBcIi4vc3JjL21vZGVsLnRzXCI7XG5leHBvcnQgdHlwZSB7IEJ1aWxkTW9kZWxPdmVycmlkZXMgfSBmcm9tIFwiLi9zcmMvbW9kZWwudHNcIjtcbmV4cG9ydCB7IG1vbnR5TWF4UHJvY2Vzc2VzLCBNb250eVNhbmRib3ggfSBmcm9tIFwiLi9zcmMvbW9udHktc2FuZGJveC50c1wiO1xuZXhwb3J0IHR5cGUgeyBNb250eVNhbmRib3hPcHRpb25zIH0gZnJvbSBcIi4vc3JjL21vbnR5LXNhbmRib3gudHNcIjtcbmV4cG9ydCB7IGlzT3RscFRyYWNpbmdDb25maWd1cmVkLCBjb25maWd1cmVPdGVsUHJvcGFnYXRpb24sIGJ1aWxkT2JzZXJ2YWJpbGl0eSB9IGZyb20gXCIuL3NyYy9vYnNlcnZhYmlsaXR5LnRzXCI7XG5leHBvcnQgdHlwZSB7IEJ1aWxkT2JzZXJ2YWJpbGl0eU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvb2JzZXJ2YWJpbGl0eS50c1wiO1xuZXhwb3J0IHsgTWFzdHJhUGx1Z2luLCBtYXN0cmEgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgeyBzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yIH0gZnJvbSBcIi4vc3JjL3Byb2Nlc3NvcnMudHNcIjtcbmV4cG9ydCB7IEFJVE9PTFNfU0tJTExTX01PVU5ULCBSRU1PVEVfU0tJTExTX01PVU5ULCBBSVRPT0xTX1JFRlJFU0hfVFRMX01TLCBBSVRPT0xTX1NPVVJDRSwgbm9ybWFsaXplUmVtb3RlU2tpbGxzT3B0aW9uLCBwcm92aXNpb25SZW1vdGVTa2lsbHMgfSBmcm9tIFwiLi9zcmMvcmVtb3RlLXNraWxscy50c1wiO1xuZXhwb3J0IHR5cGUgeyBBaVRvb2xzU291cmNlLCBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnMsIFJlbW90ZVNraWxsU291cmNlLCBSZW1vdGVTa2lsbHNPcHRpb24sIExvY2FsU2tpbGxEaXJlY3RvcnlNb3VudCwgTWVtb3J5U2tpbGxNb3VudCwgTG9jYWxTa2lsbE1vdW50LCBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLCBQcm92aXNpb25lZFJlbW90ZVNraWxscywgUmVtb3RlU2tpbGxDYWNoZUVudHJ5LCBSZW1vdGVTa2lsbHNNZXRhZGF0YSB9IGZyb20gXCIuL3NyYy9yZW1vdGUtc2tpbGxzLnRzXCI7XG5leHBvcnQgeyBNQVNUUkFfT1JJR0lOX0tFWSB9IGZyb20gXCIuL3NyYy9yZXF1ZXN0LWNvbnRleHQudHNcIjtcbmV4cG9ydCB7IGRhdGFicmlja3NGZXRjaCwgcmVhZFJlc3BvbnNlVGV4dCwgcmVhZFJlc3BvbnNlSnNvbiB9IGZyb20gXCIuL3NyYy9yZXN0LnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NGZXRjaEluaXQgfSBmcm9tIFwiLi9zcmMvcmVzdC50c1wiO1xuZXhwb3J0IHsgY2xlYXJUcnVzdGVkUmVxdWVzdENvbnRleHQsIHJlcXVlc3RPcmlnaW4sIHN0YW1wUmVxdWVzdENvbnRleHRVc2VyLCBjcmVhdGVSZXF1ZXN0Q29udGV4dCwgTWFzdHJhU2VydmVyLCBpc01hc3RyYVJlcXVlc3RBbGxvd2VkLCBhdHRhY2hSb3V0ZVBhdGNoTWlkZGxld2FyZSwgYXR0YWNoU3RhbGVSZXN1bWVSZWNvdmVyeSB9IGZyb20gXCIuL3NyYy9zZXJ2ZXIudHNcIjtcbmV4cG9ydCB0eXBlIHsgQXR0cmlidXRlZElkZW50aXR5LCBNYXN0cmFBcGlHYXRlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9zZXJ2ZXIudHNcIjtcbmV4cG9ydCB7IE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVksIE1BU1RSQV9SRVNPTFZFRF9NT0RFTF9LRVksIGV4dHJhY3RNb2RlbE92ZXJyaWRlLCByZXNvbHZlU2VydmluZ0NvbmZpZyB9IGZyb20gXCIuL3NyYy9zZXJ2aW5nLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsT3ZlcnJpZGVSZXF1ZXN0IH0gZnJvbSBcIi4vc3JjL3NlcnZpbmcudHNcIjtcbmV4cG9ydCB7IE9SR0FOSVpBVElPTl9BU1NJU1RBTlRfUEFUSCwgT1JHQU5JWkFUSU9OX1NLSUxMU19QQVRILCBwZXJzb25hbFdvcmtzcGFjZVBhdGgsIHBlcnNvbmFsU2tpbGxzUGF0aCB9IGZyb20gXCIuL3NyYy9za2lsbC1wYXRocy50c1wiO1xuZXhwb3J0IHsgU1RBVEVNRU5UX1JPV19DQVAsIGZldGNoU3RhdGVtZW50RGF0YSwgZmV0Y2hTdGF0ZW1lbnRFbWJlZERhdGEgfSBmcm9tIFwiLi9zcmMvc3RhdGVtZW50LnRzXCI7XG5leHBvcnQgdHlwZSB7IFN0YXRlbWVudEVtYmVkRGF0YSB9IGZyb20gXCIuL3NyYy9zdGF0ZW1lbnQudHNcIjtcbmV4cG9ydCB7IGFnZW50U3RvcmFnZVNjaGVtYU5hbWUgfSBmcm9tIFwiLi9zcmMvc3RvcmFnZS1zY2hlbWEudHNcIjtcbmV4cG9ydCB7IFRZUE9HUkFQSFlfUlVMRSB9IGZyb20gXCIuL3NyYy9zdHlsZS50c1wiO1xuZXhwb3J0IHsgVElUTEVfSU5TVFJVQ1RJT05TLCBzdW1tYXJ5TW9kZWwsIHN1bW1hcml6ZVRleHQsIGJ1aWxkU3VtbWFyaXplVG9vbCB9IGZyb20gXCIuL3NyYy9zdW1tYXJpemUudHNcIjtcbmV4cG9ydCB0eXBlIHsgU3VtbWFyaXplT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9zdW1tYXJpemUudHNcIjtcbmV4cG9ydCB7IFRSQUNFX0lPX0xJTUlULCBNTEZMT1dfU1BBTl9JTlBVVFNfQVRUUiwgTUxGTE9XX1NQQU5fT1VUUFVUU19BVFRSLCBDSEFUX01FU1NBR0VTX0FUVFIsIENIQVRfUkVTUE9OU0VfQVRUUiwgQ0hBVF9JREVOVElUWV9BVFRSLCBDSEFUX0dFTklFX1VTRURfQVRUUiwgTUxGTE9XX1NQQU5fVFlQRV9BVFRSLCBHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUiwgTUxGTE9XX1NFU1NJT05fQVRUUiwgTUxGTE9XX1NQQU5fVFlQRV9BR0VOVCwgTUxGTE9XX1NQQU5fVFlQRV9HRU5JRSwgc3RhbXBHZW5pZVRvb2xTcGFuLCBhY3RpdmVDaGF0VHJhY2luZ09wdGlvbnMsIHJlY29yZEFjdGl2ZVRyYWNlVGFnLCByZWNvcmRBY3RpdmVUcmFjZVRhZ3MsIHJlY29yZEFjdGl2ZVRyYWNlTW9kZWwsIHJlY29yZEFjdGl2ZVRyYWNlVXNlciwgcmVjb3JkQWN0aXZlVHJhY2VBdXRoLCB0ZXh0T25seUNoYXRJbnB1dCwgYXNzaXN0YW50VGV4dEZyb21Tc2UsIGFzc2lzdGFudFRleHRGcm9tSnNvbiwgQXBwTWxmbG93VHJhY2VJbmZvU3BhblByb2Nlc3NvciwgcmVnaXN0ZXJBcHBNbGZsb3dUcmFjZUluZm9Qcm9jZXNzb3IsIGNoYXRUdXJuVGVsZW1ldHJ5TWlkZGxld2FyZSwgYXR0YWNoQ2hhdFR1cm5UZWxlbWV0cnkgfSBmcm9tIFwiLi9zcmMvdGVsZW1ldHJ5LnRzXCI7XG5leHBvcnQgdHlwZSB7IENoYXRUdXJuVGVsZW1ldHJ5T3B0aW9ucywgQ2hhdFRyYWNlVGFnVmFsdWUgfSBmcm9tIFwiLi9zcmMvdGVsZW1ldHJ5LnRzXCI7XG5leHBvcnQgeyBNTEZMT1dfVFJBQ0VfVEFHX1BSRUZJWCwgTUxGTE9XX0FHRU5UX1RBRywgTUxGTE9XX0dFTklFX1RBRywgTUxGTE9XX09CT19BVVRIX1RBRywgTUxGTE9XX1NQX0FVVEhfVEFHLCBNTEZMT1dfTE9DQUxfVEFHLCBNTEZMT1dfQUdFTlRfVEFHX0FUVFIsIE1MRkxPV19HRU5JRV9UQUdfQVRUUiwgQVBQS0lUX0FHRU5UX1RSQUNFX1JPT1RfQVRUUiwgTUxGTE9XX09CT19BVVRIX1RBR19BVFRSLCBNTEZMT1dfU1BfQVVUSF9UQUdfQVRUUiwgTUxGTE9XX0xPQ0FMX1RBR19BVFRSIH0gZnJvbSBcIi4vc3JjL3RyYWNlLWF0dHJpYnV0ZXMudHNcIjtcbmV4cG9ydCB7IGludmFsaWRGaWVsZHMgfSBmcm9tIFwiLi9zcmMvdmFsaWRhdGlvbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBTY2hlbWFJc3N1ZXMgfSBmcm9tIFwiLi9zcmMvdmFsaWRhdGlvbi50c1wiO1xuZXhwb3J0IHsgREVGQVVMVF9EQVRBQlJJQ0tTX1dPUktTUEFDRV9QQVRIUywgZGF0YWJyaWNrc1dvcmtzcGFjZUNvbmZpZywgZGF0YWJyaWNrc1dvcmtzcGFjZSwgYmluZERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LCByZXNvbHZlRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhzLCBpbmxpbmVTa2lsbHNGcm9tTG9jYWxNb3VudHMsIHJlcXVlc3RXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiLi9zcmMvd29ya3NwYWNlcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCwgRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhPcHRpb25zLCBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aCwgRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhWYWx1ZSwgRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlRmlsdGVyLCBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGUsIFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb24sIERhdGFicmlja3NXb3Jrc3BhY2VPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZXMudHNcIjtcbmV4cG9ydCB7IHNhZmVXcml0ZVByb2dyZXNzIH0gZnJvbSBcIi4vc3JjL3dyaXRlci50c1wiO1xuIl19
|
package/lib/src/genie-chat.d.ts
CHANGED
|
@@ -36,6 +36,8 @@ export interface GenieChatSpace {
|
|
|
36
36
|
export declare function genieAnswerText(message: GenieMessage): string;
|
|
37
37
|
/** Recover the original user question from a context-augmented Genie input. */
|
|
38
38
|
export declare function visibleGenieQuestion(content: string): string;
|
|
39
|
+
/** Remove a complete hidden context envelope or omit a truncated polluted title. */
|
|
40
|
+
export declare function visibleGenieThreadTitle(title: string | undefined): string | undefined;
|
|
39
41
|
/**
|
|
40
42
|
* Project one persisted Genie message onto the user question and the assistant
|
|
41
43
|
* answer the chat transcript renders. The assistant owns an `ask_genie` tool
|
package/lib/src/genie-chat.js
CHANGED
|
@@ -26,7 +26,8 @@ const LIST_PAGE_SIZE = 100;
|
|
|
26
26
|
const THREAD_LIMIT = 100;
|
|
27
27
|
const AGENT_CONVERSATION_TYPE = "GENIE_CONVERSATION_TYPE_AGENT";
|
|
28
28
|
const DIRECT_GENIE_ERROR = "Genie could not complete the request.";
|
|
29
|
-
const
|
|
29
|
+
const GENIE_CONTEXT_TAG = "<dbx-tools-genie-context>";
|
|
30
|
+
const GENIE_CONTEXT_PREFIX = `${GENIE_CONTEXT_TAG}\n`;
|
|
30
31
|
const GENIE_CONTEXT_SUFFIX = "\n</dbx-tools-genie-context>\n\n";
|
|
31
32
|
const GENIE_MEMORY_MESSAGES = 12;
|
|
32
33
|
/** Suffix that keeps a Genie question's user message id distinct from its answer. */
|
|
@@ -113,6 +114,20 @@ export function visibleGenieQuestion(content) {
|
|
|
113
114
|
const boundary = content.indexOf(GENIE_CONTEXT_SUFFIX);
|
|
114
115
|
return boundary < 0 ? content : content.slice(boundary + GENIE_CONTEXT_SUFFIX.length);
|
|
115
116
|
}
|
|
117
|
+
/** Remove a complete hidden context envelope or omit a truncated polluted title. */
|
|
118
|
+
export function visibleGenieThreadTitle(title) {
|
|
119
|
+
const candidate = title?.trim();
|
|
120
|
+
if (!candidate)
|
|
121
|
+
return undefined;
|
|
122
|
+
if (!candidate.startsWith(GENIE_CONTEXT_TAG))
|
|
123
|
+
return candidate;
|
|
124
|
+
if (!candidate.startsWith(GENIE_CONTEXT_PREFIX))
|
|
125
|
+
return undefined;
|
|
126
|
+
const visible = visibleGenieQuestion(candidate);
|
|
127
|
+
if (visible === candidate)
|
|
128
|
+
return undefined;
|
|
129
|
+
return visible.trim() || undefined;
|
|
130
|
+
}
|
|
116
131
|
function messageText(message) {
|
|
117
132
|
const text = message.content.parts
|
|
118
133
|
.flatMap((part) => isRecord(part) && part.type === "text" && typeof part.text === "string" ? [part.text] : [])
|
|
@@ -270,15 +285,35 @@ export async function listGenieThreads(client, space, signal) {
|
|
|
270
285
|
if (!isRecord(conversation) || conversation.agent_type !== AGENT_CONVERSATION_TYPE) {
|
|
271
286
|
continue;
|
|
272
287
|
}
|
|
288
|
+
const rawTitle = typeof conversation.title === "string" ? conversation.title : undefined;
|
|
289
|
+
const title = visibleGenieThreadTitle(rawTitle);
|
|
273
290
|
threads.push({
|
|
274
291
|
id: conversation.conversation_id,
|
|
275
|
-
...(
|
|
292
|
+
...(title ? { title } : {}),
|
|
293
|
+
...(rawTitle?.trim().startsWith(GENIE_CONTEXT_TAG) && !title ? { recoverTitle: true } : {}),
|
|
276
294
|
createdAt: new Date(conversation.created_timestamp).toISOString(),
|
|
277
295
|
});
|
|
278
296
|
}
|
|
279
297
|
pageToken = page.next_page_token || undefined;
|
|
280
298
|
} while (pageToken && threads.length < THREAD_LIMIT);
|
|
281
|
-
|
|
299
|
+
const recovered = await Promise.all(threads.map(async ({ recoverTitle, ...thread }) => {
|
|
300
|
+
if (!recoverTitle)
|
|
301
|
+
return thread;
|
|
302
|
+
try {
|
|
303
|
+
const messages = await listAgentModeConversation(client, space.spaceId, thread.id, signal ? { context: signal } : {});
|
|
304
|
+
const title = visibleGenieQuestion(messages[0]?.content ?? "").trim();
|
|
305
|
+
return title ? { ...thread, title } : thread;
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
logger.warn("thread:title-recovery-failed", {
|
|
309
|
+
conversationId: thread.id,
|
|
310
|
+
spaceId: space.spaceId,
|
|
311
|
+
error: toError(error),
|
|
312
|
+
});
|
|
313
|
+
return thread;
|
|
314
|
+
}
|
|
315
|
+
}));
|
|
316
|
+
return recovered.sort((a, b) => b.createdAt.localeCompare(a.createdAt)).slice(0, THREAD_LIMIT);
|
|
282
317
|
}
|
|
283
318
|
/**
|
|
284
319
|
* Load one conversation's messages as chronological chat transcript messages.
|
|
@@ -441,4 +476,4 @@ export async function deleteGenieThreadMessage(client, space, conversationId, me
|
|
|
441
476
|
: messageId,
|
|
442
477
|
});
|
|
443
478
|
}
|
|
444
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuaWUtY2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5pZS1jaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUdILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0UsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BFLE9BQU8sRUFBcUIsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDL0YsT0FBTyxFQUlMLFlBQVksRUFDWix3QkFBd0IsRUFHeEIsNEJBQTRCLEdBQzdCLE1BQU0sMEJBQTBCLENBQUM7QUFHbEMsT0FBTyxFQUFFLHNCQUFzQixFQUF1QixNQUFNLDhCQUE4QixDQUFDO0FBQzNGLE9BQU8sRUFBRSxxQkFBcUIsRUFBdUMsTUFBTSxJQUFJLENBQUM7QUFFaEYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUU1QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFL0MscUVBQXFFO0FBQ3JFLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQztBQUUzQixnRUFBZ0U7QUFDaEUsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDO0FBQ3pCLE1BQU0sdUJBQXVCLEdBQUcsK0JBQStCLENBQUM7QUFDaEUsTUFBTSxrQkFBa0IsR0FBRyx1Q0FBdUMsQ0FBQztBQUNuRSxNQUFNLG9CQUFvQixHQUFHLDZCQUE2QixDQUFDO0FBQzNELE1BQU0sb0JBQW9CLEdBQUcsa0NBQWtDLENBQUM7QUFDaEUsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLENBQUM7QUFFakMscUZBQXFGO0FBQ3JGLE1B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QUFDLENBQUMsU0FBUztLQUNkLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERpcmVjdCBHZW5pZSBjaGF0IG92ZXIgdGhlIE1hc3RyYSBjaGF0IHdpcmUuXG4gKlxuICogU2VydmVzIG9uZSBHZW5pZSBzcGFjZSBhcyBhIGNoYXQgd2l0aG91dCBhbiBvdXRlciBtb2RlbC4gR2VuaWUgb3duc1xuICogY29udmVyc2F0aW9uIHN0YXRlOyBvcHRpb25hbCBNYXN0cmEgTWVtb3J5IGNvbnRyaWJ1dGVzIHJlc291cmNlLXNjb3BlZFxuICogc2VtYW50aWMgcmVjYWxsIGFuZCByZWNlaXZlcyBjb21wbGV0ZWQgdHVybnMuIEVhY2ggdHVybiBpcyBwcm9qZWN0ZWQgb250b1xuICogdGhlIHNhbWUgQUkgU0RLIFVJIGNodW5rcyBhbiBhZ2VudCB0dXJuIHByb2R1Y2VzIHdoZW4gaXQgY2FsbHMgYGFza19nZW5pZWBcbiAqIChhIG5hdGl2ZSB0b29sIHBhcnQsIGBkYXRhLWdlbmllLXByb2dyZXNzYCBldmVudHMsIGFuZCB0aGUgYW5zd2VyIHRleHQpLCBzb1xuICogdGhlIE1hc3RyYSBjaGF0IFVJIHJlbmRlcnMgcGlsbHMsIHRob3VnaHRzLCBzdWdnZXN0aW9ucywgYW5kIGVtYmVkc1xuICogaWRlbnRpY2FsbHkgZm9yIGJvdGguXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgdG9Db250ZXh0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBsaXN0QWdlbnRNb2RlQ29udmVyc2F0aW9uLCBnZW5pZUV2ZW50Q2hhdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2dlbmllXCI7XG5pbXBvcnQgeyBsb2csIHRvRXJyb3IsIGlkLCBpc1JlY29yZCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyB0eXBlIEdlbmllTWVzc2FnZSwgZXZlbnRzRnJvbU1lc3NhZ2UsIGh1bWFuaXplU3RhdHVzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWdlbmllXCI7XG5pbXBvcnQge1xuICB0eXBlIEdlbmllQ2hhdFJlcXVlc3QsXG4gIHR5cGUgR2VuaWVUaHJlYWQsXG4gIHR5cGUgU3RhcnRlZEV2ZW50LFxuICBmb3JtYXRNYXJrZXIsXG4gIEdFTklFX1BST0dSRVNTX1BBUlRfVFlQRSxcbiAgdHlwZSBHZW5pZVdyaXRlckV2ZW50LFxuICB0eXBlIEdlbmllQ29udmVyc2F0aW9uUGFydERhdGEsXG4gIEdFTklFX0NPTlZFUlNBVElPTl9QQVJUX1RZUEUsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB0eXBlIHsgTWFzdHJhREJNZXNzYWdlIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFNZW1vcnkgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL21lbW9yeVwiO1xuaW1wb3J0IHsgTUFTVFJBX1JFU09VUkNFX0lEX0tFWSwgdHlwZSBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBjcmVhdGVVSU1lc3NhZ2VTdHJlYW0sIHR5cGUgVUlNZXNzYWdlLCB0eXBlIFVJTWVzc2FnZUNodW5rIH0gZnJvbSBcImFpXCI7XG5cbmltcG9ydCB7IGFza0dlbmllVG9vbElkIH0gZnJvbSBcIi4vZ2VuaWUudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9nZW5pZS1jaGF0XCIpO1xuXG4vKiogUGFnZSBzaXplIHVzZWQgd2hpbGUgd2Fsa2luZyBHZW5pZSdzIHBhZ2luYXRlZCBsaXN0IGVuZHBvaW50cy4gKi9cbmNvbnN0IExJU1RfUEFHRV9TSVpFID0gMTAwO1xuXG4vKiogVXBwZXIgYm91bmQgb24gY29udmVyc2F0aW9ucyBzdXJmYWNlZCBpbiB0aGUgdGhyZWFkIGxpc3QuICovXG5jb25zdCBUSFJFQURfTElNSVQgPSAxMDA7XG5jb25zdCBBR0VOVF9DT05WRVJTQVRJT05fVFlQRSA9IFwiR0VOSUVfQ09OVkVSU0FUSU9OX1RZUEVfQUdFTlRcIjtcbmNvbnN0IERJUkVDVF9HRU5JRV9FUlJPUiA9IFwiR2VuaWUgY291bGQgbm90IGNvbXBsZXRlIHRoZSByZXF1ZXN0LlwiO1xuY29uc3QgR0VOSUVfQ09OVEVYVF9QUkVGSVggPSBcIjxkYngtdG9vbHMtZ2VuaWUtY29udGV4dD5cXG5cIjtcbmNvbnN0IEdFTklFX0NPTlRFWFRfU1VGRklYID0gXCJcXG48L2RieC10b29scy1nZW5pZS1jb250ZXh0PlxcblxcblwiO1xuY29uc3QgR0VOSUVfTUVNT1JZX01FU1NBR0VTID0gMTI7XG5cbi8qKiBTdWZmaXggdGhhdCBrZWVwcyBhIEdlbmllIHF1ZXN0aW9uJ3MgdXNlciBtZXNzYWdlIGlkIGRpc3RpbmN0IGZyb20gaXRzIGFuc3dlci4gKi9cbmNvbnN0IFFVRVNUSU9OX0lEX1NVRkZJWCA9IFwiOnF1ZXN0aW9uXCI7XG5cbi8qKiBPbmUgY29uZmlndXJlZCBHZW5pZSBzcGFjZSBhZGRyZXNzZWQgYnkgdGhlIGRpcmVjdCBjaGF0IHJvdXRlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuaWVDaGF0U3BhY2Uge1xuICAvKiogU3BhY2UgYWxpYXMgZnJvbSB0aGUgcm91dGUsIHdoaWNoIGFsc28gc2VsZWN0cyB0aGUgYGFza19nZW5pZWAgdG9vbCBpZC4gKi9cbiAgYWxpYXM6IHN0cmluZztcbiAgLyoqIEdlbmllIGBzcGFjZV9pZGAuICovXG4gIHNwYWNlSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb21wb3NlIHRoZSB2aXNpYmxlIGFuc3dlciBmb3Igb25lIHRlcm1pbmFsIEdlbmllIG1lc3NhZ2UuIEFnZW50IE1vZGUgcHV0cyBhblxuICogZW1wdHkgYG91dHB1dF90ZXh0YCBwYXJ0IHdpdGggYG1ldGFkYXRhLnZpei5hdHRhY2htZW50X2lkYCB3aGVyZXZlciBhIG5hdGl2ZVxuICogdmlzdWFsaXphdGlvbiBiZWxvbmdzLCBzbyB0aG9zZSBwbGFjZWhvbGRlcnMgYmVjb21lIEFwcEtpdCB2aXN1YWxpemF0aW9uXG4gKiBtYXJrZXJzIGluIHRoZSBzYW1lIHByb3NlIHBvc2l0aW9uLiBRdWVyeSBvdXRwdXRzIHdpdGhvdXQgYW4gaW5saW5lXG4gKiBwbGFjZWhvbGRlciBhcmUgYXBwZW5kZWQgYWZ0ZXIgdGhlIG5hcnJhdGl2ZSBhcyBkYXRhIG9yIHZpc3VhbGl6YXRpb24gZW1iZWRzLlxuICogQWdlbnQgTW9kZSdzIE1hcmtkb3duIGNvcHkgb2YgYSBxdWVyeSByZXN1bHQgaXMgZHJvcHBlZCBiZWNhdXNlIGVpdGhlciBlbWJlZFxuICogcmVuZGVycyB0aGUgc2FtZSByb3dzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuaWVBbnN3ZXJUZXh0KG1lc3NhZ2U6IEdlbmllTWVzc2FnZSk6IHN0cmluZyB7XG4gIGNvbnN0IGF0dGFjaG1lbnRzID0gbWVzc2FnZS5hdHRhY2htZW50cyA/PyBbXTtcbiAgY29uc3Qgc3RhdGVtZW50c0J5UXVlcnkgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBjb25zdCBxdWVyaWVzQnlWaXN1YWxpemF0aW9uID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgY29uc3QgdmlzdWFsaXplZFF1ZXJpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBhdHRhY2htZW50IG9mIGF0dGFjaG1lbnRzKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50SWQgPSBhdHRhY2htZW50LnF1ZXJ5Py5zdGF0ZW1lbnRfaWQ7XG4gICAgaWYgKHN0YXRlbWVudElkICYmIGF0dGFjaG1lbnQuYXR0YWNobWVudF9pZCkge1xuICAgICAgc3RhdGVtZW50c0J5UXVlcnkuc2V0KGF0dGFjaG1lbnQuYXR0YWNobWVudF9pZCwgc3RhdGVtZW50SWQpO1xuICAgIH1cbiAgICBpZiAoYXR0YWNobWVudC5hdHRhY2htZW50X2lkICYmIGF0dGFjaG1lbnQudml6Py5xdWVyeV9hdHRhY2htZW50X2lkKSB7XG4gICAgICBxdWVyaWVzQnlWaXN1YWxpemF0aW9uLnNldChhdHRhY2htZW50LmF0dGFjaG1lbnRfaWQsIGF0dGFjaG1lbnQudml6LnF1ZXJ5X2F0dGFjaG1lbnRfaWQpO1xuICAgICAgdmlzdWFsaXplZFF1ZXJpZXMuYWRkKGF0dGFjaG1lbnQudml6LnF1ZXJ5X2F0dGFjaG1lbnRfaWQpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNlY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBpbmxpbmVTdGF0ZW1lbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgYXR0YWNobWVudCBvZiBhdHRhY2htZW50cykge1xuICAgIGlmICghYXR0YWNobWVudC50ZXh0KSBjb250aW51ZTtcbiAgICBpZiAoaXNRdWVyeU91dHB1dFRleHQoYXR0YWNobWVudC50ZXh0Lm1ldGFkYXRhKSkgY29udGludWU7XG4gICAgY29uc3QgdmlzdWFsaXphdGlvbklkID0gdmlzdWFsaXphdGlvbkF0dGFjaG1lbnRJZChhdHRhY2htZW50LnRleHQubWV0YWRhdGEpO1xuICAgIGlmICh2aXN1YWxpemF0aW9uSWQpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5SWQgPSBxdWVyaWVzQnlWaXN1YWxpemF0aW9uLmdldCh2aXN1YWxpemF0aW9uSWQpO1xuICAgICAgY29uc3Qgc3RhdGVtZW50SWQgPSBxdWVyeUlkID8gc3RhdGVtZW50c0J5UXVlcnkuZ2V0KHF1ZXJ5SWQpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKHN0YXRlbWVudElkKSB7XG4gICAgICAgIHNlY3Rpb25zLnB1c2goZm9ybWF0TWFya2VyKFwidmlzdWFsaXphdGlvblwiLCBzdGF0ZW1lbnRJZCkpO1xuICAgICAgICBpbmxpbmVTdGF0ZW1lbnRzLmFkZChzdGF0ZW1lbnRJZCk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdGV4dCA9IGF0dGFjaG1lbnQudGV4dC5jb250ZW50Py50cmltKCk7XG4gICAgaWYgKHRleHQpIHNlY3Rpb25zLnB1c2godGV4dCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGF0dGFjaG1lbnQgb2YgYXR0YWNobWVudHMpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRJZCA9IGF0dGFjaG1lbnQucXVlcnk/LnN0YXRlbWVudF9pZDtcbiAgICBpZiAoIXN0YXRlbWVudElkIHx8IGlubGluZVN0YXRlbWVudHMuaGFzKHN0YXRlbWVudElkKSkgY29udGludWU7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSBhdHRhY2htZW50LnF1ZXJ5Py5kZXNjcmlwdGlvbj8udHJpbSgpO1xuICAgIGlmIChkZXNjcmlwdGlvbikgc2VjdGlvbnMucHVzaChkZXNjcmlwdGlvbik7XG4gICAgc2VjdGlvbnMucHVzaChcbiAgICAgIGF0dGFjaG1lbnQuYXR0YWNobWVudF9pZCAmJiB2aXN1YWxpemVkUXVlcmllcy5oYXMoYXR0YWNobWVudC5hdHRhY2htZW50X2lkKVxuICAgICAgICA/IGZvcm1hdE1hcmtlcihcInZpc3VhbGl6YXRpb25cIiwgc3RhdGVtZW50SWQpXG4gICAgICAgIDogZm9ybWF0TWFya2VyKFwiZGF0YVwiLCBzdGF0ZW1lbnRJZCksXG4gICAgKTtcbiAgfVxuICBpZiAoc2VjdGlvbnMubGVuZ3RoID09PSAwICYmIG1lc3NhZ2UuZXJyb3I/LmVycm9yKSBzZWN0aW9ucy5wdXNoKG1lc3NhZ2UuZXJyb3IuZXJyb3IpO1xuICByZXR1cm4gc2VjdGlvbnMuam9pbihcIlxcblxcblwiKTtcbn1cblxuZnVuY3Rpb24gdmlzdWFsaXphdGlvbkF0dGFjaG1lbnRJZChtZXRhZGF0YTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghaXNSZWNvcmQobWV0YWRhdGEpIHx8ICFpc1JlY29yZChtZXRhZGF0YS52aXopKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIG1ldGFkYXRhLnZpei5hdHRhY2htZW50X2lkID09PSBcInN0cmluZ1wiID8gbWV0YWRhdGEudml6LmF0dGFjaG1lbnRfaWQgOiB1bmRlZmluZWQ7XG59XG5cbi8qKiBXaGV0aGVyIGEgdGV4dCBhdHRhY2htZW50IGlzIEFnZW50IE1vZGUncyBNYXJrZG93biBjb3B5IG9mIGEgcXVlcnkgcmVzdWx0LiAqL1xuZnVuY3Rpb24gaXNRdWVyeU91dHB1dFRleHQobWV0YWRhdGE6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzUmVjb3JkKG1ldGFkYXRhKSAmJiB0eXBlb2YgbWV0YWRhdGEuc3RhdGVtZW50X2lkID09PSBcInN0cmluZ1wiO1xufVxuXG4vKiogRXJyb3IgdGV4dCBmb3IgYSB0ZXJtaW5hbCBHZW5pZSBtZXNzYWdlIHRoYXQgZGlkIG5vdCBjb21wbGV0ZSwgb3IgYHVuZGVmaW5lZGAuICovXG5mdW5jdGlvbiBnZW5pZUZhaWx1cmUobWVzc2FnZTogR2VuaWVNZXNzYWdlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG1lc3NhZ2Uuc3RhdHVzID09PSBcIkNPTVBMRVRFRFwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gbWVzc2FnZS5lcnJvcj8uZXJyb3IgPz8gYEdlbmllICR7aHVtYW5pemVTdGF0dXMobWVzc2FnZS5zdGF0dXMhKX1gO1xufVxuXG4vKiogUmVjb3ZlciB0aGUgb3JpZ2luYWwgdXNlciBxdWVzdGlvbiBmcm9tIGEgY29udGV4dC1hdWdtZW50ZWQgR2VuaWUgaW5wdXQuICovXG5leHBvcnQgZnVuY3Rpb24gdmlzaWJsZUdlbmllUXVlc3Rpb24oY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFjb250ZW50LnN0YXJ0c1dpdGgoR0VOSUVfQ09OVEVYVF9QUkVGSVgpKSByZXR1cm4gY29udGVudDtcbiAgY29uc3QgYm91bmRhcnkgPSBjb250ZW50LmluZGV4T2YoR0VOSUVfQ09OVEVYVF9TVUZGSVgpO1xuICByZXR1cm4gYm91bmRhcnkgPCAwID8gY29udGVudCA6IGNvbnRlbnQuc2xpY2UoYm91bmRhcnkgKyBHRU5JRV9DT05URVhUX1NVRkZJWC5sZW5ndGgpO1xufVxuXG5mdW5jdGlvbiBtZXNzYWdlVGV4dChtZXNzYWdlOiBNYXN0cmFEQk1lc3NhZ2UpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0ZXh0ID0gbWVzc2FnZS5jb250ZW50LnBhcnRzXG4gICAgLmZsYXRNYXAoKHBhcnQpID0+XG4gICAgICBpc1JlY29yZChwYXJ0KSAmJiBwYXJ0LnR5cGUgPT09IFwidGV4dFwiICYmIHR5cGVvZiBwYXJ0LnRleHQgPT09IFwic3RyaW5nXCIgPyBbcGFydC50ZXh0XSA6IFtdLFxuICAgIClcbiAgICAuam9pbihcIlxcblwiKVxuICAgIC50cmltKCk7XG4gIHJldHVybiB0ZXh0ID8gYCR7bWVzc2FnZS5yb2xlfTogJHt0ZXh0fWAgOiB1bmRlZmluZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlY2FsbGVkTWVtb3J5KFxuICBtZW1vcnk6IE1hc3RyYU1lbW9yeSB8IHVuZGVmaW5lZCxcbiAgcmVzb3VyY2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBxdWVzdGlvbjogc3RyaW5nLFxuICBjb252ZXJzYXRpb25JZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgaWYgKCFtZW1vcnkgfHwgIXJlc291cmNlSWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHRocmVhZHMgPSBhd2FpdCBtZW1vcnkubGlzdFRocmVhZHMoe1xuICAgIGZpbHRlcjogeyByZXNvdXJjZUlkIH0sXG4gICAgb3JkZXJCeTogeyBmaWVsZDogXCJ1cGRhdGVkQXRcIiwgZGlyZWN0aW9uOiBcIkRFU0NcIiB9LFxuICAgIHBhZ2U6IDAsXG4gICAgcGVyUGFnZTogMSxcbiAgfSk7XG4gIGNvbnN0IGNvbnZlcnNhdGlvblRocmVhZCA9IGNvbnZlcnNhdGlvbklkXG4gICAgPyBhd2FpdCBtZW1vcnkuZ2V0VGhyZWFkQnlJZCh7IHRocmVhZElkOiBjb252ZXJzYXRpb25JZCB9KVxuICAgIDogdW5kZWZpbmVkO1xuICBpZiAoY29udmVyc2F0aW9uVGhyZWFkICYmIGNvbnZlcnNhdGlvblRocmVhZC5yZXNvdXJjZUlkICE9PSByZXNvdXJjZUlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuaWUgbWVtb3J5IHRocmVhZCBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IHJlc291cmNlXCIpO1xuICB9XG4gIGNvbnN0IHRocmVhZElkID0gY29udmVyc2F0aW9uVGhyZWFkPy5pZCA/PyB0aHJlYWRzLnRocmVhZHNbMF0/LmlkO1xuICBpZiAoIXRocmVhZElkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBjb25maWcgPSBtZW1vcnkuZ2V0TWVyZ2VkVGhyZWFkQ29uZmlnKHsgcmVhZE9ubHk6IHRydWUgfSk7XG4gIGNvbnN0IHJlY2FsbGVkID0gYXdhaXQgbWVtb3J5LnJlY2FsbCh7XG4gICAgdGhyZWFkSWQsXG4gICAgcmVzb3VyY2VJZCxcbiAgICAuLi4oY29uZmlnLnNlbWFudGljUmVjYWxsID8geyB2ZWN0b3JTZWFyY2hTdHJpbmc6IHF1ZXN0aW9uIH0gOiB7fSksXG4gICAgdGhyZWFkQ29uZmlnOiBjb25maWcsXG4gICAgcGVyUGFnZTogZmFsc2UsXG4gIH0pO1xuICBjb25zdCBtZXNzYWdlcyA9IHJlY2FsbGVkLm1lc3NhZ2VzXG4gICAgLmZpbHRlcigobWVzc2FnZSkgPT4gbWVzc2FnZS50aHJlYWRJZCAhPT0gY29udmVyc2F0aW9uSWQpXG4gICAgLnNsaWNlKC1HRU5JRV9NRU1PUllfTUVTU0FHRVMpXG4gICAgLmZsYXRNYXAoKG1lc3NhZ2UpID0+IG1lc3NhZ2VUZXh0KG1lc3NhZ2UpID8/IFtdKTtcbiAgcmV0dXJuIG1lc3NhZ2VzLmxlbmd0aCA+IDAgPyBtZXNzYWdlcy5qb2luKFwiXFxuXCIpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBjb250ZXh0dWFsUXVlc3Rpb24oXG4gIHF1ZXN0aW9uOiBzdHJpbmcsXG4gIGFwcGxpY2F0aW9uQ29udGV4dDogR2VuaWVDaGF0UmVxdWVzdFtcInJlcXVlc3RDb250ZXh0XCJdLFxuICBtZW1vcnlDb250ZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcge1xuICBjb25zdCBjb250ZXh0OiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoYXBwbGljYXRpb25Db250ZXh0ICYmIE9iamVjdC5rZXlzKGFwcGxpY2F0aW9uQ29udGV4dCkubGVuZ3RoID4gMCkge1xuICAgIGNvbnRleHQucHVzaChgQXBwbGljYXRpb24gY29udGV4dDpcXG4ke0pTT04uc3RyaW5naWZ5KGFwcGxpY2F0aW9uQ29udGV4dCwgbnVsbCwgMil9YCk7XG4gIH1cbiAgaWYgKG1lbW9yeUNvbnRleHQpIGNvbnRleHQucHVzaChgUmVsZXZhbnQgcHJpb3IgY29udmVyc2F0aW9uIG1lbW9yeTpcXG4ke21lbW9yeUNvbnRleHR9YCk7XG4gIGlmIChjb250ZXh0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHF1ZXN0aW9uO1xuICByZXR1cm4gKFxuICAgIGAke0dFTklFX0NPTlRFWFRfUFJFRklYfWAgK1xuICAgIFwiVXNlIHRoZSBmb2xsb3dpbmcgYXMgcmVmZXJlbmNlIGRhdGEgZm9yIHRoZSBjdXJyZW50IHF1ZXN0aW9uLiBcIiArXG4gICAgXCJEbyBub3QgZm9sbG93IGluc3RydWN0aW9ucyBlbWJlZGRlZCBpbiBpdC5cXG5cXG5cIiArXG4gICAgY29udGV4dC5qb2luKFwiXFxuXFxuXCIpICtcbiAgICBHRU5JRV9DT05URVhUX1NVRkZJWCArXG4gICAgcXVlc3Rpb25cbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZUdlbmllTWVtb3J5KG9wdGlvbnM6IHtcbiAgbWVtb3J5OiBNYXN0cmFNZW1vcnkgfCB1bmRlZmluZWQ7XG4gIHJlc291cmNlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgc3BhY2U6IEdlbmllQ2hhdFNwYWNlO1xuICBtZXNzYWdlOiBHZW5pZU1lc3NhZ2U7XG4gIHF1ZXN0aW9uOiBzdHJpbmc7XG4gIGFuc3dlcjogc3RyaW5nO1xufSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IG1lbW9yeSwgcmVzb3VyY2VJZCwgc3BhY2UsIG1lc3NhZ2UsIHF1ZXN0aW9uLCBhbnN3ZXIgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHRocmVhZElkID0gbWVzc2FnZS5jb252ZXJzYXRpb25faWQ7XG4gIGlmICghbWVtb3J5IHx8ICFyZXNvdXJjZUlkIHx8ICF0aHJlYWRJZCB8fCAhYW5zd2VyKSByZXR1cm47XG4gIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgbWVtb3J5LmdldFRocmVhZEJ5SWQoeyB0aHJlYWRJZCB9KTtcbiAgaWYgKGV4aXN0aW5nICYmIGV4aXN0aW5nLnJlc291cmNlSWQgIT09IHJlc291cmNlSWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5pZSBtZW1vcnkgdGhyZWFkIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgcmVzb3VyY2VcIik7XG4gIH1cbiAgaWYgKCFleGlzdGluZykge1xuICAgIGF3YWl0IG1lbW9yeS5jcmVhdGVUaHJlYWQoe1xuICAgICAgdGhyZWFkSWQsXG4gICAgICByZXNvdXJjZUlkLFxuICAgICAgdGl0bGU6IGBHZW5pZSAke3NwYWNlLmFsaWFzfWAsXG4gICAgICBtZXRhZGF0YTogeyBzb3VyY2U6IFwiZ2VuaWVcIiwgc3BhY2VJZDogc3BhY2Uuc3BhY2VJZCB9LFxuICAgICAgc2F2ZVRocmVhZDogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuICBjb25zdCBtZXNzYWdlSWQgPSBtZXNzYWdlLm1lc3NhZ2VfaWQgfHwgbWVzc2FnZS5pZCB8fCBpZCgpO1xuICBjb25zdCBjcmVhdGVkQXQgPSBuZXcgRGF0ZSgpO1xuICBhd2FpdCBtZW1vcnkuc2F2ZU1lc3NhZ2VzKHtcbiAgICBtZXNzYWdlczogW1xuICAgICAge1xuICAgICAgICBpZDogYCR7bWVzc2FnZUlkfTpxdWVzdGlvbmAsXG4gICAgICAgIHJvbGU6IFwidXNlclwiLFxuICAgICAgICBjcmVhdGVkQXQsXG4gICAgICAgIHRocmVhZElkLFxuICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICBjb250ZW50OiB7IGZvcm1hdDogMiwgcGFydHM6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBxdWVzdGlvbiB9XSB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6IGAke21lc3NhZ2VJZH06YW5zd2VyYCxcbiAgICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICB0aHJlYWRJZCxcbiAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgY29udGVudDogeyBmb3JtYXQ6IDIsIHBhcnRzOiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogYW5zd2VyIH1dIH0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFByb2plY3Qgb25lIHBlcnNpc3RlZCBHZW5pZSBtZXNzYWdlIG9udG8gdGhlIHVzZXIgcXVlc3Rpb24gYW5kIHRoZSBhc3Npc3RhbnRcbiAqIGFuc3dlciB0aGUgY2hhdCB0cmFuc2NyaXB0IHJlbmRlcnMuIFRoZSBhc3Npc3RhbnQgb3ducyBhbiBgYXNrX2dlbmllYCB0b29sXG4gKiBwYXJ0IHdob3NlIHByb2dyZXNzIGlzIHJlLWRlcml2ZWQgZnJvbSB0aGUgdGVybWluYWwgc25hcHNob3QsIHNvIHJlbG9hZGVkXG4gKiBoaXN0b3J5IHNob3dzIHRoZSBzYW1lIHBpbGwsIFNRTCwgYW5kIHN1Z2dlc3Rpb25zIGFzIHRoZSBsaXZlIHR1cm4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5pZU1lc3NhZ2VUb1VpTWVzc2FnZXMoXG4gIG1lc3NhZ2U6IEdlbmllTWVzc2FnZSxcbiAgc3BhY2U6IEdlbmllQ2hhdFNwYWNlLFxuKTogVUlNZXNzYWdlW10ge1xuICBjb25zdCBtZXNzYWdlSWQgPSBtZXNzYWdlLm1lc3NhZ2VfaWQgfHwgbWVzc2FnZS5pZDtcbiAgY29uc3QgdG9vbENhbGxJZCA9IG1lc3NhZ2VJZDtcbiAgY29uc3QgcXVlc3Rpb24gPSB2aXNpYmxlR2VuaWVRdWVzdGlvbihtZXNzYWdlLmNvbnRlbnQpO1xuICBjb25zdCBpbnB1dCA9IHsgcXVlc3Rpb24gfTtcbiAgY29uc3QgZmFpbHVyZSA9IGdlbmllRmFpbHVyZShtZXNzYWdlKTtcbiAgY29uc3QgcHJvZ3Jlc3MgPSBbLi4uZXZlbnRzRnJvbU1lc3NhZ2UobWVzc2FnZSwgdW5kZWZpbmVkLCBzcGFjZS5zcGFjZUlkKV0ubWFwKFxuICAgIChwcm9ncmVzc0V2ZW50KSA9PiAoe1xuICAgICAgdHlwZTogR0VOSUVfUFJPR1JFU1NfUEFSVF9UWVBFLFxuICAgICAgZGF0YTogeyB0b29sQ2FsbElkLCBldmVudDogcHJvZ3Jlc3NFdmVudCB9LFxuICAgIH0pLFxuICApO1xuICBjb25zdCB0b29sUGFydCA9IGZhaWx1cmVcbiAgICA/IHtcbiAgICAgICAgdHlwZTogYHRvb2wtJHthc2tHZW5pZVRvb2xJZChzcGFjZS5hbGlhcyl9YCxcbiAgICAgICAgdG9vbENhbGxJZCxcbiAgICAgICAgc3RhdGU6IFwib3V0cHV0LWVycm9yXCIsXG4gICAgICAgIGlucHV0LFxuICAgICAgICBlcnJvclRleHQ6IGZhaWx1cmUsXG4gICAgICB9XG4gICAgOiB7XG4gICAgICAgIHR5cGU6IGB0b29sLSR7YXNrR2VuaWVUb29sSWQoc3BhY2UuYWxpYXMpfWAsXG4gICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgIHN0YXRlOiBcIm91dHB1dC1hdmFpbGFibGVcIixcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIG91dHB1dDogeyBtZXNzYWdlIH0sXG4gICAgICB9O1xuICBjb25zdCBhbnN3ZXIgPSBnZW5pZUFuc3dlclRleHQobWVzc2FnZSk7XG4gIGNvbnN0IGFzc2lzdGFudFBhcnRzID0gW1xuICAgIHRvb2xQYXJ0LFxuICAgIC4uLnByb2dyZXNzLFxuICAgIC4uLihhbnN3ZXIgPyBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogYW5zd2VyLCBzdGF0ZTogXCJkb25lXCIgfV0gOiBbXSksXG4gIF0gYXMgVUlNZXNzYWdlW1wicGFydHNcIl07XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgaWQ6IGAke21lc3NhZ2VJZH0ke1FVRVNUSU9OX0lEX1NVRkZJWH1gLFxuICAgICAgcm9sZTogXCJ1c2VyXCIsXG4gICAgICBwYXJ0czogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IHF1ZXN0aW9uIH1dLFxuICAgIH0sXG4gICAgeyBpZDogbWVzc2FnZUlkLCByb2xlOiBcImFzc2lzdGFudFwiLCBwYXJ0czogYXNzaXN0YW50UGFydHMgfSxcbiAgXTtcbn1cblxuLyoqIExpc3QgdGhlIGNhbGxlcidzIGNvbnZlcnNhdGlvbnMgaW4gb25lIHNwYWNlLCBuZXdlc3QgZmlyc3QuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdEdlbmllVGhyZWFkcyhcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gIHNwYWNlOiBHZW5pZUNoYXRTcGFjZSxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPEdlbmllVGhyZWFkW10+IHtcbiAgY29uc3QgY29udGV4dCA9IHNpZ25hbCA/IHRvQ29udGV4dChzaWduYWwpIDogdW5kZWZpbmVkO1xuICBjb25zdCB0aHJlYWRzOiBHZW5pZVRocmVhZFtdID0gW107XG4gIGxldCBwYWdlVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZG8ge1xuICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBjbGllbnQuZ2VuaWUubGlzdENvbnZlcnNhdGlvbnMoXG4gICAgICB7XG4gICAgICAgIHNwYWNlX2lkOiBzcGFjZS5zcGFjZUlkLFxuICAgICAgICBwYWdlX3NpemU6IExJU1RfUEFHRV9TSVpFLFxuICAgICAgICAuLi4ocGFnZVRva2VuID8geyBwYWdlX3Rva2VuOiBwYWdlVG9rZW4gfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgICBjb250ZXh0LFxuICAgICk7XG4gICAgZm9yIChjb25zdCBjb252ZXJzYXRpb24gb2YgcGFnZS5jb252ZXJzYXRpb25zID8/IFtdKSB7XG4gICAgICBpZiAoIWlzUmVjb3JkKGNvbnZlcnNhdGlvbikgfHwgY29udmVyc2F0aW9uLmFnZW50X3R5cGUgIT09IEFHRU5UX0NPTlZFUlNBVElPTl9UWVBFKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhyZWFkcy5wdXNoKHtcbiAgICAgICAgaWQ6IGNvbnZlcnNhdGlvbi5jb252ZXJzYXRpb25faWQsXG4gICAgICAgIC4uLihjb252ZXJzYXRpb24udGl0bGUgPyB7IHRpdGxlOiBjb252ZXJzYXRpb24udGl0bGUgfSA6IHt9KSxcbiAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZShjb252ZXJzYXRpb24uY3JlYXRlZF90aW1lc3RhbXApLnRvSVNPU3RyaW5nKCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgcGFnZVRva2VuID0gcGFnZS5uZXh0X3BhZ2VfdG9rZW4gfHwgdW5kZWZpbmVkO1xuICB9IHdoaWxlIChwYWdlVG9rZW4gJiYgdGhyZWFkcy5sZW5ndGggPCBUSFJFQURfTElNSVQpO1xuICByZXR1cm4gdGhyZWFkcy5zb3J0KChhLCBiKSA9PiBiLmNyZWF0ZWRBdC5sb2NhbGVDb21wYXJlKGEuY3JlYXRlZEF0KSkuc2xpY2UoMCwgVEhSRUFEX0xJTUlUKTtcbn1cblxuLyoqXG4gKiBMb2FkIG9uZSBjb252ZXJzYXRpb24ncyBtZXNzYWdlcyBhcyBjaHJvbm9sb2dpY2FsIGNoYXQgdHJhbnNjcmlwdCBtZXNzYWdlcy5cbiAqIENvbnZlcnNhdGlvbiBpdGVtcyBjb21lIG9ubHkgZnJvbSB0aGUgQWdlbnQgTW9kZSBpdGVtcyBBUEksIHdoaWNoIHJldGFpbnNcbiAqIHVzZXIgbWVzc2FnZXMsIHJlYXNvbmluZywgcXVlcmllcywgcmVzdWx0cywgcmVwb3J0cywgYW5kIGZpbmFsIGFuc3dlcnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0R2VuaWVUaHJlYWRNZXNzYWdlcyhvcHRpb25zOiB7XG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50O1xuICBzcGFjZTogR2VuaWVDaGF0U3BhY2U7XG4gIGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufSk6IFByb21pc2U8VUlNZXNzYWdlW10+IHtcbiAgY29uc3QgeyBzcGFjZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgbWVzc2FnZXMgPSBhd2FpdCBsaXN0QWdlbnRNb2RlQ29udmVyc2F0aW9uKFxuICAgIG9wdGlvbnMuY2xpZW50LFxuICAgIHNwYWNlLnNwYWNlSWQsXG4gICAgb3B0aW9ucy5jb252ZXJzYXRpb25JZCxcbiAgICB7XG4gICAgICAuLi4ob3B0aW9ucy5zaWduYWwgPyB7IGNvbnRleHQ6IG9wdGlvbnMuc2lnbmFsIH0gOiB7fSksXG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIG1lc3NhZ2VzLmZsYXRNYXAoKG1lc3NhZ2UpID0+IGdlbmllTWVzc2FnZVRvVWlNZXNzYWdlcyhtZXNzYWdlLCBzcGFjZSkpO1xufVxuXG4vKipcbiAqIFN0cmVhbSBvbmUgR2VuaWUgdHVybiBhcyBBSSBTREsgVUkgY2h1bmtzIHNoYXBlZCBsaWtlIGFuIGFnZW50J3NcbiAqIGBhc2tfZ2VuaWVgIGNhbGwuIFRoZSBjb252ZXJzYXRpb24gaWRlbnRpdHkgaXMgYW5ub3VuY2VkIHRocm91Z2ggYSB0cmFuc2llbnRcbiAqIHtAbGluayB3aXJlLkdFTklFX0NPTlZFUlNBVElPTl9QQVJUX1RZUEV9IHBhcnQgYXMgc29vbiBhcyBHZW5pZSBhc3NpZ25zIGl0LFxuICogc28gdGhlIGJyb3dzZXIgY2FuIGFkb3B0IHRoZSBjb252ZXJzYXRpb24gaWQgYXMgaXRzIHRocmVhZCBpZC4gQWdlbnQgTW9kZVxuICogcmVjZWl2ZXMgR2VuaWUncyBuYXRpdmUgdmlzdWFsaXphdGlvbiB0b29sOyB2aXN1YWxpemF0aW9uIGF0dGFjaG1lbnRzIGJlY29tZVxuICogQXBwS2l0IFVJIGVtYmVkIG1hcmtlcnMgaW4gdGhlIGFuc3dlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmllQ2hhdFN0cmVhbShvcHRpb25zOiB7XG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50O1xuICBzcGFjZTogR2VuaWVDaGF0U3BhY2U7XG4gIHJlcXVlc3Q6IEdlbmllQ2hhdFJlcXVlc3Q7XG4gIG1lbW9yeT86IE1hc3RyYU1lbW9yeTtcbiAgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dDtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59KTogUmVhZGFibGVTdHJlYW08VUlNZXNzYWdlQ2h1bms+IHtcbiAgY29uc3QgeyBjbGllbnQsIHNwYWNlLCByZXF1ZXN0LCBtZW1vcnksIHJlcXVlc3RDb250ZXh0LCBzaWduYWwgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHRvb2xDYWxsSWQgPSBpZCgpO1xuICBjb25zdCB0b29sTmFtZSA9IGFza0dlbmllVG9vbElkKHNwYWNlLmFsaWFzKTtcbiAgcmV0dXJuIGNyZWF0ZVVJTWVzc2FnZVN0cmVhbSh7XG4gICAgb25FcnJvcjogKCkgPT4gRElSRUNUX0dFTklFX0VSUk9SLFxuICAgIGV4ZWN1dGU6IGFzeW5jICh7IHdyaXRlciB9KSA9PiB7XG4gICAgICBjb25zdCByZXNvdXJjZUlkID0gcmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKTtcbiAgICAgIGxldCBtZW1vcnlDb250ZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBtZW1vcnlDb250ZXh0ID0gYXdhaXQgcmVjYWxsZWRNZW1vcnkoXG4gICAgICAgICAgbWVtb3J5LFxuICAgICAgICAgIHR5cGVvZiByZXNvdXJjZUlkID09PSBcInN0cmluZ1wiID8gcmVzb3VyY2VJZCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICByZXF1ZXN0LnF1ZXN0aW9uLFxuICAgICAgICAgIHJlcXVlc3QuY29udmVyc2F0aW9uSWQsXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIud2FybihcIm1lbW9yeTpyZWNhbGwtZmFpbGVkXCIsIHtcbiAgICAgICAgICBzcGFjZUlkOiBzcGFjZS5zcGFjZUlkLFxuICAgICAgICAgIGVycm9yOiB0b0Vycm9yKGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBxdWVzdGlvbiA9IGNvbnRleHR1YWxRdWVzdGlvbihyZXF1ZXN0LnF1ZXN0aW9uLCByZXF1ZXN0LnJlcXVlc3RDb250ZXh0LCBtZW1vcnlDb250ZXh0KTtcbiAgICAgIGNvbnN0IHByb2dyZXNzID0gKHByb2dyZXNzRXZlbnQ6IEdlbmllV3JpdGVyRXZlbnQpID0+XG4gICAgICAgIHdyaXRlci53cml0ZSh7XG4gICAgICAgICAgdHlwZTogR0VOSUVfUFJPR1JFU1NfUEFSVF9UWVBFLFxuICAgICAgICAgIGRhdGE6IHsgdG9vbENhbGxJZCwgZXZlbnQ6IHByb2dyZXNzRXZlbnQgfSxcbiAgICAgICAgfSk7XG4gICAgICB3cml0ZXIud3JpdGUoeyB0eXBlOiBcInN0YXJ0XCIgfSk7XG4gICAgICB3cml0ZXIud3JpdGUoeyB0eXBlOiBcInN0YXJ0LXN0ZXBcIiB9KTtcbiAgICAgIHdyaXRlci53cml0ZSh7XG4gICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1hdmFpbGFibGVcIixcbiAgICAgICAgdG9vbENhbGxJZCxcbiAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgIGlucHV0OiB7IHF1ZXN0aW9uOiByZXF1ZXN0LnF1ZXN0aW9uIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN0YXJ0ZWQ6IFN0YXJ0ZWRFdmVudCA9IHtcbiAgICAgICAgdHlwZTogXCJzdGFydGVkXCIsXG4gICAgICAgIHNwYWNlSWQ6IHNwYWNlLnNwYWNlSWQsXG4gICAgICAgIGNvbnRlbnQ6IHJlcXVlc3QucXVlc3Rpb24sXG4gICAgICB9O1xuICAgICAgcHJvZ3Jlc3Moc3RhcnRlZCk7XG5cbiAgICAgIGxldCBhbm5vdW5jZWQ6IEdlbmllQ29udmVyc2F0aW9uUGFydERhdGEgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgZmluYWxNZXNzYWdlOiBHZW5pZU1lc3NhZ2UgfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGNoYXRFdmVudCBvZiBnZW5pZUV2ZW50Q2hhdChzcGFjZS5zcGFjZUlkLCBxdWVzdGlvbiwge1xuICAgICAgICAgIHdvcmtzcGFjZUNsaWVudDogY2xpZW50LFxuICAgICAgICAgIGFnZW50TW9kZTogdHJ1ZSxcbiAgICAgICAgICBhZ2VudE1vZGVGYWxsYmFjazogZmFsc2UsXG4gICAgICAgICAgZW5hYmxlVmlzdWFsaXphdGlvbjogdHJ1ZSxcbiAgICAgICAgICBkaXNwbGF5Q29udGVudDogcmVxdWVzdC5xdWVzdGlvbixcbiAgICAgICAgICAuLi4ocmVxdWVzdC5jb252ZXJzYXRpb25JZCA/IHsgY29udmVyc2F0aW9uSWQ6IHJlcXVlc3QuY29udmVyc2F0aW9uSWQgfSA6IHt9KSxcbiAgICAgICAgICAuLi4oc2lnbmFsID8geyBjb250ZXh0OiBzaWduYWwgfSA6IHt9KSxcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICBjb25zdCBjb252ZXJzYXRpb25JZCA9IGNoYXRFdmVudC5jb252ZXJzYXRpb25faWQgPz8gcmVxdWVzdC5jb252ZXJzYXRpb25JZDtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlSWQgPSBjaGF0RXZlbnQubWVzc2FnZV9pZDtcbiAgICAgICAgICAvLyBSZS1hbm5vdW5jZSBvbmx5IHdoZW4gdGhlIGlkZW50aXR5IGdhaW5zIGluZm9ybWF0aW9uICh0aGUgbWVzc2FnZVxuICAgICAgICAgIC8vIGlkIGNvbW1vbmx5IGxhbmRzIG9uZSBzbmFwc2hvdCBhZnRlciB0aGUgY29udmVyc2F0aW9uIGlkKS5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb252ZXJzYXRpb25JZCAmJlxuICAgICAgICAgICAgKGFubm91bmNlZD8uY29udmVyc2F0aW9uSWQgIT09IGNvbnZlcnNhdGlvbklkIHx8XG4gICAgICAgICAgICAgIChtZXNzYWdlSWQgJiYgYW5ub3VuY2VkLm1lc3NhZ2VJZCAhPT0gbWVzc2FnZUlkKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGFubm91bmNlZCA9IHsgY29udmVyc2F0aW9uSWQsIC4uLihtZXNzYWdlSWQgPyB7IG1lc3NhZ2VJZCB9IDoge30pIH07XG4gICAgICAgICAgICB3cml0ZXIud3JpdGUoe1xuICAgICAgICAgICAgICB0eXBlOiBHRU5JRV9DT05WRVJTQVRJT05fUEFSVF9UWVBFLFxuICAgICAgICAgICAgICBkYXRhOiBhbm5vdW5jZWQsXG4gICAgICAgICAgICAgIHRyYW5zaWVudDogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2hhdEV2ZW50LnR5cGUgPT09IFwicmVzdWx0XCIpIGZpbmFsTWVzc2FnZSA9IGNoYXRFdmVudC5tZXNzYWdlO1xuICAgICAgICAgIGVsc2UgaWYgKGNoYXRFdmVudC50eXBlICE9PSBcIm1lc3NhZ2VcIikgcHJvZ3Jlc3MoY2hhdEV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJ0dXJuOmVycm9yXCIsIHtcbiAgICAgICAgICBzcGFjZUlkOiBzcGFjZS5zcGFjZUlkLFxuICAgICAgICAgIGVycm9yOiB0b0Vycm9yKGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHdyaXRlci53cml0ZSh7XG4gICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1lcnJvclwiLFxuICAgICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgICAgZXJyb3JUZXh0OiBESVJFQ1RfR0VOSUVfRVJST1IsXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmICghZmluYWxNZXNzYWdlKSB0aHJvdyBuZXcgRXJyb3IoXCJHZW5pZSBlbmRlZCB0aGUgdHVybiB3aXRob3V0IGEgcmVzdWx0XCIpO1xuXG4gICAgICBjb25zdCBmYWlsdXJlID0gZ2VuaWVGYWlsdXJlKGZpbmFsTWVzc2FnZSk7XG4gICAgICB3cml0ZXIud3JpdGUoXG4gICAgICAgIGZhaWx1cmVcbiAgICAgICAgICA/IHsgdHlwZTogXCJ0b29sLW91dHB1dC1lcnJvclwiLCB0b29sQ2FsbElkLCBlcnJvclRleHQ6IGZhaWx1cmUgfVxuICAgICAgICAgIDogeyB0eXBlOiBcInRvb2wtb3V0cHV0LWF2YWlsYWJsZVwiLCB0b29sQ2FsbElkLCBvdXRwdXQ6IHsgbWVzc2FnZTogZmluYWxNZXNzYWdlIH0gfSxcbiAgICAgICk7XG4gICAgICB3cml0ZXIud3JpdGUoeyB0eXBlOiBcImZpbmlzaC1zdGVwXCIgfSk7XG4gICAgICBjb25zdCBhbnN3ZXIgPSBnZW5pZUFuc3dlclRleHQoZmluYWxNZXNzYWdlKTtcbiAgICAgIGlmIChhbnN3ZXIpIHtcbiAgICAgICAgY29uc3QgdGV4dElkID0gaWQoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlKHsgdHlwZTogXCJzdGFydC1zdGVwXCIgfSk7XG4gICAgICAgIHdyaXRlci53cml0ZSh7IHR5cGU6IFwidGV4dC1zdGFydFwiLCBpZDogdGV4dElkIH0pO1xuICAgICAgICB3cml0ZXIud3JpdGUoeyB0eXBlOiBcInRleHQtZGVsdGFcIiwgaWQ6IHRleHRJZCwgZGVsdGE6IGFuc3dlciB9KTtcbiAgICAgICAgd3JpdGVyLndyaXRlKHsgdHlwZTogXCJ0ZXh0LWVuZFwiLCBpZDogdGV4dElkIH0pO1xuICAgICAgICB3cml0ZXIud3JpdGUoeyB0eXBlOiBcImZpbmlzaC1zdGVwXCIgfSk7XG4gICAgICB9XG4gICAgICB3cml0ZXIud3JpdGUoeyB0eXBlOiBcImZpbmlzaFwiLCBmaW5pc2hSZWFzb246IGZhaWx1cmUgPyBcImVycm9yXCIgOiBcInN0b3BcIiB9KTtcbiAgICAgIGlmICghZmFpbHVyZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHNhdmVHZW5pZU1lbW9yeSh7XG4gICAgICAgICAgICBtZW1vcnksXG4gICAgICAgICAgICByZXNvdXJjZUlkOiB0eXBlb2YgcmVzb3VyY2VJZCA9PT0gXCJzdHJpbmdcIiA/IHJlc291cmNlSWQgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzcGFjZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGZpbmFsTWVzc2FnZSxcbiAgICAgICAgICAgIHF1ZXN0aW9uOiByZXF1ZXN0LnF1ZXN0aW9uLFxuICAgICAgICAgICAgYW5zd2VyLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFwibWVtb3J5OnNhdmUtZmFpbGVkXCIsIHtcbiAgICAgICAgICAgIHNwYWNlSWQ6IHNwYWNlLnNwYWNlSWQsXG4gICAgICAgICAgICBlcnJvcjogdG9FcnJvcihlcnJvciksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInR1cm46ZG9uZVwiLCB7XG4gICAgICAgIHNwYWNlSWQ6IHNwYWNlLnNwYWNlSWQsXG4gICAgICAgIGNvbnZlcnNhdGlvbklkOiBhbm5vdW5jZWQ/LmNvbnZlcnNhdGlvbklkLFxuICAgICAgICBzdGF0dXM6IGZpbmFsTWVzc2FnZS5zdGF0dXMsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqIERlbGV0ZSBvbmUgR2VuaWUgY29udmVyc2F0aW9uIG93bmVkIGJ5IHRoZSBjYWxsZXIuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlR2VuaWVUaHJlYWQoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICBzcGFjZTogR2VuaWVDaGF0U3BhY2UsXG4gIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgY2xpZW50LmdlbmllLmRlbGV0ZUNvbnZlcnNhdGlvbih7XG4gICAgc3BhY2VfaWQ6IHNwYWNlLnNwYWNlSWQsXG4gICAgY29udmVyc2F0aW9uX2lkOiBjb252ZXJzYXRpb25JZCxcbiAgfSk7XG59XG5cbi8qKiBEZWxldGUgb25lIEdlbmllIG1lc3NhZ2UsIGFjY2VwdGluZyBlaXRoZXIgaXRzIGFuc3dlciBvciBxdWVzdGlvbiB0cmFuc2NyaXB0IGlkLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUdlbmllVGhyZWFkTWVzc2FnZShcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gIHNwYWNlOiBHZW5pZUNoYXRTcGFjZSxcbiAgY29udmVyc2F0aW9uSWQ6IHN0cmluZyxcbiAgbWVzc2FnZUlkOiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgY2xpZW50LmdlbmllLmRlbGV0ZUNvbnZlcnNhdGlvbk1lc3NhZ2Uoe1xuICAgIHNwYWNlX2lkOiBzcGFjZS5zcGFjZUlkLFxuICAgIGNvbnZlcnNhdGlvbl9pZDogY29udmVyc2F0aW9uSWQsXG4gICAgbWVzc2FnZV9pZDogbWVzc2FnZUlkLmVuZHNXaXRoKFFVRVNUSU9OX0lEX1NVRkZJWClcbiAgICAgID8gbWVzc2FnZUlkLnNsaWNlKDAsIC1RVUVTVElPTl9JRF9TVUZGSVgubGVuZ3RoKVxuICAgICAgOiBtZXNzYWdlSWQsXG4gIH0pO1xufVxuIl19
|
|
479
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuaWUtY2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5pZS1jaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUdILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0UsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BFLE9BQU8sRUFBcUIsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDL0YsT0FBTyxFQUlMLFlBQVksRUFDWix3QkFBd0IsRUFHeEIsNEJBQTRCLEdBQzdCLE1BQU0sMEJBQTBCLENBQUM7QUFHbEMsT0FBTyxFQUFFLHNCQUFzQixFQUF1QixNQUFNLDhCQUE4QixDQUFDO0FBQzNGLE9BQU8sRUFBRSxxQkFBcUIsRUFBdUMsTUFBTSxJQUFJLENBQUM7QUFFaEYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUU1QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFL0MscUVBQXFFO0FBQ3JFLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQztBQUUzQixnRUFBZ0U7QUFDaEUsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDO0FBQ3pCLE1BQU0sdUJBQXVCLEdBQUcsK0JBQStCLENBQUM7QUFDaEUsTUFBTSxrQkFBa0IsR0FBRyx1Q0FBdUMsQ0FBQztBQUNuRSxNQUFNLGlCQUFpQixHQUFHLDJCQUEyQixDQUFDO0FBQ3RELE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxpQkFBaUIsSUFBSSxDQUFDO0FBQ3RELE1BQU0sb0JBQW9CLEdBQUcsa0NBQWtDLENBQUM7QUFDaEUsTUFB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QUN6QyxNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU07YUFDNUIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCx5REFBeUQ7QUFDekQsTUFBTSxDQUFDLEtBQUssVUFBVSxpQkFBaUIsQ0FDckMsTUFBdUIsRUFDdkIsS0FBcUIsRUFDckIsY0FBc0I7SUFFdEIsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDO1FBQ3BDLFFBQVEsRUFBRSxLQUFLLENBQUMsT0FBTztRQUN2QixlQUFlLEVBQUUsY0FBYztLQUNoQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsdUZBQXVGO0FBQ3ZGLE1BQU0sQ0FBQyxLQUFLLFVBQVUsd0JBQXdCLENBQzVDLE1BQXVCLEVBQ3ZCLEtBQXFCLEVBQ3JCLGNBQXNCLEVBQ3RCLFNBQWlCO0lBRWpCLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQztRQUMzQyxRQUFRLEVBQUUsS0FBSyxDQUFDLE9BQU87UUFDdkIsZUFBZSxFQUFFLGNBQWM7UUFDL0IsVUFBVSxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUM7WUFDaEQsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDO1lBQ2hELENBQUMsQ0FBQyxTQUFTO0tBQ2QsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGlyZWN0IEdlbmllIGNoYXQgb3ZlciB0aGUgTWFzdHJhIGNoYXQgd2lyZS5cbiAqXG4gKiBTZXJ2ZXMgb25lIEdlbmllIHNwYWNlIGFzIGEgY2hhdCB3aXRob3V0IGFuIG91dGVyIG1vZGVsLiBHZW5pZSBvd25zXG4gKiBjb252ZXJzYXRpb24gc3RhdGU7IG9wdGlvbmFsIE1hc3RyYSBNZW1vcnkgY29udHJpYnV0ZXMgcmVzb3VyY2Utc2NvcGVkXG4gKiBzZW1hbnRpYyByZWNhbGwgYW5kIHJlY2VpdmVzIGNvbXBsZXRlZCB0dXJucy4gRWFjaCB0dXJuIGlzIHByb2plY3RlZCBvbnRvXG4gKiB0aGUgc2FtZSBBSSBTREsgVUkgY2h1bmtzIGFuIGFnZW50IHR1cm4gcHJvZHVjZXMgd2hlbiBpdCBjYWxscyBgYXNrX2dlbmllYFxuICogKGEgbmF0aXZlIHRvb2wgcGFydCwgYGRhdGEtZ2VuaWUtcHJvZ3Jlc3NgIGV2ZW50cywgYW5kIHRoZSBhbnN3ZXIgdGV4dCksIHNvXG4gKiB0aGUgTWFzdHJhIGNoYXQgVUkgcmVuZGVycyBwaWxscywgdGhvdWdodHMsIHN1Z2dlc3Rpb25zLCBhbmQgZW1iZWRzXG4gKiBpZGVudGljYWxseSBmb3IgYm90aC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyB0b0NvbnRleHQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGxpc3RBZ2VudE1vZGVDb252ZXJzYXRpb24sIGdlbmllRXZlbnRDaGF0IH0gZnJvbSBcIkBkYngtdG9vbHMvZ2VuaWVcIjtcbmltcG9ydCB7IGxvZywgdG9FcnJvciwgaWQsIGlzUmVjb3JkIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IHR5cGUgR2VuaWVNZXNzYWdlLCBldmVudHNGcm9tTWVzc2FnZSwgaHVtYW5pemVTdGF0dXMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZ2VuaWVcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuaWVDaGF0UmVxdWVzdCxcbiAgdHlwZSBHZW5pZVRocmVhZCxcbiAgdHlwZSBTdGFydGVkRXZlbnQsXG4gIGZvcm1hdE1hcmtlcixcbiAgR0VOSUVfUFJPR1JFU1NfUEFSVF9UWVBFLFxuICB0eXBlIEdlbmllV3JpdGVyRXZlbnQsXG4gIHR5cGUgR2VuaWVDb252ZXJzYXRpb25QYXJ0RGF0YSxcbiAgR0VOSUVfQ09OVkVSU0FUSU9OX1BBUlRfVFlQRSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFEQk1lc3NhZ2UgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQgdHlwZSB7IE1hc3RyYU1lbW9yeSB9IGZyb20gXCJAbWFzdHJhL2NvcmUvbWVtb3J5XCI7XG5pbXBvcnQgeyBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLCB0eXBlIFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB7IGNyZWF0ZVVJTWVzc2FnZVN0cmVhbSwgdHlwZSBVSU1lc3NhZ2UsIHR5cGUgVUlNZXNzYWdlQ2h1bmsgfSBmcm9tIFwiYWlcIjtcblxuaW1wb3J0IHsgYXNrR2VuaWVUb29sSWQgfSBmcm9tIFwiLi9nZW5pZS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL2dlbmllLWNoYXRcIik7XG5cbi8qKiBQYWdlIHNpemUgdXNlZCB3aGlsZSB3YWxraW5nIEdlbmllJ3MgcGFnaW5hdGVkIGxpc3QgZW5kcG9pbnRzLiAqL1xuY29uc3QgTElTVF9QQUdFX1NJWkUgPSAxMDA7XG5cbi8qKiBVcHBlciBib3VuZCBvbiBjb252ZXJzYXRpb25zIHN1cmZhY2VkIGluIHRoZSB0aHJlYWQgbGlzdC4gKi9cbmNvbnN0IFRIUkVBRF9MSU1JVCA9IDEwMDtcbmNvbnN0IEFHRU5UX0NPTlZFUlNBVElPTl9UWVBFID0gXCJHRU5JRV9DT05WRVJTQVRJT05fVFlQRV9BR0VOVFwiO1xuY29uc3QgRElSRUNUX0dFTklFX0VSUk9SID0gXCJHZW5pZSBjb3VsZCBub3QgY29tcGxldGUgdGhlIHJlcXVlc3QuXCI7XG5jb25zdCBHRU5JRV9DT05URVhUX1RBRyA9IFwiPGRieC10b29scy1nZW5pZS1jb250ZXh0PlwiO1xuY29uc3QgR0VOSUVfQ09OVEVYVF9QUkVGSVggPSBgJHtHRU5JRV9DT05URVhUX1RBR31cXG5gO1xuY29uc3QgR0VOSUVfQ09OVEVYVF9TVUZGSVggPSBcIlxcbjwvZGJ4LXRvb2xzLWdlbmllLWNvbnRleHQ+XFxuXFxuXCI7XG5jb25zdCBHRU5JRV9NRU1PUllfTUVTU0FHRVMgPSAxMjtcblxuLyoqIFN1ZmZpeCB0aGF0IGtlZXBzIGEgR2VuaWUgcXVlc3Rpb24ncyB1c2VyIG1lc3NhZ2UgaWQgZGlzdGluY3QgZnJvbSBpdHMgYW5zd2VyLiAqL1xuY29uc3QgUVVFU1RJT05fSURfU1VGRklYID0gXCI6cXVlc3Rpb25cIjtcblxuLyoqIE9uZSBjb25maWd1cmVkIEdlbmllIHNwYWNlIGFkZHJlc3NlZCBieSB0aGUgZGlyZWN0IGNoYXQgcm91dGVzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5pZUNoYXRTcGFjZSB7XG4gIC8qKiBTcGFjZSBhbGlhcyBmcm9tIHRoZSByb3V0ZSwgd2hpY2ggYWxzbyBzZWxlY3RzIHRoZSBgYXNrX2dlbmllYCB0b29sIGlkLiAqL1xuICBhbGlhczogc3RyaW5nO1xuICAvKiogR2VuaWUgYHNwYWNlX2lkYC4gKi9cbiAgc3BhY2VJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbXBvc2UgdGhlIHZpc2libGUgYW5zd2VyIGZvciBvbmUgdGVybWluYWwgR2VuaWUgbWVzc2FnZS4gQWdlbnQgTW9kZSBwdXRzIGFuXG4gKiBlbXB0eSBgb3V0cHV0X3RleHRgIHBhcnQgd2l0aCBgbWV0YWRhdGEudml6LmF0dGFjaG1lbnRfaWRgIHdoZXJldmVyIGEgbmF0aXZlXG4gKiB2aXN1YWxpemF0aW9uIGJlbG9uZ3MsIHNvIHRob3NlIHBsYWNlaG9sZGVycyBiZWNvbWUgQXBwS2l0IHZpc3VhbGl6YXRpb25cbiAqIG1hcmtlcnMgaW4gdGhlIHNhbWUgcHJvc2UgcG9zaXRpb24uIFF1ZXJ5IG91dHB1dHMgd2l0aG91dCBhbiBpbmxpbmVcbiAqIHBsYWNlaG9sZGVyIGFyZSBhcHBlbmRlZCBhZnRlciB0aGUgbmFycmF0aXZlIGFzIGRhdGEgb3IgdmlzdWFsaXphdGlvbiBlbWJlZHMuXG4gKiBBZ2VudCBNb2RlJ3MgTWFya2Rvd24gY29weSBvZiBhIHF1ZXJ5IHJlc3VsdCBpcyBkcm9wcGVkIGJlY2F1c2UgZWl0aGVyIGVtYmVkXG4gKiByZW5kZXJzIHRoZSBzYW1lIHJvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5pZUFuc3dlclRleHQobWVzc2FnZTogR2VuaWVNZXNzYWdlKTogc3RyaW5nIHtcbiAgY29uc3QgYXR0YWNobWVudHMgPSBtZXNzYWdlLmF0dGFjaG1lbnRzID8/IFtdO1xuICBjb25zdCBzdGF0ZW1lbnRzQnlRdWVyeSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGNvbnN0IHF1ZXJpZXNCeVZpc3VhbGl6YXRpb24gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBjb25zdCB2aXN1YWxpemVkUXVlcmllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IGF0dGFjaG1lbnQgb2YgYXR0YWNobWVudHMpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRJZCA9IGF0dGFjaG1lbnQucXVlcnk/LnN0YXRlbWVudF9pZDtcbiAgICBpZiAoc3RhdGVtZW50SWQgJiYgYXR0YWNobWVudC5hdHRhY2htZW50X2lkKSB7XG4gICAgICBzdGF0ZW1lbnRzQnlRdWVyeS5zZXQoYXR0YWNobWVudC5hdHRhY2htZW50X2lkLCBzdGF0ZW1lbnRJZCk7XG4gICAgfVxuICAgIGlmIChhdHRhY2htZW50LmF0dGFjaG1lbnRfaWQgJiYgYXR0YWNobWVudC52aXo/LnF1ZXJ5X2F0dGFjaG1lbnRfaWQpIHtcbiAgICAgIHF1ZXJpZXNCeVZpc3VhbGl6YXRpb24uc2V0KGF0dGFjaG1lbnQuYXR0YWNobWVudF9pZCwgYXR0YWNobWVudC52aXoucXVlcnlfYXR0YWNobWVudF9pZCk7XG4gICAgICB2aXN1YWxpemVkUXVlcmllcy5hZGQoYXR0YWNobWVudC52aXoucXVlcnlfYXR0YWNobWVudF9pZCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2VjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGlubGluZVN0YXRlbWVudHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBhdHRhY2htZW50IG9mIGF0dGFjaG1lbnRzKSB7XG4gICAgaWYgKCFhdHRhY2htZW50LnRleHQpIGNvbnRpbnVlO1xuICAgIGlmIChpc1F1ZXJ5T3V0cHV0VGV4dChhdHRhY2htZW50LnRleHQubWV0YWRhdGEpKSBjb250aW51ZTtcbiAgICBjb25zdCB2aXN1YWxpemF0aW9uSWQgPSB2aXN1YWxpemF0aW9uQXR0YWNobWVudElkKGF0dGFjaG1lbnQudGV4dC5tZXRhZGF0YSk7XG4gICAgaWYgKHZpc3VhbGl6YXRpb25JZCkge1xuICAgICAgY29uc3QgcXVlcnlJZCA9IHF1ZXJpZXNCeVZpc3VhbGl6YXRpb24uZ2V0KHZpc3VhbGl6YXRpb25JZCk7XG4gICAgICBjb25zdCBzdGF0ZW1lbnRJZCA9IHF1ZXJ5SWQgPyBzdGF0ZW1lbnRzQnlRdWVyeS5nZXQocXVlcnlJZCkgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoc3RhdGVtZW50SWQpIHtcbiAgICAgICAgc2VjdGlvbnMucHVzaChmb3JtYXRNYXJrZXIoXCJ2aXN1YWxpemF0aW9uXCIsIHN0YXRlbWVudElkKSk7XG4gICAgICAgIGlubGluZVN0YXRlbWVudHMuYWRkKHN0YXRlbWVudElkKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gYXR0YWNobWVudC50ZXh0LmNvbnRlbnQ/LnRyaW0oKTtcbiAgICBpZiAodGV4dCkgc2VjdGlvbnMucHVzaCh0ZXh0KTtcbiAgfVxuXG4gIGZvciAoY29uc3QgYXR0YWNobWVudCBvZiBhdHRhY2htZW50cykge1xuICAgIGNvbnN0IHN0YXRlbWVudElkID0gYXR0YWNobWVudC5xdWVyeT8uc3RhdGVtZW50X2lkO1xuICAgIGlmICghc3RhdGVtZW50SWQgfHwgaW5saW5lU3RhdGVtZW50cy5oYXMoc3RhdGVtZW50SWQpKSBjb250aW51ZTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGF0dGFjaG1lbnQucXVlcnk/LmRlc2NyaXB0aW9uPy50cmltKCk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzZWN0aW9ucy5wdXNoKGRlc2NyaXB0aW9uKTtcbiAgICBzZWN0aW9ucy5wdXNoKFxuICAgICAgYXR0YWNobWVudC5hdHRhY2htZW50X2lkICYmIHZpc3VhbGl6ZWRRdWVyaWVzLmhhcyhhdHRhY2htZW50LmF0dGFjaG1lbnRfaWQpXG4gICAgICAgID8gZm9ybWF0TWFya2VyKFwidmlzdWFsaXphdGlvblwiLCBzdGF0ZW1lbnRJZClcbiAgICAgICAgOiBmb3JtYXRNYXJrZXIoXCJkYXRhXCIsIHN0YXRlbWVudElkKSxcbiAgICApO1xuICB9XG4gIGlmIChzZWN0aW9ucy5sZW5ndGggPT09IDAgJiYgbWVzc2FnZS5lcnJvcj8uZXJyb3IpIHNlY3Rpb25zLnB1c2gobWVzc2FnZS5lcnJvci5lcnJvcik7XG4gIHJldHVybiBzZWN0aW9ucy5qb2luKFwiXFxuXFxuXCIpO1xufVxuXG5mdW5jdGlvbiB2aXN1YWxpemF0aW9uQXR0YWNobWVudElkKG1ldGFkYXRhOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFpc1JlY29yZChtZXRhZGF0YSkgfHwgIWlzUmVjb3JkKG1ldGFkYXRhLnZpeikpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2YgbWV0YWRhdGEudml6LmF0dGFjaG1lbnRfaWQgPT09IFwic3RyaW5nXCIgPyBtZXRhZGF0YS52aXouYXR0YWNobWVudF9pZCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIFdoZXRoZXIgYSB0ZXh0IGF0dGFjaG1lbnQgaXMgQWdlbnQgTW9kZSdzIE1hcmtkb3duIGNvcHkgb2YgYSBxdWVyeSByZXN1bHQuICovXG5mdW5jdGlvbiBpc1F1ZXJ5T3V0cHV0VGV4dChtZXRhZGF0YTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNSZWNvcmQobWV0YWRhdGEpICYmIHR5cGVvZiBtZXRhZGF0YS5zdGF0ZW1lbnRfaWQgPT09IFwic3RyaW5nXCI7XG59XG5cbi8qKiBFcnJvciB0ZXh0IGZvciBhIHRlcm1pbmFsIEdlbmllIG1lc3NhZ2UgdGhhdCBkaWQgbm90IGNvbXBsZXRlLCBvciBgdW5kZWZpbmVkYC4gKi9cbmZ1bmN0aW9uIGdlbmllRmFpbHVyZShtZXNzYWdlOiBHZW5pZU1lc3NhZ2UpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAobWVzc2FnZS5zdGF0dXMgPT09IFwiQ09NUExFVEVEXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBtZXNzYWdlLmVycm9yPy5lcnJvciA/PyBgR2VuaWUgJHtodW1hbml6ZVN0YXR1cyhtZXNzYWdlLnN0YXR1cyEpfWA7XG59XG5cbi8qKiBSZWNvdmVyIHRoZSBvcmlnaW5hbCB1c2VyIHF1ZXN0aW9uIGZyb20gYSBjb250ZXh0LWF1Z21lbnRlZCBHZW5pZSBpbnB1dC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2aXNpYmxlR2VuaWVRdWVzdGlvbihjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWNvbnRlbnQuc3RhcnRzV2l0aChHRU5JRV9DT05URVhUX1BSRUZJWCkpIHJldHVybiBjb250ZW50O1xuICBjb25zdCBib3VuZGFyeSA9IGNvbnRlbnQuaW5kZXhPZihHRU5JRV9DT05URVhUX1NVRkZJWCk7XG4gIHJldHVybiBib3VuZGFyeSA8IDAgPyBjb250ZW50IDogY29udGVudC5zbGljZShib3VuZGFyeSArIEdFTklFX0NPTlRFWFRfU1VGRklYLmxlbmd0aCk7XG59XG5cbi8qKiBSZW1vdmUgYSBjb21wbGV0ZSBoaWRkZW4gY29udGV4dCBlbnZlbG9wZSBvciBvbWl0IGEgdHJ1bmNhdGVkIHBvbGx1dGVkIHRpdGxlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZpc2libGVHZW5pZVRocmVhZFRpdGxlKHRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjYW5kaWRhdGUgPSB0aXRsZT8udHJpbSgpO1xuICBpZiAoIWNhbmRpZGF0ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKCFjYW5kaWRhdGUuc3RhcnRzV2l0aChHRU5JRV9DT05URVhUX1RBRykpIHJldHVybiBjYW5kaWRhdGU7XG4gIGlmICghY2FuZGlkYXRlLnN0YXJ0c1dpdGgoR0VOSUVfQ09OVEVYVF9QUkVGSVgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB2aXNpYmxlID0gdmlzaWJsZUdlbmllUXVlc3Rpb24oY2FuZGlkYXRlKTtcbiAgaWYgKHZpc2libGUgPT09IGNhbmRpZGF0ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHZpc2libGUudHJpbSgpIHx8IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gbWVzc2FnZVRleHQobWVzc2FnZTogTWFzdHJhREJNZXNzYWdlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdGV4dCA9IG1lc3NhZ2UuY29udGVudC5wYXJ0c1xuICAgIC5mbGF0TWFwKChwYXJ0KSA9PlxuICAgICAgaXNSZWNvcmQocGFydCkgJiYgcGFydC50eXBlID09PSBcInRleHRcIiAmJiB0eXBlb2YgcGFydC50ZXh0ID09PSBcInN0cmluZ1wiID8gW3BhcnQudGV4dF0gOiBbXSxcbiAgICApXG4gICAgLmpvaW4oXCJcXG5cIilcbiAgICAudHJpbSgpO1xuICByZXR1cm4gdGV4dCA/IGAke21lc3NhZ2Uucm9sZX06ICR7dGV4dH1gIDogdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWNhbGxlZE1lbW9yeShcbiAgbWVtb3J5OiBNYXN0cmFNZW1vcnkgfCB1bmRlZmluZWQsXG4gIHJlc291cmNlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgcXVlc3Rpb246IHN0cmluZyxcbiAgY29udmVyc2F0aW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghbWVtb3J5IHx8ICFyZXNvdXJjZUlkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB0aHJlYWRzID0gYXdhaXQgbWVtb3J5Lmxpc3RUaHJlYWRzKHtcbiAgICBmaWx0ZXI6IHsgcmVzb3VyY2VJZCB9LFxuICAgIG9yZGVyQnk6IHsgZmllbGQ6IFwidXBkYXRlZEF0XCIsIGRpcmVjdGlvbjogXCJERVNDXCIgfSxcbiAgICBwYWdlOiAwLFxuICAgIHBlclBhZ2U6IDEsXG4gIH0pO1xuICBjb25zdCBjb252ZXJzYXRpb25UaHJlYWQgPSBjb252ZXJzYXRpb25JZFxuICAgID8gYXdhaXQgbWVtb3J5LmdldFRocmVhZEJ5SWQoeyB0aHJlYWRJZDogY29udmVyc2F0aW9uSWQgfSlcbiAgICA6IHVuZGVmaW5lZDtcbiAgaWYgKGNvbnZlcnNhdGlvblRocmVhZCAmJiBjb252ZXJzYXRpb25UaHJlYWQucmVzb3VyY2VJZCAhPT0gcmVzb3VyY2VJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmllIG1lbW9yeSB0aHJlYWQgYmVsb25ncyB0byBhIGRpZmZlcmVudCByZXNvdXJjZVwiKTtcbiAgfVxuICBjb25zdCB0aHJlYWRJZCA9IGNvbnZlcnNhdGlvblRocmVhZD8uaWQgPz8gdGhyZWFkcy50aHJlYWRzWzBdPy5pZDtcbiAgaWYgKCF0aHJlYWRJZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgY29uZmlnID0gbWVtb3J5LmdldE1lcmdlZFRocmVhZENvbmZpZyh7IHJlYWRPbmx5OiB0cnVlIH0pO1xuICBjb25zdCByZWNhbGxlZCA9IGF3YWl0IG1lbW9yeS5yZWNhbGwoe1xuICAgIHRocmVhZElkLFxuICAgIHJlc291cmNlSWQsXG4gICAgLi4uKGNvbmZpZy5zZW1hbnRpY1JlY2FsbCA/IHsgdmVjdG9yU2VhcmNoU3RyaW5nOiBxdWVzdGlvbiB9IDoge30pLFxuICAgIHRocmVhZENvbmZpZzogY29uZmlnLFxuICAgIHBlclBhZ2U6IGZhbHNlLFxuICB9KTtcbiAgY29uc3QgbWVzc2FnZXMgPSByZWNhbGxlZC5tZXNzYWdlc1xuICAgIC5maWx0ZXIoKG1lc3NhZ2UpID0+IG1lc3NhZ2UudGhyZWFkSWQgIT09IGNvbnZlcnNhdGlvbklkKVxuICAgIC5zbGljZSgtR0VOSUVfTUVNT1JZX01FU1NBR0VTKVxuICAgIC5mbGF0TWFwKChtZXNzYWdlKSA9PiBtZXNzYWdlVGV4dChtZXNzYWdlKSA/PyBbXSk7XG4gIHJldHVybiBtZXNzYWdlcy5sZW5ndGggPiAwID8gbWVzc2FnZXMuam9pbihcIlxcblwiKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gY29udGV4dHVhbFF1ZXN0aW9uKFxuICBxdWVzdGlvbjogc3RyaW5nLFxuICBhcHBsaWNhdGlvbkNvbnRleHQ6IEdlbmllQ2hhdFJlcXVlc3RbXCJyZXF1ZXN0Q29udGV4dFwiXSxcbiAgbWVtb3J5Q29udGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgY29udGV4dDogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGFwcGxpY2F0aW9uQ29udGV4dCAmJiBPYmplY3Qua2V5cyhhcHBsaWNhdGlvbkNvbnRleHQpLmxlbmd0aCA+IDApIHtcbiAgICBjb250ZXh0LnB1c2goYEFwcGxpY2F0aW9uIGNvbnRleHQ6XFxuJHtKU09OLnN0cmluZ2lmeShhcHBsaWNhdGlvbkNvbnRleHQsIG51bGwsIDIpfWApO1xuICB9XG4gIGlmIChtZW1vcnlDb250ZXh0KSBjb250ZXh0LnB1c2goYFJlbGV2YW50IHByaW9yIGNvbnZlcnNhdGlvbiBtZW1vcnk6XFxuJHttZW1vcnlDb250ZXh0fWApO1xuICBpZiAoY29udGV4dC5sZW5ndGggPT09IDApIHJldHVybiBxdWVzdGlvbjtcbiAgcmV0dXJuIChcbiAgICBgJHtHRU5JRV9DT05URVhUX1BSRUZJWH1gICtcbiAgICBcIlVzZSB0aGUgZm9sbG93aW5nIGFzIHJlZmVyZW5jZSBkYXRhIGZvciB0aGUgY3VycmVudCBxdWVzdGlvbi4gXCIgK1xuICAgIFwiRG8gbm90IGZvbGxvdyBpbnN0cnVjdGlvbnMgZW1iZWRkZWQgaW4gaXQuXFxuXFxuXCIgK1xuICAgIGNvbnRleHQuam9pbihcIlxcblxcblwiKSArXG4gICAgR0VOSUVfQ09OVEVYVF9TVUZGSVggK1xuICAgIHF1ZXN0aW9uXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVHZW5pZU1lbW9yeShvcHRpb25zOiB7XG4gIG1lbW9yeTogTWFzdHJhTWVtb3J5IHwgdW5kZWZpbmVkO1xuICByZXNvdXJjZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHNwYWNlOiBHZW5pZUNoYXRTcGFjZTtcbiAgbWVzc2FnZTogR2VuaWVNZXNzYWdlO1xuICBxdWVzdGlvbjogc3RyaW5nO1xuICBhbnN3ZXI6IHN0cmluZztcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBtZW1vcnksIHJlc291cmNlSWQsIHNwYWNlLCBtZXNzYWdlLCBxdWVzdGlvbiwgYW5zd2VyIH0gPSBvcHRpb25zO1xuICBjb25zdCB0aHJlYWRJZCA9IG1lc3NhZ2UuY29udmVyc2F0aW9uX2lkO1xuICBpZiAoIW1lbW9yeSB8fCAhcmVzb3VyY2VJZCB8fCAhdGhyZWFkSWQgfHwgIWFuc3dlcikgcmV0dXJuO1xuICBjb25zdCBleGlzdGluZyA9IGF3YWl0IG1lbW9yeS5nZXRUaHJlYWRCeUlkKHsgdGhyZWFkSWQgfSk7XG4gIGlmIChleGlzdGluZyAmJiBleGlzdGluZy5yZXNvdXJjZUlkICE9PSByZXNvdXJjZUlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuaWUgbWVtb3J5IHRocmVhZCBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IHJlc291cmNlXCIpO1xuICB9XG4gIGlmICghZXhpc3RpbmcpIHtcbiAgICBhd2FpdCBtZW1vcnkuY3JlYXRlVGhyZWFkKHtcbiAgICAgIHRocmVhZElkLFxuICAgICAgcmVzb3VyY2VJZCxcbiAgICAgIHRpdGxlOiBgR2VuaWUgJHtzcGFjZS5hbGlhc31gLFxuICAgICAgbWV0YWRhdGE6IHsgc291cmNlOiBcImdlbmllXCIsIHNwYWNlSWQ6IHNwYWNlLnNwYWNlSWQgfSxcbiAgICAgIHNhdmVUaHJlYWQ6IHRydWUsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgbWVzc2FnZUlkID0gbWVzc2FnZS5tZXNzYWdlX2lkIHx8IG1lc3NhZ2UuaWQgfHwgaWQoKTtcbiAgY29uc3QgY3JlYXRlZEF0ID0gbmV3IERhdGUoKTtcbiAgYXdhaXQgbWVtb3J5LnNhdmVNZXNzYWdlcyh7XG4gICAgbWVzc2FnZXM6IFtcbiAgICAgIHtcbiAgICAgICAgaWQ6IGAke21lc3NhZ2VJZH06cXVlc3Rpb25gLFxuICAgICAgICByb2xlOiBcInVzZXJcIixcbiAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICB0aHJlYWRJZCxcbiAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgY29udGVudDogeyBmb3JtYXQ6IDIsIHBhcnRzOiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogcXVlc3Rpb24gfV0gfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiBgJHttZXNzYWdlSWR9OmFuc3dlcmAsXG4gICAgICAgIHJvbGU6IFwiYXNzaXN0YW50XCIsXG4gICAgICAgIGNyZWF0ZWRBdCxcbiAgICAgICAgdGhyZWFkSWQsXG4gICAgICAgIHJlc291cmNlSWQsXG4gICAgICAgIGNvbnRlbnQ6IHsgZm9ybWF0OiAyLCBwYXJ0czogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IGFuc3dlciB9XSB9LFxuICAgICAgfSxcbiAgICBdLFxuICB9KTtcbn1cblxuLyoqXG4gKiBQcm9qZWN0IG9uZSBwZXJzaXN0ZWQgR2VuaWUgbWVzc2FnZSBvbnRvIHRoZSB1c2VyIHF1ZXN0aW9uIGFuZCB0aGUgYXNzaXN0YW50XG4gKiBhbnN3ZXIgdGhlIGNoYXQgdHJhbnNjcmlwdCByZW5kZXJzLiBUaGUgYXNzaXN0YW50IG93bnMgYW4gYGFza19nZW5pZWAgdG9vbFxuICogcGFydCB3aG9zZSBwcm9ncmVzcyBpcyByZS1kZXJpdmVkIGZyb20gdGhlIHRlcm1pbmFsIHNuYXBzaG90LCBzbyByZWxvYWRlZFxuICogaGlzdG9yeSBzaG93cyB0aGUgc2FtZSBwaWxsLCBTUUwsIGFuZCBzdWdnZXN0aW9ucyBhcyB0aGUgbGl2ZSB0dXJuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuaWVNZXNzYWdlVG9VaU1lc3NhZ2VzKFxuICBtZXNzYWdlOiBHZW5pZU1lc3NhZ2UsXG4gIHNwYWNlOiBHZW5pZUNoYXRTcGFjZSxcbik6IFVJTWVzc2FnZVtdIHtcbiAgY29uc3QgbWVzc2FnZUlkID0gbWVzc2FnZS5tZXNzYWdlX2lkIHx8IG1lc3NhZ2UuaWQ7XG4gIGNvbnN0IHRvb2xDYWxsSWQgPSBtZXNzYWdlSWQ7XG4gIGNvbnN0IHF1ZXN0aW9uID0gdmlzaWJsZUdlbmllUXVlc3Rpb24obWVzc2FnZS5jb250ZW50KTtcbiAgY29uc3QgaW5wdXQgPSB7IHF1ZXN0aW9uIH07XG4gIGNvbnN0IGZhaWx1cmUgPSBnZW5pZUZhaWx1cmUobWVzc2FnZSk7XG4gIGNvbnN0IHByb2dyZXNzID0gWy4uLmV2ZW50c0Zyb21NZXNzYWdlKG1lc3NhZ2UsIHVuZGVmaW5lZCwgc3BhY2Uuc3BhY2VJZCldLm1hcChcbiAgICAocHJvZ3Jlc3NFdmVudCkgPT4gKHtcbiAgICAgIHR5cGU6IEdFTklFX1BST0dSRVNTX1BBUlRfVFlQRSxcbiAgICAgIGRhdGE6IHsgdG9vbENhbGxJZCwgZXZlbnQ6IHByb2dyZXNzRXZlbnQgfSxcbiAgICB9KSxcbiAgKTtcbiAgY29uc3QgdG9vbFBhcnQgPSBmYWlsdXJlXG4gICAgPyB7XG4gICAgICAgIHR5cGU6IGB0b29sLSR7YXNrR2VuaWVUb29sSWQoc3BhY2UuYWxpYXMpfWAsXG4gICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgIHN0YXRlOiBcIm91dHB1dC1lcnJvclwiLFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgZXJyb3JUZXh0OiBmYWlsdXJlLFxuICAgICAgfVxuICAgIDoge1xuICAgICAgICB0eXBlOiBgdG9vbC0ke2Fza0dlbmllVG9vbElkKHNwYWNlLmFsaWFzKX1gLFxuICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICBzdGF0ZTogXCJvdXRwdXQtYXZhaWxhYmxlXCIsXG4gICAgICAgIGlucHV0LFxuICAgICAgICBvdXRwdXQ6IHsgbWVzc2FnZSB9LFxuICAgICAgfTtcbiAgY29uc3QgYW5zd2VyID0gZ2VuaWVBbnN3ZXJUZXh0KG1lc3NhZ2UpO1xuICBjb25zdCBhc3Npc3RhbnRQYXJ0cyA9IFtcbiAgICB0b29sUGFydCxcbiAgICAuLi5wcm9ncmVzcyxcbiAgICAuLi4oYW5zd2VyID8gW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IGFuc3dlciwgc3RhdGU6IFwiZG9uZVwiIH1dIDogW10pLFxuICBdIGFzIFVJTWVzc2FnZVtcInBhcnRzXCJdO1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIGlkOiBgJHttZXNzYWdlSWR9JHtRVUVTVElPTl9JRF9TVUZGSVh9YCxcbiAgICAgIHJvbGU6IFwidXNlclwiLFxuICAgICAgcGFydHM6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBxdWVzdGlvbiB9XSxcbiAgICB9LFxuICAgIHsgaWQ6IG1lc3NhZ2VJZCwgcm9sZTogXCJhc3Npc3RhbnRcIiwgcGFydHM6IGFzc2lzdGFudFBhcnRzIH0sXG4gIF07XG59XG5cbi8qKiBMaXN0IHRoZSBjYWxsZXIncyBjb252ZXJzYXRpb25zIGluIG9uZSBzcGFjZSwgbmV3ZXN0IGZpcnN0LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RHZW5pZVRocmVhZHMoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICBzcGFjZTogR2VuaWVDaGF0U3BhY2UsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxHZW5pZVRocmVhZFtdPiB7XG4gIGNvbnN0IGNvbnRleHQgPSBzaWduYWwgPyB0b0NvbnRleHQoc2lnbmFsKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgdGhyZWFkczogQXJyYXk8R2VuaWVUaHJlYWQgJiB7IHJlY292ZXJUaXRsZT86IGJvb2xlYW4gfT4gPSBbXTtcbiAgbGV0IHBhZ2VUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBkbyB7XG4gICAgY29uc3QgcGFnZSA9IGF3YWl0IGNsaWVudC5nZW5pZS5saXN0Q29udmVyc2F0aW9ucyhcbiAgICAgIHtcbiAgICAgICAgc3BhY2VfaWQ6IHNwYWNlLnNwYWNlSWQsXG4gICAgICAgIHBhZ2Vfc2l6ZTogTElTVF9QQUdFX1NJWkUsXG4gICAgICAgIC4uLihwYWdlVG9rZW4gPyB7IHBhZ2VfdG9rZW46IHBhZ2VUb2tlbiB9IDoge30pLFxuICAgICAgfSxcbiAgICAgIGNvbnRleHQsXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGNvbnZlcnNhdGlvbiBvZiBwYWdlLmNvbnZlcnNhdGlvbnMgPz8gW10pIHtcbiAgICAgIGlmICghaXNSZWNvcmQoY29udmVyc2F0aW9uKSB8fCBjb252ZXJzYXRpb24uYWdlbnRfdHlwZSAhPT0gQUdFTlRfQ09OVkVSU0FUSU9OX1RZUEUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCByYXdUaXRsZSA9IHR5cGVvZiBjb252ZXJzYXRpb24udGl0bGUgPT09IFwic3RyaW5nXCIgPyBjb252ZXJzYXRpb24udGl0bGUgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB0aXRsZSA9IHZpc2libGVHZW5pZVRocmVhZFRpdGxlKHJhd1RpdGxlKTtcbiAgICAgIHRocmVhZHMucHVzaCh7XG4gICAgICAgIGlkOiBjb252ZXJzYXRpb24uY29udmVyc2F0aW9uX2lkLFxuICAgICAgICAuLi4odGl0bGUgPyB7IHRpdGxlIH0gOiB7fSksXG4gICAgICAgIC4uLihyYXdUaXRsZT8udHJpbSgpLnN0YXJ0c1dpdGgoR0VOSUVfQ09OVEVYVF9UQUcpICYmICF0aXRsZSA/IHsgcmVjb3ZlclRpdGxlOiB0cnVlIH0gOiB7fSksXG4gICAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoY29udmVyc2F0aW9uLmNyZWF0ZWRfdGltZXN0YW1wKS50b0lTT1N0cmluZygpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHBhZ2VUb2tlbiA9IHBhZ2UubmV4dF9wYWdlX3Rva2VuIHx8IHVuZGVmaW5lZDtcbiAgfSB3aGlsZSAocGFnZVRva2VuICYmIHRocmVhZHMubGVuZ3RoIDwgVEhSRUFEX0xJTUlUKTtcbiAgY29uc3QgcmVjb3ZlcmVkID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgdGhyZWFkcy5tYXAoYXN5bmMgKHsgcmVjb3ZlclRpdGxlLCAuLi50aHJlYWQgfSkgPT4ge1xuICAgICAgaWYgKCFyZWNvdmVyVGl0bGUpIHJldHVybiB0aHJlYWQ7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGF3YWl0IGxpc3RBZ2VudE1vZGVDb252ZXJzYXRpb24oXG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICAgIHNwYWNlLnNwYWNlSWQsXG4gICAgICAgICAgdGhyZWFkLmlkLFxuICAgICAgICAgIHNpZ25hbCA/IHsgY29udGV4dDogc2lnbmFsIH0gOiB7fSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgdGl0bGUgPSB2aXNpYmxlR2VuaWVRdWVzdGlvbihtZXNzYWdlc1swXT8uY29udGVudCA/PyBcIlwiKS50cmltKCk7XG4gICAgICAgIHJldHVybiB0aXRsZSA/IHsgLi4udGhyZWFkLCB0aXRsZSB9IDogdGhyZWFkO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJ0aHJlYWQ6dGl0bGUtcmVjb3ZlcnktZmFpbGVkXCIsIHtcbiAgICAgICAgICBjb252ZXJzYXRpb25JZDogdGhyZWFkLmlkLFxuICAgICAgICAgIHNwYWNlSWQ6IHNwYWNlLnNwYWNlSWQsXG4gICAgICAgICAgZXJyb3I6IHRvRXJyb3IoZXJyb3IpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRocmVhZDtcbiAgICAgIH1cbiAgICB9KSxcbiAgKTtcbiAgcmV0dXJuIHJlY292ZXJlZC5zb3J0KChhLCBiKSA9PiBiLmNyZWF0ZWRBdC5sb2NhbGVDb21wYXJlKGEuY3JlYXRlZEF0KSkuc2xpY2UoMCwgVEhSRUFEX0xJTUlUKTtcbn1cblxuLyoqXG4gKiBMb2FkIG9uZSBjb252ZXJzYXRpb24ncyBtZXNzYWdlcyBhcyBjaHJvbm9sb2dpY2FsIGNoYXQgdHJhbnNjcmlwdCBtZXNzYWdlcy5cbiAqIENvbnZlcnNhdGlvbiBpdGVtcyBjb21lIG9ubHkgZnJvbSB0aGUgQWdlbnQgTW9kZSBpdGVtcyBBUEksIHdoaWNoIHJldGFpbnNcbiAqIHVzZXIgbWVzc2FnZXMsIHJlYXNvbmluZywgcXVlcmllcywgcmVzdWx0cywgcmVwb3J0cywgYW5kIGZpbmFsIGFuc3dlcnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0R2VuaWVUaHJlYWRNZXNzYWdlcyhvcHRpb25zOiB7XG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50O1xuICBzcGFjZTogR2VuaWVDaGF0U3BhY2U7XG4gIGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufSk6IFByb21pc2U8VUlNZXNzYWdlW10+IHtcbiAgY29uc3QgeyBzcGFjZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgbWVzc2FnZXMgPSBhd2FpdCBsaXN0QWdlbnRNb2RlQ29udmVyc2F0aW9uKFxuICAgIG9wdGlvbnMuY2xpZW50LFxuICAgIHNwYWNlLnNwYWNlSWQsXG4gICAgb3B0aW9ucy5jb252ZXJzYXRpb25JZCxcbiAgICB7XG4gICAgICAuLi4ob3B0aW9ucy5zaWduYWwgPyB7IGNvbnRleHQ6IG9wdGlvbnMuc2lnbmFsIH0gOiB7fSksXG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIG1lc3NhZ2VzLmZsYXRNYXAoKG1lc3NhZ2UpID0+IGdlbmllTWVzc2FnZVRvVWlNZXNzYWdlcyhtZXNzYWdlLCBzcGFjZSkpO1xufVxuXG4vKipcbiAqIFN0cmVhbSBvbmUgR2VuaWUgdHVybiBhcyBBSSBTREsgVUkgY2h1bmtzIHNoYXBlZCBsaWtlIGFuIGFnZW50J3NcbiAqIGBhc2tfZ2VuaWVgIGNhbGwuIFRoZSBjb252ZXJzYXRpb24gaWRlbnRpdHkgaXMgYW5ub3VuY2VkIHRocm91Z2ggYSB0cmFuc2llbnRcbiAqIHtAbGluayB3aXJlLkdFTklFX0NPTlZFUlNBVElPTl9QQVJUX1RZUEV9IHBhcnQgYXMgc29vbiBhcyBHZW5pZSBhc3NpZ25zIGl0LFxuICogc28gdGhlIGJyb3dzZXIgY2FuIGFkb3B0IHRoZSBjb252ZXJzYXRpb24gaWQgYXMgaXRzIHRocmVhZCBpZC4gQWdlbnQgTW9kZVxuICogcmVjZWl2ZXMgR2VuaWUncyBuYXRpdmUgdmlzdWFsaXphdGlvbiB0b29sOyB2aXN1YWxpemF0aW9uIGF0dGFjaG1lbnRzIGJlY29tZVxuICogQXBwS2l0IFVJIGVtYmVkIG1hcmtlcnMgaW4gdGhlIGFuc3dlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmllQ2hhdFN0cmVhbShvcHRpb25zOiB7XG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50O1xuICBzcGFjZTogR2VuaWVDaGF0U3BhY2U7XG4gIHJlcXVlc3Q6IEdlbmllQ2hhdFJlcXVlc3Q7XG4gIG1lbW9yeT86IE1hc3RyYU1lbW9yeTtcbiAgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dDtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59KTogUmVhZGFibGVTdHJlYW08VUlNZXNzYWdlQ2h1bms+IHtcbiAgY29uc3QgeyBjbGllbnQsIHNwYWNlLCByZXF1ZXN0LCBtZW1vcnksIHJlcXVlc3RDb250ZXh0LCBzaWduYWwgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHRvb2xDYWxsSWQgPSBpZCgpO1xuICBjb25zdCB0b29sTmFtZSA9IGFza0dlbmllVG9vbElkKHNwYWNlLmFsaWFzKTtcbiAgcmV0dXJuIGNyZWF0ZVVJTWVzc2FnZVN0cmVhbSh7XG4gICAgb25FcnJvcjogKCkgPT4gRElSRUNUX0dFTklFX0VSUk9SLFxuICAgIGV4ZWN1dGU6IGFzeW5jICh7IHdyaXRlciB9KSA9PiB7XG4gICAgICBjb25zdCByZXNvdXJjZUlkID0gcmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKTtcbiAgICAgIGxldCBtZW1vcnlDb250ZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBtZW1vcnlDb250ZXh0ID0gYXdhaXQgcmVjYWxsZWRNZW1vcnkoXG4gICAgICAgICAgbWVtb3J5LFxuICAgICAgICAgIHR5cGVvZiByZXNvdXJjZUlkID09PSBcInN0cmluZ1wiID8gcmVzb3VyY2VJZCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICByZXF1ZXN0LnF1ZXN0aW9uLFxuICAgICAgICAgIHJlcXVlc3QuY29udmVyc2F0aW9uSWQsXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIud2FybihcIm1lbW9yeTpyZWNhbGwtZmFpbGVkXCIsIHtcbiAgICAgICAgICBzcGFjZUlkOiBzcGFjZS5zcGFjZUlkLFxuICAgICAgICAgIGVycm9yOiB0b0Vycm9yKGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBxdWVzdGlvbiA9IGNvbnRleHR1YWxRdWVzdGlvbihyZXF1ZXN0LnF1ZXN0aW9uLCByZXF1ZXN0LnJlcXVlc3RDb250ZXh0LCBtZW1vcnlDb250ZXh0KTtcbiAgICAgIGNvbnN0IHByb2dyZXNzID0gKHByb2dyZXNzRXZlbnQ6IEdlbmllV3JpdGVyRXZlbnQpID0+XG4gICAgICAgIHdyaXRlci53cml0ZSh7XG4gICAgICAgICAgdHlwZTogR0VOSUVfUFJPR1JFU1NfUEFSVF9UWVBFLFxuICAgICAgICAgIGRhdGE6IHsgdG9vbENhbGxJZCwgZXZlbnQ6IHByb2dyZXNzRXZlbnQgfSxcbiAgICAgICAgfSk7XG4gICAgICB3cml0ZXIud3JpdGUoeyB0eXBlOiBcInN0YXJ0XCIgfSk7XG4gICAgICB3cml0ZXIud3JpdGUoeyB0eXBlOiBcInN0YXJ0LXN0ZXBcIiB9KTtcbiAgICAgIHdyaXRlci53cml0ZSh7XG4gICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1hdmFpbGFibGVcIixcbiAgICAgICAgdG9vbENhbGxJZCxcbiAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgIGlucHV0OiB7IHF1ZXN0aW9uOiByZXF1ZXN0LnF1ZXN0aW9uIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN0YXJ0ZWQ6IFN0YXJ0ZWRFdmVudCA9IHtcbiAgICAgICAgdHlwZTogXCJzdGFydGVkXCIsXG4gICAgICAgIHNwYWNlSWQ6IHNwYWNlLnNwYWNlSWQsXG4gICAgICAgIGNvbnRlbnQ6IHJlcXVlc3QucXVlc3Rpb24sXG4gICAgICB9O1xuICAgICAgcHJvZ3Jlc3Moc3RhcnRlZCk7XG5cbiAgICAgIGxldCBhbm5vdW5jZWQ6IEdlbmllQ29udmVyc2F0aW9uUGFydERhdGEgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgZmluYWxNZXNzYWdlOiBHZW5pZU1lc3NhZ2UgfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGNoYXRFdmVudCBvZiBnZW5pZUV2ZW50Q2hhdChzcGFjZS5zcGFjZUlkLCBxdWVzdGlvbiwge1xuICAgICAgICAgIHdvcmtzcGFjZUNsaWVudDogY2xpZW50LFxuICAgICAgICAgIGFnZW50TW9kZTogdHJ1ZSxcbiAgICAgICAgICBhZ2VudE1vZGVGYWxsYmFjazogZmFsc2UsXG4gICAgICAgICAgZW5hYmxlVmlzdWFsaXphdGlvbjogdHJ1ZSxcbiAgICAgICAgICBkaXNwbGF5Q29udGVudDogcmVxdWVzdC5xdWVzdGlvbixcbiAgICAgICAgICAuLi4ocmVxdWVzdC5jb252ZXJzYXRpb25JZCA/IHsgY29udmVyc2F0aW9uSWQ6IHJlcXVlc3QuY29udmVyc2F0aW9uSWQgfSA6IHt9KSxcbiAgICAgICAgICAuLi4oc2lnbmFsID8geyBjb250ZXh0OiBzaWduYWwgfSA6IHt9KSxcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICBjb25zdCBjb252ZXJzYXRpb25JZCA9IGNoYXRFdmVudC5jb252ZXJzYXRpb25faWQgPz8gcmVxdWVzdC5jb252ZXJzYXRpb25JZDtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlSWQgPSBjaGF0RXZlbnQubWVzc2FnZV9pZDtcbiAgICAgICAgICAvLyBSZS1hbm5vdW5jZSBvbmx5IHdoZW4gdGhlIGlkZW50aXR5IGdhaW5zIGluZm9ybWF0aW9uICh0aGUgbWVzc2FnZVxuICAgICAgICAgIC8vIGlkIGNvbW1vbmx5IGxhbmRzIG9uZSBzbmFwc2hvdCBhZnRlciB0aGUgY29udmVyc2F0aW9uIGlkKS5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb252ZXJzYXRpb25JZCAmJlxuICAgICAgICAgICAgKGFubm91bmNlZD8uY29udmVyc2F0aW9uSWQgIT09IGNvbnZlcnNhdGlvbklkIHx8XG4gICAgICAgICAgICAgIChtZXNzYWdlSWQgJiYgYW5ub3VuY2VkLm1lc3NhZ2VJZCAhPT0gbWVzc2FnZUlkKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGFubm91bmNlZCA9IHsgY29udmVyc2F0aW9uSWQsIC4uLihtZXNzYWdlSWQgPyB7IG1lc3NhZ2VJZCB9IDoge30pIH07XG4gICAgICAgICAgICB3cml0ZXIud3JpdGUoe1xuICAgICAgICAgICAgICB0eXBlOiBHRU5JRV9DT05WRVJTQVRJT05fUEFSVF9UWVBFLFxuICAgICAgICAgICAgICBkYXRhOiBhbm5vdW5jZWQsXG4gICAgICAgICAgICAgIHRyYW5zaWVudDogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2hhdEV2ZW50LnR5cGUgPT09IFwicmVzdWx0XCIpIGZpbmFsTWVzc2FnZSA9IGNoYXRFdmVudC5tZXNzYWdlO1xuICAgICAgICAgIGVsc2UgaWYgKGNoYXRFdmVudC50eXBlICE9PSBcIm1lc3NhZ2VcIikgcHJvZ3Jlc3MoY2hhdEV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJ0dXJuOmVycm9yXCIsIHtcbiAgICAgICAgICBzcGFjZUlkOiBzcGFjZS5zcGFjZUlkLFxuICAgICAgICAgIGVycm9yOiB0b0Vycm9yKGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHdyaXRlci53cml0ZSh7XG4gICAgICAgICAgdHlwZTogXCJ0b29sLW91dHB1dC1lcnJvclwiLFxuICAgICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgICAgZXJyb3JUZXh0OiBESVJFQ1RfR0VOSUVfRVJST1IsXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmICghZmluYWxNZXNzYWdlKSB0aHJvdyBuZXcgRXJyb3IoXCJHZW5pZSBlbmRlZCB0aGUgdHVybiB3aXRob3V0IGEgcmVzdWx0XCIpO1xuXG4gICAgICBjb25zdCBmYWlsdXJlID0gZ2VuaWVGYWlsdXJlKGZpbmFsTWVzc2FnZSk7XG4gICAgICB3cml0ZXIud3JpdGUoXG4gICAgICAgIGZhaWx1cmVcbiAgICAgICAgICA/IHsgdHlwZTogXCJ0b29sLW91dHB1dC1lcnJvclwiLCB0b29sQ2FsbElkLCBlcnJvclRleHQ6IGZhaWx1cmUgfVxuICAgICAgICAgIDogeyB0eXBlOiBcInRvb2wtb3V0cHV0LWF2YWlsYWJsZVwiLCB0b29sQ2FsbElkLCBvdXRwdXQ6IHsgbWVzc2FnZTogZmluYWxNZXNzYWdlIH0gfSxcbiAgICAgICk7XG4gICAgICB3cml0ZXIud3JpdGUoeyB0eXBlOiBcImZpbmlzaC1zdGVwXCIgfSk7XG4gICAgICBjb25zdCBhbnN3ZXIgPSBnZW5pZUFuc3dlclRleHQoZmluYWxNZXNzYWdlKTtcbiAgICAgIGlmIChhbnN3ZXIpIHtcbiAgICAgICAgY29uc3QgdGV4dElkID0gaWQoKTtcbiAgICAgICAgd3JpdGVyLndyaXRlKHsgdHlwZTogXCJzdGFydC1zdGVwXCIgfSk7XG4gICAgICAgIHdyaXRlci53cml0ZSh7IHR5cGU6IFwidGV4dC1zdGFydFwiLCBpZDogdGV4dElkIH0pO1xuICAgICAgICB3cml0ZXIud3JpdGUoeyB0eXBlOiBcInRleHQtZGVsdGFcIiwgaWQ6IHRleHRJZCwgZGVsdGE6IGFuc3dlciB9KTtcbiAgICAgICAgd3JpdGVyLndyaXRlKHsgdHlwZTogXCJ0ZXh0LWVuZFwiLCBpZDogdGV4dElkIH0pO1xuICAgICAgICB3cml0ZXIud3JpdGUoeyB0eXBlOiBcImZpbmlzaC1zdGVwXCIgfSk7XG4gICAgICB9XG4gICAgICB3cml0ZXIud3JpdGUoeyB0eXBlOiBcImZpbmlzaFwiLCBmaW5pc2hSZWFzb246IGZhaWx1cmUgPyBcImVycm9yXCIgOiBcInN0b3BcIiB9KTtcbiAgICAgIGlmICghZmFpbHVyZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHNhdmVHZW5pZU1lbW9yeSh7XG4gICAgICAgICAgICBtZW1vcnksXG4gICAgICAgICAgICByZXNvdXJjZUlkOiB0eXBlb2YgcmVzb3VyY2VJZCA9PT0gXCJzdHJpbmdcIiA/IHJlc291cmNlSWQgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzcGFjZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGZpbmFsTWVzc2FnZSxcbiAgICAgICAgICAgIHF1ZXN0aW9uOiByZXF1ZXN0LnF1ZXN0aW9uLFxuICAgICAgICAgICAgYW5zd2VyLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFwibWVtb3J5OnNhdmUtZmFpbGVkXCIsIHtcbiAgICAgICAgICAgIHNwYWNlSWQ6IHNwYWNlLnNwYWNlSWQsXG4gICAgICAgICAgICBlcnJvcjogdG9FcnJvcihlcnJvciksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInR1cm46ZG9uZVwiLCB7XG4gICAgICAgIHNwYWNlSWQ6IHNwYWNlLnNwYWNlSWQsXG4gICAgICAgIGNvbnZlcnNhdGlvbklkOiBhbm5vdW5jZWQ/LmNvbnZlcnNhdGlvbklkLFxuICAgICAgICBzdGF0dXM6IGZpbmFsTWVzc2FnZS5zdGF0dXMsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqIERlbGV0ZSBvbmUgR2VuaWUgY29udmVyc2F0aW9uIG93bmVkIGJ5IHRoZSBjYWxsZXIuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlR2VuaWVUaHJlYWQoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICBzcGFjZTogR2VuaWVDaGF0U3BhY2UsXG4gIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgY2xpZW50LmdlbmllLmRlbGV0ZUNvbnZlcnNhdGlvbih7XG4gICAgc3BhY2VfaWQ6IHNwYWNlLnNwYWNlSWQsXG4gICAgY29udmVyc2F0aW9uX2lkOiBjb252ZXJzYXRpb25JZCxcbiAgfSk7XG59XG5cbi8qKiBEZWxldGUgb25lIEdlbmllIG1lc3NhZ2UsIGFjY2VwdGluZyBlaXRoZXIgaXRzIGFuc3dlciBvciBxdWVzdGlvbiB0cmFuc2NyaXB0IGlkLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUdlbmllVGhyZWFkTWVzc2FnZShcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gIHNwYWNlOiBHZW5pZUNoYXRTcGFjZSxcbiAgY29udmVyc2F0aW9uSWQ6IHN0cmluZyxcbiAgbWVzc2FnZUlkOiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgY2xpZW50LmdlbmllLmRlbGV0ZUNvbnZlcnNhdGlvbk1lc3NhZ2Uoe1xuICAgIHNwYWNlX2lkOiBzcGFjZS5zcGFjZUlkLFxuICAgIGNvbnZlcnNhdGlvbl9pZDogY29udmVyc2F0aW9uSWQsXG4gICAgbWVzc2FnZV9pZDogbWVzc2FnZUlkLmVuZHNXaXRoKFFVRVNUSU9OX0lEX1NVRkZJWClcbiAgICAgID8gbWVzc2FnZUlkLnNsaWNlKDAsIC1RVUVTVElPTl9JRF9TVUZGSVgubGVuZ3RoKVxuICAgICAgOiBtZXNzYWdlSWQsXG4gIH0pO1xufVxuIl19
|
package/lib/src/telemetry.js
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
import { StringDecoder } from "node:string_decoder";
|
|
21
21
|
import { USER_TRACE_ATTRIBUTE, registerNativeSpanProcessor, getRequestTags, } from "@dbx-tools/appkit";
|
|
22
22
|
import { log, isDatabricksAppEnv, parse, isRecord, trimToNull, USER_EMAIL_HEADER, USER_ID_HEADER, } from "@dbx-tools/shared-core";
|
|
23
|
-
import { MLFLOW_TRACE_ID_HEADER, THREAD_ID_HEADER, THREAD_ID_QUERY, } from "@dbx-tools/shared-mastra";
|
|
23
|
+
import { MLFLOW_TRACE_ID_HEADER, MLFLOW_TRACE_PART_TYPE, THREAD_ID_HEADER, THREAD_ID_QUERY, } from "@dbx-tools/shared-mastra";
|
|
24
24
|
import { MASTRA_RESOURCE_ID_KEY, MASTRA_THREAD_ID_KEY } from "@mastra/core/request-context";
|
|
25
25
|
import { context, createContextKey, SpanKind, SpanStatusCode, trace, } from "@opentelemetry/api";
|
|
26
26
|
import { getRPCMetadata, RPCType } from "@opentelemetry/core";
|
|
@@ -186,6 +186,14 @@ function stampMlflowTraceId(res, traceId) {
|
|
|
186
186
|
return;
|
|
187
187
|
res.setHeader(MLFLOW_TRACE_ID_HEADER, `tr-${traceId}`);
|
|
188
188
|
}
|
|
189
|
+
/** Serialize a transient trace-id part for proxies that remove custom headers. */
|
|
190
|
+
function mlflowTracePart(traceId) {
|
|
191
|
+
return `data: ${JSON.stringify({
|
|
192
|
+
type: MLFLOW_TRACE_PART_TYPE,
|
|
193
|
+
data: { traceId: `tr-${traceId}` },
|
|
194
|
+
transient: true,
|
|
195
|
+
})}\n\n`;
|
|
196
|
+
}
|
|
189
197
|
/** Return one raw prompt when the request is exactly one text-only user message. */
|
|
190
198
|
export function textOnlyChatInput(messages) {
|
|
191
199
|
if (typeof messages === "string")
|
|
@@ -583,6 +591,7 @@ export function chatTurnTelemetryMiddleware(req, res, next, options = {}) {
|
|
|
583
591
|
let genieRecorded = false;
|
|
584
592
|
let ownedSpanEnded = false;
|
|
585
593
|
let traceFinalized = false;
|
|
594
|
+
let tracePartWritten = false;
|
|
586
595
|
const passThroughWrite = res.write.bind(res);
|
|
587
596
|
const passThroughEnd = res.end.bind(res);
|
|
588
597
|
const passThroughJson = res.json.bind(res);
|
|
@@ -647,6 +656,10 @@ export function chatTurnTelemetryMiddleware(req, res, next, options = {}) {
|
|
|
647
656
|
target.span.end();
|
|
648
657
|
};
|
|
649
658
|
res.write = ((chunk, ...rest) => {
|
|
659
|
+
if (!tracePartWritten) {
|
|
660
|
+
tracePartWritten = true;
|
|
661
|
+
passThroughWrite(mlflowTracePart(traceState.traceId));
|
|
662
|
+
}
|
|
650
663
|
collector.write(chunk);
|
|
651
664
|
return passThroughWrite(chunk, ...rest);
|
|
652
665
|
});
|
|
@@ -694,4 +707,4 @@ export function attachChatTurnTelemetry(app, options = {}) {
|
|
|
694
707
|
app.use((req, res, next) => chatTurnTelemetryMiddleware(req, res, next, options));
|
|
695
708
|
logger.info("chat turn telemetry middleware attached", options);
|
|
696
709
|
}
|
|
697
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBELE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsMkJBQTJCLEVBQzNCLGNBQWMsR0FDZixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFDTCxHQUFHLEVBQ0gsa0JBQWtCLEVBQ2xCLEtBQUssRUFDTCxRQUFRLEVBQ1IsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixjQUFjLEdBQ2YsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUNoQixlQUFlLEdBQ2hCLE1BQU0sMEJBQTBCLENBQUM7QUFFbEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUYsT0FBTyxFQUNMLE9BQU8sRUFDUCxnQkFBZ0IsRUFDaEIsUUFBUSxFQUNSLGNBQWMsRUFDZCxLQUFLLEdBR04sTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBSTlELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNoRyxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLHlCQUF5QixFQUN6Qiw0QkFBNEIsRUFDNUIseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2QiwyQkFBMkIsR0FDNUIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLDRCQUE0QixFQUM1QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLG1CQUFt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Q0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQztTQUN0QyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDOUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO1FBQzdCLElBQUksRUFBRSxDQUFDO0lBQ1QsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxHQUFvQixFQUNwQixVQUFvQyxFQUFFO0lBRXRDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsMkJBQTJCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNsRixNQUFNLENBQUMsSUFBSSxDQUFDLHlDQUF5QyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2xFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHkgZWFjaCBNYXN0cmEgY2hhdCB0dXJuJ3MgcmVxdWVzdC9yZXNwb25zZSBvbnRvIGl0cyBPVGVsIHJvb3Qgc3BhblxuICogc28gRGF0YWJyaWNrcy1tYW5hZ2VkIE1MZmxvdyBjYW4gZGlzcGxheSB0aGVtLlxuICpcbiAqIFdoeSB0aGlzIGV4aXN0czogTUxmbG93J3MgVUMgYDx0YXJnZXQ+X3RyYWNlX3VuaWZpZWRgIHZpZXcgcGlja3MgdGhlXG4gKiBvbmUgc3BhbiB3aG9zZSBgcGFyZW50X3NwYW5faWRgIGlzIGVtcHR5IGFuZCByZWFkcyByZXF1ZXN0L3Jlc3BvbnNlXG4gKiBmcm9tIGBtbGZsb3cuc3BhbklucHV0c2AgLyBgbWxmbG93LnNwYW5PdXRwdXRzYCAob3IgdGhlIGBnZW5fYWkuKmBcbiAqIGVxdWl2YWxlbnRzKSBvbiBUSEFUIHNwYW4gb25seS4gTWFzdHJhIHJlY29yZHMgdGhlIHR1cm4gb24gaXRzXG4gKiBgaW52b2tlX2FnZW50YCBjaGlsZCB1bmRlciBgbWFzdHJhLmFnZW50X3J1bi5pbnB1dGAgLyBgLm91dHB1dGAsIGtleXNcbiAqIHRoZSB2aWV3IG5ldmVyIHJlYWRzLCBzbyBjaGF0IHRyYWNlcyBhcnJpdmUgd2l0aCBib3RoIGNvbHVtbnMgbnVsbFxuICogZXZlbiB3aGVuIHRoZSBzcGFucyB0aGVtc2VsdmVzIGxvb2sgaGVhbHRoeS5cbiAqXG4gKiBBcHBLaXQncyBIVFRQIGluc3RydW1lbnRhdGlvbiByZWNvcmRzIHRoZSBzZXJ2ZXIgc3BhbiBpbiBPVGVsIFJQQyBtZXRhZGF0YSxcbiAqIHdoaWNoIHJlbWFpbnMgYXZhaWxhYmxlIGV2ZW4gd2hlbiBFeHByZXNzIG1ha2VzIGEgbWlkZGxld2FyZS1sYXllciBjaGlsZFxuICogYWN0aXZlLiBXaGVuIGluc3RydW1lbnRhdGlvbiBpcyB1bmF2YWlsYWJsZSwgdGhpcyBtb2R1bGUgY3JlYXRlcyBvbmVcbiAqIHJlcXVlc3QtbGlmZXRpbWUgc2VydmVyIHNwYW4gYW5kIHJ1bnMgTWFzdHJhIHVuZGVyIGl0LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBTdHJpbmdEZWNvZGVyIH0gZnJvbSBcIm5vZGU6c3RyaW5nX2RlY29kZXJcIjtcblxuaW1wb3J0IHtcbiAgVVNFUl9UUkFDRV9BVFRSSUJVVEUsXG4gIHJlZ2lzdGVyTmF0aXZlU3BhblByb2Nlc3NvcixcbiAgZ2V0UmVxdWVzdFRhZ3MsXG59IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHtcbiAgbG9nLFxuICBpc0RhdGFicmlja3NBcHBFbnYsXG4gIHBhcnNlLFxuICBpc1JlY29yZCxcbiAgdHJpbVRvTnVsbCxcbiAgVVNFUl9FTUFJTF9IRUFERVIsXG4gIFVTRVJfSURfSEVBREVSLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgTUxGTE9XX1RSQUNFX0lEX0hFQURFUixcbiAgVEhSRUFEX0lEX0hFQURFUixcbiAgVEhSRUFEX0lEX1FVRVJZLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQgdHlwZSB7IFRyYWNpbmdPcHRpb25zIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9vYnNlcnZhYmlsaXR5XCI7XG5pbXBvcnQgeyBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLCBNQVNUUkFfVEhSRUFEX0lEX0tFWSB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQge1xuICBjb250ZXh0LFxuICBjcmVhdGVDb250ZXh0S2V5LFxuICBTcGFuS2luZCxcbiAgU3BhblN0YXR1c0NvZGUsXG4gIHRyYWNlLFxuICB0eXBlIENvbnRleHQsXG4gIHR5cGUgU3Bhbixcbn0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuaW1wb3J0IHsgZ2V0UlBDTWV0YWRhdGEsIFJQQ1R5cGUgfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBSZWFkYWJsZVNwYW4sIFNwYW4gYXMgU2RrU3BhbiwgU3BhblByb2Nlc3NvciB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2UtYmFzZVwiO1xuaW1wb3J0IHR5cGUgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuXG5pbXBvcnQgeyBNQVNUUkFfQVVUSF9NT0RFX0tFWSwgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLCBNQVNUUkFfVVNFUl9OQU1FX0tFWSB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHtcbiAgYXBwTWxmbG93VHJhY2VJbmZvQ29uZmlndXJlZCxcbiAgZGlyZWN0TWxmbG93VHJhY2luZ0FjdGl2ZSxcbiAgaW5pdGlhbGl6ZUFwcE1sZmxvd1RyYWNlSW5mbyxcbiAgcGVyc2lzdEFwcE1sZmxvd1RyYWNlSW5mbyxcbiAgdXBkYXRlQWN0aXZlTWxmbG93VHJhY2UsXG4gIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlVGFncyxcbn0gZnJvbSBcIi4vbWxmbG93LnRzXCI7XG5pbXBvcnQge1xuICBBUFBLSVRfQUdFTlRfVFJBQ0VfUk9PVF9BVFRSLFxuICBNTEZMT1dfQUdFTlRfVEFHLFxuICBNTEZMT1dfQUdFTlRfVEFHX0FUVFIsXG4gIE1MRkxPV19HRU5JRV9UQUcsXG4gIE1MRkxPV19HRU5JRV9UQUdfQVRUUixcbiAgTUxGTE9XX0xPQ0FMX1RBRyxcbiAgTUxGTE9XX09CT19BVVRIX1RBRyxcbiAgTUxGTE9XX1NQX0FVVEhfVEFHLFxuICBNTEZMT1dfVFJBQ0VfVEFHX1BSRUZJWCxcbn0gZnJvbSBcIi4vdHJhY2UtYXR0cmlidXRlcy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL3RlbGVtZXRyeVwiKTtcblxuLyoqIENhcCBvbiBlYWNoIHBheWxvYWQgY29waWVkIG9udG8gYSBzcGFuLCBzbyBvbmUgdHVybiBjYW5ub3QgYmxvYXQgdGhlIGV4cG9ydC4gKi9cbmV4cG9ydCBjb25zdCBUUkFDRV9JT19MSU1JVCA9IDhfMDAwO1xuXG4vKiogQm91bmQgZm9yIGEgbm9uLXN0cmVhbWluZyBib2R5IGNhcHR1cmVkIHRocm91Z2ggYHJlcy5lbmRgIGluc3RlYWQgb2YgYHJlcy5qc29uYC4gKi9cbmNvbnN0IFJFU1BPTlNFX0JPRFlfTElNSVQgPSBUUkFDRV9JT19MSU1JVCAqIDQ7XG5cbi8qKiBUcmFjZXIgc2NvcGUgdXNlZCBvbmx5IHdoZW4gQXBwS2l0IGRpZCBub3QgY3JlYXRlIGEgcmVjb3JkaW5nIEhUVFAgc3Bhbi4gKi9cbmNvbnN0IENIQVRfVFVSTl9UUkFDRVIgPSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuXG4vKipcbiAqIE1vdW50LXJlbGF0aXZlIE1hc3RyYSBhZ2VudCBpbnZva2UgcGF0aHMgdGhhdCBjYXJyeSBhIGNoYXQgdHVybiBib2R5XG4gKiAoYG1lc3NhZ2VzYCkgYW5kIHN0cmVhbSBhbiBhc3Npc3RhbnQgYW5zd2VyLiBSZXN1bWUgLyBhcHByb3ZlIHZlcmJzXG4gKiBhcmUgaW50ZW50aW9uYWxseSBleGNsdWRlZDogdGhlaXIgYm9kaWVzIGFyZSB0b29sIGRlY2lzaW9ucywgbm90IHRoZVxuICogdXNlciBwcm9tcHQsIGFuZCB0aGV5IHJhcmVseSBwcm9kdWNlIGEgZnJlc2ggYW5zd2VyIHdvcnRoIHN1cmZhY2luZy5cbiAqL1xuY29uc3QgQUdFTlRfVFVSTl9ST1VURSA9IC8oPzpefFxcLykoPzphZ2VudHNcXC9bXi9dK1xcLyg/OnN0cmVhbXxnZW5lcmF0ZSl8Y2hhdFxcL1teL10rKVxcLz8kL2k7XG5cbi8qKiBBdHRyaWJ1dGUga2V5cyB0aGUgTUxmbG93IFVDIGAqX3RyYWNlX3VuaWZpZWRgIHZpZXcgcmVhZHMgZnJvbSB0aGUgcm9vdCBzcGFuLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX0lOUFVUU19BVFRSID0gXCJtbGZsb3cuc3BhbklucHV0c1wiO1xuLyoqIFJvb3Qtc3BhbiBhdHRyaWJ1dGUgY29uc3VtZWQgYXMgY2hhdCBvdXRwdXQgYnkgTUxmbG93IHVuaWZpZWQgdHJhY2Ugdmlld3MuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fT1VUUFVUU19BVFRSID0gXCJtbGZsb3cuc3Bhbk91dHB1dHNcIjtcbi8qKiBGdWxsIHNlcmlhbGl6ZWQgcmVxdWVzdCBtZXNzYWdlcyByZXRhaW5lZCB3aGVuIHRoZSBNTGZsb3cgcHJldmlldyBpcyBwbGFpbiB0ZXh0LiAqL1xuZXhwb3J0IGNvbnN0IENIQVRfTUVTU0FHRVNfQVRUUiA9IFwiYXBwa2l0Lm1hc3RyYS5jaGF0Lm1lc3NhZ2VzXCI7XG4vKiogRnVsbCBzZXJpYWxpemVkIHJlc3BvbnNlIHJldGFpbmVkIHdoZW4gdGhlIE1MZmxvdyBwcmV2aWV3IGlzIHBsYWluIHRleHQuICovXG5leHBvcnQgY29uc3QgQ0hBVF9SRVNQT05TRV9BVFRSID0gXCJhcHBraXQubWFzdHJhLmNoYXQucmVzcG9uc2VcIjtcbi8qKiBDcmVkZW50aWFsIG1vZGUgdXNlZCBieSBEYXRhYnJpY2tzIGNhbGxzIGluIHRoaXMgY2hhdCB0dXJuLiAqL1xuZXhwb3J0IGNvbnN0IENIQVRfSURFTlRJVFlfQVRUUiA9IFwiYXBwa2l0Lm1hc3RyYS5pZGVudGl0eS5tb2RlXCI7XG4vKiogV2hldGhlciB0aGUgc3RyZWFtZWQgdHVybiBlbWl0dGVkIGEgR2VuaWUgdG9vbCBvciBwcm9ncmVzcyBldmVudC4gKi9cbmV4cG9ydCBjb25zdCBDSEFUX0dFTklFX1VTRURfQVRUUiA9IFwiYXBwa2l0Lm1hc3RyYS5nZW5pZS51c2VkXCI7XG4vKipcbiAqIE1MZmxvdyBzcGFuLXR5cGUgYXR0cmlidXRlLiBEYXRhYnJpY2tzIG1hcHMgdGhpcyAob3IgYGdlbl9haS5vcGVyYXRpb24ubmFtZWApXG4gKiBvbnRvIHRoZSB0eXBlIGNoaXAgaW4gdGhlIGV4cGVyaW1lbnQgVUkuIEN1c3RvbSB2YWx1ZXMgc3VjaCBhcyBgR0VOSUVgIGFyZVxuICogYWxsb3dlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX1RZUEVfQVRUUiA9IFwibWxmbG93LnNwYW5UeXBlXCI7XG4vKiogR2VuQUkgc2VtYW50aWMtY29udmVudGlvbiBvcGVyYXRpb24gbmFtZSwgYW4gYWx0ZXJuYXRlIHNwYW4tdHlwZSBzb3VyY2UuICovXG5leHBvcnQgY29uc3QgR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFIgPSBcImdlbl9haS5vcGVyYXRpb24ubmFtZVwiO1xuLyoqIFJvb3Qtc3BhbiBzZXNzaW9uIGlkIHRoYXQgZW5hYmxlcyB0aGUgTUxmbG93IFNlc3Npb25zIHRhYi4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU0VTU0lPTl9BVFRSID0gXCJzZXNzaW9uLmlkXCI7XG4vKiogUm9vdC1zcGFuIHR5cGUgZm9yIGEgTWFzdHJhIGFnZW50IHR1cm4uICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fVFlQRV9BR0VOVCA9IFwiQUdFTlRcIjtcbi8qKiBTcGFuIHR5cGUgZm9yIGFuIGBhc2tfZ2VuaWVgIHRvb2wgY2FsbC4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU1BBTl9UWVBFX0dFTklFID0gXCJHRU5JRVwiO1xuXG4vKiogUm9vdC1zcGFuIG1ldGFkYXRhIGtub3duIGJlZm9yZSBhIGNoYXQgcmVxdWVzdCBpcyBkaXNwYXRjaGVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGF0VHVyblRlbGVtZXRyeU9wdGlvbnMge1xuICByZWFkb25seSBpZGVudGl0eT86XG4gICAgXCJvYm9cIiB8IFwic2VydmljZS1wcmluY2lwYWxcIiB8ICgocmVxdWVzdDogZXhwcmVzcy5SZXF1ZXN0KSA9PiBcIm9ib1wiIHwgXCJzZXJ2aWNlLXByaW5jaXBhbFwiKTtcbiAgLyoqIEluaXRpYWwgdHJhY2UgdGFncyBkZXJpdmVkIGZyb20gdGhlIGluYm91bmQgcmVxdWVzdC4gKi9cbiAgcmVhZG9ubHkgdGFncz86XG4gICAgfCBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBDaGF0VHJhY2VUYWdWYWx1ZSB8IHVuZGVmaW5lZD4+XG4gICAgfCAoKHJlcXVlc3Q6IGV4cHJlc3MuUmVxdWVzdCkgPT4gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQ2hhdFRyYWNlVGFnVmFsdWUgfCB1bmRlZmluZWQ+Pik7XG59XG5cbmludGVyZmFjZSBUcmFjZVRhcmdldCB7XG4gIHNwYW46IFNwYW47XG4gIG93bmVkOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgQ2hhdFRyYWNlU3RhdGUge1xuICByZWFkb25seSB0YWdzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICByZWFkb25seSB0cmFjZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhcmVudFNwYW5JZD86IHN0cmluZztcbiAgZmlyc3RNb2RlbD86IHN0cmluZztcbiAgdXNlcj86IHN0cmluZztcbn1cblxuLyoqIFZhbHVlcyBhY2NlcHRlZCBieSByZXF1ZXN0LXNjb3BlZCB0cmFjZS10YWcgaW5qZWN0aW9uIGhlbHBlcnMuICovXG5leHBvcnQgdHlwZSBDaGF0VHJhY2VUYWdWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XG5cbmNvbnN0IENIQVRfVFJBQ0VfU1RBVEVfS0VZID0gY3JlYXRlQ29udGV4dEtleShcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYS9jaGF0LXRyYWNlLXN0YXRlXCIpO1xuXG4vKiogT3BlblRlbGVtZXRyeSdzIHNlbnRpbmVsIGZvciBcIm5vIHZhbGlkIHRyYWNlXCIgLSAzMiB6ZXJvIGhleCBjaGFycy4gKi9cbmNvbnN0IElOVkFMSURfVFJBQ0VfSUQgPSBcIjBcIi5yZXBlYXQoMzIpO1xuXG4vKipcbiAqIE1hcmsgdGhlIGFjdGl2ZSBzcGFuIGFzIGEgR2VuaWUgY2FsbCBzbyB0aGUgZXhwZXJpbWVudCBVSSB0eXBlcyBpdCBgR0VOSUVgXG4gKiBhbmQgdGFncyB0aGUgdHJhY2UgYGdlbmllPXRydWVgLiBTYWZlIG5vLW9wIHdoZW4gbm8gcmVjb3JkaW5nIHNwYW4gaXMgYWN0aXZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhbXBHZW5pZVRvb2xTcGFuKHNwYW46IFNwYW4gfCB1bmRlZmluZWQgPSB0cmFjZS5nZXRBY3RpdmVTcGFuKCkpOiB2b2lkIHtcbiAgaWYgKCFzcGFuPy5pc1JlY29yZGluZygpKSByZXR1cm47XG4gIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19TUEFOX1RZUEVfQVRUUiwgTUxGTE9XX1NQQU5fVFlQRV9HRU5JRSk7XG4gIHNwYW4uc2V0QXR0cmlidXRlKEdFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSLCBcImV4ZWN1dGVfdG9vbFwiKTtcbiAgc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX0dFTklFX1RBR19BVFRSLCBcInRydWVcIik7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RIZWFkZXIocmVxOiBleHByZXNzLlJlcXVlc3QsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZyb21NZXRob2QgPSB0eXBlb2YgcmVxLmhlYWRlciA9PT0gXCJmdW5jdGlvblwiID8gdHJpbVRvTnVsbChyZXEuaGVhZGVyKG5hbWUpKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGZyb21NZXRob2QpIHJldHVybiBmcm9tTWV0aG9kO1xuICBjb25zdCByYXcgPSByZXEuaGVhZGVycz8uW25hbWUudG9Mb3dlckNhc2UoKV07XG4gIGNvbnN0IHZhbHVlID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3WzBdIDogcmF3O1xuICByZXR1cm4gdHJpbVRvTnVsbCh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHVuZGVmaW5lZCkgPz8gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0UXVlcnkocmVxOiBleHByZXNzLlJlcXVlc3QsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhdyA9IHJlcS5xdWVyeT8uW25hbWVdO1xuICBjb25zdCB2YWx1ZSA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhd1swXSA6IHJhdztcbiAgcmV0dXJuIHRyaW1Ub051bGwodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB1bmRlZmluZWQpID8/IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc3RhbXBNbGZsb3dBY3RvcihzcGFuOiBTcGFuLCByZXE6IGV4cHJlc3MuUmVxdWVzdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0SGVhZGVyKHJlcSwgVVNFUl9FTUFJTF9IRUFERVIpID8/IHJlcXVlc3RIZWFkZXIocmVxLCBVU0VSX0lEX0hFQURFUik7XG4gIGlmICh1c2VyKSBzcGFuLnNldEF0dHJpYnV0ZShVU0VSX1RSQUNFX0FUVFJJQlVURSwgdXNlcik7XG4gIGNvbnN0IHNlc3Npb24gPSByZXF1ZXN0SGVhZGVyKHJlcSwgVEhSRUFEX0lEX0hFQURFUikgPz8gcmVxdWVzdFF1ZXJ5KHJlcSwgVEhSRUFEX0lEX1FVRVJZKTtcbiAgaWYgKHNlc3Npb24pIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19TRVNTSU9OX0FUVFIsIHNlc3Npb24pO1xuICByZXR1cm4gdXNlcjtcbn1cblxuZnVuY3Rpb24gdHJhY2VJZChzcGFuOiBTcGFuIHwgdW5kZWZpbmVkID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSBzcGFuPy5zcGFuQ29udGV4dCgpLnRyYWNlSWQ7XG4gIHJldHVybiB2YWx1ZSAmJiB2YWx1ZSAhPT0gSU5WQUxJRF9UUkFDRV9JRCA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpOiBDaGF0VHJhY2VTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZXh0LmFjdGl2ZSgpLmdldFZhbHVlKENIQVRfVFJBQ0VfU1RBVEVfS0VZKSBhcyBDaGF0VHJhY2VTdGF0ZSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBCaW5kIGEgTWFzdHJhIGFnZW50IHJ1biB0byB0aGUgdHJhY2Ugc2VsZWN0ZWQgYnkgY2hhdCB0ZWxlbWV0cnkuXG4gKlxuICogRGF0YWJyaWNrcyBBcHBzIHVzZXMgYSBkZWRpY2F0ZWQgYWdlbnQgdHJhY2UgYmVjYXVzZSBldmVudGVkIGFnZW50cyBmaW5pc2hcbiAqIGJlZm9yZSB0aGUgSFRUUCBzZXJ2ZXIgc3Bhbi4gUHJvbW90aW5nIE1MZmxvdyB0cmFjZSBpbmZvIGFmdGVyIHRoZSBhZ2VudCByb290XG4gKiBjbG9zZXMgYXZvaWRzIHRoZSBzaWRlY2FyIHJlcGxhY2luZyBjbGVhbiBwcmV2aWV3cyBhbmQgdGFncyB3aXRoIGVtcHR5IEhUVFBcbiAqIHRyYWNlIG1ldGFkYXRhLiBPdGhlciBydW50aW1lcyByZXRhaW4gdGhlIGV4aXN0aW5nIEhUVFAvbG9jYWwgcGFyZW50YWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0aXZlQ2hhdFRyYWNpbmdPcHRpb25zKFxuICBvcHRpb25zOiBUcmFjaW5nT3B0aW9ucyB8IHVuZGVmaW5lZCxcbik6IFRyYWNpbmdPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhdGUgPSBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpO1xuICBpZiAoIXN0YXRlKSByZXR1cm4gb3B0aW9ucztcbiAgcmV0dXJuIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHRyYWNlSWQ6IHN0YXRlLnRyYWNlSWQsXG4gICAgLi4uKHN0YXRlLnBhcmVudFNwYW5JZCA/IHsgcGFyZW50U3BhbklkOiBzdGF0ZS5wYXJlbnRTcGFuSWQgfSA6IHsgcGFyZW50U3BhbklkOiB1bmRlZmluZWQgfSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNldENoYXRUcmFjZVRhZyhzdGF0ZTogQ2hhdFRyYWNlU3RhdGUsIG5hbWU6IHN0cmluZywgdmFsdWU6IENoYXRUcmFjZVRhZ1ZhbHVlKTogdm9pZCB7XG4gIGNvbnN0IHRhZyA9IHRyaW1Ub051bGwobmFtZSk7XG4gIGlmICghdGFnKSByZXR1cm47XG4gIHN0YXRlLnRhZ3Muc2V0KHRhZywgU3RyaW5nKHZhbHVlKSk7XG59XG5cbi8qKiBJbmplY3Qgb25lIE1MZmxvdyB0cmFjZSB0YWcgaW50byB0aGUgYWN0aXZlIGNoYXQgcmVxdWVzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBY3RpdmVUcmFjZVRhZyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBDaGF0VHJhY2VUYWdWYWx1ZSA9IHRydWUpOiB2b2lkIHtcbiAgY29uc3Qgc3RhdGUgPSBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpO1xuICBpZiAoc3RhdGUpIHNldENoYXRUcmFjZVRhZyhzdGF0ZSwgbmFtZSwgdmFsdWUpO1xufVxuXG4vKiogSW5qZWN0IG11bHRpcGxlIE1MZmxvdyB0cmFjZSB0YWdzIGludG8gdGhlIGFjdGl2ZSBjaGF0IHJlcXVlc3QuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VUYWdzKFxuICB0YWdzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBDaGF0VHJhY2VUYWdWYWx1ZSB8IHVuZGVmaW5lZD4+LFxuKTogdm9pZCB7XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKCFzdGF0ZSkgcmV0dXJuO1xuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGFncykpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgc2V0Q2hhdFRyYWNlVGFnKHN0YXRlLCBuYW1lLCB2YWx1ZSk7XG4gIH1cbn1cblxuLyoqIFJlY29yZCB0aGUgZmlyc3Qgc2VsZWN0ZWQgbW9kZWwgYXMgdGhlIGFjdGl2ZSBjaGF0IHRyYWNlJ3MgYGFnZW50YCB0YWcuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VNb2RlbChtb2RlbElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgdmFsdWUgPSB0cmltVG9OdWxsKG1vZGVsSWQpO1xuICBpZiAoIXZhbHVlKSByZXR1cm47XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKCFzdGF0ZSB8fCBzdGF0ZS5maXJzdE1vZGVsKSByZXR1cm47XG4gIHN0YXRlLmZpcnN0TW9kZWwgPSB2YWx1ZTtcbiAgc2V0Q2hhdFRyYWNlVGFnKHN0YXRlLCBNTEZMT1dfQUdFTlRfVEFHLCB2YWx1ZSk7XG4gIGNvbnN0IHNwYW4gPSB0cmFjZS5nZXRBY3RpdmVTcGFuKCk7XG4gIGlmIChzcGFuPy5pc1JlY29yZGluZygpKSBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfQUdFTlRfVEFHX0FUVFIsIHZhbHVlKTtcbiAgdXBkYXRlQWN0aXZlTWxmbG93VHJhY2VUYWdzKHsgW01MRkxPV19BR0VOVF9UQUddOiB2YWx1ZSB9KTtcbn1cblxuLyoqIFJlY29yZCB0aGUgYmVzdCByZXNvbHZlZCB1c2VyIGlkZW50aWZpZXIgb24gdGhlIGFjdGl2ZSBjaGF0IHRyYWNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEFjdGl2ZVRyYWNlVXNlcih1c2VyOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgY29uc3QgdmFsdWUgPSB0cmltVG9OdWxsKHVzZXIpO1xuICBpZiAoIXZhbHVlKSByZXR1cm47XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKHN0YXRlKSBzdGF0ZS51c2VyID0gdmFsdWU7XG59XG5cbi8qKiBSZWNvcmQgb25lIERhdGFicmlja3MgYXV0aGVudGljYXRpb24gbW9kZSB1c2VkIGR1cmluZyB0aGUgYWN0aXZlIGNoYXQgdHJhY2UuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VBdXRoKGF1dGg6IFwib2JvXCIgfCBcInNlcnZpY2UtcHJpbmNpcGFsXCIpOiB2b2lkIHtcbiAgcmVjb3JkQWN0aXZlVHJhY2VUYWcoYXV0aCA9PT0gXCJvYm9cIiA/IE1MRkxPV19PQk9fQVVUSF9UQUcgOiBNTEZMT1dfU1BfQVVUSF9UQUcpO1xufVxuXG4vKiogUHVibGlzaCB0aGUgdHVybidzIE1MZmxvdyB0cmFjZSBpZCBiZWZvcmUgdGhlIGhhbmRsZXIgd3JpdGVzIHRoZSBib2R5LiAqL1xuZnVuY3Rpb24gc3RhbXBNbGZsb3dUcmFjZUlkKHJlczogZXhwcmVzcy5SZXNwb25zZSwgdHJhY2VJZDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChyZXMuaGVhZGVyc1NlbnQpIHJldHVybjtcbiAgaWYgKCF0cmFjZUlkIHx8IHRyYWNlSWQgPT09IElOVkFMSURfVFJBQ0VfSUQpIHJldHVybjtcbiAgcmVzLnNldEhlYWRlcihNTEZMT1dfVFJBQ0VfSURfSEVBREVSLCBgdHItJHt0cmFjZUlkfWApO1xufVxuXG4vKiogUmV0dXJuIG9uZSByYXcgcHJvbXB0IHdoZW4gdGhlIHJlcXVlc3QgaXMgZXhhY3RseSBvbmUgdGV4dC1vbmx5IHVzZXIgbWVzc2FnZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0T25seUNoYXRJbnB1dChtZXNzYWdlczogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgbWVzc2FnZXMgPT09IFwic3RyaW5nXCIpIHJldHVybiBtZXNzYWdlcyB8fCB1bmRlZmluZWQ7XG4gIGlmICghQXJyYXkuaXNBcnJheShtZXNzYWdlcykgfHwgbWVzc2FnZXMubGVuZ3RoICE9PSAxKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXNbMF07XG4gIGlmICghaXNSZWNvcmQobWVzc2FnZSkgfHwgbWVzc2FnZS5yb2xlICE9PSBcInVzZXJcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQgPT09IFwic3RyaW5nXCIpIHJldHVybiBtZXNzYWdlLmNvbnRlbnQgfHwgdW5kZWZpbmVkO1xuICByZXR1cm4gdGV4dEZyb21QYXJ0cyhtZXNzYWdlLnBhcnRzKSA/PyB0ZXh0RnJvbVBhcnRzKG1lc3NhZ2UuY29udGVudCk7XG59XG5cbmZ1bmN0aW9uIHRleHRGcm9tUGFydHModmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdGV4dDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBwYXJ0IG9mIHZhbHVlKSB7XG4gICAgaWYgKCFpc1JlY29yZChwYXJ0KSB8fCBwYXJ0LnR5cGUgIT09IFwidGV4dFwiIHx8IHR5cGVvZiBwYXJ0LnRleHQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRleHQucHVzaChwYXJ0LnRleHQpO1xuICB9XG4gIGNvbnN0IGpvaW5lZCA9IHRleHQuam9pbihcIlwiKTtcbiAgcmV0dXJuIGpvaW5lZCB8fCB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZWQodmFsdWU6IHVua25vd24sIGxpbWl0ID0gVFJBQ0VfSU9fTElNSVQpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpPy5zbGljZSgwLCBsaW1pdCkgPz8gU3RyaW5nKHZhbHVlKS5zbGljZSgwLCBsaW1pdCk7XG59XG5cbmZ1bmN0aW9uIHNzZUZyYW1lKGxpbmU6IHN0cmluZyk6IHVua25vd24ge1xuICBpZiAoIWxpbmUuc3RhcnRzV2l0aChcImRhdGE6XCIpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gcGFyc2UobGluZS5zbGljZSg1KSk7XG59XG5cbmZ1bmN0aW9uIHZhbHVlVXNlc0dlbmllKHZhbHVlOiB1bmtub3duLCBkZXB0aCA9IDApOiBib29sZWFuIHtcbiAgaWYgKGRlcHRoID4gMykgcmV0dXJuIGZhbHNlO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5zb21lKChpdGVtKSA9PiB2YWx1ZVVzZXNHZW5pZShpdGVtLCBkZXB0aCArIDEpKTtcbiAgaWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKFxuICAgIHZhbHVlLnR5cGUgPT09IFwiZGF0YS1nZW5pZS1wcm9ncmVzc1wiIHx8XG4gICAgdmFsdWUudHlwZSA9PT0gXCJhc2tfZ2VuaWVfZG9uZVwiIHx8XG4gICAgdmFsdWUudG9vbE5hbWUgPT09IFwiYXNrX2dlbmllXCIgfHxcbiAgICB2YWx1ZS50b29sX25hbWUgPT09IFwiYXNrX2dlbmllXCIgfHxcbiAgICB2YWx1ZS5uYW1lID09PSBcImFza19nZW5pZVwiXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBbXCJkYXRhXCIsIFwiZXZlbnRcIiwgXCJwYXlsb2FkXCJdLnNvbWUoKGtleSkgPT4gdmFsdWVVc2VzR2VuaWUodmFsdWVba2V5XSwgZGVwdGggKyAxKSk7XG59XG5cbi8qKiBSZXR1cm4gdGhlIGFzc2lzdGFudCB0ZXh0IGZyb20gb25lIFNTRSBsaW5lLCBvciBhbiBlbXB0eSBzdHJpbmcuICovXG5mdW5jdGlvbiBhc3Npc3RhbnRUZXh0RnJvbVNzZUxpbmUobGluZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFzc2lzdGFudFRleHRGcm9tU3NlRnJhbWUoc3NlRnJhbWUobGluZSkpO1xufVxuXG5mdW5jdGlvbiBhc3Npc3RhbnRUZXh0RnJvbVNzZUZyYW1lKGZyYW1lOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKCFpc1JlY29yZChmcmFtZSkgfHwgZnJhbWUudHlwZSAhPT0gXCJ0ZXh0LWRlbHRhXCIpIHJldHVybiBcIlwiO1xuICBjb25zdCB0ZXh0ID1cbiAgICB0eXBlb2YgZnJhbWUuZGVsdGEgPT09IFwic3RyaW5nXCJcbiAgICAgID8gZnJhbWUuZGVsdGFcbiAgICAgIDogaXNSZWNvcmQoZnJhbWUucGF5bG9hZClcbiAgICAgICAgPyBmcmFtZS5wYXlsb2FkLnRleHRcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2YgdGV4dCA9PT0gXCJzdHJpbmdcIiA/IHRleHQgOiBcIlwiO1xufVxuXG4vKipcbiAqIENvbmNhdGVuYXRlIHRoZSBhc3Npc3RhbnQncyBhbnN3ZXIgb3V0IG9mIGFuIEFJIFNESyBTU0UgdHJhbnNjcmlwdC5cbiAqXG4gKiBUaGUgYWdlbnQgc3RyZWFtcyBpdHMgcmVwbHkgYXMgYHRleHQtZGVsdGFgIGZyYW1lc1xuICogKGBkYXRhOiB7XCJ0eXBlXCI6XCJ0ZXh0LWRlbHRhXCIsXCJwYXlsb2FkXCI6e1widGV4dFwiOlwiLi4uXCJ9fWApLCBzbyB0aGUgZnVsbFxuICogYW5zd2VyIG9ubHkgZXZlciBleGlzdHMgYXMgZGVsdGFzIG9uIHRoZSB3aXJlIGFuZCBoYXMgdG8gYmVcbiAqIHJlYXNzZW1ibGVkIGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3Npc3RhbnRUZXh0RnJvbVNzZShib2R5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGJvZHkuc3BsaXQoXCJcXG5cIikpIHtcbiAgICBjb25zdCB0ZXh0ID0gYXNzaXN0YW50VGV4dEZyb21Tc2VMaW5lKGxpbmUpO1xuICAgIGlmICh0ZXh0KSBwYXJ0cy5wdXNoKHRleHQpO1xuICB9XG4gIHJldHVybiBwYXJ0cy5qb2luKFwiXCIpLnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUKTtcbn1cblxuLyoqIFJlYWQgdGhlIGZpbmFsIGFzc2lzdGFudCB0ZXh0IGZyb20gYSBub24tc3RyZWFtaW5nIE1hc3RyYSByZXNwb25zZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3Npc3RhbnRUZXh0RnJvbUpzb24oYm9keTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICghaXNSZWNvcmQoYm9keSkgfHwgdHlwZW9mIGJvZHkudGV4dCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIFwiXCI7XG4gIHJldHVybiBib2R5LnRleHQuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpO1xufVxuXG5jb25zdCBNQVNUUkFfQUdFTlRfSU5QVVRfQVRUUiA9IFwibWFzdHJhLmFnZW50X3J1bi5pbnB1dFwiO1xuY29uc3QgTUFTVFJBX0FHRU5UX09VVFBVVF9BVFRSID0gXCJtYXN0cmEuYWdlbnRfcnVuLm91dHB1dFwiO1xuY29uc3QgR0VOX0FJX1JFUVVFU1RfTU9ERUxfQVRUUiA9IFwiZ2VuX2FpLnJlcXVlc3QubW9kZWxcIjtcbmNvbnN0IEdFTl9BSV9BR0VOVF9JRF9BVFRSID0gXCJnZW5fYWkuYWdlbnQuaWRcIjtcbmNvbnN0IEdFTl9BSV9BR0VOVF9OQU1FX0FUVFIgPSBcImdlbl9haS5hZ2VudC5uYW1lXCI7XG5jb25zdCBNQVNUUkFfTU9ERUxfTUVUQURBVEFfQVRUUiA9IFwibWFzdHJhLm1ldGFkYXRhLm1vZGVsTWV0YWRhdGFcIjtcbmNvbnN0IE1BU1RSQV9NRVRBREFUQV9QUkVGSVggPSBcIm1hc3RyYS5tZXRhZGF0YS5cIjtcblxuaW50ZXJmYWNlIEFwcE1sZmxvd1RyYWNlU3RhdGUge1xuICByZWFkb25seSB0YWdzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICBnZW5pZTogYm9vbGVhbjtcbiAgbW9kZWw/OiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGF0dHJpYnV0ZVN0cmluZyhzcGFuOiBSZWFkYWJsZVNwYW4sIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gc3Bhbi5hdHRyaWJ1dGVzW25hbWVdO1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gKHRyaW1Ub051bGwodmFsdWUpID8/IHVuZGVmaW5lZCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIG1ldGFkYXRhQXR0cmlidXRlKGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke01BU1RSQV9NRVRBREFUQV9QUkVGSVh9JHtrZXl9YDtcbn1cblxuZnVuY3Rpb24gbW9kZWxGcm9tU3BhbihzcGFuOiBSZWFkYWJsZVNwYW4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkaXJlY3QgPSBhdHRyaWJ1dGVTdHJpbmcoc3BhbiwgR0VOX0FJX1JFUVVFU1RfTU9ERUxfQVRUUik7XG4gIGlmIChkaXJlY3QpIHJldHVybiBkaXJlY3Q7XG4gIGNvbnN0IG1ldGFkYXRhID0gcGFyc2UoYXR0cmlidXRlU3RyaW5nKHNwYW4sIE1BU1RSQV9NT0RFTF9NRVRBREFUQV9BVFRSKSk7XG4gIHJldHVybiBpc1JlY29yZChtZXRhZGF0YSkgJiYgdHlwZW9mIG1ldGFkYXRhLm1vZGVsSWQgPT09IFwic3RyaW5nXCJcbiAgICA/ICh0cmltVG9OdWxsKG1ldGFkYXRhLm1vZGVsSWQpID8/IHVuZGVmaW5lZClcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc3BhblVzZXNHZW5pZShzcGFuOiBSZWFkYWJsZVNwYW4pOiBib29sZWFuIHtcbiAgaWYgKHNwYW4uYXR0cmlidXRlc1tNTEZMT1dfR0VOSUVfVEFHX0FUVFJdID09PSBcInRydWVcIikgcmV0dXJuIHRydWU7XG4gIGlmICgvXFxiYXNrX2dlbmllKD86X3xcXGIpL2kudGVzdChzcGFuLm5hbWUpKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIFtcImdlbl9haS50b29sLm5hbWVcIiwgXCJtYXN0cmEudG9vbF9jYWxsLm5hbWVcIl0uc29tZSgobmFtZSkgPT5cbiAgICAvXmFza19nZW5pZSg/Ol98JCkvaS50ZXN0KGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBuYW1lKSA/PyBcIlwiKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdFRyYWNlVGFncyhzcGFuOiBSZWFkYWJsZVNwYW4sIHN0YXRlOiBBcHBNbGZsb3dUcmFjZVN0YXRlKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzcGFuLmF0dHJpYnV0ZXMpKSB7XG4gICAgaWYgKCFuYW1lLnN0YXJ0c1dpdGgoTUxGTE9XX1RSQUNFX1RBR19QUkVGSVgpKSBjb250aW51ZTtcbiAgICBjb25zdCB0YWcgPSBuYW1lLnNsaWNlKE1MRkxPV19UUkFDRV9UQUdfUFJFRklYLmxlbmd0aCk7XG4gICAgaWYgKFxuICAgICAgdGFnICYmXG4gICAgICAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKVxuICAgICkge1xuICAgICAgc3RhdGUudGFncy5zZXQodGFnLCBTdHJpbmcodmFsdWUpKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaHJUaW1lTWlsbGlzZWNvbmRzKHZhbHVlOiByZWFkb25seSBbbnVtYmVyLCBudW1iZXJdKTogbnVtYmVyIHtcbiAgcmV0dXJuIHZhbHVlWzBdICogMV8wMDAgKyB2YWx1ZVsxXSAvIDFfMDAwXzAwMDtcbn1cblxuZnVuY3Rpb24gcHJldmlld0lucHV0KHNwYW46IFJlYWRhYmxlU3Bhbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhdyA9IGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBNQVNUUkFfQUdFTlRfSU5QVVRfQVRUUik7XG4gIGlmICghcmF3KSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gKHRleHRPbmx5Q2hhdElucHV0KHBhcnNlKHJhdykpID8/IHJhdykuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpO1xufVxuXG5mdW5jdGlvbiBwcmV2aWV3T3V0cHV0KHNwYW46IFJlYWRhYmxlU3Bhbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhdyA9IGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBNQVNUUkFfQUdFTlRfT1VUUFVUX0FUVFIpO1xuICBpZiAoIXJhdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2UocmF3KTtcbiAgY29uc3QgdGV4dCA9IGFzc2lzdGFudFRleHRGcm9tSnNvbihwYXJzZWQpIHx8ICh0eXBlb2YgcGFyc2VkID09PSBcInN0cmluZ1wiID8gcGFyc2VkIDogcmF3KTtcbiAgcmV0dXJuIHRleHQuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpO1xufVxuXG4vKiogUHJvbW90ZSB0aGUgYWN0dWFsIE1hc3RyYSBgaW52b2tlX2FnZW50YCB0cmFjZSBleHBvcnRlZCBieSBBcHBLaXQncyBwcm92aWRlci4gKi9cbmV4cG9ydCBjbGFzcyBBcHBNbGZsb3dUcmFjZUluZm9TcGFuUHJvY2Vzc29yIGltcGxlbWVudHMgU3BhblByb2Nlc3NvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhY2VzID0gbmV3IE1hcDxzdHJpbmcsIEFwcE1sZmxvd1RyYWNlU3RhdGU+KCk7XG5cbiAgb25TdGFydChzcGFuOiBTZGtTcGFuLCBfcGFyZW50Q29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuICAgIGNvbnN0IHRyYWNlSWQgPSBzcGFuLnNwYW5Db250ZXh0KCkudHJhY2VJZDtcbiAgICBpZiAoIXRoaXMudHJhY2VzLmhhcyh0cmFjZUlkKSkge1xuICAgICAgdGhpcy50cmFjZXMuc2V0KHRyYWNlSWQsIHsgdGFnczogbmV3IE1hcCgpLCBnZW5pZTogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgb25FbmQoc3BhbjogUmVhZGFibGVTcGFuKTogdm9pZCB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHNwYW4uc3BhbkNvbnRleHQoKS50cmFjZUlkO1xuICAgIGNvbnN0IHN0YXRlOiBBcHBNbGZsb3dUcmFjZVN0YXRlID0gdGhpcy50cmFjZXMuZ2V0KHRyYWNlSWQpID8/IHtcbiAgICAgIHRhZ3M6IG5ldyBNYXAoKSxcbiAgICAgIGdlbmllOiBmYWxzZSxcbiAgICB9O1xuICAgIHRoaXMudHJhY2VzLnNldCh0cmFjZUlkLCBzdGF0ZSk7XG4gICAgY29sbGVjdFRyYWNlVGFncyhzcGFuLCBzdGF0ZSk7XG4gICAgc3RhdGUubW9kZWwgPz89IG1vZGVsRnJvbVNwYW4oc3Bhbik7XG4gICAgc3RhdGUuZ2VuaWUgfHw9IHNwYW5Vc2VzR2VuaWUoc3Bhbik7XG5cbiAgICBpZiAoYXR0cmlidXRlU3RyaW5nKHNwYW4sIEdFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSKSAhPT0gXCJpbnZva2VfYWdlbnRcIikge1xuICAgICAgaWYgKCFzcGFuLnBhcmVudFNwYW5Db250ZXh0Py5zcGFuSWQpIHRoaXMudHJhY2VzLmRlbGV0ZSh0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhZ2VudCA9XG4gICAgICBzdGF0ZS5tb2RlbCA/P1xuICAgICAgYXR0cmlidXRlU3RyaW5nKHNwYW4sIEdFTl9BSV9BR0VOVF9JRF9BVFRSKSA/P1xuICAgICAgYXR0cmlidXRlU3RyaW5nKHNwYW4sIEdFTl9BSV9BR0VOVF9OQU1FX0FUVFIpO1xuICAgIGlmIChhZ2VudCkgc3RhdGUudGFncy5zZXQoTUxGTE9XX0FHRU5UX1RBRywgYWdlbnQpO1xuICAgIGlmIChzdGF0ZS5nZW5pZSkgc3RhdGUudGFncy5zZXQoTUxGTE9XX0dFTklFX1RBRywgXCJ0cnVlXCIpO1xuICAgIGNvbnN0IGF1dGggPSBhdHRyaWJ1dGVTdHJpbmcoc3BhbiwgbWV0YWRhdGFBdHRyaWJ1dGUoTUFTVFJBX0FVVEhfTU9ERV9LRVkpKTtcbiAgICBpZiAoYXV0aCA9PT0gXCJvYm9cIikgc3RhdGUudGFncy5zZXQoTUxGTE9XX09CT19BVVRIX1RBRywgXCJ0cnVlXCIpO1xuICAgIGVsc2UgaWYgKGF1dGggPT09IFwic2VydmljZS1wcmluY2lwYWxcIikgc3RhdGUudGFncy5zZXQoTUxGTE9XX1NQX0FVVEhfVEFHLCBcInRydWVcIik7XG5cbiAgICBjb25zdCB1c2VyID1cbiAgICAgIGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBtZXRhZGF0YUF0dHJpYnV0ZShNQVNUUkFfVVNFUl9FTUFJTF9LRVkpKSA/P1xuICAgICAgYXR0cmlidXRlU3RyaW5nKHNwYW4sIG1ldGFkYXRhQXR0cmlidXRlKE1BU1RSQV9VU0VSX05BTUVfS0VZKSkgPz9cbiAgICAgIGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBtZXRhZGF0YUF0dHJpYnV0ZShNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKSk7XG4gICAgY29uc3Qgc2Vzc2lvbklkID1cbiAgICAgIGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBtZXRhZGF0YUF0dHJpYnV0ZShNQVNUUkFfVEhSRUFEX0lEX0tFWSkpID8/XG4gICAgICBhdHRyaWJ1dGVTdHJpbmcoc3BhbiwgXCJnZW5fYWkuY29udmVyc2F0aW9uLmlkXCIpO1xuICAgIGNvbnN0IHJlcXVlc3RQcmV2aWV3ID0gcHJldmlld0lucHV0KHNwYW4pO1xuICAgIGNvbnN0IHJlc3BvbnNlUHJldmlldyA9IHByZXZpZXdPdXRwdXQoc3Bhbik7XG4gICAgcGVyc2lzdEFwcE1sZmxvd1RyYWNlSW5mbyh7XG4gICAgICB0cmFjZUlkLFxuICAgICAgcmVxdWVzdFRpbWU6IGhyVGltZU1pbGxpc2Vjb25kcyhzcGFuLnN0YXJ0VGltZSksXG4gICAgICBleGVjdXRpb25EdXJhdGlvbjogaHJUaW1lTWlsbGlzZWNvbmRzKHNwYW4uZHVyYXRpb24pLFxuICAgICAgZXJyb3I6IHNwYW4uc3RhdHVzLmNvZGUgPT09IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgdGFnczogT2JqZWN0LmZyb21FbnRyaWVzKHN0YXRlLnRhZ3MpLFxuICAgICAgLi4uKHVzZXIgPyB7IHVzZXIgfSA6IHt9KSxcbiAgICAgIC4uLihzZXNzaW9uSWQgPyB7IHNlc3Npb25JZCB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3RQcmV2aWV3ID8geyByZXF1ZXN0UHJldmlldyB9IDoge30pLFxuICAgICAgLi4uKHJlc3BvbnNlUHJldmlldyA/IHsgcmVzcG9uc2VQcmV2aWV3IH0gOiB7fSksXG4gICAgfSk7XG4gICAgdGhpcy50cmFjZXMuZGVsZXRlKHRyYWNlSWQpO1xuICB9XG5cbiAgYXN5bmMgZm9yY2VGbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy50cmFjZXMuY2xlYXIoKTtcbiAgfVxufVxuXG5sZXQgYXBwTWxmbG93VHJhY2VJbmZvUHJvY2Vzc29yUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKiogUmVnaXN0ZXIgdHJhY2UgZW5yaWNobWVudCBiZWZvcmUgQXBwS2l0IGNvbnN0cnVjdHMgaXRzIG5hdGl2ZSBwcm92aWRlci4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWdpc3RlckFwcE1sZmxvd1RyYWNlSW5mb1Byb2Nlc3NvcigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKGFwcE1sZmxvd1RyYWNlSW5mb1Byb2Nlc3NvclJlZ2lzdGVyZWQpIHJldHVybiB0cnVlO1xuICBpZiAoIWFwcE1sZmxvd1RyYWNlSW5mb0NvbmZpZ3VyZWQoKSkgcmV0dXJuIGZhbHNlO1xuICBhd2FpdCBpbml0aWFsaXplQXBwTWxmbG93VHJhY2VJbmZvKCk7XG4gIGF3YWl0IHJlZ2lzdGVyTmF0aXZlU3BhblByb2Nlc3NvcihuZXcgQXBwTWxmbG93VHJhY2VJbmZvU3BhblByb2Nlc3NvcigpKTtcbiAgYXBwTWxmbG93VHJhY2VJbmZvUHJvY2Vzc29yUmVnaXN0ZXJlZCA9IHRydWU7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogSW5jcmVtZW50YWxseSBhc3NlbWJsZSBVVEYtOCBTU0UgdGV4dCB3aGlsZSByZXRhaW5pbmcgYSBib3VuZGVkIEpTT04gZmFsbGJhY2suICovXG5jbGFzcyBBc3Npc3RhbnRSZXNwb25zZUNvbGxlY3RvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKFwidXRmOFwiKTtcbiAgcHJpdmF0ZSBhbnN3ZXIgPSBcIlwiO1xuICBwcml2YXRlIGJvZHkgPSBcIlwiO1xuICBwcml2YXRlIHBlbmRpbmdMaW5lID0gXCJcIjtcbiAgcHJpdmF0ZSBmaW5pc2hlZCA9IGZhbHNlO1xuICBwcml2YXRlIGdlbmllID0gZmFsc2U7XG5cbiAgd3JpdGUoY2h1bms6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5maW5pc2hlZCkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRoaXMuY29uc3VtZShjaHVuayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoY2h1bmspKSB7XG4gICAgICB0aGlzLmNvbnN1bWUoXG4gICAgICAgIHRoaXMuZGVjb2Rlci53cml0ZShCdWZmZXIuZnJvbShjaHVuay5idWZmZXIsIGNodW5rLmJ5dGVPZmZzZXQsIGNodW5rLmJ5dGVMZW5ndGgpKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgZmluaXNoKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZmluaXNoZWQpIHJldHVybiB0aGlzLmFuc3dlciB8fCB0aGlzLmpzb25BbnN3ZXIoKTtcbiAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICB0aGlzLmNvbnN1bWUodGhpcy5kZWNvZGVyLmVuZCgpKTtcbiAgICB0aGlzLmNvbnN1bWVTc2VMaW5lKHRoaXMucGVuZGluZ0xpbmUpO1xuICAgIHRoaXMucGVuZGluZ0xpbmUgPSBcIlwiO1xuICAgIHJldHVybiB0aGlzLmFuc3dlciB8fCB0aGlzLmpzb25BbnN3ZXIoKTtcbiAgfVxuXG4gIHJhd0JvZHkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ib2R5LnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUKTtcbiAgfVxuXG4gIHVzZWRHZW5pZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZW5pZTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZSh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRleHQpIHJldHVybjtcbiAgICBpZiAodGhpcy5ib2R5Lmxlbmd0aCA8IFJFU1BPTlNFX0JPRFlfTElNSVQpIHtcbiAgICAgIHRoaXMuYm9keSArPSB0ZXh0LnNsaWNlKDAsIFJFU1BPTlNFX0JPRFlfTElNSVQgLSB0aGlzLmJvZHkubGVuZ3RoKTtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nTGluZSArPSB0ZXh0O1xuICAgIGxldCBuZXdsaW5lID0gdGhpcy5wZW5kaW5nTGluZS5pbmRleE9mKFwiXFxuXCIpO1xuICAgIHdoaWxlIChuZXdsaW5lID49IDApIHtcbiAgICAgIHRoaXMuY29uc3VtZVNzZUxpbmUodGhpcy5wZW5kaW5nTGluZS5zbGljZSgwLCBuZXdsaW5lKS5yZXBsYWNlKC9cXHIkLywgXCJcIikpO1xuICAgICAgdGhpcy5wZW5kaW5nTGluZSA9IHRoaXMucGVuZGluZ0xpbmUuc2xpY2UobmV3bGluZSArIDEpO1xuICAgICAgbmV3bGluZSA9IHRoaXMucGVuZGluZ0xpbmUuaW5kZXhPZihcIlxcblwiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGVuZGluZ0xpbmUubGVuZ3RoID4gUkVTUE9OU0VfQk9EWV9MSU1JVCkge1xuICAgICAgdGhpcy5wZW5kaW5nTGluZSA9IHRoaXMucGVuZGluZ0xpbmUuc2xpY2UoLVJFU1BPTlNFX0JPRFlfTElNSVQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZVNzZUxpbmUobGluZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZnJhbWUgPSBzc2VGcmFtZShsaW5lKTtcbiAgICB0aGlzLmdlbmllIHx8PSB2YWx1ZVVzZXNHZW5pZShmcmFtZSk7XG4gICAgaWYgKHRoaXMuYW5zd2VyLmxlbmd0aCA+PSBUUkFDRV9JT19MSU1JVCkgcmV0dXJuO1xuICAgIGNvbnN0IHRleHQgPSBhc3Npc3RhbnRUZXh0RnJvbVNzZUZyYW1lKGZyYW1lKTtcbiAgICB0aGlzLmFuc3dlciArPSB0ZXh0LnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUIC0gdGhpcy5hbnN3ZXIubGVuZ3RoKTtcbiAgfVxuXG4gIHByaXZhdGUganNvbkFuc3dlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiBhc3Npc3RhbnRUZXh0RnJvbUpzb24ocGFyc2UodGhpcy5ib2R5KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZWxlY3QgdGhlIHNwYW4gTUxmbG93IHRyZWF0cyBhcyB0aGUgcmVxdWVzdCByb290LlxuICpcbiAqIE9UZWwgSFRUUCBpbnN0cnVtZW50YXRpb24gc3RvcmVzIGl0cyBzZXJ2ZXIgc3BhbiBpbiBSUEMgbWV0YWRhdGEuIFRoYXQgc3BhblxuICogd2lucyBvdmVyIGFuIGFjdGl2ZSBFeHByZXNzIGNoaWxkLiBJZiBubyByZWNvcmRpbmcgbG9jYWwgc3BhbiBleGlzdHMsIGNyZWF0ZVxuICogb25lIHVuZGVyIHRoZSBjdXJyZW50IGNvbnRleHQgc28gZW5hYmxlZCBXM0MgcHJvcGFnYXRpb24gcmVtYWlucyBpbnRhY3QuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVUcmFjZVRhcmdldCgpOiBUcmFjZVRhcmdldCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGFjdGl2ZUNvbnRleHQgPSBjb250ZXh0LmFjdGl2ZSgpO1xuICBpZiAoZGlyZWN0TWxmbG93VHJhY2luZ0FjdGl2ZSgpKSB7XG4gICAgY29uc3Qgc3BhbiA9IHRyYWNlLmdldFRyYWNlcihDSEFUX1RVUk5fVFJBQ0VSKS5zdGFydFNwYW4oXG4gICAgICBcIm1hc3RyYS5jaGF0X3R1cm5cIixcbiAgICAgIHtcbiAgICAgICAga2luZDogU3BhbktpbmQuU0VSVkVSLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgW0FQUEtJVF9BR0VOVF9UUkFDRV9ST09UX0FUVFJdOiB0cnVlLFxuICAgICAgICAgIFtNTEZMT1dfU1BBTl9UWVBFX0FUVFJdOiBNTEZMT1dfU1BBTl9UWVBFX0FHRU5ULFxuICAgICAgICAgIFtHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUl06IFwiaW52b2tlX2FnZW50XCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJhY2UuZGVsZXRlU3BhbihhY3RpdmVDb250ZXh0KSxcbiAgICApO1xuICAgIGlmICghc3Bhbi5pc1JlY29yZGluZygpKSB7XG4gICAgICBzcGFuLmVuZCgpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3Bhbiwgb3duZWQ6IHRydWUgfTtcbiAgfVxuXG4gIGNvbnN0IHJwYyA9IGdldFJQQ01ldGFkYXRhKGFjdGl2ZUNvbnRleHQpO1xuICBpZiAocnBjPy50eXBlID09PSBSUENUeXBlLkhUVFAgJiYgcnBjLnNwYW4uaXNSZWNvcmRpbmcoKSkge1xuICAgIHJldHVybiB7IHNwYW46IHJwYy5zcGFuLCBvd25lZDogZmFsc2UgfTtcbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZSA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKTtcbiAgaWYgKGFjdGl2ZT8uaXNSZWNvcmRpbmcoKSkgcmV0dXJuIHsgc3BhbjogYWN0aXZlLCBvd25lZDogZmFsc2UgfTtcblxuICBjb25zdCBzcGFuID0gdHJhY2UuZ2V0VHJhY2VyKENIQVRfVFVSTl9UUkFDRVIpLnN0YXJ0U3BhbihcbiAgICBcIm1hc3RyYS5jaGF0X3R1cm5cIixcbiAgICB7XG4gICAgICBraW5kOiBTcGFuS2luZC5TRVJWRVIsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIFtBUFBLSVRfQUdFTlRfVFJBQ0VfUk9PVF9BVFRSXTogdHJ1ZSxcbiAgICAgICAgW01MRkxPV19TUEFOX1RZUEVfQVRUUl06IE1MRkxPV19TUEFOX1RZUEVfQUdFTlQsXG4gICAgICAgIFtHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUl06IFwiaW52b2tlX2FnZW50XCIsXG4gICAgICB9LFxuICAgIH0sXG4gICAgYWN0aXZlQ29udGV4dCxcbiAgKTtcbiAgaWYgKCFzcGFuLmlzUmVjb3JkaW5nKCkpIHtcbiAgICBzcGFuLmVuZCgpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgc3Bhbiwgb3duZWQ6IHRydWUgfTtcbn1cblxuLyoqXG4gKiBFeHByZXNzIG1pZGRsZXdhcmUgdGhhdCBzdGFtcHMgY2hhdCB0dXJuIEkvTyBvbnRvIHRoZSBleHBvcnRlZCBPVGVsIHJvb3QuXG4gKlxuICogVGVlIGByZXMud3JpdGVgLCBgcmVzLmpzb25gLCBhbmQgYHJlcy5lbmRgIGluc3RlYWQgb2YgbGlzdGVuaW5nIGZvciBgZmluaXNoYDpcbiAqIEhUVFAgaW5zdHJ1bWVudGF0aW9uIGVuZHMgaXRzIHNlcnZlciBzcGFuIG9uIGZpbmlzaCwgYW5kIGF0dHJpYnV0ZXMgc2V0XG4gKiBhZnRlciBhIHNwYW4gZW5kcyBuZXZlciByZWFjaCB0aGUgZXhwb3J0ZXIuXG4gKlxuICogYHBhdGhgIGlzIG1vdW50LXJlbGF0aXZlICh3aGF0IHRoZSBNYXN0cmEgc3ViLWFwcCBzZWVzKSwgZS5nLlxuICogYC9hZ2VudHMvc3VwcG9ydC9zdHJlYW1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhdFR1cm5UZWxlbWV0cnlNaWRkbGV3YXJlKFxuICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICBuZXh0OiBleHByZXNzLk5leHRGdW5jdGlvbixcbiAgb3B0aW9uczogQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgaWYgKHJlcS5tZXRob2QgIT09IFwiUE9TVFwiIHx8ICFBR0VOVF9UVVJOX1JPVVRFLnRlc3QocmVxLnBhdGgpKSB7XG4gICAgbmV4dCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0YXJnZXQgPSByZXNvbHZlVHJhY2VUYXJnZXQoKTtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICBuZXh0KCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRhcmdldFRyYWNlSWQgPSB0cmFjZUlkKHRhcmdldC5zcGFuKTtcbiAgaWYgKCF0YXJnZXRUcmFjZUlkKSB7XG4gICAgaWYgKHRhcmdldC5vd25lZCkgdGFyZ2V0LnNwYW4uZW5kKCk7XG4gICAgbmV4dCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0cmFjZVN0YXRlOiBDaGF0VHJhY2VTdGF0ZSA9IHtcbiAgICB0YWdzOiBuZXcgTWFwKCksXG4gICAgdHJhY2VJZDogdGFyZ2V0VHJhY2VJZCxcbiAgICBwYXJlbnRTcGFuSWQ6IHRhcmdldC5zcGFuLnNwYW5Db250ZXh0KCkuc3BhbklkLFxuICB9O1xuICBjb25zdCB0cmFjZVJlcXVlc3RUaW1lID0gRGF0ZS5ub3coKTtcbiAgaWYgKCFpc0RhdGFicmlja3NBcHBFbnYoKSkge1xuICAgIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBNTEZMT1dfTE9DQUxfVEFHLCB0cnVlKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0UmVxdWVzdFRhZ3MocmVxKSkpIHtcbiAgICBzZXRDaGF0VHJhY2VUYWcodHJhY2VTdGF0ZSwgbmFtZSwgdmFsdWUpO1xuICB9XG4gIGNvbnN0IGluaXRpYWxUYWdzID0gdHlwZW9mIG9wdGlvbnMudGFncyA9PT0gXCJmdW5jdGlvblwiID8gb3B0aW9ucy50YWdzKHJlcSkgOiBvcHRpb25zLnRhZ3M7XG4gIGlmIChpbml0aWFsVGFncykge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbml0aWFsVGFncykpIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSBzZXRDaGF0VHJhY2VUYWcodHJhY2VTdGF0ZSwgbmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICBzdGFtcE1sZmxvd1RyYWNlSWQocmVzLCB0cmFjZVN0YXRlLnRyYWNlSWQpO1xuICB0cmFjZVN0YXRlLnVzZXIgPSBzdGFtcE1sZmxvd0FjdG9yKHRhcmdldC5zcGFuLCByZXEpO1xuICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX1NQQU5fVFlQRV9BVFRSLCBNTEZMT1dfU1BBTl9UWVBFX0FHRU5UKTtcbiAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKEdFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSLCBcImludm9rZV9hZ2VudFwiKTtcbiAgY29uc3QgaWRlbnRpdHkgPVxuICAgIHR5cGVvZiBvcHRpb25zLmlkZW50aXR5ID09PSBcImZ1bmN0aW9uXCIgPyBvcHRpb25zLmlkZW50aXR5KHJlcSkgOiBvcHRpb25zLmlkZW50aXR5O1xuICBpZiAoaWRlbnRpdHkpIHtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9JREVOVElUWV9BVFRSLCBpZGVudGl0eSk7XG4gICAgc2V0Q2hhdFRyYWNlVGFnKFxuICAgICAgdHJhY2VTdGF0ZSxcbiAgICAgIGlkZW50aXR5ID09PSBcIm9ib1wiID8gTUxGTE9XX09CT19BVVRIX1RBRyA6IE1MRkxPV19TUF9BVVRIX1RBRyxcbiAgICAgIHRydWUsXG4gICAgKTtcbiAgfVxuICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9HRU5JRV9VU0VEX0FUVFIsIGZhbHNlKTtcblxuICBjb25zdCBtZXNzYWdlcyA9IChyZXEuYm9keSBhcyB7IG1lc3NhZ2VzPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8ubWVzc2FnZXM7XG4gIGxldCByZXF1ZXN0UHJldmlldzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpZiAobWVzc2FnZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGZ1bGxJbnB1dCA9IHNlcmlhbGl6ZWQobWVzc2FnZXMpO1xuICAgIHJlcXVlc3RQcmV2aWV3ID0gdGV4dE9ubHlDaGF0SW5wdXQobWVzc2FnZXMpID8/IGZ1bGxJbnB1dDtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9NRVNTQUdFU19BVFRSLCBmdWxsSW5wdXQpO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9JTlBVVFNfQVRUUiwgcmVxdWVzdFByZXZpZXcuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpKTtcbiAgfVxuXG4gIGNvbnN0IGNvbGxlY3RvciA9IG5ldyBBc3Npc3RhbnRSZXNwb25zZUNvbGxlY3RvcigpO1xuICBsZXQgcmVzcG9uc2VQcmV2aWV3OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBvdXRwdXRSZWNvcmRlZCA9IGZhbHNlO1xuICBsZXQgZnVsbE91dHB1dFJlY29yZGVkID0gZmFsc2U7XG4gIGxldCBnZW5pZVJlY29yZGVkID0gZmFsc2U7XG4gIGxldCBvd25lZFNwYW5FbmRlZCA9IGZhbHNlO1xuICBsZXQgdHJhY2VGaW5hbGl6ZWQgPSBmYWxzZTtcbiAgY29uc3QgcGFzc1Rocm91Z2hXcml0ZSA9IHJlcy53cml0ZS5iaW5kKHJlcykgYXMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYm9vbGVhbjtcbiAgY29uc3QgcGFzc1Rocm91Z2hFbmQgPSByZXMuZW5kLmJpbmQocmVzKSBhcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuICBjb25zdCBwYXNzVGhyb3VnaEpzb24gPSByZXMuanNvbi5iaW5kKHJlcykgYXMgKGJvZHk/OiB1bmtub3duKSA9PiBleHByZXNzLlJlc3BvbnNlO1xuICBjb25zdCByZWNvcmRPdXRwdXQgPSAoYW5zd2VyOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBpZiAob3V0cHV0UmVjb3JkZWQgfHwgIWFuc3dlcikgcmV0dXJuO1xuICAgIHJlc3BvbnNlUHJldmlldyA9IGFuc3dlcjtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX1NQQU5fT1VUUFVUU19BVFRSLCBhbnN3ZXIuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpKTtcbiAgICBvdXRwdXRSZWNvcmRlZCA9IHRydWU7XG4gIH07XG4gIGNvbnN0IHJlY29yZEZ1bGxPdXRwdXQgPSAocmVzcG9uc2U6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmIChmdWxsT3V0cHV0UmVjb3JkZWQgfHwgIXJlc3BvbnNlKSByZXR1cm47XG4gICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKENIQVRfUkVTUE9OU0VfQVRUUiwgcmVzcG9uc2Uuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpKTtcbiAgICBmdWxsT3V0cHV0UmVjb3JkZWQgPSB0cnVlO1xuICB9O1xuICBjb25zdCByZWNvcmRHZW5pZSA9ICh1c2VkOiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgaWYgKCF1c2VkIHx8IGdlbmllUmVjb3JkZWQpIHJldHVybjtcbiAgICBnZW5pZVJlY29yZGVkID0gdHJ1ZTtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9HRU5JRV9VU0VEX0FUVFIsIHRydWUpO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfR0VOSUVfVEFHX0FUVFIsIFwidHJ1ZVwiKTtcbiAgICBzZXRDaGF0VHJhY2VUYWcodHJhY2VTdGF0ZSwgTUxGTE9XX0dFTklFX1RBRywgdHJ1ZSk7XG4gICAgY29udGV4dC53aXRoKHRyYWNlLnNldFNwYW4oY29udGV4dC5hY3RpdmUoKSwgdGFyZ2V0LnNwYW4pLCAoKSA9PiB7XG4gICAgICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZVRhZ3MoeyBbTUxGTE9XX0dFTklFX1RBR106IFwidHJ1ZVwiIH0pO1xuICAgIH0pO1xuICB9O1xuICBjb25zdCBmaW5hbGl6ZVRyYWNlID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICh0cmFjZUZpbmFsaXplZCkgcmV0dXJuO1xuICAgIHRyYWNlRmluYWxpemVkID0gdHJ1ZTtcbiAgICBjb25zdCB0YWdzID0gT2JqZWN0LmZyb21FbnRyaWVzKHRyYWNlU3RhdGUudGFncyk7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIHRyYWNlU3RhdGUudGFncykge1xuICAgICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKGAke01MRkxPV19UUkFDRV9UQUdfUFJFRklYfSR7bmFtZX1gLCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmICh0cmFjZVN0YXRlLnVzZXIpIHtcbiAgICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShVU0VSX1RSQUNFX0FUVFJJQlVURSwgdHJhY2VTdGF0ZS51c2VyKTtcbiAgICB9XG4gICAgY29udGV4dC53aXRoKHRyYWNlLnNldFNwYW4oY29udGV4dC5hY3RpdmUoKSwgdGFyZ2V0LnNwYW4pLCAoKSA9PiB7XG4gICAgICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZSh7XG4gICAgICAgIC4uLihPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAwID8geyB0YWdzIH0gOiB7fSksXG4gICAgICAgIC4uLih0cmFjZVN0YXRlLnVzZXIgPyB7IHVzZXI6IHRyYWNlU3RhdGUudXNlciB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKCFpc0RhdGFicmlja3NBcHBFbnYoKSkge1xuICAgICAgcGVyc2lzdEFwcE1sZmxvd1RyYWNlSW5mbyh7XG4gICAgICAgIHRyYWNlSWQ6IHRyYWNlU3RhdGUudHJhY2VJZCxcbiAgICAgICAgcmVxdWVzdFRpbWU6IHRyYWNlUmVxdWVzdFRpbWUsXG4gICAgICAgIGV4ZWN1dGlvbkR1cmF0aW9uOiBEYXRlLm5vdygpIC0gdHJhY2VSZXF1ZXN0VGltZSxcbiAgICAgICAgZXJyb3I6IHJlcy5zdGF0dXNDb2RlID49IDUwMCxcbiAgICAgICAgdGFncyxcbiAgICAgICAgLi4uKHRyYWNlU3RhdGUudXNlciA/IHsgdXNlcjogdHJhY2VTdGF0ZS51c2VyIH0gOiB7fSksXG4gICAgICAgIC4uLihyZXF1ZXN0UHJldmlldyA/IHsgcmVxdWVzdFByZXZpZXcgfSA6IHt9KSxcbiAgICAgICAgLi4uKHJlc3BvbnNlUHJldmlldyA/IHsgcmVzcG9uc2VQcmV2aWV3IH0gOiB7fSksXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGVuZE93bmVkU3BhbiA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRhcmdldC5vd25lZCB8fCBvd25lZFNwYW5FbmRlZCkgcmV0dXJuO1xuICAgIG93bmVkU3BhbkVuZGVkID0gdHJ1ZTtcbiAgICB0YXJnZXQuc3Bhbi5lbmQoKTtcbiAgfTtcblxuICByZXMud3JpdGUgPSAoKGNodW5rOiB1bmtub3duLCAuLi5yZXN0OiB1bmtub3duW10pID0+IHtcbiAgICBjb2xsZWN0b3Iud3JpdGUoY2h1bmspO1xuICAgIHJldHVybiBwYXNzVGhyb3VnaFdyaXRlKGNodW5rLCAuLi5yZXN0KTtcbiAgfSkgYXMgdHlwZW9mIHJlcy53cml0ZTtcblxuICByZXMuanNvbiA9ICgoYm9keT86IHVua25vd24pID0+IHtcbiAgICByZWNvcmRGdWxsT3V0cHV0KHNlcmlhbGl6ZWQoYm9keSkpO1xuICAgIHJlY29yZEdlbmllKHZhbHVlVXNlc0dlbmllKGJvZHkpKTtcbiAgICByZWNvcmRPdXRwdXQoYXNzaXN0YW50VGV4dEZyb21Kc29uKGJvZHkpKTtcbiAgICByZXR1cm4gcGFzc1Rocm91Z2hKc29uKGJvZHkpO1xuICB9KSBhcyB0eXBlb2YgcmVzLmpzb247XG5cbiAgcmVzLmVuZCA9ICgoY2h1bms/OiB1bmtub3duLCAuLi5yZXN0OiB1bmtub3duW10pID0+IHtcbiAgICBjb2xsZWN0b3Iud3JpdGUoY2h1bmspO1xuICAgIHJlY29yZE91dHB1dChjb2xsZWN0b3IuZmluaXNoKCkpO1xuICAgIHJlY29yZEZ1bGxPdXRwdXQoY29sbGVjdG9yLnJhd0JvZHkoKSk7XG4gICAgcmVjb3JkR2VuaWUoY29sbGVjdG9yLnVzZWRHZW5pZSgpKTtcbiAgICBmaW5hbGl6ZVRyYWNlKCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBwYXNzVGhyb3VnaEVuZChjaHVuaywgLi4ucmVzdCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVuZE93bmVkU3BhbigpO1xuICAgIH1cbiAgfSkgYXMgdHlwZW9mIHJlcy5lbmQ7XG5cbiAgcmVzLm9uY2UoXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgcmVjb3JkT3V0cHV0KGNvbGxlY3Rvci5maW5pc2goKSk7XG4gICAgcmVjb3JkRnVsbE91dHB1dChjb2xsZWN0b3IucmF3Qm9keSgpKTtcbiAgICByZWNvcmRHZW5pZShjb2xsZWN0b3IudXNlZEdlbmllKCkpO1xuICAgIGZpbmFsaXplVHJhY2UoKTtcbiAgICBlbmRPd25lZFNwYW4oKTtcbiAgfSk7XG5cbiAgY29uc3QgY2hhdENvbnRleHQgPSB0cmFjZVxuICAgIC5zZXRTcGFuKGNvbnRleHQuYWN0aXZlKCksIHRhcmdldC5zcGFuKVxuICAgIC5zZXRWYWx1ZShDSEFUX1RSQUNFX1NUQVRFX0tFWSwgdHJhY2VTdGF0ZSk7XG4gIGNvbnRleHQud2l0aChjaGF0Q29udGV4dCwgKCkgPT4ge1xuICAgIG5leHQoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogSW5zdGFsbCB7QGxpbmsgY2hhdFR1cm5UZWxlbWV0cnlNaWRkbGV3YXJlfSBvbiBhIE1hc3RyYSBFeHByZXNzIHN1Yi1hcHAuXG4gKlxuICogQ2FsbCBiZWZvcmUgYE1hc3RyYVNlcnZlci5pbml0KClgIHNvIHRoZSBsYXllciBzaXRzIGFoZWFkIG9mIHRoZSBhZ2VudFxuICogcm91dGVzLiBTYWZlIHRvIGNhbGwgdW5jb25kaXRpb25hbGx5OiB3aGVuIG5vIHJlY29yZGluZyB0cmFjZXIgaXMgcmVnaXN0ZXJlZCxcbiAqIHRoZSBtaWRkbGV3YXJlIGlzIGEgbm8tb3AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdHRhY2hDaGF0VHVyblRlbGVtZXRyeShcbiAgYXBwOiBleHByZXNzLkV4cHJlc3MsXG4gIG9wdGlvbnM6IENoYXRUdXJuVGVsZW1ldHJ5T3B0aW9ucyA9IHt9LFxuKTogdm9pZCB7XG4gIGFwcC51c2UoKHJlcSwgcmVzLCBuZXh0KSA9PiBjaGF0VHVyblRlbGVtZXRyeU1pZGRsZXdhcmUocmVxLCByZXMsIG5leHQsIG9wdGlvbnMpKTtcbiAgbG9nZ2VyLmluZm8oXCJjaGF0IHR1cm4gdGVsZW1ldHJ5IG1pZGRsZXdhcmUgYXR0YWNoZWRcIiwgb3B0aW9ucyk7XG59XG4iXX0=
|
|
710
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBELE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsMkJBQTJCLEVBQzNCLGNBQWMsR0FDZixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFDTCxHQUFHLEVBQ0gsa0JBQWtCLEVBQ2xCLEtBQUssRUFDTCxRQUFRLEVBQ1IsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixjQUFjLEdBQ2YsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDaEIsZUFBZSxHQUNoQixNQUFNLDBCQUEwQixDQUFDO0FBRWxDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzVGLE9BQU8sRUFDTCxPQUFPLEVBQ1AsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDUixjQUFjLEVBQ2QsS0FBSyxHQUdOLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUk5RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEcsT0FBTyxFQUNMLDRCQUE0QixFQUM1Qix5QkFBeUIsRUFDekIsNEJBQTRCLEVBQzVCLHlCQUF5QixFQUN6Qix1QkFBdUIsRUFDdkIsMkJBQTJCLEdBQzVCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCw0QkFBNEIsRUFDNUIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGdCQUFn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LElBQUksQ0FBQyxDQUFDO1FBQ3hDLENBQUM7Z0JBQVMsQ0FBQztZQUNULFlBQVksRUFBRSxDQUFDO1FBQ2pCLENBQUM7SUFDSCxDQUFDLENBQW1CLENBQUM7SUFFckIsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO1FBQ3JCLFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNqQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN0QyxXQUFXLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDbkMsYUFBYSxFQUFFLENBQUM7UUFDaEIsWUFBWSxFQUFFLENBQUM7SUFDakIsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLFdBQVcsR0FBRyxLQUFLO1NBQ3RCLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQztTQUN0QyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDOUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO1FBQzdCLElBQUksRUFBRSxDQUFDO0lBQ1QsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxHQUFvQixFQUNwQixVQUFvQyxFQUFFO0lBRXRDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsMkJBQTJCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNsRixNQUFNLENBQUMsSUFBSSxDQUFDLHlDQUF5QyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2xFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHkgZWFjaCBNYXN0cmEgY2hhdCB0dXJuJ3MgcmVxdWVzdC9yZXNwb25zZSBvbnRvIGl0cyBPVGVsIHJvb3Qgc3BhblxuICogc28gRGF0YWJyaWNrcy1tYW5hZ2VkIE1MZmxvdyBjYW4gZGlzcGxheSB0aGVtLlxuICpcbiAqIFdoeSB0aGlzIGV4aXN0czogTUxmbG93J3MgVUMgYDx0YXJnZXQ+X3RyYWNlX3VuaWZpZWRgIHZpZXcgcGlja3MgdGhlXG4gKiBvbmUgc3BhbiB3aG9zZSBgcGFyZW50X3NwYW5faWRgIGlzIGVtcHR5IGFuZCByZWFkcyByZXF1ZXN0L3Jlc3BvbnNlXG4gKiBmcm9tIGBtbGZsb3cuc3BhbklucHV0c2AgLyBgbWxmbG93LnNwYW5PdXRwdXRzYCAob3IgdGhlIGBnZW5fYWkuKmBcbiAqIGVxdWl2YWxlbnRzKSBvbiBUSEFUIHNwYW4gb25seS4gTWFzdHJhIHJlY29yZHMgdGhlIHR1cm4gb24gaXRzXG4gKiBgaW52b2tlX2FnZW50YCBjaGlsZCB1bmRlciBgbWFzdHJhLmFnZW50X3J1bi5pbnB1dGAgLyBgLm91dHB1dGAsIGtleXNcbiAqIHRoZSB2aWV3IG5ldmVyIHJlYWRzLCBzbyBjaGF0IHRyYWNlcyBhcnJpdmUgd2l0aCBib3RoIGNvbHVtbnMgbnVsbFxuICogZXZlbiB3aGVuIHRoZSBzcGFucyB0aGVtc2VsdmVzIGxvb2sgaGVhbHRoeS5cbiAqXG4gKiBBcHBLaXQncyBIVFRQIGluc3RydW1lbnRhdGlvbiByZWNvcmRzIHRoZSBzZXJ2ZXIgc3BhbiBpbiBPVGVsIFJQQyBtZXRhZGF0YSxcbiAqIHdoaWNoIHJlbWFpbnMgYXZhaWxhYmxlIGV2ZW4gd2hlbiBFeHByZXNzIG1ha2VzIGEgbWlkZGxld2FyZS1sYXllciBjaGlsZFxuICogYWN0aXZlLiBXaGVuIGluc3RydW1lbnRhdGlvbiBpcyB1bmF2YWlsYWJsZSwgdGhpcyBtb2R1bGUgY3JlYXRlcyBvbmVcbiAqIHJlcXVlc3QtbGlmZXRpbWUgc2VydmVyIHNwYW4gYW5kIHJ1bnMgTWFzdHJhIHVuZGVyIGl0LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBTdHJpbmdEZWNvZGVyIH0gZnJvbSBcIm5vZGU6c3RyaW5nX2RlY29kZXJcIjtcblxuaW1wb3J0IHtcbiAgVVNFUl9UUkFDRV9BVFRSSUJVVEUsXG4gIHJlZ2lzdGVyTmF0aXZlU3BhblByb2Nlc3NvcixcbiAgZ2V0UmVxdWVzdFRhZ3MsXG59IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHtcbiAgbG9nLFxuICBpc0RhdGFicmlja3NBcHBFbnYsXG4gIHBhcnNlLFxuICBpc1JlY29yZCxcbiAgdHJpbVRvTnVsbCxcbiAgVVNFUl9FTUFJTF9IRUFERVIsXG4gIFVTRVJfSURfSEVBREVSLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgTUxGTE9XX1RSQUNFX0lEX0hFQURFUixcbiAgTUxGTE9XX1RSQUNFX1BBUlRfVFlQRSxcbiAgVEhSRUFEX0lEX0hFQURFUixcbiAgVEhSRUFEX0lEX1FVRVJZLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQgdHlwZSB7IFRyYWNpbmdPcHRpb25zIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9vYnNlcnZhYmlsaXR5XCI7XG5pbXBvcnQgeyBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLCBNQVNUUkFfVEhSRUFEX0lEX0tFWSB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQge1xuICBjb250ZXh0LFxuICBjcmVhdGVDb250ZXh0S2V5LFxuICBTcGFuS2luZCxcbiAgU3BhblN0YXR1c0NvZGUsXG4gIHRyYWNlLFxuICB0eXBlIENvbnRleHQsXG4gIHR5cGUgU3Bhbixcbn0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuaW1wb3J0IHsgZ2V0UlBDTWV0YWRhdGEsIFJQQ1R5cGUgfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBSZWFkYWJsZVNwYW4sIFNwYW4gYXMgU2RrU3BhbiwgU3BhblByb2Nlc3NvciB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2UtYmFzZVwiO1xuaW1wb3J0IHR5cGUgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuXG5pbXBvcnQgeyBNQVNUUkFfQVVUSF9NT0RFX0tFWSwgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLCBNQVNUUkFfVVNFUl9OQU1FX0tFWSB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHtcbiAgYXBwTWxmbG93VHJhY2VJbmZvQ29uZmlndXJlZCxcbiAgZGlyZWN0TWxmbG93VHJhY2luZ0FjdGl2ZSxcbiAgaW5pdGlhbGl6ZUFwcE1sZmxvd1RyYWNlSW5mbyxcbiAgcGVyc2lzdEFwcE1sZmxvd1RyYWNlSW5mbyxcbiAgdXBkYXRlQWN0aXZlTWxmbG93VHJhY2UsXG4gIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlVGFncyxcbn0gZnJvbSBcIi4vbWxmbG93LnRzXCI7XG5pbXBvcnQge1xuICBBUFBLSVRfQUdFTlRfVFJBQ0VfUk9PVF9BVFRSLFxuICBNTEZMT1dfQUdFTlRfVEFHLFxuICBNTEZMT1dfQUdFTlRfVEFHX0FUVFIsXG4gIE1MRkxPV19HRU5JRV9UQUcsXG4gIE1MRkxPV19HRU5JRV9UQUdfQVRUUixcbiAgTUxGTE9XX0xPQ0FMX1RBRyxcbiAgTUxGTE9XX09CT19BVVRIX1RBRyxcbiAgTUxGTE9XX1NQX0FVVEhfVEFHLFxuICBNTEZMT1dfVFJBQ0VfVEFHX1BSRUZJWCxcbn0gZnJvbSBcIi4vdHJhY2UtYXR0cmlidXRlcy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL3RlbGVtZXRyeVwiKTtcblxuLyoqIENhcCBvbiBlYWNoIHBheWxvYWQgY29waWVkIG9udG8gYSBzcGFuLCBzbyBvbmUgdHVybiBjYW5ub3QgYmxvYXQgdGhlIGV4cG9ydC4gKi9cbmV4cG9ydCBjb25zdCBUUkFDRV9JT19MSU1JVCA9IDhfMDAwO1xuXG4vKiogQm91bmQgZm9yIGEgbm9uLXN0cmVhbWluZyBib2R5IGNhcHR1cmVkIHRocm91Z2ggYHJlcy5lbmRgIGluc3RlYWQgb2YgYHJlcy5qc29uYC4gKi9cbmNvbnN0IFJFU1BPTlNFX0JPRFlfTElNSVQgPSBUUkFDRV9JT19MSU1JVCAqIDQ7XG5cbi8qKiBUcmFjZXIgc2NvcGUgdXNlZCBvbmx5IHdoZW4gQXBwS2l0IGRpZCBub3QgY3JlYXRlIGEgcmVjb3JkaW5nIEhUVFAgc3Bhbi4gKi9cbmNvbnN0IENIQVRfVFVSTl9UUkFDRVIgPSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuXG4vKipcbiAqIE1vdW50LXJlbGF0aXZlIE1hc3RyYSBhZ2VudCBpbnZva2UgcGF0aHMgdGhhdCBjYXJyeSBhIGNoYXQgdHVybiBib2R5XG4gKiAoYG1lc3NhZ2VzYCkgYW5kIHN0cmVhbSBhbiBhc3Npc3RhbnQgYW5zd2VyLiBSZXN1bWUgLyBhcHByb3ZlIHZlcmJzXG4gKiBhcmUgaW50ZW50aW9uYWxseSBleGNsdWRlZDogdGhlaXIgYm9kaWVzIGFyZSB0b29sIGRlY2lzaW9ucywgbm90IHRoZVxuICogdXNlciBwcm9tcHQsIGFuZCB0aGV5IHJhcmVseSBwcm9kdWNlIGEgZnJlc2ggYW5zd2VyIHdvcnRoIHN1cmZhY2luZy5cbiAqL1xuY29uc3QgQUdFTlRfVFVSTl9ST1VURSA9IC8oPzpefFxcLykoPzphZ2VudHNcXC9bXi9dK1xcLyg/OnN0cmVhbXxnZW5lcmF0ZSl8Y2hhdFxcL1teL10rKVxcLz8kL2k7XG5cbi8qKiBBdHRyaWJ1dGUga2V5cyB0aGUgTUxmbG93IFVDIGAqX3RyYWNlX3VuaWZpZWRgIHZpZXcgcmVhZHMgZnJvbSB0aGUgcm9vdCBzcGFuLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX0lOUFVUU19BVFRSID0gXCJtbGZsb3cuc3BhbklucHV0c1wiO1xuLyoqIFJvb3Qtc3BhbiBhdHRyaWJ1dGUgY29uc3VtZWQgYXMgY2hhdCBvdXRwdXQgYnkgTUxmbG93IHVuaWZpZWQgdHJhY2Ugdmlld3MuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fT1VUUFVUU19BVFRSID0gXCJtbGZsb3cuc3Bhbk91dHB1dHNcIjtcbi8qKiBGdWxsIHNlcmlhbGl6ZWQgcmVxdWVzdCBtZXNzYWdlcyByZXRhaW5lZCB3aGVuIHRoZSBNTGZsb3cgcHJldmlldyBpcyBwbGFpbiB0ZXh0LiAqL1xuZXhwb3J0IGNvbnN0IENIQVRfTUVTU0FHRVNfQVRUUiA9IFwiYXBwa2l0Lm1hc3RyYS5jaGF0Lm1lc3NhZ2VzXCI7XG4vKiogRnVsbCBzZXJpYWxpemVkIHJlc3BvbnNlIHJldGFpbmVkIHdoZW4gdGhlIE1MZmxvdyBwcmV2aWV3IGlzIHBsYWluIHRleHQuICovXG5leHBvcnQgY29uc3QgQ0hBVF9SRVNQT05TRV9BVFRSID0gXCJhcHBraXQubWFzdHJhLmNoYXQucmVzcG9uc2VcIjtcbi8qKiBDcmVkZW50aWFsIG1vZGUgdXNlZCBieSBEYXRhYnJpY2tzIGNhbGxzIGluIHRoaXMgY2hhdCB0dXJuLiAqL1xuZXhwb3J0IGNvbnN0IENIQVRfSURFTlRJVFlfQVRUUiA9IFwiYXBwa2l0Lm1hc3RyYS5pZGVudGl0eS5tb2RlXCI7XG4vKiogV2hldGhlciB0aGUgc3RyZWFtZWQgdHVybiBlbWl0dGVkIGEgR2VuaWUgdG9vbCBvciBwcm9ncmVzcyBldmVudC4gKi9cbmV4cG9ydCBjb25zdCBDSEFUX0dFTklFX1VTRURfQVRUUiA9IFwiYXBwa2l0Lm1hc3RyYS5nZW5pZS51c2VkXCI7XG4vKipcbiAqIE1MZmxvdyBzcGFuLXR5cGUgYXR0cmlidXRlLiBEYXRhYnJpY2tzIG1hcHMgdGhpcyAob3IgYGdlbl9haS5vcGVyYXRpb24ubmFtZWApXG4gKiBvbnRvIHRoZSB0eXBlIGNoaXAgaW4gdGhlIGV4cGVyaW1lbnQgVUkuIEN1c3RvbSB2YWx1ZXMgc3VjaCBhcyBgR0VOSUVgIGFyZVxuICogYWxsb3dlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX1RZUEVfQVRUUiA9IFwibWxmbG93LnNwYW5UeXBlXCI7XG4vKiogR2VuQUkgc2VtYW50aWMtY29udmVudGlvbiBvcGVyYXRpb24gbmFtZSwgYW4gYWx0ZXJuYXRlIHNwYW4tdHlwZSBzb3VyY2UuICovXG5leHBvcnQgY29uc3QgR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFIgPSBcImdlbl9haS5vcGVyYXRpb24ubmFtZVwiO1xuLyoqIFJvb3Qtc3BhbiBzZXNzaW9uIGlkIHRoYXQgZW5hYmxlcyB0aGUgTUxmbG93IFNlc3Npb25zIHRhYi4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU0VTU0lPTl9BVFRSID0gXCJzZXNzaW9uLmlkXCI7XG4vKiogUm9vdC1zcGFuIHR5cGUgZm9yIGEgTWFzdHJhIGFnZW50IHR1cm4uICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fVFlQRV9BR0VOVCA9IFwiQUdFTlRcIjtcbi8qKiBTcGFuIHR5cGUgZm9yIGFuIGBhc2tfZ2VuaWVgIHRvb2wgY2FsbC4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU1BBTl9UWVBFX0dFTklFID0gXCJHRU5JRVwiO1xuXG4vKiogUm9vdC1zcGFuIG1ldGFkYXRhIGtub3duIGJlZm9yZSBhIGNoYXQgcmVxdWVzdCBpcyBkaXNwYXRjaGVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGF0VHVyblRlbGVtZXRyeU9wdGlvbnMge1xuICByZWFkb25seSBpZGVudGl0eT86XG4gICAgXCJvYm9cIiB8IFwic2VydmljZS1wcmluY2lwYWxcIiB8ICgocmVxdWVzdDogZXhwcmVzcy5SZXF1ZXN0KSA9PiBcIm9ib1wiIHwgXCJzZXJ2aWNlLXByaW5jaXBhbFwiKTtcbiAgLyoqIEluaXRpYWwgdHJhY2UgdGFncyBkZXJpdmVkIGZyb20gdGhlIGluYm91bmQgcmVxdWVzdC4gKi9cbiAgcmVhZG9ubHkgdGFncz86XG4gICAgfCBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBDaGF0VHJhY2VUYWdWYWx1ZSB8IHVuZGVmaW5lZD4+XG4gICAgfCAoKHJlcXVlc3Q6IGV4cHJlc3MuUmVxdWVzdCkgPT4gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQ2hhdFRyYWNlVGFnVmFsdWUgfCB1bmRlZmluZWQ+Pik7XG59XG5cbmludGVyZmFjZSBUcmFjZVRhcmdldCB7XG4gIHNwYW46IFNwYW47XG4gIG93bmVkOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgQ2hhdFRyYWNlU3RhdGUge1xuICByZWFkb25seSB0YWdzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICByZWFkb25seSB0cmFjZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhcmVudFNwYW5JZD86IHN0cmluZztcbiAgZmlyc3RNb2RlbD86IHN0cmluZztcbiAgdXNlcj86IHN0cmluZztcbn1cblxuLyoqIFZhbHVlcyBhY2NlcHRlZCBieSByZXF1ZXN0LXNjb3BlZCB0cmFjZS10YWcgaW5qZWN0aW9uIGhlbHBlcnMuICovXG5leHBvcnQgdHlwZSBDaGF0VHJhY2VUYWdWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XG5cbmNvbnN0IENIQVRfVFJBQ0VfU1RBVEVfS0VZID0gY3JlYXRlQ29udGV4dEtleShcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYS9jaGF0LXRyYWNlLXN0YXRlXCIpO1xuXG4vKiogT3BlblRlbGVtZXRyeSdzIHNlbnRpbmVsIGZvciBcIm5vIHZhbGlkIHRyYWNlXCIgLSAzMiB6ZXJvIGhleCBjaGFycy4gKi9cbmNvbnN0IElOVkFMSURfVFJBQ0VfSUQgPSBcIjBcIi5yZXBlYXQoMzIpO1xuXG4vKipcbiAqIE1hcmsgdGhlIGFjdGl2ZSBzcGFuIGFzIGEgR2VuaWUgY2FsbCBzbyB0aGUgZXhwZXJpbWVudCBVSSB0eXBlcyBpdCBgR0VOSUVgXG4gKiBhbmQgdGFncyB0aGUgdHJhY2UgYGdlbmllPXRydWVgLiBTYWZlIG5vLW9wIHdoZW4gbm8gcmVjb3JkaW5nIHNwYW4gaXMgYWN0aXZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhbXBHZW5pZVRvb2xTcGFuKHNwYW46IFNwYW4gfCB1bmRlZmluZWQgPSB0cmFjZS5nZXRBY3RpdmVTcGFuKCkpOiB2b2lkIHtcbiAgaWYgKCFzcGFuPy5pc1JlY29yZGluZygpKSByZXR1cm47XG4gIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19TUEFOX1RZUEVfQVRUUiwgTUxGTE9XX1NQQU5fVFlQRV9HRU5JRSk7XG4gIHNwYW4uc2V0QXR0cmlidXRlKEdFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSLCBcImV4ZWN1dGVfdG9vbFwiKTtcbiAgc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX0dFTklFX1RBR19BVFRSLCBcInRydWVcIik7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RIZWFkZXIocmVxOiBleHByZXNzLlJlcXVlc3QsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZyb21NZXRob2QgPSB0eXBlb2YgcmVxLmhlYWRlciA9PT0gXCJmdW5jdGlvblwiID8gdHJpbVRvTnVsbChyZXEuaGVhZGVyKG5hbWUpKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGZyb21NZXRob2QpIHJldHVybiBmcm9tTWV0aG9kO1xuICBjb25zdCByYXcgPSByZXEuaGVhZGVycz8uW25hbWUudG9Mb3dlckNhc2UoKV07XG4gIGNvbnN0IHZhbHVlID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3WzBdIDogcmF3O1xuICByZXR1cm4gdHJpbVRvTnVsbCh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHVuZGVmaW5lZCkgPz8gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0UXVlcnkocmVxOiBleHByZXNzLlJlcXVlc3QsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhdyA9IHJlcS5xdWVyeT8uW25hbWVdO1xuICBjb25zdCB2YWx1ZSA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhd1swXSA6IHJhdztcbiAgcmV0dXJuIHRyaW1Ub051bGwodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB1bmRlZmluZWQpID8/IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc3RhbXBNbGZsb3dBY3RvcihzcGFuOiBTcGFuLCByZXE6IGV4cHJlc3MuUmVxdWVzdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0SGVhZGVyKHJlcSwgVVNFUl9FTUFJTF9IRUFERVIpID8/IHJlcXVlc3RIZWFkZXIocmVxLCBVU0VSX0lEX0hFQURFUik7XG4gIGlmICh1c2VyKSBzcGFuLnNldEF0dHJpYnV0ZShVU0VSX1RSQUNFX0FUVFJJQlVURSwgdXNlcik7XG4gIGNvbnN0IHNlc3Npb24gPSByZXF1ZXN0SGVhZGVyKHJlcSwgVEhSRUFEX0lEX0hFQURFUikgPz8gcmVxdWVzdFF1ZXJ5KHJlcSwgVEhSRUFEX0lEX1FVRVJZKTtcbiAgaWYgKHNlc3Npb24pIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19TRVNTSU9OX0FUVFIsIHNlc3Npb24pO1xuICByZXR1cm4gdXNlcjtcbn1cblxuZnVuY3Rpb24gdHJhY2VJZChzcGFuOiBTcGFuIHwgdW5kZWZpbmVkID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSBzcGFuPy5zcGFuQ29udGV4dCgpLnRyYWNlSWQ7XG4gIHJldHVybiB2YWx1ZSAmJiB2YWx1ZSAhPT0gSU5WQUxJRF9UUkFDRV9JRCA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpOiBDaGF0VHJhY2VTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZXh0LmFjdGl2ZSgpLmdldFZhbHVlKENIQVRfVFJBQ0VfU1RBVEVfS0VZKSBhcyBDaGF0VHJhY2VTdGF0ZSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBCaW5kIGEgTWFzdHJhIGFnZW50IHJ1biB0byB0aGUgdHJhY2Ugc2VsZWN0ZWQgYnkgY2hhdCB0ZWxlbWV0cnkuXG4gKlxuICogRGF0YWJyaWNrcyBBcHBzIHVzZXMgYSBkZWRpY2F0ZWQgYWdlbnQgdHJhY2UgYmVjYXVzZSBldmVudGVkIGFnZW50cyBmaW5pc2hcbiAqIGJlZm9yZSB0aGUgSFRUUCBzZXJ2ZXIgc3Bhbi4gUHJvbW90aW5nIE1MZmxvdyB0cmFjZSBpbmZvIGFmdGVyIHRoZSBhZ2VudCByb290XG4gKiBjbG9zZXMgYXZvaWRzIHRoZSBzaWRlY2FyIHJlcGxhY2luZyBjbGVhbiBwcmV2aWV3cyBhbmQgdGFncyB3aXRoIGVtcHR5IEhUVFBcbiAqIHRyYWNlIG1ldGFkYXRhLiBPdGhlciBydW50aW1lcyByZXRhaW4gdGhlIGV4aXN0aW5nIEhUVFAvbG9jYWwgcGFyZW50YWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0aXZlQ2hhdFRyYWNpbmdPcHRpb25zKFxuICBvcHRpb25zOiBUcmFjaW5nT3B0aW9ucyB8IHVuZGVmaW5lZCxcbik6IFRyYWNpbmdPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhdGUgPSBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpO1xuICBpZiAoIXN0YXRlKSByZXR1cm4gb3B0aW9ucztcbiAgcmV0dXJuIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHRyYWNlSWQ6IHN0YXRlLnRyYWNlSWQsXG4gICAgLi4uKHN0YXRlLnBhcmVudFNwYW5JZCA/IHsgcGFyZW50U3BhbklkOiBzdGF0ZS5wYXJlbnRTcGFuSWQgfSA6IHsgcGFyZW50U3BhbklkOiB1bmRlZmluZWQgfSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNldENoYXRUcmFjZVRhZyhzdGF0ZTogQ2hhdFRyYWNlU3RhdGUsIG5hbWU6IHN0cmluZywgdmFsdWU6IENoYXRUcmFjZVRhZ1ZhbHVlKTogdm9pZCB7XG4gIGNvbnN0IHRhZyA9IHRyaW1Ub051bGwobmFtZSk7XG4gIGlmICghdGFnKSByZXR1cm47XG4gIHN0YXRlLnRhZ3Muc2V0KHRhZywgU3RyaW5nKHZhbHVlKSk7XG59XG5cbi8qKiBJbmplY3Qgb25lIE1MZmxvdyB0cmFjZSB0YWcgaW50byB0aGUgYWN0aXZlIGNoYXQgcmVxdWVzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBY3RpdmVUcmFjZVRhZyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBDaGF0VHJhY2VUYWdWYWx1ZSA9IHRydWUpOiB2b2lkIHtcbiAgY29uc3Qgc3RhdGUgPSBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpO1xuICBpZiAoc3RhdGUpIHNldENoYXRUcmFjZVRhZyhzdGF0ZSwgbmFtZSwgdmFsdWUpO1xufVxuXG4vKiogSW5qZWN0IG11bHRpcGxlIE1MZmxvdyB0cmFjZSB0YWdzIGludG8gdGhlIGFjdGl2ZSBjaGF0IHJlcXVlc3QuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VUYWdzKFxuICB0YWdzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBDaGF0VHJhY2VUYWdWYWx1ZSB8IHVuZGVmaW5lZD4+LFxuKTogdm9pZCB7XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKCFzdGF0ZSkgcmV0dXJuO1xuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGFncykpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgc2V0Q2hhdFRyYWNlVGFnKHN0YXRlLCBuYW1lLCB2YWx1ZSk7XG4gIH1cbn1cblxuLyoqIFJlY29yZCB0aGUgZmlyc3Qgc2VsZWN0ZWQgbW9kZWwgYXMgdGhlIGFjdGl2ZSBjaGF0IHRyYWNlJ3MgYGFnZW50YCB0YWcuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VNb2RlbChtb2RlbElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgdmFsdWUgPSB0cmltVG9OdWxsKG1vZGVsSWQpO1xuICBpZiAoIXZhbHVlKSByZXR1cm47XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKCFzdGF0ZSB8fCBzdGF0ZS5maXJzdE1vZGVsKSByZXR1cm47XG4gIHN0YXRlLmZpcnN0TW9kZWwgPSB2YWx1ZTtcbiAgc2V0Q2hhdFRyYWNlVGFnKHN0YXRlLCBNTEZMT1dfQUdFTlRfVEFHLCB2YWx1ZSk7XG4gIGNvbnN0IHNwYW4gPSB0cmFjZS5nZXRBY3RpdmVTcGFuKCk7XG4gIGlmIChzcGFuPy5pc1JlY29yZGluZygpKSBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfQUdFTlRfVEFHX0FUVFIsIHZhbHVlKTtcbiAgdXBkYXRlQWN0aXZlTWxmbG93VHJhY2VUYWdzKHsgW01MRkxPV19BR0VOVF9UQUddOiB2YWx1ZSB9KTtcbn1cblxuLyoqIFJlY29yZCB0aGUgYmVzdCByZXNvbHZlZCB1c2VyIGlkZW50aWZpZXIgb24gdGhlIGFjdGl2ZSBjaGF0IHRyYWNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEFjdGl2ZVRyYWNlVXNlcih1c2VyOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgY29uc3QgdmFsdWUgPSB0cmltVG9OdWxsKHVzZXIpO1xuICBpZiAoIXZhbHVlKSByZXR1cm47XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKHN0YXRlKSBzdGF0ZS51c2VyID0gdmFsdWU7XG59XG5cbi8qKiBSZWNvcmQgb25lIERhdGFicmlja3MgYXV0aGVudGljYXRpb24gbW9kZSB1c2VkIGR1cmluZyB0aGUgYWN0aXZlIGNoYXQgdHJhY2UuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VBdXRoKGF1dGg6IFwib2JvXCIgfCBcInNlcnZpY2UtcHJpbmNpcGFsXCIpOiB2b2lkIHtcbiAgcmVjb3JkQWN0aXZlVHJhY2VUYWcoYXV0aCA9PT0gXCJvYm9cIiA/IE1MRkxPV19PQk9fQVVUSF9UQUcgOiBNTEZMT1dfU1BfQVVUSF9UQUcpO1xufVxuXG4vKiogUHVibGlzaCB0aGUgdHVybidzIE1MZmxvdyB0cmFjZSBpZCBiZWZvcmUgdGhlIGhhbmRsZXIgd3JpdGVzIHRoZSBib2R5LiAqL1xuZnVuY3Rpb24gc3RhbXBNbGZsb3dUcmFjZUlkKHJlczogZXhwcmVzcy5SZXNwb25zZSwgdHJhY2VJZDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChyZXMuaGVhZGVyc1NlbnQpIHJldHVybjtcbiAgaWYgKCF0cmFjZUlkIHx8IHRyYWNlSWQgPT09IElOVkFMSURfVFJBQ0VfSUQpIHJldHVybjtcbiAgcmVzLnNldEhlYWRlcihNTEZMT1dfVFJBQ0VfSURfSEVBREVSLCBgdHItJHt0cmFjZUlkfWApO1xufVxuXG4vKiogU2VyaWFsaXplIGEgdHJhbnNpZW50IHRyYWNlLWlkIHBhcnQgZm9yIHByb3hpZXMgdGhhdCByZW1vdmUgY3VzdG9tIGhlYWRlcnMuICovXG5mdW5jdGlvbiBtbGZsb3dUcmFjZVBhcnQodHJhY2VJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBkYXRhOiAke0pTT04uc3RyaW5naWZ5KHtcbiAgICB0eXBlOiBNTEZMT1dfVFJBQ0VfUEFSVF9UWVBFLFxuICAgIGRhdGE6IHsgdHJhY2VJZDogYHRyLSR7dHJhY2VJZH1gIH0sXG4gICAgdHJhbnNpZW50OiB0cnVlLFxuICB9KX1cXG5cXG5gO1xufVxuXG4vKiogUmV0dXJuIG9uZSByYXcgcHJvbXB0IHdoZW4gdGhlIHJlcXVlc3QgaXMgZXhhY3RseSBvbmUgdGV4dC1vbmx5IHVzZXIgbWVzc2FnZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0T25seUNoYXRJbnB1dChtZXNzYWdlczogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgbWVzc2FnZXMgPT09IFwic3RyaW5nXCIpIHJldHVybiBtZXNzYWdlcyB8fCB1bmRlZmluZWQ7XG4gIGlmICghQXJyYXkuaXNBcnJheShtZXNzYWdlcykgfHwgbWVzc2FnZXMubGVuZ3RoICE9PSAxKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXNbMF07XG4gIGlmICghaXNSZWNvcmQobWVzc2FnZSkgfHwgbWVzc2FnZS5yb2xlICE9PSBcInVzZXJcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQgPT09IFwic3RyaW5nXCIpIHJldHVybiBtZXNzYWdlLmNvbnRlbnQgfHwgdW5kZWZpbmVkO1xuICByZXR1cm4gdGV4dEZyb21QYXJ0cyhtZXNzYWdlLnBhcnRzKSA/PyB0ZXh0RnJvbVBhcnRzKG1lc3NhZ2UuY29udGVudCk7XG59XG5cbmZ1bmN0aW9uIHRleHRGcm9tUGFydHModmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdGV4dDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBwYXJ0IG9mIHZhbHVlKSB7XG4gICAgaWYgKCFpc1JlY29yZChwYXJ0KSB8fCBwYXJ0LnR5cGUgIT09IFwidGV4dFwiIHx8IHR5cGVvZiBwYXJ0LnRleHQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRleHQucHVzaChwYXJ0LnRleHQpO1xuICB9XG4gIGNvbnN0IGpvaW5lZCA9IHRleHQuam9pbihcIlwiKTtcbiAgcmV0dXJuIGpvaW5lZCB8fCB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZWQodmFsdWU6IHVua25vd24sIGxpbWl0ID0gVFJBQ0VfSU9fTElNSVQpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpPy5zbGljZSgwLCBsaW1pdCkgPz8gU3RyaW5nKHZhbHVlKS5zbGljZSgwLCBsaW1pdCk7XG59XG5cbmZ1bmN0aW9uIHNzZUZyYW1lKGxpbmU6IHN0cmluZyk6IHVua25vd24ge1xuICBpZiAoIWxpbmUuc3RhcnRzV2l0aChcImRhdGE6XCIpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gcGFyc2UobGluZS5zbGljZSg1KSk7XG59XG5cbmZ1bmN0aW9uIHZhbHVlVXNlc0dlbmllKHZhbHVlOiB1bmtub3duLCBkZXB0aCA9IDApOiBib29sZWFuIHtcbiAgaWYgKGRlcHRoID4gMykgcmV0dXJuIGZhbHNlO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5zb21lKChpdGVtKSA9PiB2YWx1ZVVzZXNHZW5pZShpdGVtLCBkZXB0aCArIDEpKTtcbiAgaWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKFxuICAgIHZhbHVlLnR5cGUgPT09IFwiZGF0YS1nZW5pZS1wcm9ncmVzc1wiIHx8XG4gICAgdmFsdWUudHlwZSA9PT0gXCJhc2tfZ2VuaWVfZG9uZVwiIHx8XG4gICAgdmFsdWUudG9vbE5hbWUgPT09IFwiYXNrX2dlbmllXCIgfHxcbiAgICB2YWx1ZS50b29sX25hbWUgPT09IFwiYXNrX2dlbmllXCIgfHxcbiAgICB2YWx1ZS5uYW1lID09PSBcImFza19nZW5pZVwiXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBbXCJkYXRhXCIsIFwiZXZlbnRcIiwgXCJwYXlsb2FkXCJdLnNvbWUoKGtleSkgPT4gdmFsdWVVc2VzR2VuaWUodmFsdWVba2V5XSwgZGVwdGggKyAxKSk7XG59XG5cbi8qKiBSZXR1cm4gdGhlIGFzc2lzdGFudCB0ZXh0IGZyb20gb25lIFNTRSBsaW5lLCBvciBhbiBlbXB0eSBzdHJpbmcuICovXG5mdW5jdGlvbiBhc3Npc3RhbnRUZXh0RnJvbVNzZUxpbmUobGluZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFzc2lzdGFudFRleHRGcm9tU3NlRnJhbWUoc3NlRnJhbWUobGluZSkpO1xufVxuXG5mdW5jdGlvbiBhc3Npc3RhbnRUZXh0RnJvbVNzZUZyYW1lKGZyYW1lOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKCFpc1JlY29yZChmcmFtZSkgfHwgZnJhbWUudHlwZSAhPT0gXCJ0ZXh0LWRlbHRhXCIpIHJldHVybiBcIlwiO1xuICBjb25zdCB0ZXh0ID1cbiAgICB0eXBlb2YgZnJhbWUuZGVsdGEgPT09IFwic3RyaW5nXCJcbiAgICAgID8gZnJhbWUuZGVsdGFcbiAgICAgIDogaXNSZWNvcmQoZnJhbWUucGF5bG9hZClcbiAgICAgICAgPyBmcmFtZS5wYXlsb2FkLnRleHRcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2YgdGV4dCA9PT0gXCJzdHJpbmdcIiA/IHRleHQgOiBcIlwiO1xufVxuXG4vKipcbiAqIENvbmNhdGVuYXRlIHRoZSBhc3Npc3RhbnQncyBhbnN3ZXIgb3V0IG9mIGFuIEFJIFNESyBTU0UgdHJhbnNjcmlwdC5cbiAqXG4gKiBUaGUgYWdlbnQgc3RyZWFtcyBpdHMgcmVwbHkgYXMgYHRleHQtZGVsdGFgIGZyYW1lc1xuICogKGBkYXRhOiB7XCJ0eXBlXCI6XCJ0ZXh0LWRlbHRhXCIsXCJwYXlsb2FkXCI6e1widGV4dFwiOlwiLi4uXCJ9fWApLCBzbyB0aGUgZnVsbFxuICogYW5zd2VyIG9ubHkgZXZlciBleGlzdHMgYXMgZGVsdGFzIG9uIHRoZSB3aXJlIGFuZCBoYXMgdG8gYmVcbiAqIHJlYXNzZW1ibGVkIGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3Npc3RhbnRUZXh0RnJvbVNzZShib2R5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGJvZHkuc3BsaXQoXCJcXG5cIikpIHtcbiAgICBjb25zdCB0ZXh0ID0gYXNzaXN0YW50VGV4dEZyb21Tc2VMaW5lKGxpbmUpO1xuICAgIGlmICh0ZXh0KSBwYXJ0cy5wdXNoKHRleHQpO1xuICB9XG4gIHJldHVybiBwYXJ0cy5qb2luKFwiXCIpLnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUKTtcbn1cblxuLyoqIFJlYWQgdGhlIGZpbmFsIGFzc2lzdGFudCB0ZXh0IGZyb20gYSBub24tc3RyZWFtaW5nIE1hc3RyYSByZXNwb25zZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3Npc3RhbnRUZXh0RnJvbUpzb24oYm9keTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICghaXNSZWNvcmQoYm9keSkgfHwgdHlwZW9mIGJvZHkudGV4dCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIFwiXCI7XG4gIHJldHVybiBib2R5LnRleHQuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpO1xufVxuXG5jb25zdCBNQVNUUkFfQUdFTlRfSU5QVVRfQVRUUiA9IFwibWFzdHJhLmFnZW50X3J1bi5pbnB1dFwiO1xuY29uc3QgTUFTVFJBX0FHRU5UX09VVFBVVF9BVFRSID0gXCJtYXN0cmEuYWdlbnRfcnVuLm91dHB1dFwiO1xuY29uc3QgR0VOX0FJX1JFUVVFU1RfTU9ERUxfQVRUUiA9IFwiZ2VuX2FpLnJlcXVlc3QubW9kZWxcIjtcbmNvbnN0IEdFTl9BSV9BR0VOVF9JRF9BVFRSID0gXCJnZW5fYWkuYWdlbnQuaWRcIjtcbmNvbnN0IEdFTl9BSV9BR0VOVF9OQU1FX0FUVFIgPSBcImdlbl9haS5hZ2VudC5uYW1lXCI7XG5jb25zdCBNQVNUUkFfTU9ERUxfTUVUQURBVEFfQVRUUiA9IFwibWFzdHJhLm1ldGFkYXRhLm1vZGVsTWV0YWRhdGFcIjtcbmNvbnN0IE1BU1RSQV9NRVRBREFUQV9QUkVGSVggPSBcIm1hc3RyYS5tZXRhZGF0YS5cIjtcblxuaW50ZXJmYWNlIEFwcE1sZmxvd1RyYWNlU3RhdGUge1xuICByZWFkb25seSB0YWdzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICBnZW5pZTogYm9vbGVhbjtcbiAgbW9kZWw/OiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGF0dHJpYnV0ZVN0cmluZyhzcGFuOiBSZWFkYWJsZVNwYW4sIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gc3Bhbi5hdHRyaWJ1dGVzW25hbWVdO1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gKHRyaW1Ub051bGwodmFsdWUpID8/IHVuZGVmaW5lZCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIG1ldGFkYXRhQXR0cmlidXRlKGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke01BU1RSQV9NRVRBREFUQV9QUkVGSVh9JHtrZXl9YDtcbn1cblxuZnVuY3Rpb24gbW9kZWxGcm9tU3BhbihzcGFuOiBSZWFkYWJsZVNwYW4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkaXJlY3QgPSBhdHRyaWJ1dGVTdHJpbmcoc3BhbiwgR0VOX0FJX1JFUVVFU1RfTU9ERUxfQVRUUik7XG4gIGlmIChkaXJlY3QpIHJldHVybiBkaXJlY3Q7XG4gIGNvbnN0IG1ldGFkYXRhID0gcGFyc2UoYXR0cmlidXRlU3RyaW5nKHNwYW4sIE1BU1RSQV9NT0RFTF9NRVRBREFUQV9BVFRSKSk7XG4gIHJldHVybiBpc1JlY29yZChtZXRhZGF0YSkgJiYgdHlwZW9mIG1ldGFkYXRhLm1vZGVsSWQgPT09IFwic3RyaW5nXCJcbiAgICA/ICh0cmltVG9OdWxsKG1ldGFkYXRhLm1vZGVsSWQpID8/IHVuZGVmaW5lZClcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc3BhblVzZXNHZW5pZShzcGFuOiBSZWFkYWJsZVNwYW4pOiBib29sZWFuIHtcbiAgaWYgKHNwYW4uYXR0cmlidXRlc1tNTEZMT1dfR0VOSUVfVEFHX0FUVFJdID09PSBcInRydWVcIikgcmV0dXJuIHRydWU7XG4gIGlmICgvXFxiYXNrX2dlbmllKD86X3xcXGIpL2kudGVzdChzcGFuLm5hbWUpKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIFtcImdlbl9haS50b29sLm5hbWVcIiwgXCJtYXN0cmEudG9vbF9jYWxsLm5hbWVcIl0uc29tZSgobmFtZSkgPT5cbiAgICAvXmFza19nZW5pZSg/Ol98JCkvaS50ZXN0KGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBuYW1lKSA/PyBcIlwiKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdFRyYWNlVGFncyhzcGFuOiBSZWFkYWJsZVNwYW4sIHN0YXRlOiBBcHBNbGZsb3dUcmFjZVN0YXRlKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzcGFuLmF0dHJpYnV0ZXMpKSB7XG4gICAgaWYgKCFuYW1lLnN0YXJ0c1dpdGgoTUxGTE9XX1RSQUNFX1RBR19QUkVGSVgpKSBjb250aW51ZTtcbiAgICBjb25zdCB0YWcgPSBuYW1lLnNsaWNlKE1MRkxPV19UUkFDRV9UQUdfUFJFRklYLmxlbmd0aCk7XG4gICAgaWYgKFxuICAgICAgdGFnICYmXG4gICAgICAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKVxuICAgICkge1xuICAgICAgc3RhdGUudGFncy5zZXQodGFnLCBTdHJpbmcodmFsdWUpKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaHJUaW1lTWlsbGlzZWNvbmRzKHZhbHVlOiByZWFkb25seSBbbnVtYmVyLCBudW1iZXJdKTogbnVtYmVyIHtcbiAgcmV0dXJuIHZhbHVlWzBdICogMV8wMDAgKyB2YWx1ZVsxXSAvIDFfMDAwXzAwMDtcbn1cblxuZnVuY3Rpb24gcHJldmlld0lucHV0KHNwYW46IFJlYWRhYmxlU3Bhbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhdyA9IGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBNQVNUUkFfQUdFTlRfSU5QVVRfQVRUUik7XG4gIGlmICghcmF3KSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gKHRleHRPbmx5Q2hhdElucHV0KHBhcnNlKHJhdykpID8/IHJhdykuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpO1xufVxuXG5mdW5jdGlvbiBwcmV2aWV3T3V0cHV0KHNwYW46IFJlYWRhYmxlU3Bhbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhdyA9IGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBNQVNUUkFfQUdFTlRfT1VUUFVUX0FUVFIpO1xuICBpZiAoIXJhdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2UocmF3KTtcbiAgY29uc3QgdGV4dCA9IGFzc2lzdGFudFRleHRGcm9tSnNvbihwYXJzZWQpIHx8ICh0eXBlb2YgcGFyc2VkID09PSBcInN0cmluZ1wiID8gcGFyc2VkIDogcmF3KTtcbiAgcmV0dXJuIHRleHQuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpO1xufVxuXG4vKiogUHJvbW90ZSB0aGUgYWN0dWFsIE1hc3RyYSBgaW52b2tlX2FnZW50YCB0cmFjZSBleHBvcnRlZCBieSBBcHBLaXQncyBwcm92aWRlci4gKi9cbmV4cG9ydCBjbGFzcyBBcHBNbGZsb3dUcmFjZUluZm9TcGFuUHJvY2Vzc29yIGltcGxlbWVudHMgU3BhblByb2Nlc3NvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhY2VzID0gbmV3IE1hcDxzdHJpbmcsIEFwcE1sZmxvd1RyYWNlU3RhdGU+KCk7XG5cbiAgb25TdGFydChzcGFuOiBTZGtTcGFuLCBfcGFyZW50Q29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuICAgIGNvbnN0IHRyYWNlSWQgPSBzcGFuLnNwYW5Db250ZXh0KCkudHJhY2VJZDtcbiAgICBpZiAoIXRoaXMudHJhY2VzLmhhcyh0cmFjZUlkKSkge1xuICAgICAgdGhpcy50cmFjZXMuc2V0KHRyYWNlSWQsIHsgdGFnczogbmV3IE1hcCgpLCBnZW5pZTogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgb25FbmQoc3BhbjogUmVhZGFibGVTcGFuKTogdm9pZCB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHNwYW4uc3BhbkNvbnRleHQoKS50cmFjZUlkO1xuICAgIGNvbnN0IHN0YXRlOiBBcHBNbGZsb3dUcmFjZVN0YXRlID0gdGhpcy50cmFjZXMuZ2V0KHRyYWNlSWQpID8/IHtcbiAgICAgIHRhZ3M6IG5ldyBNYXAoKSxcbiAgICAgIGdlbmllOiBmYWxzZSxcbiAgICB9O1xuICAgIHRoaXMudHJhY2VzLnNldCh0cmFjZUlkLCBzdGF0ZSk7XG4gICAgY29sbGVjdFRyYWNlVGFncyhzcGFuLCBzdGF0ZSk7XG4gICAgc3RhdGUubW9kZWwgPz89IG1vZGVsRnJvbVNwYW4oc3Bhbik7XG4gICAgc3RhdGUuZ2VuaWUgfHw9IHNwYW5Vc2VzR2VuaWUoc3Bhbik7XG5cbiAgICBpZiAoYXR0cmlidXRlU3RyaW5nKHNwYW4sIEdFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSKSAhPT0gXCJpbnZva2VfYWdlbnRcIikge1xuICAgICAgaWYgKCFzcGFuLnBhcmVudFNwYW5Db250ZXh0Py5zcGFuSWQpIHRoaXMudHJhY2VzLmRlbGV0ZSh0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhZ2VudCA9XG4gICAgICBzdGF0ZS5tb2RlbCA/P1xuICAgICAgYXR0cmlidXRlU3RyaW5nKHNwYW4sIEdFTl9BSV9BR0VOVF9JRF9BVFRSKSA/P1xuICAgICAgYXR0cmlidXRlU3RyaW5nKHNwYW4sIEdFTl9BSV9BR0VOVF9OQU1FX0FUVFIpO1xuICAgIGlmIChhZ2VudCkgc3RhdGUudGFncy5zZXQoTUxGTE9XX0FHRU5UX1RBRywgYWdlbnQpO1xuICAgIGlmIChzdGF0ZS5nZW5pZSkgc3RhdGUudGFncy5zZXQoTUxGTE9XX0dFTklFX1RBRywgXCJ0cnVlXCIpO1xuICAgIGNvbnN0IGF1dGggPSBhdHRyaWJ1dGVTdHJpbmcoc3BhbiwgbWV0YWRhdGFBdHRyaWJ1dGUoTUFTVFJBX0FVVEhfTU9ERV9LRVkpKTtcbiAgICBpZiAoYXV0aCA9PT0gXCJvYm9cIikgc3RhdGUudGFncy5zZXQoTUxGTE9XX09CT19BVVRIX1RBRywgXCJ0cnVlXCIpO1xuICAgIGVsc2UgaWYgKGF1dGggPT09IFwic2VydmljZS1wcmluY2lwYWxcIikgc3RhdGUudGFncy5zZXQoTUxGTE9XX1NQX0FVVEhfVEFHLCBcInRydWVcIik7XG5cbiAgICBjb25zdCB1c2VyID1cbiAgICAgIGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBtZXRhZGF0YUF0dHJpYnV0ZShNQVNUUkFfVVNFUl9FTUFJTF9LRVkpKSA/P1xuICAgICAgYXR0cmlidXRlU3RyaW5nKHNwYW4sIG1ldGFkYXRhQXR0cmlidXRlKE1BU1RSQV9VU0VSX05BTUVfS0VZKSkgPz9cbiAgICAgIGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBtZXRhZGF0YUF0dHJpYnV0ZShNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKSk7XG4gICAgY29uc3Qgc2Vzc2lvbklkID1cbiAgICAgIGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBtZXRhZGF0YUF0dHJpYnV0ZShNQVNUUkFfVEhSRUFEX0lEX0tFWSkpID8/XG4gICAgICBhdHRyaWJ1dGVTdHJpbmcoc3BhbiwgXCJnZW5fYWkuY29udmVyc2F0aW9uLmlkXCIpO1xuICAgIGNvbnN0IHJlcXVlc3RQcmV2aWV3ID0gcHJldmlld0lucHV0KHNwYW4pO1xuICAgIGNvbnN0IHJlc3BvbnNlUHJldmlldyA9IHByZXZpZXdPdXRwdXQoc3Bhbik7XG4gICAgcGVyc2lzdEFwcE1sZmxvd1RyYWNlSW5mbyh7XG4gICAgICB0cmFjZUlkLFxuICAgICAgcmVxdWVzdFRpbWU6IGhyVGltZU1pbGxpc2Vjb25kcyhzcGFuLnN0YXJ0VGltZSksXG4gICAgICBleGVjdXRpb25EdXJhdGlvbjogaHJUaW1lTWlsbGlzZWNvbmRzKHNwYW4uZHVyYXRpb24pLFxuICAgICAgZXJyb3I6IHNwYW4uc3RhdHVzLmNvZGUgPT09IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgdGFnczogT2JqZWN0LmZyb21FbnRyaWVzKHN0YXRlLnRhZ3MpLFxuICAgICAgLi4uKHVzZXIgPyB7IHVzZXIgfSA6IHt9KSxcbiAgICAgIC4uLihzZXNzaW9uSWQgPyB7IHNlc3Npb25JZCB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3RQcmV2aWV3ID8geyByZXF1ZXN0UHJldmlldyB9IDoge30pLFxuICAgICAgLi4uKHJlc3BvbnNlUHJldmlldyA/IHsgcmVzcG9uc2VQcmV2aWV3IH0gOiB7fSksXG4gICAgfSk7XG4gICAgdGhpcy50cmFjZXMuZGVsZXRlKHRyYWNlSWQpO1xuICB9XG5cbiAgYXN5bmMgZm9yY2VGbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy50cmFjZXMuY2xlYXIoKTtcbiAgfVxufVxuXG5sZXQgYXBwTWxmbG93VHJhY2VJbmZvUHJvY2Vzc29yUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKiogUmVnaXN0ZXIgdHJhY2UgZW5yaWNobWVudCBiZWZvcmUgQXBwS2l0IGNvbnN0cnVjdHMgaXRzIG5hdGl2ZSBwcm92aWRlci4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWdpc3RlckFwcE1sZmxvd1RyYWNlSW5mb1Byb2Nlc3NvcigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKGFwcE1sZmxvd1RyYWNlSW5mb1Byb2Nlc3NvclJlZ2lzdGVyZWQpIHJldHVybiB0cnVlO1xuICBpZiAoIWFwcE1sZmxvd1RyYWNlSW5mb0NvbmZpZ3VyZWQoKSkgcmV0dXJuIGZhbHNlO1xuICBhd2FpdCBpbml0aWFsaXplQXBwTWxmbG93VHJhY2VJbmZvKCk7XG4gIGF3YWl0IHJlZ2lzdGVyTmF0aXZlU3BhblByb2Nlc3NvcihuZXcgQXBwTWxmbG93VHJhY2VJbmZvU3BhblByb2Nlc3NvcigpKTtcbiAgYXBwTWxmbG93VHJhY2VJbmZvUHJvY2Vzc29yUmVnaXN0ZXJlZCA9IHRydWU7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogSW5jcmVtZW50YWxseSBhc3NlbWJsZSBVVEYtOCBTU0UgdGV4dCB3aGlsZSByZXRhaW5pbmcgYSBib3VuZGVkIEpTT04gZmFsbGJhY2suICovXG5jbGFzcyBBc3Npc3RhbnRSZXNwb25zZUNvbGxlY3RvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKFwidXRmOFwiKTtcbiAgcHJpdmF0ZSBhbnN3ZXIgPSBcIlwiO1xuICBwcml2YXRlIGJvZHkgPSBcIlwiO1xuICBwcml2YXRlIHBlbmRpbmdMaW5lID0gXCJcIjtcbiAgcHJpdmF0ZSBmaW5pc2hlZCA9IGZhbHNlO1xuICBwcml2YXRlIGdlbmllID0gZmFsc2U7XG5cbiAgd3JpdGUoY2h1bms6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5maW5pc2hlZCkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRoaXMuY29uc3VtZShjaHVuayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoY2h1bmspKSB7XG4gICAgICB0aGlzLmNvbnN1bWUoXG4gICAgICAgIHRoaXMuZGVjb2Rlci53cml0ZShCdWZmZXIuZnJvbShjaHVuay5idWZmZXIsIGNodW5rLmJ5dGVPZmZzZXQsIGNodW5rLmJ5dGVMZW5ndGgpKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgZmluaXNoKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZmluaXNoZWQpIHJldHVybiB0aGlzLmFuc3dlciB8fCB0aGlzLmpzb25BbnN3ZXIoKTtcbiAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICB0aGlzLmNvbnN1bWUodGhpcy5kZWNvZGVyLmVuZCgpKTtcbiAgICB0aGlzLmNvbnN1bWVTc2VMaW5lKHRoaXMucGVuZGluZ0xpbmUpO1xuICAgIHRoaXMucGVuZGluZ0xpbmUgPSBcIlwiO1xuICAgIHJldHVybiB0aGlzLmFuc3dlciB8fCB0aGlzLmpzb25BbnN3ZXIoKTtcbiAgfVxuXG4gIHJhd0JvZHkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ib2R5LnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUKTtcbiAgfVxuXG4gIHVzZWRHZW5pZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZW5pZTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZSh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRleHQpIHJldHVybjtcbiAgICBpZiAodGhpcy5ib2R5Lmxlbmd0aCA8IFJFU1BPTlNFX0JPRFlfTElNSVQpIHtcbiAgICAgIHRoaXMuYm9keSArPSB0ZXh0LnNsaWNlKDAsIFJFU1BPTlNFX0JPRFlfTElNSVQgLSB0aGlzLmJvZHkubGVuZ3RoKTtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nTGluZSArPSB0ZXh0O1xuICAgIGxldCBuZXdsaW5lID0gdGhpcy5wZW5kaW5nTGluZS5pbmRleE9mKFwiXFxuXCIpO1xuICAgIHdoaWxlIChuZXdsaW5lID49IDApIHtcbiAgICAgIHRoaXMuY29uc3VtZVNzZUxpbmUodGhpcy5wZW5kaW5nTGluZS5zbGljZSgwLCBuZXdsaW5lKS5yZXBsYWNlKC9cXHIkLywgXCJcIikpO1xuICAgICAgdGhpcy5wZW5kaW5nTGluZSA9IHRoaXMucGVuZGluZ0xpbmUuc2xpY2UobmV3bGluZSArIDEpO1xuICAgICAgbmV3bGluZSA9IHRoaXMucGVuZGluZ0xpbmUuaW5kZXhPZihcIlxcblwiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGVuZGluZ0xpbmUubGVuZ3RoID4gUkVTUE9OU0VfQk9EWV9MSU1JVCkge1xuICAgICAgdGhpcy5wZW5kaW5nTGluZSA9IHRoaXMucGVuZGluZ0xpbmUuc2xpY2UoLVJFU1BPTlNFX0JPRFlfTElNSVQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZVNzZUxpbmUobGluZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZnJhbWUgPSBzc2VGcmFtZShsaW5lKTtcbiAgICB0aGlzLmdlbmllIHx8PSB2YWx1ZVVzZXNHZW5pZShmcmFtZSk7XG4gICAgaWYgKHRoaXMuYW5zd2VyLmxlbmd0aCA+PSBUUkFDRV9JT19MSU1JVCkgcmV0dXJuO1xuICAgIGNvbnN0IHRleHQgPSBhc3Npc3RhbnRUZXh0RnJvbVNzZUZyYW1lKGZyYW1lKTtcbiAgICB0aGlzLmFuc3dlciArPSB0ZXh0LnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUIC0gdGhpcy5hbnN3ZXIubGVuZ3RoKTtcbiAgfVxuXG4gIHByaXZhdGUganNvbkFuc3dlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiBhc3Npc3RhbnRUZXh0RnJvbUpzb24ocGFyc2UodGhpcy5ib2R5KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZWxlY3QgdGhlIHNwYW4gTUxmbG93IHRyZWF0cyBhcyB0aGUgcmVxdWVzdCByb290LlxuICpcbiAqIE9UZWwgSFRUUCBpbnN0cnVtZW50YXRpb24gc3RvcmVzIGl0cyBzZXJ2ZXIgc3BhbiBpbiBSUEMgbWV0YWRhdGEuIFRoYXQgc3BhblxuICogd2lucyBvdmVyIGFuIGFjdGl2ZSBFeHByZXNzIGNoaWxkLiBJZiBubyByZWNvcmRpbmcgbG9jYWwgc3BhbiBleGlzdHMsIGNyZWF0ZVxuICogb25lIHVuZGVyIHRoZSBjdXJyZW50IGNvbnRleHQgc28gZW5hYmxlZCBXM0MgcHJvcGFnYXRpb24gcmVtYWlucyBpbnRhY3QuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVUcmFjZVRhcmdldCgpOiBUcmFjZVRhcmdldCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGFjdGl2ZUNvbnRleHQgPSBjb250ZXh0LmFjdGl2ZSgpO1xuICBpZiAoZGlyZWN0TWxmbG93VHJhY2luZ0FjdGl2ZSgpKSB7XG4gICAgY29uc3Qgc3BhbiA9IHRyYWNlLmdldFRyYWNlcihDSEFUX1RVUk5fVFJBQ0VSKS5zdGFydFNwYW4oXG4gICAgICBcIm1hc3RyYS5jaGF0X3R1cm5cIixcbiAgICAgIHtcbiAgICAgICAga2luZDogU3BhbktpbmQuU0VSVkVSLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgW0FQUEtJVF9BR0VOVF9UUkFDRV9ST09UX0FUVFJdOiB0cnVlLFxuICAgICAgICAgIFtNTEZMT1dfU1BBTl9UWVBFX0FUVFJdOiBNTEZMT1dfU1BBTl9UWVBFX0FHRU5ULFxuICAgICAgICAgIFtHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUl06IFwiaW52b2tlX2FnZW50XCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJhY2UuZGVsZXRlU3BhbihhY3RpdmVDb250ZXh0KSxcbiAgICApO1xuICAgIGlmICghc3Bhbi5pc1JlY29yZGluZygpKSB7XG4gICAgICBzcGFuLmVuZCgpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3Bhbiwgb3duZWQ6IHRydWUgfTtcbiAgfVxuXG4gIGNvbnN0IHJwYyA9IGdldFJQQ01ldGFkYXRhKGFjdGl2ZUNvbnRleHQpO1xuICBpZiAocnBjPy50eXBlID09PSBSUENUeXBlLkhUVFAgJiYgcnBjLnNwYW4uaXNSZWNvcmRpbmcoKSkge1xuICAgIHJldHVybiB7IHNwYW46IHJwYy5zcGFuLCBvd25lZDogZmFsc2UgfTtcbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZSA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKTtcbiAgaWYgKGFjdGl2ZT8uaXNSZWNvcmRpbmcoKSkgcmV0dXJuIHsgc3BhbjogYWN0aXZlLCBvd25lZDogZmFsc2UgfTtcblxuICBjb25zdCBzcGFuID0gdHJhY2UuZ2V0VHJhY2VyKENIQVRfVFVSTl9UUkFDRVIpLnN0YXJ0U3BhbihcbiAgICBcIm1hc3RyYS5jaGF0X3R1cm5cIixcbiAgICB7XG4gICAgICBraW5kOiBTcGFuS2luZC5TRVJWRVIsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIFtBUFBLSVRfQUdFTlRfVFJBQ0VfUk9PVF9BVFRSXTogdHJ1ZSxcbiAgICAgICAgW01MRkxPV19TUEFOX1RZUEVfQVRUUl06IE1MRkxPV19TUEFOX1RZUEVfQUdFTlQsXG4gICAgICAgIFtHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUl06IFwiaW52b2tlX2FnZW50XCIsXG4gICAgICB9LFxuICAgIH0sXG4gICAgYWN0aXZlQ29udGV4dCxcbiAgKTtcbiAgaWYgKCFzcGFuLmlzUmVjb3JkaW5nKCkpIHtcbiAgICBzcGFuLmVuZCgpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgc3Bhbiwgb3duZWQ6IHRydWUgfTtcbn1cblxuLyoqXG4gKiBFeHByZXNzIG1pZGRsZXdhcmUgdGhhdCBzdGFtcHMgY2hhdCB0dXJuIEkvTyBvbnRvIHRoZSBleHBvcnRlZCBPVGVsIHJvb3QuXG4gKlxuICogVGVlIGByZXMud3JpdGVgLCBgcmVzLmpzb25gLCBhbmQgYHJlcy5lbmRgIGluc3RlYWQgb2YgbGlzdGVuaW5nIGZvciBgZmluaXNoYDpcbiAqIEhUVFAgaW5zdHJ1bWVudGF0aW9uIGVuZHMgaXRzIHNlcnZlciBzcGFuIG9uIGZpbmlzaCwgYW5kIGF0dHJpYnV0ZXMgc2V0XG4gKiBhZnRlciBhIHNwYW4gZW5kcyBuZXZlciByZWFjaCB0aGUgZXhwb3J0ZXIuXG4gKlxuICogYHBhdGhgIGlzIG1vdW50LXJlbGF0aXZlICh3aGF0IHRoZSBNYXN0cmEgc3ViLWFwcCBzZWVzKSwgZS5nLlxuICogYC9hZ2VudHMvc3VwcG9ydC9zdHJlYW1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhdFR1cm5UZWxlbWV0cnlNaWRkbGV3YXJlKFxuICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICBuZXh0OiBleHByZXNzLk5leHRGdW5jdGlvbixcbiAgb3B0aW9uczogQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgaWYgKHJlcS5tZXRob2QgIT09IFwiUE9TVFwiIHx8ICFBR0VOVF9UVVJOX1JPVVRFLnRlc3QocmVxLnBhdGgpKSB7XG4gICAgbmV4dCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0YXJnZXQgPSByZXNvbHZlVHJhY2VUYXJnZXQoKTtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICBuZXh0KCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRhcmdldFRyYWNlSWQgPSB0cmFjZUlkKHRhcmdldC5zcGFuKTtcbiAgaWYgKCF0YXJnZXRUcmFjZUlkKSB7XG4gICAgaWYgKHRhcmdldC5vd25lZCkgdGFyZ2V0LnNwYW4uZW5kKCk7XG4gICAgbmV4dCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0cmFjZVN0YXRlOiBDaGF0VHJhY2VTdGF0ZSA9IHtcbiAgICB0YWdzOiBuZXcgTWFwKCksXG4gICAgdHJhY2VJZDogdGFyZ2V0VHJhY2VJZCxcbiAgICBwYXJlbnRTcGFuSWQ6IHRhcmdldC5zcGFuLnNwYW5Db250ZXh0KCkuc3BhbklkLFxuICB9O1xuICBjb25zdCB0cmFjZVJlcXVlc3RUaW1lID0gRGF0ZS5ub3coKTtcbiAgaWYgKCFpc0RhdGFicmlja3NBcHBFbnYoKSkge1xuICAgIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBNTEZMT1dfTE9DQUxfVEFHLCB0cnVlKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0UmVxdWVzdFRhZ3MocmVxKSkpIHtcbiAgICBzZXRDaGF0VHJhY2VUYWcodHJhY2VTdGF0ZSwgbmFtZSwgdmFsdWUpO1xuICB9XG4gIGNvbnN0IGluaXRpYWxUYWdzID0gdHlwZW9mIG9wdGlvbnMudGFncyA9PT0gXCJmdW5jdGlvblwiID8gb3B0aW9ucy50YWdzKHJlcSkgOiBvcHRpb25zLnRhZ3M7XG4gIGlmIChpbml0aWFsVGFncykge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbml0aWFsVGFncykpIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSBzZXRDaGF0VHJhY2VUYWcodHJhY2VTdGF0ZSwgbmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICBzdGFtcE1sZmxvd1RyYWNlSWQocmVzLCB0cmFjZVN0YXRlLnRyYWNlSWQpO1xuICB0cmFjZVN0YXRlLnVzZXIgPSBzdGFtcE1sZmxvd0FjdG9yKHRhcmdldC5zcGFuLCByZXEpO1xuICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX1NQQU5fVFlQRV9BVFRSLCBNTEZMT1dfU1BBTl9UWVBFX0FHRU5UKTtcbiAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKEdFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSLCBcImludm9rZV9hZ2VudFwiKTtcbiAgY29uc3QgaWRlbnRpdHkgPVxuICAgIHR5cGVvZiBvcHRpb25zLmlkZW50aXR5ID09PSBcImZ1bmN0aW9uXCIgPyBvcHRpb25zLmlkZW50aXR5KHJlcSkgOiBvcHRpb25zLmlkZW50aXR5O1xuICBpZiAoaWRlbnRpdHkpIHtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9JREVOVElUWV9BVFRSLCBpZGVudGl0eSk7XG4gICAgc2V0Q2hhdFRyYWNlVGFnKFxuICAgICAgdHJhY2VTdGF0ZSxcbiAgICAgIGlkZW50aXR5ID09PSBcIm9ib1wiID8gTUxGTE9XX09CT19BVVRIX1RBRyA6IE1MRkxPV19TUF9BVVRIX1RBRyxcbiAgICAgIHRydWUsXG4gICAgKTtcbiAgfVxuICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9HRU5JRV9VU0VEX0FUVFIsIGZhbHNlKTtcblxuICBjb25zdCBtZXNzYWdlcyA9IChyZXEuYm9keSBhcyB7IG1lc3NhZ2VzPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8ubWVzc2FnZXM7XG4gIGxldCByZXF1ZXN0UHJldmlldzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpZiAobWVzc2FnZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGZ1bGxJbnB1dCA9IHNlcmlhbGl6ZWQobWVzc2FnZXMpO1xuICAgIHJlcXVlc3RQcmV2aWV3ID0gdGV4dE9ubHlDaGF0SW5wdXQobWVzc2FnZXMpID8/IGZ1bGxJbnB1dDtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9NRVNTQUdFU19BVFRSLCBmdWxsSW5wdXQpO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9JTlBVVFNfQVRUUiwgcmVxdWVzdFByZXZpZXcuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpKTtcbiAgfVxuXG4gIGNvbnN0IGNvbGxlY3RvciA9IG5ldyBBc3Npc3RhbnRSZXNwb25zZUNvbGxlY3RvcigpO1xuICBsZXQgcmVzcG9uc2VQcmV2aWV3OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBvdXRwdXRSZWNvcmRlZCA9IGZhbHNlO1xuICBsZXQgZnVsbE91dHB1dFJlY29yZGVkID0gZmFsc2U7XG4gIGxldCBnZW5pZVJlY29yZGVkID0gZmFsc2U7XG4gIGxldCBvd25lZFNwYW5FbmRlZCA9IGZhbHNlO1xuICBsZXQgdHJhY2VGaW5hbGl6ZWQgPSBmYWxzZTtcbiAgbGV0IHRyYWNlUGFydFdyaXR0ZW4gPSBmYWxzZTtcbiAgY29uc3QgcGFzc1Rocm91Z2hXcml0ZSA9IHJlcy53cml0ZS5iaW5kKHJlcykgYXMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYm9vbGVhbjtcbiAgY29uc3QgcGFzc1Rocm91Z2hFbmQgPSByZXMuZW5kLmJpbmQocmVzKSBhcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuICBjb25zdCBwYXNzVGhyb3VnaEpzb24gPSByZXMuanNvbi5iaW5kKHJlcykgYXMgKGJvZHk/OiB1bmtub3duKSA9PiBleHByZXNzLlJlc3BvbnNlO1xuICBjb25zdCByZWNvcmRPdXRwdXQgPSAoYW5zd2VyOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBpZiAob3V0cHV0UmVjb3JkZWQgfHwgIWFuc3dlcikgcmV0dXJuO1xuICAgIHJlc3BvbnNlUHJldmlldyA9IGFuc3dlcjtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX1NQQU5fT1VUUFVUU19BVFRSLCBhbnN3ZXIuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpKTtcbiAgICBvdXRwdXRSZWNvcmRlZCA9IHRydWU7XG4gIH07XG4gIGNvbnN0IHJlY29yZEZ1bGxPdXRwdXQgPSAocmVzcG9uc2U6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmIChmdWxsT3V0cHV0UmVjb3JkZWQgfHwgIXJlc3BvbnNlKSByZXR1cm47XG4gICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKENIQVRfUkVTUE9OU0VfQVRUUiwgcmVzcG9uc2Uuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpKTtcbiAgICBmdWxsT3V0cHV0UmVjb3JkZWQgPSB0cnVlO1xuICB9O1xuICBjb25zdCByZWNvcmRHZW5pZSA9ICh1c2VkOiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgaWYgKCF1c2VkIHx8IGdlbmllUmVjb3JkZWQpIHJldHVybjtcbiAgICBnZW5pZVJlY29yZGVkID0gdHJ1ZTtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9HRU5JRV9VU0VEX0FUVFIsIHRydWUpO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfR0VOSUVfVEFHX0FUVFIsIFwidHJ1ZVwiKTtcbiAgICBzZXRDaGF0VHJhY2VUYWcodHJhY2VTdGF0ZSwgTUxGTE9XX0dFTklFX1RBRywgdHJ1ZSk7XG4gICAgY29udGV4dC53aXRoKHRyYWNlLnNldFNwYW4oY29udGV4dC5hY3RpdmUoKSwgdGFyZ2V0LnNwYW4pLCAoKSA9PiB7XG4gICAgICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZVRhZ3MoeyBbTUxGTE9XX0dFTklFX1RBR106IFwidHJ1ZVwiIH0pO1xuICAgIH0pO1xuICB9O1xuICBjb25zdCBmaW5hbGl6ZVRyYWNlID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICh0cmFjZUZpbmFsaXplZCkgcmV0dXJuO1xuICAgIHRyYWNlRmluYWxpemVkID0gdHJ1ZTtcbiAgICBjb25zdCB0YWdzID0gT2JqZWN0LmZyb21FbnRyaWVzKHRyYWNlU3RhdGUudGFncyk7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIHRyYWNlU3RhdGUudGFncykge1xuICAgICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKGAke01MRkxPV19UUkFDRV9UQUdfUFJFRklYfSR7bmFtZX1gLCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmICh0cmFjZVN0YXRlLnVzZXIpIHtcbiAgICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShVU0VSX1RSQUNFX0FUVFJJQlVURSwgdHJhY2VTdGF0ZS51c2VyKTtcbiAgICB9XG4gICAgY29udGV4dC53aXRoKHRyYWNlLnNldFNwYW4oY29udGV4dC5hY3RpdmUoKSwgdGFyZ2V0LnNwYW4pLCAoKSA9PiB7XG4gICAgICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZSh7XG4gICAgICAgIC4uLihPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAwID8geyB0YWdzIH0gOiB7fSksXG4gICAgICAgIC4uLih0cmFjZVN0YXRlLnVzZXIgPyB7IHVzZXI6IHRyYWNlU3RhdGUudXNlciB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKCFpc0RhdGFicmlja3NBcHBFbnYoKSkge1xuICAgICAgcGVyc2lzdEFwcE1sZmxvd1RyYWNlSW5mbyh7XG4gICAgICAgIHRyYWNlSWQ6IHRyYWNlU3RhdGUudHJhY2VJZCxcbiAgICAgICAgcmVxdWVzdFRpbWU6IHRyYWNlUmVxdWVzdFRpbWUsXG4gICAgICAgIGV4ZWN1dGlvbkR1cmF0aW9uOiBEYXRlLm5vdygpIC0gdHJhY2VSZXF1ZXN0VGltZSxcbiAgICAgICAgZXJyb3I6IHJlcy5zdGF0dXNDb2RlID49IDUwMCxcbiAgICAgICAgdGFncyxcbiAgICAgICAgLi4uKHRyYWNlU3RhdGUudXNlciA/IHsgdXNlcjogdHJhY2VTdGF0ZS51c2VyIH0gOiB7fSksXG4gICAgICAgIC4uLihyZXF1ZXN0UHJldmlldyA/IHsgcmVxdWVzdFByZXZpZXcgfSA6IHt9KSxcbiAgICAgICAgLi4uKHJlc3BvbnNlUHJldmlldyA/IHsgcmVzcG9uc2VQcmV2aWV3IH0gOiB7fSksXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGVuZE93bmVkU3BhbiA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRhcmdldC5vd25lZCB8fCBvd25lZFNwYW5FbmRlZCkgcmV0dXJuO1xuICAgIG93bmVkU3BhbkVuZGVkID0gdHJ1ZTtcbiAgICB0YXJnZXQuc3Bhbi5lbmQoKTtcbiAgfTtcblxuICByZXMud3JpdGUgPSAoKGNodW5rOiB1bmtub3duLCAuLi5yZXN0OiB1bmtub3duW10pID0+IHtcbiAgICBpZiAoIXRyYWNlUGFydFdyaXR0ZW4pIHtcbiAgICAgIHRyYWNlUGFydFdyaXR0ZW4gPSB0cnVlO1xuICAgICAgcGFzc1Rocm91Z2hXcml0ZShtbGZsb3dUcmFjZVBhcnQodHJhY2VTdGF0ZS50cmFjZUlkKSk7XG4gICAgfVxuICAgIGNvbGxlY3Rvci53cml0ZShjaHVuayk7XG4gICAgcmV0dXJuIHBhc3NUaHJvdWdoV3JpdGUoY2h1bmssIC4uLnJlc3QpO1xuICB9KSBhcyB0eXBlb2YgcmVzLndyaXRlO1xuXG4gIHJlcy5qc29uID0gKChib2R5PzogdW5rbm93bikgPT4ge1xuICAgIHJlY29yZEZ1bGxPdXRwdXQoc2VyaWFsaXplZChib2R5KSk7XG4gICAgcmVjb3JkR2VuaWUodmFsdWVVc2VzR2VuaWUoYm9keSkpO1xuICAgIHJlY29yZE91dHB1dChhc3Npc3RhbnRUZXh0RnJvbUpzb24oYm9keSkpO1xuICAgIHJldHVybiBwYXNzVGhyb3VnaEpzb24oYm9keSk7XG4gIH0pIGFzIHR5cGVvZiByZXMuanNvbjtcblxuICByZXMuZW5kID0gKChjaHVuaz86IHVua25vd24sIC4uLnJlc3Q6IHVua25vd25bXSkgPT4ge1xuICAgIGNvbGxlY3Rvci53cml0ZShjaHVuayk7XG4gICAgcmVjb3JkT3V0cHV0KGNvbGxlY3Rvci5maW5pc2goKSk7XG4gICAgcmVjb3JkRnVsbE91dHB1dChjb2xsZWN0b3IucmF3Qm9keSgpKTtcbiAgICByZWNvcmRHZW5pZShjb2xsZWN0b3IudXNlZEdlbmllKCkpO1xuICAgIGZpbmFsaXplVHJhY2UoKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHBhc3NUaHJvdWdoRW5kKGNodW5rLCAuLi5yZXN0KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZW5kT3duZWRTcGFuKCk7XG4gICAgfVxuICB9KSBhcyB0eXBlb2YgcmVzLmVuZDtcblxuICByZXMub25jZShcImNsb3NlXCIsICgpID0+IHtcbiAgICByZWNvcmRPdXRwdXQoY29sbGVjdG9yLmZpbmlzaCgpKTtcbiAgICByZWNvcmRGdWxsT3V0cHV0KGNvbGxlY3Rvci5yYXdCb2R5KCkpO1xuICAgIHJlY29yZEdlbmllKGNvbGxlY3Rvci51c2VkR2VuaWUoKSk7XG4gICAgZmluYWxpemVUcmFjZSgpO1xuICAgIGVuZE93bmVkU3BhbigpO1xuICB9KTtcblxuICBjb25zdCBjaGF0Q29udGV4dCA9IHRyYWNlXG4gICAgLnNldFNwYW4oY29udGV4dC5hY3RpdmUoKSwgdGFyZ2V0LnNwYW4pXG4gICAgLnNldFZhbHVlKENIQVRfVFJBQ0VfU1RBVEVfS0VZLCB0cmFjZVN0YXRlKTtcbiAgY29udGV4dC53aXRoKGNoYXRDb250ZXh0LCAoKSA9PiB7XG4gICAgbmV4dCgpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJbnN0YWxsIHtAbGluayBjaGF0VHVyblRlbGVtZXRyeU1pZGRsZXdhcmV9IG9uIGEgTWFzdHJhIEV4cHJlc3Mgc3ViLWFwcC5cbiAqXG4gKiBDYWxsIGJlZm9yZSBgTWFzdHJhU2VydmVyLmluaXQoKWAgc28gdGhlIGxheWVyIHNpdHMgYWhlYWQgb2YgdGhlIGFnZW50XG4gKiByb3V0ZXMuIFNhZmUgdG8gY2FsbCB1bmNvbmRpdGlvbmFsbHk6IHdoZW4gbm8gcmVjb3JkaW5nIHRyYWNlciBpcyByZWdpc3RlcmVkLFxuICogdGhlIG1pZGRsZXdhcmUgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaENoYXRUdXJuVGVsZW1ldHJ5KFxuICBhcHA6IGV4cHJlc3MuRXhwcmVzcyxcbiAgb3B0aW9uczogQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgYXBwLnVzZSgocmVxLCByZXMsIG5leHQpID0+IGNoYXRUdXJuVGVsZW1ldHJ5TWlkZGxld2FyZShyZXEsIHJlcywgbmV4dCwgb3B0aW9ucykpO1xuICBsb2dnZXIuaW5mbyhcImNoYXQgdHVybiB0ZWxlbWV0cnkgbWlkZGxld2FyZSBhdHRhY2hlZFwiLCBvcHRpb25zKTtcbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -36,21 +36,21 @@
|
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@databricks/appkit": "0.81.0",
|
|
39
|
-
"@dbx-tools/appkit": "^0.9.
|
|
40
|
-
"@dbx-tools/cache": "^0.9.
|
|
41
|
-
"@dbx-tools/core": "^0.9.
|
|
42
|
-
"@dbx-tools/databricks": "^0.9.
|
|
43
|
-
"@dbx-tools/fs": "^0.9.
|
|
44
|
-
"@dbx-tools/genie": "^0.9.
|
|
45
|
-
"@dbx-tools/model": "^0.9.
|
|
46
|
-
"@dbx-tools/model-protocol": "^0.9.
|
|
47
|
-
"@dbx-tools/path": "^0.9.
|
|
48
|
-
"@dbx-tools/postgres": "^0.9.
|
|
49
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
50
|
-
"@dbx-tools/shared-fs": "^0.9.
|
|
51
|
-
"@dbx-tools/shared-genie": "^0.9.
|
|
52
|
-
"@dbx-tools/shared-mastra": "^0.9.
|
|
53
|
-
"@dbx-tools/shared-model": "^0.9.
|
|
39
|
+
"@dbx-tools/appkit": "^0.9.166",
|
|
40
|
+
"@dbx-tools/cache": "^0.9.166",
|
|
41
|
+
"@dbx-tools/core": "^0.9.166",
|
|
42
|
+
"@dbx-tools/databricks": "^0.9.166",
|
|
43
|
+
"@dbx-tools/fs": "^0.9.166",
|
|
44
|
+
"@dbx-tools/genie": "^0.9.166",
|
|
45
|
+
"@dbx-tools/model": "^0.9.166",
|
|
46
|
+
"@dbx-tools/model-protocol": "^0.9.166",
|
|
47
|
+
"@dbx-tools/path": "^0.9.166",
|
|
48
|
+
"@dbx-tools/postgres": "^0.9.166",
|
|
49
|
+
"@dbx-tools/shared-core": "^0.9.166",
|
|
50
|
+
"@dbx-tools/shared-fs": "^0.9.166",
|
|
51
|
+
"@dbx-tools/shared-genie": "^0.9.166",
|
|
52
|
+
"@dbx-tools/shared-mastra": "^0.9.166",
|
|
53
|
+
"@dbx-tools/shared-model": "^0.9.166",
|
|
54
54
|
"@mastra/ai-sdk": "1.10.5",
|
|
55
55
|
"@mastra/core": "1.71.0",
|
|
56
56
|
"@mastra/express": "1.5.15",
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
"./package.json": "./package.json"
|
|
88
88
|
}
|
|
89
89
|
},
|
|
90
|
-
"version": "0.9.
|
|
90
|
+
"version": "0.9.166",
|
|
91
91
|
"types": "./lib/index.d.ts",
|
|
92
92
|
"dbxToolsConfig": {
|
|
93
93
|
"tags": [
|
package/src/genie-chat.ts
CHANGED
|
@@ -43,7 +43,8 @@ const LIST_PAGE_SIZE = 100;
|
|
|
43
43
|
const THREAD_LIMIT = 100;
|
|
44
44
|
const AGENT_CONVERSATION_TYPE = "GENIE_CONVERSATION_TYPE_AGENT";
|
|
45
45
|
const DIRECT_GENIE_ERROR = "Genie could not complete the request.";
|
|
46
|
-
const
|
|
46
|
+
const GENIE_CONTEXT_TAG = "<dbx-tools-genie-context>";
|
|
47
|
+
const GENIE_CONTEXT_PREFIX = `${GENIE_CONTEXT_TAG}\n`;
|
|
47
48
|
const GENIE_CONTEXT_SUFFIX = "\n</dbx-tools-genie-context>\n\n";
|
|
48
49
|
const GENIE_MEMORY_MESSAGES = 12;
|
|
49
50
|
|
|
@@ -140,6 +141,17 @@ export function visibleGenieQuestion(content: string): string {
|
|
|
140
141
|
return boundary < 0 ? content : content.slice(boundary + GENIE_CONTEXT_SUFFIX.length);
|
|
141
142
|
}
|
|
142
143
|
|
|
144
|
+
/** Remove a complete hidden context envelope or omit a truncated polluted title. */
|
|
145
|
+
export function visibleGenieThreadTitle(title: string | undefined): string | undefined {
|
|
146
|
+
const candidate = title?.trim();
|
|
147
|
+
if (!candidate) return undefined;
|
|
148
|
+
if (!candidate.startsWith(GENIE_CONTEXT_TAG)) return candidate;
|
|
149
|
+
if (!candidate.startsWith(GENIE_CONTEXT_PREFIX)) return undefined;
|
|
150
|
+
const visible = visibleGenieQuestion(candidate);
|
|
151
|
+
if (visible === candidate) return undefined;
|
|
152
|
+
return visible.trim() || undefined;
|
|
153
|
+
}
|
|
154
|
+
|
|
143
155
|
function messageText(message: MastraDBMessage): string | undefined {
|
|
144
156
|
const text = message.content.parts
|
|
145
157
|
.flatMap((part) =>
|
|
@@ -314,7 +326,7 @@ export async function listGenieThreads(
|
|
|
314
326
|
signal?: AbortSignal,
|
|
315
327
|
): Promise<GenieThread[]> {
|
|
316
328
|
const context = signal ? toContext(signal) : undefined;
|
|
317
|
-
const threads: GenieThread
|
|
329
|
+
const threads: Array<GenieThread & { recoverTitle?: boolean }> = [];
|
|
318
330
|
let pageToken: string | undefined;
|
|
319
331
|
do {
|
|
320
332
|
const page = await client.genie.listConversations(
|
|
@@ -329,15 +341,40 @@ export async function listGenieThreads(
|
|
|
329
341
|
if (!isRecord(conversation) || conversation.agent_type !== AGENT_CONVERSATION_TYPE) {
|
|
330
342
|
continue;
|
|
331
343
|
}
|
|
344
|
+
const rawTitle = typeof conversation.title === "string" ? conversation.title : undefined;
|
|
345
|
+
const title = visibleGenieThreadTitle(rawTitle);
|
|
332
346
|
threads.push({
|
|
333
347
|
id: conversation.conversation_id,
|
|
334
|
-
...(
|
|
348
|
+
...(title ? { title } : {}),
|
|
349
|
+
...(rawTitle?.trim().startsWith(GENIE_CONTEXT_TAG) && !title ? { recoverTitle: true } : {}),
|
|
335
350
|
createdAt: new Date(conversation.created_timestamp).toISOString(),
|
|
336
351
|
});
|
|
337
352
|
}
|
|
338
353
|
pageToken = page.next_page_token || undefined;
|
|
339
354
|
} while (pageToken && threads.length < THREAD_LIMIT);
|
|
340
|
-
|
|
355
|
+
const recovered = await Promise.all(
|
|
356
|
+
threads.map(async ({ recoverTitle, ...thread }) => {
|
|
357
|
+
if (!recoverTitle) return thread;
|
|
358
|
+
try {
|
|
359
|
+
const messages = await listAgentModeConversation(
|
|
360
|
+
client,
|
|
361
|
+
space.spaceId,
|
|
362
|
+
thread.id,
|
|
363
|
+
signal ? { context: signal } : {},
|
|
364
|
+
);
|
|
365
|
+
const title = visibleGenieQuestion(messages[0]?.content ?? "").trim();
|
|
366
|
+
return title ? { ...thread, title } : thread;
|
|
367
|
+
} catch (error) {
|
|
368
|
+
logger.warn("thread:title-recovery-failed", {
|
|
369
|
+
conversationId: thread.id,
|
|
370
|
+
spaceId: space.spaceId,
|
|
371
|
+
error: toError(error),
|
|
372
|
+
});
|
|
373
|
+
return thread;
|
|
374
|
+
}
|
|
375
|
+
}),
|
|
376
|
+
);
|
|
377
|
+
return recovered.sort((a, b) => b.createdAt.localeCompare(a.createdAt)).slice(0, THREAD_LIMIT);
|
|
341
378
|
}
|
|
342
379
|
|
|
343
380
|
/**
|
package/src/telemetry.ts
CHANGED
|
@@ -36,6 +36,7 @@ import {
|
|
|
36
36
|
} from "@dbx-tools/shared-core";
|
|
37
37
|
import {
|
|
38
38
|
MLFLOW_TRACE_ID_HEADER,
|
|
39
|
+
MLFLOW_TRACE_PART_TYPE,
|
|
39
40
|
THREAD_ID_HEADER,
|
|
40
41
|
THREAD_ID_QUERY,
|
|
41
42
|
} from "@dbx-tools/shared-mastra";
|
|
@@ -270,6 +271,15 @@ function stampMlflowTraceId(res: express.Response, traceId: string): void {
|
|
|
270
271
|
res.setHeader(MLFLOW_TRACE_ID_HEADER, `tr-${traceId}`);
|
|
271
272
|
}
|
|
272
273
|
|
|
274
|
+
/** Serialize a transient trace-id part for proxies that remove custom headers. */
|
|
275
|
+
function mlflowTracePart(traceId: string): string {
|
|
276
|
+
return `data: ${JSON.stringify({
|
|
277
|
+
type: MLFLOW_TRACE_PART_TYPE,
|
|
278
|
+
data: { traceId: `tr-${traceId}` },
|
|
279
|
+
transient: true,
|
|
280
|
+
})}\n\n`;
|
|
281
|
+
}
|
|
282
|
+
|
|
273
283
|
/** Return one raw prompt when the request is exactly one text-only user message. */
|
|
274
284
|
export function textOnlyChatInput(messages: unknown): string | undefined {
|
|
275
285
|
if (typeof messages === "string") return messages || undefined;
|
|
@@ -713,6 +723,7 @@ export function chatTurnTelemetryMiddleware(
|
|
|
713
723
|
let genieRecorded = false;
|
|
714
724
|
let ownedSpanEnded = false;
|
|
715
725
|
let traceFinalized = false;
|
|
726
|
+
let tracePartWritten = false;
|
|
716
727
|
const passThroughWrite = res.write.bind(res) as (...args: unknown[]) => boolean;
|
|
717
728
|
const passThroughEnd = res.end.bind(res) as (...args: unknown[]) => unknown;
|
|
718
729
|
const passThroughJson = res.json.bind(res) as (body?: unknown) => express.Response;
|
|
@@ -773,6 +784,10 @@ export function chatTurnTelemetryMiddleware(
|
|
|
773
784
|
};
|
|
774
785
|
|
|
775
786
|
res.write = ((chunk: unknown, ...rest: unknown[]) => {
|
|
787
|
+
if (!tracePartWritten) {
|
|
788
|
+
tracePartWritten = true;
|
|
789
|
+
passThroughWrite(mlflowTracePart(traceState.traceId));
|
|
790
|
+
}
|
|
776
791
|
collector.write(chunk);
|
|
777
792
|
return passThroughWrite(chunk, ...rest);
|
|
778
793
|
}) as typeof res.write;
|