@xelauvas/xela-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1920) hide show
  1. package/README.md +200 -0
  2. package/bin/xela +100 -0
  3. package/package.json +88 -0
  4. package/src/QueryEngine.ts +1295 -0
  5. package/src/Task.ts +125 -0
  6. package/src/Tool.ts +792 -0
  7. package/src/_shims/_generated_stubs/_universal_stub.mjs +168 -0
  8. package/src/_shims/_generated_stubs/text_stub.mjs +1 -0
  9. package/src/_shims/bun_bundle.js +9 -0
  10. package/src/_shims/cjs_stub.cjs +23 -0
  11. package/src/_shims/empty_stub.js +33 -0
  12. package/src/_shims/loader.js +352 -0
  13. package/src/_shims/openai_adapter.ts +486 -0
  14. package/src/_shims/react_compiler_runtime.js +17 -0
  15. package/src/_shims/register.js +148 -0
  16. package/src/assistant/sessionHistory.ts +87 -0
  17. package/src/bootstrap/state.ts +1759 -0
  18. package/src/bridge/bridgeApi.ts +539 -0
  19. package/src/bridge/bridgeConfig.ts +48 -0
  20. package/src/bridge/bridgeDebug.ts +135 -0
  21. package/src/bridge/bridgeEnabled.ts +202 -0
  22. package/src/bridge/bridgeMain.ts +2999 -0
  23. package/src/bridge/bridgeMessaging.ts +461 -0
  24. package/src/bridge/bridgePermissionCallbacks.ts +43 -0
  25. package/src/bridge/bridgePointer.ts +210 -0
  26. package/src/bridge/bridgeStatusUtil.ts +163 -0
  27. package/src/bridge/bridgeUI.ts +530 -0
  28. package/src/bridge/capacityWake.ts +56 -0
  29. package/src/bridge/codeSessionApi.ts +168 -0
  30. package/src/bridge/createSession.ts +384 -0
  31. package/src/bridge/debugUtils.ts +141 -0
  32. package/src/bridge/envLessBridgeConfig.ts +165 -0
  33. package/src/bridge/flushGate.ts +71 -0
  34. package/src/bridge/inboundAttachments.ts +175 -0
  35. package/src/bridge/inboundMessages.ts +80 -0
  36. package/src/bridge/initReplBridge.ts +569 -0
  37. package/src/bridge/jwtUtils.ts +256 -0
  38. package/src/bridge/pollConfig.ts +110 -0
  39. package/src/bridge/pollConfigDefaults.ts +82 -0
  40. package/src/bridge/remoteBridgeCore.ts +1008 -0
  41. package/src/bridge/replBridge.ts +2406 -0
  42. package/src/bridge/replBridgeHandle.ts +36 -0
  43. package/src/bridge/replBridgeTransport.ts +370 -0
  44. package/src/bridge/sessionIdCompat.ts +57 -0
  45. package/src/bridge/sessionRunner.ts +550 -0
  46. package/src/bridge/trustedDevice.ts +210 -0
  47. package/src/bridge/types.ts +262 -0
  48. package/src/bridge/workSecret.ts +127 -0
  49. package/src/buddy/CompanionSprite.tsx +371 -0
  50. package/src/buddy/companion.ts +133 -0
  51. package/src/buddy/prompt.ts +36 -0
  52. package/src/buddy/sprites.ts +514 -0
  53. package/src/buddy/types.ts +148 -0
  54. package/src/buddy/useBuddyNotification.tsx +98 -0
  55. package/src/cli/exit.ts +31 -0
  56. package/src/cli/handlers/agents.ts +70 -0
  57. package/src/cli/handlers/auth.ts +330 -0
  58. package/src/cli/handlers/autoMode.ts +170 -0
  59. package/src/cli/handlers/mcp.tsx +362 -0
  60. package/src/cli/handlers/plugins.ts +878 -0
  61. package/src/cli/handlers/util.tsx +110 -0
  62. package/src/cli/ndjsonSafeStringify.ts +32 -0
  63. package/src/cli/print.ts +5594 -0
  64. package/src/cli/remoteIO.ts +255 -0
  65. package/src/cli/structuredIO.ts +859 -0
  66. package/src/cli/transports/HybridTransport.ts +282 -0
  67. package/src/cli/transports/SSETransport.ts +711 -0
  68. package/src/cli/transports/SerialBatchEventUploader.ts +275 -0
  69. package/src/cli/transports/WebSocketTransport.ts +800 -0
  70. package/src/cli/transports/WorkerStateUploader.ts +131 -0
  71. package/src/cli/transports/ccrClient.ts +998 -0
  72. package/src/cli/transports/transportUtils.ts +45 -0
  73. package/src/cli/update.ts +422 -0
  74. package/src/commands/add-dir/add-dir.tsx +126 -0
  75. package/src/commands/add-dir/index.ts +11 -0
  76. package/src/commands/add-dir/validation.ts +110 -0
  77. package/src/commands/advisor.ts +109 -0
  78. package/src/commands/agents/agents.tsx +12 -0
  79. package/src/commands/agents/index.ts +10 -0
  80. package/src/commands/ant-trace/index.js +1 -0
  81. package/src/commands/autofix-pr/index.js +1 -0
  82. package/src/commands/backfill-sessions/index.js +1 -0
  83. package/src/commands/branch/branch.ts +296 -0
  84. package/src/commands/branch/index.ts +14 -0
  85. package/src/commands/break-cache/index.js +1 -0
  86. package/src/commands/bridge/bridge.tsx +509 -0
  87. package/src/commands/bridge/index.ts +26 -0
  88. package/src/commands/bridge-kick.ts +200 -0
  89. package/src/commands/brief.ts +130 -0
  90. package/src/commands/btw/btw.tsx +243 -0
  91. package/src/commands/btw/index.ts +13 -0
  92. package/src/commands/bughunter/index.js +1 -0
  93. package/src/commands/chrome/chrome.tsx +285 -0
  94. package/src/commands/chrome/index.ts +13 -0
  95. package/src/commands/clear/caches.ts +144 -0
  96. package/src/commands/clear/clear.ts +7 -0
  97. package/src/commands/clear/conversation.ts +251 -0
  98. package/src/commands/clear/index.ts +19 -0
  99. package/src/commands/color/color.ts +93 -0
  100. package/src/commands/color/index.ts +16 -0
  101. package/src/commands/commit-push-pr.ts +158 -0
  102. package/src/commands/commit.ts +92 -0
  103. package/src/commands/compact/compact.ts +287 -0
  104. package/src/commands/compact/index.ts +15 -0
  105. package/src/commands/config/config.tsx +7 -0
  106. package/src/commands/config/index.ts +11 -0
  107. package/src/commands/context/context-noninteractive.ts +325 -0
  108. package/src/commands/context/context.tsx +64 -0
  109. package/src/commands/context/index.ts +24 -0
  110. package/src/commands/copy/copy.tsx +371 -0
  111. package/src/commands/copy/index.ts +15 -0
  112. package/src/commands/cost/cost.ts +24 -0
  113. package/src/commands/cost/index.ts +23 -0
  114. package/src/commands/createMovedToPluginCommand.ts +65 -0
  115. package/src/commands/ctx_viz/index.js +1 -0
  116. package/src/commands/debug-tool-call/index.js +1 -0
  117. package/src/commands/desktop/desktop.tsx +9 -0
  118. package/src/commands/desktop/index.ts +26 -0
  119. package/src/commands/diff/diff.tsx +9 -0
  120. package/src/commands/diff/index.ts +8 -0
  121. package/src/commands/doctor/doctor.tsx +7 -0
  122. package/src/commands/doctor/index.ts +12 -0
  123. package/src/commands/effort/effort.tsx +183 -0
  124. package/src/commands/effort/index.ts +13 -0
  125. package/src/commands/env/index.js +1 -0
  126. package/src/commands/exit/exit.tsx +33 -0
  127. package/src/commands/exit/index.ts +12 -0
  128. package/src/commands/export/export.tsx +91 -0
  129. package/src/commands/export/index.ts +11 -0
  130. package/src/commands/extra-usage/extra-usage-core.ts +118 -0
  131. package/src/commands/extra-usage/extra-usage-noninteractive.ts +16 -0
  132. package/src/commands/extra-usage/extra-usage.tsx +17 -0
  133. package/src/commands/extra-usage/index.ts +31 -0
  134. package/src/commands/fast/fast.tsx +269 -0
  135. package/src/commands/fast/index.ts +26 -0
  136. package/src/commands/feedback/feedback.tsx +25 -0
  137. package/src/commands/feedback/index.ts +26 -0
  138. package/src/commands/files/files.ts +19 -0
  139. package/src/commands/files/index.ts +12 -0
  140. package/src/commands/good-claude/index.js +1 -0
  141. package/src/commands/heapdump/heapdump.ts +17 -0
  142. package/src/commands/heapdump/index.ts +12 -0
  143. package/src/commands/help/help.tsx +11 -0
  144. package/src/commands/help/index.ts +10 -0
  145. package/src/commands/hooks/hooks.tsx +13 -0
  146. package/src/commands/hooks/index.ts +11 -0
  147. package/src/commands/ide/ide.tsx +646 -0
  148. package/src/commands/ide/index.ts +11 -0
  149. package/src/commands/init-verifiers.ts +262 -0
  150. package/src/commands/init.ts +256 -0
  151. package/src/commands/insights.ts +3200 -0
  152. package/src/commands/install-github-app/ApiKeyStep.tsx +231 -0
  153. package/src/commands/install-github-app/CheckExistingSecretStep.tsx +190 -0
  154. package/src/commands/install-github-app/CheckGitHubStep.tsx +15 -0
  155. package/src/commands/install-github-app/ChooseRepoStep.tsx +211 -0
  156. package/src/commands/install-github-app/CreatingStep.tsx +65 -0
  157. package/src/commands/install-github-app/ErrorStep.tsx +85 -0
  158. package/src/commands/install-github-app/ExistingWorkflowStep.tsx +103 -0
  159. package/src/commands/install-github-app/InstallAppStep.tsx +94 -0
  160. package/src/commands/install-github-app/OAuthFlowStep.tsx +276 -0
  161. package/src/commands/install-github-app/SuccessStep.tsx +96 -0
  162. package/src/commands/install-github-app/WarningsStep.tsx +73 -0
  163. package/src/commands/install-github-app/index.ts +13 -0
  164. package/src/commands/install-github-app/install-github-app.tsx +587 -0
  165. package/src/commands/install-github-app/setupGitHubActions.ts +325 -0
  166. package/src/commands/install-slack-app/index.ts +12 -0
  167. package/src/commands/install-slack-app/install-slack-app.ts +30 -0
  168. package/src/commands/install.tsx +300 -0
  169. package/src/commands/issue/index.js +1 -0
  170. package/src/commands/keybindings/index.ts +13 -0
  171. package/src/commands/keybindings/keybindings.ts +53 -0
  172. package/src/commands/login/index.ts +14 -0
  173. package/src/commands/login/login.tsx +104 -0
  174. package/src/commands/logout/index.ts +10 -0
  175. package/src/commands/logout/logout.tsx +82 -0
  176. package/src/commands/mcp/addCommand.ts +280 -0
  177. package/src/commands/mcp/index.ts +12 -0
  178. package/src/commands/mcp/mcp.tsx +85 -0
  179. package/src/commands/mcp/xaaIdpCommand.ts +266 -0
  180. package/src/commands/memory/index.ts +10 -0
  181. package/src/commands/memory/memory.tsx +90 -0
  182. package/src/commands/mobile/index.ts +11 -0
  183. package/src/commands/mobile/mobile.tsx +274 -0
  184. package/src/commands/mock-limits/index.js +1 -0
  185. package/src/commands/model/index.ts +16 -0
  186. package/src/commands/model/model.tsx +297 -0
  187. package/src/commands/oauth-refresh/index.js +1 -0
  188. package/src/commands/onboarding/index.js +1 -0
  189. package/src/commands/output-style/index.ts +11 -0
  190. package/src/commands/output-style/output-style.tsx +7 -0
  191. package/src/commands/passes/index.ts +22 -0
  192. package/src/commands/passes/passes.tsx +24 -0
  193. package/src/commands/perf-issue/index.js +1 -0
  194. package/src/commands/permissions/index.ts +11 -0
  195. package/src/commands/permissions/permissions.tsx +10 -0
  196. package/src/commands/plan/index.ts +11 -0
  197. package/src/commands/plan/plan.tsx +122 -0
  198. package/src/commands/plugin/AddMarketplace.tsx +162 -0
  199. package/src/commands/plugin/BrowseMarketplace.tsx +802 -0
  200. package/src/commands/plugin/DiscoverPlugins.tsx +781 -0
  201. package/src/commands/plugin/ManageMarketplaces.tsx +838 -0
  202. package/src/commands/plugin/ManagePlugins.tsx +2215 -0
  203. package/src/commands/plugin/PluginErrors.tsx +124 -0
  204. package/src/commands/plugin/PluginOptionsDialog.tsx +357 -0
  205. package/src/commands/plugin/PluginOptionsFlow.tsx +135 -0
  206. package/src/commands/plugin/PluginSettings.tsx +1072 -0
  207. package/src/commands/plugin/PluginTrustWarning.tsx +32 -0
  208. package/src/commands/plugin/UnifiedInstalledCell.tsx +565 -0
  209. package/src/commands/plugin/ValidatePlugin.tsx +98 -0
  210. package/src/commands/plugin/index.tsx +11 -0
  211. package/src/commands/plugin/parseArgs.ts +103 -0
  212. package/src/commands/plugin/plugin.tsx +7 -0
  213. package/src/commands/plugin/pluginDetailsHelpers.tsx +117 -0
  214. package/src/commands/plugin/usePagination.ts +171 -0
  215. package/src/commands/pr_comments/index.ts +50 -0
  216. package/src/commands/privacy-settings/index.ts +14 -0
  217. package/src/commands/privacy-settings/privacy-settings.tsx +58 -0
  218. package/src/commands/rate-limit-options/index.ts +19 -0
  219. package/src/commands/rate-limit-options/rate-limit-options.tsx +210 -0
  220. package/src/commands/release-notes/index.ts +11 -0
  221. package/src/commands/release-notes/release-notes.ts +50 -0
  222. package/src/commands/reload-plugins/index.ts +18 -0
  223. package/src/commands/reload-plugins/reload-plugins.ts +61 -0
  224. package/src/commands/remote-env/index.ts +15 -0
  225. package/src/commands/remote-env/remote-env.tsx +7 -0
  226. package/src/commands/remote-setup/api.ts +182 -0
  227. package/src/commands/remote-setup/index.ts +20 -0
  228. package/src/commands/remote-setup/remote-setup.tsx +187 -0
  229. package/src/commands/rename/generateSessionName.ts +67 -0
  230. package/src/commands/rename/index.ts +12 -0
  231. package/src/commands/rename/rename.ts +87 -0
  232. package/src/commands/reset-limits/index.js +4 -0
  233. package/src/commands/resume/index.ts +12 -0
  234. package/src/commands/resume/resume.tsx +275 -0
  235. package/src/commands/review/UltrareviewOverageDialog.tsx +96 -0
  236. package/src/commands/review/reviewRemote.ts +316 -0
  237. package/src/commands/review/ultrareviewCommand.tsx +58 -0
  238. package/src/commands/review/ultrareviewEnabled.ts +14 -0
  239. package/src/commands/review.ts +57 -0
  240. package/src/commands/rewind/index.ts +13 -0
  241. package/src/commands/rewind/rewind.ts +13 -0
  242. package/src/commands/sandbox-toggle/index.ts +50 -0
  243. package/src/commands/sandbox-toggle/sandbox-toggle.tsx +83 -0
  244. package/src/commands/security-review.ts +243 -0
  245. package/src/commands/session/index.ts +16 -0
  246. package/src/commands/session/session.tsx +140 -0
  247. package/src/commands/share/index.js +1 -0
  248. package/src/commands/skills/index.ts +10 -0
  249. package/src/commands/skills/skills.tsx +8 -0
  250. package/src/commands/stats/index.ts +10 -0
  251. package/src/commands/stats/stats.tsx +7 -0
  252. package/src/commands/status/index.ts +12 -0
  253. package/src/commands/status/status.tsx +8 -0
  254. package/src/commands/statusline.tsx +24 -0
  255. package/src/commands/stickers/index.ts +11 -0
  256. package/src/commands/stickers/stickers.ts +16 -0
  257. package/src/commands/summary/index.js +1 -0
  258. package/src/commands/tag/index.ts +12 -0
  259. package/src/commands/tag/tag.tsx +215 -0
  260. package/src/commands/tasks/index.ts +11 -0
  261. package/src/commands/tasks/tasks.tsx +8 -0
  262. package/src/commands/teleport/index.js +1 -0
  263. package/src/commands/terminalSetup/index.ts +23 -0
  264. package/src/commands/terminalSetup/terminalSetup.tsx +531 -0
  265. package/src/commands/theme/index.ts +10 -0
  266. package/src/commands/theme/theme.tsx +57 -0
  267. package/src/commands/thinkback/index.ts +13 -0
  268. package/src/commands/thinkback/thinkback.tsx +554 -0
  269. package/src/commands/thinkback-play/index.ts +17 -0
  270. package/src/commands/thinkback-play/thinkback-play.ts +43 -0
  271. package/src/commands/ultraplan.tsx +471 -0
  272. package/src/commands/upgrade/index.ts +16 -0
  273. package/src/commands/upgrade/upgrade.tsx +38 -0
  274. package/src/commands/usage/index.ts +9 -0
  275. package/src/commands/usage/usage.tsx +7 -0
  276. package/src/commands/version.ts +22 -0
  277. package/src/commands/vim/index.ts +11 -0
  278. package/src/commands/vim/vim.ts +38 -0
  279. package/src/commands/voice/index.ts +20 -0
  280. package/src/commands/voice/voice.ts +150 -0
  281. package/src/commands.ts +754 -0
  282. package/src/components/AgentProgressLine.tsx +136 -0
  283. package/src/components/App.tsx +56 -0
  284. package/src/components/ApproveApiKey.tsx +123 -0
  285. package/src/components/AutoModeOptInDialog.tsx +142 -0
  286. package/src/components/AutoUpdater.tsx +198 -0
  287. package/src/components/AutoUpdaterWrapper.tsx +91 -0
  288. package/src/components/AwsAuthStatusBox.tsx +82 -0
  289. package/src/components/BaseTextInput.tsx +136 -0
  290. package/src/components/BashModeProgress.tsx +56 -0
  291. package/src/components/BridgeDialog.tsx +401 -0
  292. package/src/components/BypassPermissionsModeDialog.tsx +87 -0
  293. package/src/components/ChannelDowngradeDialog.tsx +102 -0
  294. package/src/components/ClaudeCodeHint/PluginHintMenu.tsx +78 -0
  295. package/src/components/ClaudeInChromeOnboarding.tsx +121 -0
  296. package/src/components/ClaudeMdExternalIncludesDialog.tsx +137 -0
  297. package/src/components/ClickableImageRef.tsx +73 -0
  298. package/src/components/CompactSummary.tsx +118 -0
  299. package/src/components/ConfigurableShortcutHint.tsx +57 -0
  300. package/src/components/ConsoleOAuthFlow.tsx +631 -0
  301. package/src/components/ContextSuggestions.tsx +47 -0
  302. package/src/components/ContextVisualization.tsx +489 -0
  303. package/src/components/CoordinatorAgentStatus.tsx +273 -0
  304. package/src/components/CostThresholdDialog.tsx +50 -0
  305. package/src/components/CtrlOToExpand.tsx +51 -0
  306. package/src/components/CustomSelect/SelectMulti.tsx +213 -0
  307. package/src/components/CustomSelect/index.ts +3 -0
  308. package/src/components/CustomSelect/option-map.ts +50 -0
  309. package/src/components/CustomSelect/select-input-option.tsx +488 -0
  310. package/src/components/CustomSelect/select-option.tsx +68 -0
  311. package/src/components/CustomSelect/select.tsx +690 -0
  312. package/src/components/CustomSelect/use-multi-select-state.ts +414 -0
  313. package/src/components/CustomSelect/use-select-input.ts +287 -0
  314. package/src/components/CustomSelect/use-select-navigation.ts +653 -0
  315. package/src/components/CustomSelect/use-select-state.ts +157 -0
  316. package/src/components/DesktopHandoff.tsx +193 -0
  317. package/src/components/DesktopUpsell/DesktopUpsellStartup.tsx +171 -0
  318. package/src/components/DevBar.tsx +49 -0
  319. package/src/components/DevChannelsDialog.tsx +105 -0
  320. package/src/components/DiagnosticsDisplay.tsx +95 -0
  321. package/src/components/EffortCallout.tsx +265 -0
  322. package/src/components/EffortIndicator.ts +42 -0
  323. package/src/components/ExitFlow.tsx +48 -0
  324. package/src/components/ExportDialog.tsx +128 -0
  325. package/src/components/FallbackToolUseErrorMessage.tsx +116 -0
  326. package/src/components/FallbackToolUseRejectedMessage.tsx +16 -0
  327. package/src/components/FastIcon.tsx +46 -0
  328. package/src/components/Feedback.tsx +592 -0
  329. package/src/components/FeedbackSurvey/FeedbackSurvey.tsx +174 -0
  330. package/src/components/FeedbackSurvey/FeedbackSurveyView.tsx +108 -0
  331. package/src/components/FeedbackSurvey/TranscriptSharePrompt.tsx +88 -0
  332. package/src/components/FeedbackSurvey/submitTranscriptShare.ts +112 -0
  333. package/src/components/FeedbackSurvey/useDebouncedDigitInput.ts +82 -0
  334. package/src/components/FeedbackSurvey/useFeedbackSurvey.tsx +296 -0
  335. package/src/components/FeedbackSurvey/useMemorySurvey.tsx +213 -0
  336. package/src/components/FeedbackSurvey/usePostCompactSurvey.tsx +206 -0
  337. package/src/components/FeedbackSurvey/useSurveyState.tsx +100 -0
  338. package/src/components/FileEditToolDiff.tsx +181 -0
  339. package/src/components/FileEditToolUpdatedMessage.tsx +124 -0
  340. package/src/components/FileEditToolUseRejectedMessage.tsx +170 -0
  341. package/src/components/FilePathLink.tsx +43 -0
  342. package/src/components/FullscreenLayout.tsx +637 -0
  343. package/src/components/GlobalSearchDialog.tsx +343 -0
  344. package/src/components/HelpV2/Commands.tsx +82 -0
  345. package/src/components/HelpV2/General.tsx +23 -0
  346. package/src/components/HelpV2/HelpV2.tsx +184 -0
  347. package/src/components/HighlightedCode/Fallback.tsx +193 -0
  348. package/src/components/HighlightedCode.tsx +190 -0
  349. package/src/components/HistorySearchDialog.tsx +118 -0
  350. package/src/components/IdeAutoConnectDialog.tsx +154 -0
  351. package/src/components/IdeOnboardingDialog.tsx +167 -0
  352. package/src/components/IdeStatusIndicator.tsx +58 -0
  353. package/src/components/IdleReturnDialog.tsx +118 -0
  354. package/src/components/InterruptedByUser.tsx +15 -0
  355. package/src/components/InvalidConfigDialog.tsx +156 -0
  356. package/src/components/InvalidSettingsDialog.tsx +89 -0
  357. package/src/components/KeybindingWarnings.tsx +55 -0
  358. package/src/components/LanguagePicker.tsx +86 -0
  359. package/src/components/LogSelector.tsx +1575 -0
  360. package/src/components/LogoV2/AnimatedAsterisk.tsx +50 -0
  361. package/src/components/LogoV2/AnimatedClawd.tsx +124 -0
  362. package/src/components/LogoV2/ChannelsNotice.tsx +266 -0
  363. package/src/components/LogoV2/Clawd.tsx +240 -0
  364. package/src/components/LogoV2/CondensedLogo.tsx +161 -0
  365. package/src/components/LogoV2/EmergencyTip.tsx +58 -0
  366. package/src/components/LogoV2/Feed.tsx +112 -0
  367. package/src/components/LogoV2/FeedColumn.tsx +59 -0
  368. package/src/components/LogoV2/GuestPassesUpsell.tsx +70 -0
  369. package/src/components/LogoV2/LogoV2.tsx +543 -0
  370. package/src/components/LogoV2/Opus1mMergeNotice.tsx +55 -0
  371. package/src/components/LogoV2/OverageCreditUpsell.tsx +166 -0
  372. package/src/components/LogoV2/VoiceModeNotice.tsx +68 -0
  373. package/src/components/LogoV2/WelcomeV2.tsx +433 -0
  374. package/src/components/LogoV2/feedConfigs.tsx +92 -0
  375. package/src/components/LspRecommendation/LspRecommendationMenu.tsx +88 -0
  376. package/src/components/MCPServerApprovalDialog.tsx +115 -0
  377. package/src/components/MCPServerDesktopImportDialog.tsx +203 -0
  378. package/src/components/MCPServerDialogCopy.tsx +15 -0
  379. package/src/components/MCPServerMultiselectDialog.tsx +133 -0
  380. package/src/components/ManagedSettingsSecurityDialog/ManagedSettingsSecurityDialog.tsx +149 -0
  381. package/src/components/ManagedSettingsSecurityDialog/utils.ts +144 -0
  382. package/src/components/Markdown.tsx +236 -0
  383. package/src/components/MarkdownTable.tsx +322 -0
  384. package/src/components/MemoryUsageIndicator.tsx +37 -0
  385. package/src/components/Message.tsx +627 -0
  386. package/src/components/MessageModel.tsx +43 -0
  387. package/src/components/MessageResponse.tsx +78 -0
  388. package/src/components/MessageRow.tsx +383 -0
  389. package/src/components/MessageSelector.tsx +831 -0
  390. package/src/components/MessageTimestamp.tsx +63 -0
  391. package/src/components/Messages.tsx +834 -0
  392. package/src/components/ModelPicker.tsx +448 -0
  393. package/src/components/NativeAutoUpdater.tsx +193 -0
  394. package/src/components/NotebookEditToolUseRejectedMessage.tsx +92 -0
  395. package/src/components/OffscreenFreeze.tsx +44 -0
  396. package/src/components/Onboarding.tsx +244 -0
  397. package/src/components/OutputStylePicker.tsx +112 -0
  398. package/src/components/PackageManagerAutoUpdater.tsx +104 -0
  399. package/src/components/Passes/Passes.tsx +184 -0
  400. package/src/components/PrBadge.tsx +97 -0
  401. package/src/components/PressEnterToContinue.tsx +15 -0
  402. package/src/components/PromptInput/HistorySearchInput.tsx +51 -0
  403. package/src/components/PromptInput/IssueFlagBanner.tsx +12 -0
  404. package/src/components/PromptInput/Notifications.tsx +332 -0
  405. package/src/components/PromptInput/PromptInput.tsx +2339 -0
  406. package/src/components/PromptInput/PromptInputFooter.tsx +191 -0
  407. package/src/components/PromptInput/PromptInputFooterLeftSide.tsx +517 -0
  408. package/src/components/PromptInput/PromptInputFooterSuggestions.tsx +293 -0
  409. package/src/components/PromptInput/PromptInputHelpMenu.tsx +358 -0
  410. package/src/components/PromptInput/PromptInputModeIndicator.tsx +93 -0
  411. package/src/components/PromptInput/PromptInputQueuedCommands.tsx +117 -0
  412. package/src/components/PromptInput/PromptInputStashNotice.tsx +25 -0
  413. package/src/components/PromptInput/SandboxPromptFooterHint.tsx +64 -0
  414. package/src/components/PromptInput/ShimmeredInput.tsx +143 -0
  415. package/src/components/PromptInput/VoiceIndicator.tsx +137 -0
  416. package/src/components/PromptInput/inputModes.ts +33 -0
  417. package/src/components/PromptInput/inputPaste.ts +90 -0
  418. package/src/components/PromptInput/useMaybeTruncateInput.ts +58 -0
  419. package/src/components/PromptInput/usePromptInputPlaceholder.ts +76 -0
  420. package/src/components/PromptInput/useShowFastIconHint.ts +31 -0
  421. package/src/components/PromptInput/useSwarmBanner.ts +155 -0
  422. package/src/components/PromptInput/utils.ts +60 -0
  423. package/src/components/QuickOpenDialog.tsx +244 -0
  424. package/src/components/RemoteCallout.tsx +76 -0
  425. package/src/components/RemoteEnvironmentDialog.tsx +340 -0
  426. package/src/components/ResumeTask.tsx +268 -0
  427. package/src/components/SandboxViolationExpandedView.tsx +99 -0
  428. package/src/components/ScrollKeybindingHandler.tsx +1012 -0
  429. package/src/components/SearchBox.tsx +72 -0
  430. package/src/components/SentryErrorBoundary.ts +28 -0
  431. package/src/components/SessionBackgroundHint.tsx +108 -0
  432. package/src/components/SessionPreview.tsx +194 -0
  433. package/src/components/Settings/Config.tsx +1822 -0
  434. package/src/components/Settings/Settings.tsx +137 -0
  435. package/src/components/Settings/Status.tsx +241 -0
  436. package/src/components/Settings/Usage.tsx +377 -0
  437. package/src/components/ShowInIDEPrompt.tsx +170 -0
  438. package/src/components/SkillImprovementSurvey.tsx +152 -0
  439. package/src/components/Spinner/FlashingChar.tsx +61 -0
  440. package/src/components/Spinner/GlimmerMessage.tsx +328 -0
  441. package/src/components/Spinner/ShimmerChar.tsx +36 -0
  442. package/src/components/Spinner/SpinnerAnimationRow.tsx +265 -0
  443. package/src/components/Spinner/SpinnerGlyph.tsx +80 -0
  444. package/src/components/Spinner/TeammateSpinnerLine.tsx +233 -0
  445. package/src/components/Spinner/TeammateSpinnerTree.tsx +272 -0
  446. package/src/components/Spinner/index.ts +10 -0
  447. package/src/components/Spinner/teammateSelectHint.ts +1 -0
  448. package/src/components/Spinner/useShimmerAnimation.ts +31 -0
  449. package/src/components/Spinner/useStalledAnimation.ts +75 -0
  450. package/src/components/Spinner/utils.ts +84 -0
  451. package/src/components/Spinner.tsx +562 -0
  452. package/src/components/Stats.tsx +1228 -0
  453. package/src/components/StatusLine.tsx +324 -0
  454. package/src/components/StatusNotices.tsx +55 -0
  455. package/src/components/StructuredDiff/Fallback.tsx +487 -0
  456. package/src/components/StructuredDiff/colorDiff.ts +37 -0
  457. package/src/components/StructuredDiff.tsx +190 -0
  458. package/src/components/StructuredDiffList.tsx +30 -0
  459. package/src/components/TagTabs.tsx +139 -0
  460. package/src/components/TaskListV2.tsx +378 -0
  461. package/src/components/TeammateViewHeader.tsx +82 -0
  462. package/src/components/TeleportError.tsx +189 -0
  463. package/src/components/TeleportProgress.tsx +140 -0
  464. package/src/components/TeleportRepoMismatchDialog.tsx +104 -0
  465. package/src/components/TeleportResumeWrapper.tsx +167 -0
  466. package/src/components/TeleportStash.tsx +116 -0
  467. package/src/components/TextInput.tsx +124 -0
  468. package/src/components/ThemePicker.tsx +333 -0
  469. package/src/components/ThinkingToggle.tsx +153 -0
  470. package/src/components/TokenWarning.tsx +179 -0
  471. package/src/components/ToolUseLoader.tsx +42 -0
  472. package/src/components/TrustDialog/TrustDialog.tsx +290 -0
  473. package/src/components/TrustDialog/utils.ts +245 -0
  474. package/src/components/ValidationErrorsList.tsx +148 -0
  475. package/src/components/VimTextInput.tsx +140 -0
  476. package/src/components/VirtualMessageList.tsx +1082 -0
  477. package/src/components/WorkflowMultiselectDialog.tsx +128 -0
  478. package/src/components/WorktreeExitDialog.tsx +231 -0
  479. package/src/components/agents/AgentDetail.tsx +220 -0
  480. package/src/components/agents/AgentEditor.tsx +178 -0
  481. package/src/components/agents/AgentNavigationFooter.tsx +26 -0
  482. package/src/components/agents/AgentsList.tsx +440 -0
  483. package/src/components/agents/AgentsMenu.tsx +800 -0
  484. package/src/components/agents/ColorPicker.tsx +112 -0
  485. package/src/components/agents/ModelSelector.tsx +68 -0
  486. package/src/components/agents/ToolSelector.tsx +562 -0
  487. package/src/components/agents/agentFileUtils.ts +272 -0
  488. package/src/components/agents/generateAgent.ts +197 -0
  489. package/src/components/agents/new-agent-creation/CreateAgentWizard.tsx +97 -0
  490. package/src/components/agents/new-agent-creation/wizard-steps/ColorStep.tsx +84 -0
  491. package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStep.tsx +378 -0
  492. package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStepWrapper.tsx +74 -0
  493. package/src/components/agents/new-agent-creation/wizard-steps/DescriptionStep.tsx +123 -0
  494. package/src/components/agents/new-agent-creation/wizard-steps/GenerateStep.tsx +143 -0
  495. package/src/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx +80 -0
  496. package/src/components/agents/new-agent-creation/wizard-steps/MemoryStep.tsx +113 -0
  497. package/src/components/agents/new-agent-creation/wizard-steps/MethodStep.tsx +80 -0
  498. package/src/components/agents/new-agent-creation/wizard-steps/ModelStep.tsx +52 -0
  499. package/src/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx +128 -0
  500. package/src/components/agents/new-agent-creation/wizard-steps/ToolsStep.tsx +61 -0
  501. package/src/components/agents/new-agent-creation/wizard-steps/TypeStep.tsx +103 -0
  502. package/src/components/agents/types.ts +27 -0
  503. package/src/components/agents/utils.ts +18 -0
  504. package/src/components/agents/validateAgent.ts +109 -0
  505. package/src/components/design-system/Byline.tsx +77 -0
  506. package/src/components/design-system/Dialog.tsx +138 -0
  507. package/src/components/design-system/Divider.tsx +149 -0
  508. package/src/components/design-system/FuzzyPicker.tsx +312 -0
  509. package/src/components/design-system/KeyboardShortcutHint.tsx +81 -0
  510. package/src/components/design-system/ListItem.tsx +244 -0
  511. package/src/components/design-system/LoadingState.tsx +94 -0
  512. package/src/components/design-system/Pane.tsx +77 -0
  513. package/src/components/design-system/ProgressBar.tsx +86 -0
  514. package/src/components/design-system/Ratchet.tsx +80 -0
  515. package/src/components/design-system/StatusIcon.tsx +95 -0
  516. package/src/components/design-system/Tabs.tsx +340 -0
  517. package/src/components/design-system/ThemeProvider.tsx +174 -0
  518. package/src/components/design-system/ThemedBox.tsx +156 -0
  519. package/src/components/design-system/ThemedText.tsx +124 -0
  520. package/src/components/design-system/color.ts +30 -0
  521. package/src/components/diff/DiffDetailView.tsx +281 -0
  522. package/src/components/diff/DiffDialog.tsx +383 -0
  523. package/src/components/diff/DiffFileList.tsx +292 -0
  524. package/src/components/grove/Grove.tsx +463 -0
  525. package/src/components/hooks/HooksConfigMenu.tsx +578 -0
  526. package/src/components/hooks/PromptDialog.tsx +90 -0
  527. package/src/components/hooks/SelectEventMode.tsx +127 -0
  528. package/src/components/hooks/SelectHookMode.tsx +112 -0
  529. package/src/components/hooks/SelectMatcherMode.tsx +144 -0
  530. package/src/components/hooks/ViewHookMode.tsx +199 -0
  531. package/src/components/mcp/CapabilitiesSection.tsx +61 -0
  532. package/src/components/mcp/ElicitationDialog.tsx +1169 -0
  533. package/src/components/mcp/MCPAgentServerMenu.tsx +183 -0
  534. package/src/components/mcp/MCPListPanel.tsx +504 -0
  535. package/src/components/mcp/MCPReconnect.tsx +167 -0
  536. package/src/components/mcp/MCPRemoteServerMenu.tsx +649 -0
  537. package/src/components/mcp/MCPSettings.tsx +398 -0
  538. package/src/components/mcp/MCPStdioServerMenu.tsx +177 -0
  539. package/src/components/mcp/MCPToolDetailView.tsx +212 -0
  540. package/src/components/mcp/MCPToolListView.tsx +141 -0
  541. package/src/components/mcp/McpParsingWarnings.tsx +213 -0
  542. package/src/components/mcp/index.ts +9 -0
  543. package/src/components/mcp/utils/reconnectHelpers.tsx +49 -0
  544. package/src/components/memory/MemoryFileSelector.tsx +438 -0
  545. package/src/components/memory/MemoryUpdateNotification.tsx +45 -0
  546. package/src/components/messageActions.tsx +450 -0
  547. package/src/components/messages/AdvisorMessage.tsx +158 -0
  548. package/src/components/messages/AssistantRedactedThinkingMessage.tsx +31 -0
  549. package/src/components/messages/AssistantTextMessage.tsx +270 -0
  550. package/src/components/messages/AssistantThinkingMessage.tsx +86 -0
  551. package/src/components/messages/AssistantToolUseMessage.tsx +368 -0
  552. package/src/components/messages/AttachmentMessage.tsx +536 -0
  553. package/src/components/messages/CollapsedReadSearchContent.tsx +484 -0
  554. package/src/components/messages/CompactBoundaryMessage.tsx +18 -0
  555. package/src/components/messages/GroupedToolUseContent.tsx +58 -0
  556. package/src/components/messages/HighlightedThinkingText.tsx +162 -0
  557. package/src/components/messages/HookProgressMessage.tsx +116 -0
  558. package/src/components/messages/PlanApprovalMessage.tsx +222 -0
  559. package/src/components/messages/RateLimitMessage.tsx +161 -0
  560. package/src/components/messages/ShutdownMessage.tsx +132 -0
  561. package/src/components/messages/SystemAPIErrorMessage.tsx +141 -0
  562. package/src/components/messages/SystemTextMessage.tsx +827 -0
  563. package/src/components/messages/TaskAssignmentMessage.tsx +76 -0
  564. package/src/components/messages/UserAgentNotificationMessage.tsx +83 -0
  565. package/src/components/messages/UserBashInputMessage.tsx +58 -0
  566. package/src/components/messages/UserBashOutputMessage.tsx +54 -0
  567. package/src/components/messages/UserChannelMessage.tsx +137 -0
  568. package/src/components/messages/UserCommandMessage.tsx +108 -0
  569. package/src/components/messages/UserImageMessage.tsx +59 -0
  570. package/src/components/messages/UserLocalCommandOutputMessage.tsx +167 -0
  571. package/src/components/messages/UserMemoryInputMessage.tsx +75 -0
  572. package/src/components/messages/UserPlanMessage.tsx +42 -0
  573. package/src/components/messages/UserPromptMessage.tsx +80 -0
  574. package/src/components/messages/UserResourceUpdateMessage.tsx +121 -0
  575. package/src/components/messages/UserTeammateMessage.tsx +206 -0
  576. package/src/components/messages/UserTextMessage.tsx +275 -0
  577. package/src/components/messages/UserToolResultMessage/RejectedPlanMessage.tsx +31 -0
  578. package/src/components/messages/UserToolResultMessage/RejectedToolUseMessage.tsx +16 -0
  579. package/src/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +16 -0
  580. package/src/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +103 -0
  581. package/src/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +95 -0
  582. package/src/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +106 -0
  583. package/src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +104 -0
  584. package/src/components/messages/UserToolResultMessage/utils.tsx +44 -0
  585. package/src/components/messages/nullRenderingAttachments.ts +70 -0
  586. package/src/components/messages/teamMemCollapsed.tsx +140 -0
  587. package/src/components/messages/teamMemSaved.ts +19 -0
  588. package/src/components/permissions/AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest.tsx +645 -0
  589. package/src/components/permissions/AskUserQuestionPermissionRequest/PreviewBox.tsx +229 -0
  590. package/src/components/permissions/AskUserQuestionPermissionRequest/PreviewQuestionView.tsx +328 -0
  591. package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionNavigationBar.tsx +178 -0
  592. package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionView.tsx +465 -0
  593. package/src/components/permissions/AskUserQuestionPermissionRequest/SubmitQuestionsView.tsx +144 -0
  594. package/src/components/permissions/AskUserQuestionPermissionRequest/use-multiple-choice-state.ts +179 -0
  595. package/src/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +482 -0
  596. package/src/components/permissions/BashPermissionRequest/bashToolUseOptions.tsx +147 -0
  597. package/src/components/permissions/ComputerUseApproval/ComputerUseApproval.tsx +441 -0
  598. package/src/components/permissions/EnterPlanModePermissionRequest/EnterPlanModePermissionRequest.tsx +122 -0
  599. package/src/components/permissions/ExitPlanModePermissionRequest/ExitPlanModePermissionRequest.tsx +768 -0
  600. package/src/components/permissions/FallbackPermissionRequest.tsx +333 -0
  601. package/src/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +182 -0
  602. package/src/components/permissions/FilePermissionDialog/FilePermissionDialog.tsx +204 -0
  603. package/src/components/permissions/FilePermissionDialog/ideDiffConfig.ts +42 -0
  604. package/src/components/permissions/FilePermissionDialog/permissionOptions.tsx +177 -0
  605. package/src/components/permissions/FilePermissionDialog/useFilePermissionDialog.ts +212 -0
  606. package/src/components/permissions/FilePermissionDialog/usePermissionHandler.ts +185 -0
  607. package/src/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +161 -0
  608. package/src/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +89 -0
  609. package/src/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +115 -0
  610. package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditPermissionRequest.tsx +166 -0
  611. package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditToolDiff.tsx +235 -0
  612. package/src/components/permissions/PermissionDecisionDebugInfo.tsx +460 -0
  613. package/src/components/permissions/PermissionDialog.tsx +72 -0
  614. package/src/components/permissions/PermissionExplanation.tsx +272 -0
  615. package/src/components/permissions/PermissionPrompt.tsx +336 -0
  616. package/src/components/permissions/PermissionRequest.tsx +217 -0
  617. package/src/components/permissions/PermissionRequestTitle.tsx +66 -0
  618. package/src/components/permissions/PermissionRuleExplanation.tsx +121 -0
  619. package/src/components/permissions/PowerShellPermissionRequest/PowerShellPermissionRequest.tsx +235 -0
  620. package/src/components/permissions/PowerShellPermissionRequest/powershellToolUseOptions.tsx +91 -0
  621. package/src/components/permissions/SandboxPermissionRequest.tsx +163 -0
  622. package/src/components/permissions/SedEditPermissionRequest/SedEditPermissionRequest.tsx +230 -0
  623. package/src/components/permissions/SkillPermissionRequest/SkillPermissionRequest.tsx +369 -0
  624. package/src/components/permissions/WebFetchPermissionRequest/WebFetchPermissionRequest.tsx +258 -0
  625. package/src/components/permissions/WorkerBadge.tsx +49 -0
  626. package/src/components/permissions/WorkerPendingPermission.tsx +105 -0
  627. package/src/components/permissions/hooks.ts +209 -0
  628. package/src/components/permissions/rules/AddPermissionRules.tsx +180 -0
  629. package/src/components/permissions/rules/AddWorkspaceDirectory.tsx +340 -0
  630. package/src/components/permissions/rules/PermissionRuleDescription.tsx +76 -0
  631. package/src/components/permissions/rules/PermissionRuleInput.tsx +138 -0
  632. package/src/components/permissions/rules/PermissionRuleList.tsx +1179 -0
  633. package/src/components/permissions/rules/RecentDenialsTab.tsx +207 -0
  634. package/src/components/permissions/rules/RemoveWorkspaceDirectory.tsx +110 -0
  635. package/src/components/permissions/rules/WorkspaceTab.tsx +150 -0
  636. package/src/components/permissions/shellPermissionHelpers.tsx +164 -0
  637. package/src/components/permissions/useShellPermissionFeedback.ts +148 -0
  638. package/src/components/permissions/utils.ts +25 -0
  639. package/src/components/sandbox/SandboxConfigTab.tsx +45 -0
  640. package/src/components/sandbox/SandboxDependenciesTab.tsx +120 -0
  641. package/src/components/sandbox/SandboxDoctorSection.tsx +46 -0
  642. package/src/components/sandbox/SandboxOverridesTab.tsx +193 -0
  643. package/src/components/sandbox/SandboxSettings.tsx +296 -0
  644. package/src/components/shell/ExpandShellOutputContext.tsx +36 -0
  645. package/src/components/shell/OutputLine.tsx +118 -0
  646. package/src/components/shell/ShellProgressMessage.tsx +150 -0
  647. package/src/components/shell/ShellTimeDisplay.tsx +74 -0
  648. package/src/components/skills/SkillsMenu.tsx +237 -0
  649. package/src/components/tasks/AsyncAgentDetailDialog.tsx +229 -0
  650. package/src/components/tasks/BackgroundTask.tsx +345 -0
  651. package/src/components/tasks/BackgroundTaskStatus.tsx +429 -0
  652. package/src/components/tasks/BackgroundTasksDialog.tsx +652 -0
  653. package/src/components/tasks/DreamDetailDialog.tsx +251 -0
  654. package/src/components/tasks/InProcessTeammateDetailDialog.tsx +266 -0
  655. package/src/components/tasks/RemoteSessionDetailDialog.tsx +904 -0
  656. package/src/components/tasks/RemoteSessionProgress.tsx +243 -0
  657. package/src/components/tasks/ShellDetailDialog.tsx +404 -0
  658. package/src/components/tasks/ShellProgress.tsx +87 -0
  659. package/src/components/tasks/renderToolActivity.tsx +33 -0
  660. package/src/components/tasks/taskStatusUtils.tsx +107 -0
  661. package/src/components/teams/TeamStatus.tsx +80 -0
  662. package/src/components/teams/TeamsDialog.tsx +715 -0
  663. package/src/components/ui/OrderedList.tsx +71 -0
  664. package/src/components/ui/OrderedListItem.tsx +45 -0
  665. package/src/components/ui/TreeSelect.tsx +397 -0
  666. package/src/components/wizard/WizardDialogLayout.tsx +65 -0
  667. package/src/components/wizard/WizardNavigationFooter.tsx +24 -0
  668. package/src/components/wizard/WizardProvider.tsx +213 -0
  669. package/src/components/wizard/index.ts +9 -0
  670. package/src/components/wizard/useWizard.ts +13 -0
  671. package/src/constants/apiLimits.ts +94 -0
  672. package/src/constants/betas.ts +52 -0
  673. package/src/constants/common.ts +33 -0
  674. package/src/constants/cyberRiskInstruction.ts +24 -0
  675. package/src/constants/errorIds.ts +15 -0
  676. package/src/constants/figures.ts +45 -0
  677. package/src/constants/files.ts +156 -0
  678. package/src/constants/github-app.ts +144 -0
  679. package/src/constants/keys.ts +11 -0
  680. package/src/constants/messages.ts +1 -0
  681. package/src/constants/oauth.ts +234 -0
  682. package/src/constants/outputStyles.ts +216 -0
  683. package/src/constants/product.ts +76 -0
  684. package/src/constants/prompts.ts +914 -0
  685. package/src/constants/spinnerVerbs.ts +204 -0
  686. package/src/constants/system.ts +95 -0
  687. package/src/constants/systemPromptSections.ts +68 -0
  688. package/src/constants/toolLimits.ts +56 -0
  689. package/src/constants/tools.ts +112 -0
  690. package/src/constants/turnCompletionVerbs.ts +12 -0
  691. package/src/constants/xml.ts +86 -0
  692. package/src/context/QueuedMessageContext.tsx +63 -0
  693. package/src/context/fpsMetrics.tsx +30 -0
  694. package/src/context/mailbox.tsx +38 -0
  695. package/src/context/modalContext.tsx +58 -0
  696. package/src/context/notifications.tsx +240 -0
  697. package/src/context/overlayContext.tsx +151 -0
  698. package/src/context/promptOverlayContext.tsx +125 -0
  699. package/src/context/stats.tsx +220 -0
  700. package/src/context/voice.tsx +88 -0
  701. package/src/context.ts +189 -0
  702. package/src/coordinator/coordinatorMode.ts +369 -0
  703. package/src/cost-tracker.ts +323 -0
  704. package/src/costHook.ts +22 -0
  705. package/src/dialogLaunchers.tsx +133 -0
  706. package/src/entrypoints/agentSdkTypes.ts +443 -0
  707. package/src/entrypoints/cli.tsx +303 -0
  708. package/src/entrypoints/init.ts +340 -0
  709. package/src/entrypoints/mcp.ts +196 -0
  710. package/src/entrypoints/sandboxTypes.ts +156 -0
  711. package/src/entrypoints/sdk/controlSchemas.ts +663 -0
  712. package/src/entrypoints/sdk/coreSchemas.ts +1889 -0
  713. package/src/entrypoints/sdk/coreTypes.ts +62 -0
  714. package/src/history.ts +464 -0
  715. package/src/hooks/fileSuggestions.ts +811 -0
  716. package/src/hooks/notifs/useAutoModeUnavailableNotification.ts +56 -0
  717. package/src/hooks/notifs/useCanSwitchToExistingSubscription.tsx +60 -0
  718. package/src/hooks/notifs/useDeprecationWarningNotification.tsx +44 -0
  719. package/src/hooks/notifs/useFastModeNotification.tsx +162 -0
  720. package/src/hooks/notifs/useIDEStatusIndicator.tsx +186 -0
  721. package/src/hooks/notifs/useInstallMessages.tsx +26 -0
  722. package/src/hooks/notifs/useLspInitializationNotification.tsx +143 -0
  723. package/src/hooks/notifs/useMcpConnectivityStatus.tsx +88 -0
  724. package/src/hooks/notifs/useModelMigrationNotifications.tsx +52 -0
  725. package/src/hooks/notifs/useNpmDeprecationNotification.tsx +25 -0
  726. package/src/hooks/notifs/usePluginAutoupdateNotification.tsx +83 -0
  727. package/src/hooks/notifs/usePluginInstallationStatus.tsx +128 -0
  728. package/src/hooks/notifs/useRateLimitWarningNotification.tsx +114 -0
  729. package/src/hooks/notifs/useSettingsErrors.tsx +69 -0
  730. package/src/hooks/notifs/useStartupNotification.ts +41 -0
  731. package/src/hooks/notifs/useTeammateShutdownNotification.ts +78 -0
  732. package/src/hooks/renderPlaceholder.ts +51 -0
  733. package/src/hooks/toolPermission/PermissionContext.ts +388 -0
  734. package/src/hooks/toolPermission/handlers/coordinatorHandler.ts +65 -0
  735. package/src/hooks/toolPermission/handlers/interactiveHandler.ts +536 -0
  736. package/src/hooks/toolPermission/handlers/swarmWorkerHandler.ts +159 -0
  737. package/src/hooks/toolPermission/permissionLogging.ts +238 -0
  738. package/src/hooks/unifiedSuggestions.ts +202 -0
  739. package/src/hooks/useAfterFirstRender.ts +17 -0
  740. package/src/hooks/useApiKeyVerification.ts +84 -0
  741. package/src/hooks/useArrowKeyHistory.tsx +229 -0
  742. package/src/hooks/useAssistantHistory.ts +250 -0
  743. package/src/hooks/useAwaySummary.ts +125 -0
  744. package/src/hooks/useBackgroundTaskNavigation.ts +251 -0
  745. package/src/hooks/useBlink.ts +34 -0
  746. package/src/hooks/useCanUseTool.tsx +204 -0
  747. package/src/hooks/useCancelRequest.ts +276 -0
  748. package/src/hooks/useChromeExtensionNotification.tsx +50 -0
  749. package/src/hooks/useClaudeCodeHintRecommendation.tsx +129 -0
  750. package/src/hooks/useClipboardImageHint.ts +77 -0
  751. package/src/hooks/useCommandKeybindings.tsx +108 -0
  752. package/src/hooks/useCommandQueue.ts +15 -0
  753. package/src/hooks/useCopyOnSelect.ts +98 -0
  754. package/src/hooks/useDeferredHookMessages.ts +46 -0
  755. package/src/hooks/useDiffData.ts +110 -0
  756. package/src/hooks/useDiffInIDE.ts +379 -0
  757. package/src/hooks/useDirectConnect.ts +229 -0
  758. package/src/hooks/useDoublePress.ts +62 -0
  759. package/src/hooks/useDynamicConfig.ts +22 -0
  760. package/src/hooks/useElapsedTime.ts +37 -0
  761. package/src/hooks/useExitOnCtrlCD.ts +95 -0
  762. package/src/hooks/useExitOnCtrlCDWithKeybindings.ts +24 -0
  763. package/src/hooks/useFileHistorySnapshotInit.ts +25 -0
  764. package/src/hooks/useGlobalKeybindings.tsx +249 -0
  765. package/src/hooks/useHistorySearch.ts +303 -0
  766. package/src/hooks/useIDEIntegration.tsx +70 -0
  767. package/src/hooks/useIdeAtMentioned.ts +76 -0
  768. package/src/hooks/useIdeConnectionStatus.ts +33 -0
  769. package/src/hooks/useIdeLogging.ts +41 -0
  770. package/src/hooks/useIdeSelection.ts +150 -0
  771. package/src/hooks/useInboxPoller.ts +969 -0
  772. package/src/hooks/useInputBuffer.ts +132 -0
  773. package/src/hooks/useIssueFlagBanner.ts +133 -0
  774. package/src/hooks/useLogMessages.ts +119 -0
  775. package/src/hooks/useLspPluginRecommendation.tsx +194 -0
  776. package/src/hooks/useMailboxBridge.ts +21 -0
  777. package/src/hooks/useMainLoopModel.ts +34 -0
  778. package/src/hooks/useManagePlugins.ts +304 -0
  779. package/src/hooks/useMemoryUsage.ts +39 -0
  780. package/src/hooks/useMergedClients.ts +23 -0
  781. package/src/hooks/useMergedCommands.ts +15 -0
  782. package/src/hooks/useMergedTools.ts +44 -0
  783. package/src/hooks/useMinDisplayTime.ts +35 -0
  784. package/src/hooks/useNotifyAfterTimeout.ts +65 -0
  785. package/src/hooks/useOfficialMarketplaceNotification.tsx +48 -0
  786. package/src/hooks/usePasteHandler.ts +285 -0
  787. package/src/hooks/usePluginRecommendationBase.tsx +105 -0
  788. package/src/hooks/usePrStatus.ts +106 -0
  789. package/src/hooks/usePromptSuggestion.ts +177 -0
  790. package/src/hooks/usePromptsFromClaudeInChrome.tsx +71 -0
  791. package/src/hooks/useQueueProcessor.ts +68 -0
  792. package/src/hooks/useRemoteSession.ts +605 -0
  793. package/src/hooks/useReplBridge.tsx +723 -0
  794. package/src/hooks/useSSHSession.ts +241 -0
  795. package/src/hooks/useScheduledTasks.ts +139 -0
  796. package/src/hooks/useSearchInput.ts +364 -0
  797. package/src/hooks/useSessionBackgrounding.ts +158 -0
  798. package/src/hooks/useSettings.ts +17 -0
  799. package/src/hooks/useSettingsChange.ts +25 -0
  800. package/src/hooks/useSkillImprovementSurvey.ts +105 -0
  801. package/src/hooks/useSkillsChange.ts +62 -0
  802. package/src/hooks/useSwarmInitialization.ts +81 -0
  803. package/src/hooks/useSwarmPermissionPoller.ts +330 -0
  804. package/src/hooks/useTaskListWatcher.ts +221 -0
  805. package/src/hooks/useTasksV2.ts +250 -0
  806. package/src/hooks/useTeammateViewAutoExit.ts +63 -0
  807. package/src/hooks/useTeleportResume.tsx +85 -0
  808. package/src/hooks/useTerminalSize.ts +15 -0
  809. package/src/hooks/useTextInput.ts +529 -0
  810. package/src/hooks/useTimeout.ts +14 -0
  811. package/src/hooks/useTurnDiffs.ts +213 -0
  812. package/src/hooks/useTypeahead.tsx +1385 -0
  813. package/src/hooks/useUpdateNotification.ts +34 -0
  814. package/src/hooks/useVimInput.ts +316 -0
  815. package/src/hooks/useVirtualScroll.ts +721 -0
  816. package/src/hooks/useVoice.ts +1144 -0
  817. package/src/hooks/useVoiceEnabled.ts +25 -0
  818. package/src/hooks/useVoiceIntegration.tsx +677 -0
  819. package/src/ink/Ansi.tsx +292 -0
  820. package/src/ink/bidi.ts +139 -0
  821. package/src/ink/clearTerminal.ts +74 -0
  822. package/src/ink/colorize.ts +231 -0
  823. package/src/ink/components/AlternateScreen.tsx +80 -0
  824. package/src/ink/components/App.tsx +659 -0
  825. package/src/ink/components/AppContext.ts +21 -0
  826. package/src/ink/components/Box.tsx +214 -0
  827. package/src/ink/components/Button.tsx +192 -0
  828. package/src/ink/components/ClockContext.tsx +112 -0
  829. package/src/ink/components/CursorDeclarationContext.ts +32 -0
  830. package/src/ink/components/ErrorOverview.tsx +109 -0
  831. package/src/ink/components/Link.tsx +42 -0
  832. package/src/ink/components/Newline.tsx +39 -0
  833. package/src/ink/components/NoSelect.tsx +68 -0
  834. package/src/ink/components/RawAnsi.tsx +57 -0
  835. package/src/ink/components/ScrollBox.tsx +237 -0
  836. package/src/ink/components/Spacer.tsx +20 -0
  837. package/src/ink/components/StdinContext.ts +49 -0
  838. package/src/ink/components/TerminalFocusContext.tsx +52 -0
  839. package/src/ink/components/TerminalSizeContext.tsx +7 -0
  840. package/src/ink/components/Text.tsx +254 -0
  841. package/src/ink/constants.ts +2 -0
  842. package/src/ink/dom.ts +484 -0
  843. package/src/ink/events/click-event.ts +38 -0
  844. package/src/ink/events/dispatcher.ts +233 -0
  845. package/src/ink/events/emitter.ts +39 -0
  846. package/src/ink/events/event-handlers.ts +73 -0
  847. package/src/ink/events/event.ts +11 -0
  848. package/src/ink/events/focus-event.ts +21 -0
  849. package/src/ink/events/input-event.ts +205 -0
  850. package/src/ink/events/keyboard-event.ts +51 -0
  851. package/src/ink/events/terminal-event.ts +107 -0
  852. package/src/ink/events/terminal-focus-event.ts +19 -0
  853. package/src/ink/focus.ts +181 -0
  854. package/src/ink/frame.ts +124 -0
  855. package/src/ink/get-max-width.ts +27 -0
  856. package/src/ink/hit-test.ts +130 -0
  857. package/src/ink/hooks/use-animation-frame.ts +57 -0
  858. package/src/ink/hooks/use-app.ts +8 -0
  859. package/src/ink/hooks/use-declared-cursor.ts +73 -0
  860. package/src/ink/hooks/use-input.ts +92 -0
  861. package/src/ink/hooks/use-interval.ts +67 -0
  862. package/src/ink/hooks/use-search-highlight.ts +53 -0
  863. package/src/ink/hooks/use-selection.ts +104 -0
  864. package/src/ink/hooks/use-stdin.ts +8 -0
  865. package/src/ink/hooks/use-tab-status.ts +72 -0
  866. package/src/ink/hooks/use-terminal-focus.ts +16 -0
  867. package/src/ink/hooks/use-terminal-title.ts +31 -0
  868. package/src/ink/hooks/use-terminal-viewport.ts +96 -0
  869. package/src/ink/ink.tsx +1728 -0
  870. package/src/ink/instances.ts +10 -0
  871. package/src/ink/layout/engine.ts +6 -0
  872. package/src/ink/layout/geometry.ts +97 -0
  873. package/src/ink/layout/node.ts +152 -0
  874. package/src/ink/layout/yoga.ts +308 -0
  875. package/src/ink/line-width-cache.ts +24 -0
  876. package/src/ink/log-update.ts +773 -0
  877. package/src/ink/measure-element.ts +23 -0
  878. package/src/ink/measure-text.ts +47 -0
  879. package/src/ink/node-cache.ts +54 -0
  880. package/src/ink/optimizer.ts +93 -0
  881. package/src/ink/output.ts +797 -0
  882. package/src/ink/parse-keypress.ts +801 -0
  883. package/src/ink/reconciler.ts +512 -0
  884. package/src/ink/render-border.ts +231 -0
  885. package/src/ink/render-node-to-output.ts +1462 -0
  886. package/src/ink/render-to-screen.ts +231 -0
  887. package/src/ink/renderer.ts +178 -0
  888. package/src/ink/root.ts +184 -0
  889. package/src/ink/screen.ts +1486 -0
  890. package/src/ink/searchHighlight.ts +93 -0
  891. package/src/ink/selection.ts +917 -0
  892. package/src/ink/squash-text-nodes.ts +92 -0
  893. package/src/ink/stringWidth.ts +222 -0
  894. package/src/ink/styles.ts +771 -0
  895. package/src/ink/supports-hyperlinks.ts +57 -0
  896. package/src/ink/tabstops.ts +46 -0
  897. package/src/ink/terminal-focus-state.ts +47 -0
  898. package/src/ink/terminal-querier.ts +212 -0
  899. package/src/ink/terminal.ts +248 -0
  900. package/src/ink/termio/ansi.ts +75 -0
  901. package/src/ink/termio/csi.ts +319 -0
  902. package/src/ink/termio/dec.ts +60 -0
  903. package/src/ink/termio/esc.ts +67 -0
  904. package/src/ink/termio/osc.ts +493 -0
  905. package/src/ink/termio/parser.ts +394 -0
  906. package/src/ink/termio/sgr.ts +308 -0
  907. package/src/ink/termio/tokenize.ts +319 -0
  908. package/src/ink/termio/types.ts +236 -0
  909. package/src/ink/termio.ts +42 -0
  910. package/src/ink/useTerminalNotification.ts +126 -0
  911. package/src/ink/warn.ts +9 -0
  912. package/src/ink/widest-line.ts +19 -0
  913. package/src/ink/wrap-text.ts +74 -0
  914. package/src/ink/wrapAnsi.ts +20 -0
  915. package/src/ink.ts +85 -0
  916. package/src/interactiveHelpers.tsx +367 -0
  917. package/src/keybindings/KeybindingContext.tsx +243 -0
  918. package/src/keybindings/KeybindingProviderSetup.tsx +308 -0
  919. package/src/keybindings/defaultBindings.ts +340 -0
  920. package/src/keybindings/loadUserBindings.ts +472 -0
  921. package/src/keybindings/match.ts +120 -0
  922. package/src/keybindings/parser.ts +203 -0
  923. package/src/keybindings/reservedShortcuts.ts +127 -0
  924. package/src/keybindings/resolver.ts +244 -0
  925. package/src/keybindings/schema.ts +236 -0
  926. package/src/keybindings/shortcutFormat.ts +63 -0
  927. package/src/keybindings/template.ts +52 -0
  928. package/src/keybindings/useKeybinding.ts +196 -0
  929. package/src/keybindings/useShortcutDisplay.ts +59 -0
  930. package/src/keybindings/validate.ts +498 -0
  931. package/src/main.tsx +4684 -0
  932. package/src/memdir/findRelevantMemories.ts +141 -0
  933. package/src/memdir/memdir.ts +507 -0
  934. package/src/memdir/memoryAge.ts +53 -0
  935. package/src/memdir/memoryScan.ts +94 -0
  936. package/src/memdir/memoryTypes.ts +271 -0
  937. package/src/memdir/paths.ts +278 -0
  938. package/src/memdir/teamMemPaths.ts +292 -0
  939. package/src/memdir/teamMemPrompts.ts +100 -0
  940. package/src/migrations/migrateAutoUpdatesToSettings.ts +61 -0
  941. package/src/migrations/migrateBypassPermissionsAcceptedToSettings.ts +40 -0
  942. package/src/migrations/migrateEnableAllProjectMcpServersToSettings.ts +118 -0
  943. package/src/migrations/migrateFennecToOpus.ts +45 -0
  944. package/src/migrations/migrateLegacyOpusToCurrent.ts +57 -0
  945. package/src/migrations/migrateOpusToOpus1m.ts +43 -0
  946. package/src/migrations/migrateReplBridgeEnabledToRemoteControlAtStartup.ts +22 -0
  947. package/src/migrations/migrateSonnet1mToSonnet45.ts +48 -0
  948. package/src/migrations/migrateSonnet45ToSonnet46.ts +67 -0
  949. package/src/migrations/resetAutoModeOptInForDefaultOffer.ts +51 -0
  950. package/src/migrations/resetProToOpusDefault.ts +51 -0
  951. package/src/moreright/useMoreRight.tsx +26 -0
  952. package/src/native-ts/color-diff/index.ts +999 -0
  953. package/src/native-ts/file-index/index.ts +370 -0
  954. package/src/native-ts/yoga-layout/enums.ts +134 -0
  955. package/src/native-ts/yoga-layout/index.ts +2578 -0
  956. package/src/outputStyles/loadOutputStylesDir.ts +98 -0
  957. package/src/plugins/builtinPlugins.ts +159 -0
  958. package/src/plugins/bundled/index.ts +23 -0
  959. package/src/projectOnboardingState.ts +83 -0
  960. package/src/query/config.ts +46 -0
  961. package/src/query/deps.ts +40 -0
  962. package/src/query/stopHooks.ts +473 -0
  963. package/src/query/tokenBudget.ts +93 -0
  964. package/src/query.ts +1729 -0
  965. package/src/remote/RemoteSessionManager.ts +343 -0
  966. package/src/remote/SessionsWebSocket.ts +404 -0
  967. package/src/remote/remotePermissionBridge.ts +78 -0
  968. package/src/remote/sdkMessageAdapter.ts +302 -0
  969. package/src/replLauncher.tsx +23 -0
  970. package/src/schemas/hooks.ts +222 -0
  971. package/src/screens/Doctor.tsx +575 -0
  972. package/src/screens/REPL.tsx +5006 -0
  973. package/src/screens/ResumeConversation.tsx +399 -0
  974. package/src/server/createDirectConnectSession.ts +88 -0
  975. package/src/server/directConnectManager.ts +213 -0
  976. package/src/server/types.ts +57 -0
  977. package/src/services/AgentSummary/agentSummary.ts +179 -0
  978. package/src/services/MagicDocs/magicDocs.ts +254 -0
  979. package/src/services/MagicDocs/prompts.ts +127 -0
  980. package/src/services/PromptSuggestion/promptSuggestion.ts +523 -0
  981. package/src/services/PromptSuggestion/speculation.ts +991 -0
  982. package/src/services/SessionMemory/prompts.ts +324 -0
  983. package/src/services/SessionMemory/sessionMemory.ts +495 -0
  984. package/src/services/SessionMemory/sessionMemoryUtils.ts +207 -0
  985. package/src/services/analytics/config.ts +38 -0
  986. package/src/services/analytics/datadog.ts +307 -0
  987. package/src/services/analytics/firstPartyEventLogger.ts +449 -0
  988. package/src/services/analytics/firstPartyEventLoggingExporter.ts +806 -0
  989. package/src/services/analytics/growthbook.ts +1157 -0
  990. package/src/services/analytics/index.ts +173 -0
  991. package/src/services/analytics/metadata.ts +973 -0
  992. package/src/services/analytics/sink.ts +114 -0
  993. package/src/services/analytics/sinkKillswitch.ts +25 -0
  994. package/src/services/api/adminRequests.ts +119 -0
  995. package/src/services/api/bootstrap.ts +142 -0
  996. package/src/services/api/claude.ts +3433 -0
  997. package/src/services/api/client.ts +395 -0
  998. package/src/services/api/dumpPrompts.ts +226 -0
  999. package/src/services/api/emptyUsage.ts +22 -0
  1000. package/src/services/api/errorUtils.ts +260 -0
  1001. package/src/services/api/errors.ts +1207 -0
  1002. package/src/services/api/filesApi.ts +748 -0
  1003. package/src/services/api/firstTokenDate.ts +60 -0
  1004. package/src/services/api/grove.ts +357 -0
  1005. package/src/services/api/logging.ts +788 -0
  1006. package/src/services/api/metricsOptOut.ts +159 -0
  1007. package/src/services/api/overageCreditGrant.ts +137 -0
  1008. package/src/services/api/promptCacheBreakDetection.ts +727 -0
  1009. package/src/services/api/referral.ts +281 -0
  1010. package/src/services/api/sessionIngress.ts +514 -0
  1011. package/src/services/api/ultrareviewQuota.ts +38 -0
  1012. package/src/services/api/usage.ts +63 -0
  1013. package/src/services/api/withRetry.ts +826 -0
  1014. package/src/services/autoDream/autoDream.ts +324 -0
  1015. package/src/services/autoDream/config.ts +21 -0
  1016. package/src/services/autoDream/consolidationLock.ts +140 -0
  1017. package/src/services/autoDream/consolidationPrompt.ts +65 -0
  1018. package/src/services/awaySummary.ts +74 -0
  1019. package/src/services/claudeAiLimits.ts +515 -0
  1020. package/src/services/claudeAiLimitsHook.ts +23 -0
  1021. package/src/services/compact/apiMicrocompact.ts +153 -0
  1022. package/src/services/compact/autoCompact.ts +351 -0
  1023. package/src/services/compact/compact.ts +1705 -0
  1024. package/src/services/compact/compactWarningHook.ts +16 -0
  1025. package/src/services/compact/compactWarningState.ts +18 -0
  1026. package/src/services/compact/grouping.ts +63 -0
  1027. package/src/services/compact/microCompact.ts +530 -0
  1028. package/src/services/compact/postCompactCleanup.ts +77 -0
  1029. package/src/services/compact/prompt.ts +374 -0
  1030. package/src/services/compact/sessionMemoryCompact.ts +630 -0
  1031. package/src/services/compact/timeBasedMCConfig.ts +43 -0
  1032. package/src/services/diagnosticTracking.ts +397 -0
  1033. package/src/services/extractMemories/extractMemories.ts +615 -0
  1034. package/src/services/extractMemories/prompts.ts +154 -0
  1035. package/src/services/internalLogging.ts +90 -0
  1036. package/src/services/lsp/LSPClient.ts +447 -0
  1037. package/src/services/lsp/LSPDiagnosticRegistry.ts +386 -0
  1038. package/src/services/lsp/LSPServerInstance.ts +511 -0
  1039. package/src/services/lsp/LSPServerManager.ts +420 -0
  1040. package/src/services/lsp/config.ts +79 -0
  1041. package/src/services/lsp/manager.ts +289 -0
  1042. package/src/services/lsp/passiveFeedback.ts +328 -0
  1043. package/src/services/mcp/InProcessTransport.ts +63 -0
  1044. package/src/services/mcp/MCPConnectionManager.tsx +73 -0
  1045. package/src/services/mcp/SdkControlTransport.ts +136 -0
  1046. package/src/services/mcp/auth.ts +2465 -0
  1047. package/src/services/mcp/channelAllowlist.ts +76 -0
  1048. package/src/services/mcp/channelNotification.ts +316 -0
  1049. package/src/services/mcp/channelPermissions.ts +240 -0
  1050. package/src/services/mcp/claudeai.ts +164 -0
  1051. package/src/services/mcp/client.ts +3348 -0
  1052. package/src/services/mcp/config.ts +1578 -0
  1053. package/src/services/mcp/elicitationHandler.ts +313 -0
  1054. package/src/services/mcp/envExpansion.ts +38 -0
  1055. package/src/services/mcp/headersHelper.ts +138 -0
  1056. package/src/services/mcp/mcpStringUtils.ts +106 -0
  1057. package/src/services/mcp/normalization.ts +23 -0
  1058. package/src/services/mcp/oauthPort.ts +78 -0
  1059. package/src/services/mcp/officialRegistry.ts +72 -0
  1060. package/src/services/mcp/types.ts +258 -0
  1061. package/src/services/mcp/useManageMCPConnections.ts +1141 -0
  1062. package/src/services/mcp/utils.ts +575 -0
  1063. package/src/services/mcp/vscodeSdkMcp.ts +112 -0
  1064. package/src/services/mcp/xaa.ts +511 -0
  1065. package/src/services/mcp/xaaIdpLogin.ts +487 -0
  1066. package/src/services/mcpServerApproval.tsx +41 -0
  1067. package/src/services/mockRateLimits.ts +882 -0
  1068. package/src/services/notifier.ts +156 -0
  1069. package/src/services/oauth/auth-code-listener.ts +211 -0
  1070. package/src/services/oauth/client.ts +566 -0
  1071. package/src/services/oauth/crypto.ts +23 -0
  1072. package/src/services/oauth/getOauthProfile.ts +53 -0
  1073. package/src/services/oauth/index.ts +198 -0
  1074. package/src/services/plugins/PluginInstallationManager.ts +184 -0
  1075. package/src/services/plugins/pluginCliCommands.ts +344 -0
  1076. package/src/services/plugins/pluginOperations.ts +1088 -0
  1077. package/src/services/policyLimits/index.ts +664 -0
  1078. package/src/services/policyLimits/types.ts +27 -0
  1079. package/src/services/preventSleep.ts +165 -0
  1080. package/src/services/rateLimitMessages.ts +344 -0
  1081. package/src/services/rateLimitMocking.ts +144 -0
  1082. package/src/services/remoteManagedSettings/index.ts +639 -0
  1083. package/src/services/remoteManagedSettings/securityCheck.tsx +74 -0
  1084. package/src/services/remoteManagedSettings/syncCache.ts +112 -0
  1085. package/src/services/remoteManagedSettings/syncCacheState.ts +96 -0
  1086. package/src/services/remoteManagedSettings/types.ts +31 -0
  1087. package/src/services/settingsSync/index.ts +581 -0
  1088. package/src/services/settingsSync/types.ts +67 -0
  1089. package/src/services/teamMemorySync/index.ts +1256 -0
  1090. package/src/services/teamMemorySync/secretScanner.ts +324 -0
  1091. package/src/services/teamMemorySync/teamMemSecretGuard.ts +44 -0
  1092. package/src/services/teamMemorySync/types.ts +156 -0
  1093. package/src/services/teamMemorySync/watcher.ts +387 -0
  1094. package/src/services/tips/tipHistory.ts +17 -0
  1095. package/src/services/tips/tipRegistry.ts +686 -0
  1096. package/src/services/tips/tipScheduler.ts +58 -0
  1097. package/src/services/tokenEstimation.ts +495 -0
  1098. package/src/services/toolUseSummary/toolUseSummaryGenerator.ts +112 -0
  1099. package/src/services/tools/StreamingToolExecutor.ts +530 -0
  1100. package/src/services/tools/toolExecution.ts +1745 -0
  1101. package/src/services/tools/toolHooks.ts +650 -0
  1102. package/src/services/tools/toolOrchestration.ts +188 -0
  1103. package/src/services/vcr.ts +406 -0
  1104. package/src/services/voice.ts +525 -0
  1105. package/src/services/voiceKeyterms.ts +106 -0
  1106. package/src/services/voiceStreamSTT.ts +544 -0
  1107. package/src/setup.ts +477 -0
  1108. package/src/skills/bundled/batch.ts +124 -0
  1109. package/src/skills/bundled/claudeApi.ts +196 -0
  1110. package/src/skills/bundled/claudeApiContent.ts +75 -0
  1111. package/src/skills/bundled/claudeInChrome.ts +34 -0
  1112. package/src/skills/bundled/debug.ts +103 -0
  1113. package/src/skills/bundled/index.ts +79 -0
  1114. package/src/skills/bundled/keybindings.ts +339 -0
  1115. package/src/skills/bundled/loop.ts +92 -0
  1116. package/src/skills/bundled/loremIpsum.ts +282 -0
  1117. package/src/skills/bundled/remember.ts +82 -0
  1118. package/src/skills/bundled/scheduleRemoteAgents.ts +447 -0
  1119. package/src/skills/bundled/simplify.ts +69 -0
  1120. package/src/skills/bundled/skillify.ts +197 -0
  1121. package/src/skills/bundled/stuck.ts +79 -0
  1122. package/src/skills/bundled/updateConfig.ts +475 -0
  1123. package/src/skills/bundled/verify.ts +30 -0
  1124. package/src/skills/bundled/verifyContent.ts +13 -0
  1125. package/src/skills/bundledSkills.ts +220 -0
  1126. package/src/skills/loadSkillsDir.ts +1086 -0
  1127. package/src/skills/mcpSkillBuilders.ts +44 -0
  1128. package/src/state/AppState.tsx +200 -0
  1129. package/src/state/AppStateStore.ts +569 -0
  1130. package/src/state/onChangeAppState.ts +171 -0
  1131. package/src/state/selectors.ts +76 -0
  1132. package/src/state/store.ts +34 -0
  1133. package/src/state/teammateViewHelpers.ts +141 -0
  1134. package/src/tasks/DreamTask/DreamTask.ts +157 -0
  1135. package/src/tasks/InProcessTeammateTask/InProcessTeammateTask.tsx +126 -0
  1136. package/src/tasks/InProcessTeammateTask/types.ts +121 -0
  1137. package/src/tasks/LocalAgentTask/LocalAgentTask.tsx +683 -0
  1138. package/src/tasks/LocalMainSessionTask.ts +479 -0
  1139. package/src/tasks/LocalShellTask/LocalShellTask.tsx +523 -0
  1140. package/src/tasks/LocalShellTask/guards.ts +41 -0
  1141. package/src/tasks/LocalShellTask/killShellTasks.ts +76 -0
  1142. package/src/tasks/RemoteAgentTask/RemoteAgentTask.tsx +856 -0
  1143. package/src/tasks/pillLabel.ts +82 -0
  1144. package/src/tasks/stopTask.ts +100 -0
  1145. package/src/tasks/types.ts +46 -0
  1146. package/src/tasks.ts +39 -0
  1147. package/src/tools/AgentTool/AgentTool.tsx +1398 -0
  1148. package/src/tools/AgentTool/UI.tsx +872 -0
  1149. package/src/tools/AgentTool/agentColorManager.ts +66 -0
  1150. package/src/tools/AgentTool/agentDisplay.ts +104 -0
  1151. package/src/tools/AgentTool/agentMemory.ts +177 -0
  1152. package/src/tools/AgentTool/agentMemorySnapshot.ts +197 -0
  1153. package/src/tools/AgentTool/agentToolUtils.ts +686 -0
  1154. package/src/tools/AgentTool/built-in/claudeCodeGuideAgent.ts +205 -0
  1155. package/src/tools/AgentTool/built-in/exploreAgent.ts +83 -0
  1156. package/src/tools/AgentTool/built-in/generalPurposeAgent.ts +34 -0
  1157. package/src/tools/AgentTool/built-in/planAgent.ts +92 -0
  1158. package/src/tools/AgentTool/built-in/statuslineSetup.ts +144 -0
  1159. package/src/tools/AgentTool/built-in/verificationAgent.ts +152 -0
  1160. package/src/tools/AgentTool/builtInAgents.ts +72 -0
  1161. package/src/tools/AgentTool/constants.ts +12 -0
  1162. package/src/tools/AgentTool/forkSubagent.ts +210 -0
  1163. package/src/tools/AgentTool/loadAgentsDir.ts +755 -0
  1164. package/src/tools/AgentTool/prompt.ts +287 -0
  1165. package/src/tools/AgentTool/resumeAgent.ts +265 -0
  1166. package/src/tools/AgentTool/runAgent.ts +973 -0
  1167. package/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +266 -0
  1168. package/src/tools/AskUserQuestionTool/prompt.ts +44 -0
  1169. package/src/tools/BashTool/BashTool.tsx +1144 -0
  1170. package/src/tools/BashTool/BashToolResultMessage.tsx +191 -0
  1171. package/src/tools/BashTool/UI.tsx +185 -0
  1172. package/src/tools/BashTool/bashCommandHelpers.ts +265 -0
  1173. package/src/tools/BashTool/bashPermissions.ts +2621 -0
  1174. package/src/tools/BashTool/bashSecurity.ts +2592 -0
  1175. package/src/tools/BashTool/commandSemantics.ts +140 -0
  1176. package/src/tools/BashTool/commentLabel.ts +13 -0
  1177. package/src/tools/BashTool/destructiveCommandWarning.ts +102 -0
  1178. package/src/tools/BashTool/modeValidation.ts +115 -0
  1179. package/src/tools/BashTool/pathValidation.ts +1303 -0
  1180. package/src/tools/BashTool/prompt.ts +369 -0
  1181. package/src/tools/BashTool/readOnlyValidation.ts +1990 -0
  1182. package/src/tools/BashTool/sedEditParser.ts +322 -0
  1183. package/src/tools/BashTool/sedValidation.ts +684 -0
  1184. package/src/tools/BashTool/shouldUseSandbox.ts +153 -0
  1185. package/src/tools/BashTool/toolName.ts +2 -0
  1186. package/src/tools/BashTool/utils.ts +223 -0
  1187. package/src/tools/BriefTool/BriefTool.ts +204 -0
  1188. package/src/tools/BriefTool/UI.tsx +101 -0
  1189. package/src/tools/BriefTool/attachments.ts +110 -0
  1190. package/src/tools/BriefTool/prompt.ts +22 -0
  1191. package/src/tools/BriefTool/upload.ts +174 -0
  1192. package/src/tools/ConfigTool/ConfigTool.ts +467 -0
  1193. package/src/tools/ConfigTool/UI.tsx +38 -0
  1194. package/src/tools/ConfigTool/constants.ts +1 -0
  1195. package/src/tools/ConfigTool/prompt.ts +93 -0
  1196. package/src/tools/ConfigTool/supportedSettings.ts +211 -0
  1197. package/src/tools/EnterPlanModeTool/EnterPlanModeTool.ts +126 -0
  1198. package/src/tools/EnterPlanModeTool/UI.tsx +33 -0
  1199. package/src/tools/EnterPlanModeTool/constants.ts +1 -0
  1200. package/src/tools/EnterPlanModeTool/prompt.ts +170 -0
  1201. package/src/tools/EnterWorktreeTool/EnterWorktreeTool.ts +127 -0
  1202. package/src/tools/EnterWorktreeTool/UI.tsx +20 -0
  1203. package/src/tools/EnterWorktreeTool/constants.ts +1 -0
  1204. package/src/tools/EnterWorktreeTool/prompt.ts +30 -0
  1205. package/src/tools/ExitPlanModeTool/ExitPlanModeV2Tool.ts +493 -0
  1206. package/src/tools/ExitPlanModeTool/UI.tsx +82 -0
  1207. package/src/tools/ExitPlanModeTool/constants.ts +2 -0
  1208. package/src/tools/ExitPlanModeTool/prompt.ts +29 -0
  1209. package/src/tools/ExitWorktreeTool/ExitWorktreeTool.ts +329 -0
  1210. package/src/tools/ExitWorktreeTool/UI.tsx +25 -0
  1211. package/src/tools/ExitWorktreeTool/constants.ts +1 -0
  1212. package/src/tools/ExitWorktreeTool/prompt.ts +32 -0
  1213. package/src/tools/FileEditTool/FileEditTool.ts +625 -0
  1214. package/src/tools/FileEditTool/UI.tsx +289 -0
  1215. package/src/tools/FileEditTool/constants.ts +11 -0
  1216. package/src/tools/FileEditTool/prompt.ts +28 -0
  1217. package/src/tools/FileEditTool/types.ts +85 -0
  1218. package/src/tools/FileEditTool/utils.ts +775 -0
  1219. package/src/tools/FileReadTool/FileReadTool.ts +1183 -0
  1220. package/src/tools/FileReadTool/UI.tsx +185 -0
  1221. package/src/tools/FileReadTool/imageProcessor.ts +94 -0
  1222. package/src/tools/FileReadTool/limits.ts +92 -0
  1223. package/src/tools/FileReadTool/prompt.ts +49 -0
  1224. package/src/tools/FileWriteTool/FileWriteTool.ts +434 -0
  1225. package/src/tools/FileWriteTool/UI.tsx +405 -0
  1226. package/src/tools/FileWriteTool/prompt.ts +18 -0
  1227. package/src/tools/GlobTool/GlobTool.ts +198 -0
  1228. package/src/tools/GlobTool/UI.tsx +63 -0
  1229. package/src/tools/GlobTool/prompt.ts +7 -0
  1230. package/src/tools/GrepTool/GrepTool.ts +577 -0
  1231. package/src/tools/GrepTool/UI.tsx +201 -0
  1232. package/src/tools/GrepTool/prompt.ts +18 -0
  1233. package/src/tools/LSPTool/LSPTool.ts +860 -0
  1234. package/src/tools/LSPTool/UI.tsx +228 -0
  1235. package/src/tools/LSPTool/formatters.ts +592 -0
  1236. package/src/tools/LSPTool/prompt.ts +21 -0
  1237. package/src/tools/LSPTool/schemas.ts +215 -0
  1238. package/src/tools/LSPTool/symbolContext.ts +90 -0
  1239. package/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +123 -0
  1240. package/src/tools/ListMcpResourcesTool/UI.tsx +29 -0
  1241. package/src/tools/ListMcpResourcesTool/prompt.ts +20 -0
  1242. package/src/tools/MCPTool/MCPTool.ts +77 -0
  1243. package/src/tools/MCPTool/UI.tsx +403 -0
  1244. package/src/tools/MCPTool/classifyForCollapse.ts +604 -0
  1245. package/src/tools/MCPTool/prompt.ts +3 -0
  1246. package/src/tools/McpAuthTool/McpAuthTool.ts +215 -0
  1247. package/src/tools/NotebookEditTool/NotebookEditTool.ts +490 -0
  1248. package/src/tools/NotebookEditTool/UI.tsx +93 -0
  1249. package/src/tools/NotebookEditTool/constants.ts +2 -0
  1250. package/src/tools/NotebookEditTool/prompt.ts +3 -0
  1251. package/src/tools/PowerShellTool/PowerShellTool.tsx +1001 -0
  1252. package/src/tools/PowerShellTool/UI.tsx +131 -0
  1253. package/src/tools/PowerShellTool/clmTypes.ts +211 -0
  1254. package/src/tools/PowerShellTool/commandSemantics.ts +142 -0
  1255. package/src/tools/PowerShellTool/commonParameters.ts +30 -0
  1256. package/src/tools/PowerShellTool/destructiveCommandWarning.ts +109 -0
  1257. package/src/tools/PowerShellTool/gitSafety.ts +176 -0
  1258. package/src/tools/PowerShellTool/modeValidation.ts +404 -0
  1259. package/src/tools/PowerShellTool/pathValidation.ts +2049 -0
  1260. package/src/tools/PowerShellTool/powershellPermissions.ts +1648 -0
  1261. package/src/tools/PowerShellTool/powershellSecurity.ts +1090 -0
  1262. package/src/tools/PowerShellTool/prompt.ts +145 -0
  1263. package/src/tools/PowerShellTool/readOnlyValidation.ts +1823 -0
  1264. package/src/tools/PowerShellTool/toolName.ts +2 -0
  1265. package/src/tools/REPLTool/constants.ts +46 -0
  1266. package/src/tools/REPLTool/primitiveTools.ts +39 -0
  1267. package/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +158 -0
  1268. package/src/tools/ReadMcpResourceTool/UI.tsx +37 -0
  1269. package/src/tools/ReadMcpResourceTool/prompt.ts +16 -0
  1270. package/src/tools/RemoteTriggerTool/RemoteTriggerTool.ts +161 -0
  1271. package/src/tools/RemoteTriggerTool/UI.tsx +17 -0
  1272. package/src/tools/RemoteTriggerTool/prompt.ts +15 -0
  1273. package/src/tools/ScheduleCronTool/CronCreateTool.ts +157 -0
  1274. package/src/tools/ScheduleCronTool/CronDeleteTool.ts +95 -0
  1275. package/src/tools/ScheduleCronTool/CronListTool.ts +97 -0
  1276. package/src/tools/ScheduleCronTool/UI.tsx +60 -0
  1277. package/src/tools/ScheduleCronTool/prompt.ts +135 -0
  1278. package/src/tools/SendMessageTool/SendMessageTool.ts +917 -0
  1279. package/src/tools/SendMessageTool/UI.tsx +31 -0
  1280. package/src/tools/SendMessageTool/constants.ts +1 -0
  1281. package/src/tools/SendMessageTool/prompt.ts +49 -0
  1282. package/src/tools/SkillTool/SkillTool.ts +1108 -0
  1283. package/src/tools/SkillTool/UI.tsx +128 -0
  1284. package/src/tools/SkillTool/constants.ts +1 -0
  1285. package/src/tools/SkillTool/prompt.ts +241 -0
  1286. package/src/tools/SleepTool/prompt.ts +17 -0
  1287. package/src/tools/SyntheticOutputTool/SyntheticOutputTool.ts +163 -0
  1288. package/src/tools/TaskCreateTool/TaskCreateTool.ts +138 -0
  1289. package/src/tools/TaskCreateTool/constants.ts +1 -0
  1290. package/src/tools/TaskCreateTool/prompt.ts +56 -0
  1291. package/src/tools/TaskGetTool/TaskGetTool.ts +128 -0
  1292. package/src/tools/TaskGetTool/constants.ts +1 -0
  1293. package/src/tools/TaskGetTool/prompt.ts +24 -0
  1294. package/src/tools/TaskListTool/TaskListTool.ts +116 -0
  1295. package/src/tools/TaskListTool/constants.ts +1 -0
  1296. package/src/tools/TaskListTool/prompt.ts +49 -0
  1297. package/src/tools/TaskOutputTool/TaskOutputTool.tsx +584 -0
  1298. package/src/tools/TaskOutputTool/constants.ts +1 -0
  1299. package/src/tools/TaskStopTool/TaskStopTool.ts +131 -0
  1300. package/src/tools/TaskStopTool/UI.tsx +41 -0
  1301. package/src/tools/TaskStopTool/prompt.ts +8 -0
  1302. package/src/tools/TaskUpdateTool/TaskUpdateTool.ts +406 -0
  1303. package/src/tools/TaskUpdateTool/constants.ts +1 -0
  1304. package/src/tools/TaskUpdateTool/prompt.ts +77 -0
  1305. package/src/tools/TeamCreateTool/TeamCreateTool.ts +240 -0
  1306. package/src/tools/TeamCreateTool/UI.tsx +6 -0
  1307. package/src/tools/TeamCreateTool/constants.ts +1 -0
  1308. package/src/tools/TeamCreateTool/prompt.ts +113 -0
  1309. package/src/tools/TeamDeleteTool/TeamDeleteTool.ts +139 -0
  1310. package/src/tools/TeamDeleteTool/UI.tsx +20 -0
  1311. package/src/tools/TeamDeleteTool/constants.ts +1 -0
  1312. package/src/tools/TeamDeleteTool/prompt.ts +16 -0
  1313. package/src/tools/TodoWriteTool/TodoWriteTool.ts +115 -0
  1314. package/src/tools/TodoWriteTool/constants.ts +1 -0
  1315. package/src/tools/TodoWriteTool/prompt.ts +184 -0
  1316. package/src/tools/ToolSearchTool/ToolSearchTool.ts +471 -0
  1317. package/src/tools/ToolSearchTool/constants.ts +1 -0
  1318. package/src/tools/ToolSearchTool/prompt.ts +121 -0
  1319. package/src/tools/TungstenTool/TungstenTool.js +2 -0
  1320. package/src/tools/TungstenTool/TungstenTool.ts +1 -0
  1321. package/src/tools/WebFetchTool/UI.tsx +72 -0
  1322. package/src/tools/WebFetchTool/WebFetchTool.ts +318 -0
  1323. package/src/tools/WebFetchTool/preapproved.ts +166 -0
  1324. package/src/tools/WebFetchTool/prompt.ts +46 -0
  1325. package/src/tools/WebFetchTool/utils.ts +530 -0
  1326. package/src/tools/WebSearchTool/UI.tsx +101 -0
  1327. package/src/tools/WebSearchTool/WebSearchTool.ts +435 -0
  1328. package/src/tools/WebSearchTool/prompt.ts +34 -0
  1329. package/src/tools/shared/gitOperationTracking.ts +277 -0
  1330. package/src/tools/shared/spawnMultiAgent.ts +1093 -0
  1331. package/src/tools/testing/TestingPermissionTool.tsx +74 -0
  1332. package/src/tools/utils.ts +40 -0
  1333. package/src/tools.ts +389 -0
  1334. package/src/types/command.ts +216 -0
  1335. package/src/types/connectorText.js +5 -0
  1336. package/src/types/connectorText.ts +1 -0
  1337. package/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +865 -0
  1338. package/src/types/generated/events_mono/common/v1/auth.ts +100 -0
  1339. package/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +223 -0
  1340. package/src/types/generated/google/protobuf/timestamp.ts +187 -0
  1341. package/src/types/hooks.ts +290 -0
  1342. package/src/types/ids.ts +44 -0
  1343. package/src/types/logs.ts +330 -0
  1344. package/src/types/permissions.ts +441 -0
  1345. package/src/types/plugin.ts +363 -0
  1346. package/src/types/textInputTypes.ts +387 -0
  1347. package/src/upstreamproxy/relay.ts +455 -0
  1348. package/src/upstreamproxy/upstreamproxy.ts +285 -0
  1349. package/src/utils/CircularBuffer.ts +84 -0
  1350. package/src/utils/Cursor.ts +1530 -0
  1351. package/src/utils/QueryGuard.ts +121 -0
  1352. package/src/utils/Shell.ts +474 -0
  1353. package/src/utils/ShellCommand.ts +465 -0
  1354. package/src/utils/abortController.ts +99 -0
  1355. package/src/utils/activityManager.ts +164 -0
  1356. package/src/utils/advisor.ts +145 -0
  1357. package/src/utils/agentContext.ts +178 -0
  1358. package/src/utils/agentId.ts +99 -0
  1359. package/src/utils/agentSwarmsEnabled.ts +44 -0
  1360. package/src/utils/agenticSessionSearch.ts +307 -0
  1361. package/src/utils/analyzeContext.ts +1382 -0
  1362. package/src/utils/ansiToPng.ts +334 -0
  1363. package/src/utils/ansiToSvg.ts +272 -0
  1364. package/src/utils/api.ts +718 -0
  1365. package/src/utils/apiPreconnect.ts +72 -0
  1366. package/src/utils/appleTerminalBackup.ts +124 -0
  1367. package/src/utils/argumentSubstitution.ts +145 -0
  1368. package/src/utils/array.ts +13 -0
  1369. package/src/utils/asciicast.ts +239 -0
  1370. package/src/utils/attachments.ts +3997 -0
  1371. package/src/utils/attribution.ts +393 -0
  1372. package/src/utils/auth.ts +2007 -0
  1373. package/src/utils/authFileDescriptor.ts +196 -0
  1374. package/src/utils/authPortable.ts +19 -0
  1375. package/src/utils/autoModeDenials.ts +26 -0
  1376. package/src/utils/autoRunIssue.tsx +122 -0
  1377. package/src/utils/autoUpdater.ts +562 -0
  1378. package/src/utils/aws.ts +74 -0
  1379. package/src/utils/awsAuthStatusManager.ts +81 -0
  1380. package/src/utils/background/remote/preconditions.ts +235 -0
  1381. package/src/utils/background/remote/remoteSession.ts +98 -0
  1382. package/src/utils/backgroundHousekeeping.ts +94 -0
  1383. package/src/utils/bash/ParsedCommand.ts +318 -0
  1384. package/src/utils/bash/ShellSnapshot.ts +582 -0
  1385. package/src/utils/bash/ast.ts +2679 -0
  1386. package/src/utils/bash/bashParser.ts +4436 -0
  1387. package/src/utils/bash/bashPipeCommand.ts +294 -0
  1388. package/src/utils/bash/commands.ts +1339 -0
  1389. package/src/utils/bash/heredoc.ts +733 -0
  1390. package/src/utils/bash/parser.ts +230 -0
  1391. package/src/utils/bash/prefix.ts +204 -0
  1392. package/src/utils/bash/registry.ts +53 -0
  1393. package/src/utils/bash/shellCompletion.ts +259 -0
  1394. package/src/utils/bash/shellPrefix.ts +28 -0
  1395. package/src/utils/bash/shellQuote.ts +304 -0
  1396. package/src/utils/bash/shellQuoting.ts +128 -0
  1397. package/src/utils/bash/specs/alias.ts +14 -0
  1398. package/src/utils/bash/specs/index.ts +18 -0
  1399. package/src/utils/bash/specs/nohup.ts +13 -0
  1400. package/src/utils/bash/specs/pyright.ts +91 -0
  1401. package/src/utils/bash/specs/sleep.ts +13 -0
  1402. package/src/utils/bash/specs/srun.ts +31 -0
  1403. package/src/utils/bash/specs/time.ts +13 -0
  1404. package/src/utils/bash/specs/timeout.ts +20 -0
  1405. package/src/utils/bash/treeSitterAnalysis.ts +506 -0
  1406. package/src/utils/betas.ts +438 -0
  1407. package/src/utils/billing.ts +78 -0
  1408. package/src/utils/binaryCheck.ts +53 -0
  1409. package/src/utils/browser.ts +68 -0
  1410. package/src/utils/bufferedWriter.ts +100 -0
  1411. package/src/utils/bundledMode.ts +22 -0
  1412. package/src/utils/caCerts.ts +115 -0
  1413. package/src/utils/caCertsConfig.ts +88 -0
  1414. package/src/utils/cachePaths.ts +38 -0
  1415. package/src/utils/classifierApprovals.ts +88 -0
  1416. package/src/utils/classifierApprovalsHook.ts +17 -0
  1417. package/src/utils/claudeCodeHints.ts +193 -0
  1418. package/src/utils/claudeDesktop.ts +152 -0
  1419. package/src/utils/claudeInChrome/chromeNativeHost.ts +527 -0
  1420. package/src/utils/claudeInChrome/common.ts +540 -0
  1421. package/src/utils/claudeInChrome/mcpServer.ts +293 -0
  1422. package/src/utils/claudeInChrome/prompt.ts +83 -0
  1423. package/src/utils/claudeInChrome/setup.ts +400 -0
  1424. package/src/utils/claudeInChrome/setupPortable.ts +233 -0
  1425. package/src/utils/claudeInChrome/toolRendering.tsx +262 -0
  1426. package/src/utils/claudemd.ts +1479 -0
  1427. package/src/utils/cleanup.ts +602 -0
  1428. package/src/utils/cleanupRegistry.ts +25 -0
  1429. package/src/utils/cliArgs.ts +60 -0
  1430. package/src/utils/cliHighlight.ts +54 -0
  1431. package/src/utils/codeIndexing.ts +206 -0
  1432. package/src/utils/collapseBackgroundBashNotifications.ts +84 -0
  1433. package/src/utils/collapseHookSummaries.ts +59 -0
  1434. package/src/utils/collapseReadSearch.ts +1109 -0
  1435. package/src/utils/collapseTeammateShutdowns.ts +55 -0
  1436. package/src/utils/combinedAbortSignal.ts +47 -0
  1437. package/src/utils/commandLifecycle.ts +21 -0
  1438. package/src/utils/commitAttribution.ts +961 -0
  1439. package/src/utils/completionCache.ts +166 -0
  1440. package/src/utils/computerUse/appNames.ts +196 -0
  1441. package/src/utils/computerUse/cleanup.ts +86 -0
  1442. package/src/utils/computerUse/common.ts +61 -0
  1443. package/src/utils/computerUse/computerUseLock.ts +215 -0
  1444. package/src/utils/computerUse/drainRunLoop.ts +79 -0
  1445. package/src/utils/computerUse/escHotkey.ts +54 -0
  1446. package/src/utils/computerUse/executor.ts +658 -0
  1447. package/src/utils/computerUse/gates.ts +72 -0
  1448. package/src/utils/computerUse/hostAdapter.ts +69 -0
  1449. package/src/utils/computerUse/inputLoader.ts +30 -0
  1450. package/src/utils/computerUse/mcpServer.ts +106 -0
  1451. package/src/utils/computerUse/setup.ts +53 -0
  1452. package/src/utils/computerUse/swiftLoader.ts +23 -0
  1453. package/src/utils/computerUse/toolRendering.tsx +125 -0
  1454. package/src/utils/computerUse/wrapper.tsx +336 -0
  1455. package/src/utils/concurrentSessions.ts +204 -0
  1456. package/src/utils/config.ts +1817 -0
  1457. package/src/utils/configConstants.ts +21 -0
  1458. package/src/utils/contentArray.ts +51 -0
  1459. package/src/utils/context.ts +221 -0
  1460. package/src/utils/contextAnalysis.ts +272 -0
  1461. package/src/utils/contextSuggestions.ts +235 -0
  1462. package/src/utils/controlMessageCompat.ts +32 -0
  1463. package/src/utils/conversationRecovery.ts +597 -0
  1464. package/src/utils/cron.ts +308 -0
  1465. package/src/utils/cronJitterConfig.ts +75 -0
  1466. package/src/utils/cronScheduler.ts +565 -0
  1467. package/src/utils/cronTasks.ts +458 -0
  1468. package/src/utils/cronTasksLock.ts +195 -0
  1469. package/src/utils/crossProjectResume.ts +75 -0
  1470. package/src/utils/crypto.ts +13 -0
  1471. package/src/utils/cwd.ts +32 -0
  1472. package/src/utils/debug.ts +268 -0
  1473. package/src/utils/debugFilter.ts +157 -0
  1474. package/src/utils/deepLink/banner.ts +123 -0
  1475. package/src/utils/deepLink/parseDeepLink.ts +170 -0
  1476. package/src/utils/deepLink/protocolHandler.ts +136 -0
  1477. package/src/utils/deepLink/registerProtocol.ts +348 -0
  1478. package/src/utils/deepLink/terminalLauncher.ts +557 -0
  1479. package/src/utils/deepLink/terminalPreference.ts +54 -0
  1480. package/src/utils/desktopDeepLink.ts +236 -0
  1481. package/src/utils/detectRepository.ts +178 -0
  1482. package/src/utils/diagLogs.ts +94 -0
  1483. package/src/utils/diff.ts +177 -0
  1484. package/src/utils/directMemberMessage.ts +69 -0
  1485. package/src/utils/displayTags.ts +51 -0
  1486. package/src/utils/doctorContextWarnings.ts +265 -0
  1487. package/src/utils/doctorDiagnostic.ts +625 -0
  1488. package/src/utils/dxt/helpers.ts +88 -0
  1489. package/src/utils/dxt/zip.ts +226 -0
  1490. package/src/utils/earlyInput.ts +191 -0
  1491. package/src/utils/editor.ts +183 -0
  1492. package/src/utils/effort.ts +329 -0
  1493. package/src/utils/embeddedTools.ts +29 -0
  1494. package/src/utils/env.ts +347 -0
  1495. package/src/utils/envDynamic.ts +151 -0
  1496. package/src/utils/envUtils.ts +183 -0
  1497. package/src/utils/envValidation.ts +38 -0
  1498. package/src/utils/errorLogSink.ts +235 -0
  1499. package/src/utils/errors.ts +238 -0
  1500. package/src/utils/exampleCommands.ts +184 -0
  1501. package/src/utils/execFileNoThrow.ts +150 -0
  1502. package/src/utils/execFileNoThrowPortable.ts +89 -0
  1503. package/src/utils/execSyncWrapper.ts +38 -0
  1504. package/src/utils/exportRenderer.tsx +98 -0
  1505. package/src/utils/extraUsage.ts +23 -0
  1506. package/src/utils/fastMode.ts +532 -0
  1507. package/src/utils/file.ts +584 -0
  1508. package/src/utils/fileHistory.ts +1115 -0
  1509. package/src/utils/fileOperationAnalytics.ts +71 -0
  1510. package/src/utils/filePersistence/filePersistence.ts +287 -0
  1511. package/src/utils/filePersistence/outputsScanner.ts +126 -0
  1512. package/src/utils/fileRead.ts +102 -0
  1513. package/src/utils/fileReadCache.ts +96 -0
  1514. package/src/utils/fileStateCache.ts +142 -0
  1515. package/src/utils/findExecutable.ts +17 -0
  1516. package/src/utils/fingerprint.ts +76 -0
  1517. package/src/utils/forkedAgent.ts +689 -0
  1518. package/src/utils/format.ts +308 -0
  1519. package/src/utils/formatBriefTimestamp.ts +81 -0
  1520. package/src/utils/fpsTracker.ts +47 -0
  1521. package/src/utils/frontmatterParser.ts +370 -0
  1522. package/src/utils/fsOperations.ts +770 -0
  1523. package/src/utils/fullscreen.ts +202 -0
  1524. package/src/utils/generatedFiles.ts +136 -0
  1525. package/src/utils/generators.ts +88 -0
  1526. package/src/utils/genericProcessUtils.ts +184 -0
  1527. package/src/utils/getWorktreePaths.ts +70 -0
  1528. package/src/utils/getWorktreePathsPortable.ts +27 -0
  1529. package/src/utils/ghPrStatus.ts +106 -0
  1530. package/src/utils/git/gitConfigParser.ts +277 -0
  1531. package/src/utils/git/gitFilesystem.ts +699 -0
  1532. package/src/utils/git/gitignore.ts +99 -0
  1533. package/src/utils/git.ts +926 -0
  1534. package/src/utils/gitDiff.ts +532 -0
  1535. package/src/utils/gitSettings.ts +18 -0
  1536. package/src/utils/github/ghAuthStatus.ts +29 -0
  1537. package/src/utils/githubRepoPathMapping.ts +162 -0
  1538. package/src/utils/glob.ts +130 -0
  1539. package/src/utils/gracefulShutdown.ts +529 -0
  1540. package/src/utils/groupToolUses.ts +182 -0
  1541. package/src/utils/handlePromptSubmit.ts +610 -0
  1542. package/src/utils/hash.ts +46 -0
  1543. package/src/utils/headlessProfiler.ts +178 -0
  1544. package/src/utils/heapDumpService.ts +303 -0
  1545. package/src/utils/heatmap.ts +198 -0
  1546. package/src/utils/highlightMatch.tsx +28 -0
  1547. package/src/utils/hooks/AsyncHookRegistry.ts +309 -0
  1548. package/src/utils/hooks/apiQueryHookHelper.ts +141 -0
  1549. package/src/utils/hooks/execAgentHook.ts +339 -0
  1550. package/src/utils/hooks/execHttpHook.ts +242 -0
  1551. package/src/utils/hooks/execPromptHook.ts +211 -0
  1552. package/src/utils/hooks/fileChangedWatcher.ts +191 -0
  1553. package/src/utils/hooks/hookEvents.ts +192 -0
  1554. package/src/utils/hooks/hookHelpers.ts +83 -0
  1555. package/src/utils/hooks/hooksConfigManager.ts +400 -0
  1556. package/src/utils/hooks/hooksConfigSnapshot.ts +133 -0
  1557. package/src/utils/hooks/hooksSettings.ts +271 -0
  1558. package/src/utils/hooks/postSamplingHooks.ts +70 -0
  1559. package/src/utils/hooks/registerFrontmatterHooks.ts +67 -0
  1560. package/src/utils/hooks/registerSkillHooks.ts +64 -0
  1561. package/src/utils/hooks/sessionHooks.ts +447 -0
  1562. package/src/utils/hooks/skillImprovement.ts +267 -0
  1563. package/src/utils/hooks/ssrfGuard.ts +294 -0
  1564. package/src/utils/hooks.ts +5022 -0
  1565. package/src/utils/horizontalScroll.ts +137 -0
  1566. package/src/utils/http.ts +136 -0
  1567. package/src/utils/hyperlink.ts +39 -0
  1568. package/src/utils/iTermBackup.ts +73 -0
  1569. package/src/utils/ide.ts +1494 -0
  1570. package/src/utils/idePathConversion.ts +90 -0
  1571. package/src/utils/idleTimeout.ts +53 -0
  1572. package/src/utils/imagePaste.ts +416 -0
  1573. package/src/utils/imageResizer.ts +880 -0
  1574. package/src/utils/imageStore.ts +167 -0
  1575. package/src/utils/imageValidation.ts +104 -0
  1576. package/src/utils/immediateCommand.ts +15 -0
  1577. package/src/utils/inProcessTeammateHelpers.ts +102 -0
  1578. package/src/utils/ink.ts +26 -0
  1579. package/src/utils/intl.ts +94 -0
  1580. package/src/utils/jetbrains.ts +191 -0
  1581. package/src/utils/json.ts +277 -0
  1582. package/src/utils/jsonRead.ts +16 -0
  1583. package/src/utils/keyboardShortcuts.ts +14 -0
  1584. package/src/utils/lazySchema.ts +8 -0
  1585. package/src/utils/listSessionsImpl.ts +454 -0
  1586. package/src/utils/localInstaller.ts +162 -0
  1587. package/src/utils/lockfile.ts +43 -0
  1588. package/src/utils/log.ts +362 -0
  1589. package/src/utils/logoV2Utils.ts +350 -0
  1590. package/src/utils/mailbox.ts +73 -0
  1591. package/src/utils/managedEnv.ts +199 -0
  1592. package/src/utils/managedEnvConstants.ts +191 -0
  1593. package/src/utils/markdown.ts +381 -0
  1594. package/src/utils/markdownConfigLoader.ts +600 -0
  1595. package/src/utils/mcp/dateTimeParser.ts +121 -0
  1596. package/src/utils/mcp/elicitationValidation.ts +336 -0
  1597. package/src/utils/mcpInstructionsDelta.ts +130 -0
  1598. package/src/utils/mcpOutputStorage.ts +189 -0
  1599. package/src/utils/mcpValidation.ts +208 -0
  1600. package/src/utils/mcpWebSocketTransport.ts +200 -0
  1601. package/src/utils/memoize.ts +269 -0
  1602. package/src/utils/memory/types.ts +12 -0
  1603. package/src/utils/memory/versions.ts +8 -0
  1604. package/src/utils/memoryFileDetection.ts +289 -0
  1605. package/src/utils/messagePredicates.ts +8 -0
  1606. package/src/utils/messageQueueManager.ts +547 -0
  1607. package/src/utils/messages/mappers.ts +290 -0
  1608. package/src/utils/messages/systemInit.ts +96 -0
  1609. package/src/utils/messages.ts +5512 -0
  1610. package/src/utils/model/agent.ts +157 -0
  1611. package/src/utils/model/aliases.ts +25 -0
  1612. package/src/utils/model/antModels.ts +64 -0
  1613. package/src/utils/model/bedrock.ts +265 -0
  1614. package/src/utils/model/check1mAccess.ts +72 -0
  1615. package/src/utils/model/configs.ts +118 -0
  1616. package/src/utils/model/contextWindowUpgradeCheck.ts +47 -0
  1617. package/src/utils/model/deprecation.ts +101 -0
  1618. package/src/utils/model/model.ts +634 -0
  1619. package/src/utils/model/modelAllowlist.ts +170 -0
  1620. package/src/utils/model/modelCapabilities.ts +118 -0
  1621. package/src/utils/model/modelOptions.ts +540 -0
  1622. package/src/utils/model/modelStrings.ts +166 -0
  1623. package/src/utils/model/modelSupportOverrides.ts +50 -0
  1624. package/src/utils/model/providers.ts +46 -0
  1625. package/src/utils/model/validateModel.ts +159 -0
  1626. package/src/utils/modelCost.ts +235 -0
  1627. package/src/utils/modifiers.ts +36 -0
  1628. package/src/utils/mtls.ts +179 -0
  1629. package/src/utils/nativeInstaller/download.ts +523 -0
  1630. package/src/utils/nativeInstaller/index.ts +18 -0
  1631. package/src/utils/nativeInstaller/installer.ts +1708 -0
  1632. package/src/utils/nativeInstaller/packageManagers.ts +336 -0
  1633. package/src/utils/nativeInstaller/pidLock.ts +433 -0
  1634. package/src/utils/notebook.ts +224 -0
  1635. package/src/utils/objectGroupBy.ts +18 -0
  1636. package/src/utils/pasteStore.ts +104 -0
  1637. package/src/utils/path.ts +155 -0
  1638. package/src/utils/pdf.ts +300 -0
  1639. package/src/utils/pdfUtils.ts +70 -0
  1640. package/src/utils/peerAddress.ts +21 -0
  1641. package/src/utils/permissions/PermissionMode.ts +141 -0
  1642. package/src/utils/permissions/PermissionPromptToolResultSchema.ts +127 -0
  1643. package/src/utils/permissions/PermissionResult.ts +35 -0
  1644. package/src/utils/permissions/PermissionRule.ts +40 -0
  1645. package/src/utils/permissions/PermissionUpdate.ts +389 -0
  1646. package/src/utils/permissions/PermissionUpdateSchema.ts +78 -0
  1647. package/src/utils/permissions/autoModeState.ts +39 -0
  1648. package/src/utils/permissions/bashClassifier.ts +61 -0
  1649. package/src/utils/permissions/bypassPermissionsKillswitch.ts +155 -0
  1650. package/src/utils/permissions/classifierDecision.ts +98 -0
  1651. package/src/utils/permissions/classifierShared.ts +39 -0
  1652. package/src/utils/permissions/dangerousPatterns.ts +80 -0
  1653. package/src/utils/permissions/denialTracking.ts +45 -0
  1654. package/src/utils/permissions/filesystem.ts +1777 -0
  1655. package/src/utils/permissions/getNextPermissionMode.ts +101 -0
  1656. package/src/utils/permissions/pathValidation.ts +485 -0
  1657. package/src/utils/permissions/permissionExplainer.ts +250 -0
  1658. package/src/utils/permissions/permissionRuleParser.ts +198 -0
  1659. package/src/utils/permissions/permissionSetup.ts +1532 -0
  1660. package/src/utils/permissions/permissions.ts +1486 -0
  1661. package/src/utils/permissions/permissionsLoader.ts +296 -0
  1662. package/src/utils/permissions/shadowedRuleDetection.ts +234 -0
  1663. package/src/utils/permissions/shellRuleMatching.ts +228 -0
  1664. package/src/utils/permissions/yoloClassifier.ts +1495 -0
  1665. package/src/utils/planModeV2.ts +95 -0
  1666. package/src/utils/plans.ts +397 -0
  1667. package/src/utils/platform.ts +150 -0
  1668. package/src/utils/plugins/addDirPluginSettings.ts +71 -0
  1669. package/src/utils/plugins/cacheUtils.ts +196 -0
  1670. package/src/utils/plugins/dependencyResolver.ts +305 -0
  1671. package/src/utils/plugins/fetchTelemetry.ts +135 -0
  1672. package/src/utils/plugins/gitAvailability.ts +69 -0
  1673. package/src/utils/plugins/headlessPluginInstall.ts +174 -0
  1674. package/src/utils/plugins/hintRecommendation.ts +164 -0
  1675. package/src/utils/plugins/installCounts.ts +292 -0
  1676. package/src/utils/plugins/installedPluginsManager.ts +1268 -0
  1677. package/src/utils/plugins/loadPluginAgents.ts +348 -0
  1678. package/src/utils/plugins/loadPluginCommands.ts +946 -0
  1679. package/src/utils/plugins/loadPluginHooks.ts +287 -0
  1680. package/src/utils/plugins/loadPluginOutputStyles.ts +178 -0
  1681. package/src/utils/plugins/lspPluginIntegration.ts +387 -0
  1682. package/src/utils/plugins/lspRecommendation.ts +374 -0
  1683. package/src/utils/plugins/managedPlugins.ts +27 -0
  1684. package/src/utils/plugins/marketplaceHelpers.ts +592 -0
  1685. package/src/utils/plugins/marketplaceManager.ts +2643 -0
  1686. package/src/utils/plugins/mcpPluginIntegration.ts +634 -0
  1687. package/src/utils/plugins/mcpbHandler.ts +968 -0
  1688. package/src/utils/plugins/officialMarketplace.ts +25 -0
  1689. package/src/utils/plugins/officialMarketplaceGcs.ts +216 -0
  1690. package/src/utils/plugins/officialMarketplaceStartupCheck.ts +439 -0
  1691. package/src/utils/plugins/orphanedPluginFilter.ts +114 -0
  1692. package/src/utils/plugins/parseMarketplaceInput.ts +162 -0
  1693. package/src/utils/plugins/performStartupChecks.tsx +70 -0
  1694. package/src/utils/plugins/pluginAutoupdate.ts +284 -0
  1695. package/src/utils/plugins/pluginBlocklist.ts +127 -0
  1696. package/src/utils/plugins/pluginDirectories.ts +178 -0
  1697. package/src/utils/plugins/pluginFlagging.ts +208 -0
  1698. package/src/utils/plugins/pluginIdentifier.ts +123 -0
  1699. package/src/utils/plugins/pluginInstallationHelpers.ts +595 -0
  1700. package/src/utils/plugins/pluginLoader.ts +3302 -0
  1701. package/src/utils/plugins/pluginOptionsStorage.ts +400 -0
  1702. package/src/utils/plugins/pluginPolicy.ts +20 -0
  1703. package/src/utils/plugins/pluginStartupCheck.ts +341 -0
  1704. package/src/utils/plugins/pluginVersioning.ts +157 -0
  1705. package/src/utils/plugins/reconciler.ts +265 -0
  1706. package/src/utils/plugins/refresh.ts +215 -0
  1707. package/src/utils/plugins/schemas.ts +1681 -0
  1708. package/src/utils/plugins/validatePlugin.ts +903 -0
  1709. package/src/utils/plugins/walkPluginMarkdown.ts +69 -0
  1710. package/src/utils/plugins/zipCache.ts +406 -0
  1711. package/src/utils/plugins/zipCacheAdapters.ts +164 -0
  1712. package/src/utils/powershell/dangerousCmdlets.ts +185 -0
  1713. package/src/utils/powershell/parser.ts +1804 -0
  1714. package/src/utils/powershell/staticPrefix.ts +316 -0
  1715. package/src/utils/preflightChecks.tsx +151 -0
  1716. package/src/utils/privacyLevel.ts +55 -0
  1717. package/src/utils/process.ts +68 -0
  1718. package/src/utils/processUserInput/processBashCommand.tsx +140 -0
  1719. package/src/utils/processUserInput/processSlashCommand.tsx +922 -0
  1720. package/src/utils/processUserInput/processTextPrompt.ts +100 -0
  1721. package/src/utils/processUserInput/processUserInput.ts +605 -0
  1722. package/src/utils/profilerBase.ts +46 -0
  1723. package/src/utils/promptCategory.ts +49 -0
  1724. package/src/utils/promptEditor.ts +188 -0
  1725. package/src/utils/promptShellExecution.ts +183 -0
  1726. package/src/utils/proxy.ts +426 -0
  1727. package/src/utils/queryContext.ts +179 -0
  1728. package/src/utils/queryHelpers.ts +552 -0
  1729. package/src/utils/queryProfiler.ts +301 -0
  1730. package/src/utils/queueProcessor.ts +95 -0
  1731. package/src/utils/readEditContext.ts +227 -0
  1732. package/src/utils/readFileInRange.ts +383 -0
  1733. package/src/utils/releaseNotes.ts +360 -0
  1734. package/src/utils/renderOptions.ts +77 -0
  1735. package/src/utils/ripgrep.ts +679 -0
  1736. package/src/utils/sandbox/sandbox-adapter.ts +985 -0
  1737. package/src/utils/sandbox/sandbox-ui-utils.ts +12 -0
  1738. package/src/utils/sanitization.ts +91 -0
  1739. package/src/utils/screenshotClipboard.ts +121 -0
  1740. package/src/utils/sdkEventQueue.ts +134 -0
  1741. package/src/utils/secureStorage/fallbackStorage.ts +70 -0
  1742. package/src/utils/secureStorage/index.ts +17 -0
  1743. package/src/utils/secureStorage/keychainPrefetch.ts +116 -0
  1744. package/src/utils/secureStorage/macOsKeychainHelpers.ts +111 -0
  1745. package/src/utils/secureStorage/macOsKeychainStorage.ts +231 -0
  1746. package/src/utils/secureStorage/plainTextStorage.ts +84 -0
  1747. package/src/utils/semanticBoolean.ts +29 -0
  1748. package/src/utils/semanticNumber.ts +36 -0
  1749. package/src/utils/semver.ts +59 -0
  1750. package/src/utils/sequential.ts +56 -0
  1751. package/src/utils/sessionActivity.ts +133 -0
  1752. package/src/utils/sessionEnvVars.ts +22 -0
  1753. package/src/utils/sessionEnvironment.ts +166 -0
  1754. package/src/utils/sessionFileAccessHooks.ts +250 -0
  1755. package/src/utils/sessionIngressAuth.ts +140 -0
  1756. package/src/utils/sessionRestore.ts +551 -0
  1757. package/src/utils/sessionStart.ts +232 -0
  1758. package/src/utils/sessionState.ts +150 -0
  1759. package/src/utils/sessionStorage.ts +5105 -0
  1760. package/src/utils/sessionStoragePortable.ts +793 -0
  1761. package/src/utils/sessionTitle.ts +129 -0
  1762. package/src/utils/sessionUrl.ts +64 -0
  1763. package/src/utils/set.ts +53 -0
  1764. package/src/utils/settings/allErrors.ts +32 -0
  1765. package/src/utils/settings/applySettingsChange.ts +92 -0
  1766. package/src/utils/settings/changeDetector.ts +488 -0
  1767. package/src/utils/settings/constants.ts +202 -0
  1768. package/src/utils/settings/internalWrites.ts +37 -0
  1769. package/src/utils/settings/managedPath.ts +34 -0
  1770. package/src/utils/settings/mdm/constants.ts +81 -0
  1771. package/src/utils/settings/mdm/rawRead.ts +130 -0
  1772. package/src/utils/settings/mdm/settings.ts +316 -0
  1773. package/src/utils/settings/permissionValidation.ts +262 -0
  1774. package/src/utils/settings/pluginOnlyPolicy.ts +60 -0
  1775. package/src/utils/settings/schemaOutput.ts +8 -0
  1776. package/src/utils/settings/settings.ts +1015 -0
  1777. package/src/utils/settings/settingsCache.ts +80 -0
  1778. package/src/utils/settings/toolValidationConfig.ts +103 -0
  1779. package/src/utils/settings/types.ts +1148 -0
  1780. package/src/utils/settings/validateEditTool.ts +45 -0
  1781. package/src/utils/settings/validation.ts +265 -0
  1782. package/src/utils/settings/validationTips.ts +164 -0
  1783. package/src/utils/shell/bashProvider.ts +255 -0
  1784. package/src/utils/shell/outputLimits.ts +14 -0
  1785. package/src/utils/shell/powershellDetection.ts +107 -0
  1786. package/src/utils/shell/powershellProvider.ts +123 -0
  1787. package/src/utils/shell/prefix.ts +367 -0
  1788. package/src/utils/shell/readOnlyCommandValidation.ts +1893 -0
  1789. package/src/utils/shell/resolveDefaultShell.ts +14 -0
  1790. package/src/utils/shell/shellProvider.ts +33 -0
  1791. package/src/utils/shell/shellToolUtils.ts +22 -0
  1792. package/src/utils/shell/specPrefix.ts +241 -0
  1793. package/src/utils/shellConfig.ts +167 -0
  1794. package/src/utils/sideQuery.ts +222 -0
  1795. package/src/utils/sideQuestion.ts +155 -0
  1796. package/src/utils/signal.ts +43 -0
  1797. package/src/utils/sinks.ts +16 -0
  1798. package/src/utils/skills/skillChangeDetector.ts +311 -0
  1799. package/src/utils/slashCommandParsing.ts +60 -0
  1800. package/src/utils/sleep.ts +84 -0
  1801. package/src/utils/sliceAnsi.ts +91 -0
  1802. package/src/utils/slowOperations.ts +286 -0
  1803. package/src/utils/standaloneAgent.ts +23 -0
  1804. package/src/utils/startupProfiler.ts +194 -0
  1805. package/src/utils/staticRender.tsx +116 -0
  1806. package/src/utils/stats.ts +1061 -0
  1807. package/src/utils/statsCache.ts +434 -0
  1808. package/src/utils/status.tsx +362 -0
  1809. package/src/utils/statusNoticeDefinitions.tsx +198 -0
  1810. package/src/utils/statusNoticeHelpers.ts +20 -0
  1811. package/src/utils/stream.ts +76 -0
  1812. package/src/utils/streamJsonStdoutGuard.ts +123 -0
  1813. package/src/utils/streamlinedTransform.ts +201 -0
  1814. package/src/utils/stringUtils.ts +235 -0
  1815. package/src/utils/subprocessEnv.ts +99 -0
  1816. package/src/utils/suggestions/commandSuggestions.ts +567 -0
  1817. package/src/utils/suggestions/directoryCompletion.ts +263 -0
  1818. package/src/utils/suggestions/shellHistoryCompletion.ts +119 -0
  1819. package/src/utils/suggestions/skillUsageTracking.ts +55 -0
  1820. package/src/utils/suggestions/slackChannelSuggestions.ts +209 -0
  1821. package/src/utils/swarm/It2SetupPrompt.tsx +380 -0
  1822. package/src/utils/swarm/backends/ITermBackend.ts +370 -0
  1823. package/src/utils/swarm/backends/InProcessBackend.ts +339 -0
  1824. package/src/utils/swarm/backends/PaneBackendExecutor.ts +354 -0
  1825. package/src/utils/swarm/backends/TmuxBackend.ts +764 -0
  1826. package/src/utils/swarm/backends/detection.ts +128 -0
  1827. package/src/utils/swarm/backends/it2Setup.ts +245 -0
  1828. package/src/utils/swarm/backends/registry.ts +464 -0
  1829. package/src/utils/swarm/backends/teammateModeSnapshot.ts +87 -0
  1830. package/src/utils/swarm/backends/types.ts +311 -0
  1831. package/src/utils/swarm/constants.ts +33 -0
  1832. package/src/utils/swarm/inProcessRunner.ts +1552 -0
  1833. package/src/utils/swarm/leaderPermissionBridge.ts +54 -0
  1834. package/src/utils/swarm/permissionSync.ts +928 -0
  1835. package/src/utils/swarm/reconnection.ts +119 -0
  1836. package/src/utils/swarm/spawnInProcess.ts +328 -0
  1837. package/src/utils/swarm/spawnUtils.ts +146 -0
  1838. package/src/utils/swarm/teamHelpers.ts +683 -0
  1839. package/src/utils/swarm/teammateInit.ts +129 -0
  1840. package/src/utils/swarm/teammateLayoutManager.ts +107 -0
  1841. package/src/utils/swarm/teammateModel.ts +10 -0
  1842. package/src/utils/swarm/teammatePromptAddendum.ts +18 -0
  1843. package/src/utils/systemDirectories.ts +74 -0
  1844. package/src/utils/systemPrompt.ts +123 -0
  1845. package/src/utils/systemPromptType.ts +14 -0
  1846. package/src/utils/systemTheme.ts +119 -0
  1847. package/src/utils/taggedId.ts +54 -0
  1848. package/src/utils/task/TaskOutput.ts +390 -0
  1849. package/src/utils/task/diskOutput.ts +451 -0
  1850. package/src/utils/task/framework.ts +308 -0
  1851. package/src/utils/task/outputFormatting.ts +38 -0
  1852. package/src/utils/task/sdkProgress.ts +36 -0
  1853. package/src/utils/tasks.ts +862 -0
  1854. package/src/utils/teamDiscovery.ts +81 -0
  1855. package/src/utils/teamMemoryOps.ts +88 -0
  1856. package/src/utils/teammate.ts +292 -0
  1857. package/src/utils/teammateContext.ts +96 -0
  1858. package/src/utils/teammateMailbox.ts +1183 -0
  1859. package/src/utils/telemetry/betaSessionTracing.ts +491 -0
  1860. package/src/utils/telemetry/bigqueryExporter.ts +252 -0
  1861. package/src/utils/telemetry/events.ts +75 -0
  1862. package/src/utils/telemetry/instrumentation.ts +825 -0
  1863. package/src/utils/telemetry/logger.ts +26 -0
  1864. package/src/utils/telemetry/perfettoTracing.ts +1120 -0
  1865. package/src/utils/telemetry/pluginTelemetry.ts +289 -0
  1866. package/src/utils/telemetry/sessionTracing.ts +927 -0
  1867. package/src/utils/telemetry/skillLoadedEvent.ts +39 -0
  1868. package/src/utils/telemetryAttributes.ts +71 -0
  1869. package/src/utils/teleport/api.ts +466 -0
  1870. package/src/utils/teleport/environmentSelection.ts +77 -0
  1871. package/src/utils/teleport/environments.ts +120 -0
  1872. package/src/utils/teleport/gitBundle.ts +292 -0
  1873. package/src/utils/teleport.tsx +1226 -0
  1874. package/src/utils/tempfile.ts +31 -0
  1875. package/src/utils/terminal.ts +131 -0
  1876. package/src/utils/terminalPanel.ts +191 -0
  1877. package/src/utils/textHighlighting.ts +166 -0
  1878. package/src/utils/theme.ts +639 -0
  1879. package/src/utils/thinking.ts +162 -0
  1880. package/src/utils/timeouts.ts +39 -0
  1881. package/src/utils/tmuxSocket.ts +427 -0
  1882. package/src/utils/todo/types.ts +18 -0
  1883. package/src/utils/tokenBudget.ts +73 -0
  1884. package/src/utils/tokens.ts +261 -0
  1885. package/src/utils/toolErrors.ts +132 -0
  1886. package/src/utils/toolPool.ts +79 -0
  1887. package/src/utils/toolResultStorage.ts +1040 -0
  1888. package/src/utils/toolSchemaCache.ts +26 -0
  1889. package/src/utils/toolSearch.ts +756 -0
  1890. package/src/utils/transcriptSearch.ts +202 -0
  1891. package/src/utils/treeify.ts +170 -0
  1892. package/src/utils/truncate.ts +179 -0
  1893. package/src/utils/ultraplan/ccrSession.ts +349 -0
  1894. package/src/utils/ultraplan/keyword.ts +127 -0
  1895. package/src/utils/ultraplan/prompt.txt +1 -0
  1896. package/src/utils/unaryLogging.ts +39 -0
  1897. package/src/utils/undercover.ts +89 -0
  1898. package/src/utils/user.ts +194 -0
  1899. package/src/utils/userAgent.ts +10 -0
  1900. package/src/utils/userPromptKeywords.ts +27 -0
  1901. package/src/utils/uuid.ts +27 -0
  1902. package/src/utils/warningHandler.ts +121 -0
  1903. package/src/utils/which.ts +82 -0
  1904. package/src/utils/windowsPaths.ts +173 -0
  1905. package/src/utils/withResolvers.ts +13 -0
  1906. package/src/utils/words.ts +800 -0
  1907. package/src/utils/workloadContext.ts +57 -0
  1908. package/src/utils/worktree.ts +1519 -0
  1909. package/src/utils/worktreeModeEnabled.ts +11 -0
  1910. package/src/utils/xdg.ts +65 -0
  1911. package/src/utils/xml.ts +16 -0
  1912. package/src/utils/yaml.ts +15 -0
  1913. package/src/utils/zodToJsonSchema.ts +23 -0
  1914. package/src/vim/motions.ts +82 -0
  1915. package/src/vim/operators.ts +556 -0
  1916. package/src/vim/textObjects.ts +186 -0
  1917. package/src/vim/transitions.ts +490 -0
  1918. package/src/vim/types.ts +199 -0
  1919. package/src/voice/voiceModeEnabled.ts +54 -0
  1920. package/start.js +1 -0
@@ -0,0 +1,1398 @@
1
+ import { feature } from 'bun:bundle';
2
+ import * as React from 'react';
3
+ import { buildTool, type ToolDef, toolMatchesName } from 'src/Tool.js';
4
+ import type { Message as MessageType, NormalizedUserMessage } from 'src/types/message.js';
5
+ import { getQuerySourceForAgent } from 'src/utils/promptCategory.js';
6
+ import { z } from 'zod/v4';
7
+ import { clearInvokedSkillsForAgent, getSdkAgentProgressSummariesEnabled } from '../../bootstrap/state.js';
8
+ import { enhanceSystemPromptWithEnvDetails, getSystemPrompt } from '../../constants/prompts.js';
9
+ import { isCoordinatorMode } from '../../coordinator/coordinatorMode.js';
10
+ import { startAgentSummarization } from '../../services/AgentSummary/agentSummary.js';
11
+ import { getFeatureValue_CACHED_MAY_BE_STALE } from '../../services/analytics/growthbook.js';
12
+ import { type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, logEvent } from '../../services/analytics/index.js';
13
+ import { clearDumpState } from '../../services/api/dumpPrompts.js';
14
+ import { completeAgentTask as completeAsyncAgent, createActivityDescriptionResolver, createProgressTracker, enqueueAgentNotification, failAgentTask as failAsyncAgent, getProgressUpdate, getTokenCountFromTracker, isLocalAgentTask, killAsyncAgent, registerAgentForeground, registerAsyncAgent, unregisterAgentForeground, updateAgentProgress as updateAsyncAgentProgress, updateProgressFromMessage } from '../../tasks/LocalAgentTask/LocalAgentTask.js';
15
+ import { checkRemoteAgentEligibility, formatPreconditionError, getRemoteTaskSessionUrl, registerRemoteAgentTask } from '../../tasks/RemoteAgentTask/RemoteAgentTask.js';
16
+ import { assembleToolPool } from '../../tools.js';
17
+ import { asAgentId } from '../../types/ids.js';
18
+ import { runWithAgentContext } from '../../utils/agentContext.js';
19
+ import { isAgentSwarmsEnabled } from '../../utils/agentSwarmsEnabled.js';
20
+ import { getCwd, runWithCwdOverride } from '../../utils/cwd.js';
21
+ import { logForDebugging } from '../../utils/debug.js';
22
+ import { isEnvTruthy } from '../../utils/envUtils.js';
23
+ import { AbortError, errorMessage, toError } from '../../utils/errors.js';
24
+ import type { CacheSafeParams } from '../../utils/forkedAgent.js';
25
+ import { lazySchema } from '../../utils/lazySchema.js';
26
+ import { createUserMessage, extractTextContent, isSyntheticMessage, normalizeMessages } from '../../utils/messages.js';
27
+ import { getAgentModel } from '../../utils/model/agent.js';
28
+ import { permissionModeSchema } from '../../utils/permissions/PermissionMode.js';
29
+ import type { PermissionResult } from '../../utils/permissions/PermissionResult.js';
30
+ import { filterDeniedAgents, getDenyRuleForAgent } from '../../utils/permissions/permissions.js';
31
+ import { enqueueSdkEvent } from '../../utils/sdkEventQueue.js';
32
+ import { writeAgentMetadata } from '../../utils/sessionStorage.js';
33
+ import { sleep } from '../../utils/sleep.js';
34
+ import { buildEffectiveSystemPrompt } from '../../utils/systemPrompt.js';
35
+ import { asSystemPrompt } from '../../utils/systemPromptType.js';
36
+ import { getTaskOutputPath } from '../../utils/task/diskOutput.js';
37
+ import { getParentSessionId, isTeammate } from '../../utils/teammate.js';
38
+ import { isInProcessTeammate } from '../../utils/teammateContext.js';
39
+ import { teleportToRemote } from '../../utils/teleport.js';
40
+ import { getAssistantMessageContentLength } from '../../utils/tokens.js';
41
+ import { createAgentId } from '../../utils/uuid.js';
42
+ import { createAgentWorktree, hasWorktreeChanges, removeAgentWorktree } from '../../utils/worktree.js';
43
+ import { BASH_TOOL_NAME } from '../BashTool/toolName.js';
44
+ import { BackgroundHint } from '../BashTool/UI.js';
45
+ import { FILE_READ_TOOL_NAME } from '../FileReadTool/prompt.js';
46
+ import { spawnTeammate } from '../shared/spawnMultiAgent.js';
47
+ import { setAgentColor } from './agentColorManager.js';
48
+ import { agentToolResultSchema, classifyHandoffIfNeeded, emitTaskProgress, extractPartialResult, finalizeAgentTool, getLastToolUseName, runAsyncAgentLifecycle } from './agentToolUtils.js';
49
+ import { GENERAL_PURPOSE_AGENT } from './built-in/generalPurposeAgent.js';
50
+ import { AGENT_TOOL_NAME, LEGACY_AGENT_TOOL_NAME, ONE_SHOT_BUILTIN_AGENT_TYPES } from './constants.js';
51
+ import { buildForkedMessages, buildWorktreeNotice, FORK_AGENT, isForkSubagentEnabled, isInForkChild } from './forkSubagent.js';
52
+ import type { AgentDefinition } from './loadAgentsDir.js';
53
+ import { filterAgentsByMcpRequirements, hasRequiredMcpServers, isBuiltInAgent } from './loadAgentsDir.js';
54
+ import { getPrompt } from './prompt.js';
55
+ import { runAgent } from './runAgent.js';
56
+ import { renderGroupedAgentToolUse, renderToolResultMessage, renderToolUseErrorMessage, renderToolUseMessage, renderToolUseProgressMessage, renderToolUseRejectedMessage, renderToolUseTag, userFacingName, userFacingNameBackgroundColor } from './UI.js';
57
+
58
+ /* eslint-disable @typescript-eslint/no-require-imports */
59
+ const proactiveModule = feature('PROACTIVE') || feature('KAIROS') ? require('../../proactive/index.js') as typeof import('../../proactive/index.js') : null;
60
+ /* eslint-enable @typescript-eslint/no-require-imports */
61
+
62
+ // Progress display constants (for showing background hint)
63
+ const PROGRESS_THRESHOLD_MS = 2000; // Show background hint after 2 seconds
64
+
65
+ // Check if background tasks are disabled at module load time
66
+ const isBackgroundTasksDisabled =
67
+ // eslint-disable-next-line custom-rules/no-process-env-top-level -- Intentional: schema must be defined at module load
68
+ isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_BACKGROUND_TASKS);
69
+
70
+ // Auto-background agent tasks after this many ms (0 = disabled)
71
+ // Enabled by env var OR GrowthBook gate (checked lazily since GB may not be ready at module load)
72
+ function getAutoBackgroundMs(): number {
73
+ if (isEnvTruthy(process.env.CLAUDE_AUTO_BACKGROUND_TASKS) || getFeatureValue_CACHED_MAY_BE_STALE('tengu_auto_background_agents', false)) {
74
+ return 120_000;
75
+ }
76
+ return 0;
77
+ }
78
+
79
+ // Multi-agent type constants are defined inline inside gated blocks to enable dead code elimination
80
+
81
+ // Base input schema without multi-agent parameters
82
+ const baseInputSchema = lazySchema(() => z.object({
83
+ description: z.string().describe('A short (3-5 word) description of the task'),
84
+ prompt: z.string().describe('The task for the agent to perform'),
85
+ subagent_type: z.string().optional().describe('The type of specialized agent to use for this task'),
86
+ model: z.enum(['sonnet', 'opus', 'haiku']).optional().describe("Optional model override for this agent. Takes precedence over the agent definition's model frontmatter. If omitted, uses the agent definition's model, or inherits from the parent."),
87
+ run_in_background: z.boolean().optional().describe('Set to true to run this agent in the background. You will be notified when it completes.')
88
+ }));
89
+
90
+ // Full schema combining base + multi-agent params + isolation
91
+ const fullInputSchema = lazySchema(() => {
92
+ // Multi-agent parameters
93
+ const multiAgentInputSchema = z.object({
94
+ name: z.string().optional().describe('Name for the spawned agent. Makes it addressable via SendMessage({to: name}) while running.'),
95
+ team_name: z.string().optional().describe('Team name for spawning. Uses current team context if omitted.'),
96
+ mode: permissionModeSchema().optional().describe('Permission mode for spawned teammate (e.g., "plan" to require plan approval).')
97
+ });
98
+ return baseInputSchema().merge(multiAgentInputSchema).extend({
99
+ isolation: ("external" === 'ant' ? z.enum(['worktree', 'remote']) : z.enum(['worktree'])).optional().describe("external" === 'ant' ? 'Isolation mode. "worktree" creates a temporary git worktree so the agent works on an isolated copy of the repo. "remote" launches the agent in a remote CCR environment (always runs in background).' : 'Isolation mode. "worktree" creates a temporary git worktree so the agent works on an isolated copy of the repo.'),
100
+ cwd: z.string().optional().describe('Absolute path to run the agent in. Overrides the working directory for all filesystem and shell operations within this agent. Mutually exclusive with isolation: "worktree".')
101
+ });
102
+ });
103
+
104
+ // Strip optional fields from the schema when the backing feature is off so
105
+ // the model never sees them. Done via .omit() rather than conditional spread
106
+ // inside .extend() because the spread-ternary breaks Zod's type inference
107
+ // (field type collapses to `unknown`). The ternary return produces a union
108
+ // type, but call() destructures via the explicit AgentToolInput type below
109
+ // which always includes all optional fields.
110
+ export const inputSchema = lazySchema(() => {
111
+ const schema = feature('KAIROS') ? fullInputSchema() : fullInputSchema().omit({
112
+ cwd: true
113
+ });
114
+
115
+ // GrowthBook-in-lazySchema is acceptable here (unlike subagent_type, which
116
+ // was removed in 906da6c723): the divergence window is one-session-per-
117
+ // gate-flip via _CACHED_MAY_BE_STALE disk read, and worst case is either
118
+ // "schema shows a no-op param" (gate flips on mid-session: param ignored
119
+ // by forceAsync) or "schema hides a param that would've worked" (gate
120
+ // flips off mid-session: everything still runs async via memoized
121
+ // forceAsync). No Zod rejection, no crash — unlike required→optional.
122
+ return isBackgroundTasksDisabled || isForkSubagentEnabled() ? schema.omit({
123
+ run_in_background: true
124
+ }) : schema;
125
+ });
126
+ type InputSchema = ReturnType<typeof inputSchema>;
127
+
128
+ // Explicit type widens the schema inference to always include all optional
129
+ // fields even when .omit() strips them for gating (cwd, run_in_background).
130
+ // subagent_type is optional; call() defaults it to general-purpose when the
131
+ // fork gate is off, or routes to the fork path when the gate is on.
132
+ type AgentToolInput = z.infer<ReturnType<typeof baseInputSchema>> & {
133
+ name?: string;
134
+ team_name?: string;
135
+ mode?: z.infer<ReturnType<typeof permissionModeSchema>>;
136
+ isolation?: 'worktree' | 'remote';
137
+ cwd?: string;
138
+ };
139
+
140
+ // Output schema - multi-agent spawned schema added dynamically at runtime when enabled
141
+ export const outputSchema = lazySchema(() => {
142
+ const syncOutputSchema = agentToolResultSchema().extend({
143
+ status: z.literal('completed'),
144
+ prompt: z.string()
145
+ });
146
+ const asyncOutputSchema = z.object({
147
+ status: z.literal('async_launched'),
148
+ agentId: z.string().describe('The ID of the async agent'),
149
+ description: z.string().describe('The description of the task'),
150
+ prompt: z.string().describe('The prompt for the agent'),
151
+ outputFile: z.string().describe('Path to the output file for checking agent progress'),
152
+ canReadOutputFile: z.boolean().optional().describe('Whether the calling agent has Read/Bash tools to check progress')
153
+ });
154
+ return z.union([syncOutputSchema, asyncOutputSchema]);
155
+ });
156
+ type OutputSchema = ReturnType<typeof outputSchema>;
157
+ type Output = z.input<OutputSchema>;
158
+
159
+ // Private type for teammate spawn results - excluded from exported schema for dead code elimination
160
+ // The 'teammate_spawned' status string is only included when ENABLE_AGENT_SWARMS is true
161
+ type TeammateSpawnedOutput = {
162
+ status: 'teammate_spawned';
163
+ prompt: string;
164
+ teammate_id: string;
165
+ agent_id: string;
166
+ agent_type?: string;
167
+ model?: string;
168
+ name: string;
169
+ color?: string;
170
+ tmux_session_name: string;
171
+ tmux_window_name: string;
172
+ tmux_pane_id: string;
173
+ team_name?: string;
174
+ is_splitpane?: boolean;
175
+ plan_mode_required?: boolean;
176
+ };
177
+
178
+ // Combined output type including both public and internal types
179
+ // Note: TeammateSpawnedOutput type is fine - TypeScript types are erased at compile time
180
+ // Private type for remote-launched results — excluded from exported schema
181
+ // like TeammateSpawnedOutput for dead code elimination purposes. Exported
182
+ // for UI.tsx to do proper discriminated-union narrowing instead of ad-hoc casts.
183
+ export type RemoteLaunchedOutput = {
184
+ status: 'remote_launched';
185
+ taskId: string;
186
+ sessionUrl: string;
187
+ description: string;
188
+ prompt: string;
189
+ outputFile: string;
190
+ };
191
+ type InternalOutput = Output | TeammateSpawnedOutput | RemoteLaunchedOutput;
192
+ import type { AgentToolProgress, ShellProgress } from '../../types/tools.js';
193
+ // AgentTool forwards both its own progress events and shell progress
194
+ // events from the sub-agent so the SDK receives tool_progress updates during bash/powershell runs.
195
+ export type Progress = AgentToolProgress | ShellProgress;
196
+ export const AgentTool = buildTool({
197
+ async prompt({
198
+ agents,
199
+ tools,
200
+ getToolPermissionContext,
201
+ allowedAgentTypes
202
+ }) {
203
+ const toolPermissionContext = await getToolPermissionContext();
204
+
205
+ // Get MCP servers that have tools available
206
+ const mcpServersWithTools: string[] = [];
207
+ for (const tool of tools) {
208
+ if (tool.name?.startsWith('mcp__')) {
209
+ const parts = tool.name.split('__');
210
+ const serverName = parts[1];
211
+ if (serverName && !mcpServersWithTools.includes(serverName)) {
212
+ mcpServersWithTools.push(serverName);
213
+ }
214
+ }
215
+ }
216
+
217
+ // Filter agents: first by MCP requirements, then by permission rules
218
+ const agentsWithMcpRequirementsMet = filterAgentsByMcpRequirements(agents, mcpServersWithTools);
219
+ const filteredAgents = filterDeniedAgents(agentsWithMcpRequirementsMet, toolPermissionContext, AGENT_TOOL_NAME);
220
+
221
+ // Use inline env check instead of coordinatorModule to avoid circular
222
+ // dependency issues during test module loading.
223
+ const isCoordinator = feature('COORDINATOR_MODE') ? isEnvTruthy(process.env.CLAUDE_CODE_COORDINATOR_MODE) : false;
224
+ return await getPrompt(filteredAgents, isCoordinator, allowedAgentTypes);
225
+ },
226
+ name: AGENT_TOOL_NAME,
227
+ searchHint: 'delegate work to a subagent',
228
+ aliases: [LEGACY_AGENT_TOOL_NAME],
229
+ maxResultSizeChars: 100_000,
230
+ async description() {
231
+ return 'Launch a new agent';
232
+ },
233
+ get inputSchema(): InputSchema {
234
+ return inputSchema();
235
+ },
236
+ get outputSchema(): OutputSchema {
237
+ return outputSchema();
238
+ },
239
+ async call({
240
+ prompt,
241
+ subagent_type,
242
+ description,
243
+ model: modelParam,
244
+ run_in_background,
245
+ name,
246
+ team_name,
247
+ mode: spawnMode,
248
+ isolation,
249
+ cwd
250
+ }: AgentToolInput, toolUseContext, canUseTool, assistantMessage, onProgress?) {
251
+ const startTime = Date.now();
252
+ const model = isCoordinatorMode() ? undefined : modelParam;
253
+
254
+ // Get app state for permission mode and agent filtering
255
+ const appState = toolUseContext.getAppState();
256
+ const permissionMode = appState.toolPermissionContext.mode;
257
+ // In-process teammates get a no-op setAppState; setAppStateForTasks
258
+ // reaches the root store so task registration/progress/kill stay visible.
259
+ const rootSetAppState = toolUseContext.setAppStateForTasks ?? toolUseContext.setAppState;
260
+
261
+ // Check if user is trying to use agent teams without access
262
+ if (team_name && !isAgentSwarmsEnabled()) {
263
+ throw new Error('Agent Teams is not yet available on your plan.');
264
+ }
265
+
266
+ // Teammates (in-process or tmux) passing `name` would trigger spawnTeammate()
267
+ // below, but TeamFile.members is a flat array with one leadAgentId — nested
268
+ // teammates land in the roster with no provenance and confuse the lead.
269
+ const teamName = resolveTeamName({
270
+ team_name
271
+ }, appState);
272
+ if (isTeammate() && teamName && name) {
273
+ throw new Error('Teammates cannot spawn other teammates — the team roster is flat. To spawn a subagent instead, omit the `name` parameter.');
274
+ }
275
+ // In-process teammates cannot spawn background agents (their lifecycle is
276
+ // tied to the leader's process). Tmux teammates are separate processes and
277
+ // can manage their own background agents.
278
+ if (isInProcessTeammate() && teamName && run_in_background === true) {
279
+ throw new Error('In-process teammates cannot spawn background agents. Use run_in_background=false for synchronous subagents.');
280
+ }
281
+
282
+ // Check if this is a multi-agent spawn request
283
+ // Spawn is triggered when team_name is set (from param or context) and name is provided
284
+ if (teamName && name) {
285
+ // Set agent definition color for grouped UI display before spawning
286
+ const agentDef = subagent_type ? toolUseContext.options.agentDefinitions.activeAgents.find(a => a.agentType === subagent_type) : undefined;
287
+ if (agentDef?.color) {
288
+ setAgentColor(subagent_type!, agentDef.color);
289
+ }
290
+ const result = await spawnTeammate({
291
+ name,
292
+ prompt,
293
+ description,
294
+ team_name: teamName,
295
+ use_splitpane: true,
296
+ plan_mode_required: spawnMode === 'plan',
297
+ model: model ?? agentDef?.model,
298
+ agent_type: subagent_type,
299
+ invokingRequestId: assistantMessage?.requestId
300
+ }, toolUseContext);
301
+
302
+ // Type assertion uses TeammateSpawnedOutput (defined above) instead of any.
303
+ // This type is excluded from the exported outputSchema for dead code elimination.
304
+ // Cast through unknown because TeammateSpawnedOutput is intentionally
305
+ // not part of the exported Output union (for dead code elimination purposes).
306
+ const spawnResult: TeammateSpawnedOutput = {
307
+ status: 'teammate_spawned' as const,
308
+ prompt,
309
+ ...result.data
310
+ };
311
+ return {
312
+ data: spawnResult
313
+ } as unknown as {
314
+ data: Output;
315
+ };
316
+ }
317
+
318
+ // Fork subagent experiment routing:
319
+ // - subagent_type set: use it (explicit wins)
320
+ // - subagent_type omitted, gate on: fork path (undefined)
321
+ // - subagent_type omitted, gate off: default general-purpose
322
+ const effectiveType = subagent_type ?? (isForkSubagentEnabled() ? undefined : GENERAL_PURPOSE_AGENT.agentType);
323
+ const isForkPath = effectiveType === undefined;
324
+ let selectedAgent: AgentDefinition;
325
+ if (isForkPath) {
326
+ // Recursive fork guard: fork children keep the Agent tool in their
327
+ // pool for cache-identical tool defs, so reject fork attempts at call
328
+ // time. Primary check is querySource (compaction-resistant — set on
329
+ // context.options at spawn time, survives autocompact's message
330
+ // rewrite). Message-scan fallback catches any path where querySource
331
+ // wasn't threaded.
332
+ if (toolUseContext.options.querySource === `agent:builtin:${FORK_AGENT.agentType}` || isInForkChild(toolUseContext.messages)) {
333
+ throw new Error('Fork is not available inside a forked worker. Complete your task directly using your tools.');
334
+ }
335
+ selectedAgent = FORK_AGENT;
336
+ } else {
337
+ // Filter agents to exclude those denied via Agent(AgentName) syntax
338
+ const allAgents = toolUseContext.options.agentDefinitions.activeAgents;
339
+ const {
340
+ allowedAgentTypes
341
+ } = toolUseContext.options.agentDefinitions;
342
+ const agents = filterDeniedAgents(
343
+ // When allowedAgentTypes is set (from Agent(x,y) tool spec), restrict to those types
344
+ allowedAgentTypes ? allAgents.filter(a => allowedAgentTypes.includes(a.agentType)) : allAgents, appState.toolPermissionContext, AGENT_TOOL_NAME);
345
+ const found = agents.find(agent => agent.agentType === effectiveType);
346
+ if (!found) {
347
+ // Check if the agent exists but is denied by permission rules
348
+ const agentExistsButDenied = allAgents.find(agent => agent.agentType === effectiveType);
349
+ if (agentExistsButDenied) {
350
+ const denyRule = getDenyRuleForAgent(appState.toolPermissionContext, AGENT_TOOL_NAME, effectiveType);
351
+ throw new Error(`Agent type '${effectiveType}' has been denied by permission rule '${AGENT_TOOL_NAME}(${effectiveType})' from ${denyRule?.source ?? 'settings'}.`);
352
+ }
353
+ throw new Error(`Agent type '${effectiveType}' not found. Available agents: ${agents.map(a => a.agentType).join(', ')}`);
354
+ }
355
+ selectedAgent = found;
356
+ }
357
+
358
+ // Same lifecycle constraint as the run_in_background guard above, but for
359
+ // agent definitions that force background via `background: true`. Checked
360
+ // here because selectedAgent is only now resolved.
361
+ if (isInProcessTeammate() && teamName && selectedAgent.background === true) {
362
+ throw new Error(`In-process teammates cannot spawn background agents. Agent '${selectedAgent.agentType}' has background: true in its definition.`);
363
+ }
364
+
365
+ // Capture for type narrowing — `let selectedAgent` prevents TS from
366
+ // narrowing property types across the if-else assignment above.
367
+ const requiredMcpServers = selectedAgent.requiredMcpServers;
368
+
369
+ // Check if required MCP servers have tools available
370
+ // A server that's connected but not authenticated won't have any tools
371
+ if (requiredMcpServers?.length) {
372
+ // If any required servers are still pending (connecting), wait for them
373
+ // before checking tool availability. This avoids a race condition where
374
+ // the agent is invoked before MCP servers finish connecting.
375
+ const hasPendingRequiredServers = appState.mcp.clients.some(c => c.type === 'pending' && requiredMcpServers.some(pattern => c.name.toLowerCase().includes(pattern.toLowerCase())));
376
+ let currentAppState = appState;
377
+ if (hasPendingRequiredServers) {
378
+ const MAX_WAIT_MS = 30_000;
379
+ const POLL_INTERVAL_MS = 500;
380
+ const deadline = Date.now() + MAX_WAIT_MS;
381
+ while (Date.now() < deadline) {
382
+ await sleep(POLL_INTERVAL_MS);
383
+ currentAppState = toolUseContext.getAppState();
384
+
385
+ // Early exit: if any required server has already failed, no point
386
+ // waiting for other pending servers — the check will fail regardless.
387
+ const hasFailedRequiredServer = currentAppState.mcp.clients.some(c => c.type === 'failed' && requiredMcpServers.some(pattern => c.name.toLowerCase().includes(pattern.toLowerCase())));
388
+ if (hasFailedRequiredServer) break;
389
+ const stillPending = currentAppState.mcp.clients.some(c => c.type === 'pending' && requiredMcpServers.some(pattern => c.name.toLowerCase().includes(pattern.toLowerCase())));
390
+ if (!stillPending) break;
391
+ }
392
+ }
393
+
394
+ // Get servers that actually have tools (meaning they're connected AND authenticated)
395
+ const serversWithTools: string[] = [];
396
+ for (const tool of currentAppState.mcp.tools) {
397
+ if (tool.name?.startsWith('mcp__')) {
398
+ // Extract server name from tool name (format: mcp__serverName__toolName)
399
+ const parts = tool.name.split('__');
400
+ const serverName = parts[1];
401
+ if (serverName && !serversWithTools.includes(serverName)) {
402
+ serversWithTools.push(serverName);
403
+ }
404
+ }
405
+ }
406
+ if (!hasRequiredMcpServers(selectedAgent, serversWithTools)) {
407
+ const missing = requiredMcpServers.filter(pattern => !serversWithTools.some(server => server.toLowerCase().includes(pattern.toLowerCase())));
408
+ throw new Error(`Agent '${selectedAgent.agentType}' requires MCP servers matching: ${missing.join(', ')}. ` + `MCP servers with tools: ${serversWithTools.length > 0 ? serversWithTools.join(', ') : 'none'}. ` + `Use /mcp to configure and authenticate the required MCP servers.`);
409
+ }
410
+ }
411
+
412
+ // Initialize the color for this agent if it has a predefined one
413
+ if (selectedAgent.color) {
414
+ setAgentColor(selectedAgent.agentType, selectedAgent.color);
415
+ }
416
+
417
+ // Resolve agent params for logging (these are already resolved in runAgent)
418
+ const resolvedAgentModel = getAgentModel(selectedAgent.model, toolUseContext.options.mainLoopModel, isForkPath ? undefined : model, permissionMode);
419
+ logEvent('tengu_agent_tool_selected', {
420
+ agent_type: selectedAgent.agentType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
421
+ model: resolvedAgentModel as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
422
+ source: selectedAgent.source as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
423
+ color: selectedAgent.color as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
424
+ is_built_in_agent: isBuiltInAgent(selectedAgent),
425
+ is_resume: false,
426
+ is_async: (run_in_background === true || selectedAgent.background === true) && !isBackgroundTasksDisabled,
427
+ is_fork: isForkPath
428
+ });
429
+
430
+ // Resolve effective isolation mode (explicit param overrides agent def)
431
+ const effectiveIsolation = isolation ?? selectedAgent.isolation;
432
+
433
+ // Remote isolation: delegate to CCR. Gated ant-only — the guard enables
434
+ // dead code elimination of the entire block for external builds.
435
+ if ("external" === 'ant' && effectiveIsolation === 'remote') {
436
+ const eligibility = await checkRemoteAgentEligibility();
437
+ if (!eligibility.eligible) {
438
+ const reasons = eligibility.errors.map(formatPreconditionError).join('\n');
439
+ throw new Error(`Cannot launch remote agent:\n${reasons}`);
440
+ }
441
+ let bundleFailHint: string | undefined;
442
+ const session = await teleportToRemote({
443
+ initialMessage: prompt,
444
+ description,
445
+ signal: toolUseContext.abortController.signal,
446
+ onBundleFail: msg => {
447
+ bundleFailHint = msg;
448
+ }
449
+ });
450
+ if (!session) {
451
+ throw new Error(bundleFailHint ?? 'Failed to create remote session');
452
+ }
453
+ const {
454
+ taskId,
455
+ sessionId
456
+ } = registerRemoteAgentTask({
457
+ remoteTaskType: 'remote-agent',
458
+ session: {
459
+ id: session.id,
460
+ title: session.title || description
461
+ },
462
+ command: prompt,
463
+ context: toolUseContext,
464
+ toolUseId: toolUseContext.toolUseId
465
+ });
466
+ logEvent('tengu_agent_tool_remote_launched', {
467
+ agent_type: selectedAgent.agentType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
468
+ });
469
+ const remoteResult: RemoteLaunchedOutput = {
470
+ status: 'remote_launched',
471
+ taskId,
472
+ sessionUrl: getRemoteTaskSessionUrl(sessionId),
473
+ description,
474
+ prompt,
475
+ outputFile: getTaskOutputPath(taskId)
476
+ };
477
+ return {
478
+ data: remoteResult
479
+ } as unknown as {
480
+ data: Output;
481
+ };
482
+ }
483
+ // System prompt + prompt messages: branch on fork path.
484
+ //
485
+ // Fork path: child inherits the PARENT's system prompt (not FORK_AGENT's)
486
+ // for cache-identical API request prefixes. Prompt messages are built via
487
+ // buildForkedMessages() which clones the parent's full assistant message
488
+ // (all tool_use blocks) + placeholder tool_results + per-child directive.
489
+ //
490
+ // Normal path: build the selected agent's own system prompt with env
491
+ // details, and use a simple user message for the prompt.
492
+ let enhancedSystemPrompt: string[] | undefined;
493
+ let forkParentSystemPrompt: ReturnType<typeof buildEffectiveSystemPrompt> | undefined;
494
+ let promptMessages: MessageType[];
495
+ if (isForkPath) {
496
+ if (toolUseContext.renderedSystemPrompt) {
497
+ forkParentSystemPrompt = toolUseContext.renderedSystemPrompt;
498
+ } else {
499
+ // Fallback: recompute. May diverge from parent's cached bytes if
500
+ // GrowthBook state changed between parent turn-start and fork spawn.
501
+ const mainThreadAgentDefinition = appState.agent ? appState.agentDefinitions.activeAgents.find(a => a.agentType === appState.agent) : undefined;
502
+ const additionalWorkingDirectories = Array.from(appState.toolPermissionContext.additionalWorkingDirectories.keys());
503
+ const defaultSystemPrompt = await getSystemPrompt(toolUseContext.options.tools, toolUseContext.options.mainLoopModel, additionalWorkingDirectories, toolUseContext.options.mcpClients);
504
+ forkParentSystemPrompt = buildEffectiveSystemPrompt({
505
+ mainThreadAgentDefinition,
506
+ toolUseContext,
507
+ customSystemPrompt: toolUseContext.options.customSystemPrompt,
508
+ defaultSystemPrompt,
509
+ appendSystemPrompt: toolUseContext.options.appendSystemPrompt
510
+ });
511
+ }
512
+ promptMessages = buildForkedMessages(prompt, assistantMessage);
513
+ } else {
514
+ try {
515
+ const additionalWorkingDirectories = Array.from(appState.toolPermissionContext.additionalWorkingDirectories.keys());
516
+
517
+ // All agents have getSystemPrompt - pass toolUseContext to all
518
+ const agentPrompt = selectedAgent.getSystemPrompt({
519
+ toolUseContext
520
+ });
521
+
522
+ // Log agent memory loaded event for subagents
523
+ if (selectedAgent.memory) {
524
+ logEvent('tengu_agent_memory_loaded', {
525
+ ...("external" === 'ant' && {
526
+ agent_type: selectedAgent.agentType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
527
+ }),
528
+ scope: selectedAgent.memory as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
529
+ source: 'subagent' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
530
+ });
531
+ }
532
+
533
+ // Apply environment details enhancement
534
+ enhancedSystemPrompt = await enhanceSystemPromptWithEnvDetails([agentPrompt], resolvedAgentModel, additionalWorkingDirectories);
535
+ } catch (error) {
536
+ logForDebugging(`Failed to get system prompt for agent ${selectedAgent.agentType}: ${errorMessage(error)}`);
537
+ }
538
+ promptMessages = [createUserMessage({
539
+ content: prompt
540
+ })];
541
+ }
542
+ const metadata = {
543
+ prompt,
544
+ resolvedAgentModel,
545
+ isBuiltInAgent: isBuiltInAgent(selectedAgent),
546
+ startTime,
547
+ agentType: selectedAgent.agentType,
548
+ isAsync: (run_in_background === true || selectedAgent.background === true) && !isBackgroundTasksDisabled
549
+ };
550
+
551
+ // Use inline env check instead of coordinatorModule to avoid circular
552
+ // dependency issues during test module loading.
553
+ const isCoordinator = feature('COORDINATOR_MODE') ? isEnvTruthy(process.env.CLAUDE_CODE_COORDINATOR_MODE) : false;
554
+
555
+ // Fork subagent experiment: force ALL spawns async for a unified
556
+ // <task-notification> interaction model (not just fork spawns — all of them).
557
+ const forceAsync = isForkSubagentEnabled();
558
+
559
+ // Assistant mode: force all agents async. Synchronous subagents hold the
560
+ // main loop's turn open until they complete — the daemon's inputQueue
561
+ // backs up, and the first overdue cron catch-up on spawn becomes N
562
+ // serial subagent turns blocking all user input. Same gate as
563
+ // executeForkedSlashCommand's fire-and-forget path; the
564
+ // <task-notification> re-entry there is handled by the else branch
565
+ // below (registerAsyncAgentTask + notifyOnCompletion).
566
+ const assistantForceAsync = feature('KAIROS') ? appState.kairosEnabled : false;
567
+ const shouldRunAsync = (run_in_background === true || selectedAgent.background === true || isCoordinator || forceAsync || assistantForceAsync || (proactiveModule?.isProactiveActive() ?? false)) && !isBackgroundTasksDisabled;
568
+ // Assemble the worker's tool pool independently of the parent's.
569
+ // Workers always get their tools from assembleToolPool with their own
570
+ // permission mode, so they aren't affected by the parent's tool
571
+ // restrictions. This is computed here so that runAgent doesn't need to
572
+ // import from tools.ts (which would create a circular dependency).
573
+ const workerPermissionContext = {
574
+ ...appState.toolPermissionContext,
575
+ mode: selectedAgent.permissionMode ?? 'acceptEdits'
576
+ };
577
+ const workerTools = assembleToolPool(workerPermissionContext, appState.mcp.tools);
578
+
579
+ // Create a stable agent ID early so it can be used for worktree slug
580
+ const earlyAgentId = createAgentId();
581
+
582
+ // Set up worktree isolation if requested
583
+ let worktreeInfo: {
584
+ worktreePath: string;
585
+ worktreeBranch?: string;
586
+ headCommit?: string;
587
+ gitRoot?: string;
588
+ hookBased?: boolean;
589
+ } | null = null;
590
+ if (effectiveIsolation === 'worktree') {
591
+ const slug = `agent-${earlyAgentId.slice(0, 8)}`;
592
+ worktreeInfo = await createAgentWorktree(slug);
593
+ }
594
+
595
+ // Fork + worktree: inject a notice telling the child to translate paths
596
+ // and re-read potentially stale files. Appended after the fork directive
597
+ // so it appears as the most recent guidance the child sees.
598
+ if (isForkPath && worktreeInfo) {
599
+ promptMessages.push(createUserMessage({
600
+ content: buildWorktreeNotice(getCwd(), worktreeInfo.worktreePath)
601
+ }));
602
+ }
603
+ const runAgentParams: Parameters<typeof runAgent>[0] = {
604
+ agentDefinition: selectedAgent,
605
+ promptMessages,
606
+ toolUseContext,
607
+ canUseTool,
608
+ isAsync: shouldRunAsync,
609
+ querySource: toolUseContext.options.querySource ?? getQuerySourceForAgent(selectedAgent.agentType, isBuiltInAgent(selectedAgent)),
610
+ model: isForkPath ? undefined : model,
611
+ // Fork path: pass parent's system prompt AND parent's exact tool
612
+ // array (cache-identical prefix). workerTools is rebuilt under
613
+ // permissionMode 'bubble' which differs from the parent's mode, so
614
+ // its tool-def serialization diverges and breaks cache at the first
615
+ // differing tool. useExactTools also inherits the parent's
616
+ // thinkingConfig and isNonInteractiveSession (see runAgent.ts).
617
+ //
618
+ // Normal path: when a cwd override is in effect (worktree isolation
619
+ // or explicit cwd), skip the pre-built system prompt so runAgent's
620
+ // buildAgentSystemPrompt() runs inside wrapWithCwd where getCwd()
621
+ // returns the override path.
622
+ override: isForkPath ? {
623
+ systemPrompt: forkParentSystemPrompt
624
+ } : enhancedSystemPrompt && !worktreeInfo && !cwd ? {
625
+ systemPrompt: asSystemPrompt(enhancedSystemPrompt)
626
+ } : undefined,
627
+ availableTools: isForkPath ? toolUseContext.options.tools : workerTools,
628
+ // Pass parent conversation when the fork-subagent path needs full
629
+ // context. useExactTools inherits thinkingConfig (runAgent.ts:624).
630
+ forkContextMessages: isForkPath ? toolUseContext.messages : undefined,
631
+ ...(isForkPath && {
632
+ useExactTools: true
633
+ }),
634
+ worktreePath: worktreeInfo?.worktreePath,
635
+ description
636
+ };
637
+
638
+ // Helper to wrap execution with a cwd override: explicit cwd arg (KAIROS)
639
+ // takes precedence over worktree isolation path.
640
+ const cwdOverridePath = cwd ?? worktreeInfo?.worktreePath;
641
+ const wrapWithCwd = <T,>(fn: () => T): T => cwdOverridePath ? runWithCwdOverride(cwdOverridePath, fn) : fn();
642
+
643
+ // Helper to clean up worktree after agent completes
644
+ const cleanupWorktreeIfNeeded = async (): Promise<{
645
+ worktreePath?: string;
646
+ worktreeBranch?: string;
647
+ }> => {
648
+ if (!worktreeInfo) return {};
649
+ const {
650
+ worktreePath,
651
+ worktreeBranch,
652
+ headCommit,
653
+ gitRoot,
654
+ hookBased
655
+ } = worktreeInfo;
656
+ // Null out to make idempotent — guards against double-call if code
657
+ // between cleanup and end of try throws into catch
658
+ worktreeInfo = null;
659
+ if (hookBased) {
660
+ // Hook-based worktrees are always kept since we can't detect VCS changes
661
+ logForDebugging(`Hook-based agent worktree kept at: ${worktreePath}`);
662
+ return {
663
+ worktreePath
664
+ };
665
+ }
666
+ if (headCommit) {
667
+ const changed = await hasWorktreeChanges(worktreePath, headCommit);
668
+ if (!changed) {
669
+ await removeAgentWorktree(worktreePath, worktreeBranch, gitRoot);
670
+ // Clear worktreePath from metadata so resume doesn't try to use
671
+ // a deleted directory. Fire-and-forget to match runAgent's
672
+ // writeAgentMetadata handling.
673
+ void writeAgentMetadata(asAgentId(earlyAgentId), {
674
+ agentType: selectedAgent.agentType,
675
+ description
676
+ }).catch(_err => logForDebugging(`Failed to clear worktree metadata: ${_err}`));
677
+ return {};
678
+ }
679
+ }
680
+ logForDebugging(`Agent worktree has changes, keeping: ${worktreePath}`);
681
+ return {
682
+ worktreePath,
683
+ worktreeBranch
684
+ };
685
+ };
686
+ if (shouldRunAsync) {
687
+ const asyncAgentId = earlyAgentId;
688
+ const agentBackgroundTask = registerAsyncAgent({
689
+ agentId: asyncAgentId,
690
+ description,
691
+ prompt,
692
+ selectedAgent,
693
+ setAppState: rootSetAppState,
694
+ // Don't link to parent's abort controller -- background agents should
695
+ // survive when the user presses ESC to cancel the main thread.
696
+ // They are killed explicitly via chat:killAgents.
697
+ toolUseId: toolUseContext.toolUseId
698
+ });
699
+
700
+ // Register name → agentId for SendMessage routing. Post-registerAsyncAgent
701
+ // so we don't leave a stale entry if spawn fails. Sync agents skipped —
702
+ // coordinator is blocked, so SendMessage routing doesn't apply.
703
+ if (name) {
704
+ rootSetAppState(prev => {
705
+ const next = new Map(prev.agentNameRegistry);
706
+ next.set(name, asAgentId(asyncAgentId));
707
+ return {
708
+ ...prev,
709
+ agentNameRegistry: next
710
+ };
711
+ });
712
+ }
713
+
714
+ // Wrap async agent execution in agent context for analytics attribution
715
+ const asyncAgentContext = {
716
+ agentId: asyncAgentId,
717
+ // For subagents from teammates: use team lead's session
718
+ // For subagents from main REPL: undefined (no parent session)
719
+ parentSessionId: getParentSessionId(),
720
+ agentType: 'subagent' as const,
721
+ subagentName: selectedAgent.agentType,
722
+ isBuiltIn: isBuiltInAgent(selectedAgent),
723
+ invokingRequestId: assistantMessage?.requestId,
724
+ invocationKind: 'spawn' as const,
725
+ invocationEmitted: false
726
+ };
727
+
728
+ // Workload propagation: handlePromptSubmit wraps the entire turn in
729
+ // runWithWorkload (AsyncLocalStorage). ALS context is captured at
730
+ // invocation time — when this `void` fires — and survives every await
731
+ // inside. No capture/restore needed; the detached closure sees the
732
+ // parent turn's workload automatically, isolated from its finally.
733
+ void runWithAgentContext(asyncAgentContext, () => wrapWithCwd(() => runAsyncAgentLifecycle({
734
+ taskId: agentBackgroundTask.agentId,
735
+ abortController: agentBackgroundTask.abortController!,
736
+ makeStream: onCacheSafeParams => runAgent({
737
+ ...runAgentParams,
738
+ override: {
739
+ ...runAgentParams.override,
740
+ agentId: asAgentId(agentBackgroundTask.agentId),
741
+ abortController: agentBackgroundTask.abortController!
742
+ },
743
+ onCacheSafeParams
744
+ }),
745
+ metadata,
746
+ description,
747
+ toolUseContext,
748
+ rootSetAppState,
749
+ agentIdForCleanup: asyncAgentId,
750
+ enableSummarization: isCoordinator || isForkSubagentEnabled() || getSdkAgentProgressSummariesEnabled(),
751
+ getWorktreeResult: cleanupWorktreeIfNeeded
752
+ })));
753
+ const canReadOutputFile = toolUseContext.options.tools.some(t => toolMatchesName(t, FILE_READ_TOOL_NAME) || toolMatchesName(t, BASH_TOOL_NAME));
754
+ return {
755
+ data: {
756
+ isAsync: true as const,
757
+ status: 'async_launched' as const,
758
+ agentId: agentBackgroundTask.agentId,
759
+ description: description,
760
+ prompt: prompt,
761
+ outputFile: getTaskOutputPath(agentBackgroundTask.agentId),
762
+ canReadOutputFile
763
+ }
764
+ };
765
+ } else {
766
+ // Create an explicit agentId for sync agents
767
+ const syncAgentId = asAgentId(earlyAgentId);
768
+
769
+ // Set up agent context for sync execution (for analytics attribution)
770
+ const syncAgentContext = {
771
+ agentId: syncAgentId,
772
+ // For subagents from teammates: use team lead's session
773
+ // For subagents from main REPL: undefined (no parent session)
774
+ parentSessionId: getParentSessionId(),
775
+ agentType: 'subagent' as const,
776
+ subagentName: selectedAgent.agentType,
777
+ isBuiltIn: isBuiltInAgent(selectedAgent),
778
+ invokingRequestId: assistantMessage?.requestId,
779
+ invocationKind: 'spawn' as const,
780
+ invocationEmitted: false
781
+ };
782
+
783
+ // Wrap entire sync agent execution in context for analytics attribution
784
+ // and optionally in a worktree cwd override for filesystem isolation
785
+ return runWithAgentContext(syncAgentContext, () => wrapWithCwd(async () => {
786
+ const agentMessages: MessageType[] = [];
787
+ const agentStartTime = Date.now();
788
+ const syncTracker = createProgressTracker();
789
+ const syncResolveActivity = createActivityDescriptionResolver(toolUseContext.options.tools);
790
+
791
+ // Yield initial progress message to carry metadata (prompt)
792
+ if (promptMessages.length > 0) {
793
+ const normalizedPromptMessages = normalizeMessages(promptMessages);
794
+ const normalizedFirstMessage = normalizedPromptMessages.find((m): m is NormalizedUserMessage => m.type === 'user');
795
+ if (normalizedFirstMessage && normalizedFirstMessage.type === 'user' && onProgress) {
796
+ onProgress({
797
+ toolUseID: `agent_${assistantMessage.message.id}`,
798
+ data: {
799
+ message: normalizedFirstMessage,
800
+ type: 'agent_progress',
801
+ prompt,
802
+ agentId: syncAgentId
803
+ }
804
+ });
805
+ }
806
+ }
807
+
808
+ // Register as foreground task immediately so it can be backgrounded at any time
809
+ // Skip registration if background tasks are disabled
810
+ let foregroundTaskId: string | undefined;
811
+ // Create the background race promise once outside the loop — otherwise
812
+ // each iteration adds a new .then() reaction to the same pending
813
+ // promise, accumulating callbacks for the lifetime of the agent.
814
+ let backgroundPromise: Promise<{
815
+ type: 'background';
816
+ }> | undefined;
817
+ let cancelAutoBackground: (() => void) | undefined;
818
+ if (!isBackgroundTasksDisabled) {
819
+ const registration = registerAgentForeground({
820
+ agentId: syncAgentId,
821
+ description,
822
+ prompt,
823
+ selectedAgent,
824
+ setAppState: rootSetAppState,
825
+ toolUseId: toolUseContext.toolUseId,
826
+ autoBackgroundMs: getAutoBackgroundMs() || undefined
827
+ });
828
+ foregroundTaskId = registration.taskId;
829
+ backgroundPromise = registration.backgroundSignal.then(() => ({
830
+ type: 'background' as const
831
+ }));
832
+ cancelAutoBackground = registration.cancelAutoBackground;
833
+ }
834
+
835
+ // Track if we've shown the background hint UI
836
+ let backgroundHintShown = false;
837
+ // Track if the agent was backgrounded (cleanup handled by backgrounded finally)
838
+ let wasBackgrounded = false;
839
+ // Per-scope stop function — NOT shared with the backgrounded closure.
840
+ // idempotent: startAgentSummarization's stop() checks `stopped` flag.
841
+ let stopForegroundSummarization: (() => void) | undefined;
842
+ // const capture for sound type narrowing inside the callback below
843
+ const summaryTaskId = foregroundTaskId;
844
+
845
+ // Get async iterator for the agent
846
+ const agentIterator = runAgent({
847
+ ...runAgentParams,
848
+ override: {
849
+ ...runAgentParams.override,
850
+ agentId: syncAgentId
851
+ },
852
+ onCacheSafeParams: summaryTaskId && getSdkAgentProgressSummariesEnabled() ? (params: CacheSafeParams) => {
853
+ const {
854
+ stop
855
+ } = startAgentSummarization(summaryTaskId, syncAgentId, params, rootSetAppState);
856
+ stopForegroundSummarization = stop;
857
+ } : undefined
858
+ })[Symbol.asyncIterator]();
859
+
860
+ // Track if an error occurred during iteration
861
+ let syncAgentError: Error | undefined;
862
+ let wasAborted = false;
863
+ let worktreeResult: {
864
+ worktreePath?: string;
865
+ worktreeBranch?: string;
866
+ } = {};
867
+ try {
868
+ while (true) {
869
+ const elapsed = Date.now() - agentStartTime;
870
+
871
+ // Show background hint after threshold (but task is already registered)
872
+ // Skip if background tasks are disabled
873
+ if (!isBackgroundTasksDisabled && !backgroundHintShown && elapsed >= PROGRESS_THRESHOLD_MS && toolUseContext.setToolJSX) {
874
+ backgroundHintShown = true;
875
+ toolUseContext.setToolJSX({
876
+ jsx: <BackgroundHint />,
877
+ shouldHidePromptInput: false,
878
+ shouldContinueAnimation: true,
879
+ showSpinner: true
880
+ });
881
+ }
882
+
883
+ // Race between next message and background signal
884
+ // If background tasks are disabled, just await the next message directly
885
+ const nextMessagePromise = agentIterator.next();
886
+ const raceResult = backgroundPromise ? await Promise.race([nextMessagePromise.then(r => ({
887
+ type: 'message' as const,
888
+ result: r
889
+ })), backgroundPromise]) : {
890
+ type: 'message' as const,
891
+ result: await nextMessagePromise
892
+ };
893
+
894
+ // Check if we were backgrounded via backgroundAll()
895
+ // foregroundTaskId is guaranteed to be defined if raceResult.type is 'background'
896
+ // because backgroundPromise is only defined when foregroundTaskId is defined
897
+ if (raceResult.type === 'background' && foregroundTaskId) {
898
+ const appState = toolUseContext.getAppState();
899
+ const task = appState.tasks[foregroundTaskId];
900
+ if (isLocalAgentTask(task) && task.isBackgrounded) {
901
+ // Capture the taskId for use in the async callback
902
+ const backgroundedTaskId = foregroundTaskId;
903
+ wasBackgrounded = true;
904
+ // Stop foreground summarization; the backgrounded closure
905
+ // below owns its own independent stop function.
906
+ stopForegroundSummarization?.();
907
+
908
+ // Workload: inherited via ALS at `void` invocation time,
909
+ // same as the async-from-start path above.
910
+ // Continue agent in background and return async result
911
+ void runWithAgentContext(syncAgentContext, async () => {
912
+ let stopBackgroundedSummarization: (() => void) | undefined;
913
+ try {
914
+ // Clean up the foreground iterator so its finally block runs
915
+ // (releases MCP connections, session hooks, prompt cache tracking, etc.)
916
+ // Timeout prevents blocking if MCP server cleanup hangs.
917
+ // .catch() prevents unhandled rejection if timeout wins the race.
918
+ await Promise.race([agentIterator.return(undefined).catch(() => {}), sleep(1000)]);
919
+ // Initialize progress tracking from existing messages
920
+ const tracker = createProgressTracker();
921
+ const resolveActivity2 = createActivityDescriptionResolver(toolUseContext.options.tools);
922
+ for (const existingMsg of agentMessages) {
923
+ updateProgressFromMessage(tracker, existingMsg, resolveActivity2, toolUseContext.options.tools);
924
+ }
925
+ for await (const msg of runAgent({
926
+ ...runAgentParams,
927
+ isAsync: true,
928
+ // Agent is now running in background
929
+ override: {
930
+ ...runAgentParams.override,
931
+ agentId: asAgentId(backgroundedTaskId),
932
+ abortController: task.abortController
933
+ },
934
+ onCacheSafeParams: getSdkAgentProgressSummariesEnabled() ? (params: CacheSafeParams) => {
935
+ const {
936
+ stop
937
+ } = startAgentSummarization(backgroundedTaskId, asAgentId(backgroundedTaskId), params, rootSetAppState);
938
+ stopBackgroundedSummarization = stop;
939
+ } : undefined
940
+ })) {
941
+ agentMessages.push(msg);
942
+
943
+ // Track progress for backgrounded agents
944
+ updateProgressFromMessage(tracker, msg, resolveActivity2, toolUseContext.options.tools);
945
+ updateAsyncAgentProgress(backgroundedTaskId, getProgressUpdate(tracker), rootSetAppState);
946
+ const lastToolName = getLastToolUseName(msg);
947
+ if (lastToolName) {
948
+ emitTaskProgress(tracker, backgroundedTaskId, toolUseContext.toolUseId, description, startTime, lastToolName);
949
+ }
950
+ }
951
+ const agentResult = finalizeAgentTool(agentMessages, backgroundedTaskId, metadata);
952
+
953
+ // Mark task completed FIRST so TaskOutput(block=true)
954
+ // unblocks immediately. classifyHandoffIfNeeded and
955
+ // cleanupWorktreeIfNeeded can hang — they must not gate
956
+ // the status transition (gh-20236).
957
+ completeAsyncAgent(agentResult, rootSetAppState);
958
+
959
+ // Extract text from agent result content for the notification
960
+ let finalMessage = extractTextContent(agentResult.content, '\n');
961
+ if (feature('TRANSCRIPT_CLASSIFIER')) {
962
+ const backgroundedAppState = toolUseContext.getAppState();
963
+ const handoffWarning = await classifyHandoffIfNeeded({
964
+ agentMessages,
965
+ tools: toolUseContext.options.tools,
966
+ toolPermissionContext: backgroundedAppState.toolPermissionContext,
967
+ abortSignal: task.abortController!.signal,
968
+ subagentType: selectedAgent.agentType,
969
+ totalToolUseCount: agentResult.totalToolUseCount
970
+ });
971
+ if (handoffWarning) {
972
+ finalMessage = `${handoffWarning}\n\n${finalMessage}`;
973
+ }
974
+ }
975
+
976
+ // Clean up worktree before notification so we can include it
977
+ const worktreeResult = await cleanupWorktreeIfNeeded();
978
+ enqueueAgentNotification({
979
+ taskId: backgroundedTaskId,
980
+ description,
981
+ status: 'completed',
982
+ setAppState: rootSetAppState,
983
+ finalMessage,
984
+ usage: {
985
+ totalTokens: getTokenCountFromTracker(tracker),
986
+ toolUses: agentResult.totalToolUseCount,
987
+ durationMs: agentResult.totalDurationMs
988
+ },
989
+ toolUseId: toolUseContext.toolUseId,
990
+ ...worktreeResult
991
+ });
992
+ } catch (error) {
993
+ if (error instanceof AbortError) {
994
+ // Transition status BEFORE worktree cleanup so
995
+ // TaskOutput unblocks even if git hangs (gh-20236).
996
+ killAsyncAgent(backgroundedTaskId, rootSetAppState);
997
+ logEvent('tengu_agent_tool_terminated', {
998
+ agent_type: metadata.agentType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
999
+ model: metadata.resolvedAgentModel as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
1000
+ duration_ms: Date.now() - metadata.startTime,
1001
+ is_async: true,
1002
+ is_built_in_agent: metadata.isBuiltInAgent,
1003
+ reason: 'user_cancel_background' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
1004
+ });
1005
+ const worktreeResult = await cleanupWorktreeIfNeeded();
1006
+ const partialResult = extractPartialResult(agentMessages);
1007
+ enqueueAgentNotification({
1008
+ taskId: backgroundedTaskId,
1009
+ description,
1010
+ status: 'killed',
1011
+ setAppState: rootSetAppState,
1012
+ toolUseId: toolUseContext.toolUseId,
1013
+ finalMessage: partialResult,
1014
+ ...worktreeResult
1015
+ });
1016
+ return;
1017
+ }
1018
+ const errMsg = errorMessage(error);
1019
+ failAsyncAgent(backgroundedTaskId, errMsg, rootSetAppState);
1020
+ const worktreeResult = await cleanupWorktreeIfNeeded();
1021
+ enqueueAgentNotification({
1022
+ taskId: backgroundedTaskId,
1023
+ description,
1024
+ status: 'failed',
1025
+ error: errMsg,
1026
+ setAppState: rootSetAppState,
1027
+ toolUseId: toolUseContext.toolUseId,
1028
+ ...worktreeResult
1029
+ });
1030
+ } finally {
1031
+ stopBackgroundedSummarization?.();
1032
+ clearInvokedSkillsForAgent(syncAgentId);
1033
+ clearDumpState(syncAgentId);
1034
+ // Note: worktree cleanup is done before enqueueAgentNotification
1035
+ // in both try and catch paths so we can include worktree info
1036
+ }
1037
+ });
1038
+
1039
+ // Return async_launched result immediately
1040
+ const canReadOutputFile = toolUseContext.options.tools.some(t => toolMatchesName(t, FILE_READ_TOOL_NAME) || toolMatchesName(t, BASH_TOOL_NAME));
1041
+ return {
1042
+ data: {
1043
+ isAsync: true as const,
1044
+ status: 'async_launched' as const,
1045
+ agentId: backgroundedTaskId,
1046
+ description: description,
1047
+ prompt: prompt,
1048
+ outputFile: getTaskOutputPath(backgroundedTaskId),
1049
+ canReadOutputFile
1050
+ }
1051
+ };
1052
+ }
1053
+ }
1054
+
1055
+ // Process the message from the race result
1056
+ if (raceResult.type !== 'message') {
1057
+ // This shouldn't happen - background case handled above
1058
+ continue;
1059
+ }
1060
+ const {
1061
+ result
1062
+ } = raceResult;
1063
+ if (result.done) break;
1064
+ const message = result.value;
1065
+ agentMessages.push(message);
1066
+
1067
+ // Emit task_progress for the VS Code subagent panel
1068
+ updateProgressFromMessage(syncTracker, message, syncResolveActivity, toolUseContext.options.tools);
1069
+ if (foregroundTaskId) {
1070
+ const lastToolName = getLastToolUseName(message);
1071
+ if (lastToolName) {
1072
+ emitTaskProgress(syncTracker, foregroundTaskId, toolUseContext.toolUseId, description, agentStartTime, lastToolName);
1073
+ // Keep AppState task.progress in sync when SDK summaries are
1074
+ // enabled, so updateAgentSummary reads correct token/tool counts
1075
+ // instead of zeros.
1076
+ if (getSdkAgentProgressSummariesEnabled()) {
1077
+ updateAsyncAgentProgress(foregroundTaskId, getProgressUpdate(syncTracker), rootSetAppState);
1078
+ }
1079
+ }
1080
+ }
1081
+
1082
+ // Forward bash_progress events from sub-agent to parent so the SDK
1083
+ // receives tool_progress events just as it does for the main agent.
1084
+ if (message.type === 'progress' && (message.data.type === 'bash_progress' || message.data.type === 'powershell_progress') && onProgress) {
1085
+ onProgress({
1086
+ toolUseID: message.toolUseID,
1087
+ data: message.data
1088
+ });
1089
+ }
1090
+ if (message.type !== 'assistant' && message.type !== 'user') {
1091
+ continue;
1092
+ }
1093
+
1094
+ // Increment token count in spinner for assistant messages
1095
+ // Subagent streaming events are filtered out in runAgent.ts, so we
1096
+ // need to count tokens from completed messages here
1097
+ if (message.type === 'assistant') {
1098
+ const contentLength = getAssistantMessageContentLength(message);
1099
+ if (contentLength > 0) {
1100
+ toolUseContext.setResponseLength(len => len + contentLength);
1101
+ }
1102
+ }
1103
+ const normalizedNew = normalizeMessages([message]);
1104
+ for (const m of normalizedNew) {
1105
+ for (const content of m.message.content) {
1106
+ if (content.type !== 'tool_use' && content.type !== 'tool_result') {
1107
+ continue;
1108
+ }
1109
+
1110
+ // Forward progress updates
1111
+ if (onProgress) {
1112
+ onProgress({
1113
+ toolUseID: `agent_${assistantMessage.message.id}`,
1114
+ data: {
1115
+ message: m,
1116
+ type: 'agent_progress',
1117
+ // prompt only needed on first progress message (UI.tsx:624
1118
+ // reads progressMessages[0]). Omit here to avoid duplication.
1119
+ prompt: '',
1120
+ agentId: syncAgentId
1121
+ }
1122
+ });
1123
+ }
1124
+ }
1125
+ }
1126
+ }
1127
+ } catch (error) {
1128
+ // Handle errors from the sync agent loop
1129
+ // AbortError should be re-thrown for proper interruption handling
1130
+ if (error instanceof AbortError) {
1131
+ wasAborted = true;
1132
+ logEvent('tengu_agent_tool_terminated', {
1133
+ agent_type: metadata.agentType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
1134
+ model: metadata.resolvedAgentModel as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
1135
+ duration_ms: Date.now() - metadata.startTime,
1136
+ is_async: false,
1137
+ is_built_in_agent: metadata.isBuiltInAgent,
1138
+ reason: 'user_cancel_sync' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
1139
+ });
1140
+ throw error;
1141
+ }
1142
+
1143
+ // Log the error for debugging
1144
+ logForDebugging(`Sync agent error: ${errorMessage(error)}`, {
1145
+ level: 'error'
1146
+ });
1147
+
1148
+ // Store the error to handle after cleanup
1149
+ syncAgentError = toError(error);
1150
+ } finally {
1151
+ // Clear the background hint UI
1152
+ if (toolUseContext.setToolJSX) {
1153
+ toolUseContext.setToolJSX(null);
1154
+ }
1155
+
1156
+ // Stop foreground summarization. Idempotent — if already stopped at
1157
+ // the backgrounding transition, this is a no-op. The backgrounded
1158
+ // closure owns a separate stop function (stopBackgroundedSummarization).
1159
+ stopForegroundSummarization?.();
1160
+
1161
+ // Unregister foreground task if agent completed without being backgrounded
1162
+ if (foregroundTaskId) {
1163
+ unregisterAgentForeground(foregroundTaskId, rootSetAppState);
1164
+ // Notify SDK consumers (e.g. VS Code subagent panel) that this
1165
+ // foreground agent is done. Goes through drainSdkEvents() — does
1166
+ // NOT trigger the print.ts XML task_notification parser or the LLM loop.
1167
+ if (!wasBackgrounded) {
1168
+ const progress = getProgressUpdate(syncTracker);
1169
+ enqueueSdkEvent({
1170
+ type: 'system',
1171
+ subtype: 'task_notification',
1172
+ task_id: foregroundTaskId,
1173
+ tool_use_id: toolUseContext.toolUseId,
1174
+ status: syncAgentError ? 'failed' : wasAborted ? 'stopped' : 'completed',
1175
+ output_file: '',
1176
+ summary: description,
1177
+ usage: {
1178
+ total_tokens: progress.tokenCount,
1179
+ tool_uses: progress.toolUseCount,
1180
+ duration_ms: Date.now() - agentStartTime
1181
+ }
1182
+ });
1183
+ }
1184
+ }
1185
+
1186
+ // Clean up scoped skills so they don't accumulate in the global map
1187
+ clearInvokedSkillsForAgent(syncAgentId);
1188
+
1189
+ // Clean up dumpState entry for this agent to prevent unbounded growth
1190
+ // Skip if backgrounded — the backgrounded agent's finally handles cleanup
1191
+ if (!wasBackgrounded) {
1192
+ clearDumpState(syncAgentId);
1193
+ }
1194
+
1195
+ // Cancel auto-background timer if agent completed before it fired
1196
+ cancelAutoBackground?.();
1197
+
1198
+ // Clean up worktree if applicable (in finally to handle abort/error paths)
1199
+ // Skip if backgrounded — the background continuation is still running in it
1200
+ if (!wasBackgrounded) {
1201
+ worktreeResult = await cleanupWorktreeIfNeeded();
1202
+ }
1203
+ }
1204
+
1205
+ // Re-throw abort errors
1206
+ // TODO: Find a cleaner way to express this
1207
+ const lastMessage = agentMessages.findLast(_ => _.type !== 'system' && _.type !== 'progress');
1208
+ if (lastMessage && isSyntheticMessage(lastMessage)) {
1209
+ logEvent('tengu_agent_tool_terminated', {
1210
+ agent_type: metadata.agentType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
1211
+ model: metadata.resolvedAgentModel as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
1212
+ duration_ms: Date.now() - metadata.startTime,
1213
+ is_async: false,
1214
+ is_built_in_agent: metadata.isBuiltInAgent,
1215
+ reason: 'user_cancel_sync' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
1216
+ });
1217
+ throw new AbortError();
1218
+ }
1219
+
1220
+ // If an error occurred during iteration, try to return a result with
1221
+ // whatever messages we have. If we have no assistant messages,
1222
+ // re-throw the error so it's properly handled by the tool framework.
1223
+ if (syncAgentError) {
1224
+ // Check if we have any assistant messages to return
1225
+ const hasAssistantMessages = agentMessages.some(msg => msg.type === 'assistant');
1226
+ if (!hasAssistantMessages) {
1227
+ // No messages collected, re-throw the error
1228
+ throw syncAgentError;
1229
+ }
1230
+
1231
+ // We have some messages, try to finalize and return them
1232
+ // This allows the parent agent to see partial progress even after an error
1233
+ logForDebugging(`Sync agent recovering from error with ${agentMessages.length} messages`);
1234
+ }
1235
+ const agentResult = finalizeAgentTool(agentMessages, syncAgentId, metadata);
1236
+ if (feature('TRANSCRIPT_CLASSIFIER')) {
1237
+ const currentAppState = toolUseContext.getAppState();
1238
+ const handoffWarning = await classifyHandoffIfNeeded({
1239
+ agentMessages,
1240
+ tools: toolUseContext.options.tools,
1241
+ toolPermissionContext: currentAppState.toolPermissionContext,
1242
+ abortSignal: toolUseContext.abortController.signal,
1243
+ subagentType: selectedAgent.agentType,
1244
+ totalToolUseCount: agentResult.totalToolUseCount
1245
+ });
1246
+ if (handoffWarning) {
1247
+ agentResult.content = [{
1248
+ type: 'text' as const,
1249
+ text: handoffWarning
1250
+ }, ...agentResult.content];
1251
+ }
1252
+ }
1253
+ return {
1254
+ data: {
1255
+ status: 'completed' as const,
1256
+ prompt,
1257
+ ...agentResult,
1258
+ ...worktreeResult
1259
+ }
1260
+ };
1261
+ }));
1262
+ }
1263
+ },
1264
+ isReadOnly() {
1265
+ return true; // delegates permission checks to its underlying tools
1266
+ },
1267
+ toAutoClassifierInput(input) {
1268
+ const i = input as AgentToolInput;
1269
+ const tags = [i.subagent_type, i.mode ? `mode=${i.mode}` : undefined].filter((t): t is string => t !== undefined);
1270
+ const prefix = tags.length > 0 ? `(${tags.join(', ')}): ` : ': ';
1271
+ return `${prefix}${i.prompt}`;
1272
+ },
1273
+ isConcurrencySafe() {
1274
+ return true;
1275
+ },
1276
+ userFacingName,
1277
+ userFacingNameBackgroundColor,
1278
+ getActivityDescription(input) {
1279
+ return input?.description ?? 'Running task';
1280
+ },
1281
+ async checkPermissions(input, context): Promise<PermissionResult> {
1282
+ const appState = context.getAppState();
1283
+
1284
+ // Only route through auto mode classifier when in auto mode
1285
+ // In all other modes, auto-approve sub-agent generation
1286
+ // Note: "external" === 'ant' guard enables dead code elimination for external builds
1287
+ if ("external" === 'ant' && appState.toolPermissionContext.mode === 'auto') {
1288
+ return {
1289
+ behavior: 'passthrough',
1290
+ message: 'Agent tool requires permission to spawn sub-agents.'
1291
+ };
1292
+ }
1293
+ return {
1294
+ behavior: 'allow',
1295
+ updatedInput: input
1296
+ };
1297
+ },
1298
+ mapToolResultToToolResultBlockParam(data, toolUseID) {
1299
+ // Multi-agent spawn result
1300
+ const internalData = data as InternalOutput;
1301
+ if (typeof internalData === 'object' && internalData !== null && 'status' in internalData && internalData.status === 'teammate_spawned') {
1302
+ const spawnData = internalData as TeammateSpawnedOutput;
1303
+ return {
1304
+ tool_use_id: toolUseID,
1305
+ type: 'tool_result',
1306
+ content: [{
1307
+ type: 'text',
1308
+ text: `Spawned successfully.
1309
+ agent_id: ${spawnData.teammate_id}
1310
+ name: ${spawnData.name}
1311
+ team_name: ${spawnData.team_name}
1312
+ The agent is now running and will receive instructions via mailbox.`
1313
+ }]
1314
+ };
1315
+ }
1316
+ if ('status' in internalData && internalData.status === 'remote_launched') {
1317
+ const r = internalData;
1318
+ return {
1319
+ tool_use_id: toolUseID,
1320
+ type: 'tool_result',
1321
+ content: [{
1322
+ type: 'text',
1323
+ text: `Remote agent launched in CCR.\ntaskId: ${r.taskId}\nsession_url: ${r.sessionUrl}\noutput_file: ${r.outputFile}\nThe agent is running remotely. You will be notified automatically when it completes.\nBriefly tell the user what you launched and end your response.`
1324
+ }]
1325
+ };
1326
+ }
1327
+ if (data.status === 'async_launched') {
1328
+ const prefix = `Async agent launched successfully.\nagentId: ${data.agentId} (internal ID - do not mention to user. Use SendMessage with to: '${data.agentId}' to continue this agent.)\nThe agent is working in the background. You will be notified automatically when it completes.`;
1329
+ const instructions = data.canReadOutputFile ? `Do not duplicate this agent's work — avoid working with the same files or topics it is using. Work on non-overlapping tasks, or briefly tell the user what you launched and end your response.\noutput_file: ${data.outputFile}\nIf asked, you can check progress before completion by using ${FILE_READ_TOOL_NAME} or ${BASH_TOOL_NAME} tail on the output file.` : `Briefly tell the user what you launched and end your response. Do not generate any other text — agent results will arrive in a subsequent message.`;
1330
+ const text = `${prefix}\n${instructions}`;
1331
+ return {
1332
+ tool_use_id: toolUseID,
1333
+ type: 'tool_result',
1334
+ content: [{
1335
+ type: 'text',
1336
+ text
1337
+ }]
1338
+ };
1339
+ }
1340
+ if (data.status === 'completed') {
1341
+ const worktreeData = data as Record<string, unknown>;
1342
+ const worktreeInfoText = worktreeData.worktreePath ? `\nworktreePath: ${worktreeData.worktreePath}\nworktreeBranch: ${worktreeData.worktreeBranch}` : '';
1343
+ // If the subagent completes with no content, the tool_result is just the
1344
+ // agentId/usage trailer below — a metadata-only block at the prompt tail.
1345
+ // Some models read that as "nothing to act on" and end their turn
1346
+ // immediately. Say so explicitly so the parent has something to react to.
1347
+ const contentOrMarker = data.content.length > 0 ? data.content : [{
1348
+ type: 'text' as const,
1349
+ text: '(Subagent completed but returned no output.)'
1350
+ }];
1351
+ // One-shot built-ins (Explore, Plan) are never continued via SendMessage
1352
+ // — the agentId hint and <usage> block are dead weight (~135 chars ×
1353
+ // 34M Explore runs/week ≈ 1-2 Gtok/week). Telemetry doesn't parse this
1354
+ // block (it uses logEvent in finalizeAgentTool), so dropping is safe.
1355
+ // agentType is optional for resume compat — missing means show trailer.
1356
+ if (data.agentType && ONE_SHOT_BUILTIN_AGENT_TYPES.has(data.agentType) && !worktreeInfoText) {
1357
+ return {
1358
+ tool_use_id: toolUseID,
1359
+ type: 'tool_result',
1360
+ content: contentOrMarker
1361
+ };
1362
+ }
1363
+ return {
1364
+ tool_use_id: toolUseID,
1365
+ type: 'tool_result',
1366
+ content: [...contentOrMarker, {
1367
+ type: 'text',
1368
+ text: `agentId: ${data.agentId} (use SendMessage with to: '${data.agentId}' to continue this agent)${worktreeInfoText}
1369
+ <usage>total_tokens: ${data.totalTokens}
1370
+ tool_uses: ${data.totalToolUseCount}
1371
+ duration_ms: ${data.totalDurationMs}</usage>`
1372
+ }]
1373
+ };
1374
+ }
1375
+ data satisfies never;
1376
+ throw new Error(`Unexpected agent tool result status: ${(data as {
1377
+ status: string;
1378
+ }).status}`);
1379
+ },
1380
+ renderToolResultMessage,
1381
+ renderToolUseMessage,
1382
+ renderToolUseTag,
1383
+ renderToolUseProgressMessage,
1384
+ renderToolUseRejectedMessage,
1385
+ renderToolUseErrorMessage,
1386
+ renderGroupedToolUse: renderGroupedAgentToolUse
1387
+ } satisfies ToolDef<InputSchema, Output, Progress>);
1388
+ function resolveTeamName(input: {
1389
+ team_name?: string;
1390
+ }, appState: {
1391
+ teamContext?: {
1392
+ teamName: string;
1393
+ };
1394
+ }): string | undefined {
1395
+ if (!isAgentSwarmsEnabled()) return undefined;
1396
+ return input.team_name || appState.teamContext?.teamName;
1397
+ }
1398
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmZWF0dXJlIiwiUmVhY3QiLCJidWlsZFRvb2wiLCJUb29sRGVmIiwidG9vbE1hdGNoZXNOYW1lIiwiTWVzc2FnZSIsIk1lc3NhZ2VUeXBlIiwiTm9ybWFsaXplZFVzZXJNZXNzYWdlIiwiZ2V0UXVlcnlTb3VyY2VGb3JBZ2VudCIsInoiLCJjbGVhckludm9rZWRTa2lsbHNGb3JBZ2VudCIsImdldFNka0FnZW50UHJvZ3Jlc3NTdW1tYXJpZXNFbmFibGVkIiwiZW5oYW5jZVN5c3RlbVByb21wdFdpdGhFbnZEZXRhaWxzIiwiZ2V0U3lzdGVtUHJvbXB0IiwiaXNDb29yZGluYXRvck1vZGUiLCJzdGFydEFnZW50U3VtbWFyaXphdGlvbiIsImdldEZlYXR1cmVWYWx1ZV9DQUNIRURfTUFZX0JFX1NUQUxFIiwiQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyIsImxvZ0V2ZW50IiwiY2xlYXJEdW1wU3RhdGUiLCJjb21wbGV0ZUFnZW50VGFzayIsImNvbXBsZXRlQXN5bmNBZ2VudCIsImNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb25SZXNvbHZlciIsImNyZWF0ZVByb2dyZXNzVHJhY2tlciIsImVucXVldWVBZ2VudE5vdGlmaWNhdGlvbiIsImZhaWxBZ2VudFRhc2siLCJmYWlsQXN5bmNBZ2VudCIsImdldFByb2dyZXNzVXBkYXRlIiwiZ2V0VG9rZW5Db3VudEZyb21UcmFja2VyIiwiaXNMb2NhbEFnZW50VGFzayIsImtpbGxBc3luY0FnZW50IiwicmVnaXN0ZXJBZ2VudEZvcmVncm91bmQiLCJyZWdpc3RlckFzeW5jQWdlbnQiLCJ1bnJlZ2lzdGVyQWdlbnRGb3JlZ3JvdW5kIiwidXBkYXRlQWdlbnRQcm9ncmVzcyIsInVwZGF0ZUFzeW5jQWdlbnRQcm9ncmVzcyIsInVwZGF0ZVByb2dyZXNzRnJvbU1lc3NhZ2UiLCJjaGVja1JlbW90ZUFnZW50RWxpZ2liaWxpdHkiLCJmb3JtYXRQcmVjb25kaXRpb25FcnJvciIsImdldFJlbW90ZVRhc2tTZXNzaW9uVXJsIiwicmVnaXN0ZXJSZW1vdGVBZ2VudFRhc2siLCJhc3NlbWJsZVRvb2xQb29sIiwiYXNBZ2VudElkIiwicnVuV2l0aEFnZW50Q29udGV4dCIsImlzQWdlbnRTd2FybXNFbmFibGVkIiwiZ2V0Q3dkIiwicnVuV2l0aEN3ZE92ZXJyaWRlIiwibG9nRm9yRGVidWdnaW5nIiwiaXNFbnZUcnV0aHkiLCJBYm9ydEVycm9yIiwiZXJyb3JNZXNzYWdlIiwidG9FcnJvciIsIkNhY2hlU2FmZVBhcmFtcyIsImxhenlTY2hlbWEiLCJjcmVhdGVVc2VyTWVzc2FnZSIsImV4dHJhY3RUZXh0Q29udGVudCIsImlzU3ludGhldGljTWVzc2FnZSIsIm5vcm1hbGl6ZU1lc3NhZ2VzIiwiZ2V0QWdlbnRNb2RlbCIsInBlcm1pc3Npb25Nb2RlU2NoZW1hIiwiUGVybWlzc2lvblJlc3VsdCIsImZpbHRlckRlbmllZEFnZW50cyIsImdldERlbnlSdWxlRm9yQWdlbnQiLCJlbnF1ZXVlU2RrRXZlbnQiLCJ3cml0ZUFnZW50TWV0YWRhdGEiLCJzbGVlcCIsImJ1aWxkRWZmZWN0aXZlU3lzdGVtUHJvbXB0IiwiYXNTeXN0ZW1Qcm9tcHQiLCJnZXRUYXNrT3V0cHV0UGF0aCIsImdldFBhcmVudFNlc3Npb25JZCIsImlzVGVhbW1hdGUiLCJpc0luUHJvY2Vzc1RlYW1tYXRlIiwidGVsZXBvcnRUb1JlbW90ZSIsImdldEFzc2lzdGFudE1lc3NhZ2VDb250ZW50TGVuZ3RoIiwiY3JlYXRlQWdlbnRJZCIsImNyZWF0ZUFnZW50V29ya3RyZWUiLCJoYXNXb3JrdHJlZUNoYW5nZXMiLCJyZW1vdmVBZ2VudFdvcmt0cmVlIiwiQkFTSF9UT09MX05BTUUiLCJCYWNrZ3JvdW5kSGludCIsIkZJTEVfUkVBRF9UT09MX05BTUUiLCJzcGF3blRlYW1tYXRlIiwic2V0QWdlbnRDb2xvciIsImFnZW50VG9vbFJlc3VsdFNjaGVtYSIsImNsYXNzaWZ5SGFuZG9mZklmTmVlZGVkIiwiZW1pdFRhc2tQcm9ncmVzcyIsImV4dHJhY3RQYXJ0aWFsUmVzdWx0IiwiZmluYWxpemVBZ2VudFRvb2wiLCJnZXRMYXN0VG9vbFVzZU5hbWUiLCJydW5Bc3luY0FnZW50TGlmZWN5Y2xlIiwiR0VORVJBTF9QVVJQT1NFX0FHRU5UIiwiQUdFTlRfVE9PTF9OQU1FIiwiTEVHQUNZX0FHRU5UX1RPT0xfTkFNRSIsIk9ORV9TSE9UX0JVSUxUSU5fQUdFTlRfVFlQRVMiLCJidWlsZEZvcmtlZE1lc3NhZ2VzIiwiYnVpbGRXb3JrdHJlZU5vdGljZSIsIkZPUktfQUdFTlQiLCJpc0ZvcmtTdWJhZ2VudEVuYWJsZWQiLCJpc0luRm9ya0NoaWxkIiwiQWdlbnREZWZpbml0aW9uIiwiZmlsdGVyQWdlbnRzQnlNY3BSZXF1aXJlbWVudHMiLCJoYXNSZXF1aXJlZE1jcFNlcnZlcnMiLCJpc0J1aWx0SW5BZ2VudCIsImdldFByb21wdCIsInJ1bkFnZW50IiwicmVuZGVyR3JvdXBlZEFnZW50VG9vbFVzZSIsInJlbmRlclRvb2xSZXN1bHRNZXNzYWdlIiwicmVuZGVyVG9vbFVzZUVycm9yTWVzc2FnZSIsInJlbmRlclRvb2xVc2VNZXNzYWdlIiwicmVuZGVyVG9vbFVzZVByb2dyZXNzTWVzc2FnZSIsInJlbmRlclRvb2xVc2VSZWplY3RlZE1lc3NhZ2UiLCJyZW5kZXJUb29sVXNlVGFnIiwidXNlckZhY2luZ05hbWUiLCJ1c2VyRmFjaW5nTmFtZUJhY2tncm91bmRDb2xvciIsInByb2FjdGl2ZU1vZHVsZSIsInJlcXVpcmUiLCJQUk9HUkVTU19USFJFU0hPTERfTVMiLCJpc0JhY2tncm91bmRUYXNrc0Rpc2FibGVkIiwicHJvY2VzcyIsImVudiIsIkNMQVVERV9DT0RFX0RJU0FCTEVfQkFDS0dST1VORF9UQVNLUyIsImdldEF1dG9CYWNrZ3JvdW5kTXMiLCJDTEFVREVfQVVUT19CQUNLR1JPVU5EX1RBU0tTIiwiYmFzZUlucHV0U2NoZW1hIiwib2JqZWN0IiwiZGVzY3JpcHRpb24iLCJzdHJpbmciLCJkZXNjcmliZSIsInByb21wdCIsInN1YmFnZW50X3R5cGUiLCJvcHRpb25hbCIsIm1vZGVsIiwiZW51bSIsInJ1bl9pbl9iYWNrZ3JvdW5kIiwiYm9vbGVhbiIsImZ1bGxJbnB1dFNjaGVtYSIsIm11bHRpQWdlbnRJbnB1dFNjaGVtYSIsIm5hbWUiLCJ0ZWFtX25hbWUiLCJtb2RlIiwibWVyZ2UiLCJleHRlbmQiLCJpc29sYXRpb24iLCJjd2QiLCJpbnB1dFNjaGVtYSIsInNjaGVtYSIsIm9taXQiLCJJbnB1dFNjaGVtYSIsIlJldHVyblR5cGUiLCJBZ2VudFRvb2xJbnB1dCIsImluZmVyIiwib3V0cHV0U2NoZW1hIiwic3luY091dHB1dFNjaGVtYSIsInN0YXR1cyIsImxpdGVyYWwiLCJhc3luY091dHB1dFNjaGVtYSIsImFnZW50SWQiLCJvdXRwdXRGaWxlIiwiY2FuUmVhZE91dHB1dEZpbGUiLCJ1bmlvbiIsIk91dHB1dFNjaGVtYSIsIk91dHB1dCIsImlucHV0IiwiVGVhbW1hdGVTcGF3bmVkT3V0cHV0IiwidGVhbW1hdGVfaWQiLCJhZ2VudF9pZCIsImFnZW50X3R5cGUiLCJjb2xvciIsInRtdXhfc2Vzc2lvbl9uYW1lIiwidG11eF93aW5kb3dfbmFtZSIsInRtdXhfcGFuZV9pZCIsImlzX3NwbGl0cGFuZSIsInBsYW5fbW9kZV9yZXF1aXJlZCIsIlJlbW90ZUxhdW5jaGVkT3V0cHV0IiwidGFza0lkIiwic2Vzc2lvblVybCIsIkludGVybmFsT3V0cHV0IiwiQWdlbnRUb29sUHJvZ3Jlc3MiLCJTaGVsbFByb2dyZXNzIiwiUHJvZ3Jlc3MiLCJBZ2VudFRvb2wiLCJhZ2VudHMiLCJ0b29scyIsImdldFRvb2xQZXJtaXNzaW9uQ29udGV4dCIsImFsbG93ZWRBZ2VudFR5cGVzIiwidG9vbFBlcm1pc3Npb25Db250ZXh0IiwibWNwU2VydmVyc1dpdGhUb29scyIsInRvb2wiLCJzdGFydHNXaXRoIiwicGFydHMiLCJzcGxpdCIsInNlcnZlck5hbWUiLCJpbmNsdWRlcyIsInB1c2giLCJhZ2VudHNXaXRoTWNwUmVxdWlyZW1lbnRzTWV0IiwiZmlsdGVyZWRBZ2VudHMiLCJpc0Nvb3JkaW5hdG9yIiwiQ0xBVURFX0NPREVfQ09PUkRJTkFUT1JfTU9ERSIsInNlYXJjaEhpbnQiLCJhbGlhc2VzIiwibWF4UmVzdWx0U2l6ZUNoYXJzIiwiY2FsbCIsIm1vZGVsUGFyYW0iLCJzcGF3bk1vZGUiLCJ0b29sVXNlQ29udGV4dCIsImNhblVzZVRvb2wiLCJhc3Npc3RhbnRNZXNzYWdlIiwib25Qcm9ncmVzcyIsInN0YXJ0VGltZSIsIkRhdGUiLCJub3ciLCJ1bmRlZmluZWQiLCJhcHBTdGF0ZSIsImdldEFwcFN0YXRlIiwicGVybWlzc2lvbk1vZGUiLCJyb290U2V0QXBwU3RhdGUiLCJzZXRBcHBTdGF0ZUZvclRhc2tzIiwic2V0QXBwU3RhdGUiLCJFcnJvciIsInRlYW1OYW1lIiwicmVzb2x2ZVRlYW1OYW1lIiwiYWdlbnREZWYiLCJvcHRpb25zIiwiYWdlbnREZWZpbml0aW9ucyIsImFjdGl2ZUFnZW50cyIsImZpbmQiLCJhIiwiYWdlbnRUeXBlIiwicmVzdWx0IiwidXNlX3NwbGl0cGFuZSIsImludm9raW5nUmVxdWVzdElkIiwicmVxdWVzdElkIiwic3Bhd25SZXN1bHQiLCJjb25zdCIsImRhdGEiLCJlZmZlY3RpdmVUeXBlIiwiaXNGb3JrUGF0aCIsInNlbGVjdGVkQWdlbnQiLCJxdWVyeVNvdXJjZSIsIm1lc3NhZ2VzIiwiYWxsQWdlbnRzIiwiZmlsdGVyIiwiZm91bmQiLCJhZ2VudCIsImFnZW50RXhpc3RzQnV0RGVuaWVkIiwiZGVueVJ1bGUiLCJzb3VyY2UiLCJtYXAiLCJqb2luIiwiYmFja2dyb3VuZCIsInJlcXVpcmVkTWNwU2VydmVycyIsImxlbmd0aCIsImhhc1BlbmRpbmdSZXF1aXJlZFNlcnZlcnMiLCJtY3AiLCJjbGllbnRzIiwic29tZSIsImMiLCJ0eXBlIiwicGF0dGVybiIsInRvTG93ZXJDYXNlIiwiY3VycmVudEFwcFN0YXRlIiwiTUFYX1dBSVRfTVMiLCJQT0xMX0lOVEVSVkFMX01TIiwiZGVhZGxpbmUiLCJoYXNGYWlsZWRSZXF1aXJlZFNlcnZlciIsInN0aWxsUGVuZGluZyIsInNlcnZlcnNXaXRoVG9vbHMiLCJtaXNzaW5nIiwic2VydmVyIiwicmVzb2x2ZWRBZ2VudE1vZGVsIiwibWFpbkxvb3BNb2RlbCIsImlzX2J1aWx0X2luX2FnZW50IiwiaXNfcmVzdW1lIiwiaXNfYXN5bmMiLCJpc19mb3JrIiwiZWZmZWN0aXZlSXNvbGF0aW9uIiwiZWxpZ2liaWxpdHkiLCJlbGlnaWJsZSIsInJlYXNvbnMiLCJlcnJvcnMiLCJidW5kbGVGYWlsSGludCIsInNlc3Npb24iLCJpbml0aWFsTWVzc2FnZSIsInNpZ25hbCIsImFib3J0Q29udHJvbGxlciIsIm9uQnVuZGxlRmFpbCIsIm1zZyIsInNlc3Npb25JZCIsInJlbW90ZVRhc2tUeXBlIiwiaWQiLCJ0aXRsZSIsImNvbW1hbmQiLCJjb250ZXh0IiwidG9vbFVzZUlkIiwicmVtb3RlUmVzdWx0IiwiZW5oYW5jZWRTeXN0ZW1Qcm9tcHQiLCJmb3JrUGFyZW50U3lzdGVtUHJvbXB0IiwicHJvbXB0TWVzc2FnZXMiLCJyZW5kZXJlZFN5c3RlbVByb21wdCIsIm1haW5UaHJlYWRBZ2VudERlZmluaXRpb24iLCJhZGRpdGlvbmFsV29ya2luZ0RpcmVjdG9yaWVzIiwiQXJyYXkiLCJmcm9tIiwia2V5cyIsImRlZmF1bHRTeXN0ZW1Qcm9tcHQiLCJtY3BDbGllbnRzIiwiY3VzdG9tU3lzdGVtUHJvbXB0IiwiYXBwZW5kU3lzdGVtUHJvbXB0IiwiYWdlbnRQcm9tcHQiLCJtZW1vcnkiLCJzY29wZSIsImVycm9yIiwiY29udGVudCIsIm1ldGFkYXRhIiwiaXNBc3luYyIsImZvcmNlQXN5bmMiLCJhc3Npc3RhbnRGb3JjZUFzeW5jIiwia2Fpcm9zRW5hYmxlZCIsInNob3VsZFJ1bkFzeW5jIiwiaXNQcm9hY3RpdmVBY3RpdmUiLCJ3b3JrZXJQZXJtaXNzaW9uQ29udGV4dCIsIndvcmtlclRvb2xzIiwiZWFybHlBZ2VudElkIiwid29ya3RyZWVJbmZvIiwid29ya3RyZWVQYXRoIiwid29ya3RyZWVCcmFuY2giLCJoZWFkQ29tbWl0IiwiZ2l0Um9vdCIsImhvb2tCYXNlZCIsInNsdWciLCJzbGljZSIsInJ1bkFnZW50UGFyYW1zIiwiUGFyYW1ldGVycyIsImFnZW50RGVmaW5pdGlvbiIsIm92ZXJyaWRlIiwic3lzdGVtUHJvbXB0IiwiYXZhaWxhYmxlVG9vbHMiLCJmb3JrQ29udGV4dE1lc3NhZ2VzIiwidXNlRXhhY3RUb29scyIsImN3ZE92ZXJyaWRlUGF0aCIsIndyYXBXaXRoQ3dkIiwiZm4iLCJUIiwiY2xlYW51cFdvcmt0cmVlSWZOZWVkZWQiLCJQcm9taXNlIiwiY2hhbmdlZCIsImNhdGNoIiwiX2VyciIsImFzeW5jQWdlbnRJZCIsImFnZW50QmFja2dyb3VuZFRhc2siLCJwcmV2IiwibmV4dCIsIk1hcCIsImFnZW50TmFtZVJlZ2lzdHJ5Iiwic2V0IiwiYXN5bmNBZ2VudENvbnRleHQiLCJwYXJlbnRTZXNzaW9uSWQiLCJzdWJhZ2VudE5hbWUiLCJpc0J1aWx0SW4iLCJpbnZvY2F0aW9uS2luZCIsImludm9jYXRpb25FbWl0dGVkIiwibWFrZVN0cmVhbSIsIm9uQ2FjaGVTYWZlUGFyYW1zIiwiYWdlbnRJZEZvckNsZWFudXAiLCJlbmFibGVTdW1tYXJpemF0aW9uIiwiZ2V0V29ya3RyZWVSZXN1bHQiLCJ0Iiwic3luY0FnZW50SWQiLCJzeW5jQWdlbnRDb250ZXh0IiwiYWdlbnRNZXNzYWdlcyIsImFnZW50U3RhcnRUaW1lIiwic3luY1RyYWNrZXIiLCJzeW5jUmVzb2x2ZUFjdGl2aXR5Iiwibm9ybWFsaXplZFByb21wdE1lc3NhZ2VzIiwibm9ybWFsaXplZEZpcnN0TWVzc2FnZSIsIm0iLCJ0b29sVXNlSUQiLCJtZXNzYWdlIiwiZm9yZWdyb3VuZFRhc2tJZCIsImJhY2tncm91bmRQcm9taXNlIiwiY2FuY2VsQXV0b0JhY2tncm91bmQiLCJyZWdpc3RyYXRpb24iLCJhdXRvQmFja2dyb3VuZE1zIiwiYmFja2dyb3VuZFNpZ25hbCIsInRoZW4iLCJiYWNrZ3JvdW5kSGludFNob3duIiwid2FzQmFja2dyb3VuZGVkIiwic3RvcEZvcmVncm91bmRTdW1tYXJpemF0aW9uIiwic3VtbWFyeVRhc2tJZCIsImFnZW50SXRlcmF0b3IiLCJwYXJhbXMiLCJzdG9wIiwiU3ltYm9sIiwiYXN5bmNJdGVyYXRvciIsInN5bmNBZ2VudEVycm9yIiwid2FzQWJvcnRlZCIsIndvcmt0cmVlUmVzdWx0IiwiZWxhcHNlZCIsInNldFRvb2xKU1giLCJqc3giLCJzaG91bGRIaWRlUHJvbXB0SW5wdXQiLCJzaG91bGRDb250aW51ZUFuaW1hdGlvbiIsInNob3dTcGlubmVyIiwibmV4dE1lc3NhZ2VQcm9taXNlIiwicmFjZVJlc3VsdCIsInJhY2UiLCJyIiwidGFzayIsInRhc2tzIiwiaXNCYWNrZ3JvdW5kZWQiLCJiYWNrZ3JvdW5kZWRUYXNrSWQiLCJzdG9wQmFja2dyb3VuZGVkU3VtbWFyaXphdGlvbiIsInJldHVybiIsInRyYWNrZXIiLCJyZXNvbHZlQWN0aXZpdHkyIiwiZXhpc3RpbmdNc2ciLCJsYXN0VG9vbE5hbWUiLCJhZ2VudFJlc3VsdCIsImZpbmFsTWVzc2FnZSIsImJhY2tncm91bmRlZEFwcFN0YXRlIiwiaGFuZG9mZldhcm5pbmciLCJhYm9ydFNpZ25hbCIsInN1YmFnZW50VHlwZSIsInRvdGFsVG9vbFVzZUNvdW50IiwidXNhZ2UiLCJ0b3RhbFRva2VucyIsInRvb2xVc2VzIiwiZHVyYXRpb25NcyIsInRvdGFsRHVyYXRpb25NcyIsImR1cmF0aW9uX21zIiwicmVhc29uIiwicGFydGlhbFJlc3VsdCIsImVyck1zZyIsImRvbmUiLCJ2YWx1ZSIsImNvbnRlbnRMZW5ndGgiLCJzZXRSZXNwb25zZUxlbmd0aCIsImxlbiIsIm5vcm1hbGl6ZWROZXciLCJsZXZlbCIsInByb2dyZXNzIiwic3VidHlwZSIsInRhc2tfaWQiLCJ0b29sX3VzZV9pZCIsIm91dHB1dF9maWxlIiwic3VtbWFyeSIsInRvdGFsX3Rva2VucyIsInRva2VuQ291bnQiLCJ0b29sX3VzZXMiLCJ0b29sVXNlQ291bnQiLCJsYXN0TWVzc2FnZSIsImZpbmRMYXN0IiwiXyIsImhhc0Fzc2lzdGFudE1lc3NhZ2VzIiwidGV4dCIsImlzUmVhZE9ubHkiLCJ0b0F1dG9DbGFzc2lmaWVySW5wdXQiLCJpIiwidGFncyIsInByZWZpeCIsImlzQ29uY3VycmVuY3lTYWZlIiwiZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbiIsImNoZWNrUGVybWlzc2lvbnMiLCJiZWhhdmlvciIsInVwZGF0ZWRJbnB1dCIsIm1hcFRvb2xSZXN1bHRUb1Rvb2xSZXN1bHRCbG9ja1BhcmFtIiwiaW50ZXJuYWxEYXRhIiwic3Bhd25EYXRhIiwiaW5zdHJ1Y3Rpb25zIiwid29ya3RyZWVEYXRhIiwiUmVjb3JkIiwid29ya3RyZWVJbmZvVGV4dCIsImNvbnRlbnRPck1hcmtlciIsImhhcyIsInJlbmRlckdyb3VwZWRUb29sVXNlIiwidGVhbUNvbnRleHQiXSwic291cmNlcyI6WyJBZ2VudFRvb2wudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZlYXR1cmUgfSBmcm9tICdidW46YnVuZGxlJ1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBidWlsZFRvb2wsIHR5cGUgVG9vbERlZiwgdG9vbE1hdGNoZXNOYW1lIH0gZnJvbSAnc3JjL1Rvb2wuanMnXG5pbXBvcnQgdHlwZSB7XG4gIE1lc3NhZ2UgYXMgTWVzc2FnZVR5cGUsXG4gIE5vcm1hbGl6ZWRVc2VyTWVzc2FnZSxcbn0gZnJvbSAnc3JjL3R5cGVzL21lc3NhZ2UuanMnXG5pbXBvcnQgeyBnZXRRdWVyeVNvdXJjZUZvckFnZW50IH0gZnJvbSAnc3JjL3V0aWxzL3Byb21wdENhdGVnb3J5LmpzJ1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZC92NCdcbmltcG9ydCB7XG4gIGNsZWFySW52b2tlZFNraWxsc0ZvckFnZW50LFxuICBnZXRTZGtBZ2VudFByb2dyZXNzU3VtbWFyaWVzRW5hYmxlZCxcbn0gZnJvbSAnLi4vLi4vYm9vdHN0cmFwL3N0YXRlLmpzJ1xuaW1wb3J0IHtcbiAgZW5oYW5jZVN5c3RlbVByb21wdFdpdGhFbnZEZXRhaWxzLFxuICBnZXRTeXN0ZW1Qcm9tcHQsXG59IGZyb20gJy4uLy4uL2NvbnN0YW50cy9wcm9tcHRzLmpzJ1xuaW1wb3J0IHsgaXNDb29yZGluYXRvck1vZGUgfSBmcm9tICcuLi8uLi9jb29yZGluYXRvci9jb29yZGluYXRvck1vZGUuanMnXG5pbXBvcnQgeyBzdGFydEFnZW50U3VtbWFyaXphdGlvbiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0FnZW50U3VtbWFyeS9hZ2VudFN1bW1hcnkuanMnXG5pbXBvcnQgeyBnZXRGZWF0dXJlVmFsdWVfQ0FDSEVEX01BWV9CRV9TVEFMRSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FuYWx5dGljcy9ncm93dGhib29rLmpzJ1xuaW1wb3J0IHtcbiAgdHlwZSBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICBsb2dFdmVudCxcbn0gZnJvbSAnLi4vLi4vc2VydmljZXMvYW5hbHl0aWNzL2luZGV4LmpzJ1xuaW1wb3J0IHsgY2xlYXJEdW1wU3RhdGUgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hcGkvZHVtcFByb21wdHMuanMnXG5pbXBvcnQge1xuICBjb21wbGV0ZUFnZW50VGFzayBhcyBjb21wbGV0ZUFzeW5jQWdlbnQsXG4gIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb25SZXNvbHZlcixcbiAgY3JlYXRlUHJvZ3Jlc3NUcmFja2VyLFxuICBlbnF1ZXVlQWdlbnROb3RpZmljYXRpb24sXG4gIGZhaWxBZ2VudFRhc2sgYXMgZmFpbEFzeW5jQWdlbnQsXG4gIGdldFByb2dyZXNzVXBkYXRlLFxuICBnZXRUb2tlbkNvdW50RnJvbVRyYWNrZXIsXG4gIGlzTG9jYWxBZ2VudFRhc2ssXG4gIGtpbGxBc3luY0FnZW50LFxuICByZWdpc3RlckFnZW50Rm9yZWdyb3VuZCxcbiAgcmVnaXN0ZXJBc3luY0FnZW50LFxuICB1bnJlZ2lzdGVyQWdlbnRGb3JlZ3JvdW5kLFxuICB1cGRhdGVBZ2VudFByb2dyZXNzIGFzIHVwZGF0ZUFzeW5jQWdlbnRQcm9ncmVzcyxcbiAgdXBkYXRlUHJvZ3Jlc3NGcm9tTWVzc2FnZSxcbn0gZnJvbSAnLi4vLi4vdGFza3MvTG9jYWxBZ2VudFRhc2svTG9jYWxBZ2VudFRhc2suanMnXG5pbXBvcnQge1xuICBjaGVja1JlbW90ZUFnZW50RWxpZ2liaWxpdHksXG4gIGZvcm1hdFByZWNvbmRpdGlvbkVycm9yLFxuICBnZXRSZW1vdGVUYXNrU2Vzc2lvblVybCxcbiAgcmVnaXN0ZXJSZW1vdGVBZ2VudFRhc2ssXG59IGZyb20gJy4uLy4uL3Rhc2tzL1JlbW90ZUFnZW50VGFzay9SZW1vdGVBZ2VudFRhc2suanMnXG5pbXBvcnQgeyBhc3NlbWJsZVRvb2xQb29sIH0gZnJvbSAnLi4vLi4vdG9vbHMuanMnXG5pbXBvcnQgeyBhc0FnZW50SWQgfSBmcm9tICcuLi8uLi90eXBlcy9pZHMuanMnXG5pbXBvcnQgeyBydW5XaXRoQWdlbnRDb250ZXh0IH0gZnJvbSAnLi4vLi4vdXRpbHMvYWdlbnRDb250ZXh0LmpzJ1xuaW1wb3J0IHsgaXNBZ2VudFN3YXJtc0VuYWJsZWQgfSBmcm9tICcuLi8uLi91dGlscy9hZ2VudFN3YXJtc0VuYWJsZWQuanMnXG5pbXBvcnQgeyBnZXRDd2QsIHJ1bldpdGhDd2RPdmVycmlkZSB9IGZyb20gJy4uLy4uL3V0aWxzL2N3ZC5qcydcbmltcG9ydCB7IGxvZ0ZvckRlYnVnZ2luZyB9IGZyb20gJy4uLy4uL3V0aWxzL2RlYnVnLmpzJ1xuaW1wb3J0IHsgaXNFbnZUcnV0aHkgfSBmcm9tICcuLi8uLi91dGlscy9lbnZVdGlscy5qcydcbmltcG9ydCB7IEFib3J0RXJyb3IsIGVycm9yTWVzc2FnZSwgdG9FcnJvciB9IGZyb20gJy4uLy4uL3V0aWxzL2Vycm9ycy5qcydcbmltcG9ydCB0eXBlIHsgQ2FjaGVTYWZlUGFyYW1zIH0gZnJvbSAnLi4vLi4vdXRpbHMvZm9ya2VkQWdlbnQuanMnXG5pbXBvcnQgeyBsYXp5U2NoZW1hIH0gZnJvbSAnLi4vLi4vdXRpbHMvbGF6eVNjaGVtYS5qcydcbmltcG9ydCB7XG4gIGNyZWF0ZVVzZXJNZXNzYWdlLFxuICBleHRyYWN0VGV4dENvbnRlbnQsXG4gIGlzU3ludGhldGljTWVzc2FnZSxcbiAgbm9ybWFsaXplTWVzc2FnZXMsXG59IGZyb20gJy4uLy4uL3V0aWxzL21lc3NhZ2VzLmpzJ1xuaW1wb3J0IHsgZ2V0QWdlbnRNb2RlbCB9IGZyb20gJy4uLy4uL3V0aWxzL21vZGVsL2FnZW50LmpzJ1xuaW1wb3J0IHsgcGVybWlzc2lvbk1vZGVTY2hlbWEgfSBmcm9tICcuLi8uLi91dGlscy9wZXJtaXNzaW9ucy9QZXJtaXNzaW9uTW9kZS5qcydcbmltcG9ydCB0eXBlIHsgUGVybWlzc2lvblJlc3VsdCB9IGZyb20gJy4uLy4uL3V0aWxzL3Blcm1pc3Npb25zL1Blcm1pc3Npb25SZXN1bHQuanMnXG5pbXBvcnQge1xuICBmaWx0ZXJEZW5pZWRBZ2VudHMsXG4gIGdldERlbnlSdWxlRm9yQWdlbnQsXG59IGZyb20gJy4uLy4uL3V0aWxzL3Blcm1pc3Npb25zL3Blcm1pc3Npb25zLmpzJ1xuaW1wb3J0IHsgZW5xdWV1ZVNka0V2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvc2RrRXZlbnRRdWV1ZS5qcydcbmltcG9ydCB7IHdyaXRlQWdlbnRNZXRhZGF0YSB9IGZyb20gJy4uLy4uL3V0aWxzL3Nlc3Npb25TdG9yYWdlLmpzJ1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuLi8uLi91dGlscy9zbGVlcC5qcydcbmltcG9ydCB7IGJ1aWxkRWZmZWN0aXZlU3lzdGVtUHJvbXB0IH0gZnJvbSAnLi4vLi4vdXRpbHMvc3lzdGVtUHJvbXB0LmpzJ1xuaW1wb3J0IHsgYXNTeXN0ZW1Qcm9tcHQgfSBmcm9tICcuLi8uLi91dGlscy9zeXN0ZW1Qcm9tcHRUeXBlLmpzJ1xuaW1wb3J0IHsgZ2V0VGFza091dHB1dFBhdGggfSBmcm9tICcuLi8uLi91dGlscy90YXNrL2Rpc2tPdXRwdXQuanMnXG5pbXBvcnQgeyBnZXRQYXJlbnRTZXNzaW9uSWQsIGlzVGVhbW1hdGUgfSBmcm9tICcuLi8uLi91dGlscy90ZWFtbWF0ZS5qcydcbmltcG9ydCB7IGlzSW5Qcm9jZXNzVGVhbW1hdGUgfSBmcm9tICcuLi8uLi91dGlscy90ZWFtbWF0ZUNvbnRleHQuanMnXG5pbXBvcnQgeyB0ZWxlcG9ydFRvUmVtb3RlIH0gZnJvbSAnLi4vLi4vdXRpbHMvdGVsZXBvcnQuanMnXG5pbXBvcnQgeyBnZXRBc3Npc3RhbnRNZXNzYWdlQ29udGVudExlbmd0aCB9IGZyb20gJy4uLy4uL3V0aWxzL3Rva2Vucy5qcydcbmltcG9ydCB7IGNyZWF0ZUFnZW50SWQgfSBmcm9tICcuLi8uLi91dGlscy91dWlkLmpzJ1xuaW1wb3J0IHtcbiAgY3JlYXRlQWdlbnRXb3JrdHJlZSxcbiAgaGFzV29ya3RyZWVDaGFuZ2VzLFxuICByZW1vdmVBZ2VudFdvcmt0cmVlLFxufSBmcm9tICcuLi8uLi91dGlscy93b3JrdHJlZS5qcydcbmltcG9ydCB7IEJBU0hfVE9PTF9OQU1FIH0gZnJvbSAnLi4vQmFzaFRvb2wvdG9vbE5hbWUuanMnXG5pbXBvcnQgeyBCYWNrZ3JvdW5kSGludCB9IGZyb20gJy4uL0Jhc2hUb29sL1VJLmpzJ1xuaW1wb3J0IHsgRklMRV9SRUFEX1RPT0xfTkFNRSB9IGZyb20gJy4uL0ZpbGVSZWFkVG9vbC9wcm9tcHQuanMnXG5pbXBvcnQgeyBzcGF3blRlYW1tYXRlIH0gZnJvbSAnLi4vc2hhcmVkL3NwYXduTXVsdGlBZ2VudC5qcydcbmltcG9ydCB7IHNldEFnZW50Q29sb3IgfSBmcm9tICcuL2FnZW50Q29sb3JNYW5hZ2VyLmpzJ1xuaW1wb3J0IHtcbiAgYWdlbnRUb29sUmVzdWx0U2NoZW1hLFxuICBjbGFzc2lmeUhhbmRvZmZJZk5lZWRlZCxcbiAgZW1pdFRhc2tQcm9ncmVzcyxcbiAgZXh0cmFjdFBhcnRpYWxSZXN1bHQsXG4gIGZpbmFsaXplQWdlbnRUb29sLFxuICBnZXRMYXN0VG9vbFVzZU5hbWUsXG4gIHJ1bkFzeW5jQWdlbnRMaWZlY3ljbGUsXG59IGZyb20gJy4vYWdlbnRUb29sVXRpbHMuanMnXG5pbXBvcnQgeyBHRU5FUkFMX1BVUlBPU0VfQUdFTlQgfSBmcm9tICcuL2J1aWx0LWluL2dlbmVyYWxQdXJwb3NlQWdlbnQuanMnXG5pbXBvcnQge1xuICBBR0VOVF9UT09MX05BTUUsXG4gIExFR0FDWV9BR0VOVF9UT09MX05BTUUsXG4gIE9ORV9TSE9UX0JVSUxUSU5fQUdFTlRfVFlQRVMsXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHtcbiAgYnVpbGRGb3JrZWRNZXNzYWdlcyxcbiAgYnVpbGRXb3JrdHJlZU5vdGljZSxcbiAgRk9SS19BR0VOVCxcbiAgaXNGb3JrU3ViYWdlbnRFbmFibGVkLFxuICBpc0luRm9ya0NoaWxkLFxufSBmcm9tICcuL2ZvcmtTdWJhZ2VudC5qcydcbmltcG9ydCB0eXBlIHsgQWdlbnREZWZpbml0aW9uIH0gZnJvbSAnLi9sb2FkQWdlbnRzRGlyLmpzJ1xuaW1wb3J0IHtcbiAgZmlsdGVyQWdlbnRzQnlNY3BSZXF1aXJlbWVudHMsXG4gIGhhc1JlcXVpcmVkTWNwU2VydmVycyxcbiAgaXNCdWlsdEluQWdlbnQsXG59IGZyb20gJy4vbG9hZEFnZW50c0Rpci5qcydcbmltcG9ydCB7IGdldFByb21wdCB9IGZyb20gJy4vcHJvbXB0LmpzJ1xuaW1wb3J0IHsgcnVuQWdlbnQgfSBmcm9tICcuL3J1bkFnZW50LmpzJ1xuaW1wb3J0IHtcbiAgcmVuZGVyR3JvdXBlZEFnZW50VG9vbFVzZSxcbiAgcmVuZGVyVG9vbFJlc3VsdE1lc3NhZ2UsXG4gIHJlbmRlclRvb2xVc2VFcnJvck1lc3NhZ2UsXG4gIHJlbmRlclRvb2xVc2VNZXNzYWdlLFxuICByZW5kZXJUb29sVXNlUHJvZ3Jlc3NNZXNzYWdlLFxuICByZW5kZXJUb29sVXNlUmVqZWN0ZWRNZXNzYWdlLFxuICByZW5kZXJUb29sVXNlVGFnLFxuICB1c2VyRmFjaW5nTmFtZSxcbiAgdXNlckZhY2luZ05hbWVCYWNrZ3JvdW5kQ29sb3IsXG59IGZyb20gJy4vVUkuanMnXG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbmNvbnN0IHByb2FjdGl2ZU1vZHVsZSA9XG4gIGZlYXR1cmUoJ1BST0FDVElWRScpIHx8IGZlYXR1cmUoJ0tBSVJPUycpXG4gICAgPyAocmVxdWlyZSgnLi4vLi4vcHJvYWN0aXZlL2luZGV4LmpzJykgYXMgdHlwZW9mIGltcG9ydCgnLi4vLi4vcHJvYWN0aXZlL2luZGV4LmpzJykpXG4gICAgOiBudWxsXG4vKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cblxuLy8gUHJvZ3Jlc3MgZGlzcGxheSBjb25zdGFudHMgKGZvciBzaG93aW5nIGJhY2tncm91bmQgaGludClcbmNvbnN0IFBST0dSRVNTX1RIUkVTSE9MRF9NUyA9IDIwMDAgLy8gU2hvdyBiYWNrZ3JvdW5kIGhpbnQgYWZ0ZXIgMiBzZWNvbmRzXG5cbi8vIENoZWNrIGlmIGJhY2tncm91bmQgdGFza3MgYXJlIGRpc2FibGVkIGF0IG1vZHVsZSBsb2FkIHRpbWVcbmNvbnN0IGlzQmFja2dyb3VuZFRhc2tzRGlzYWJsZWQgPVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY3VzdG9tLXJ1bGVzL25vLXByb2Nlc3MtZW52LXRvcC1sZXZlbCAtLSBJbnRlbnRpb25hbDogc2NoZW1hIG11c3QgYmUgZGVmaW5lZCBhdCBtb2R1bGUgbG9hZFxuICBpc0VudlRydXRoeShwcm9jZXNzLmVudi5DTEFVREVfQ09ERV9ESVNBQkxFX0JBQ0tHUk9VTkRfVEFTS1MpXG5cbi8vIEF1dG8tYmFja2dyb3VuZCBhZ2VudCB0YXNrcyBhZnRlciB0aGlzIG1hbnkgbXMgKDAgPSBkaXNhYmxlZClcbi8vIEVuYWJsZWQgYnkgZW52IHZhciBPUiBHcm93dGhCb29rIGdhdGUgKGNoZWNrZWQgbGF6aWx5IHNpbmNlIEdCIG1heSBub3QgYmUgcmVhZHkgYXQgbW9kdWxlIGxvYWQpXG5mdW5jdGlvbiBnZXRBdXRvQmFja2dyb3VuZE1zKCk6IG51bWJlciB7XG4gIGlmIChcbiAgICBpc0VudlRydXRoeShwcm9jZXNzLmVudi5DTEFVREVfQVVUT19CQUNLR1JPVU5EX1RBU0tTKSB8fFxuICAgIGdldEZlYXR1cmVWYWx1ZV9DQUNIRURfTUFZX0JFX1NUQUxFKCd0ZW5ndV9hdXRvX2JhY2tncm91bmRfYWdlbnRzJywgZmFsc2UpXG4gICkge1xuICAgIHJldHVybiAxMjBfMDAwXG4gIH1cbiAgcmV0dXJuIDBcbn1cblxuLy8gTXVsdGktYWdlbnQgdHlwZSBjb25zdGFudHMgYXJlIGRlZmluZWQgaW5saW5lIGluc2lkZSBnYXRlZCBibG9ja3MgdG8gZW5hYmxlIGRlYWQgY29kZSBlbGltaW5hdGlvblxuXG4vLyBCYXNlIGlucHV0IHNjaGVtYSB3aXRob3V0IG11bHRpLWFnZW50IHBhcmFtZXRlcnNcbmNvbnN0IGJhc2VJbnB1dFNjaGVtYSA9IGxhenlTY2hlbWEoKCkgPT5cbiAgei5vYmplY3Qoe1xuICAgIGRlc2NyaXB0aW9uOiB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5kZXNjcmliZSgnQSBzaG9ydCAoMy01IHdvcmQpIGRlc2NyaXB0aW9uIG9mIHRoZSB0YXNrJyksXG4gICAgcHJvbXB0OiB6LnN0cmluZygpLmRlc2NyaWJlKCdUaGUgdGFzayBmb3IgdGhlIGFnZW50IHRvIHBlcmZvcm0nKSxcbiAgICBzdWJhZ2VudF90eXBlOiB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoJ1RoZSB0eXBlIG9mIHNwZWNpYWxpemVkIGFnZW50IHRvIHVzZSBmb3IgdGhpcyB0YXNrJyksXG4gICAgbW9kZWw6IHpcbiAgICAgIC5lbnVtKFsnc29ubmV0JywgJ29wdXMnLCAnaGFpa3UnXSlcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoXG4gICAgICAgIFwiT3B0aW9uYWwgbW9kZWwgb3ZlcnJpZGUgZm9yIHRoaXMgYWdlbnQuIFRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgYWdlbnQgZGVmaW5pdGlvbidzIG1vZGVsIGZyb250bWF0dGVyLiBJZiBvbWl0dGVkLCB1c2VzIHRoZSBhZ2VudCBkZWZpbml0aW9uJ3MgbW9kZWwsIG9yIGluaGVyaXRzIGZyb20gdGhlIHBhcmVudC5cIixcbiAgICAgICksXG4gICAgcnVuX2luX2JhY2tncm91bmQ6IHpcbiAgICAgIC5ib29sZWFuKClcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoXG4gICAgICAgICdTZXQgdG8gdHJ1ZSB0byBydW4gdGhpcyBhZ2VudCBpbiB0aGUgYmFja2dyb3VuZC4gWW91IHdpbGwgYmUgbm90aWZpZWQgd2hlbiBpdCBjb21wbGV0ZXMuJyxcbiAgICAgICksXG4gIH0pLFxuKVxuXG4vLyBGdWxsIHNjaGVtYSBjb21iaW5pbmcgYmFzZSArIG11bHRpLWFnZW50IHBhcmFtcyArIGlzb2xhdGlvblxuY29uc3QgZnVsbElucHV0U2NoZW1hID0gbGF6eVNjaGVtYSgoKSA9PiB7XG4gIC8vIE11bHRpLWFnZW50IHBhcmFtZXRlcnNcbiAgY29uc3QgbXVsdGlBZ2VudElucHV0U2NoZW1hID0gei5vYmplY3Qoe1xuICAgIG5hbWU6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgJ05hbWUgZm9yIHRoZSBzcGF3bmVkIGFnZW50LiBNYWtlcyBpdCBhZGRyZXNzYWJsZSB2aWEgU2VuZE1lc3NhZ2Uoe3RvOiBuYW1lfSkgd2hpbGUgcnVubmluZy4nLFxuICAgICAgKSxcbiAgICB0ZWFtX25hbWU6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgJ1RlYW0gbmFtZSBmb3Igc3Bhd25pbmcuIFVzZXMgY3VycmVudCB0ZWFtIGNvbnRleHQgaWYgb21pdHRlZC4nLFxuICAgICAgKSxcbiAgICBtb2RlOiBwZXJtaXNzaW9uTW9kZVNjaGVtYSgpXG4gICAgICAub3B0aW9uYWwoKVxuICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAnUGVybWlzc2lvbiBtb2RlIGZvciBzcGF3bmVkIHRlYW1tYXRlIChlLmcuLCBcInBsYW5cIiB0byByZXF1aXJlIHBsYW4gYXBwcm92YWwpLicsXG4gICAgICApLFxuICB9KVxuXG4gIHJldHVybiBiYXNlSW5wdXRTY2hlbWEoKVxuICAgIC5tZXJnZShtdWx0aUFnZW50SW5wdXRTY2hlbWEpXG4gICAgLmV4dGVuZCh7XG4gICAgICBpc29sYXRpb246IChcImV4dGVybmFsXCIgPT09ICdhbnQnXG4gICAgICAgID8gei5lbnVtKFsnd29ya3RyZWUnLCAncmVtb3RlJ10pXG4gICAgICAgIDogei5lbnVtKFsnd29ya3RyZWUnXSlcbiAgICAgIClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiZXh0ZXJuYWxcIiA9PT0gJ2FudCdcbiAgICAgICAgICAgID8gJ0lzb2xhdGlvbiBtb2RlLiBcIndvcmt0cmVlXCIgY3JlYXRlcyBhIHRlbXBvcmFyeSBnaXQgd29ya3RyZWUgc28gdGhlIGFnZW50IHdvcmtzIG9uIGFuIGlzb2xhdGVkIGNvcHkgb2YgdGhlIHJlcG8uIFwicmVtb3RlXCIgbGF1bmNoZXMgdGhlIGFnZW50IGluIGEgcmVtb3RlIENDUiBlbnZpcm9ubWVudCAoYWx3YXlzIHJ1bnMgaW4gYmFja2dyb3VuZCkuJ1xuICAgICAgICAgICAgOiAnSXNvbGF0aW9uIG1vZGUuIFwid29ya3RyZWVcIiBjcmVhdGVzIGEgdGVtcG9yYXJ5IGdpdCB3b3JrdHJlZSBzbyB0aGUgYWdlbnQgd29ya3Mgb24gYW4gaXNvbGF0ZWQgY29weSBvZiB0aGUgcmVwby4nLFxuICAgICAgICApLFxuICAgICAgY3dkOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgJ0Fic29sdXRlIHBhdGggdG8gcnVuIHRoZSBhZ2VudCBpbi4gT3ZlcnJpZGVzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgYWxsIGZpbGVzeXN0ZW0gYW5kIHNoZWxsIG9wZXJhdGlvbnMgd2l0aGluIHRoaXMgYWdlbnQuIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGlzb2xhdGlvbjogXCJ3b3JrdHJlZVwiLicsXG4gICAgICAgICksXG4gICAgfSlcbn0pXG5cbi8vIFN0cmlwIG9wdGlvbmFsIGZpZWxkcyBmcm9tIHRoZSBzY2hlbWEgd2hlbiB0aGUgYmFja2luZyBmZWF0dXJlIGlzIG9mZiBzb1xuLy8gdGhlIG1vZGVsIG5ldmVyIHNlZXMgdGhlbS4gRG9uZSB2aWEgLm9taXQoKSByYXRoZXIgdGhhbiBjb25kaXRpb25hbCBzcHJlYWRcbi8vIGluc2lkZSAuZXh0ZW5kKCkgYmVjYXVzZSB0aGUgc3ByZWFkLXRlcm5hcnkgYnJlYWtzIFpvZCdzIHR5cGUgaW5mZXJlbmNlXG4vLyAoZmllbGQgdHlwZSBjb2xsYXBzZXMgdG8gYHVua25vd25gKS4gVGhlIHRlcm5hcnkgcmV0dXJuIHByb2R1Y2VzIGEgdW5pb25cbi8vIHR5cGUsIGJ1dCBjYWxsKCkgZGVzdHJ1Y3R1cmVzIHZpYSB0aGUgZXhwbGljaXQgQWdlbnRUb29sSW5wdXQgdHlwZSBiZWxvd1xuLy8gd2hpY2ggYWx3YXlzIGluY2x1ZGVzIGFsbCBvcHRpb25hbCBmaWVsZHMuXG5leHBvcnQgY29uc3QgaW5wdXRTY2hlbWEgPSBsYXp5U2NoZW1hKCgpID0+IHtcbiAgY29uc3Qgc2NoZW1hID0gZmVhdHVyZSgnS0FJUk9TJylcbiAgICA/IGZ1bGxJbnB1dFNjaGVtYSgpXG4gICAgOiBmdWxsSW5wdXRTY2hlbWEoKS5vbWl0KHsgY3dkOiB0cnVlIH0pXG5cbiAgLy8gR3Jvd3RoQm9vay1pbi1sYXp5U2NoZW1hIGlzIGFjY2VwdGFibGUgaGVyZSAodW5saWtlIHN1YmFnZW50X3R5cGUsIHdoaWNoXG4gIC8vIHdhcyByZW1vdmVkIGluIDkwNmRhNmM3MjMpOiB0aGUgZGl2ZXJnZW5jZSB3aW5kb3cgaXMgb25lLXNlc3Npb24tcGVyLVxuICAvLyBnYXRlLWZsaXAgdmlhIF9DQUNIRURfTUFZX0JFX1NUQUxFIGRpc2sgcmVhZCwgYW5kIHdvcnN0IGNhc2UgaXMgZWl0aGVyXG4gIC8vIFwic2NoZW1hIHNob3dzIGEgbm8tb3AgcGFyYW1cIiAoZ2F0ZSBmbGlwcyBvbiBtaWQtc2Vzc2lvbjogcGFyYW0gaWdub3JlZFxuICAvLyBieSBmb3JjZUFzeW5jKSBvciBcInNjaGVtYSBoaWRlcyBhIHBhcmFtIHRoYXQgd291bGQndmUgd29ya2VkXCIgKGdhdGVcbiAgLy8gZmxpcHMgb2ZmIG1pZC1zZXNzaW9uOiBldmVyeXRoaW5nIHN0aWxsIHJ1bnMgYXN5bmMgdmlhIG1lbW9pemVkXG4gIC8vIGZvcmNlQXN5bmMpLiBObyBab2QgcmVqZWN0aW9uLCBubyBjcmFzaCDigJQgdW5saWtlIHJlcXVpcmVk4oaSb3B0aW9uYWwuXG4gIHJldHVybiBpc0JhY2tncm91bmRUYXNrc0Rpc2FibGVkIHx8IGlzRm9ya1N1YmFnZW50RW5hYmxlZCgpXG4gICAgPyBzY2hlbWEub21pdCh7IHJ1bl9pbl9iYWNrZ3JvdW5kOiB0cnVlIH0pXG4gICAgOiBzY2hlbWFcbn0pXG50eXBlIElucHV0U2NoZW1hID0gUmV0dXJuVHlwZTx0eXBlb2YgaW5wdXRTY2hlbWE+XG5cbi8vIEV4cGxpY2l0IHR5cGUgd2lkZW5zIHRoZSBzY2hlbWEgaW5mZXJlbmNlIHRvIGFsd2F5cyBpbmNsdWRlIGFsbCBvcHRpb25hbFxuLy8gZmllbGRzIGV2ZW4gd2hlbiAub21pdCgpIHN0cmlwcyB0aGVtIGZvciBnYXRpbmcgKGN3ZCwgcnVuX2luX2JhY2tncm91bmQpLlxuLy8gc3ViYWdlbnRfdHlwZSBpcyBvcHRpb25hbDsgY2FsbCgpIGRlZmF1bHRzIGl0IHRvIGdlbmVyYWwtcHVycG9zZSB3aGVuIHRoZVxuLy8gZm9yayBnYXRlIGlzIG9mZiwgb3Igcm91dGVzIHRvIHRoZSBmb3JrIHBhdGggd2hlbiB0aGUgZ2F0ZSBpcyBvbi5cbnR5cGUgQWdlbnRUb29sSW5wdXQgPSB6LmluZmVyPFJldHVyblR5cGU8dHlwZW9mIGJhc2VJbnB1dFNjaGVtYT4+ICYge1xuICBuYW1lPzogc3RyaW5nXG4gIHRlYW1fbmFtZT86IHN0cmluZ1xuICBtb2RlPzogei5pbmZlcjxSZXR1cm5UeXBlPHR5cGVvZiBwZXJtaXNzaW9uTW9kZVNjaGVtYT4+XG4gIGlzb2xhdGlvbj86ICd3b3JrdHJlZScgfCAncmVtb3RlJ1xuICBjd2Q/OiBzdHJpbmdcbn1cblxuLy8gT3V0cHV0IHNjaGVtYSAtIG11bHRpLWFnZW50IHNwYXduZWQgc2NoZW1hIGFkZGVkIGR5bmFtaWNhbGx5IGF0IHJ1bnRpbWUgd2hlbiBlbmFibGVkXG5leHBvcnQgY29uc3Qgb3V0cHV0U2NoZW1hID0gbGF6eVNjaGVtYSgoKSA9PiB7XG4gIGNvbnN0IHN5bmNPdXRwdXRTY2hlbWEgPSBhZ2VudFRvb2xSZXN1bHRTY2hlbWEoKS5leHRlbmQoe1xuICAgIHN0YXR1czogei5saXRlcmFsKCdjb21wbGV0ZWQnKSxcbiAgICBwcm9tcHQ6IHouc3RyaW5nKCksXG4gIH0pXG5cbiAgY29uc3QgYXN5bmNPdXRwdXRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgc3RhdHVzOiB6LmxpdGVyYWwoJ2FzeW5jX2xhdW5jaGVkJyksXG4gICAgYWdlbnRJZDogei5zdHJpbmcoKS5kZXNjcmliZSgnVGhlIElEIG9mIHRoZSBhc3luYyBhZ2VudCcpLFxuICAgIGRlc2NyaXB0aW9uOiB6LnN0cmluZygpLmRlc2NyaWJlKCdUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHRhc2snKSxcbiAgICBwcm9tcHQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoJ1RoZSBwcm9tcHQgZm9yIHRoZSBhZ2VudCcpLFxuICAgIG91dHB1dEZpbGU6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLmRlc2NyaWJlKCdQYXRoIHRvIHRoZSBvdXRwdXQgZmlsZSBmb3IgY2hlY2tpbmcgYWdlbnQgcHJvZ3Jlc3MnKSxcbiAgICBjYW5SZWFkT3V0cHV0RmlsZTogelxuICAgICAgLmJvb2xlYW4oKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgJ1doZXRoZXIgdGhlIGNhbGxpbmcgYWdlbnQgaGFzIFJlYWQvQmFzaCB0b29scyB0byBjaGVjayBwcm9ncmVzcycsXG4gICAgICApLFxuICB9KVxuXG4gIHJldHVybiB6LnVuaW9uKFtzeW5jT3V0cHV0U2NoZW1hLCBhc3luY091dHB1dFNjaGVtYV0pXG59KVxudHlwZSBPdXRwdXRTY2hlbWEgPSBSZXR1cm5UeXBlPHR5cGVvZiBvdXRwdXRTY2hlbWE+XG50eXBlIE91dHB1dCA9IHouaW5wdXQ8T3V0cHV0U2NoZW1hPlxuXG4vLyBQcml2YXRlIHR5cGUgZm9yIHRlYW1tYXRlIHNwYXduIHJlc3VsdHMgLSBleGNsdWRlZCBmcm9tIGV4cG9ydGVkIHNjaGVtYSBmb3IgZGVhZCBjb2RlIGVsaW1pbmF0aW9uXG4vLyBUaGUgJ3RlYW1tYXRlX3NwYXduZWQnIHN0YXR1cyBzdHJpbmcgaXMgb25seSBpbmNsdWRlZCB3aGVuIEVOQUJMRV9BR0VOVF9TV0FSTVMgaXMgdHJ1ZVxudHlwZSBUZWFtbWF0ZVNwYXduZWRPdXRwdXQgPSB7XG4gIHN0YXR1czogJ3RlYW1tYXRlX3NwYXduZWQnXG4gIHByb21wdDogc3RyaW5nXG4gIHRlYW1tYXRlX2lkOiBzdHJpbmdcbiAgYWdlbnRfaWQ6IHN0cmluZ1xuICBhZ2VudF90eXBlPzogc3RyaW5nXG4gIG1vZGVsPzogc3RyaW5nXG4gIG5hbWU6IHN0cmluZ1xuICBjb2xvcj86IHN0cmluZ1xuICB0bXV4X3Nlc3Npb25fbmFtZTogc3RyaW5nXG4gIHRtdXhfd2luZG93X25hbWU6IHN0cmluZ1xuICB0bXV4X3BhbmVfaWQ6IHN0cmluZ1xuICB0ZWFtX25hbWU/OiBzdHJpbmdcbiAgaXNfc3BsaXRwYW5lPzogYm9vbGVhblxuICBwbGFuX21vZGVfcmVxdWlyZWQ/OiBib29sZWFuXG59XG5cbi8vIENvbWJpbmVkIG91dHB1dCB0eXBlIGluY2x1ZGluZyBib3RoIHB1YmxpYyBhbmQgaW50ZXJuYWwgdHlwZXNcbi8vIE5vdGU6IFRlYW1tYXRlU3Bhd25lZE91dHB1dCB0eXBlIGlzIGZpbmUgLSBUeXBlU2NyaXB0IHR5cGVzIGFyZSBlcmFzZWQgYXQgY29tcGlsZSB0aW1lXG4vLyBQcml2YXRlIHR5cGUgZm9yIHJlbW90ZS1sYXVuY2hlZCByZXN1bHRzIOKAlCBleGNsdWRlZCBmcm9tIGV4cG9ydGVkIHNjaGVtYVxuLy8gbGlrZSBUZWFtbWF0ZVNwYXduZWRPdXRwdXQgZm9yIGRlYWQgY29kZSBlbGltaW5hdGlvbiBwdXJwb3Nlcy4gRXhwb3J0ZWRcbi8vIGZvciBVSS50c3ggdG8gZG8gcHJvcGVyIGRpc2NyaW1pbmF0ZWQtdW5pb24gbmFycm93aW5nIGluc3RlYWQgb2YgYWQtaG9jIGNhc3RzLlxuZXhwb3J0IHR5cGUgUmVtb3RlTGF1bmNoZWRPdXRwdXQgPSB7XG4gIHN0YXR1czogJ3JlbW90ZV9sYXVuY2hlZCdcbiAgdGFza0lkOiBzdHJpbmdcbiAgc2Vzc2lvblVybDogc3RyaW5nXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgcHJvbXB0OiBzdHJpbmdcbiAgb3V0cHV0RmlsZTogc3RyaW5nXG59XG5cbnR5cGUgSW50ZXJuYWxPdXRwdXQgPSBPdXRwdXQgfCBUZWFtbWF0ZVNwYXduZWRPdXRwdXQgfCBSZW1vdGVMYXVuY2hlZE91dHB1dFxuXG5pbXBvcnQgdHlwZSB7IEFnZW50VG9vbFByb2dyZXNzLCBTaGVsbFByb2dyZXNzIH0gZnJvbSAnLi4vLi4vdHlwZXMvdG9vbHMuanMnXG4vLyBBZ2VudFRvb2wgZm9yd2FyZHMgYm90aCBpdHMgb3duIHByb2dyZXNzIGV2ZW50cyBhbmQgc2hlbGwgcHJvZ3Jlc3Ncbi8vIGV2ZW50cyBmcm9tIHRoZSBzdWItYWdlbnQgc28gdGhlIFNESyByZWNlaXZlcyB0b29sX3Byb2dyZXNzIHVwZGF0ZXMgZHVyaW5nIGJhc2gvcG93ZXJzaGVsbCBydW5zLlxuZXhwb3J0IHR5cGUgUHJvZ3Jlc3MgPSBBZ2VudFRvb2xQcm9ncmVzcyB8IFNoZWxsUHJvZ3Jlc3NcblxuZXhwb3J0IGNvbnN0IEFnZW50VG9vbCA9IGJ1aWxkVG9vbCh7XG4gIGFzeW5jIHByb21wdCh7IGFnZW50cywgdG9vbHMsIGdldFRvb2xQZXJtaXNzaW9uQ29udGV4dCwgYWxsb3dlZEFnZW50VHlwZXMgfSkge1xuICAgIGNvbnN0IHRvb2xQZXJtaXNzaW9uQ29udGV4dCA9IGF3YWl0IGdldFRvb2xQZXJtaXNzaW9uQ29udGV4dCgpXG5cbiAgICAvLyBHZXQgTUNQIHNlcnZlcnMgdGhhdCBoYXZlIHRvb2xzIGF2YWlsYWJsZVxuICAgIGNvbnN0IG1jcFNlcnZlcnNXaXRoVG9vbHM6IHN0cmluZ1tdID0gW11cbiAgICBmb3IgKGNvbnN0IHRvb2wgb2YgdG9vbHMpIHtcbiAgICAgIGlmICh0b29sLm5hbWU/LnN0YXJ0c1dpdGgoJ21jcF9fJykpIHtcbiAgICAgICAgY29uc3QgcGFydHMgPSB0b29sLm5hbWUuc3BsaXQoJ19fJylcbiAgICAgICAgY29uc3Qgc2VydmVyTmFtZSA9IHBhcnRzWzFdXG4gICAgICAgIGlmIChzZXJ2ZXJOYW1lICYmICFtY3BTZXJ2ZXJzV2l0aFRvb2xzLmluY2x1ZGVzKHNlcnZlck5hbWUpKSB7XG4gICAgICAgICAgbWNwU2VydmVyc1dpdGhUb29scy5wdXNoKHNlcnZlck5hbWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgYWdlbnRzOiBmaXJzdCBieSBNQ1AgcmVxdWlyZW1lbnRzLCB0aGVuIGJ5IHBlcm1pc3Npb24gcnVsZXNcbiAgICBjb25zdCBhZ2VudHNXaXRoTWNwUmVxdWlyZW1lbnRzTWV0ID0gZmlsdGVyQWdlbnRzQnlNY3BSZXF1aXJlbWVudHMoXG4gICAgICBhZ2VudHMsXG4gICAgICBtY3BTZXJ2ZXJzV2l0aFRvb2xzLFxuICAgIClcbiAgICBjb25zdCBmaWx0ZXJlZEFnZW50cyA9IGZpbHRlckRlbmllZEFnZW50cyhcbiAgICAgIGFnZW50c1dpdGhNY3BSZXF1aXJlbWVudHNNZXQsXG4gICAgICB0b29sUGVybWlzc2lvbkNvbnRleHQsXG4gICAgICBBR0VOVF9UT09MX05BTUUsXG4gICAgKVxuXG4gICAgLy8gVXNlIGlubGluZSBlbnYgY2hlY2sgaW5zdGVhZCBvZiBjb29yZGluYXRvck1vZHVsZSB0byBhdm9pZCBjaXJjdWxhclxuICAgIC8vIGRlcGVuZGVuY3kgaXNzdWVzIGR1cmluZyB0ZXN0IG1vZHVsZSBsb2FkaW5nLlxuICAgIGNvbnN0IGlzQ29vcmRpbmF0b3IgPSBmZWF0dXJlKCdDT09SRElOQVRPUl9NT0RFJylcbiAgICAgID8gaXNFbnZUcnV0aHkocHJvY2Vzcy5lbnYuQ0xBVURFX0NPREVfQ09PUkRJTkFUT1JfTU9ERSlcbiAgICAgIDogZmFsc2VcbiAgICByZXR1cm4gYXdhaXQgZ2V0UHJvbXB0KGZpbHRlcmVkQWdlbnRzLCBpc0Nvb3JkaW5hdG9yLCBhbGxvd2VkQWdlbnRUeXBlcylcbiAgfSxcbiAgbmFtZTogQUdFTlRfVE9PTF9OQU1FLFxuICBzZWFyY2hIaW50OiAnZGVsZWdhdGUgd29yayB0byBhIHN1YmFnZW50JyxcbiAgYWxpYXNlczogW0xFR0FDWV9BR0VOVF9UT09MX05BTUVdLFxuICBtYXhSZXN1bHRTaXplQ2hhcnM6IDEwMF8wMDAsXG4gIGFzeW5jIGRlc2NyaXB0aW9uKCkge1xuICAgIHJldHVybiAnTGF1bmNoIGEgbmV3IGFnZW50J1xuICB9LFxuICBnZXQgaW5wdXRTY2hlbWEoKTogSW5wdXRTY2hlbWEge1xuICAgIHJldHVybiBpbnB1dFNjaGVtYSgpXG4gIH0sXG4gIGdldCBvdXRwdXRTY2hlbWEoKTogT3V0cHV0U2NoZW1hIHtcbiAgICByZXR1cm4gb3V0cHV0U2NoZW1hKClcbiAgfSxcbiAgYXN5bmMgY2FsbChcbiAgICB7XG4gICAgICBwcm9tcHQsXG4gICAgICBzdWJhZ2VudF90eXBlLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBtb2RlbDogbW9kZWxQYXJhbSxcbiAgICAgIHJ1bl9pbl9iYWNrZ3JvdW5kLFxuICAgICAgbmFtZSxcbiAgICAgIHRlYW1fbmFtZSxcbiAgICAgIG1vZGU6IHNwYXduTW9kZSxcbiAgICAgIGlzb2xhdGlvbixcbiAgICAgIGN3ZCxcbiAgICB9OiBBZ2VudFRvb2xJbnB1dCxcbiAgICB0b29sVXNlQ29udGV4dCxcbiAgICBjYW5Vc2VUb29sLFxuICAgIGFzc2lzdGFudE1lc3NhZ2UsXG4gICAgb25Qcm9ncmVzcz8sXG4gICkge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICBjb25zdCBtb2RlbCA9IGlzQ29vcmRpbmF0b3JNb2RlKCkgPyB1bmRlZmluZWQgOiBtb2RlbFBhcmFtXG5cbiAgICAvLyBHZXQgYXBwIHN0YXRlIGZvciBwZXJtaXNzaW9uIG1vZGUgYW5kIGFnZW50IGZpbHRlcmluZ1xuICAgIGNvbnN0IGFwcFN0YXRlID0gdG9vbFVzZUNvbnRleHQuZ2V0QXBwU3RhdGUoKVxuICAgIGNvbnN0IHBlcm1pc3Npb25Nb2RlID0gYXBwU3RhdGUudG9vbFBlcm1pc3Npb25Db250ZXh0Lm1vZGVcbiAgICAvLyBJbi1wcm9jZXNzIHRlYW1tYXRlcyBnZXQgYSBuby1vcCBzZXRBcHBTdGF0ZTsgc2V0QXBwU3RhdGVGb3JUYXNrc1xuICAgIC8vIHJlYWNoZXMgdGhlIHJvb3Qgc3RvcmUgc28gdGFzayByZWdpc3RyYXRpb24vcHJvZ3Jlc3Mva2lsbCBzdGF5IHZpc2libGUuXG4gICAgY29uc3Qgcm9vdFNldEFwcFN0YXRlID1cbiAgICAgIHRvb2xVc2VDb250ZXh0LnNldEFwcFN0YXRlRm9yVGFza3MgPz8gdG9vbFVzZUNvbnRleHQuc2V0QXBwU3RhdGVcblxuICAgIC8vIENoZWNrIGlmIHVzZXIgaXMgdHJ5aW5nIHRvIHVzZSBhZ2VudCB0ZWFtcyB3aXRob3V0IGFjY2Vzc1xuICAgIGlmICh0ZWFtX25hbWUgJiYgIWlzQWdlbnRTd2FybXNFbmFibGVkKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWdlbnQgVGVhbXMgaXMgbm90IHlldCBhdmFpbGFibGUgb24geW91ciBwbGFuLicpXG4gICAgfVxuXG4gICAgLy8gVGVhbW1hdGVzIChpbi1wcm9jZXNzIG9yIHRtdXgpIHBhc3NpbmcgYG5hbWVgIHdvdWxkIHRyaWdnZXIgc3Bhd25UZWFtbWF0ZSgpXG4gICAgLy8gYmVsb3csIGJ1dCBUZWFtRmlsZS5tZW1iZXJzIGlzIGEgZmxhdCBhcnJheSB3aXRoIG9uZSBsZWFkQWdlbnRJZCDigJQgbmVzdGVkXG4gICAgLy8gdGVhbW1hdGVzIGxhbmQgaW4gdGhlIHJvc3RlciB3aXRoIG5vIHByb3ZlbmFuY2UgYW5kIGNvbmZ1c2UgdGhlIGxlYWQuXG4gICAgY29uc3QgdGVhbU5hbWUgPSByZXNvbHZlVGVhbU5hbWUoeyB0ZWFtX25hbWUgfSwgYXBwU3RhdGUpXG4gICAgaWYgKGlzVGVhbW1hdGUoKSAmJiB0ZWFtTmFtZSAmJiBuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdUZWFtbWF0ZXMgY2Fubm90IHNwYXduIG90aGVyIHRlYW1tYXRlcyDigJQgdGhlIHRlYW0gcm9zdGVyIGlzIGZsYXQuIFRvIHNwYXduIGEgc3ViYWdlbnQgaW5zdGVhZCwgb21pdCB0aGUgYG5hbWVgIHBhcmFtZXRlci4nLFxuICAgICAgKVxuICAgIH1cbiAgICAvLyBJbi1wcm9jZXNzIHRlYW1tYXRlcyBjYW5ub3Qgc3Bhd24gYmFja2dyb3VuZCBhZ2VudHMgKHRoZWlyIGxpZmVjeWNsZSBpc1xuICAgIC8vIHRpZWQgdG8gdGhlIGxlYWRlcidzIHByb2Nlc3MpLiBUbXV4IHRlYW1tYXRlcyBhcmUgc2VwYXJhdGUgcHJvY2Vzc2VzIGFuZFxuICAgIC8vIGNhbiBtYW5hZ2UgdGhlaXIgb3duIGJhY2tncm91bmQgYWdlbnRzLlxuICAgIGlmIChpc0luUHJvY2Vzc1RlYW1tYXRlKCkgJiYgdGVhbU5hbWUgJiYgcnVuX2luX2JhY2tncm91bmQgPT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0luLXByb2Nlc3MgdGVhbW1hdGVzIGNhbm5vdCBzcGF3biBiYWNrZ3JvdW5kIGFnZW50cy4gVXNlIHJ1bl9pbl9iYWNrZ3JvdW5kPWZhbHNlIGZvciBzeW5jaHJvbm91cyBzdWJhZ2VudHMuJyxcbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgbXVsdGktYWdlbnQgc3Bhd24gcmVxdWVzdFxuICAgIC8vIFNwYXduIGlzIHRyaWdnZXJlZCB3aGVuIHRlYW1fbmFtZSBpcyBzZXQgKGZyb20gcGFyYW0gb3IgY29udGV4dCkgYW5kIG5hbWUgaXMgcHJvdmlkZWRcbiAgICBpZiAodGVhbU5hbWUgJiYgbmFtZSkge1xuICAgICAgLy8gU2V0IGFnZW50IGRlZmluaXRpb24gY29sb3IgZm9yIGdyb3VwZWQgVUkgZGlzcGxheSBiZWZvcmUgc3Bhd25pbmdcbiAgICAgIGNvbnN0IGFnZW50RGVmID0gc3ViYWdlbnRfdHlwZVxuICAgICAgICA/IHRvb2xVc2VDb250ZXh0Lm9wdGlvbnMuYWdlbnREZWZpbml0aW9ucy5hY3RpdmVBZ2VudHMuZmluZChcbiAgICAgICAgICAgIGEgPT4gYS5hZ2VudFR5cGUgPT09IHN1YmFnZW50X3R5cGUsXG4gICAgICAgICAgKVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgaWYgKGFnZW50RGVmPy5jb2xvcikge1xuICAgICAgICBzZXRBZ2VudENvbG9yKHN1YmFnZW50X3R5cGUhLCBhZ2VudERlZi5jb2xvcilcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduVGVhbW1hdGUoXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHByb21wdCxcbiAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICB0ZWFtX25hbWU6IHRlYW1OYW1lLFxuICAgICAgICAgIHVzZV9zcGxpdHBhbmU6IHRydWUsXG4gICAgICAgICAgcGxhbl9tb2RlX3JlcXVpcmVkOiBzcGF3bk1vZGUgPT09ICdwbGFuJyxcbiAgICAgICAgICBtb2RlbDogbW9kZWwgPz8gYWdlbnREZWY/Lm1vZGVsLFxuICAgICAgICAgIGFnZW50X3R5cGU6IHN1YmFnZW50X3R5cGUsXG4gICAgICAgICAgaW52b2tpbmdSZXF1ZXN0SWQ6IGFzc2lzdGFudE1lc3NhZ2U/LnJlcXVlc3RJZCxcbiAgICAgICAgfSxcbiAgICAgICAgdG9vbFVzZUNvbnRleHQsXG4gICAgICApXG5cbiAgICAgIC8vIFR5cGUgYXNzZXJ0aW9uIHVzZXMgVGVhbW1hdGVTcGF3bmVkT3V0cHV0IChkZWZpbmVkIGFib3ZlKSBpbnN0ZWFkIG9mIGFueS5cbiAgICAgIC8vIFRoaXMgdHlwZSBpcyBleGNsdWRlZCBmcm9tIHRoZSBleHBvcnRlZCBvdXRwdXRTY2hlbWEgZm9yIGRlYWQgY29kZSBlbGltaW5hdGlvbi5cbiAgICAgIC8vIENhc3QgdGhyb3VnaCB1bmtub3duIGJlY2F1c2UgVGVhbW1hdGVTcGF3bmVkT3V0cHV0IGlzIGludGVudGlvbmFsbHlcbiAgICAgIC8vIG5vdCBwYXJ0IG9mIHRoZSBleHBvcnRlZCBPdXRwdXQgdW5pb24gKGZvciBkZWFkIGNvZGUgZWxpbWluYXRpb24gcHVycG9zZXMpLlxuICAgICAgY29uc3Qgc3Bhd25SZXN1bHQ6IFRlYW1tYXRlU3Bhd25lZE91dHB1dCA9IHtcbiAgICAgICAgc3RhdHVzOiAndGVhbW1hdGVfc3Bhd25lZCcgYXMgY29uc3QsXG4gICAgICAgIHByb21wdCxcbiAgICAgICAgLi4ucmVzdWx0LmRhdGEsXG4gICAgICB9XG4gICAgICByZXR1cm4geyBkYXRhOiBzcGF3blJlc3VsdCB9IGFzIHVua25vd24gYXMgeyBkYXRhOiBPdXRwdXQgfVxuICAgIH1cblxuICAgIC8vIEZvcmsgc3ViYWdlbnQgZXhwZXJpbWVudCByb3V0aW5nOlxuICAgIC8vIC0gc3ViYWdlbnRfdHlwZSBzZXQ6IHVzZSBpdCAoZXhwbGljaXQgd2lucylcbiAgICAvLyAtIHN1YmFnZW50X3R5cGUgb21pdHRlZCwgZ2F0ZSBvbjogZm9yayBwYXRoICh1bmRlZmluZWQpXG4gICAgLy8gLSBzdWJhZ2VudF90eXBlIG9taXR0ZWQsIGdhdGUgb2ZmOiBkZWZhdWx0IGdlbmVyYWwtcHVycG9zZVxuICAgIGNvbnN0IGVmZmVjdGl2ZVR5cGUgPVxuICAgICAgc3ViYWdlbnRfdHlwZSA/P1xuICAgICAgKGlzRm9ya1N1YmFnZW50RW5hYmxlZCgpID8gdW5kZWZpbmVkIDogR0VORVJBTF9QVVJQT1NFX0FHRU5ULmFnZW50VHlwZSlcbiAgICBjb25zdCBpc0ZvcmtQYXRoID0gZWZmZWN0aXZlVHlwZSA9PT0gdW5kZWZpbmVkXG5cbiAgICBsZXQgc2VsZWN0ZWRBZ2VudDogQWdlbnREZWZpbml0aW9uXG4gICAgaWYgKGlzRm9ya1BhdGgpIHtcbiAgICAgIC8vIFJlY3Vyc2l2ZSBmb3JrIGd1YXJkOiBmb3JrIGNoaWxkcmVuIGtlZXAgdGhlIEFnZW50IHRvb2wgaW4gdGhlaXJcbiAgICAgIC8vIHBvb2wgZm9yIGNhY2hlLWlkZW50aWNhbCB0b29sIGRlZnMsIHNvIHJlamVjdCBmb3JrIGF0dGVtcHRzIGF0IGNhbGxcbiAgICAgIC8vIHRpbWUuIFByaW1hcnkgY2hlY2sgaXMgcXVlcnlTb3VyY2UgKGNvbXBhY3Rpb24tcmVzaXN0YW50IOKAlCBzZXQgb25cbiAgICAgIC8vIGNvbnRleHQub3B0aW9ucyBhdCBzcGF3biB0aW1lLCBzdXJ2aXZlcyBhdXRvY29tcGFjdCdzIG1lc3NhZ2VcbiAgICAgIC8vIHJld3JpdGUpLiBNZXNzYWdlLXNjYW4gZmFsbGJhY2sgY2F0Y2hlcyBhbnkgcGF0aCB3aGVyZSBxdWVyeVNvdXJjZVxuICAgICAgLy8gd2Fzbid0IHRocmVhZGVkLlxuICAgICAgaWYgKFxuICAgICAgICB0b29sVXNlQ29udGV4dC5vcHRpb25zLnF1ZXJ5U291cmNlID09PVxuICAgICAgICAgIGBhZ2VudDpidWlsdGluOiR7Rk9SS19BR0VOVC5hZ2VudFR5cGV9YCB8fFxuICAgICAgICBpc0luRm9ya0NoaWxkKHRvb2xVc2VDb250ZXh0Lm1lc3NhZ2VzKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnRm9yayBpcyBub3QgYXZhaWxhYmxlIGluc2lkZSBhIGZvcmtlZCB3b3JrZXIuIENvbXBsZXRlIHlvdXIgdGFzayBkaXJlY3RseSB1c2luZyB5b3VyIHRvb2xzLicsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHNlbGVjdGVkQWdlbnQgPSBGT1JLX0FHRU5UXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpbHRlciBhZ2VudHMgdG8gZXhjbHVkZSB0aG9zZSBkZW5pZWQgdmlhIEFnZW50KEFnZW50TmFtZSkgc3ludGF4XG4gICAgICBjb25zdCBhbGxBZ2VudHMgPSB0b29sVXNlQ29udGV4dC5vcHRpb25zLmFnZW50RGVmaW5pdGlvbnMuYWN0aXZlQWdlbnRzXG4gICAgICBjb25zdCB7IGFsbG93ZWRBZ2VudFR5cGVzIH0gPSB0b29sVXNlQ29udGV4dC5vcHRpb25zLmFnZW50RGVmaW5pdGlvbnNcbiAgICAgIGNvbnN0IGFnZW50cyA9IGZpbHRlckRlbmllZEFnZW50cyhcbiAgICAgICAgLy8gV2hlbiBhbGxvd2VkQWdlbnRUeXBlcyBpcyBzZXQgKGZyb20gQWdlbnQoeCx5KSB0b29sIHNwZWMpLCByZXN0cmljdCB0byB0aG9zZSB0eXBlc1xuICAgICAgICBhbGxvd2VkQWdlbnRUeXBlc1xuICAgICAgICAgID8gYWxsQWdlbnRzLmZpbHRlcihhID0+IGFsbG93ZWRBZ2VudFR5cGVzLmluY2x1ZGVzKGEuYWdlbnRUeXBlKSlcbiAgICAgICAgICA6IGFsbEFnZW50cyxcbiAgICAgICAgYXBwU3RhdGUudG9vbFBlcm1pc3Npb25Db250ZXh0LFxuICAgICAgICBBR0VOVF9UT09MX05BTUUsXG4gICAgICApXG5cbiAgICAgIGNvbnN0IGZvdW5kID0gYWdlbnRzLmZpbmQoYWdlbnQgPT4gYWdlbnQuYWdlbnRUeXBlID09PSBlZmZlY3RpdmVUeXBlKVxuICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWdlbnQgZXhpc3RzIGJ1dCBpcyBkZW5pZWQgYnkgcGVybWlzc2lvbiBydWxlc1xuICAgICAgICBjb25zdCBhZ2VudEV4aXN0c0J1dERlbmllZCA9IGFsbEFnZW50cy5maW5kKFxuICAgICAgICAgIGFnZW50ID0+IGFnZW50LmFnZW50VHlwZSA9PT0gZWZmZWN0aXZlVHlwZSxcbiAgICAgICAgKVxuICAgICAgICBpZiAoYWdlbnRFeGlzdHNCdXREZW5pZWQpIHtcbiAgICAgICAgICBjb25zdCBkZW55UnVsZSA9IGdldERlbnlSdWxlRm9yQWdlbnQoXG4gICAgICAgICAgICBhcHBTdGF0ZS50b29sUGVybWlzc2lvbkNvbnRleHQsXG4gICAgICAgICAgICBBR0VOVF9UT09MX05BTUUsXG4gICAgICAgICAgICBlZmZlY3RpdmVUeXBlLFxuICAgICAgICAgIClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWdlbnQgdHlwZSAnJHtlZmZlY3RpdmVUeXBlfScgaGFzIGJlZW4gZGVuaWVkIGJ5IHBlcm1pc3Npb24gcnVsZSAnJHtBR0VOVF9UT09MX05BTUV9KCR7ZWZmZWN0aXZlVHlwZX0pJyBmcm9tICR7ZGVueVJ1bGU/LnNvdXJjZSA/PyAnc2V0dGluZ3MnfS5gLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEFnZW50IHR5cGUgJyR7ZWZmZWN0aXZlVHlwZX0nIG5vdCBmb3VuZC4gQXZhaWxhYmxlIGFnZW50czogJHthZ2VudHNcbiAgICAgICAgICAgIC5tYXAoYSA9PiBhLmFnZW50VHlwZSlcbiAgICAgICAgICAgIC5qb2luKCcsICcpfWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHNlbGVjdGVkQWdlbnQgPSBmb3VuZFxuICAgIH1cblxuICAgIC8vIFNhbWUgbGlmZWN5Y2xlIGNvbnN0cmFpbnQgYXMgdGhlIHJ1bl9pbl9iYWNrZ3JvdW5kIGd1YXJkIGFib3ZlLCBidXQgZm9yXG4gICAgLy8gYWdlbnQgZGVmaW5pdGlvbnMgdGhhdCBmb3JjZSBiYWNrZ3JvdW5kIHZpYSBgYmFja2dyb3VuZDogdHJ1ZWAuIENoZWNrZWRcbiAgICAvLyBoZXJlIGJlY2F1c2Ugc2VsZWN0ZWRBZ2VudCBpcyBvbmx5IG5vdyByZXNvbHZlZC5cbiAgICBpZiAoXG4gICAgICBpc0luUHJvY2Vzc1RlYW1tYXRlKCkgJiZcbiAgICAgIHRlYW1OYW1lICYmXG4gICAgICBzZWxlY3RlZEFnZW50LmJhY2tncm91bmQgPT09IHRydWVcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEluLXByb2Nlc3MgdGVhbW1hdGVzIGNhbm5vdCBzcGF3biBiYWNrZ3JvdW5kIGFnZW50cy4gQWdlbnQgJyR7c2VsZWN0ZWRBZ2VudC5hZ2VudFR5cGV9JyBoYXMgYmFja2dyb3VuZDogdHJ1ZSBpbiBpdHMgZGVmaW5pdGlvbi5gLFxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIENhcHR1cmUgZm9yIHR5cGUgbmFycm93aW5nIOKAlCBgbGV0IHNlbGVjdGVkQWdlbnRgIHByZXZlbnRzIFRTIGZyb21cbiAgICAvLyBuYXJyb3dpbmcgcHJvcGVydHkgdHlwZXMgYWNyb3NzIHRoZSBpZi1lbHNlIGFzc2lnbm1lbnQgYWJvdmUuXG4gICAgY29uc3QgcmVxdWlyZWRNY3BTZXJ2ZXJzID0gc2VsZWN0ZWRBZ2VudC5yZXF1aXJlZE1jcFNlcnZlcnNcblxuICAgIC8vIENoZWNrIGlmIHJlcXVpcmVkIE1DUCBzZXJ2ZXJzIGhhdmUgdG9vbHMgYXZhaWxhYmxlXG4gICAgLy8gQSBzZXJ2ZXIgdGhhdCdzIGNvbm5lY3RlZCBidXQgbm90IGF1dGhlbnRpY2F0ZWQgd29uJ3QgaGF2ZSBhbnkgdG9vbHNcbiAgICBpZiAocmVxdWlyZWRNY3BTZXJ2ZXJzPy5sZW5ndGgpIHtcbiAgICAgIC8vIElmIGFueSByZXF1aXJlZCBzZXJ2ZXJzIGFyZSBzdGlsbCBwZW5kaW5nIChjb25uZWN0aW5nKSwgd2FpdCBmb3IgdGhlbVxuICAgICAgLy8gYmVmb3JlIGNoZWNraW5nIHRvb2wgYXZhaWxhYmlsaXR5LiBUaGlzIGF2b2lkcyBhIHJhY2UgY29uZGl0aW9uIHdoZXJlXG4gICAgICAvLyB0aGUgYWdlbnQgaXMgaW52b2tlZCBiZWZvcmUgTUNQIHNlcnZlcnMgZmluaXNoIGNvbm5lY3RpbmcuXG4gICAgICBjb25zdCBoYXNQZW5kaW5nUmVxdWlyZWRTZXJ2ZXJzID0gYXBwU3RhdGUubWNwLmNsaWVudHMuc29tZShcbiAgICAgICAgYyA9PlxuICAgICAgICAgIGMudHlwZSA9PT0gJ3BlbmRpbmcnICYmXG4gICAgICAgICAgcmVxdWlyZWRNY3BTZXJ2ZXJzLnNvbWUocGF0dGVybiA9PlxuICAgICAgICAgICAgYy5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocGF0dGVybi50b0xvd2VyQ2FzZSgpKSxcbiAgICAgICAgICApLFxuICAgICAgKVxuXG4gICAgICBsZXQgY3VycmVudEFwcFN0YXRlID0gYXBwU3RhdGVcbiAgICAgIGlmIChoYXNQZW5kaW5nUmVxdWlyZWRTZXJ2ZXJzKSB7XG4gICAgICAgIGNvbnN0IE1BWF9XQUlUX01TID0gMzBfMDAwXG4gICAgICAgIGNvbnN0IFBPTExfSU5URVJWQUxfTVMgPSA1MDBcbiAgICAgICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgTUFYX1dBSVRfTVNcblxuICAgICAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICAgICAgYXdhaXQgc2xlZXAoUE9MTF9JTlRFUlZBTF9NUylcbiAgICAgICAgICBjdXJyZW50QXBwU3RhdGUgPSB0b29sVXNlQ29udGV4dC5nZXRBcHBTdGF0ZSgpXG5cbiAgICAgICAgICAvLyBFYXJseSBleGl0OiBpZiBhbnkgcmVxdWlyZWQgc2VydmVyIGhhcyBhbHJlYWR5IGZhaWxlZCwgbm8gcG9pbnRcbiAgICAgICAgICAvLyB3YWl0aW5nIGZvciBvdGhlciBwZW5kaW5nIHNlcnZlcnMg4oCUIHRoZSBjaGVjayB3aWxsIGZhaWwgcmVnYXJkbGVzcy5cbiAgICAgICAgICBjb25zdCBoYXNGYWlsZWRSZXF1aXJlZFNlcnZlciA9IGN1cnJlbnRBcHBTdGF0ZS5tY3AuY2xpZW50cy5zb21lKFxuICAgICAgICAgICAgYyA9PlxuICAgICAgICAgICAgICBjLnR5cGUgPT09ICdmYWlsZWQnICYmXG4gICAgICAgICAgICAgIHJlcXVpcmVkTWNwU2VydmVycy5zb21lKHBhdHRlcm4gPT5cbiAgICAgICAgICAgICAgICBjLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhwYXR0ZXJuLnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgIClcbiAgICAgICAgICBpZiAoaGFzRmFpbGVkUmVxdWlyZWRTZXJ2ZXIpIGJyZWFrXG5cbiAgICAgICAgICBjb25zdCBzdGlsbFBlbmRpbmcgPSBjdXJyZW50QXBwU3RhdGUubWNwLmNsaWVudHMuc29tZShcbiAgICAgICAgICAgIGMgPT5cbiAgICAgICAgICAgICAgYy50eXBlID09PSAncGVuZGluZycgJiZcbiAgICAgICAgICAgICAgcmVxdWlyZWRNY3BTZXJ2ZXJzLnNvbWUocGF0dGVybiA9PlxuICAgICAgICAgICAgICAgIGMubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHBhdHRlcm4udG9Mb3dlckNhc2UoKSksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgKVxuICAgICAgICAgIGlmICghc3RpbGxQZW5kaW5nKSBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBzZXJ2ZXJzIHRoYXQgYWN0dWFsbHkgaGF2ZSB0b29scyAobWVhbmluZyB0aGV5J3JlIGNvbm5lY3RlZCBBTkQgYXV0aGVudGljYXRlZClcbiAgICAgIGNvbnN0IHNlcnZlcnNXaXRoVG9vbHM6IHN0cmluZ1tdID0gW11cbiAgICAgIGZvciAoY29uc3QgdG9vbCBvZiBjdXJyZW50QXBwU3RhdGUubWNwLnRvb2xzKSB7XG4gICAgICAgIGlmICh0b29sLm5hbWU/LnN0YXJ0c1dpdGgoJ21jcF9fJykpIHtcbiAgICAgICAgICAvLyBFeHRyYWN0IHNlcnZlciBuYW1lIGZyb20gdG9vbCBuYW1lIChmb3JtYXQ6IG1jcF9fc2VydmVyTmFtZV9fdG9vbE5hbWUpXG4gICAgICAgICAgY29uc3QgcGFydHMgPSB0b29sLm5hbWUuc3BsaXQoJ19fJylcbiAgICAgICAgICBjb25zdCBzZXJ2ZXJOYW1lID0gcGFydHNbMV1cbiAgICAgICAgICBpZiAoc2VydmVyTmFtZSAmJiAhc2VydmVyc1dpdGhUb29scy5pbmNsdWRlcyhzZXJ2ZXJOYW1lKSkge1xuICAgICAgICAgICAgc2VydmVyc1dpdGhUb29scy5wdXNoKHNlcnZlck5hbWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghaGFzUmVxdWlyZWRNY3BTZXJ2ZXJzKHNlbGVjdGVkQWdlbnQsIHNlcnZlcnNXaXRoVG9vbHMpKSB7XG4gICAgICAgIGNvbnN0IG1pc3NpbmcgPSByZXF1aXJlZE1jcFNlcnZlcnMuZmlsdGVyKFxuICAgICAgICAgIHBhdHRlcm4gPT5cbiAgICAgICAgICAgICFzZXJ2ZXJzV2l0aFRvb2xzLnNvbWUoc2VydmVyID0+XG4gICAgICAgICAgICAgIHNlcnZlci50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHBhdHRlcm4udG9Mb3dlckNhc2UoKSksXG4gICAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQWdlbnQgJyR7c2VsZWN0ZWRBZ2VudC5hZ2VudFR5cGV9JyByZXF1aXJlcyBNQ1Agc2VydmVycyBtYXRjaGluZzogJHttaXNzaW5nLmpvaW4oJywgJyl9LiBgICtcbiAgICAgICAgICAgIGBNQ1Agc2VydmVycyB3aXRoIHRvb2xzOiAke3NlcnZlcnNXaXRoVG9vbHMubGVuZ3RoID4gMCA/IHNlcnZlcnNXaXRoVG9vbHMuam9pbignLCAnKSA6ICdub25lJ30uIGAgK1xuICAgICAgICAgICAgYFVzZSAvbWNwIHRvIGNvbmZpZ3VyZSBhbmQgYXV0aGVudGljYXRlIHRoZSByZXF1aXJlZCBNQ1Agc2VydmVycy5gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgY29sb3IgZm9yIHRoaXMgYWdlbnQgaWYgaXQgaGFzIGEgcHJlZGVmaW5lZCBvbmVcbiAgICBpZiAoc2VsZWN0ZWRBZ2VudC5jb2xvcikge1xuICAgICAgc2V0QWdlbnRDb2xvcihzZWxlY3RlZEFnZW50LmFnZW50VHlwZSwgc2VsZWN0ZWRBZ2VudC5jb2xvcilcbiAgICB9XG5cbiAgICAvLyBSZXNvbHZlIGFnZW50IHBhcmFtcyBmb3IgbG9nZ2luZyAodGhlc2UgYXJlIGFscmVhZHkgcmVzb2x2ZWQgaW4gcnVuQWdlbnQpXG4gICAgY29uc3QgcmVzb2x2ZWRBZ2VudE1vZGVsID0gZ2V0QWdlbnRNb2RlbChcbiAgICAgIHNlbGVjdGVkQWdlbnQubW9kZWwsXG4gICAgICB0b29sVXNlQ29udGV4dC5vcHRpb25zLm1haW5Mb29wTW9kZWwsXG4gICAgICBpc0ZvcmtQYXRoID8gdW5kZWZpbmVkIDogbW9kZWwsXG4gICAgICBwZXJtaXNzaW9uTW9kZSxcbiAgICApXG5cbiAgICBsb2dFdmVudCgndGVuZ3VfYWdlbnRfdG9vbF9zZWxlY3RlZCcsIHtcbiAgICAgIGFnZW50X3R5cGU6XG4gICAgICAgIHNlbGVjdGVkQWdlbnQuYWdlbnRUeXBlIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICBtb2RlbDpcbiAgICAgICAgcmVzb2x2ZWRBZ2VudE1vZGVsIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICBzb3VyY2U6XG4gICAgICAgIHNlbGVjdGVkQWdlbnQuc291cmNlIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICBjb2xvcjpcbiAgICAgICAgc2VsZWN0ZWRBZ2VudC5jb2xvciBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgICAgaXNfYnVpbHRfaW5fYWdlbnQ6IGlzQnVpbHRJbkFnZW50KHNlbGVjdGVkQWdlbnQpLFxuICAgICAgaXNfcmVzdW1lOiBmYWxzZSxcbiAgICAgIGlzX2FzeW5jOlxuICAgICAgICAocnVuX2luX2JhY2tncm91bmQgPT09IHRydWUgfHwgc2VsZWN0ZWRBZ2VudC5iYWNrZ3JvdW5kID09PSB0cnVlKSAmJlxuICAgICAgICAhaXNCYWNrZ3JvdW5kVGFza3NEaXNhYmxlZCxcbiAgICAgIGlzX2Zvcms6IGlzRm9ya1BhdGgsXG4gICAgfSlcblxuICAgIC8vIFJlc29sdmUgZWZmZWN0aXZlIGlzb2xhdGlvbiBtb2RlIChleHBsaWNpdCBwYXJhbSBvdmVycmlkZXMgYWdlbnQgZGVmKVxuICAgIGNvbnN0IGVmZmVjdGl2ZUlzb2xhdGlvbiA9IGlzb2xhdGlvbiA/PyBzZWxlY3RlZEFnZW50Lmlzb2xhdGlvblxuXG4gICAgLy8gUmVtb3RlIGlzb2xhdGlvbjogZGVsZWdhdGUgdG8gQ0NSLiBHYXRlZCBhbnQtb25seSDigJQgdGhlIGd1YXJkIGVuYWJsZXNcbiAgICAvLyBkZWFkIGNvZGUgZWxpbWluYXRpb24gb2YgdGhlIGVudGlyZSBibG9jayBmb3IgZXh0ZXJuYWwgYnVpbGRzLlxuICAgIGlmIChcImV4dGVybmFsXCIgPT09ICdhbnQnICYmIGVmZmVjdGl2ZUlzb2xhdGlvbiA9PT0gJ3JlbW90ZScpIHtcbiAgICAgIGNvbnN0IGVsaWdpYmlsaXR5ID0gYXdhaXQgY2hlY2tSZW1vdGVBZ2VudEVsaWdpYmlsaXR5KClcbiAgICAgIGlmICghZWxpZ2liaWxpdHkuZWxpZ2libGUpIHtcbiAgICAgICAgY29uc3QgcmVhc29ucyA9IGVsaWdpYmlsaXR5LmVycm9yc1xuICAgICAgICAgIC5tYXAoZm9ybWF0UHJlY29uZGl0aW9uRXJyb3IpXG4gICAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGxhdW5jaCByZW1vdGUgYWdlbnQ6XFxuJHtyZWFzb25zfWApXG4gICAgICB9XG5cbiAgICAgIGxldCBidW5kbGVGYWlsSGludDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgdGVsZXBvcnRUb1JlbW90ZSh7XG4gICAgICAgIGluaXRpYWxNZXNzYWdlOiBwcm9tcHQsXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICBzaWduYWw6IHRvb2xVc2VDb250ZXh0LmFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgIG9uQnVuZGxlRmFpbDogbXNnID0+IHtcbiAgICAgICAgICBidW5kbGVGYWlsSGludCA9IG1zZ1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYnVuZGxlRmFpbEhpbnQgPz8gJ0ZhaWxlZCB0byBjcmVhdGUgcmVtb3RlIHNlc3Npb24nKVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHRhc2tJZCwgc2Vzc2lvbklkIH0gPSByZWdpc3RlclJlbW90ZUFnZW50VGFzayh7XG4gICAgICAgIHJlbW90ZVRhc2tUeXBlOiAncmVtb3RlLWFnZW50JyxcbiAgICAgICAgc2Vzc2lvbjogeyBpZDogc2Vzc2lvbi5pZCwgdGl0bGU6IHNlc3Npb24udGl0bGUgfHwgZGVzY3JpcHRpb24gfSxcbiAgICAgICAgY29tbWFuZDogcHJvbXB0LFxuICAgICAgICBjb250ZXh0OiB0b29sVXNlQ29udGV4dCxcbiAgICAgICAgdG9vbFVzZUlkOiB0b29sVXNlQ29udGV4dC50b29sVXNlSWQsXG4gICAgICB9KVxuXG4gICAgICBsb2dFdmVudCgndGVuZ3VfYWdlbnRfdG9vbF9yZW1vdGVfbGF1bmNoZWQnLCB7XG4gICAgICAgIGFnZW50X3R5cGU6XG4gICAgICAgICAgc2VsZWN0ZWRBZ2VudC5hZ2VudFR5cGUgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IHJlbW90ZVJlc3VsdDogUmVtb3RlTGF1bmNoZWRPdXRwdXQgPSB7XG4gICAgICAgIHN0YXR1czogJ3JlbW90ZV9sYXVuY2hlZCcsXG4gICAgICAgIHRhc2tJZCxcbiAgICAgICAgc2Vzc2lvblVybDogZ2V0UmVtb3RlVGFza1Nlc3Npb25Vcmwoc2Vzc2lvbklkKSxcbiAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIHByb21wdCxcbiAgICAgICAgb3V0cHV0RmlsZTogZ2V0VGFza091dHB1dFBhdGgodGFza0lkKSxcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGRhdGE6IHJlbW90ZVJlc3VsdCB9IGFzIHVua25vd24gYXMgeyBkYXRhOiBPdXRwdXQgfVxuICAgIH1cbiAgICAvLyBTeXN0ZW0gcHJvbXB0ICsgcHJvbXB0IG1lc3NhZ2VzOiBicmFuY2ggb24gZm9yayBwYXRoLlxuICAgIC8vXG4gICAgLy8gRm9yayBwYXRoOiBjaGlsZCBpbmhlcml0cyB0aGUgUEFSRU5UJ3Mgc3lzdGVtIHByb21wdCAobm90IEZPUktfQUdFTlQncylcbiAgICAvLyBmb3IgY2FjaGUtaWRlbnRpY2FsIEFQSSByZXF1ZXN0IHByZWZpeGVzLiBQcm9tcHQgbWVzc2FnZXMgYXJlIGJ1aWx0IHZpYVxuICAgIC8vIGJ1aWxkRm9ya2VkTWVzc2FnZXMoKSB3aGljaCBjbG9uZXMgdGhlIHBhcmVudCdzIGZ1bGwgYXNzaXN0YW50IG1lc3NhZ2VcbiAgICAvLyAoYWxsIHRvb2xfdXNlIGJsb2NrcykgKyBwbGFjZWhvbGRlciB0b29sX3Jlc3VsdHMgKyBwZXItY2hpbGQgZGlyZWN0aXZlLlxuICAgIC8vXG4gICAgLy8gTm9ybWFsIHBhdGg6IGJ1aWxkIHRoZSBzZWxlY3RlZCBhZ2VudCdzIG93biBzeXN0ZW0gcHJvbXB0IHdpdGggZW52XG4gICAgLy8gZGV0YWlscywgYW5kIHVzZSBhIHNpbXBsZSB1c2VyIG1lc3NhZ2UgZm9yIHRoZSBwcm9tcHQuXG4gICAgbGV0IGVuaGFuY2VkU3lzdGVtUHJvbXB0OiBzdHJpbmdbXSB8IHVuZGVmaW5lZFxuICAgIGxldCBmb3JrUGFyZW50U3lzdGVtUHJvbXB0OlxuICAgICAgfCBSZXR1cm5UeXBlPHR5cGVvZiBidWlsZEVmZmVjdGl2ZVN5c3RlbVByb21wdD5cbiAgICAgIHwgdW5kZWZpbmVkXG4gICAgbGV0IHByb21wdE1lc3NhZ2VzOiBNZXNzYWdlVHlwZVtdXG5cbiAgICBpZiAoaXNGb3JrUGF0aCkge1xuICAgICAgaWYgKHRvb2xVc2VDb250ZXh0LnJlbmRlcmVkU3lzdGVtUHJvbXB0KSB7XG4gICAgICAgIGZvcmtQYXJlbnRTeXN0ZW1Qcm9tcHQgPSB0b29sVXNlQ29udGV4dC5yZW5kZXJlZFN5c3RlbVByb21wdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmFsbGJhY2s6IHJlY29tcHV0ZS4gTWF5IGRpdmVyZ2UgZnJvbSBwYXJlbnQncyBjYWNoZWQgYnl0ZXMgaWZcbiAgICAgICAgLy8gR3Jvd3RoQm9vayBzdGF0ZSBjaGFuZ2VkIGJldHdlZW4gcGFyZW50IHR1cm4tc3RhcnQgYW5kIGZvcmsgc3Bhd24uXG4gICAgICAgIGNvbnN0IG1haW5UaHJlYWRBZ2VudERlZmluaXRpb24gPSBhcHBTdGF0ZS5hZ2VudFxuICAgICAgICAgID8gYXBwU3RhdGUuYWdlbnREZWZpbml0aW9ucy5hY3RpdmVBZ2VudHMuZmluZChcbiAgICAgICAgICAgICAgYSA9PiBhLmFnZW50VHlwZSA9PT0gYXBwU3RhdGUuYWdlbnQsXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFdvcmtpbmdEaXJlY3RvcmllcyA9IEFycmF5LmZyb20oXG4gICAgICAgICAgYXBwU3RhdGUudG9vbFBlcm1pc3Npb25Db250ZXh0LmFkZGl0aW9uYWxXb3JraW5nRGlyZWN0b3JpZXMua2V5cygpLFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IGRlZmF1bHRTeXN0ZW1Qcm9tcHQgPSBhd2FpdCBnZXRTeXN0ZW1Qcm9tcHQoXG4gICAgICAgICAgdG9vbFVzZUNvbnRleHQub3B0aW9ucy50b29scyxcbiAgICAgICAgICB0b29sVXNlQ29udGV4dC5vcHRpb25zLm1haW5Mb29wTW9kZWwsXG4gICAgICAgICAgYWRkaXRpb25hbFdvcmtpbmdEaXJlY3RvcmllcyxcbiAgICAgICAgICB0b29sVXNlQ29udGV4dC5vcHRpb25zLm1jcENsaWVudHMsXG4gICAgICAgIClcbiAgICAgICAgZm9ya1BhcmVudFN5c3RlbVByb21wdCA9IGJ1aWxkRWZmZWN0aXZlU3lzdGVtUHJvbXB0KHtcbiAgICAgICAgICBtYWluVGhyZWFkQWdlbnREZWZpbml0aW9uLFxuICAgICAgICAgIHRvb2xVc2VDb250ZXh0LFxuICAgICAgICAgIGN1c3RvbVN5c3RlbVByb21wdDogdG9vbFVzZUNvbnRleHQub3B0aW9ucy5jdXN0b21TeXN0ZW1Qcm9tcHQsXG4gICAgICAgICAgZGVmYXVsdFN5c3RlbVByb21wdCxcbiAgICAgICAgICBhcHBlbmRTeXN0ZW1Qcm9tcHQ6IHRvb2xVc2VDb250ZXh0Lm9wdGlvbnMuYXBwZW5kU3lzdGVtUHJvbXB0LFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgcHJvbXB0TWVzc2FnZXMgPSBidWlsZEZvcmtlZE1lc3NhZ2VzKHByb21wdCwgYXNzaXN0YW50TWVzc2FnZSlcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFdvcmtpbmdEaXJlY3RvcmllcyA9IEFycmF5LmZyb20oXG4gICAgICAgICAgYXBwU3RhdGUudG9vbFBlcm1pc3Npb25Db250ZXh0LmFkZGl0aW9uYWxXb3JraW5nRGlyZWN0b3JpZXMua2V5cygpLFxuICAgICAgICApXG5cbiAgICAgICAgLy8gQWxsIGFnZW50cyBoYXZlIGdldFN5c3RlbVByb21wdCAtIHBhc3MgdG9vbFVzZUNvbnRleHQgdG8gYWxsXG4gICAgICAgIGNvbnN0IGFnZW50UHJvbXB0ID0gc2VsZWN0ZWRBZ2VudC5nZXRTeXN0ZW1Qcm9tcHQoeyB0b29sVXNlQ29udGV4dCB9KVxuXG4gICAgICAgIC8vIExvZyBhZ2VudCBtZW1vcnkgbG9hZGVkIGV2ZW50IGZvciBzdWJhZ2VudHNcbiAgICAgICAgaWYgKHNlbGVjdGVkQWdlbnQubWVtb3J5KSB7XG4gICAgICAgICAgbG9nRXZlbnQoJ3Rlbmd1X2FnZW50X21lbW9yeV9sb2FkZWQnLCB7XG4gICAgICAgICAgICAuLi4oXCJleHRlcm5hbFwiID09PSAnYW50JyAmJiB7XG4gICAgICAgICAgICAgIGFnZW50X3R5cGU6XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRBZ2VudC5hZ2VudFR5cGUgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc2NvcGU6XG4gICAgICAgICAgICAgIHNlbGVjdGVkQWdlbnQubWVtb3J5IGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgICAgICBzb3VyY2U6XG4gICAgICAgICAgICAgICdzdWJhZ2VudCcgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgZW52aXJvbm1lbnQgZGV0YWlscyBlbmhhbmNlbWVudFxuICAgICAgICBlbmhhbmNlZFN5c3RlbVByb21wdCA9IGF3YWl0IGVuaGFuY2VTeXN0ZW1Qcm9tcHRXaXRoRW52RGV0YWlscyhcbiAgICAgICAgICBbYWdlbnRQcm9tcHRdLFxuICAgICAgICAgIHJlc29sdmVkQWdlbnRNb2RlbCxcbiAgICAgICAgICBhZGRpdGlvbmFsV29ya2luZ0RpcmVjdG9yaWVzLFxuICAgICAgICApXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dGb3JEZWJ1Z2dpbmcoXG4gICAgICAgICAgYEZhaWxlZCB0byBnZXQgc3lzdGVtIHByb21wdCBmb3IgYWdlbnQgJHtzZWxlY3RlZEFnZW50LmFnZW50VHlwZX06ICR7ZXJyb3JNZXNzYWdlKGVycm9yKX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBwcm9tcHRNZXNzYWdlcyA9IFtjcmVhdGVVc2VyTWVzc2FnZSh7IGNvbnRlbnQ6IHByb21wdCB9KV1cbiAgICB9XG5cbiAgICBjb25zdCBtZXRhZGF0YSA9IHtcbiAgICAgIHByb21wdCxcbiAgICAgIHJlc29sdmVkQWdlbnRNb2RlbCxcbiAgICAgIGlzQnVpbHRJbkFnZW50OiBpc0J1aWx0SW5BZ2VudChzZWxlY3RlZEFnZW50KSxcbiAgICAgIHN0YXJ0VGltZSxcbiAgICAgIGFnZW50VHlwZTogc2VsZWN0ZWRBZ2VudC5hZ2VudFR5cGUsXG4gICAgICBpc0FzeW5jOlxuICAgICAgICAocnVuX2luX2JhY2tncm91bmQgPT09IHRydWUgfHwgc2VsZWN0ZWRBZ2VudC5iYWNrZ3JvdW5kID09PSB0cnVlKSAmJlxuICAgICAgICAhaXNCYWNrZ3JvdW5kVGFza3NEaXNhYmxlZCxcbiAgICB9XG5cbiAgICAvLyBVc2UgaW5saW5lIGVudiBjaGVjayBpbnN0ZWFkIG9mIGNvb3JkaW5hdG9yTW9kdWxlIHRvIGF2b2lkIGNpcmN1bGFyXG4gICAgLy8gZGVwZW5kZW5jeSBpc3N1ZXMgZHVyaW5nIHRlc3QgbW9kdWxlIGxvYWRpbmcuXG4gICAgY29uc3QgaXNDb29yZGluYXRvciA9IGZlYXR1cmUoJ0NPT1JESU5BVE9SX01PREUnKVxuICAgICAgPyBpc0VudlRydXRoeShwcm9jZXNzLmVudi5DTEFVREVfQ09ERV9DT09SRElOQVRPUl9NT0RFKVxuICAgICAgOiBmYWxzZVxuXG4gICAgLy8gRm9yayBzdWJhZ2VudCBleHBlcmltZW50OiBmb3JjZSBBTEwgc3Bhd25zIGFzeW5jIGZvciBhIHVuaWZpZWRcbiAgICAvLyA8dGFzay1ub3RpZmljYXRpb24+IGludGVyYWN0aW9uIG1vZGVsIChub3QganVzdCBmb3JrIHNwYXducyDigJQgYWxsIG9mIHRoZW0pLlxuICAgIGNvbnN0IGZvcmNlQXN5bmMgPSBpc0ZvcmtTdWJhZ2VudEVuYWJsZWQoKVxuXG4gICAgLy8gQXNzaXN0YW50IG1vZGU6IGZvcmNlIGFsbCBhZ2VudHMgYXN5bmMuIFN5bmNocm9ub3VzIHN1YmFnZW50cyBob2xkIHRoZVxuICAgIC8vIG1haW4gbG9vcCdzIHR1cm4gb3BlbiB1bnRpbCB0aGV5IGNvbXBsZXRlIOKAlCB0aGUgZGFlbW9uJ3MgaW5wdXRRdWV1ZVxuICAgIC8vIGJhY2tzIHVwLCBhbmQgdGhlIGZpcnN0IG92ZXJkdWUgY3JvbiBjYXRjaC11cCBvbiBzcGF3biBiZWNvbWVzIE5cbiAgICAvLyBzZXJpYWwgc3ViYWdlbnQgdHVybnMgYmxvY2tpbmcgYWxsIHVzZXIgaW5wdXQuIFNhbWUgZ2F0ZSBhc1xuICAgIC8vIGV4ZWN1dGVGb3JrZWRTbGFzaENvbW1hbmQncyBmaXJlLWFuZC1mb3JnZXQgcGF0aDsgdGhlXG4gICAgLy8gPHRhc2stbm90aWZpY2F0aW9uPiByZS1lbnRyeSB0aGVyZSBpcyBoYW5kbGVkIGJ5IHRoZSBlbHNlIGJyYW5jaFxuICAgIC8vIGJlbG93IChyZWdpc3RlckFzeW5jQWdlbnRUYXNrICsgbm90aWZ5T25Db21wbGV0aW9uKS5cbiAgICBjb25zdCBhc3Npc3RhbnRGb3JjZUFzeW5jID0gZmVhdHVyZSgnS0FJUk9TJylcbiAgICAgID8gYXBwU3RhdGUua2Fpcm9zRW5hYmxlZFxuICAgICAgOiBmYWxzZVxuXG4gICAgY29uc3Qgc2hvdWxkUnVuQXN5bmMgPVxuICAgICAgKHJ1bl9pbl9iYWNrZ3JvdW5kID09PSB0cnVlIHx8XG4gICAgICAgIHNlbGVjdGVkQWdlbnQuYmFja2dyb3VuZCA9PT0gdHJ1ZSB8fFxuICAgICAgICBpc0Nvb3JkaW5hdG9yIHx8XG4gICAgICAgIGZvcmNlQXN5bmMgfHxcbiAgICAgICAgYXNzaXN0YW50Rm9yY2VBc3luYyB8fFxuICAgICAgICAocHJvYWN0aXZlTW9kdWxlPy5pc1Byb2FjdGl2ZUFjdGl2ZSgpID8/IGZhbHNlKSkgJiZcbiAgICAgICFpc0JhY2tncm91bmRUYXNrc0Rpc2FibGVkXG4gICAgLy8gQXNzZW1ibGUgdGhlIHdvcmtlcidzIHRvb2wgcG9vbCBpbmRlcGVuZGVudGx5IG9mIHRoZSBwYXJlbnQncy5cbiAgICAvLyBXb3JrZXJzIGFsd2F5cyBnZXQgdGhlaXIgdG9vbHMgZnJvbSBhc3NlbWJsZVRvb2xQb29sIHdpdGggdGhlaXIgb3duXG4gICAgLy8gcGVybWlzc2lvbiBtb2RlLCBzbyB0aGV5IGFyZW4ndCBhZmZlY3RlZCBieSB0aGUgcGFyZW50J3MgdG9vbFxuICAgIC8vIHJlc3RyaWN0aW9ucy4gVGhpcyBpcyBjb21wdXRlZCBoZXJlIHNvIHRoYXQgcnVuQWdlbnQgZG9lc24ndCBuZWVkIHRvXG4gICAgLy8gaW1wb3J0IGZyb20gdG9vbHMudHMgKHdoaWNoIHdvdWxkIGNyZWF0ZSBhIGNpcmN1bGFyIGRlcGVuZGVuY3kpLlxuICAgIGNvbnN0IHdvcmtlclBlcm1pc3Npb25Db250ZXh0ID0ge1xuICAgICAgLi4uYXBwU3RhdGUudG9vbFBlcm1pc3Npb25Db250ZXh0LFxuICAgICAgbW9kZTogc2VsZWN0ZWRBZ2VudC5wZXJtaXNzaW9uTW9kZSA/PyAnYWNjZXB0RWRpdHMnLFxuICAgIH1cbiAgICBjb25zdCB3b3JrZXJUb29scyA9IGFzc2VtYmxlVG9vbFBvb2woXG4gICAgICB3b3JrZXJQZXJtaXNzaW9uQ29udGV4dCxcbiAgICAgIGFwcFN0YXRlLm1jcC50b29scyxcbiAgICApXG5cbiAgICAvLyBDcmVhdGUgYSBzdGFibGUgYWdlbnQgSUQgZWFybHkgc28gaXQgY2FuIGJlIHVzZWQgZm9yIHdvcmt0cmVlIHNsdWdcbiAgICBjb25zdCBlYXJseUFnZW50SWQgPSBjcmVhdGVBZ2VudElkKClcblxuICAgIC8vIFNldCB1cCB3b3JrdHJlZSBpc29sYXRpb24gaWYgcmVxdWVzdGVkXG4gICAgbGV0IHdvcmt0cmVlSW5mbzoge1xuICAgICAgd29ya3RyZWVQYXRoOiBzdHJpbmdcbiAgICAgIHdvcmt0cmVlQnJhbmNoPzogc3RyaW5nXG4gICAgICBoZWFkQ29tbWl0Pzogc3RyaW5nXG4gICAgICBnaXRSb290Pzogc3RyaW5nXG4gICAgICBob29rQmFzZWQ/OiBib29sZWFuXG4gICAgfSB8IG51bGwgPSBudWxsXG5cbiAgICBpZiAoZWZmZWN0aXZlSXNvbGF0aW9uID09PSAnd29ya3RyZWUnKSB7XG4gICAgICBjb25zdCBzbHVnID0gYGFnZW50LSR7ZWFybHlBZ2VudElkLnNsaWNlKDAsIDgpfWBcbiAgICAgIHdvcmt0cmVlSW5mbyA9IGF3YWl0IGNyZWF0ZUFnZW50V29ya3RyZWUoc2x1ZylcbiAgICB9XG5cbiAgICAvLyBGb3JrICsgd29ya3RyZWU6IGluamVjdCBhIG5vdGljZSB0ZWxsaW5nIHRoZSBjaGlsZCB0byB0cmFuc2xhdGUgcGF0aHNcbiAgICAvLyBhbmQgcmUtcmVhZCBwb3RlbnRpYWxseSBzdGFsZSBmaWxlcy4gQXBwZW5kZWQgYWZ0ZXIgdGhlIGZvcmsgZGlyZWN0aXZlXG4gICAgLy8gc28gaXQgYXBwZWFycyBhcyB0aGUgbW9zdCByZWNlbnQgZ3VpZGFuY2UgdGhlIGNoaWxkIHNlZXMuXG4gICAgaWYgKGlzRm9ya1BhdGggJiYgd29ya3RyZWVJbmZvKSB7XG4gICAgICBwcm9tcHRNZXNzYWdlcy5wdXNoKFxuICAgICAgICBjcmVhdGVVc2VyTWVzc2FnZSh7XG4gICAgICAgICAgY29udGVudDogYnVpbGRXb3JrdHJlZU5vdGljZShnZXRDd2QoKSwgd29ya3RyZWVJbmZvLndvcmt0cmVlUGF0aCksXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IHJ1bkFnZW50UGFyYW1zOiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5BZ2VudD5bMF0gPSB7XG4gICAgICBhZ2VudERlZmluaXRpb246IHNlbGVjdGVkQWdlbnQsXG4gICAgICBwcm9tcHRNZXNzYWdlcyxcbiAgICAgIHRvb2xVc2VDb250ZXh0LFxuICAgICAgY2FuVXNlVG9vbCxcbiAgICAgIGlzQXN5bmM6IHNob3VsZFJ1bkFzeW5jLFxuICAgICAgcXVlcnlTb3VyY2U6XG4gICAgICAgIHRvb2xVc2VDb250ZXh0Lm9wdGlvbnMucXVlcnlTb3VyY2UgPz9cbiAgICAgICAgZ2V0UXVlcnlTb3VyY2VGb3JBZ2VudChcbiAgICAgICAgICBzZWxlY3RlZEFnZW50LmFnZW50VHlwZSxcbiAgICAgICAgICBpc0J1aWx0SW5BZ2VudChzZWxlY3RlZEFnZW50KSxcbiAgICAgICAgKSxcbiAgICAgIG1vZGVsOiBpc0ZvcmtQYXRoID8gdW5kZWZpbmVkIDogbW9kZWwsXG4gICAgICAvLyBGb3JrIHBhdGg6IHBhc3MgcGFyZW50J3Mgc3lzdGVtIHByb21wdCBBTkQgcGFyZW50J3MgZXhhY3QgdG9vbFxuICAgICAgLy8gYXJyYXkgKGNhY2hlLWlkZW50aWNhbCBwcmVmaXgpLiB3b3JrZXJUb29scyBpcyByZWJ1aWx0IHVuZGVyXG4gICAgICAvLyBwZXJtaXNzaW9uTW9kZSAnYnViYmxlJyB3aGljaCBkaWZmZXJzIGZyb20gdGhlIHBhcmVudCdzIG1vZGUsIHNvXG4gICAgICAvLyBpdHMgdG9vbC1kZWYgc2VyaWFsaXphdGlvbiBkaXZlcmdlcyBhbmQgYnJlYWtzIGNhY2hlIGF0IHRoZSBmaXJzdFxuICAgICAgLy8gZGlmZmVyaW5nIHRvb2wuIHVzZUV4YWN0VG9vbHMgYWxzbyBpbmhlcml0cyB0aGUgcGFyZW50J3NcbiAgICAgIC8vIHRoaW5raW5nQ29uZmlnIGFuZCBpc05vbkludGVyYWN0aXZlU2Vzc2lvbiAoc2VlIHJ1bkFnZW50LnRzKS5cbiAgICAgIC8vXG4gICAgICAvLyBOb3JtYWwgcGF0aDogd2hlbiBhIGN3ZCBvdmVycmlkZSBpcyBpbiBlZmZlY3QgKHdvcmt0cmVlIGlzb2xhdGlvblxuICAgICAgLy8gb3IgZXhwbGljaXQgY3dkKSwgc2tpcCB0aGUgcHJlLWJ1aWx0IHN5c3RlbSBwcm9tcHQgc28gcnVuQWdlbnQnc1xuICAgICAgLy8gYnVpbGRBZ2VudFN5c3RlbVByb21wdCgpIHJ1bnMgaW5zaWRlIHdyYXBXaXRoQ3dkIHdoZXJlIGdldEN3ZCgpXG4gICAgICAvLyByZXR1cm5zIHRoZSBvdmVycmlkZSBwYXRoLlxuICAgICAgb3ZlcnJpZGU6IGlzRm9ya1BhdGhcbiAgICAgICAgPyB7IHN5c3RlbVByb21wdDogZm9ya1BhcmVudFN5c3RlbVByb21wdCB9XG4gICAgICAgIDogZW5oYW5jZWRTeXN0ZW1Qcm9tcHQgJiYgIXdvcmt0cmVlSW5mbyAmJiAhY3dkXG4gICAgICAgICAgPyB7IHN5c3RlbVByb21wdDogYXNTeXN0ZW1Qcm9tcHQoZW5oYW5jZWRTeXN0ZW1Qcm9tcHQpIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGF2YWlsYWJsZVRvb2xzOiBpc0ZvcmtQYXRoID8gdG9vbFVzZUNvbnRleHQub3B0aW9ucy50b29scyA6IHdvcmtlclRvb2xzLFxuICAgICAgLy8gUGFzcyBwYXJlbnQgY29udmVyc2F0aW9uIHdoZW4gdGhlIGZvcmstc3ViYWdlbnQgcGF0aCBuZWVkcyBmdWxsXG4gICAgICAvLyBjb250ZXh0LiB1c2VFeGFjdFRvb2xzIGluaGVyaXRzIHRoaW5raW5nQ29uZmlnIChydW5BZ2VudC50czo2MjQpLlxuICAgICAgZm9ya0NvbnRleHRNZXNzYWdlczogaXNGb3JrUGF0aCA/IHRvb2xVc2VDb250ZXh0Lm1lc3NhZ2VzIDogdW5kZWZpbmVkLFxuICAgICAgLi4uKGlzRm9ya1BhdGggJiYgeyB1c2VFeGFjdFRvb2xzOiB0cnVlIH0pLFxuICAgICAgd29ya3RyZWVQYXRoOiB3b3JrdHJlZUluZm8/Lndvcmt0cmVlUGF0aCxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgIH1cblxuICAgIC8vIEhlbHBlciB0byB3cmFwIGV4ZWN1dGlvbiB3aXRoIGEgY3dkIG92ZXJyaWRlOiBleHBsaWNpdCBjd2QgYXJnIChLQUlST1MpXG4gICAgLy8gdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHdvcmt0cmVlIGlzb2xhdGlvbiBwYXRoLlxuICAgIGNvbnN0IGN3ZE92ZXJyaWRlUGF0aCA9IGN3ZCA/PyB3b3JrdHJlZUluZm8/Lndvcmt0cmVlUGF0aFxuICAgIGNvbnN0IHdyYXBXaXRoQ3dkID0gPFQsPihmbjogKCkgPT4gVCk6IFQgPT5cbiAgICAgIGN3ZE92ZXJyaWRlUGF0aCA/IHJ1bldpdGhDd2RPdmVycmlkZShjd2RPdmVycmlkZVBhdGgsIGZuKSA6IGZuKClcblxuICAgIC8vIEhlbHBlciB0byBjbGVhbiB1cCB3b3JrdHJlZSBhZnRlciBhZ2VudCBjb21wbGV0ZXNcbiAgICBjb25zdCBjbGVhbnVwV29ya3RyZWVJZk5lZWRlZCA9IGFzeW5jICgpOiBQcm9taXNlPHtcbiAgICAgIHdvcmt0cmVlUGF0aD86IHN0cmluZ1xuICAgICAgd29ya3RyZWVCcmFuY2g/OiBzdHJpbmdcbiAgICB9PiA9PiB7XG4gICAgICBpZiAoIXdvcmt0cmVlSW5mbykgcmV0dXJuIHt9XG4gICAgICBjb25zdCB7IHdvcmt0cmVlUGF0aCwgd29ya3RyZWVCcmFuY2gsIGhlYWRDb21taXQsIGdpdFJvb3QsIGhvb2tCYXNlZCB9ID1cbiAgICAgICAgd29ya3RyZWVJbmZvXG4gICAgICAvLyBOdWxsIG91dCB0byBtYWtlIGlkZW1wb3RlbnQg4oCUIGd1YXJkcyBhZ2FpbnN0IGRvdWJsZS1jYWxsIGlmIGNvZGVcbiAgICAgIC8vIGJldHdlZW4gY2xlYW51cCBhbmQgZW5kIG9mIHRyeSB0aHJvd3MgaW50byBjYXRjaFxuICAgICAgd29ya3RyZWVJbmZvID0gbnVsbFxuICAgICAgaWYgKGhvb2tCYXNlZCkge1xuICAgICAgICAvLyBIb29rLWJhc2VkIHdvcmt0cmVlcyBhcmUgYWx3YXlzIGtlcHQgc2luY2Ugd2UgY2FuJ3QgZGV0ZWN0IFZDUyBjaGFuZ2VzXG4gICAgICAgIGxvZ0ZvckRlYnVnZ2luZyhgSG9vay1iYXNlZCBhZ2VudCB3b3JrdHJlZSBrZXB0IGF0OiAke3dvcmt0cmVlUGF0aH1gKVxuICAgICAgICByZXR1cm4geyB3b3JrdHJlZVBhdGggfVxuICAgICAgfVxuICAgICAgaWYgKGhlYWRDb21taXQpIHtcbiAgICAgICAgY29uc3QgY2hhbmdlZCA9IGF3YWl0IGhhc1dvcmt0cmVlQ2hhbmdlcyh3b3JrdHJlZVBhdGgsIGhlYWRDb21taXQpXG4gICAgICAgIGlmICghY2hhbmdlZCkge1xuICAgICAgICAgIGF3YWl0IHJlbW92ZUFnZW50V29ya3RyZWUod29ya3RyZWVQYXRoLCB3b3JrdHJlZUJyYW5jaCwgZ2l0Um9vdClcbiAgICAgICAgICAvLyBDbGVhciB3b3JrdHJlZVBhdGggZnJvbSBtZXRhZGF0YSBzbyByZXN1bWUgZG9lc24ndCB0cnkgdG8gdXNlXG4gICAgICAgICAgLy8gYSBkZWxldGVkIGRpcmVjdG9yeS4gRmlyZS1hbmQtZm9yZ2V0IHRvIG1hdGNoIHJ1bkFnZW50J3NcbiAgICAgICAgICAvLyB3cml0ZUFnZW50TWV0YWRhdGEgaGFuZGxpbmcuXG4gICAgICAgICAgdm9pZCB3cml0ZUFnZW50TWV0YWRhdGEoYXNBZ2VudElkKGVhcmx5QWdlbnRJZCksIHtcbiAgICAgICAgICAgIGFnZW50VHlwZTogc2VsZWN0ZWRBZ2VudC5hZ2VudFR5cGUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICB9KS5jYXRjaChfZXJyID0+XG4gICAgICAgICAgICBsb2dGb3JEZWJ1Z2dpbmcoYEZhaWxlZCB0byBjbGVhciB3b3JrdHJlZSBtZXRhZGF0YTogJHtfZXJyfWApLFxuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbG9nRm9yRGVidWdnaW5nKGBBZ2VudCB3b3JrdHJlZSBoYXMgY2hhbmdlcywga2VlcGluZzogJHt3b3JrdHJlZVBhdGh9YClcbiAgICAgIHJldHVybiB7IHdvcmt0cmVlUGF0aCwgd29ya3RyZWVCcmFuY2ggfVxuICAgIH1cblxuICAgIGlmIChzaG91bGRSdW5Bc3luYykge1xuICAgICAgY29uc3QgYXN5bmNBZ2VudElkID0gZWFybHlBZ2VudElkXG4gICAgICBjb25zdCBhZ2VudEJhY2tncm91bmRUYXNrID0gcmVnaXN0ZXJBc3luY0FnZW50KHtcbiAgICAgICAgYWdlbnRJZDogYXN5bmNBZ2VudElkLFxuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgcHJvbXB0LFxuICAgICAgICBzZWxlY3RlZEFnZW50LFxuICAgICAgICBzZXRBcHBTdGF0ZTogcm9vdFNldEFwcFN0YXRlLFxuICAgICAgICAvLyBEb24ndCBsaW5rIHRvIHBhcmVudCdzIGFib3J0IGNvbnRyb2xsZXIgLS0gYmFja2dyb3VuZCBhZ2VudHMgc2hvdWxkXG4gICAgICAgIC8vIHN1cnZpdmUgd2hlbiB0aGUgdXNlciBwcmVzc2VzIEVTQyB0byBjYW5jZWwgdGhlIG1haW4gdGhyZWFkLlxuICAgICAgICAvLyBUaGV5IGFyZSBraWxsZWQgZXhwbGljaXRseSB2aWEgY2hhdDpraWxsQWdlbnRzLlxuICAgICAgICB0b29sVXNlSWQ6IHRvb2xVc2VDb250ZXh0LnRvb2xVc2VJZCxcbiAgICAgIH0pXG5cbiAgICAgIC8vIFJlZ2lzdGVyIG5hbWUg4oaSIGFnZW50SWQgZm9yIFNlbmRNZXNzYWdlIHJvdXRpbmcuIFBvc3QtcmVnaXN0ZXJBc3luY0FnZW50XG4gICAgICAvLyBzbyB3ZSBkb24ndCBsZWF2ZSBhIHN0YWxlIGVudHJ5IGlmIHNwYXduIGZhaWxzLiBTeW5jIGFnZW50cyBza2lwcGVkIOKAlFxuICAgICAgLy8gY29vcmRpbmF0b3IgaXMgYmxvY2tlZCwgc28gU2VuZE1lc3NhZ2Ugcm91dGluZyBkb2Vzbid0IGFwcGx5LlxuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgcm9vdFNldEFwcFN0YXRlKHByZXYgPT4ge1xuICAgICAgICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwKHByZXYuYWdlbnROYW1lUmVnaXN0cnkpXG4gICAgICAgICAgbmV4dC5zZXQobmFtZSwgYXNBZ2VudElkKGFzeW5jQWdlbnRJZCkpXG4gICAgICAgICAgcmV0dXJuIHsgLi4ucHJldiwgYWdlbnROYW1lUmVnaXN0cnk6IG5leHQgfVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyBXcmFwIGFzeW5jIGFnZW50IGV4ZWN1dGlvbiBpbiBhZ2VudCBjb250ZXh0IGZvciBhbmFseXRpY3MgYXR0cmlidXRpb25cbiAgICAgIGNvbnN0IGFzeW5jQWdlbnRDb250ZXh0ID0ge1xuICAgICAgICBhZ2VudElkOiBhc3luY0FnZW50SWQsXG4gICAgICAgIC8vIEZvciBzdWJhZ2VudHMgZnJvbSB0ZWFtbWF0ZXM6IHVzZSB0ZWFtIGxlYWQncyBzZXNzaW9uXG4gICAgICAgIC8vIEZvciBzdWJhZ2VudHMgZnJvbSBtYWluIFJFUEw6IHVuZGVmaW5lZCAobm8gcGFyZW50IHNlc3Npb24pXG4gICAgICAgIHBhcmVudFNlc3Npb25JZDogZ2V0UGFyZW50U2Vzc2lvbklkKCksXG4gICAgICAgIGFnZW50VHlwZTogJ3N1YmFnZW50JyBhcyBjb25zdCxcbiAgICAgICAgc3ViYWdlbnROYW1lOiBzZWxlY3RlZEFnZW50LmFnZW50VHlwZSxcbiAgICAgICAgaXNCdWlsdEluOiBpc0J1aWx0SW5BZ2VudChzZWxlY3RlZEFnZW50KSxcbiAgICAgICAgaW52b2tpbmdSZXF1ZXN0SWQ6IGFzc2lzdGFudE1lc3NhZ2U/LnJlcXVlc3RJZCxcbiAgICAgICAgaW52b2NhdGlvbktpbmQ6ICdzcGF3bicgYXMgY29uc3QsXG4gICAgICAgIGludm9jYXRpb25FbWl0dGVkOiBmYWxzZSxcbiAgICAgIH1cblxuICAgICAgLy8gV29ya2xvYWQgcHJvcGFnYXRpb246IGhhbmRsZVByb21wdFN1Ym1pdCB3cmFwcyB0aGUgZW50aXJlIHR1cm4gaW5cbiAgICAgIC8vIHJ1bldpdGhXb3JrbG9hZCAoQXN5bmNMb2NhbFN0b3JhZ2UpLiBBTFMgY29udGV4dCBpcyBjYXB0dXJlZCBhdFxuICAgICAgLy8gaW52b2NhdGlvbiB0aW1lIOKAlCB3aGVuIHRoaXMgYHZvaWRgIGZpcmVzIOKAlCBhbmQgc3Vydml2ZXMgZXZlcnkgYXdhaXRcbiAgICAgIC8vIGluc2lkZS4gTm8gY2FwdHVyZS9yZXN0b3JlIG5lZWRlZDsgdGhlIGRldGFjaGVkIGNsb3N1cmUgc2VlcyB0aGVcbiAgICAgIC8vIHBhcmVudCB0dXJuJ3Mgd29ya2xvYWQgYXV0b21hdGljYWxseSwgaXNvbGF0ZWQgZnJvbSBpdHMgZmluYWxseS5cbiAgICAgIHZvaWQgcnVuV2l0aEFnZW50Q29udGV4dChhc3luY0FnZW50Q29udGV4dCwgKCkgPT5cbiAgICAgICAgd3JhcFdpdGhDd2QoKCkgPT5cbiAgICAgICAgICBydW5Bc3luY0FnZW50TGlmZWN5Y2xlKHtcbiAgICAgICAgICAgIHRhc2tJZDogYWdlbnRCYWNrZ3JvdW5kVGFzay5hZ2VudElkLFxuICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyOiBhZ2VudEJhY2tncm91bmRUYXNrLmFib3J0Q29udHJvbGxlciEsXG4gICAgICAgICAgICBtYWtlU3RyZWFtOiBvbkNhY2hlU2FmZVBhcmFtcyA9PlxuICAgICAgICAgICAgICBydW5BZ2VudCh7XG4gICAgICAgICAgICAgICAgLi4ucnVuQWdlbnRQYXJhbXMsXG4gICAgICAgICAgICAgICAgb3ZlcnJpZGU6IHtcbiAgICAgICAgICAgICAgICAgIC4uLnJ1bkFnZW50UGFyYW1zLm92ZXJyaWRlLFxuICAgICAgICAgICAgICAgICAgYWdlbnRJZDogYXNBZ2VudElkKGFnZW50QmFja2dyb3VuZFRhc2suYWdlbnRJZCksXG4gICAgICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXI6IGFnZW50QmFja2dyb3VuZFRhc2suYWJvcnRDb250cm9sbGVyISxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uQ2FjaGVTYWZlUGFyYW1zLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICB0b29sVXNlQ29udGV4dCxcbiAgICAgICAgICAgIHJvb3RTZXRBcHBTdGF0ZSxcbiAgICAgICAgICAgIGFnZW50SWRGb3JDbGVhbnVwOiBhc3luY0FnZW50SWQsXG4gICAgICAgICAgICBlbmFibGVTdW1tYXJpemF0aW9uOlxuICAgICAgICAgICAgICBpc0Nvb3JkaW5hdG9yIHx8XG4gICAgICAgICAgICAgIGlzRm9ya1N1YmFnZW50RW5hYmxlZCgpIHx8XG4gICAgICAgICAgICAgIGdldFNka0FnZW50UHJvZ3Jlc3NTdW1tYXJpZXNFbmFibGVkKCksXG4gICAgICAgICAgICBnZXRXb3JrdHJlZVJlc3VsdDogY2xlYW51cFdvcmt0cmVlSWZOZWVkZWQsXG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICApXG5cbiAgICAgIGNvbnN0IGNhblJlYWRPdXRwdXRGaWxlID0gdG9vbFVzZUNvbnRleHQub3B0aW9ucy50b29scy5zb21lKFxuICAgICAgICB0ID0+XG4gICAgICAgICAgdG9vbE1hdGNoZXNOYW1lKHQsIEZJTEVfUkVBRF9UT09MX05BTUUpIHx8XG4gICAgICAgICAgdG9vbE1hdGNoZXNOYW1lKHQsIEJBU0hfVE9PTF9OQU1FKSxcbiAgICAgIClcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBpc0FzeW5jOiB0cnVlIGFzIGNvbnN0LFxuICAgICAgICAgIHN0YXR1czogJ2FzeW5jX2xhdW5jaGVkJyBhcyBjb25zdCxcbiAgICAgICAgICBhZ2VudElkOiBhZ2VudEJhY2tncm91bmRUYXNrLmFnZW50SWQsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uLFxuICAgICAgICAgIHByb21wdDogcHJvbXB0LFxuICAgICAgICAgIG91dHB1dEZpbGU6IGdldFRhc2tPdXRwdXRQYXRoKGFnZW50QmFja2dyb3VuZFRhc2suYWdlbnRJZCksXG4gICAgICAgICAgY2FuUmVhZE91dHB1dEZpbGUsXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBhbiBleHBsaWNpdCBhZ2VudElkIGZvciBzeW5jIGFnZW50c1xuICAgICAgY29uc3Qgc3luY0FnZW50SWQgPSBhc0FnZW50SWQoZWFybHlBZ2VudElkKVxuXG4gICAgICAvLyBTZXQgdXAgYWdlbnQgY29udGV4dCBmb3Igc3luYyBleGVjdXRpb24gKGZvciBhbmFseXRpY3MgYXR0cmlidXRpb24pXG4gICAgICBjb25zdCBzeW5jQWdlbnRDb250ZXh0ID0ge1xuICAgICAgICBhZ2VudElkOiBzeW5jQWdlbnRJZCxcbiAgICAgICAgLy8gRm9yIHN1YmFnZW50cyBmcm9tIHRlYW1tYXRlczogdXNlIHRlYW0gbGVhZCdzIHNlc3Npb25cbiAgICAgICAgLy8gRm9yIHN1YmFnZW50cyBmcm9tIG1haW4gUkVQTDogdW5kZWZpbmVkIChubyBwYXJlbnQgc2Vzc2lvbilcbiAgICAgICAgcGFyZW50U2Vzc2lvbklkOiBnZXRQYXJlbnRTZXNzaW9uSWQoKSxcbiAgICAgICAgYWdlbnRUeXBlOiAnc3ViYWdlbnQnIGFzIGNvbnN0LFxuICAgICAgICBzdWJhZ2VudE5hbWU6IHNlbGVjdGVkQWdlbnQuYWdlbnRUeXBlLFxuICAgICAgICBpc0J1aWx0SW46IGlzQnVpbHRJbkFnZW50KHNlbGVjdGVkQWdlbnQpLFxuICAgICAgICBpbnZva2luZ1JlcXVlc3RJZDogYXNzaXN0YW50TWVzc2FnZT8ucmVxdWVzdElkLFxuICAgICAgICBpbnZvY2F0aW9uS2luZDogJ3NwYXduJyBhcyBjb25zdCxcbiAgICAgICAgaW52b2NhdGlvbkVtaXR0ZWQ6IGZhbHNlLFxuICAgICAgfVxuXG4gICAgICAvLyBXcmFwIGVudGlyZSBzeW5jIGFnZW50IGV4ZWN1dGlvbiBpbiBjb250ZXh0IGZvciBhbmFseXRpY3MgYXR0cmlidXRpb25cbiAgICAgIC8vIGFuZCBvcHRpb25hbGx5IGluIGEgd29ya3RyZWUgY3dkIG92ZXJyaWRlIGZvciBmaWxlc3lzdGVtIGlzb2xhdGlvblxuICAgICAgcmV0dXJuIHJ1bldpdGhBZ2VudENvbnRleHQoc3luY0FnZW50Q29udGV4dCwgKCkgPT5cbiAgICAgICAgd3JhcFdpdGhDd2QoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFnZW50TWVzc2FnZXM6IE1lc3NhZ2VUeXBlW10gPSBbXVxuICAgICAgICAgIGNvbnN0IGFnZW50U3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICAgIGNvbnN0IHN5bmNUcmFja2VyID0gY3JlYXRlUHJvZ3Jlc3NUcmFja2VyKClcbiAgICAgICAgICBjb25zdCBzeW5jUmVzb2x2ZUFjdGl2aXR5ID0gY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvblJlc29sdmVyKFxuICAgICAgICAgICAgdG9vbFVzZUNvbnRleHQub3B0aW9ucy50b29scyxcbiAgICAgICAgICApXG5cbiAgICAgICAgICAvLyBZaWVsZCBpbml0aWFsIHByb2dyZXNzIG1lc3NhZ2UgdG8gY2FycnkgbWV0YWRhdGEgKHByb21wdClcbiAgICAgICAgICBpZiAocHJvbXB0TWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFByb21wdE1lc3NhZ2VzID0gbm9ybWFsaXplTWVzc2FnZXMocHJvbXB0TWVzc2FnZXMpXG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkRmlyc3RNZXNzYWdlID0gbm9ybWFsaXplZFByb21wdE1lc3NhZ2VzLmZpbmQoXG4gICAgICAgICAgICAgIChtKTogbSBpcyBOb3JtYWxpemVkVXNlck1lc3NhZ2UgPT4gbS50eXBlID09PSAndXNlcicsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIG5vcm1hbGl6ZWRGaXJzdE1lc3NhZ2UgJiZcbiAgICAgICAgICAgICAgbm9ybWFsaXplZEZpcnN0TWVzc2FnZS50eXBlID09PSAndXNlcicgJiZcbiAgICAgICAgICAgICAgb25Qcm9ncmVzc1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIG9uUHJvZ3Jlc3Moe1xuICAgICAgICAgICAgICAgIHRvb2xVc2VJRDogYGFnZW50XyR7YXNzaXN0YW50TWVzc2FnZS5tZXNzYWdlLmlkfWAsXG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogbm9ybWFsaXplZEZpcnN0TWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdhZ2VudF9wcm9ncmVzcycsXG4gICAgICAgICAgICAgICAgICBwcm9tcHQsXG4gICAgICAgICAgICAgICAgICBhZ2VudElkOiBzeW5jQWdlbnRJZCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlZ2lzdGVyIGFzIGZvcmVncm91bmQgdGFzayBpbW1lZGlhdGVseSBzbyBpdCBjYW4gYmUgYmFja2dyb3VuZGVkIGF0IGFueSB0aW1lXG4gICAgICAgICAgLy8gU2tpcCByZWdpc3RyYXRpb24gaWYgYmFja2dyb3VuZCB0YXNrcyBhcmUgZGlzYWJsZWRcbiAgICAgICAgICBsZXQgZm9yZWdyb3VuZFRhc2tJZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgICAgLy8gQ3JlYXRlIHRoZSBiYWNrZ3JvdW5kIHJhY2UgcHJvbWlzZSBvbmNlIG91dHNpZGUgdGhlIGxvb3Ag4oCUIG90aGVyd2lzZVxuICAgICAgICAgIC8vIGVhY2ggaXRlcmF0aW9uIGFkZHMgYSBuZXcgLnRoZW4oKSByZWFjdGlvbiB0byB0aGUgc2FtZSBwZW5kaW5nXG4gICAgICAgICAgLy8gcHJvbWlzZSwgYWNjdW11bGF0aW5nIGNhbGxiYWNrcyBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBhZ2VudC5cbiAgICAgICAgICBsZXQgYmFja2dyb3VuZFByb21pc2U6IFByb21pc2U8eyB0eXBlOiAnYmFja2dyb3VuZCcgfT4gfCB1bmRlZmluZWRcbiAgICAgICAgICBsZXQgY2FuY2VsQXV0b0JhY2tncm91bmQ6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuICAgICAgICAgIGlmICghaXNCYWNrZ3JvdW5kVGFza3NEaXNhYmxlZCkge1xuICAgICAgICAgICAgY29uc3QgcmVnaXN0cmF0aW9uID0gcmVnaXN0ZXJBZ2VudEZvcmVncm91bmQoe1xuICAgICAgICAgICAgICBhZ2VudElkOiBzeW5jQWdlbnRJZCxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIHByb21wdCxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRBZ2VudCxcbiAgICAgICAgICAgICAgc2V0QXBwU3RhdGU6IHJvb3RTZXRBcHBTdGF0ZSxcbiAgICAgICAgICAgICAgdG9vbFVzZUlkOiB0b29sVXNlQ29udGV4dC50b29sVXNlSWQsXG4gICAgICAgICAgICAgIGF1dG9CYWNrZ3JvdW5kTXM6IGdldEF1dG9CYWNrZ3JvdW5kTXMoKSB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgZm9yZWdyb3VuZFRhc2tJZCA9IHJlZ2lzdHJhdGlvbi50YXNrSWRcbiAgICAgICAgICAgIGJhY2tncm91bmRQcm9taXNlID0gcmVnaXN0cmF0aW9uLmJhY2tncm91bmRTaWduYWwudGhlbigoKSA9PiAoe1xuICAgICAgICAgICAgICB0eXBlOiAnYmFja2dyb3VuZCcgYXMgY29uc3QsXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIGNhbmNlbEF1dG9CYWNrZ3JvdW5kID0gcmVnaXN0cmF0aW9uLmNhbmNlbEF1dG9CYWNrZ3JvdW5kXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVHJhY2sgaWYgd2UndmUgc2hvd24gdGhlIGJhY2tncm91bmQgaGludCBVSVxuICAgICAgICAgIGxldCBiYWNrZ3JvdW5kSGludFNob3duID0gZmFsc2VcbiAgICAgICAgICAvLyBUcmFjayBpZiB0aGUgYWdlbnQgd2FzIGJhY2tncm91bmRlZCAoY2xlYW51cCBoYW5kbGVkIGJ5IGJhY2tncm91bmRlZCBmaW5hbGx5KVxuICAgICAgICAgIGxldCB3YXNCYWNrZ3JvdW5kZWQgPSBmYWxzZVxuICAgICAgICAgIC8vIFBlci1zY29wZSBzdG9wIGZ1bmN0aW9uIOKAlCBOT1Qgc2hhcmVkIHdpdGggdGhlIGJhY2tncm91bmRlZCBjbG9zdXJlLlxuICAgICAgICAgIC8vIGlkZW1wb3RlbnQ6IHN0YXJ0QWdlbnRTdW1tYXJpemF0aW9uJ3Mgc3RvcCgpIGNoZWNrcyBgc3RvcHBlZGAgZmxhZy5cbiAgICAgICAgICBsZXQgc3RvcEZvcmVncm91bmRTdW1tYXJpemF0aW9uOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWRcbiAgICAgICAgICAvLyBjb25zdCBjYXB0dXJlIGZvciBzb3VuZCB0eXBlIG5hcnJvd2luZyBpbnNpZGUgdGhlIGNhbGxiYWNrIGJlbG93XG4gICAgICAgICAgY29uc3Qgc3VtbWFyeVRhc2tJZCA9IGZvcmVncm91bmRUYXNrSWRcblxuICAgICAgICAgIC8vIEdldCBhc3luYyBpdGVyYXRvciBmb3IgdGhlIGFnZW50XG4gICAgICAgICAgY29uc3QgYWdlbnRJdGVyYXRvciA9IHJ1bkFnZW50KHtcbiAgICAgICAgICAgIC4uLnJ1bkFnZW50UGFyYW1zLFxuICAgICAgICAgICAgb3ZlcnJpZGU6IHtcbiAgICAgICAgICAgICAgLi4ucnVuQWdlbnRQYXJhbXMub3ZlcnJpZGUsXG4gICAgICAgICAgICAgIGFnZW50SWQ6IHN5bmNBZ2VudElkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uQ2FjaGVTYWZlUGFyYW1zOlxuICAgICAgICAgICAgICBzdW1tYXJ5VGFza0lkICYmIGdldFNka0FnZW50UHJvZ3Jlc3NTdW1tYXJpZXNFbmFibGVkKClcbiAgICAgICAgICAgICAgICA/IChwYXJhbXM6IENhY2hlU2FmZVBhcmFtcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHN0b3AgfSA9IHN0YXJ0QWdlbnRTdW1tYXJpemF0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlUYXNrSWQsXG4gICAgICAgICAgICAgICAgICAgICAgc3luY0FnZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICAgIHJvb3RTZXRBcHBTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBzdG9wRm9yZWdyb3VuZFN1bW1hcml6YXRpb24gPSBzdG9wXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKClcblxuICAgICAgICAgIC8vIFRyYWNrIGlmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBpdGVyYXRpb25cbiAgICAgICAgICBsZXQgc3luY0FnZW50RXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkXG4gICAgICAgICAgbGV0IHdhc0Fib3J0ZWQgPSBmYWxzZVxuICAgICAgICAgIGxldCB3b3JrdHJlZVJlc3VsdDoge1xuICAgICAgICAgICAgd29ya3RyZWVQYXRoPzogc3RyaW5nXG4gICAgICAgICAgICB3b3JrdHJlZUJyYW5jaD86IHN0cmluZ1xuICAgICAgICAgIH0gPSB7fVxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gYWdlbnRTdGFydFRpbWVcblxuICAgICAgICAgICAgICAvLyBTaG93IGJhY2tncm91bmQgaGludCBhZnRlciB0aHJlc2hvbGQgKGJ1dCB0YXNrIGlzIGFscmVhZHkgcmVnaXN0ZXJlZClcbiAgICAgICAgICAgICAgLy8gU2tpcCBpZiBiYWNrZ3JvdW5kIHRhc2tzIGFyZSBkaXNhYmxlZFxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIWlzQmFja2dyb3VuZFRhc2tzRGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAhYmFja2dyb3VuZEhpbnRTaG93biAmJlxuICAgICAgICAgICAgICAgIGVsYXBzZWQgPj0gUFJPR1JFU1NfVEhSRVNIT0xEX01TICYmXG4gICAgICAgICAgICAgICAgdG9vbFVzZUNvbnRleHQuc2V0VG9vbEpTWFxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kSGludFNob3duID0gdHJ1ZVxuICAgICAgICAgICAgICAgIHRvb2xVc2VDb250ZXh0LnNldFRvb2xKU1goe1xuICAgICAgICAgICAgICAgICAganN4OiA8QmFja2dyb3VuZEhpbnQgLz4sXG4gICAgICAgICAgICAgICAgICBzaG91bGRIaWRlUHJvbXB0SW5wdXQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgc2hvdWxkQ29udGludWVBbmltYXRpb246IHRydWUsXG4gICAgICAgICAgICAgICAgICBzaG93U3Bpbm5lcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gUmFjZSBiZXR3ZWVuIG5leHQgbWVzc2FnZSBhbmQgYmFja2dyb3VuZCBzaWduYWxcbiAgICAgICAgICAgICAgLy8gSWYgYmFja2dyb3VuZCB0YXNrcyBhcmUgZGlzYWJsZWQsIGp1c3QgYXdhaXQgdGhlIG5leHQgbWVzc2FnZSBkaXJlY3RseVxuICAgICAgICAgICAgICBjb25zdCBuZXh0TWVzc2FnZVByb21pc2UgPSBhZ2VudEl0ZXJhdG9yLm5leHQoKVxuICAgICAgICAgICAgICBjb25zdCByYWNlUmVzdWx0ID0gYmFja2dyb3VuZFByb21pc2VcbiAgICAgICAgICAgICAgICA/IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgICAgICAgICAgICAgIG5leHRNZXNzYWdlUHJvbWlzZS50aGVuKHIgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbWVzc2FnZScgYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiByLFxuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRQcm9taXNlLFxuICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ21lc3NhZ2UnIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IGF3YWl0IG5leHRNZXNzYWdlUHJvbWlzZSxcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSB3ZXJlIGJhY2tncm91bmRlZCB2aWEgYmFja2dyb3VuZEFsbCgpXG4gICAgICAgICAgICAgIC8vIGZvcmVncm91bmRUYXNrSWQgaXMgZ3VhcmFudGVlZCB0byBiZSBkZWZpbmVkIGlmIHJhY2VSZXN1bHQudHlwZSBpcyAnYmFja2dyb3VuZCdcbiAgICAgICAgICAgICAgLy8gYmVjYXVzZSBiYWNrZ3JvdW5kUHJvbWlzZSBpcyBvbmx5IGRlZmluZWQgd2hlbiBmb3JlZ3JvdW5kVGFza0lkIGlzIGRlZmluZWRcbiAgICAgICAgICAgICAgaWYgKHJhY2VSZXN1bHQudHlwZSA9PT0gJ2JhY2tncm91bmQnICYmIGZvcmVncm91bmRUYXNrSWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcHBTdGF0ZSA9IHRvb2xVc2VDb250ZXh0LmdldEFwcFN0YXRlKClcbiAgICAgICAgICAgICAgICBjb25zdCB0YXNrID0gYXBwU3RhdGUudGFza3NbZm9yZWdyb3VuZFRhc2tJZF1cbiAgICAgICAgICAgICAgICBpZiAoaXNMb2NhbEFnZW50VGFzayh0YXNrKSAmJiB0YXNrLmlzQmFja2dyb3VuZGVkKSB7XG4gICAgICAgICAgICAgICAgICAvLyBDYXB0dXJlIHRoZSB0YXNrSWQgZm9yIHVzZSBpbiB0aGUgYXN5bmMgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tncm91bmRlZFRhc2tJZCA9IGZvcmVncm91bmRUYXNrSWRcbiAgICAgICAgICAgICAgICAgIHdhc0JhY2tncm91bmRlZCA9IHRydWVcbiAgICAgICAgICAgICAgICAgIC8vIFN0b3AgZm9yZWdyb3VuZCBzdW1tYXJpemF0aW9uOyB0aGUgYmFja2dyb3VuZGVkIGNsb3N1cmVcbiAgICAgICAgICAgICAgICAgIC8vIGJlbG93IG93bnMgaXRzIG93biBpbmRlcGVuZGVudCBzdG9wIGZ1bmN0aW9uLlxuICAgICAgICAgICAgICAgICAgc3RvcEZvcmVncm91bmRTdW1tYXJpemF0aW9uPy4oKVxuXG4gICAgICAgICAgICAgICAgICAvLyBXb3JrbG9hZDogaW5oZXJpdGVkIHZpYSBBTFMgYXQgYHZvaWRgIGludm9jYXRpb24gdGltZSxcbiAgICAgICAgICAgICAgICAgIC8vIHNhbWUgYXMgdGhlIGFzeW5jLWZyb20tc3RhcnQgcGF0aCBhYm92ZS5cbiAgICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlIGFnZW50IGluIGJhY2tncm91bmQgYW5kIHJldHVybiBhc3luYyByZXN1bHRcbiAgICAgICAgICAgICAgICAgIHZvaWQgcnVuV2l0aEFnZW50Q29udGV4dChzeW5jQWdlbnRDb250ZXh0LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdG9wQmFja2dyb3VuZGVkU3VtbWFyaXphdGlvbjogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIGZvcmVncm91bmQgaXRlcmF0b3Igc28gaXRzIGZpbmFsbHkgYmxvY2sgcnVuc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIChyZWxlYXNlcyBNQ1AgY29ubmVjdGlvbnMsIHNlc3Npb24gaG9va3MsIHByb21wdCBjYWNoZSB0cmFja2luZywgZXRjLilcbiAgICAgICAgICAgICAgICAgICAgICAvLyBUaW1lb3V0IHByZXZlbnRzIGJsb2NraW5nIGlmIE1DUCBzZXJ2ZXIgY2xlYW51cCBoYW5ncy5cbiAgICAgICAgICAgICAgICAgICAgICAvLyAuY2F0Y2goKSBwcmV2ZW50cyB1bmhhbmRsZWQgcmVqZWN0aW9uIGlmIHRpbWVvdXQgd2lucyB0aGUgcmFjZS5cbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICAgICAgICAgICAgICAgICAgYWdlbnRJdGVyYXRvci5yZXR1cm4odW5kZWZpbmVkKS5jYXRjaCgoKSA9PiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICBzbGVlcCgxMDAwKSxcbiAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgcHJvZ3Jlc3MgdHJhY2tpbmcgZnJvbSBleGlzdGluZyBtZXNzYWdlc1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYWNrZXIgPSBjcmVhdGVQcm9ncmVzc1RyYWNrZXIoKVxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVBY3Rpdml0eTIgPVxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvblJlc29sdmVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sVXNlQ29udGV4dC5vcHRpb25zLnRvb2xzLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZXhpc3RpbmdNc2cgb2YgYWdlbnRNZXNzYWdlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUHJvZ3Jlc3NGcm9tTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdNc2csXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVBY3Rpdml0eTIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xVc2VDb250ZXh0Lm9wdGlvbnMudG9vbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgbXNnIG9mIHJ1bkFnZW50KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJ1bkFnZW50UGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNBc3luYzogdHJ1ZSwgLy8gQWdlbnQgaXMgbm93IHJ1bm5pbmcgaW4gYmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucnVuQWdlbnRQYXJhbXMub3ZlcnJpZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFnZW50SWQ6IGFzQWdlbnRJZChiYWNrZ3JvdW5kZWRUYXNrSWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXI6IHRhc2suYWJvcnRDb250cm9sbGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2FjaGVTYWZlUGFyYW1zOiBnZXRTZGtBZ2VudFByb2dyZXNzU3VtbWFyaWVzRW5hYmxlZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gKHBhcmFtczogQ2FjaGVTYWZlUGFyYW1zKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHN0b3AgfSA9IHN0YXJ0QWdlbnRTdW1tYXJpemF0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kZWRUYXNrSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzQWdlbnRJZChiYWNrZ3JvdW5kZWRUYXNrSWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RTZXRBcHBTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BCYWNrZ3JvdW5kZWRTdW1tYXJpemF0aW9uID0gc3RvcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFnZW50TWVzc2FnZXMucHVzaChtc2cpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyYWNrIHByb2dyZXNzIGZvciBiYWNrZ3JvdW5kZWQgYWdlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQcm9ncmVzc0Zyb21NZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtc2csXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVBY3Rpdml0eTIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xVc2VDb250ZXh0Lm9wdGlvbnMudG9vbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVBc3luY0FnZW50UHJvZ3Jlc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRlZFRhc2tJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvZ3Jlc3NVcGRhdGUodHJhY2tlciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RTZXRBcHBTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdFRvb2xOYW1lID0gZ2V0TGFzdFRvb2xVc2VOYW1lKG1zZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0VG9vbE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdFRhc2tQcm9ncmVzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRlZFRhc2tJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sVXNlQ29udGV4dC50b29sVXNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RUb29sTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhZ2VudFJlc3VsdCA9IGZpbmFsaXplQWdlbnRUb29sKFxuICAgICAgICAgICAgICAgICAgICAgICAgYWdlbnRNZXNzYWdlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRlZFRhc2tJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgdGFzayBjb21wbGV0ZWQgRklSU1Qgc28gVGFza091dHB1dChibG9jaz10cnVlKVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHVuYmxvY2tzIGltbWVkaWF0ZWx5LiBjbGFzc2lmeUhhbmRvZmZJZk5lZWRlZCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbnVwV29ya3RyZWVJZk5lZWRlZCBjYW4gaGFuZyDigJQgdGhleSBtdXN0IG5vdCBnYXRlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YXR1cyB0cmFuc2l0aW9uIChnaC0yMDIzNikuXG4gICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVBc3luY0FnZW50KGFnZW50UmVzdWx0LCByb290U2V0QXBwU3RhdGUpXG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IHRleHQgZnJvbSBhZ2VudCByZXN1bHQgY29udGVudCBmb3IgdGhlIG5vdGlmaWNhdGlvblxuICAgICAgICAgICAgICAgICAgICAgIGxldCBmaW5hbE1lc3NhZ2UgPSBleHRyYWN0VGV4dENvbnRlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBhZ2VudFJlc3VsdC5jb250ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1xcbicsXG4gICAgICAgICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUoJ1RSQU5TQ1JJUFRfQ0xBU1NJRklFUicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kZWRBcHBTdGF0ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xVc2VDb250ZXh0LmdldEFwcFN0YXRlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRvZmZXYXJuaW5nID0gYXdhaXQgY2xhc3NpZnlIYW5kb2ZmSWZOZWVkZWQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2VudE1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sczogdG9vbFVzZUNvbnRleHQub3B0aW9ucy50b29scyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbFBlcm1pc3Npb25Db250ZXh0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRlZEFwcFN0YXRlLnRvb2xQZXJtaXNzaW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IHRhc2suYWJvcnRDb250cm9sbGVyIS5zaWduYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmFnZW50VHlwZTogc2VsZWN0ZWRBZ2VudC5hZ2VudFR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsVG9vbFVzZUNvdW50OiBhZ2VudFJlc3VsdC50b3RhbFRvb2xVc2VDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZG9mZldhcm5pbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxNZXNzYWdlID0gYCR7aGFuZG9mZldhcm5pbmd9XFxuXFxuJHtmaW5hbE1lc3NhZ2V9YFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFuIHVwIHdvcmt0cmVlIGJlZm9yZSBub3RpZmljYXRpb24gc28gd2UgY2FuIGluY2x1ZGUgaXRcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JrdHJlZVJlc3VsdCA9IGF3YWl0IGNsZWFudXBXb3JrdHJlZUlmTmVlZGVkKClcblxuICAgICAgICAgICAgICAgICAgICAgIGVucXVldWVBZ2VudE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXNrSWQ6IGJhY2tncm91bmRlZFRhc2tJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnY29tcGxldGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFwcFN0YXRlOiByb290U2V0QXBwU3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbE1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2FnZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFRva2VuczogZ2V0VG9rZW5Db3VudEZyb21UcmFja2VyKHRyYWNrZXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sVXNlczogYWdlbnRSZXN1bHQudG90YWxUb29sVXNlQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uTXM6IGFnZW50UmVzdWx0LnRvdGFsRHVyYXRpb25NcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sVXNlSWQ6IHRvb2xVc2VDb250ZXh0LnRvb2xVc2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLndvcmt0cmVlUmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQWJvcnRFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNpdGlvbiBzdGF0dXMgQkVGT1JFIHdvcmt0cmVlIGNsZWFudXAgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRhc2tPdXRwdXQgdW5ibG9ja3MgZXZlbiBpZiBnaXQgaGFuZ3MgKGdoLTIwMjM2KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxBc3luY0FnZW50KGJhY2tncm91bmRlZFRhc2tJZCwgcm9vdFNldEFwcFN0YXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nRXZlbnQoJ3Rlbmd1X2FnZW50X3Rvb2xfdGVybWluYXRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlbnRfdHlwZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5hZ2VudFR5cGUgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWw6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEucmVzb2x2ZWRBZ2VudE1vZGVsIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uX21zOiBEYXRlLm5vdygpIC0gbWV0YWRhdGEuc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc19hc3luYzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfYnVpbHRfaW5fYWdlbnQ6IG1ldGFkYXRhLmlzQnVpbHRJbkFnZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXJfY2FuY2VsX2JhY2tncm91bmQnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd29ya3RyZWVSZXN1bHQgPSBhd2FpdCBjbGVhbnVwV29ya3RyZWVJZk5lZWRlZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJ0aWFsUmVzdWx0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdFBhcnRpYWxSZXN1bHQoYWdlbnRNZXNzYWdlcylcbiAgICAgICAgICAgICAgICAgICAgICAgIGVucXVldWVBZ2VudE5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tJZDogYmFja2dyb3VuZGVkVGFza0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAna2lsbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXBwU3RhdGU6IHJvb3RTZXRBcHBTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbFVzZUlkOiB0b29sVXNlQ29udGV4dC50b29sVXNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsTWVzc2FnZTogcGFydGlhbFJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ud29ya3RyZWVSZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVyck1zZyA9IGVycm9yTWVzc2FnZShlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgICBmYWlsQXN5bmNBZ2VudChcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRlZFRhc2tJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVyck1zZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RTZXRBcHBTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd29ya3RyZWVSZXN1bHQgPSBhd2FpdCBjbGVhbnVwV29ya3RyZWVJZk5lZWRlZCgpXG4gICAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZUFnZW50Tm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tJZDogYmFja2dyb3VuZGVkVGFza0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdmYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVyck1zZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFwcFN0YXRlOiByb290U2V0QXBwU3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sVXNlSWQ6IHRvb2xVc2VDb250ZXh0LnRvb2xVc2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLndvcmt0cmVlUmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RvcEJhY2tncm91bmRlZFN1bW1hcml6YXRpb24/LigpXG4gICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnZva2VkU2tpbGxzRm9yQWdlbnQoc3luY0FnZW50SWQpXG4gICAgICAgICAgICAgICAgICAgICAgY2xlYXJEdW1wU3RhdGUoc3luY0FnZW50SWQpXG4gICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogd29ya3RyZWUgY2xlYW51cCBpcyBkb25lIGJlZm9yZSBlbnF1ZXVlQWdlbnROb3RpZmljYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBib3RoIHRyeSBhbmQgY2F0Y2ggcGF0aHMgc28gd2UgY2FuIGluY2x1ZGUgd29ya3RyZWUgaW5mb1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gYXN5bmNfbGF1bmNoZWQgcmVzdWx0IGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgICBjb25zdCBjYW5SZWFkT3V0cHV0RmlsZSA9IHRvb2xVc2VDb250ZXh0Lm9wdGlvbnMudG9vbHMuc29tZShcbiAgICAgICAgICAgICAgICAgICAgdCA9PlxuICAgICAgICAgICAgICAgICAgICAgIHRvb2xNYXRjaGVzTmFtZSh0LCBGSUxFX1JFQURfVE9PTF9OQU1FKSB8fFxuICAgICAgICAgICAgICAgICAgICAgIHRvb2xNYXRjaGVzTmFtZSh0LCBCQVNIX1RPT0xfTkFNRSksXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgaXNBc3luYzogdHJ1ZSBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdhc3luY19sYXVuY2hlZCcgYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgICAgICAgYWdlbnRJZDogYmFja2dyb3VuZGVkVGFza0lkLFxuICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6IHByb21wdCxcbiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGaWxlOiBnZXRUYXNrT3V0cHV0UGF0aChiYWNrZ3JvdW5kZWRUYXNrSWQpLFxuICAgICAgICAgICAgICAgICAgICAgIGNhblJlYWRPdXRwdXRGaWxlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgcmFjZSByZXN1bHRcbiAgICAgICAgICAgICAgaWYgKHJhY2VSZXN1bHQudHlwZSAhPT0gJ21lc3NhZ2UnKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIC0gYmFja2dyb3VuZCBjYXNlIGhhbmRsZWQgYWJvdmVcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHsgcmVzdWx0IH0gPSByYWNlUmVzdWx0XG4gICAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkgYnJlYWtcbiAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHJlc3VsdC52YWx1ZVxuXG4gICAgICAgICAgICAgIGFnZW50TWVzc2FnZXMucHVzaChtZXNzYWdlKVxuXG4gICAgICAgICAgICAgIC8vIEVtaXQgdGFza19wcm9ncmVzcyBmb3IgdGhlIFZTIENvZGUgc3ViYWdlbnQgcGFuZWxcbiAgICAgICAgICAgICAgdXBkYXRlUHJvZ3Jlc3NGcm9tTWVzc2FnZShcbiAgICAgICAgICAgICAgICBzeW5jVHJhY2tlcixcbiAgICAgICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgICAgIHN5bmNSZXNvbHZlQWN0aXZpdHksXG4gICAgICAgICAgICAgICAgdG9vbFVzZUNvbnRleHQub3B0aW9ucy50b29scyxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAoZm9yZWdyb3VuZFRhc2tJZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RUb29sTmFtZSA9IGdldExhc3RUb29sVXNlTmFtZShtZXNzYWdlKVxuICAgICAgICAgICAgICAgIGlmIChsYXN0VG9vbE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIGVtaXRUYXNrUHJvZ3Jlc3MoXG4gICAgICAgICAgICAgICAgICAgIHN5bmNUcmFja2VyLFxuICAgICAgICAgICAgICAgICAgICBmb3JlZ3JvdW5kVGFza0lkLFxuICAgICAgICAgICAgICAgICAgICB0b29sVXNlQ29udGV4dC50b29sVXNlSWQsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICBhZ2VudFN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgbGFzdFRvb2xOYW1lLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgLy8gS2VlcCBBcHBTdGF0ZSB0YXNrLnByb2dyZXNzIGluIHN5bmMgd2hlbiBTREsgc3VtbWFyaWVzIGFyZVxuICAgICAgICAgICAgICAgICAgLy8gZW5hYmxlZCwgc28gdXBkYXRlQWdlbnRTdW1tYXJ5IHJlYWRzIGNvcnJlY3QgdG9rZW4vdG9vbCBjb3VudHNcbiAgICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgemVyb3MuXG4gICAgICAgICAgICAgICAgICBpZiAoZ2V0U2RrQWdlbnRQcm9ncmVzc1N1bW1hcmllc0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVBc3luY0FnZW50UHJvZ3Jlc3MoXG4gICAgICAgICAgICAgICAgICAgICAgZm9yZWdyb3VuZFRhc2tJZCxcbiAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9ncmVzc1VwZGF0ZShzeW5jVHJhY2tlciksXG4gICAgICAgICAgICAgICAgICAgICAgcm9vdFNldEFwcFN0YXRlLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gRm9yd2FyZCBiYXNoX3Byb2dyZXNzIGV2ZW50cyBmcm9tIHN1Yi1hZ2VudCB0byBwYXJlbnQgc28gdGhlIFNES1xuICAgICAgICAgICAgICAvLyByZWNlaXZlcyB0b29sX3Byb2dyZXNzIGV2ZW50cyBqdXN0IGFzIGl0IGRvZXMgZm9yIHRoZSBtYWluIGFnZW50LlxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID09PSAncHJvZ3Jlc3MnICYmXG4gICAgICAgICAgICAgICAgKG1lc3NhZ2UuZGF0YS50eXBlID09PSAnYmFzaF9wcm9ncmVzcycgfHxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YS50eXBlID09PSAncG93ZXJzaGVsbF9wcm9ncmVzcycpICYmXG4gICAgICAgICAgICAgICAgb25Qcm9ncmVzc1xuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBvblByb2dyZXNzKHtcbiAgICAgICAgICAgICAgICAgIHRvb2xVc2VJRDogbWVzc2FnZS50b29sVXNlSUQsXG4gICAgICAgICAgICAgICAgICBkYXRhOiBtZXNzYWdlLmRhdGEsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09ICdhc3Npc3RhbnQnICYmIG1lc3NhZ2UudHlwZSAhPT0gJ3VzZXInKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIEluY3JlbWVudCB0b2tlbiBjb3VudCBpbiBzcGlubmVyIGZvciBhc3Npc3RhbnQgbWVzc2FnZXNcbiAgICAgICAgICAgICAgLy8gU3ViYWdlbnQgc3RyZWFtaW5nIGV2ZW50cyBhcmUgZmlsdGVyZWQgb3V0IGluIHJ1bkFnZW50LnRzLCBzbyB3ZVxuICAgICAgICAgICAgICAvLyBuZWVkIHRvIGNvdW50IHRva2VucyBmcm9tIGNvbXBsZXRlZCBtZXNzYWdlcyBoZXJlXG4gICAgICAgICAgICAgIGlmIChtZXNzYWdlLnR5cGUgPT09ICdhc3Npc3RhbnQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudExlbmd0aCA9IGdldEFzc2lzdGFudE1lc3NhZ2VDb250ZW50TGVuZ3RoKG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICB0b29sVXNlQ29udGV4dC5zZXRSZXNwb25zZUxlbmd0aChsZW4gPT4gbGVuICsgY29udGVudExlbmd0aClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkTmV3ID0gbm9ybWFsaXplTWVzc2FnZXMoW21lc3NhZ2VdKVxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG0gb2Ygbm9ybWFsaXplZE5ldykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29udGVudCBvZiBtLm1lc3NhZ2UuY29udGVudCkge1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50LnR5cGUgIT09ICd0b29sX3VzZScgJiZcbiAgICAgICAgICAgICAgICAgICAgY29udGVudC50eXBlICE9PSAndG9vbF9yZXN1bHQnXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gRm9yd2FyZCBwcm9ncmVzcyB1cGRhdGVzXG4gICAgICAgICAgICAgICAgICBpZiAob25Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICBvblByb2dyZXNzKHtcbiAgICAgICAgICAgICAgICAgICAgICB0b29sVXNlSUQ6IGBhZ2VudF8ke2Fzc2lzdGFudE1lc3NhZ2UubWVzc2FnZS5pZH1gLFxuICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG0sXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYWdlbnRfcHJvZ3Jlc3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvbXB0IG9ubHkgbmVlZGVkIG9uIGZpcnN0IHByb2dyZXNzIG1lc3NhZ2UgKFVJLnRzeDo2MjRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWRzIHByb2dyZXNzTWVzc2FnZXNbMF0pLiBPbWl0IGhlcmUgdG8gYXZvaWQgZHVwbGljYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWdlbnRJZDogc3luY0FnZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGVycm9ycyBmcm9tIHRoZSBzeW5jIGFnZW50IGxvb3BcbiAgICAgICAgICAgIC8vIEFib3J0RXJyb3Igc2hvdWxkIGJlIHJlLXRocm93biBmb3IgcHJvcGVyIGludGVycnVwdGlvbiBoYW5kbGluZ1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQWJvcnRFcnJvcikge1xuICAgICAgICAgICAgICB3YXNBYm9ydGVkID0gdHJ1ZVxuICAgICAgICAgICAgICBsb2dFdmVudCgndGVuZ3VfYWdlbnRfdG9vbF90ZXJtaW5hdGVkJywge1xuICAgICAgICAgICAgICAgIGFnZW50X3R5cGU6XG4gICAgICAgICAgICAgICAgICBtZXRhZGF0YS5hZ2VudFR5cGUgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgICAgICAgICAgICBtb2RlbDpcbiAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnJlc29sdmVkQWdlbnRNb2RlbCBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgICAgICAgICAgICAgIGR1cmF0aW9uX21zOiBEYXRlLm5vdygpIC0gbWV0YWRhdGEuc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgIGlzX2FzeW5jOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc19idWlsdF9pbl9hZ2VudDogbWV0YWRhdGEuaXNCdWlsdEluQWdlbnQsXG4gICAgICAgICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgICAgICAgJ3VzZXJfY2FuY2VsX3N5bmMnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIExvZyB0aGUgZXJyb3IgZm9yIGRlYnVnZ2luZ1xuICAgICAgICAgICAgbG9nRm9yRGVidWdnaW5nKGBTeW5jIGFnZW50IGVycm9yOiAke2Vycm9yTWVzc2FnZShlcnJvcil9YCwge1xuICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBlcnJvciB0byBoYW5kbGUgYWZ0ZXIgY2xlYW51cFxuICAgICAgICAgICAgc3luY0FnZW50RXJyb3IgPSB0b0Vycm9yKGVycm9yKVxuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAvLyBDbGVhciB0aGUgYmFja2dyb3VuZCBoaW50IFVJXG4gICAgICAgICAgICBpZiAodG9vbFVzZUNvbnRleHQuc2V0VG9vbEpTWCkge1xuICAgICAgICAgICAgICB0b29sVXNlQ29udGV4dC5zZXRUb29sSlNYKG51bGwpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFN0b3AgZm9yZWdyb3VuZCBzdW1tYXJpemF0aW9uLiBJZGVtcG90ZW50IOKAlCBpZiBhbHJlYWR5IHN0b3BwZWQgYXRcbiAgICAgICAgICAgIC8vIHRoZSBiYWNrZ3JvdW5kaW5nIHRyYW5zaXRpb24sIHRoaXMgaXMgYSBuby1vcC4gVGhlIGJhY2tncm91bmRlZFxuICAgICAgICAgICAgLy8gY2xvc3VyZSBvd25zIGEgc2VwYXJhdGUgc3RvcCBmdW5jdGlvbiAoc3RvcEJhY2tncm91bmRlZFN1bW1hcml6YXRpb24pLlxuICAgICAgICAgICAgc3RvcEZvcmVncm91bmRTdW1tYXJpemF0aW9uPy4oKVxuXG4gICAgICAgICAgICAvLyBVbnJlZ2lzdGVyIGZvcmVncm91bmQgdGFzayBpZiBhZ2VudCBjb21wbGV0ZWQgd2l0aG91dCBiZWluZyBiYWNrZ3JvdW5kZWRcbiAgICAgICAgICAgIGlmIChmb3JlZ3JvdW5kVGFza0lkKSB7XG4gICAgICAgICAgICAgIHVucmVnaXN0ZXJBZ2VudEZvcmVncm91bmQoZm9yZWdyb3VuZFRhc2tJZCwgcm9vdFNldEFwcFN0YXRlKVxuICAgICAgICAgICAgICAvLyBOb3RpZnkgU0RLIGNvbnN1bWVycyAoZS5nLiBWUyBDb2RlIHN1YmFnZW50IHBhbmVsKSB0aGF0IHRoaXNcbiAgICAgICAgICAgICAgLy8gZm9yZWdyb3VuZCBhZ2VudCBpcyBkb25lLiBHb2VzIHRocm91Z2ggZHJhaW5TZGtFdmVudHMoKSDigJQgZG9lc1xuICAgICAgICAgICAgICAvLyBOT1QgdHJpZ2dlciB0aGUgcHJpbnQudHMgWE1MIHRhc2tfbm90aWZpY2F0aW9uIHBhcnNlciBvciB0aGUgTExNIGxvb3AuXG4gICAgICAgICAgICAgIGlmICghd2FzQmFja2dyb3VuZGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBnZXRQcm9ncmVzc1VwZGF0ZShzeW5jVHJhY2tlcilcbiAgICAgICAgICAgICAgICBlbnF1ZXVlU2RrRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3N5c3RlbScsXG4gICAgICAgICAgICAgICAgICBzdWJ0eXBlOiAndGFza19ub3RpZmljYXRpb24nLFxuICAgICAgICAgICAgICAgICAgdGFza19pZDogZm9yZWdyb3VuZFRhc2tJZCxcbiAgICAgICAgICAgICAgICAgIHRvb2xfdXNlX2lkOiB0b29sVXNlQ29udGV4dC50b29sVXNlSWQsXG4gICAgICAgICAgICAgICAgICBzdGF0dXM6IHN5bmNBZ2VudEVycm9yXG4gICAgICAgICAgICAgICAgICAgID8gJ2ZhaWxlZCdcbiAgICAgICAgICAgICAgICAgICAgOiB3YXNBYm9ydGVkXG4gICAgICAgICAgICAgICAgICAgICAgPyAnc3RvcHBlZCdcbiAgICAgICAgICAgICAgICAgICAgICA6ICdjb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgICAgb3V0cHV0X2ZpbGU6ICcnLFxuICAgICAgICAgICAgICAgICAgc3VtbWFyeTogZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICB1c2FnZToge1xuICAgICAgICAgICAgICAgICAgICB0b3RhbF90b2tlbnM6IHByb2dyZXNzLnRva2VuQ291bnQsXG4gICAgICAgICAgICAgICAgICAgIHRvb2xfdXNlczogcHJvZ3Jlc3MudG9vbFVzZUNvdW50LFxuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbl9tczogRGF0ZS5ub3coKSAtIGFnZW50U3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENsZWFuIHVwIHNjb3BlZCBza2lsbHMgc28gdGhleSBkb24ndCBhY2N1bXVsYXRlIGluIHRoZSBnbG9iYWwgbWFwXG4gICAgICAgICAgICBjbGVhckludm9rZWRTa2lsbHNGb3JBZ2VudChzeW5jQWdlbnRJZClcblxuICAgICAgICAgICAgLy8gQ2xlYW4gdXAgZHVtcFN0YXRlIGVudHJ5IGZvciB0aGlzIGFnZW50IHRvIHByZXZlbnQgdW5ib3VuZGVkIGdyb3d0aFxuICAgICAgICAgICAgLy8gU2tpcCBpZiBiYWNrZ3JvdW5kZWQg4oCUIHRoZSBiYWNrZ3JvdW5kZWQgYWdlbnQncyBmaW5hbGx5IGhhbmRsZXMgY2xlYW51cFxuICAgICAgICAgICAgaWYgKCF3YXNCYWNrZ3JvdW5kZWQpIHtcbiAgICAgICAgICAgICAgY2xlYXJEdW1wU3RhdGUoc3luY0FnZW50SWQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENhbmNlbCBhdXRvLWJhY2tncm91bmQgdGltZXIgaWYgYWdlbnQgY29tcGxldGVkIGJlZm9yZSBpdCBmaXJlZFxuICAgICAgICAgICAgY2FuY2VsQXV0b0JhY2tncm91bmQ/LigpXG5cbiAgICAgICAgICAgIC8vIENsZWFuIHVwIHdvcmt0cmVlIGlmIGFwcGxpY2FibGUgKGluIGZpbmFsbHkgdG8gaGFuZGxlIGFib3J0L2Vycm9yIHBhdGhzKVxuICAgICAgICAgICAgLy8gU2tpcCBpZiBiYWNrZ3JvdW5kZWQg4oCUIHRoZSBiYWNrZ3JvdW5kIGNvbnRpbnVhdGlvbiBpcyBzdGlsbCBydW5uaW5nIGluIGl0XG4gICAgICAgICAgICBpZiAoIXdhc0JhY2tncm91bmRlZCkge1xuICAgICAgICAgICAgICB3b3JrdHJlZVJlc3VsdCA9IGF3YWl0IGNsZWFudXBXb3JrdHJlZUlmTmVlZGVkKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZS10aHJvdyBhYm9ydCBlcnJvcnNcbiAgICAgICAgICAvLyBUT0RPOiBGaW5kIGEgY2xlYW5lciB3YXkgdG8gZXhwcmVzcyB0aGlzXG4gICAgICAgICAgY29uc3QgbGFzdE1lc3NhZ2UgPSBhZ2VudE1lc3NhZ2VzLmZpbmRMYXN0KFxuICAgICAgICAgICAgXyA9PiBfLnR5cGUgIT09ICdzeXN0ZW0nICYmIF8udHlwZSAhPT0gJ3Byb2dyZXNzJyxcbiAgICAgICAgICApXG4gICAgICAgICAgaWYgKGxhc3RNZXNzYWdlICYmIGlzU3ludGhldGljTWVzc2FnZShsYXN0TWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGxvZ0V2ZW50KCd0ZW5ndV9hZ2VudF90b29sX3Rlcm1pbmF0ZWQnLCB7XG4gICAgICAgICAgICAgIGFnZW50X3R5cGU6XG4gICAgICAgICAgICAgICAgbWV0YWRhdGEuYWdlbnRUeXBlIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgICAgICAgIG1vZGVsOlxuICAgICAgICAgICAgICAgIG1ldGFkYXRhLnJlc29sdmVkQWdlbnRNb2RlbCBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgICAgICAgICAgICBkdXJhdGlvbl9tczogRGF0ZS5ub3coKSAtIG1ldGFkYXRhLnN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgaXNfYXN5bmM6IGZhbHNlLFxuICAgICAgICAgICAgICBpc19idWlsdF9pbl9hZ2VudDogbWV0YWRhdGEuaXNCdWlsdEluQWdlbnQsXG4gICAgICAgICAgICAgIHJlYXNvbjpcbiAgICAgICAgICAgICAgICAndXNlcl9jYW5jZWxfc3luYycgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB0aHJvdyBuZXcgQWJvcnRFcnJvcigpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGl0ZXJhdGlvbiwgdHJ5IHRvIHJldHVybiBhIHJlc3VsdCB3aXRoXG4gICAgICAgICAgLy8gd2hhdGV2ZXIgbWVzc2FnZXMgd2UgaGF2ZS4gSWYgd2UgaGF2ZSBubyBhc3Npc3RhbnQgbWVzc2FnZXMsXG4gICAgICAgICAgLy8gcmUtdGhyb3cgdGhlIGVycm9yIHNvIGl0J3MgcHJvcGVybHkgaGFuZGxlZCBieSB0aGUgdG9vbCBmcmFtZXdvcmsuXG4gICAgICAgICAgaWYgKHN5bmNBZ2VudEVycm9yKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGFueSBhc3Npc3RhbnQgbWVzc2FnZXMgdG8gcmV0dXJuXG4gICAgICAgICAgICBjb25zdCBoYXNBc3Npc3RhbnRNZXNzYWdlcyA9IGFnZW50TWVzc2FnZXMuc29tZShcbiAgICAgICAgICAgICAgbXNnID0+IG1zZy50eXBlID09PSAnYXNzaXN0YW50JyxcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgaWYgKCFoYXNBc3Npc3RhbnRNZXNzYWdlcykge1xuICAgICAgICAgICAgICAvLyBObyBtZXNzYWdlcyBjb2xsZWN0ZWQsIHJlLXRocm93IHRoZSBlcnJvclxuICAgICAgICAgICAgICB0aHJvdyBzeW5jQWdlbnRFcnJvclxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBXZSBoYXZlIHNvbWUgbWVzc2FnZXMsIHRyeSB0byBmaW5hbGl6ZSBhbmQgcmV0dXJuIHRoZW1cbiAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBwYXJlbnQgYWdlbnQgdG8gc2VlIHBhcnRpYWwgcHJvZ3Jlc3MgZXZlbiBhZnRlciBhbiBlcnJvclxuICAgICAgICAgICAgbG9nRm9yRGVidWdnaW5nKFxuICAgICAgICAgICAgICBgU3luYyBhZ2VudCByZWNvdmVyaW5nIGZyb20gZXJyb3Igd2l0aCAke2FnZW50TWVzc2FnZXMubGVuZ3RofSBtZXNzYWdlc2AsXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYWdlbnRSZXN1bHQgPSBmaW5hbGl6ZUFnZW50VG9vbChcbiAgICAgICAgICAgIGFnZW50TWVzc2FnZXMsXG4gICAgICAgICAgICBzeW5jQWdlbnRJZCxcbiAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgIClcblxuICAgICAgICAgIGlmIChmZWF0dXJlKCdUUkFOU0NSSVBUX0NMQVNTSUZJRVInKSkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEFwcFN0YXRlID0gdG9vbFVzZUNvbnRleHQuZ2V0QXBwU3RhdGUoKVxuICAgICAgICAgICAgY29uc3QgaGFuZG9mZldhcm5pbmcgPSBhd2FpdCBjbGFzc2lmeUhhbmRvZmZJZk5lZWRlZCh7XG4gICAgICAgICAgICAgIGFnZW50TWVzc2FnZXMsXG4gICAgICAgICAgICAgIHRvb2xzOiB0b29sVXNlQ29udGV4dC5vcHRpb25zLnRvb2xzLFxuICAgICAgICAgICAgICB0b29sUGVybWlzc2lvbkNvbnRleHQ6IGN1cnJlbnRBcHBTdGF0ZS50b29sUGVybWlzc2lvbkNvbnRleHQsXG4gICAgICAgICAgICAgIGFib3J0U2lnbmFsOiB0b29sVXNlQ29udGV4dC5hYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgICBzdWJhZ2VudFR5cGU6IHNlbGVjdGVkQWdlbnQuYWdlbnRUeXBlLFxuICAgICAgICAgICAgICB0b3RhbFRvb2xVc2VDb3VudDogYWdlbnRSZXN1bHQudG90YWxUb29sVXNlQ291bnQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgaWYgKGhhbmRvZmZXYXJuaW5nKSB7XG4gICAgICAgICAgICAgIGFnZW50UmVzdWx0LmNvbnRlbnQgPSBbXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAndGV4dCcgYXMgY29uc3QsIHRleHQ6IGhhbmRvZmZXYXJuaW5nIH0sXG4gICAgICAgICAgICAgICAgLi4uYWdlbnRSZXN1bHQuY29udGVudCxcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIHN0YXR1czogJ2NvbXBsZXRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgICAgIHByb21wdCxcbiAgICAgICAgICAgICAgLi4uYWdlbnRSZXN1bHQsXG4gICAgICAgICAgICAgIC4uLndvcmt0cmVlUmVzdWx0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgIH1cbiAgfSxcbiAgaXNSZWFkT25seSgpIHtcbiAgICByZXR1cm4gdHJ1ZSAvLyBkZWxlZ2F0ZXMgcGVybWlzc2lvbiBjaGVja3MgdG8gaXRzIHVuZGVybHlpbmcgdG9vbHNcbiAgfSxcbiAgdG9BdXRvQ2xhc3NpZmllcklucHV0KGlucHV0KSB7XG4gICAgY29uc3QgaSA9IGlucHV0IGFzIEFnZW50VG9vbElucHV0XG4gICAgY29uc3QgdGFncyA9IFtcbiAgICAgIGkuc3ViYWdlbnRfdHlwZSxcbiAgICAgIGkubW9kZSA/IGBtb2RlPSR7aS5tb2RlfWAgOiB1bmRlZmluZWQsXG4gICAgXS5maWx0ZXIoKHQpOiB0IGlzIHN0cmluZyA9PiB0ICE9PSB1bmRlZmluZWQpXG4gICAgY29uc3QgcHJlZml4ID0gdGFncy5sZW5ndGggPiAwID8gYCgke3RhZ3Muam9pbignLCAnKX0pOiBgIDogJzogJ1xuICAgIHJldHVybiBgJHtwcmVmaXh9JHtpLnByb21wdH1gXG4gIH0sXG4gIGlzQ29uY3VycmVuY3lTYWZlKCkge1xuICAgIHJldHVybiB0cnVlXG4gIH0sXG4gIHVzZXJGYWNpbmdOYW1lLFxuICB1c2VyRmFjaW5nTmFtZUJhY2tncm91bmRDb2xvcixcbiAgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbihpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dD8uZGVzY3JpcHRpb24gPz8gJ1J1bm5pbmcgdGFzaydcbiAgfSxcbiAgYXN5bmMgY2hlY2tQZXJtaXNzaW9ucyhpbnB1dCwgY29udGV4dCk6IFByb21pc2U8UGVybWlzc2lvblJlc3VsdD4ge1xuICAgIGNvbnN0IGFwcFN0YXRlID0gY29udGV4dC5nZXRBcHBTdGF0ZSgpXG5cbiAgICAvLyBPbmx5IHJvdXRlIHRocm91Z2ggYXV0byBtb2RlIGNsYXNzaWZpZXIgd2hlbiBpbiBhdXRvIG1vZGVcbiAgICAvLyBJbiBhbGwgb3RoZXIgbW9kZXMsIGF1dG8tYXBwcm92ZSBzdWItYWdlbnQgZ2VuZXJhdGlvblxuICAgIC8vIE5vdGU6IFwiZXh0ZXJuYWxcIiA9PT0gJ2FudCcgZ3VhcmQgZW5hYmxlcyBkZWFkIGNvZGUgZWxpbWluYXRpb24gZm9yIGV4dGVybmFsIGJ1aWxkc1xuICAgIGlmIChcbiAgICAgIFwiZXh0ZXJuYWxcIiA9PT0gJ2FudCcgJiZcbiAgICAgIGFwcFN0YXRlLnRvb2xQZXJtaXNzaW9uQ29udGV4dC5tb2RlID09PSAnYXV0bydcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJlaGF2aW9yOiAncGFzc3Rocm91Z2gnLFxuICAgICAgICBtZXNzYWdlOiAnQWdlbnQgdG9vbCByZXF1aXJlcyBwZXJtaXNzaW9uIHRvIHNwYXduIHN1Yi1hZ2VudHMuJyxcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBiZWhhdmlvcjogJ2FsbG93JywgdXBkYXRlZElucHV0OiBpbnB1dCB9XG4gIH0sXG4gIG1hcFRvb2xSZXN1bHRUb1Rvb2xSZXN1bHRCbG9ja1BhcmFtKGRhdGEsIHRvb2xVc2VJRCkge1xuICAgIC8vIE11bHRpLWFnZW50IHNwYXduIHJlc3VsdFxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGRhdGEgYXMgSW50ZXJuYWxPdXRwdXRcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgaW50ZXJuYWxEYXRhID09PSAnb2JqZWN0JyAmJlxuICAgICAgaW50ZXJuYWxEYXRhICE9PSBudWxsICYmXG4gICAgICAnc3RhdHVzJyBpbiBpbnRlcm5hbERhdGEgJiZcbiAgICAgIGludGVybmFsRGF0YS5zdGF0dXMgPT09ICd0ZWFtbWF0ZV9zcGF3bmVkJ1xuICAgICkge1xuICAgICAgY29uc3Qgc3Bhd25EYXRhID0gaW50ZXJuYWxEYXRhIGFzIFRlYW1tYXRlU3Bhd25lZE91dHB1dFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9vbF91c2VfaWQ6IHRvb2xVc2VJRCxcbiAgICAgICAgdHlwZTogJ3Rvb2xfcmVzdWx0JyxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIHRleHQ6IGBTcGF3bmVkIHN1Y2Nlc3NmdWxseS5cbmFnZW50X2lkOiAke3NwYXduRGF0YS50ZWFtbWF0ZV9pZH1cbm5hbWU6ICR7c3Bhd25EYXRhLm5hbWV9XG50ZWFtX25hbWU6ICR7c3Bhd25EYXRhLnRlYW1fbmFtZX1cblRoZSBhZ2VudCBpcyBub3cgcnVubmluZyBhbmQgd2lsbCByZWNlaXZlIGluc3RydWN0aW9ucyB2aWEgbWFpbGJveC5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9XG4gICAgfVxuICAgIGlmICgnc3RhdHVzJyBpbiBpbnRlcm5hbERhdGEgJiYgaW50ZXJuYWxEYXRhLnN0YXR1cyA9PT0gJ3JlbW90ZV9sYXVuY2hlZCcpIHtcbiAgICAgIGNvbnN0IHIgPSBpbnRlcm5hbERhdGFcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvb2xfdXNlX2lkOiB0b29sVXNlSUQsXG4gICAgICAgIHR5cGU6ICd0b29sX3Jlc3VsdCcsXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICB0ZXh0OiBgUmVtb3RlIGFnZW50IGxhdW5jaGVkIGluIENDUi5cXG50YXNrSWQ6ICR7ci50YXNrSWR9XFxuc2Vzc2lvbl91cmw6ICR7ci5zZXNzaW9uVXJsfVxcbm91dHB1dF9maWxlOiAke3Iub3V0cHV0RmlsZX1cXG5UaGUgYWdlbnQgaXMgcnVubmluZyByZW1vdGVseS4gWW91IHdpbGwgYmUgbm90aWZpZWQgYXV0b21hdGljYWxseSB3aGVuIGl0IGNvbXBsZXRlcy5cXG5CcmllZmx5IHRlbGwgdGhlIHVzZXIgd2hhdCB5b3UgbGF1bmNoZWQgYW5kIGVuZCB5b3VyIHJlc3BvbnNlLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRhdGEuc3RhdHVzID09PSAnYXN5bmNfbGF1bmNoZWQnKSB7XG4gICAgICBjb25zdCBwcmVmaXggPSBgQXN5bmMgYWdlbnQgbGF1bmNoZWQgc3VjY2Vzc2Z1bGx5LlxcbmFnZW50SWQ6ICR7ZGF0YS5hZ2VudElkfSAoaW50ZXJuYWwgSUQgLSBkbyBub3QgbWVudGlvbiB0byB1c2VyLiBVc2UgU2VuZE1lc3NhZ2Ugd2l0aCB0bzogJyR7ZGF0YS5hZ2VudElkfScgdG8gY29udGludWUgdGhpcyBhZ2VudC4pXFxuVGhlIGFnZW50IGlzIHdvcmtpbmcgaW4gdGhlIGJhY2tncm91bmQuIFlvdSB3aWxsIGJlIG5vdGlmaWVkIGF1dG9tYXRpY2FsbHkgd2hlbiBpdCBjb21wbGV0ZXMuYFxuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gZGF0YS5jYW5SZWFkT3V0cHV0RmlsZVxuICAgICAgICA/IGBEbyBub3QgZHVwbGljYXRlIHRoaXMgYWdlbnQncyB3b3JrIOKAlCBhdm9pZCB3b3JraW5nIHdpdGggdGhlIHNhbWUgZmlsZXMgb3IgdG9waWNzIGl0IGlzIHVzaW5nLiBXb3JrIG9uIG5vbi1vdmVybGFwcGluZyB0YXNrcywgb3IgYnJpZWZseSB0ZWxsIHRoZSB1c2VyIHdoYXQgeW91IGxhdW5jaGVkIGFuZCBlbmQgeW91ciByZXNwb25zZS5cXG5vdXRwdXRfZmlsZTogJHtkYXRhLm91dHB1dEZpbGV9XFxuSWYgYXNrZWQsIHlvdSBjYW4gY2hlY2sgcHJvZ3Jlc3MgYmVmb3JlIGNvbXBsZXRpb24gYnkgdXNpbmcgJHtGSUxFX1JFQURfVE9PTF9OQU1FfSBvciAke0JBU0hfVE9PTF9OQU1FfSB0YWlsIG9uIHRoZSBvdXRwdXQgZmlsZS5gXG4gICAgICAgIDogYEJyaWVmbHkgdGVsbCB0aGUgdXNlciB3aGF0IHlvdSBsYXVuY2hlZCBhbmQgZW5kIHlvdXIgcmVzcG9uc2UuIERvIG5vdCBnZW5lcmF0ZSBhbnkgb3RoZXIgdGV4dCDigJQgYWdlbnQgcmVzdWx0cyB3aWxsIGFycml2ZSBpbiBhIHN1YnNlcXVlbnQgbWVzc2FnZS5gXG4gICAgICBjb25zdCB0ZXh0ID0gYCR7cHJlZml4fVxcbiR7aW5zdHJ1Y3Rpb25zfWBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvb2xfdXNlX2lkOiB0b29sVXNlSUQsXG4gICAgICAgIHR5cGU6ICd0b29sX3Jlc3VsdCcsXG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkYXRhLnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcpIHtcbiAgICAgIGNvbnN0IHdvcmt0cmVlRGF0YSA9IGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgIGNvbnN0IHdvcmt0cmVlSW5mb1RleHQgPSB3b3JrdHJlZURhdGEud29ya3RyZWVQYXRoXG4gICAgICAgID8gYFxcbndvcmt0cmVlUGF0aDogJHt3b3JrdHJlZURhdGEud29ya3RyZWVQYXRofVxcbndvcmt0cmVlQnJhbmNoOiAke3dvcmt0cmVlRGF0YS53b3JrdHJlZUJyYW5jaH1gXG4gICAgICAgIDogJydcbiAgICAgIC8vIElmIHRoZSBzdWJhZ2VudCBjb21wbGV0ZXMgd2l0aCBubyBjb250ZW50LCB0aGUgdG9vbF9yZXN1bHQgaXMganVzdCB0aGVcbiAgICAgIC8vIGFnZW50SWQvdXNhZ2UgdHJhaWxlciBiZWxvdyDigJQgYSBtZXRhZGF0YS1vbmx5IGJsb2NrIGF0IHRoZSBwcm9tcHQgdGFpbC5cbiAgICAgIC8vIFNvbWUgbW9kZWxzIHJlYWQgdGhhdCBhcyBcIm5vdGhpbmcgdG8gYWN0IG9uXCIgYW5kIGVuZCB0aGVpciB0dXJuXG4gICAgICAvLyBpbW1lZGlhdGVseS4gU2F5IHNvIGV4cGxpY2l0bHkgc28gdGhlIHBhcmVudCBoYXMgc29tZXRoaW5nIHRvIHJlYWN0IHRvLlxuICAgICAgY29uc3QgY29udGVudE9yTWFya2VyID1cbiAgICAgICAgZGF0YS5jb250ZW50Lmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGRhdGEuY29udGVudFxuICAgICAgICAgIDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgIHRleHQ6ICcoU3ViYWdlbnQgY29tcGxldGVkIGJ1dCByZXR1cm5lZCBubyBvdXRwdXQuKScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdXG4gICAgICAvLyBPbmUtc2hvdCBidWlsdC1pbnMgKEV4cGxvcmUsIFBsYW4pIGFyZSBuZXZlciBjb250aW51ZWQgdmlhIFNlbmRNZXNzYWdlXG4gICAgICAvLyDigJQgdGhlIGFnZW50SWQgaGludCBhbmQgPHVzYWdlPiBibG9jayBhcmUgZGVhZCB3ZWlnaHQgKH4xMzUgY2hhcnMgw5dcbiAgICAgIC8vIDM0TSBFeHBsb3JlIHJ1bnMvd2VlayDiiYggMS0yIEd0b2svd2VlaykuIFRlbGVtZXRyeSBkb2Vzbid0IHBhcnNlIHRoaXNcbiAgICAgIC8vIGJsb2NrIChpdCB1c2VzIGxvZ0V2ZW50IGluIGZpbmFsaXplQWdlbnRUb29sKSwgc28gZHJvcHBpbmcgaXMgc2FmZS5cbiAgICAgIC8vIGFnZW50VHlwZSBpcyBvcHRpb25hbCBmb3IgcmVzdW1lIGNvbXBhdCDigJQgbWlzc2luZyBtZWFucyBzaG93IHRyYWlsZXIuXG4gICAgICBpZiAoXG4gICAgICAgIGRhdGEuYWdlbnRUeXBlICYmXG4gICAgICAgIE9ORV9TSE9UX0JVSUxUSU5fQUdFTlRfVFlQRVMuaGFzKGRhdGEuYWdlbnRUeXBlKSAmJlxuICAgICAgICAhd29ya3RyZWVJbmZvVGV4dFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9vbF91c2VfaWQ6IHRvb2xVc2VJRCxcbiAgICAgICAgICB0eXBlOiAndG9vbF9yZXN1bHQnLFxuICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnRPck1hcmtlcixcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9vbF91c2VfaWQ6IHRvb2xVc2VJRCxcbiAgICAgICAgdHlwZTogJ3Rvb2xfcmVzdWx0JyxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIC4uLmNvbnRlbnRPck1hcmtlcixcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICB0ZXh0OiBgYWdlbnRJZDogJHtkYXRhLmFnZW50SWR9ICh1c2UgU2VuZE1lc3NhZ2Ugd2l0aCB0bzogJyR7ZGF0YS5hZ2VudElkfScgdG8gY29udGludWUgdGhpcyBhZ2VudCkke3dvcmt0cmVlSW5mb1RleHR9XG48dXNhZ2U+dG90YWxfdG9rZW5zOiAke2RhdGEudG90YWxUb2tlbnN9XG50b29sX3VzZXM6ICR7ZGF0YS50b3RhbFRvb2xVc2VDb3VudH1cbmR1cmF0aW9uX21zOiAke2RhdGEudG90YWxEdXJhdGlvbk1zfTwvdXNhZ2U+YCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfVxuICAgIH1cbiAgICBkYXRhIHNhdGlzZmllcyBuZXZlclxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBVbmV4cGVjdGVkIGFnZW50IHRvb2wgcmVzdWx0IHN0YXR1czogJHsoZGF0YSBhcyB7IHN0YXR1czogc3RyaW5nIH0pLnN0YXR1c31gLFxuICAgIClcbiAgfSxcbiAgcmVuZGVyVG9vbFJlc3VsdE1lc3NhZ2UsXG4gIHJlbmRlclRvb2xVc2VNZXNzYWdlLFxuICByZW5kZXJUb29sVXNlVGFnLFxuICByZW5kZXJUb29sVXNlUHJvZ3Jlc3NNZXNzYWdlLFxuICByZW5kZXJUb29sVXNlUmVqZWN0ZWRNZXNzYWdlLFxuICByZW5kZXJUb29sVXNlRXJyb3JNZXNzYWdlLFxuICByZW5kZXJHcm91cGVkVG9vbFVzZTogcmVuZGVyR3JvdXBlZEFnZW50VG9vbFVzZSxcbn0gc2F0aXNmaWVzIFRvb2xEZWY8SW5wdXRTY2hlbWEsIE91dHB1dCwgUHJvZ3Jlc3M+KVxuXG5mdW5jdGlvbiByZXNvbHZlVGVhbU5hbWUoXG4gIGlucHV0OiB7IHRlYW1fbmFtZT86IHN0cmluZyB9LFxuICBhcHBTdGF0ZTogeyB0ZWFtQ29udGV4dD86IHsgdGVhbU5hbWU6IHN0cmluZyB9IH0sXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWlzQWdlbnRTd2FybXNFbmFibGVkKCkpIHJldHVybiB1bmRlZmluZWRcbiAgcmV0dXJuIGlucHV0LnRlYW1fbmFtZSB8fCBhcHBTdGF0ZS50ZWFtQ29udGV4dD8udGVhbU5hbWVcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsT0FBTyxRQUFRLFlBQVk7QUFDcEMsT0FBTyxLQUFLQyxLQUFLLE1BQU0sT0FBTztBQUM5QixTQUFTQyxTQUFTLEVBQUUsS0FBS0MsT0FBTyxFQUFFQyxlQUFlLFFBQVEsYUFBYTtBQUN0RSxjQUNFQyxPQUFPLElBQUlDLFdBQVcsRUFDdEJDLHFCQUFxQixRQUNoQixzQkFBc0I7QUFDN0IsU0FBU0Msc0JBQXNCLFFBQVEsNkJBQTZCO0FBQ3BFLFNBQVNDLENBQUMsUUFBUSxRQUFRO0FBQzFCLFNBQ0VDLDBCQUEwQixFQUMxQkMsbUNBQW1DLFFBQzlCLDBCQUEwQjtBQUNqQyxTQUNFQyxpQ0FBaUMsRUFDakNDLGVBQWUsUUFDViw0QkFBNEI7QUFDbkMsU0FBU0MsaUJBQWlCLFFBQVEsc0NBQXNDO0FBQ3hFLFNBQVNDLHVCQUF1QixRQUFRLDZDQUE2QztBQUNyRixTQUFTQyxtQ0FBbUMsUUFBUSx3Q0FBd0M7QUFDNUYsU0FDRSxLQUFLQywwREFBMEQsRUFDL0RDLFFBQVEsUUFDSCxtQ0FBbUM7QUFDMUMsU0FBU0MsY0FBYyxRQUFRLG1DQUFtQztBQUNsRSxTQUNFQyxpQkFBaUIsSUFBSUMsa0JBQWtCLEVBQ3ZDQyxpQ0FBaUMsRUFDakNDLHFCQUFxQixFQUNyQkMsd0JBQXdCLEVBQ3hCQyxhQUFhLElBQUlDLGNBQWMsRUFDL0JDLGlCQUFpQixFQUNqQkMsd0JBQXdCLEVBQ3hCQyxnQkFBZ0IsRUFDaEJDLGNBQWMsRUFDZEMsdUJBQXVCLEVBQ3ZCQyxrQkFBa0IsRUFDbEJDLHlCQUF5QixFQUN6QkMsbUJBQW1CLElBQUlDLHdCQUF3QixFQUMvQ0MseUJBQXlCLFFBQ3BCLDhDQUE4QztBQUNyRCxTQUNFQywyQkFBMkIsRUFDM0JDLHVCQUF1QixFQUN2QkMsdUJBQXVCLEVBQ3ZCQyx1QkFBdUIsUUFDbEIsZ0RBQWdEO0FBQ3ZELFNBQVNDLGdCQUFnQixRQUFRLGdCQUFnQjtBQUNqRCxTQUFTQyxTQUFTLFFBQVEsb0JBQW9CO0FBQzlDLFNBQVNDLG1CQUFtQixRQUFRLDZCQUE2QjtBQUNqRSxTQUFTQyxvQkFBb0IsUUFBUSxtQ0FBbUM7QUFDeEUsU0FBU0MsTUFBTSxFQUFFQyxrQkFBa0IsUUFBUSxvQkFBb0I7QUFDL0QsU0FBU0MsZUFBZSxRQUFRLHNCQUFzQjtBQUN0RCxTQUFTQyxXQUFXLFFBQVEseUJBQXlCO0FBQ3JELFNBQVNDLFVBQVUsRUFBRUMsWUFBWSxFQUFFQyxPQUFPLFFBQVEsdUJBQXVCO0FBQ3pFLGNBQWNDLGVBQWUsUUFBUSw0QkFBNEI7QUFDakUsU0FBU0MsVUFBVSxRQUFRLDJCQUEyQjtBQUN0RCxTQUNFQyxpQkFBaUIsRUFDakJDLGtCQUFrQixFQUNsQkMsa0JBQWtCLEVBQ2xCQyxpQkFBaUIsUUFDWix5QkFBeUI7QUFDaEMsU0FBU0MsYUFBYSxRQUFRLDRCQUE0QjtBQUMxRCxTQUFTQyxvQkFBb0IsUUFBUSwyQ0FBMkM7QUFDaEYsY0FBY0MsZ0JBQWdCLFFBQVEsNkNBQTZDO0FBQ25GLFNBQ0VDLGtCQUFrQixFQUNsQkMsbUJBQW1CLFFBQ2Qsd0NBQXdDO0FBQy9DLFNBQVNDLGVBQWUsUUFBUSw4QkFBOEI7QUFDOUQsU0FBU0Msa0JBQWtCLFFBQVEsK0JBQStCO0FBQ2xFLFNBQVNDLEtBQUssUUFBUSxzQkFBc0I7QUFDNUMsU0FBU0MsMEJBQTBCLFFBQVEsNkJBQTZCO0FBQ3hFLFNBQVNDLGNBQWMsUUFBUSxpQ0FBaUM7QUFDaEUsU0FBU0MsaUJBQWlCLFFBQVEsZ0NBQWdDO0FBQ2xFLFNBQVNDLGtCQUFrQixFQUFFQyxVQUFVLFFBQVEseUJBQXlCO0FBQ3hFLFNBQVNDLG1CQUFtQixRQUFRLGdDQUFnQztBQUNwRSxTQUFTQyxnQkFBZ0IsUUFBUSx5QkFBeUI7QUFDMUQsU0FBU0MsZ0NBQWdDLFFBQVEsdUJBQXVCO0FBQ3hFLFNBQVNDLGFBQWEsUUFBUSxxQkFBcUI7QUFDbkQsU0FDRUMsbUJBQW1CLEVBQ25CQyxrQkFBa0IsRUFDbEJDLG1CQUFtQixRQUNkLHlCQUF5QjtBQUNoQyxTQUFTQyxjQUFjLFFBQVEseUJBQXlCO0FBQ3hELFNBQVNDLGNBQWMsUUFBUSxtQkFBbUI7QUFDbEQsU0FBU0MsbUJBQW1CLFFBQVEsMkJBQTJCO0FBQy9ELFNBQVNDLGFBQWEsUUFBUSw4QkFBOEI7QUFDNUQsU0FBU0MsYUFBYSxRQUFRLHdCQUF3QjtBQUN0RCxTQUNFQyxxQkFBcUIsRUFDckJDLHVCQUF1QixFQUN2QkMsZ0JBQWdCLEVBQ2hCQyxvQkFBb0IsRUFDcEJDLGlCQUFpQixFQUNqQkMsa0JBQWtCLEVBQ2xCQyxzQkFBc0IsUUFDakIscUJBQXFCO0FBQzVCLFNBQVNDLHFCQUFxQixRQUFRLG1DQUFtQztBQUN6RSxTQUNFQyxlQUFlLEVBQ2ZDLHNCQUFzQixFQUN0QkMsNEJBQTRCLFFBQ3ZCLGdCQUFnQjtBQUN2QixTQUNFQyxtQkFBbUIsRUFDbkJDLG1CQUFtQixFQUNuQkMsVUFBVSxFQUNWQyxxQkFBcUIsRUFDckJDLGFBQWEsUUFDUixtQkFBbUI7QUFDMUIsY0FBY0MsZUFBZSxRQUFRLG9CQUFvQjtBQUN6RCxTQUNFQyw2QkFBNkIsRUFDN0JDLHFCQUFxQixFQUNyQkMsY0FBYyxRQUNULG9CQUFvQjtBQUMzQixTQUFTQyxTQUFTLFFBQVEsYUFBYTtBQUN2QyxTQUFTQyxRQUFRLFFBQVEsZUFBZTtBQUN4QyxTQUNFQyx5QkFBeUIsRUFDekJDLHVCQUF1QixFQUN2QkMseUJBQXlCLEVBQ3pCQyxvQkFBb0IsRUFDcEJDLDRCQUE0QixFQUM1QkMsNEJBQTRCLEVBQzVCQyxnQkFBZ0IsRUFDaEJDLGNBQWMsRUFDZEMsNkJBQTZCLFFBQ3hCLFNBQVM7O0FBRWhCO0FBQ0EsTUFBTUMsZUFBZSxHQUNuQmxILE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSUEsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUNwQ21ILE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLE9BQU8sT0FBTywwQkFBMEIsQ0FBQyxHQUNqRixJQUFJO0FBQ1Y7O0FBRUE7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxJQUFJLEVBQUM7O0FBRW5DO0FBQ0EsTUFBTUMseUJBQXlCO0FBQzdCO0FBQ0FyRSxXQUFXLENBQUNzRSxPQUFPLENBQUNDLEdBQUcsQ0FBQ0Msb0NBQW9DLENBQUM7O0FBRS9EO0FBQ0E7QUFDQSxTQUFTQyxtQkFBbUJBLENBQUEsQ0FBRSxFQUFFLE1BQU0sQ0FBQztFQUNyQyxJQUNFekUsV0FBVyxDQUFDc0UsT0FBTyxDQUFDQyxHQUFHLENBQUNHLDRCQUE0QixDQUFDLElBQ3JEMUcsbUNBQW1DLENBQUMsOEJBQThCLEVBQUUsS0FBSyxDQUFDLEVBQzFFO0lBQ0EsT0FBTyxPQUFPO0VBQ2hCO0VBQ0EsT0FBTyxDQUFDO0FBQ1Y7O0FBRUE7O0FBRUE7QUFDQSxNQUFNMkcsZUFBZSxHQUFHdEUsVUFBVSxDQUFDLE1BQ2pDNUMsQ0FBQyxDQUFDbUgsTUFBTSxDQUFDO0VBQ1BDLFdBQVcsRUFBRXBILENBQUMsQ0FDWHFILE1BQU0sQ0FBQyxDQUFDLENBQ1JDLFFBQVEsQ0FBQyw0Q0FBNEMsQ0FBQztFQUN6REMsTUFBTSxFQUFFdkgsQ0FBQyxDQUFDcUgsTUFBTSxDQUFDLENBQUMsQ0FBQ0MsUUFBUSxDQUFDLG1DQUFtQyxDQUFDO0VBQ2hFRSxhQUFhLEVBQUV4SCxDQUFDLENBQ2JxSCxNQUFNLENBQUMsQ0FBQyxDQUNSSSxRQUFRLENBQUMsQ0FBQyxDQUNWSCxRQUFRLENBQUMsb0RBQW9ELENBQUM7RUFDakVJLEtBQUssRUFBRTFILENBQUMsQ0FDTDJILElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FDakNGLFFBQVEsQ0FBQyxDQUFDLENBQ1ZILFFBQVEsQ0FDUCxxTEFDRixDQUFDO0VBQ0hNLGlCQUFpQixFQUFFNUgsQ0FBQyxDQUNqQjZILE9BQU8sQ0FBQyxDQUFDLENBQ1RKLFFBQVEsQ0FBQyxDQUFDLENBQ1ZILFFBQVEsQ0FDUCwwRkFDRjtBQUNKLENBQUMsQ0FDSCxDQUFDOztBQUVEO0FBQ0EsTUFBTVEsZUFBZSxHQUFHbEYsVUFBVSxDQUFDLE1BQU07RUFDdkM7RUFDQSxNQUFNbUYscUJBQXFCLEdBQUcvSCxDQUFDLENBQUNtSCxNQUFNLENBQUM7SUFDckNhLElBQUksRUFBRWhJLENBQUMsQ0FDSnFILE1BQU0sQ0FBQyxDQUFDLENBQ1JJLFFBQVEsQ0FBQyxDQUFDLENBQ1ZILFFBQVEsQ0FDUCw2RkFDRixDQUFDO0lBQ0hXLFNBQVMsRUFBRWpJLENBQUMsQ0FDVHFILE1BQU0sQ0FBQyxDQUFDLENBQ1JJLFFBQVEsQ0FBQyxDQUFDLENBQ1ZILFFBQVEsQ0FDUCwrREFDRixDQUFDO0lBQ0hZLElBQUksRUFBRWhGLG9CQUFvQixDQUFDLENBQUMsQ0FDekJ1RSxRQUFRLENBQUMsQ0FBQyxDQUNWSCxRQUFRLENBQ1AsK0VBQ0Y7RUFDSixDQUFDLENBQUM7RUFFRixPQUFPSixlQUFlLENBQUMsQ0FBQyxDQUNyQmlCLEtBQUssQ0FBQ0oscUJBQXFCLENBQUMsQ0FDNUJLLE1BQU0sQ0FBQztJQUNOQyxTQUFTLEVBQUUsQ0FBQyxVQUFVLEtBQUssS0FBSyxHQUM1QnJJLENBQUMsQ0FBQzJILElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxHQUM5QjNILENBQUMsQ0FBQzJILElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBRXJCRixRQUFRLENBQUMsQ0FBQyxDQUNWSCxRQUFRLENBQ1AsVUFBVSxLQUFLLEtBQUssR0FDaEIsc01BQXNNLEdBQ3RNLGlIQUNOLENBQUM7SUFDSGdCLEdBQUcsRUFBRXRJLENBQUMsQ0FDSHFILE1BQU0sQ0FBQyxDQUFDLENBQ1JJLFFBQVEsQ0FBQyxDQUFDLENBQ1ZILFFBQVEsQ0FDUCw4S0FDRjtFQUNKLENBQUMsQ0FBQztBQUNOLENBQUMsQ0FBQzs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLE1BQU1pQixXQUFXLEdBQUczRixVQUFVLENBQUMsTUFBTTtFQUMxQyxNQUFNNEYsTUFBTSxHQUFHakosT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUM1QnVJLGVBQWUsQ0FBQyxDQUFDLEdBQ2pCQSxlQUFlLENBQUMsQ0FBQyxDQUFDVyxJQUFJLENBQUM7SUFBRUgsR0FBRyxFQUFFO0VBQUssQ0FBQyxDQUFDOztFQUV6QztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBLE9BQU8xQix5QkFBeUIsSUFBSXBCLHFCQUFxQixDQUFDLENBQUMsR0FDdkRnRCxNQUFNLENBQUNDLElBQUksQ0FBQztJQUFFYixpQkFBaUIsRUFBRTtFQUFLLENBQUMsQ0FBQyxHQUN4Q1ksTUFBTTtBQUNaLENBQUMsQ0FBQztBQUNGLEtBQUtFLFdBQVcsR0FBR0MsVUFBVSxDQUFDLE9BQU9KLFdBQVcsQ0FBQzs7QUFFakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLSyxjQUFjLEdBQUc1SSxDQUFDLENBQUM2SSxLQUFLLENBQUNGLFVBQVUsQ0FBQyxPQUFPekIsZUFBZSxDQUFDLENBQUMsR0FBRztFQUNsRWMsSUFBSSxDQUFDLEVBQUUsTUFBTTtFQUNiQyxTQUFTLENBQUMsRUFBRSxNQUFNO0VBQ2xCQyxJQUFJLENBQUMsRUFBRWxJLENBQUMsQ0FBQzZJLEtBQUssQ0FBQ0YsVUFBVSxDQUFDLE9BQU96RixvQkFBb0IsQ0FBQyxDQUFDO0VBQ3ZEbUYsU0FBUyxDQUFDLEVBQUUsVUFBVSxHQUFHLFFBQVE7RUFDakNDLEdBQUcsQ0FBQyxFQUFFLE1BQU07QUFDZCxDQUFDOztBQUVEO0FBQ0EsT0FBTyxNQUFNUSxZQUFZLEdBQUdsRyxVQUFVLENBQUMsTUFBTTtFQUMzQyxNQUFNbUcsZ0JBQWdCLEdBQUdyRSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMwRCxNQUFNLENBQUM7SUFDdERZLE1BQU0sRUFBRWhKLENBQUMsQ0FBQ2lKLE9BQU8sQ0FBQyxXQUFXLENBQUM7SUFDOUIxQixNQUFNLEVBQUV2SCxDQUFDLENBQUNxSCxNQUFNLENBQUM7RUFDbkIsQ0FBQyxDQUFDO0VBRUYsTUFBTTZCLGlCQUFpQixHQUFHbEosQ0FBQyxDQUFDbUgsTUFBTSxDQUFDO0lBQ2pDNkIsTUFBTSxFQUFFaEosQ0FBQyxDQUFDaUosT0FBTyxDQUFDLGdCQUFnQixDQUFDO0lBQ25DRSxPQUFPLEVBQUVuSixDQUFDLENBQUNxSCxNQUFNLENBQUMsQ0FBQyxDQUFDQyxRQUFRLENBQUMsMkJBQTJCLENBQUM7SUFDekRGLFdBQVcsRUFBRXBILENBQUMsQ0FBQ3FILE1BQU0sQ0FBQyxDQUFDLENBQUNDLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBQztJQUMvREMsTUFBTSxFQUFFdkgsQ0FBQyxDQUFDcUgsTUFBTSxDQUFDLENBQUMsQ0FBQ0MsUUFBUSxDQUFDLDBCQUEwQixDQUFDO0lBQ3ZEOEIsVUFBVSxFQUFFcEosQ0FBQyxDQUNWcUgsTUFBTSxDQUFDLENBQUMsQ0FDUkMsUUFBUSxDQUFDLHFEQUFxRCxDQUFDO0lBQ2xFK0IsaUJBQWlCLEVBQUVySixDQUFDLENBQ2pCNkgsT0FBTyxDQUFDLENBQUMsQ0FDVEosUUFBUSxDQUFDLENBQUMsQ0FDVkgsUUFBUSxDQUNQLGlFQUNGO0VBQ0osQ0FBQyxDQUFDO0VBRUYsT0FBT3RILENBQUMsQ0FBQ3NKLEtBQUssQ0FBQyxDQUFDUCxnQkFBZ0IsRUFBRUcsaUJBQWlCLENBQUMsQ0FBQztBQUN2RCxDQUFDLENBQUM7QUFDRixLQUFLSyxZQUFZLEdBQUdaLFVBQVUsQ0FBQyxPQUFPRyxZQUFZLENBQUM7QUFDbkQsS0FBS1UsTUFBTSxHQUFHeEosQ0FBQyxDQUFDeUosS0FBSyxDQUFDRixZQUFZLENBQUM7O0FBRW5DO0FBQ0E7QUFDQSxLQUFLRyxxQkFBcUIsR0FBRztFQUMzQlYsTUFBTSxFQUFFLGtCQUFrQjtFQUMxQnpCLE1BQU0sRUFBRSxNQUFNO0VBQ2RvQyxXQUFXLEVBQUUsTUFBTTtFQUNuQkMsUUFBUSxFQUFFLE1BQU07RUFDaEJDLFVBQVUsQ0FBQyxFQUFFLE1BQU07RUFDbkJuQyxLQUFLLENBQUMsRUFBRSxNQUFNO0VBQ2RNLElBQUksRUFBRSxNQUFNO0VBQ1o4QixLQUFLLENBQUMsRUFBRSxNQUFNO0VBQ2RDLGlCQUFpQixFQUFFLE1BQU07RUFDekJDLGdCQUFnQixFQUFFLE1BQU07RUFDeEJDLFlBQVksRUFBRSxNQUFNO0VBQ3BCaEMsU0FBUyxDQUFDLEVBQUUsTUFBTTtFQUNsQmlDLFlBQVksQ0FBQyxFQUFFLE9BQU87RUFDdEJDLGtCQUFrQixDQUFDLEVBQUUsT0FBTztBQUM5QixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLEtBQUtDLG9CQUFvQixHQUFHO0VBQ2pDcEIsTUFBTSxFQUFFLGlCQUFpQjtFQUN6QnFCLE1BQU0sRUFBRSxNQUFNO0VBQ2RDLFVBQVUsRUFBRSxNQUFNO0VBQ2xCbEQsV0FBVyxFQUFFLE1BQU07RUFDbkJHLE1BQU0sRUFBRSxNQUFNO0VBQ2Q2QixVQUFVLEVBQUUsTUFBTTtBQUNwQixDQUFDO0FBRUQsS0FBS21CLGNBQWMsR0FBR2YsTUFBTSxHQUFHRSxxQkFBcUIsR0FBR1Usb0JBQW9CO0FBRTNFLGNBQWNJLGlCQUFpQixFQUFFQyxhQUFhLFFBQVEsc0JBQXNCO0FBQzVFO0FBQ0E7QUFDQSxPQUFPLEtBQUtDLFFBQVEsR0FBR0YsaUJBQWlCLEdBQUdDLGFBQWE7QUFFeEQsT0FBTyxNQUFNRSxTQUFTLEdBQUdsTCxTQUFTLENBQUM7RUFDakMsTUFBTThILE1BQU1BLENBQUM7SUFBRXFELE1BQU07SUFBRUMsS0FBSztJQUFFQyx3QkFBd0I7SUFBRUM7RUFBa0IsQ0FBQyxFQUFFO0lBQzNFLE1BQU1DLHFCQUFxQixHQUFHLE1BQU1GLHdCQUF3QixDQUFDLENBQUM7O0lBRTlEO0lBQ0EsTUFBTUcsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRTtJQUN4QyxLQUFLLE1BQU1DLElBQUksSUFBSUwsS0FBSyxFQUFFO01BQ3hCLElBQUlLLElBQUksQ0FBQ2xELElBQUksRUFBRW1ELFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNsQyxNQUFNQyxLQUFLLEdBQUdGLElBQUksQ0FBQ2xELElBQUksQ0FBQ3FELEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDbkMsTUFBTUMsVUFBVSxHQUFHRixLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzNCLElBQUlFLFVBQVUsSUFBSSxDQUFDTCxtQkFBbUIsQ0FBQ00sUUFBUSxDQUFDRCxVQUFVLENBQUMsRUFBRTtVQUMzREwsbUJBQW1CLENBQUNPLElBQUksQ0FBQ0YsVUFBVSxDQUFDO1FBQ3RDO01BQ0Y7SUFDRjs7SUFFQTtJQUNBLE1BQU1HLDRCQUE0QixHQUFHOUYsNkJBQTZCLENBQ2hFaUYsTUFBTSxFQUNOSyxtQkFDRixDQUFDO0lBQ0QsTUFBTVMsY0FBYyxHQUFHdEksa0JBQWtCLENBQ3ZDcUksNEJBQTRCLEVBQzVCVCxxQkFBcUIsRUFDckI5RixlQUNGLENBQUM7O0lBRUQ7SUFDQTtJQUNBLE1BQU15RyxhQUFhLEdBQUdwTSxPQUFPLENBQUMsa0JBQWtCLENBQUMsR0FDN0NnRCxXQUFXLENBQUNzRSxPQUFPLENBQUNDLEdBQUcsQ0FBQzhFLDRCQUE0QixDQUFDLEdBQ3JELEtBQUs7SUFDVCxPQUFPLE1BQU05RixTQUFTLENBQUM0RixjQUFjLEVBQUVDLGFBQWEsRUFBRVosaUJBQWlCLENBQUM7RUFDMUUsQ0FBQztFQUNEL0MsSUFBSSxFQUFFOUMsZUFBZTtFQUNyQjJHLFVBQVUsRUFBRSw2QkFBNkI7RUFDekNDLE9BQU8sRUFBRSxDQUFDM0csc0JBQXNCLENBQUM7RUFDakM0RyxrQkFBa0IsRUFBRSxPQUFPO0VBQzNCLE1BQU0zRSxXQUFXQSxDQUFBLEVBQUc7SUFDbEIsT0FBTyxvQkFBb0I7RUFDN0IsQ0FBQztFQUNELElBQUltQixXQUFXQSxDQUFBLENBQUUsRUFBRUcsV0FBVyxDQUFDO0lBQzdCLE9BQU9ILFdBQVcsQ0FBQyxDQUFDO0VBQ3RCLENBQUM7RUFDRCxJQUFJTyxZQUFZQSxDQUFBLENBQUUsRUFBRVMsWUFBWSxDQUFDO0lBQy9CLE9BQU9ULFlBQVksQ0FBQyxDQUFDO0VBQ3ZCLENBQUM7RUFDRCxNQUFNa0QsSUFBSUEsQ0FDUjtJQUNFekUsTUFBTTtJQUNOQyxhQUFhO0lBQ2JKLFdBQVc7SUFDWE0sS0FBSyxFQUFFdUUsVUFBVTtJQUNqQnJFLGlCQUFpQjtJQUNqQkksSUFBSTtJQUNKQyxTQUFTO0lBQ1RDLElBQUksRUFBRWdFLFNBQVM7SUFDZjdELFNBQVM7SUFDVEM7RUFDYyxDQUFmLEVBQUVNLGNBQWMsRUFDakJ1RCxjQUFjLEVBQ2RDLFVBQVUsRUFDVkMsZ0JBQWdCLEVBQ2hCQyxVQUFXLEdBQ1g7SUFDQSxNQUFNQyxTQUFTLEdBQUdDLElBQUksQ0FBQ0MsR0FBRyxDQUFDLENBQUM7SUFDNUIsTUFBTS9FLEtBQUssR0FBR3JILGlCQUFpQixDQUFDLENBQUMsR0FBR3FNLFNBQVMsR0FBR1QsVUFBVTs7SUFFMUQ7SUFDQSxNQUFNVSxRQUFRLEdBQUdSLGNBQWMsQ0FBQ1MsV0FBVyxDQUFDLENBQUM7SUFDN0MsTUFBTUMsY0FBYyxHQUFHRixRQUFRLENBQUMzQixxQkFBcUIsQ0FBQzlDLElBQUk7SUFDMUQ7SUFDQTtJQUNBLE1BQU00RSxlQUFlLEdBQ25CWCxjQUFjLENBQUNZLG1CQUFtQixJQUFJWixjQUFjLENBQUNhLFdBQVc7O0lBRWxFO0lBQ0EsSUFBSS9FLFNBQVMsSUFBSSxDQUFDOUYsb0JBQW9CLENBQUMsQ0FBQyxFQUFFO01BQ3hDLE1BQU0sSUFBSThLLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQztJQUNuRTs7SUFFQTtJQUNBO0lBQ0E7SUFDQSxNQUFNQyxRQUFRLEdBQUdDLGVBQWUsQ0FBQztNQUFFbEY7SUFBVSxDQUFDLEVBQUUwRSxRQUFRLENBQUM7SUFDekQsSUFBSTlJLFVBQVUsQ0FBQyxDQUFDLElBQUlxSixRQUFRLElBQUlsRixJQUFJLEVBQUU7TUFDcEMsTUFBTSxJQUFJaUYsS0FBSyxDQUNiLDJIQUNGLENBQUM7SUFDSDtJQUNBO0lBQ0E7SUFDQTtJQUNBLElBQUluSixtQkFBbUIsQ0FBQyxDQUFDLElBQUlvSixRQUFRLElBQUl0RixpQkFBaUIsS0FBSyxJQUFJLEVBQUU7TUFDbkUsTUFBTSxJQUFJcUYsS0FBSyxDQUNiLDZHQUNGLENBQUM7SUFDSDs7SUFFQTtJQUNBO0lBQ0EsSUFBSUMsUUFBUSxJQUFJbEYsSUFBSSxFQUFFO01BQ3BCO01BQ0EsTUFBTW9GLFFBQVEsR0FBRzVGLGFBQWEsR0FDMUIyRSxjQUFjLENBQUNrQixPQUFPLENBQUNDLGdCQUFnQixDQUFDQyxZQUFZLENBQUNDLElBQUksQ0FDdkRDLENBQUMsSUFBSUEsQ0FBQyxDQUFDQyxTQUFTLEtBQUtsRyxhQUN2QixDQUFDLEdBQ0RrRixTQUFTO01BQ2IsSUFBSVUsUUFBUSxFQUFFdEQsS0FBSyxFQUFFO1FBQ25CckYsYUFBYSxDQUFDK0MsYUFBYSxDQUFDLEVBQUU0RixRQUFRLENBQUN0RCxLQUFLLENBQUM7TUFDL0M7TUFDQSxNQUFNNkQsTUFBTSxHQUFHLE1BQU1uSixhQUFhLENBQ2hDO1FBQ0V3RCxJQUFJO1FBQ0pULE1BQU07UUFDTkgsV0FBVztRQUNYYSxTQUFTLEVBQUVpRixRQUFRO1FBQ25CVSxhQUFhLEVBQUUsSUFBSTtRQUNuQnpELGtCQUFrQixFQUFFK0IsU0FBUyxLQUFLLE1BQU07UUFDeEN4RSxLQUFLLEVBQUVBLEtBQUssSUFBSTBGLFFBQVEsRUFBRTFGLEtBQUs7UUFDL0JtQyxVQUFVLEVBQUVyQyxhQUFhO1FBQ3pCcUcsaUJBQWlCLEVBQUV4QixnQkFBZ0IsRUFBRXlCO01BQ3ZDLENBQUMsRUFDRDNCLGNBQ0YsQ0FBQzs7TUFFRDtNQUNBO01BQ0E7TUFDQTtNQUNBLE1BQU00QixXQUFXLEVBQUVyRSxxQkFBcUIsR0FBRztRQUN6Q1YsTUFBTSxFQUFFLGtCQUFrQixJQUFJZ0YsS0FBSztRQUNuQ3pHLE1BQU07UUFDTixHQUFHb0csTUFBTSxDQUFDTTtNQUNaLENBQUM7TUFDRCxPQUFPO1FBQUVBLElBQUksRUFBRUY7TUFBWSxDQUFDLElBQUksT0FBTyxJQUFJO1FBQUVFLElBQUksRUFBRXpFLE1BQU07TUFBQyxDQUFDO0lBQzdEOztJQUVBO0lBQ0E7SUFDQTtJQUNBO0lBQ0EsTUFBTTBFLGFBQWEsR0FDakIxRyxhQUFhLEtBQ1poQyxxQkFBcUIsQ0FBQyxDQUFDLEdBQUdrSCxTQUFTLEdBQUd6SCxxQkFBcUIsQ0FBQ3lJLFNBQVMsQ0FBQztJQUN6RSxNQUFNUyxVQUFVLEdBQUdELGFBQWEsS0FBS3hCLFNBQVM7SUFFOUMsSUFBSTBCLGFBQWEsRUFBRTFJLGVBQWU7SUFDbEMsSUFBSXlJLFVBQVUsRUFBRTtNQUNkO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBLElBQ0VoQyxjQUFjLENBQUNrQixPQUFPLENBQUNnQixXQUFXLEtBQ2hDLGlCQUFpQjlJLFVBQVUsQ0FBQ21JLFNBQVMsRUFBRSxJQUN6Q2pJLGFBQWEsQ0FBQzBHLGNBQWMsQ0FBQ21DLFFBQVEsQ0FBQyxFQUN0QztRQUNBLE1BQU0sSUFBSXJCLEtBQUssQ0FDYiw2RkFDRixDQUFDO01BQ0g7TUFDQW1CLGFBQWEsR0FBRzdJLFVBQVU7SUFDNUIsQ0FBQyxNQUFNO01BQ0w7TUFDQSxNQUFNZ0osU0FBUyxHQUFHcEMsY0FBYyxDQUFDa0IsT0FBTyxDQUFDQyxnQkFBZ0IsQ0FBQ0MsWUFBWTtNQUN0RSxNQUFNO1FBQUV4QztNQUFrQixDQUFDLEdBQUdvQixjQUFjLENBQUNrQixPQUFPLENBQUNDLGdCQUFnQjtNQUNyRSxNQUFNMUMsTUFBTSxHQUFHeEgsa0JBQWtCO01BQy9CO01BQ0EySCxpQkFBaUIsR0FDYndELFNBQVMsQ0FBQ0MsTUFBTSxDQUFDZixDQUFDLElBQUkxQyxpQkFBaUIsQ0FBQ1EsUUFBUSxDQUFDa0MsQ0FBQyxDQUFDQyxTQUFTLENBQUMsQ0FBQyxHQUM5RGEsU0FBUyxFQUNiNUIsUUFBUSxDQUFDM0IscUJBQXFCLEVBQzlCOUYsZUFDRixDQUFDO01BRUQsTUFBTXVKLEtBQUssR0FBRzdELE1BQU0sQ0FBQzRDLElBQUksQ0FBQ2tCLEtBQUssSUFBSUEsS0FBSyxDQUFDaEIsU0FBUyxLQUFLUSxhQUFhLENBQUM7TUFDckUsSUFBSSxDQUFDTyxLQUFLLEVBQUU7UUFDVjtRQUNBLE1BQU1FLG9CQUFvQixHQUFHSixTQUFTLENBQUNmLElBQUksQ0FDekNrQixLQUFLLElBQUlBLEtBQUssQ0FBQ2hCLFNBQVMsS0FBS1EsYUFDL0IsQ0FBQztRQUNELElBQUlTLG9CQUFvQixFQUFFO1VBQ3hCLE1BQU1DLFFBQVEsR0FBR3ZMLG1CQUFtQixDQUNsQ3NKLFFBQVEsQ0FBQzNCLHFCQUFxQixFQUM5QjlGLGVBQWUsRUFDZmdKLGFBQ0YsQ0FBQztVQUNELE1BQU0sSUFBSWpCLEtBQUssQ0FDYixlQUFlaUIsYUFBYSx5Q0FBeUNoSixlQUFlLElBQUlnSixhQUFhLFdBQVdVLFFBQVEsRUFBRUMsTUFBTSxJQUFJLFVBQVUsR0FDaEosQ0FBQztRQUNIO1FBQ0EsTUFBTSxJQUFJNUIsS0FBSyxDQUNiLGVBQWVpQixhQUFhLGtDQUFrQ3RELE1BQU0sQ0FDakVrRSxHQUFHLENBQUNyQixDQUFDLElBQUlBLENBQUMsQ0FBQ0MsU0FBUyxDQUFDLENBQ3JCcUIsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUNmLENBQUM7TUFDSDtNQUNBWCxhQUFhLEdBQUdLLEtBQUs7SUFDdkI7O0lBRUE7SUFDQTtJQUNBO0lBQ0EsSUFDRTNLLG1CQUFtQixDQUFDLENBQUMsSUFDckJvSixRQUFRLElBQ1JrQixhQUFhLENBQUNZLFVBQVUsS0FBSyxJQUFJLEVBQ2pDO01BQ0EsTUFBTSxJQUFJL0IsS0FBSyxDQUNiLCtEQUErRG1CLGFBQWEsQ0FBQ1YsU0FBUywyQ0FDeEYsQ0FBQztJQUNIOztJQUVBO0lBQ0E7SUFDQSxNQUFNdUIsa0JBQWtCLEdBQUdiLGFBQWEsQ0FBQ2Esa0JBQWtCOztJQUUzRDtJQUNBO0lBQ0EsSUFBSUEsa0JBQWtCLEVBQUVDLE1BQU0sRUFBRTtNQUM5QjtNQUNBO01BQ0E7TUFDQSxNQUFNQyx5QkFBeUIsR0FBR3hDLFFBQVEsQ0FBQ3lDLEdBQUcsQ0FBQ0MsT0FBTyxDQUFDQyxJQUFJLENBQ3pEQyxDQUFDLElBQ0NBLENBQUMsQ0FBQ0MsSUFBSSxLQUFLLFNBQVMsSUFDcEJQLGtCQUFrQixDQUFDSyxJQUFJLENBQUNHLE9BQU8sSUFDN0JGLENBQUMsQ0FBQ3ZILElBQUksQ0FBQzBILFdBQVcsQ0FBQyxDQUFDLENBQUNuRSxRQUFRLENBQUNrRSxPQUFPLENBQUNDLFdBQVcsQ0FBQyxDQUFDLENBQ3JELENBQ0osQ0FBQztNQUVELElBQUlDLGVBQWUsR0FBR2hELFFBQVE7TUFDOUIsSUFBSXdDLHlCQUF5QixFQUFFO1FBQzdCLE1BQU1TLFdBQVcsR0FBRyxNQUFNO1FBQzFCLE1BQU1DLGdCQUFnQixHQUFHLEdBQUc7UUFDNUIsTUFBTUMsUUFBUSxHQUFHdEQsSUFBSSxDQUFDQyxHQUFHLENBQUMsQ0FBQyxHQUFHbUQsV0FBVztRQUV6QyxPQUFPcEQsSUFBSSxDQUFDQyxHQUFHLENBQUMsQ0FBQyxHQUFHcUQsUUFBUSxFQUFFO1VBQzVCLE1BQU10TSxLQUFLLENBQUNxTSxnQkFBZ0IsQ0FBQztVQUM3QkYsZUFBZSxHQUFHeEQsY0FBYyxDQUFDUyxXQUFXLENBQUMsQ0FBQzs7VUFFOUM7VUFDQTtVQUNBLE1BQU1tRCx1QkFBdUIsR0FBR0osZUFBZSxDQUFDUCxHQUFHLENBQUNDLE9BQU8sQ0FBQ0MsSUFBSSxDQUM5REMsQ0FBQyxJQUNDQSxDQUFDLENBQUNDLElBQUksS0FBSyxRQUFRLElBQ25CUCxrQkFBa0IsQ0FBQ0ssSUFBSSxDQUFDRyxPQUFPLElBQzdCRixDQUFDLENBQUN2SCxJQUFJLENBQUMwSCxXQUFXLENBQUMsQ0FBQyxDQUFDbkUsUUFBUSxDQUFDa0UsT0FBTyxDQUFDQyxXQUFXLENBQUMsQ0FBQyxDQUNyRCxDQUNKLENBQUM7VUFDRCxJQUFJSyx1QkFBdUIsRUFBRTtVQUU3QixNQUFNQyxZQUFZLEdBQUdMLGVBQWUsQ0FBQ1AsR0FBRyxDQUFDQyxPQUFPLENBQUNDLElBQUksQ0FDbkRDLENBQUMsSUFDQ0EsQ0FBQyxDQUFDQyxJQUFJLEtBQUssU0FBUyxJQUNwQlAsa0JBQWtCLENBQUNLLElBQUksQ0FBQ0csT0FBTyxJQUM3QkYsQ0FBQyxDQUFDdkgsSUFBSSxDQUFDMEgsV0FBVyxDQUFDLENBQUMsQ0FBQ25FLFFBQVEsQ0FBQ2tFLE9BQU8sQ0FBQ0MsV0FBVyxDQUFDLENBQUMsQ0FDckQsQ0FDSixDQUFDO1VBQ0QsSUFBSSxDQUFDTSxZQUFZLEVBQUU7UUFDckI7TUFDRjs7TUFFQTtNQUNBLE1BQU1DLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUU7TUFDckMsS0FBSyxNQUFNL0UsSUFBSSxJQUFJeUUsZUFBZSxDQUFDUCxHQUFHLENBQUN2RSxLQUFLLEVBQUU7UUFDNUMsSUFBSUssSUFBSSxDQUFDbEQsSUFBSSxFQUFFbUQsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1VBQ2xDO1VBQ0EsTUFBTUMsS0FBSyxHQUFHRixJQUFJLENBQUNsRCxJQUFJLENBQUNxRCxLQUFLLENBQUMsSUFBSSxDQUFDO1VBQ25DLE1BQU1DLFVBQVUsR0FBR0YsS0FBSyxDQUFDLENBQUMsQ0FBQztVQUMzQixJQUFJRSxVQUFVLElBQUksQ0FBQzJFLGdCQUFnQixDQUFDMUUsUUFBUSxDQUFDRCxVQUFVLENBQUMsRUFBRTtZQUN4RDJFLGdCQUFnQixDQUFDekUsSUFBSSxDQUFDRixVQUFVLENBQUM7VUFDbkM7UUFDRjtNQUNGO01BRUEsSUFBSSxDQUFDMUYscUJBQXFCLENBQUN3SSxhQUFhLEVBQUU2QixnQkFBZ0IsQ0FBQyxFQUFFO1FBQzNELE1BQU1DLE9BQU8sR0FBR2pCLGtCQUFrQixDQUFDVCxNQUFNLENBQ3ZDaUIsT0FBTyxJQUNMLENBQUNRLGdCQUFnQixDQUFDWCxJQUFJLENBQUNhLE1BQU0sSUFDM0JBLE1BQU0sQ0FBQ1QsV0FBVyxDQUFDLENBQUMsQ0FBQ25FLFFBQVEsQ0FBQ2tFLE9BQU8sQ0FBQ0MsV0FBVyxDQUFDLENBQUMsQ0FDckQsQ0FDSixDQUFDO1FBQ0QsTUFBTSxJQUFJekMsS0FBSyxDQUNiLFVBQVVtQixhQUFhLENBQUNWLFNBQVMsb0NBQW9Dd0MsT0FBTyxDQUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQ3pGLDJCQUEyQmtCLGdCQUFnQixDQUFDZixNQUFNLEdBQUcsQ0FBQyxHQUFHZSxnQkFBZ0IsQ0FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLElBQUksR0FDakcsa0VBQ0osQ0FBQztNQUNIO0lBQ0Y7O0lBRUE7SUFDQSxJQUFJWCxhQUFhLENBQUN0RSxLQUFLLEVBQUU7TUFDdkJyRixhQUFhLENBQUMySixhQUFhLENBQUNWLFNBQVMsRUFBRVUsYUFBYSxDQUFDdEUsS0FBSyxDQUFDO0lBQzdEOztJQUVBO0lBQ0EsTUFBTXNHLGtCQUFrQixHQUFHbk4sYUFBYSxDQUN0Q21MLGFBQWEsQ0FBQzFHLEtBQUssRUFDbkJ5RSxjQUFjLENBQUNrQixPQUFPLENBQUNnRCxhQUFhLEVBQ3BDbEMsVUFBVSxHQUFHekIsU0FBUyxHQUFHaEYsS0FBSyxFQUM5Qm1GLGNBQ0YsQ0FBQztJQUVEcE0sUUFBUSxDQUFDLDJCQUEyQixFQUFFO01BQ3BDb0osVUFBVSxFQUNSdUUsYUFBYSxDQUFDVixTQUFTLElBQUlsTiwwREFBMEQ7TUFDdkZrSCxLQUFLLEVBQ0gwSSxrQkFBa0IsSUFBSTVQLDBEQUEwRDtNQUNsRnFPLE1BQU0sRUFDSlQsYUFBYSxDQUFDUyxNQUFNLElBQUlyTywwREFBMEQ7TUFDcEZzSixLQUFLLEVBQ0hzRSxhQUFhLENBQUN0RSxLQUFLLElBQUl0SiwwREFBMEQ7TUFDbkY4UCxpQkFBaUIsRUFBRXpLLGNBQWMsQ0FBQ3VJLGFBQWEsQ0FBQztNQUNoRG1DLFNBQVMsRUFBRSxLQUFLO01BQ2hCQyxRQUFRLEVBQ04sQ0FBQzVJLGlCQUFpQixLQUFLLElBQUksSUFBSXdHLGFBQWEsQ0FBQ1ksVUFBVSxLQUFLLElBQUksS0FDaEUsQ0FBQ3BJLHlCQUF5QjtNQUM1QjZKLE9BQU8sRUFBRXRDO0lBQ1gsQ0FBQyxDQUFDOztJQUVGO0lBQ0EsTUFBTXVDLGtCQUFrQixHQUFHckksU0FBUyxJQUFJK0YsYUFBYSxDQUFDL0YsU0FBUzs7SUFFL0Q7SUFDQTtJQUNBLElBQUksVUFBVSxLQUFLLEtBQUssSUFBSXFJLGtCQUFrQixLQUFLLFFBQVEsRUFBRTtNQUMzRCxNQUFNQyxXQUFXLEdBQUcsTUFBTS9PLDJCQUEyQixDQUFDLENBQUM7TUFDdkQsSUFBSSxDQUFDK08sV0FBVyxDQUFDQyxRQUFRLEVBQUU7UUFDekIsTUFBTUMsT0FBTyxHQUFHRixXQUFXLENBQUNHLE1BQU0sQ0FDL0JoQyxHQUFHLENBQUNqTix1QkFBdUIsQ0FBQyxDQUM1QmtOLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDYixNQUFNLElBQUk5QixLQUFLLENBQUMsZ0NBQWdDNEQsT0FBTyxFQUFFLENBQUM7TUFDNUQ7TUFFQSxJQUFJRSxjQUFjLEVBQUUsTUFBTSxHQUFHLFNBQVM7TUFDdEMsTUFBTUMsT0FBTyxHQUFHLE1BQU1qTixnQkFBZ0IsQ0FBQztRQUNyQ2tOLGNBQWMsRUFBRTFKLE1BQU07UUFDdEJILFdBQVc7UUFDWDhKLE1BQU0sRUFBRS9FLGNBQWMsQ0FBQ2dGLGVBQWUsQ0FBQ0QsTUFBTTtRQUM3Q0UsWUFBWSxFQUFFQyxHQUFHLElBQUk7VUFDbkJOLGNBQWMsR0FBR00sR0FBRztRQUN0QjtNQUNGLENBQUMsQ0FBQztNQUNGLElBQUksQ0FBQ0wsT0FBTyxFQUFFO1FBQ1osTUFBTSxJQUFJL0QsS0FBSyxDQUFDOEQsY0FBYyxJQUFJLGlDQUFpQyxDQUFDO01BQ3RFO01BRUEsTUFBTTtRQUFFMUcsTUFBTTtRQUFFaUg7TUFBVSxDQUFDLEdBQUd2UCx1QkFBdUIsQ0FBQztRQUNwRHdQLGNBQWMsRUFBRSxjQUFjO1FBQzlCUCxPQUFPLEVBQUU7VUFBRVEsRUFBRSxFQUFFUixPQUFPLENBQUNRLEVBQUU7VUFBRUMsS0FBSyxFQUFFVCxPQUFPLENBQUNTLEtBQUssSUFBSXJLO1FBQVksQ0FBQztRQUNoRXNLLE9BQU8sRUFBRW5LLE1BQU07UUFDZm9LLE9BQU8sRUFBRXhGLGNBQWM7UUFDdkJ5RixTQUFTLEVBQUV6RixjQUFjLENBQUN5RjtNQUM1QixDQUFDLENBQUM7TUFFRm5SLFFBQVEsQ0FBQyxrQ0FBa0MsRUFBRTtRQUMzQ29KLFVBQVUsRUFDUnVFLGFBQWEsQ0FBQ1YsU0FBUyxJQUFJbE47TUFDL0IsQ0FBQyxDQUFDO01BRUYsTUFBTXFSLFlBQVksRUFBRXpILG9CQUFvQixHQUFHO1FBQ3pDcEIsTUFBTSxFQUFFLGlCQUFpQjtRQUN6QnFCLE1BQU07UUFDTkMsVUFBVSxFQUFFeEksdUJBQXVCLENBQUN3UCxTQUFTLENBQUM7UUFDOUNsSyxXQUFXO1FBQ1hHLE1BQU07UUFDTjZCLFVBQVUsRUFBRXpGLGlCQUFpQixDQUFDMEcsTUFBTTtNQUN0QyxDQUFDO01BQ0QsT0FBTztRQUFFNEQsSUFBSSxFQUFFNEQ7TUFBYSxDQUFDLElBQUksT0FBTyxJQUFJO1FBQUU1RCxJQUFJLEVBQUV6RSxNQUFNO01BQUMsQ0FBQztJQUM5RDtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBLElBQUlzSSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxTQUFTO0lBQzlDLElBQUlDLHNCQUFzQixFQUN0QnBKLFVBQVUsQ0FBQyxPQUFPbEYsMEJBQTBCLENBQUMsR0FDN0MsU0FBUztJQUNiLElBQUl1TyxjQUFjLEVBQUVuUyxXQUFXLEVBQUU7SUFFakMsSUFBSXNPLFVBQVUsRUFBRTtNQUNkLElBQUloQyxjQUFjLENBQUM4RixvQkFBb0IsRUFBRTtRQUN2Q0Ysc0JBQXNCLEdBQUc1RixjQUFjLENBQUM4RixvQkFBb0I7TUFDOUQsQ0FBQyxNQUFNO1FBQ0w7UUFDQTtRQUNBLE1BQU1DLHlCQUF5QixHQUFHdkYsUUFBUSxDQUFDK0IsS0FBSyxHQUM1Qy9CLFFBQVEsQ0FBQ1csZ0JBQWdCLENBQUNDLFlBQVksQ0FBQ0MsSUFBSSxDQUN6Q0MsQ0FBQyxJQUFJQSxDQUFDLENBQUNDLFNBQVMsS0FBS2YsUUFBUSxDQUFDK0IsS0FDaEMsQ0FBQyxHQUNEaEMsU0FBUztRQUNiLE1BQU15Riw0QkFBNEIsR0FBR0MsS0FBSyxDQUFDQyxJQUFJLENBQzdDMUYsUUFBUSxDQUFDM0IscUJBQXFCLENBQUNtSCw0QkFBNEIsQ0FBQ0csSUFBSSxDQUFDLENBQ25FLENBQUM7UUFDRCxNQUFNQyxtQkFBbUIsR0FBRyxNQUFNblMsZUFBZSxDQUMvQytMLGNBQWMsQ0FBQ2tCLE9BQU8sQ0FBQ3hDLEtBQUssRUFDNUJzQixjQUFjLENBQUNrQixPQUFPLENBQUNnRCxhQUFhLEVBQ3BDOEIsNEJBQTRCLEVBQzVCaEcsY0FBYyxDQUFDa0IsT0FBTyxDQUFDbUYsVUFDekIsQ0FBQztRQUNEVCxzQkFBc0IsR0FBR3RPLDBCQUEwQixDQUFDO1VBQ2xEeU8seUJBQXlCO1VBQ3pCL0YsY0FBYztVQUNkc0csa0JBQWtCLEVBQUV0RyxjQUFjLENBQUNrQixPQUFPLENBQUNvRixrQkFBa0I7VUFDN0RGLG1CQUFtQjtVQUNuQkcsa0JBQWtCLEVBQUV2RyxjQUFjLENBQUNrQixPQUFPLENBQUNxRjtRQUM3QyxDQUFDLENBQUM7TUFDSjtNQUNBVixjQUFjLEdBQUczTSxtQkFBbUIsQ0FBQ2tDLE1BQU0sRUFBRThFLGdCQUFnQixDQUFDO0lBQ2hFLENBQUMsTUFBTTtNQUNMLElBQUk7UUFDRixNQUFNOEYsNEJBQTRCLEdBQUdDLEtBQUssQ0FBQ0MsSUFBSSxDQUM3QzFGLFFBQVEsQ0FBQzNCLHFCQUFxQixDQUFDbUgsNEJBQTRCLENBQUNHLElBQUksQ0FBQyxDQUNuRSxDQUFDOztRQUVEO1FBQ0EsTUFBTUssV0FBVyxHQUFHdkUsYUFBYSxDQUFDaE8sZUFBZSxDQUFDO1VBQUUrTDtRQUFlLENBQUMsQ0FBQzs7UUFFckU7UUFDQSxJQUFJaUMsYUFBYSxDQUFDd0UsTUFBTSxFQUFFO1VBQ3hCblMsUUFBUSxDQUFDLDJCQUEyQixFQUFFO1lBQ3BDLElBQUksVUFBVSxLQUFLLEtBQUssSUFBSTtjQUMxQm9KLFVBQVUsRUFDUnVFLGFBQWEsQ0FBQ1YsU0FBUyxJQUFJbE47WUFDL0IsQ0FBQyxDQUFDO1lBQ0ZxUyxLQUFLLEVBQ0h6RSxhQUFhLENBQUN3RSxNQUFNLElBQUlwUywwREFBMEQ7WUFDcEZxTyxNQUFNLEVBQ0osVUFBVSxJQUFJck87VUFDbEIsQ0FBQyxDQUFDO1FBQ0o7O1FBRUE7UUFDQXNSLG9CQUFvQixHQUFHLE1BQU0zUixpQ0FBaUMsQ0FDNUQsQ0FBQ3dTLFdBQVcsQ0FBQyxFQUNidkMsa0JBQWtCLEVBQ2xCK0IsNEJBQ0YsQ0FBQztNQUNILENBQUMsQ0FBQyxPQUFPVyxLQUFLLEVBQUU7UUFDZHhRLGVBQWUsQ0FDYix5Q0FBeUM4TCxhQUFhLENBQUNWLFNBQVMsS0FBS2pMLFlBQVksQ0FBQ3FRLEtBQUssQ0FBQyxFQUMxRixDQUFDO01BQ0g7TUFDQWQsY0FBYyxHQUFHLENBQUNuUCxpQkFBaUIsQ0FBQztRQUFFa1EsT0FBTyxFQUFFeEw7TUFBTyxDQUFDLENBQUMsQ0FBQztJQUMzRDtJQUVBLE1BQU15TCxRQUFRLEdBQUc7TUFDZnpMLE1BQU07TUFDTjZJLGtCQUFrQjtNQUNsQnZLLGNBQWMsRUFBRUEsY0FBYyxDQUFDdUksYUFBYSxDQUFDO01BQzdDN0IsU0FBUztNQUNUbUIsU0FBUyxFQUFFVSxhQUFhLENBQUNWLFNBQVM7TUFDbEN1RixPQUFPLEVBQ0wsQ0FBQ3JMLGlCQUFpQixLQUFLLElBQUksSUFBSXdHLGFBQWEsQ0FBQ1ksVUFBVSxLQUFLLElBQUksS0FDaEUsQ0FBQ3BJO0lBQ0wsQ0FBQzs7SUFFRDtJQUNBO0lBQ0EsTUFBTStFLGFBQWEsR0FBR3BNLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxHQUM3Q2dELFdBQVcsQ0FBQ3NFLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDOEUsNEJBQTRCLENBQUMsR0FDckQsS0FBSzs7SUFFVDtJQUNBO0lBQ0EsTUFBTXNILFVBQVUsR0FBRzFOLHFCQUFxQixDQUFDLENBQUM7O0lBRTFDO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0EsTUFBTTJOLG1CQUFtQixHQUFHNVQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUN6Q29OLFFBQVEsQ0FBQ3lHLGFBQWEsR0FDdEIsS0FBSztJQUVULE1BQU1DLGNBQWMsR0FDbEIsQ0FBQ3pMLGlCQUFpQixLQUFLLElBQUksSUFDekJ3RyxhQUFhLENBQUNZLFVBQVUsS0FBSyxJQUFJLElBQ2pDckQsYUFBYSxJQUNidUgsVUFBVSxJQUNWQyxtQkFBbUIsS0FDbEIxTSxlQUFlLEVBQUU2TSxpQkFBaUIsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQ2pELENBQUMxTSx5QkFBeUI7SUFDNUI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBLE1BQU0yTSx1QkFBdUIsR0FBRztNQUM5QixHQUFHNUcsUUFBUSxDQUFDM0IscUJBQXFCO01BQ2pDOUMsSUFBSSxFQUFFa0csYUFBYSxDQUFDdkIsY0FBYyxJQUFJO0lBQ3hDLENBQUM7SUFDRCxNQUFNMkcsV0FBVyxHQUFHeFIsZ0JBQWdCLENBQ2xDdVIsdUJBQXVCLEVBQ3ZCNUcsUUFBUSxDQUFDeUMsR0FBRyxDQUFDdkUsS0FDZixDQUFDOztJQUVEO0lBQ0EsTUFBTTRJLFlBQVksR0FBR3hQLGFBQWEsQ0FBQyxDQUFDOztJQUVwQztJQUNBLElBQUl5UCxZQUFZLEVBQUU7TUFDaEJDLFlBQVksRUFBRSxNQUFNO01BQ3BCQyxjQUFjLENBQUMsRUFBRSxNQUFNO01BQ3ZCQyxVQUFVLENBQUMsRUFBRSxNQUFNO01BQ25CQyxPQUFPLENBQUMsRUFBRSxNQUFNO01BQ2hCQyxTQUFTLENBQUMsRUFBRSxPQUFPO0lBQ3JCLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSTtJQUVmLElBQUlyRCxrQkFBa0IsS0FBSyxVQUFVLEVBQUU7TUFDckMsTUFBTXNELElBQUksR0FBRyxTQUFTUCxZQUFZLENBQUNRLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7TUFDaERQLFlBQVksR0FBRyxNQUFNeFAsbUJBQW1CLENBQUM4UCxJQUFJLENBQUM7SUFDaEQ7O0lBRUE7SUFDQTtJQUNBO0lBQ0EsSUFBSTdGLFVBQVUsSUFBSXVGLFlBQVksRUFBRTtNQUM5QjFCLGNBQWMsQ0FBQ3hHLElBQUksQ0FDakIzSSxpQkFBaUIsQ0FBQztRQUNoQmtRLE9BQU8sRUFBRXpOLG1CQUFtQixDQUFDbEQsTUFBTSxDQUFDLENBQUMsRUFBRXNSLFlBQVksQ0FBQ0MsWUFBWTtNQUNsRSxDQUFDLENBQ0gsQ0FBQztJQUNIO0lBRUEsTUFBTU8sY0FBYyxFQUFFQyxVQUFVLENBQUMsT0FBT3BPLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHO01BQ3JEcU8sZUFBZSxFQUFFaEcsYUFBYTtNQUM5QjRELGNBQWM7TUFDZDdGLGNBQWM7TUFDZEMsVUFBVTtNQUNWNkcsT0FBTyxFQUFFSSxjQUFjO01BQ3ZCaEYsV0FBVyxFQUNUbEMsY0FBYyxDQUFDa0IsT0FBTyxDQUFDZ0IsV0FBVyxJQUNsQ3RPLHNCQUFzQixDQUNwQnFPLGFBQWEsQ0FBQ1YsU0FBUyxFQUN2QjdILGNBQWMsQ0FBQ3VJLGFBQWEsQ0FDOUIsQ0FBQztNQUNIMUcsS0FBSyxFQUFFeUcsVUFBVSxHQUFHekIsU0FBUyxHQUFHaEYsS0FBSztNQUNyQztNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0EyTSxRQUFRLEVBQUVsRyxVQUFVLEdBQ2hCO1FBQUVtRyxZQUFZLEVBQUV2QztNQUF1QixDQUFDLEdBQ3hDRCxvQkFBb0IsSUFBSSxDQUFDNEIsWUFBWSxJQUFJLENBQUNwTCxHQUFHLEdBQzNDO1FBQUVnTSxZQUFZLEVBQUU1USxjQUFjLENBQUNvTyxvQkFBb0I7TUFBRSxDQUFDLEdBQ3REcEYsU0FBUztNQUNmNkgsY0FBYyxFQUFFcEcsVUFBVSxHQUFHaEMsY0FBYyxDQUFDa0IsT0FBTyxDQUFDeEMsS0FBSyxHQUFHMkksV0FBVztNQUN2RTtNQUNBO01BQ0FnQixtQkFBbUIsRUFBRXJHLFVBQVUsR0FBR2hDLGNBQWMsQ0FBQ21DLFFBQVEsR0FBRzVCLFNBQVM7TUFDckUsSUFBSXlCLFVBQVUsSUFBSTtRQUFFc0csYUFBYSxFQUFFO01BQUssQ0FBQyxDQUFDO01BQzFDZCxZQUFZLEVBQUVELFlBQVksRUFBRUMsWUFBWTtNQUN4Q3ZNO0lBQ0YsQ0FBQzs7SUFFRDtJQUNBO0lBQ0EsTUFBTXNOLGVBQWUsR0FBR3BNLEdBQUcsSUFBSW9MLFlBQVksRUFBRUMsWUFBWTtJQUN6RCxNQUFNZ0IsV0FBVyxHQUFHLENBQUMsQ0FBQyxFQUFFQSxDQUFDQyxFQUFFLEVBQUUsR0FBRyxHQUFHQyxDQUFDLENBQUMsRUFBRUEsQ0FBQyxJQUN0Q0gsZUFBZSxHQUFHclMsa0JBQWtCLENBQUNxUyxlQUFlLEVBQUVFLEVBQUUsQ0FBQyxHQUFHQSxFQUFFLENBQUMsQ0FBQzs7SUFFbEU7SUFDQSxNQUFNRSx1QkFBdUIsR0FBRyxNQUFBQSxDQUFBLENBQVEsRUFBRUMsT0FBTyxDQUFDO01BQ2hEcEIsWUFBWSxDQUFDLEVBQUUsTUFBTTtNQUNyQkMsY0FBYyxDQUFDLEVBQUUsTUFBTTtJQUN6QixDQUFDLENBQUMsSUFBSTtNQUNKLElBQUksQ0FBQ0YsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO01BQzVCLE1BQU07UUFBRUMsWUFBWTtRQUFFQyxjQUFjO1FBQUVDLFVBQVU7UUFBRUMsT0FBTztRQUFFQztNQUFVLENBQUMsR0FDcEVMLFlBQVk7TUFDZDtNQUNBO01BQ0FBLFlBQVksR0FBRyxJQUFJO01BQ25CLElBQUlLLFNBQVMsRUFBRTtRQUNiO1FBQ0F6UixlQUFlLENBQUMsc0NBQXNDcVIsWUFBWSxFQUFFLENBQUM7UUFDckUsT0FBTztVQUFFQTtRQUFhLENBQUM7TUFDekI7TUFDQSxJQUFJRSxVQUFVLEVBQUU7UUFDZCxNQUFNbUIsT0FBTyxHQUFHLE1BQU03USxrQkFBa0IsQ0FBQ3dQLFlBQVksRUFBRUUsVUFBVSxDQUFDO1FBQ2xFLElBQUksQ0FBQ21CLE9BQU8sRUFBRTtVQUNaLE1BQU01USxtQkFBbUIsQ0FBQ3VQLFlBQVksRUFBRUMsY0FBYyxFQUFFRSxPQUFPLENBQUM7VUFDaEU7VUFDQTtVQUNBO1VBQ0EsS0FBS3ZRLGtCQUFrQixDQUFDdEIsU0FBUyxDQUFDd1IsWUFBWSxDQUFDLEVBQUU7WUFDL0MvRixTQUFTLEVBQUVVLGFBQWEsQ0FBQ1YsU0FBUztZQUNsQ3RHO1VBQ0YsQ0FBQyxDQUFDLENBQUM2TixLQUFLLENBQUNDLElBQUksSUFDWDVTLGVBQWUsQ0FBQyxzQ0FBc0M0UyxJQUFJLEVBQUUsQ0FDOUQsQ0FBQztVQUNELE9BQU8sQ0FBQyxDQUFDO1FBQ1g7TUFDRjtNQUNBNVMsZUFBZSxDQUFDLHdDQUF3Q3FSLFlBQVksRUFBRSxDQUFDO01BQ3ZFLE9BQU87UUFBRUEsWUFBWTtRQUFFQztNQUFlLENBQUM7SUFDekMsQ0FBQztJQUVELElBQUlQLGNBQWMsRUFBRTtNQUNsQixNQUFNOEIsWUFBWSxHQUFHMUIsWUFBWTtNQUNqQyxNQUFNMkIsbUJBQW1CLEdBQUc3VCxrQkFBa0IsQ0FBQztRQUM3QzRILE9BQU8sRUFBRWdNLFlBQVk7UUFDckIvTixXQUFXO1FBQ1hHLE1BQU07UUFDTjZHLGFBQWE7UUFDYnBCLFdBQVcsRUFBRUYsZUFBZTtRQUM1QjtRQUNBO1FBQ0E7UUFDQThFLFNBQVMsRUFBRXpGLGNBQWMsQ0FBQ3lGO01BQzVCLENBQUMsQ0FBQzs7TUFFRjtNQUNBO01BQ0E7TUFDQSxJQUFJNUosSUFBSSxFQUFFO1FBQ1I4RSxlQUFlLENBQUN1SSxJQUFJLElBQUk7VUFDdEIsTUFBTUMsSUFBSSxHQUFHLElBQUlDLEdBQUcsQ0FBQ0YsSUFBSSxDQUFDRyxpQkFBaUIsQ0FBQztVQUM1Q0YsSUFBSSxDQUFDRyxHQUFHLENBQUN6TixJQUFJLEVBQUUvRixTQUFTLENBQUNrVCxZQUFZLENBQUMsQ0FBQztVQUN2QyxPQUFPO1lBQUUsR0FBR0UsSUFBSTtZQUFFRyxpQkFBaUIsRUFBRUY7VUFBSyxDQUFDO1FBQzdDLENBQUMsQ0FBQztNQUNKOztNQUVBO01BQ0EsTUFBTUksaUJBQWlCLEdBQUc7UUFDeEJ2TSxPQUFPLEVBQUVnTSxZQUFZO1FBQ3JCO1FBQ0E7UUFDQVEsZUFBZSxFQUFFL1Isa0JBQWtCLENBQUMsQ0FBQztRQUNyQzhKLFNBQVMsRUFBRSxVQUFVLElBQUlNLEtBQUs7UUFDOUI0SCxZQUFZLEVBQUV4SCxhQUFhLENBQUNWLFNBQVM7UUFDckNtSSxTQUFTLEVBQUVoUSxjQUFjLENBQUN1SSxhQUFhLENBQUM7UUFDeENQLGlCQUFpQixFQUFFeEIsZ0JBQWdCLEVBQUV5QixTQUFTO1FBQzlDZ0ksY0FBYyxFQUFFLE9BQU8sSUFBSTlILEtBQUs7UUFDaEMrSCxpQkFBaUIsRUFBRTtNQUNyQixDQUFDOztNQUVEO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQSxLQUFLN1QsbUJBQW1CLENBQUN3VCxpQkFBaUIsRUFBRSxNQUMxQ2YsV0FBVyxDQUFDLE1BQ1YzUCxzQkFBc0IsQ0FBQztRQUNyQnFGLE1BQU0sRUFBRStLLG1CQUFtQixDQUFDak0sT0FBTztRQUNuQ2dJLGVBQWUsRUFBRWlFLG1CQUFtQixDQUFDakUsZUFBZSxDQUFDO1FBQ3JENkUsVUFBVSxFQUFFQyxpQkFBaUIsSUFDM0JsUSxRQUFRLENBQUM7VUFDUCxHQUFHbU8sY0FBYztVQUNqQkcsUUFBUSxFQUFFO1lBQ1IsR0FBR0gsY0FBYyxDQUFDRyxRQUFRO1lBQzFCbEwsT0FBTyxFQUFFbEgsU0FBUyxDQUFDbVQsbUJBQW1CLENBQUNqTSxPQUFPLENBQUM7WUFDL0NnSSxlQUFlLEVBQUVpRSxtQkFBbUIsQ0FBQ2pFLGVBQWU7VUFDdEQsQ0FBQztVQUNEOEU7UUFDRixDQUFDLENBQUM7UUFDSmpELFFBQVE7UUFDUjVMLFdBQVc7UUFDWCtFLGNBQWM7UUFDZFcsZUFBZTtRQUNmb0osaUJBQWlCLEVBQUVmLFlBQVk7UUFDL0JnQixtQkFBbUIsRUFDakJ4SyxhQUFhLElBQ2JuRyxxQkFBcUIsQ0FBQyxDQUFDLElBQ3ZCdEYsbUNBQW1DLENBQUMsQ0FBQztRQUN2Q2tXLGlCQUFpQixFQUFFdEI7TUFDckIsQ0FBQyxDQUNILENBQ0YsQ0FBQztNQUVELE1BQU16TCxpQkFBaUIsR0FBRzhDLGNBQWMsQ0FBQ2tCLE9BQU8sQ0FBQ3hDLEtBQUssQ0FBQ3lFLElBQUksQ0FDekQrRyxDQUFDLElBQ0MxVyxlQUFlLENBQUMwVyxDQUFDLEVBQUU5UixtQkFBbUIsQ0FBQyxJQUN2QzVFLGVBQWUsQ0FBQzBXLENBQUMsRUFBRWhTLGNBQWMsQ0FDckMsQ0FBQztNQUNELE9BQU87UUFDTDRKLElBQUksRUFBRTtVQUNKZ0YsT0FBTyxFQUFFLElBQUksSUFBSWpGLEtBQUs7VUFDdEJoRixNQUFNLEVBQUUsZ0JBQWdCLElBQUlnRixLQUFLO1VBQ2pDN0UsT0FBTyxFQUFFaU0sbUJBQW1CLENBQUNqTSxPQUFPO1VBQ3BDL0IsV0FBVyxFQUFFQSxXQUFXO1VBQ3hCRyxNQUFNLEVBQUVBLE1BQU07VUFDZDZCLFVBQVUsRUFBRXpGLGlCQUFpQixDQUFDeVIsbUJBQW1CLENBQUNqTSxPQUFPLENBQUM7VUFDMURFO1FBQ0Y7TUFDRixDQUFDO0lBQ0gsQ0FBQyxNQUFNO01BQ0w7TUFDQSxNQUFNaU4sV0FBVyxHQUFHclUsU0FBUyxDQUFDd1IsWUFBWSxDQUFDOztNQUUzQztNQUNBLE1BQU04QyxnQkFBZ0IsR0FBRztRQUN2QnBOLE9BQU8sRUFBRW1OLFdBQVc7UUFDcEI7UUFDQTtRQUNBWCxlQUFlLEVBQUUvUixrQkFBa0IsQ0FBQyxDQUFDO1FBQ3JDOEosU0FBUyxFQUFFLFVBQVUsSUFBSU0sS0FBSztRQUM5QjRILFlBQVksRUFBRXhILGFBQWEsQ0FBQ1YsU0FBUztRQUNyQ21JLFNBQVMsRUFBRWhRLGNBQWMsQ0FBQ3VJLGFBQWEsQ0FBQztRQUN4Q1AsaUJBQWlCLEVBQUV4QixnQkFBZ0IsRUFBRXlCLFNBQVM7UUFDOUNnSSxjQUFjLEVBQUUsT0FBTyxJQUFJOUgsS0FBSztRQUNoQytILGlCQUFpQixFQUFFO01BQ3JCLENBQUM7O01BRUQ7TUFDQTtNQUNBLE9BQU83VCxtQkFBbUIsQ0FBQ3FVLGdCQUFnQixFQUFFLE1BQzNDNUIsV0FBVyxDQUFDLFlBQVk7UUFDdEIsTUFBTTZCLGFBQWEsRUFBRTNXLFdBQVcsRUFBRSxHQUFHLEVBQUU7UUFDdkMsTUFBTTRXLGNBQWMsR0FBR2pLLElBQUksQ0FBQ0MsR0FBRyxDQUFDLENBQUM7UUFDakMsTUFBTWlLLFdBQVcsR0FBRzVWLHFCQUFxQixDQUFDLENBQUM7UUFDM0MsTUFBTTZWLG1CQUFtQixHQUFHOVYsaUNBQWlDLENBQzNEc0wsY0FBYyxDQUFDa0IsT0FBTyxDQUFDeEMsS0FDekIsQ0FBQzs7UUFFRDtRQUNBLElBQUltSCxjQUFjLENBQUM5QyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1VBQzdCLE1BQU0wSCx3QkFBd0IsR0FBRzVULGlCQUFpQixDQUFDZ1AsY0FBYyxDQUFDO1VBQ2xFLE1BQU02RSxzQkFBc0IsR0FBR0Qsd0JBQXdCLENBQUNwSixJQUFJLENBQzFELENBQUNzSixDQUFDLENBQUMsRUFBRUEsQ0FBQyxJQUFJaFgscUJBQXFCLElBQUlnWCxDQUFDLENBQUN0SCxJQUFJLEtBQUssTUFDaEQsQ0FBQztVQUNELElBQ0VxSCxzQkFBc0IsSUFDdEJBLHNCQUFzQixDQUFDckgsSUFBSSxLQUFLLE1BQU0sSUFDdENsRCxVQUFVLEVBQ1Y7WUFDQUEsVUFBVSxDQUFDO2NBQ1R5SyxTQUFTLEVBQUUsU0FBUzFLLGdCQUFnQixDQUFDMkssT0FBTyxDQUFDeEYsRUFBRSxFQUFFO2NBQ2pEdkQsSUFBSSxFQUFFO2dCQUNKK0ksT0FBTyxFQUFFSCxzQkFBc0I7Z0JBQy9CckgsSUFBSSxFQUFFLGdCQUFnQjtnQkFDdEJqSSxNQUFNO2dCQUNONEIsT0FBTyxFQUFFbU47Y0FDWDtZQUNGLENBQUMsQ0FBQztVQUNKO1FBQ0Y7O1FBRUE7UUFDQTtRQUNBLElBQUlXLGdCQUFnQixFQUFFLE1BQU0sR0FBRyxTQUFTO1FBQ3hDO1FBQ0E7UUFDQTtRQUNBLElBQUlDLGlCQUFpQixFQUFFbkMsT0FBTyxDQUFDO1VBQUV2RixJQUFJLEVBQUUsWUFBWTtRQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVM7UUFDbEUsSUFBSTJILG9CQUFvQixFQUFFLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLFNBQVM7UUFDbEQsSUFBSSxDQUFDdlEseUJBQXlCLEVBQUU7VUFDOUIsTUFBTXdRLFlBQVksR0FBRzlWLHVCQUF1QixDQUFDO1lBQzNDNkgsT0FBTyxFQUFFbU4sV0FBVztZQUNwQmxQLFdBQVc7WUFDWEcsTUFBTTtZQUNONkcsYUFBYTtZQUNicEIsV0FBVyxFQUFFRixlQUFlO1lBQzVCOEUsU0FBUyxFQUFFekYsY0FBYyxDQUFDeUYsU0FBUztZQUNuQ3lGLGdCQUFnQixFQUFFclEsbUJBQW1CLENBQUMsQ0FBQyxJQUFJMEY7VUFDN0MsQ0FBQyxDQUFDO1VBQ0Z1SyxnQkFBZ0IsR0FBR0csWUFBWSxDQUFDL00sTUFBTTtVQUN0QzZNLGlCQUFpQixHQUFHRSxZQUFZLENBQUNFLGdCQUFnQixDQUFDQyxJQUFJLENBQUMsT0FBTztZQUM1RC9ILElBQUksRUFBRSxZQUFZLElBQUl4QjtVQUN4QixDQUFDLENBQUMsQ0FBQztVQUNIbUosb0JBQW9CLEdBQUdDLFlBQVksQ0FBQ0Qsb0JBQW9CO1FBQzFEOztRQUVBO1FBQ0EsSUFBSUssbUJBQW1CLEdBQUcsS0FBSztRQUMvQjtRQUNBLElBQUlDLGVBQWUsR0FBRyxLQUFLO1FBQzNCO1FBQ0E7UUFDQSxJQUFJQywyQkFBMkIsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxTQUFTO1FBQ3pEO1FBQ0EsTUFBTUMsYUFBYSxHQUFHVixnQkFBZ0I7O1FBRXRDO1FBQ0EsTUFBTVcsYUFBYSxHQUFHN1IsUUFBUSxDQUFDO1VBQzdCLEdBQUdtTyxjQUFjO1VBQ2pCRyxRQUFRLEVBQUU7WUFDUixHQUFHSCxjQUFjLENBQUNHLFFBQVE7WUFDMUJsTCxPQUFPLEVBQUVtTjtVQUNYLENBQUM7VUFDREwsaUJBQWlCLEVBQ2YwQixhQUFhLElBQUl6WCxtQ0FBbUMsQ0FBQyxDQUFDLEdBQ2xELENBQUMyWCxNQUFNLEVBQUVsVixlQUFlLEtBQUs7WUFDM0IsTUFBTTtjQUFFbVY7WUFBSyxDQUFDLEdBQUd4WCx1QkFBdUIsQ0FDdENxWCxhQUFhLEVBQ2JyQixXQUFXLEVBQ1h1QixNQUFNLEVBQ04vSyxlQUNGLENBQUM7WUFDRDRLLDJCQUEyQixHQUFHSSxJQUFJO1VBQ3BDLENBQUMsR0FDRHBMO1FBQ1IsQ0FBQyxDQUFDLENBQUNxTCxNQUFNLENBQUNDLGFBQWEsQ0FBQyxDQUFDLENBQUM7O1FBRTFCO1FBQ0EsSUFBSUMsY0FBYyxFQUFFaEwsS0FBSyxHQUFHLFNBQVM7UUFDckMsSUFBSWlMLFVBQVUsR0FBRyxLQUFLO1FBQ3RCLElBQUlDLGNBQWMsRUFBRTtVQUNsQnhFLFlBQVksQ0FBQyxFQUFFLE1BQU07VUFDckJDLGNBQWMsQ0FBQyxFQUFFLE1BQU07UUFDekIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVOLElBQUk7VUFDRixPQUFPLElBQUksRUFBRTtZQUNYLE1BQU13RSxPQUFPLEdBQUc1TCxJQUFJLENBQUNDLEdBQUcsQ0FBQyxDQUFDLEdBQUdnSyxjQUFjOztZQUUzQztZQUNBO1lBQ0EsSUFDRSxDQUFDN1AseUJBQXlCLElBQzFCLENBQUM0USxtQkFBbUIsSUFDcEJZLE9BQU8sSUFBSXpSLHFCQUFxQixJQUNoQ3dGLGNBQWMsQ0FBQ2tNLFVBQVUsRUFDekI7Y0FDQWIsbUJBQW1CLEdBQUcsSUFBSTtjQUMxQnJMLGNBQWMsQ0FBQ2tNLFVBQVUsQ0FBQztnQkFDeEJDLEdBQUcsRUFBRSxDQUFDLGNBQWMsR0FBRztnQkFDdkJDLHFCQUFxQixFQUFFLEtBQUs7Z0JBQzVCQyx1QkFBdUIsRUFBRSxJQUFJO2dCQUM3QkMsV0FBVyxFQUFFO2NBQ2YsQ0FBQyxDQUFDO1lBQ0o7O1lBRUE7WUFDQTtZQUNBLE1BQU1DLGtCQUFrQixHQUFHZCxhQUFhLENBQUN0QyxJQUFJLENBQUMsQ0FBQztZQUMvQyxNQUFNcUQsVUFBVSxHQUFHekIsaUJBQWlCLEdBQ2hDLE1BQU1uQyxPQUFPLENBQUM2RCxJQUFJLENBQUMsQ0FDakJGLGtCQUFrQixDQUFDbkIsSUFBSSxDQUFDc0IsQ0FBQyxLQUFLO2NBQzVCckosSUFBSSxFQUFFLFNBQVMsSUFBSXhCLEtBQUs7Y0FDeEJMLE1BQU0sRUFBRWtMO1lBQ1YsQ0FBQyxDQUFDLENBQUMsRUFDSDNCLGlCQUFpQixDQUNsQixDQUFDLEdBQ0Y7Y0FDRTFILElBQUksRUFBRSxTQUFTLElBQUl4QixLQUFLO2NBQ3hCTCxNQUFNLEVBQUUsTUFBTStLO1lBQ2hCLENBQUM7O1lBRUw7WUFDQTtZQUNBO1lBQ0EsSUFBSUMsVUFBVSxDQUFDbkosSUFBSSxLQUFLLFlBQVksSUFBSXlILGdCQUFnQixFQUFFO2NBQ3hELE1BQU10SyxRQUFRLEdBQUdSLGNBQWMsQ0FBQ1MsV0FBVyxDQUFDLENBQUM7Y0FDN0MsTUFBTWtNLElBQUksR0FBR25NLFFBQVEsQ0FBQ29NLEtBQUssQ0FBQzlCLGdCQUFnQixDQUFDO2NBQzdDLElBQUk3VixnQkFBZ0IsQ0FBQzBYLElBQUksQ0FBQyxJQUFJQSxJQUFJLENBQUNFLGNBQWMsRUFBRTtnQkFDakQ7Z0JBQ0EsTUFBTUMsa0JBQWtCLEdBQUdoQyxnQkFBZ0I7Z0JBQzNDUSxlQUFlLEdBQUcsSUFBSTtnQkFDdEI7Z0JBQ0E7Z0JBQ0FDLDJCQUEyQixHQUFHLENBQUM7O2dCQUUvQjtnQkFDQTtnQkFDQTtnQkFDQSxLQUFLeFYsbUJBQW1CLENBQUNxVSxnQkFBZ0IsRUFBRSxZQUFZO2tCQUNyRCxJQUFJMkMsNkJBQTZCLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsU0FBUztrQkFDM0QsSUFBSTtvQkFDRjtvQkFDQTtvQkFDQTtvQkFDQTtvQkFDQSxNQUFNbkUsT0FBTyxDQUFDNkQsSUFBSSxDQUFDLENBQ2pCaEIsYUFBYSxDQUFDdUIsTUFBTSxDQUFDek0sU0FBUyxDQUFDLENBQUN1SSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUMvQ3pSLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FDWixDQUFDO29CQUNGO29CQUNBLE1BQU00VixPQUFPLEdBQUd0WSxxQkFBcUIsQ0FBQyxDQUFDO29CQUN2QyxNQUFNdVksZ0JBQWdCLEdBQ3BCeFksaUNBQWlDLENBQy9Cc0wsY0FBYyxDQUFDa0IsT0FBTyxDQUFDeEMsS0FDekIsQ0FBQztvQkFDSCxLQUFLLE1BQU15TyxXQUFXLElBQUk5QyxhQUFhLEVBQUU7c0JBQ3ZDN1UseUJBQXlCLENBQ3ZCeVgsT0FBTyxFQUNQRSxXQUFXLEVBQ1hELGdCQUFnQixFQUNoQmxOLGNBQWMsQ0FBQ2tCLE9BQU8sQ0FBQ3hDLEtBQ3pCLENBQUM7b0JBQ0g7b0JBQ0EsV0FBVyxNQUFNd0csR0FBRyxJQUFJdEwsUUFBUSxDQUFDO3NCQUMvQixHQUFHbU8sY0FBYztzQkFDakJqQixPQUFPLEVBQUUsSUFBSTtzQkFBRTtzQkFDZm9CLFFBQVEsRUFBRTt3QkFDUixHQUFHSCxjQUFjLENBQUNHLFFBQVE7d0JBQzFCbEwsT0FBTyxFQUFFbEgsU0FBUyxDQUFDZ1gsa0JBQWtCLENBQUM7d0JBQ3RDOUgsZUFBZSxFQUFFMkgsSUFBSSxDQUFDM0g7c0JBQ3hCLENBQUM7c0JBQ0Q4RSxpQkFBaUIsRUFBRS9WLG1DQUFtQyxDQUFDLENBQUMsR0FDcEQsQ0FBQzJYLE1BQU0sRUFBRWxWLGVBQWUsS0FBSzt3QkFDM0IsTUFBTTswQkFBRW1WO3dCQUFLLENBQUMsR0FBR3hYLHVCQUF1QixDQUN0QzJZLGtCQUFrQixFQUNsQmhYLFNBQVMsQ0FBQ2dYLGtCQUFrQixDQUFDLEVBQzdCcEIsTUFBTSxFQUNOL0ssZUFDRixDQUFDO3dCQUNEb00sNkJBQTZCLEdBQUdwQixJQUFJO3NCQUN0QyxDQUFDLEdBQ0RwTDtvQkFDTixDQUFDLENBQUMsRUFBRTtzQkFDRjhKLGFBQWEsQ0FBQ2hMLElBQUksQ0FBQzZGLEdBQUcsQ0FBQzs7c0JBRXZCO3NCQUNBMVAseUJBQXlCLENBQ3ZCeVgsT0FBTyxFQUNQL0gsR0FBRyxFQUNIZ0ksZ0JBQWdCLEVBQ2hCbE4sY0FBYyxDQUFDa0IsT0FBTyxDQUFDeEMsS0FDekIsQ0FBQztzQkFDRG5KLHdCQUF3QixDQUN0QnVYLGtCQUFrQixFQUNsQi9YLGlCQUFpQixDQUFDa1ksT0FBTyxDQUFDLEVBQzFCdE0sZUFDRixDQUFDO3NCQUVELE1BQU15TSxZQUFZLEdBQUd4VSxrQkFBa0IsQ0FBQ3NNLEdBQUcsQ0FBQztzQkFDNUMsSUFBSWtJLFlBQVksRUFBRTt3QkFDaEIzVSxnQkFBZ0IsQ0FDZHdVLE9BQU8sRUFDUEgsa0JBQWtCLEVBQ2xCOU0sY0FBYyxDQUFDeUYsU0FBUyxFQUN4QnhLLFdBQVcsRUFDWG1GLFNBQVMsRUFDVGdOLFlBQ0YsQ0FBQztzQkFDSDtvQkFDRjtvQkFDQSxNQUFNQyxXQUFXLEdBQUcxVSxpQkFBaUIsQ0FDbkMwUixhQUFhLEVBQ2J5QyxrQkFBa0IsRUFDbEJqRyxRQUNGLENBQUM7O29CQUVEO29CQUNBO29CQUNBO29CQUNBO29CQUNBcFMsa0JBQWtCLENBQUM0WSxXQUFXLEVBQUUxTSxlQUFlLENBQUM7O29CQUVoRDtvQkFDQSxJQUFJMk0sWUFBWSxHQUFHM1csa0JBQWtCLENBQ25DMFcsV0FBVyxDQUFDekcsT0FBTyxFQUNuQixJQUNGLENBQUM7b0JBRUQsSUFBSXhULE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFO3NCQUNwQyxNQUFNbWEsb0JBQW9CLEdBQ3hCdk4sY0FBYyxDQUFDUyxXQUFXLENBQUMsQ0FBQztzQkFDOUIsTUFBTStNLGNBQWMsR0FBRyxNQUFNaFYsdUJBQXVCLENBQUM7d0JBQ25ENlIsYUFBYTt3QkFDYjNMLEtBQUssRUFBRXNCLGNBQWMsQ0FBQ2tCLE9BQU8sQ0FBQ3hDLEtBQUs7d0JBQ25DRyxxQkFBcUIsRUFDbkIwTyxvQkFBb0IsQ0FBQzFPLHFCQUFxQjt3QkFDNUM0TyxXQUFXLEVBQUVkLElBQUksQ0FBQzNILGVBQWUsQ0FBQyxDQUFDRCxNQUFNO3dCQUN6QzJJLFlBQVksRUFBRXpMLGFBQWEsQ0FBQ1YsU0FBUzt3QkFDckNvTSxpQkFBaUIsRUFBRU4sV0FBVyxDQUFDTTtzQkFDakMsQ0FBQyxDQUFDO3NCQUNGLElBQUlILGNBQWMsRUFBRTt3QkFDbEJGLFlBQVksR0FBRyxHQUFHRSxjQUFjLE9BQU9GLFlBQVksRUFBRTtzQkFDdkQ7b0JBQ0Y7O29CQUVBO29CQUNBLE1BQU10QixjQUFjLEdBQUcsTUFBTXJELHVCQUF1QixDQUFDLENBQUM7b0JBRXREL1Qsd0JBQXdCLENBQUM7c0JBQ3ZCc0osTUFBTSxFQUFFNE8sa0JBQWtCO3NCQUMxQjdSLFdBQVc7c0JBQ1g0QixNQUFNLEVBQUUsV0FBVztzQkFDbkJnRSxXQUFXLEVBQUVGLGVBQWU7c0JBQzVCMk0sWUFBWTtzQkFDWk0sS0FBSyxFQUFFO3dCQUNMQyxXQUFXLEVBQUU3WSx3QkFBd0IsQ0FBQ2lZLE9BQU8sQ0FBQzt3QkFDOUNhLFFBQVEsRUFBRVQsV0FBVyxDQUFDTSxpQkFBaUI7d0JBQ3ZDSSxVQUFVLEVBQUVWLFdBQVcsQ0FBQ1c7c0JBQzFCLENBQUM7c0JBQ0R2SSxTQUFTLEVBQUV6RixjQUFjLENBQUN5RixTQUFTO3NCQUNuQyxHQUFHdUc7b0JBQ0wsQ0FBQyxDQUFDO2tCQUNKLENBQUMsQ0FBQyxPQUFPckYsS0FBSyxFQUFFO29CQUNkLElBQUlBLEtBQUssWUFBWXRRLFVBQVUsRUFBRTtzQkFDL0I7c0JBQ0E7c0JBQ0FuQixjQUFjLENBQUM0WCxrQkFBa0IsRUFBRW5NLGVBQWUsQ0FBQztzQkFDbkRyTSxRQUFRLENBQUMsNkJBQTZCLEVBQUU7d0JBQ3RDb0osVUFBVSxFQUNSbUosUUFBUSxDQUFDdEYsU0FBUyxJQUFJbE4sMERBQTBEO3dCQUNsRmtILEtBQUssRUFDSHNMLFFBQVEsQ0FBQzVDLGtCQUFrQixJQUFJNVAsMERBQTBEO3dCQUMzRjRaLFdBQVcsRUFBRTVOLElBQUksQ0FBQ0MsR0FBRyxDQUFDLENBQUMsR0FBR3VHLFFBQVEsQ0FBQ3pHLFNBQVM7d0JBQzVDaUUsUUFBUSxFQUFFLElBQUk7d0JBQ2RGLGlCQUFpQixFQUFFMEMsUUFBUSxDQUFDbk4sY0FBYzt3QkFDMUN3VSxNQUFNLEVBQ0osd0JBQXdCLElBQUk3WjtzQkFDaEMsQ0FBQyxDQUFDO3NCQUNGLE1BQU0yWCxjQUFjLEdBQUcsTUFBTXJELHVCQUF1QixDQUFDLENBQUM7c0JBQ3RELE1BQU13RixhQUFhLEdBQ2pCelYsb0JBQW9CLENBQUMyUixhQUFhLENBQUM7c0JBQ3JDelYsd0JBQXdCLENBQUM7d0JBQ3ZCc0osTUFBTSxFQUFFNE8sa0JBQWtCO3dCQUMxQjdSLFdBQVc7d0JBQ1g0QixNQUFNLEVBQUUsUUFBUTt3QkFDaEJnRSxXQUFXLEVBQUVGLGVBQWU7d0JBQzVCOEUsU0FBUyxFQUFFekYsY0FBYyxDQUFDeUYsU0FBUzt3QkFDbkM2SCxZQUFZLEVBQUVhLGFBQWE7d0JBQzNCLEdBQUduQztzQkFDTCxDQUFDLENBQUM7c0JBQ0Y7b0JBQ0Y7b0JBQ0EsTUFBTW9DLE1BQU0sR0FBRzlYLFlBQVksQ0FBQ3FRLEtBQUssQ0FBQztvQkFDbEM3UixjQUFjLENBQ1pnWSxrQkFBa0IsRUFDbEJzQixNQUFNLEVBQ056TixlQUNGLENBQUM7b0JBQ0QsTUFBTXFMLGNBQWMsR0FBRyxNQUFNckQsdUJBQXVCLENBQUMsQ0FBQztvQkFDdEQvVCx3QkFBd0IsQ0FBQztzQkFDdkJzSixNQUFNLEVBQUU0TyxrQkFBa0I7c0JBQzFCN1IsV0FBVztzQkFDWDRCLE1BQU0sRUFBRSxRQUFRO3NCQUNoQjhKLEtBQUssRUFBRXlILE1BQU07c0JBQ2J2TixXQUFXLEVBQUVGLGVBQWU7c0JBQzVCOEUsU0FBUyxFQUFFekYsY0FBYyxDQUFDeUYsU0FBUztzQkFDbkMsR0FBR3VHO29CQUNMLENBQUMsQ0FBQztrQkFDSixDQUFDLFNBQVM7b0JBQ1JlLDZCQUE2QixHQUFHLENBQUM7b0JBQ2pDalosMEJBQTBCLENBQUNxVyxXQUFXLENBQUM7b0JBQ3ZDNVYsY0FBYyxDQUFDNFYsV0FBVyxDQUFDO29CQUMzQjtvQkFDQTtrQkFDRjtnQkFDRixDQUFDLENBQUM7O2dCQUVGO2dCQUNBLE1BQU1qTixpQkFBaUIsR0FBRzhDLGNBQWMsQ0FBQ2tCLE9BQU8sQ0FBQ3hDLEtBQUssQ0FBQ3lFLElBQUksQ0FDekQrRyxDQUFDLElBQ0MxVyxlQUFlLENBQUMwVyxDQUFDLEVBQUU5UixtQkFBbUIsQ0FBQyxJQUN2QzVFLGVBQWUsQ0FBQzBXLENBQUMsRUFBRWhTLGNBQWMsQ0FDckMsQ0FBQztnQkFDRCxPQUFPO2tCQUNMNEosSUFBSSxFQUFFO29CQUNKZ0YsT0FBTyxFQUFFLElBQUksSUFBSWpGLEtBQUs7b0JBQ3RCaEYsTUFBTSxFQUFFLGdCQUFnQixJQUFJZ0YsS0FBSztvQkFDakM3RSxPQUFPLEVBQUU4UCxrQkFBa0I7b0JBQzNCN1IsV0FBVyxFQUFFQSxXQUFXO29CQUN4QkcsTUFBTSxFQUFFQSxNQUFNO29CQUNkNkIsVUFBVSxFQUFFekYsaUJBQWlCLENBQUNzVixrQkFBa0IsQ0FBQztvQkFDakQ1UDtrQkFDRjtnQkFDRixDQUFDO2NBQ0g7WUFDRjs7WUFFQTtZQUNBLElBQUlzUCxVQUFVLENBQUNuSixJQUFJLEtBQUssU0FBUyxFQUFFO2NBQ2pDO2NBQ0E7WUFDRjtZQUNBLE1BQU07Y0FBRTdCO1lBQU8sQ0FBQyxHQUFHZ0wsVUFBVTtZQUM3QixJQUFJaEwsTUFBTSxDQUFDNk0sSUFBSSxFQUFFO1lBQ2pCLE1BQU14RCxPQUFPLEdBQUdySixNQUFNLENBQUM4TSxLQUFLO1lBRTVCakUsYUFBYSxDQUFDaEwsSUFBSSxDQUFDd0wsT0FBTyxDQUFDOztZQUUzQjtZQUNBclYseUJBQXlCLENBQ3ZCK1UsV0FBVyxFQUNYTSxPQUFPLEVBQ1BMLG1CQUFtQixFQUNuQnhLLGNBQWMsQ0FBQ2tCLE9BQU8sQ0FBQ3hDLEtBQ3pCLENBQUM7WUFDRCxJQUFJb00sZ0JBQWdCLEVBQUU7Y0FDcEIsTUFBTXNDLFlBQVksR0FBR3hVLGtCQUFrQixDQUFDaVMsT0FBTyxDQUFDO2NBQ2hELElBQUl1QyxZQUFZLEVBQUU7Z0JBQ2hCM1UsZ0JBQWdCLENBQ2Q4UixXQUFXLEVBQ1hPLGdCQUFnQixFQUNoQjlLLGNBQWMsQ0FBQ3lGLFNBQVMsRUFDeEJ4SyxXQUFXLEVBQ1hxUCxjQUFjLEVBQ2Q4QyxZQUNGLENBQUM7Z0JBQ0Q7Z0JBQ0E7Z0JBQ0E7Z0JBQ0EsSUFBSXJaLG1DQUFtQyxDQUFDLENBQUMsRUFBRTtrQkFDekN3Qix3QkFBd0IsQ0FDdEJ1VixnQkFBZ0IsRUFDaEIvVixpQkFBaUIsQ0FBQ3dWLFdBQVcsQ0FBQyxFQUM5QjVKLGVBQ0YsQ0FBQztnQkFDSDtjQUNGO1lBQ0Y7O1lBRUE7WUFDQTtZQUNBLElBQ0VrSyxPQUFPLENBQUN4SCxJQUFJLEtBQUssVUFBVSxLQUMxQndILE9BQU8sQ0FBQy9JLElBQUksQ0FBQ3VCLElBQUksS0FBSyxlQUFlLElBQ3BDd0gsT0FBTyxDQUFDL0ksSUFBSSxDQUFDdUIsSUFBSSxLQUFLLHFCQUFxQixDQUFDLElBQzlDbEQsVUFBVSxFQUNWO2NBQ0FBLFVBQVUsQ0FBQztnQkFDVHlLLFNBQVMsRUFBRUMsT0FBTyxDQUFDRCxTQUFTO2dCQUM1QjlJLElBQUksRUFBRStJLE9BQU8sQ0FBQy9JO2NBQ2hCLENBQUMsQ0FBQztZQUNKO1lBRUEsSUFBSStJLE9BQU8sQ0FBQ3hILElBQUksS0FBSyxXQUFXLElBQUl3SCxPQUFPLENBQUN4SCxJQUFJLEtBQUssTUFBTSxFQUFFO2NBQzNEO1lBQ0Y7O1lBRUE7WUFDQTtZQUNBO1lBQ0EsSUFBSXdILE9BQU8sQ0FBQ3hILElBQUksS0FBSyxXQUFXLEVBQUU7Y0FDaEMsTUFBTWtMLGFBQWEsR0FBRzFXLGdDQUFnQyxDQUFDZ1QsT0FBTyxDQUFDO2NBQy9ELElBQUkwRCxhQUFhLEdBQUcsQ0FBQyxFQUFFO2dCQUNyQnZPLGNBQWMsQ0FBQ3dPLGlCQUFpQixDQUFDQyxHQUFHLElBQUlBLEdBQUcsR0FBR0YsYUFBYSxDQUFDO2NBQzlEO1lBQ0Y7WUFFQSxNQUFNRyxhQUFhLEdBQUc3WCxpQkFBaUIsQ0FBQyxDQUFDZ1UsT0FBTyxDQUFDLENBQUM7WUFDbEQsS0FBSyxNQUFNRixDQUFDLElBQUkrRCxhQUFhLEVBQUU7Y0FDN0IsS0FBSyxNQUFNOUgsT0FBTyxJQUFJK0QsQ0FBQyxDQUFDRSxPQUFPLENBQUNqRSxPQUFPLEVBQUU7Z0JBQ3ZDLElBQ0VBLE9BQU8sQ0FBQ3ZELElBQUksS0FBSyxVQUFVLElBQzNCdUQsT0FBTyxDQUFDdkQsSUFBSSxLQUFLLGFBQWEsRUFDOUI7a0JBQ0E7Z0JBQ0Y7O2dCQUVBO2dCQUNBLElBQUlsRCxVQUFVLEVBQUU7a0JBQ2RBLFVBQVUsQ0FBQztvQkFDVHlLLFNBQVMsRUFBRSxTQUFTMUssZ0JBQWdCLENBQUMySyxPQUFPLENBQUN4RixFQUFFLEVBQUU7b0JBQ2pEdkQsSUFBSSxFQUFFO3NCQUNKK0ksT0FBTyxFQUFFRixDQUFDO3NCQUNWdEgsSUFBSSxFQUFFLGdCQUFnQjtzQkFDdEI7c0JBQ0E7c0JBQ0FqSSxNQUFNLEVBQUUsRUFBRTtzQkFDVjRCLE9BQU8sRUFBRW1OO29CQUNYO2tCQUNGLENBQUMsQ0FBQztnQkFDSjtjQUNGO1lBQ0Y7VUFDRjtRQUNGLENBQUMsQ0FBQyxPQUFPeEQsS0FBSyxFQUFFO1VBQ2Q7VUFDQTtVQUNBLElBQUlBLEtBQUssWUFBWXRRLFVBQVUsRUFBRTtZQUMvQjBWLFVBQVUsR0FBRyxJQUFJO1lBQ2pCelgsUUFBUSxDQUFDLDZCQUE2QixFQUFFO2NBQ3RDb0osVUFBVSxFQUNSbUosUUFBUSxDQUFDdEYsU0FBUyxJQUFJbE4sMERBQTBEO2NBQ2xGa0gsS0FBSyxFQUNIc0wsUUFBUSxDQUFDNUMsa0JBQWtCLElBQUk1UCwwREFBMEQ7Y0FDM0Y0WixXQUFXLEVBQUU1TixJQUFJLENBQUNDLEdBQUcsQ0FBQyxDQUFDLEdBQUd1RyxRQUFRLENBQUN6RyxTQUFTO2NBQzVDaUUsUUFBUSxFQUFFLEtBQUs7Y0FDZkYsaUJBQWlCLEVBQUUwQyxRQUFRLENBQUNuTixjQUFjO2NBQzFDd1UsTUFBTSxFQUNKLGtCQUFrQixJQUFJN1o7WUFDMUIsQ0FBQyxDQUFDO1lBQ0YsTUFBTXNTLEtBQUs7VUFDYjs7VUFFQTtVQUNBeFEsZUFBZSxDQUFDLHFCQUFxQkcsWUFBWSxDQUFDcVEsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUMxRGdJLEtBQUssRUFBRTtVQUNULENBQUMsQ0FBQzs7VUFFRjtVQUNBN0MsY0FBYyxHQUFHdlYsT0FBTyxDQUFDb1EsS0FBSyxDQUFDO1FBQ2pDLENBQUMsU0FBUztVQUNSO1VBQ0EsSUFBSTNHLGNBQWMsQ0FBQ2tNLFVBQVUsRUFBRTtZQUM3QmxNLGNBQWMsQ0FBQ2tNLFVBQVUsQ0FBQyxJQUFJLENBQUM7VUFDakM7O1VBRUE7VUFDQTtVQUNBO1VBQ0FYLDJCQUEyQixHQUFHLENBQUM7O1VBRS9CO1VBQ0EsSUFBSVQsZ0JBQWdCLEVBQUU7WUFDcEJ6Vix5QkFBeUIsQ0FBQ3lWLGdCQUFnQixFQUFFbkssZUFBZSxDQUFDO1lBQzVEO1lBQ0E7WUFDQTtZQUNBLElBQUksQ0FBQzJLLGVBQWUsRUFBRTtjQUNwQixNQUFNc0QsUUFBUSxHQUFHN1osaUJBQWlCLENBQUN3VixXQUFXLENBQUM7Y0FDL0NwVCxlQUFlLENBQUM7Z0JBQ2RrTSxJQUFJLEVBQUUsUUFBUTtnQkFDZHdMLE9BQU8sRUFBRSxtQkFBbUI7Z0JBQzVCQyxPQUFPLEVBQUVoRSxnQkFBZ0I7Z0JBQ3pCaUUsV0FBVyxFQUFFL08sY0FBYyxDQUFDeUYsU0FBUztnQkFDckM1SSxNQUFNLEVBQUVpUCxjQUFjLEdBQ2xCLFFBQVEsR0FDUkMsVUFBVSxHQUNSLFNBQVMsR0FDVCxXQUFXO2dCQUNqQmlELFdBQVcsRUFBRSxFQUFFO2dCQUNmQyxPQUFPLEVBQUVoVSxXQUFXO2dCQUNwQjJTLEtBQUssRUFBRTtrQkFDTHNCLFlBQVksRUFBRU4sUUFBUSxDQUFDTyxVQUFVO2tCQUNqQ0MsU0FBUyxFQUFFUixRQUFRLENBQUNTLFlBQVk7a0JBQ2hDcEIsV0FBVyxFQUFFNU4sSUFBSSxDQUFDQyxHQUFHLENBQUMsQ0FBQyxHQUFHZ0s7Z0JBQzVCO2NBQ0YsQ0FBQyxDQUFDO1lBQ0o7VUFDRjs7VUFFQTtVQUNBeFcsMEJBQTBCLENBQUNxVyxXQUFXLENBQUM7O1VBRXZDO1VBQ0E7VUFDQSxJQUFJLENBQUNtQixlQUFlLEVBQUU7WUFDcEIvVyxjQUFjLENBQUM0VixXQUFXLENBQUM7VUFDN0I7O1VBRUE7VUFDQWEsb0JBQW9CLEdBQUcsQ0FBQzs7VUFFeEI7VUFDQTtVQUNBLElBQUksQ0FBQ00sZUFBZSxFQUFFO1lBQ3BCVSxjQUFjLEdBQUcsTUFBTXJELHVCQUF1QixDQUFDLENBQUM7VUFDbEQ7UUFDRjs7UUFFQTtRQUNBO1FBQ0EsTUFBTTJHLFdBQVcsR0FBR2pGLGFBQWEsQ0FBQ2tGLFFBQVEsQ0FDeENDLENBQUMsSUFBSUEsQ0FBQyxDQUFDbk0sSUFBSSxLQUFLLFFBQVEsSUFBSW1NLENBQUMsQ0FBQ25NLElBQUksS0FBSyxVQUN6QyxDQUFDO1FBQ0QsSUFBSWlNLFdBQVcsSUFBSTFZLGtCQUFrQixDQUFDMFksV0FBVyxDQUFDLEVBQUU7VUFDbERoYixRQUFRLENBQUMsNkJBQTZCLEVBQUU7WUFDdENvSixVQUFVLEVBQ1JtSixRQUFRLENBQUN0RixTQUFTLElBQUlsTiwwREFBMEQ7WUFDbEZrSCxLQUFLLEVBQ0hzTCxRQUFRLENBQUM1QyxrQkFBa0IsSUFBSTVQLDBEQUEwRDtZQUMzRjRaLFdBQVcsRUFBRTVOLElBQUksQ0FBQ0MsR0FBRyxDQUFDLENBQUMsR0FBR3VHLFFBQVEsQ0FBQ3pHLFNBQVM7WUFDNUNpRSxRQUFRLEVBQUUsS0FBSztZQUNmRixpQkFBaUIsRUFBRTBDLFFBQVEsQ0FBQ25OLGNBQWM7WUFDMUN3VSxNQUFNLEVBQ0osa0JBQWtCLElBQUk3WjtVQUMxQixDQUFDLENBQUM7VUFDRixNQUFNLElBQUlnQyxVQUFVLENBQUMsQ0FBQztRQUN4Qjs7UUFFQTtRQUNBO1FBQ0E7UUFDQSxJQUFJeVYsY0FBYyxFQUFFO1VBQ2xCO1VBQ0EsTUFBTTJELG9CQUFvQixHQUFHcEYsYUFBYSxDQUFDbEgsSUFBSSxDQUM3QytCLEdBQUcsSUFBSUEsR0FBRyxDQUFDN0IsSUFBSSxLQUFLLFdBQ3RCLENBQUM7VUFFRCxJQUFJLENBQUNvTSxvQkFBb0IsRUFBRTtZQUN6QjtZQUNBLE1BQU0zRCxjQUFjO1VBQ3RCOztVQUVBO1VBQ0E7VUFDQTNWLGVBQWUsQ0FDYix5Q0FBeUNrVSxhQUFhLENBQUN0SCxNQUFNLFdBQy9ELENBQUM7UUFDSDtRQUVBLE1BQU1zSyxXQUFXLEdBQUcxVSxpQkFBaUIsQ0FDbkMwUixhQUFhLEVBQ2JGLFdBQVcsRUFDWHRELFFBQ0YsQ0FBQztRQUVELElBQUl6VCxPQUFPLENBQUMsdUJBQXVCLENBQUMsRUFBRTtVQUNwQyxNQUFNb1EsZUFBZSxHQUFHeEQsY0FBYyxDQUFDUyxXQUFXLENBQUMsQ0FBQztVQUNwRCxNQUFNK00sY0FBYyxHQUFHLE1BQU1oVix1QkFBdUIsQ0FBQztZQUNuRDZSLGFBQWE7WUFDYjNMLEtBQUssRUFBRXNCLGNBQWMsQ0FBQ2tCLE9BQU8sQ0FBQ3hDLEtBQUs7WUFDbkNHLHFCQUFxQixFQUFFMkUsZUFBZSxDQUFDM0UscUJBQXFCO1lBQzVENE8sV0FBVyxFQUFFek4sY0FBYyxDQUFDZ0YsZUFBZSxDQUFDRCxNQUFNO1lBQ2xEMkksWUFBWSxFQUFFekwsYUFBYSxDQUFDVixTQUFTO1lBQ3JDb00saUJBQWlCLEVBQUVOLFdBQVcsQ0FBQ007VUFDakMsQ0FBQyxDQUFDO1VBQ0YsSUFBSUgsY0FBYyxFQUFFO1lBQ2xCSCxXQUFXLENBQUN6RyxPQUFPLEdBQUcsQ0FDcEI7Y0FBRXZELElBQUksRUFBRSxNQUFNLElBQUl4QixLQUFLO2NBQUU2TixJQUFJLEVBQUVsQztZQUFlLENBQUMsRUFDL0MsR0FBR0gsV0FBVyxDQUFDekcsT0FBTyxDQUN2QjtVQUNIO1FBQ0Y7UUFFQSxPQUFPO1VBQ0w5RSxJQUFJLEVBQUU7WUFDSmpGLE1BQU0sRUFBRSxXQUFXLElBQUlnRixLQUFLO1lBQzVCekcsTUFBTTtZQUNOLEdBQUdpUyxXQUFXO1lBQ2QsR0FBR3JCO1VBQ0w7UUFDRixDQUFDO01BQ0gsQ0FBQyxDQUNILENBQUM7SUFDSDtFQUNGLENBQUM7RUFDRDJELFVBQVVBLENBQUEsRUFBRztJQUNYLE9BQU8sSUFBSSxFQUFDO0VBQ2QsQ0FBQztFQUNEQyxxQkFBcUJBLENBQUN0UyxLQUFLLEVBQUU7SUFDM0IsTUFBTXVTLENBQUMsR0FBR3ZTLEtBQUssSUFBSWIsY0FBYztJQUNqQyxNQUFNcVQsSUFBSSxHQUFHLENBQ1hELENBQUMsQ0FBQ3hVLGFBQWEsRUFDZndVLENBQUMsQ0FBQzlULElBQUksR0FBRyxRQUFROFQsQ0FBQyxDQUFDOVQsSUFBSSxFQUFFLEdBQUd3RSxTQUFTLENBQ3RDLENBQUM4QixNQUFNLENBQUMsQ0FBQzZILENBQUMsQ0FBQyxFQUFFQSxDQUFDLElBQUksTUFBTSxJQUFJQSxDQUFDLEtBQUszSixTQUFTLENBQUM7SUFDN0MsTUFBTXdQLE1BQU0sR0FBR0QsSUFBSSxDQUFDL00sTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJK00sSUFBSSxDQUFDbE4sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSTtJQUNoRSxPQUFPLEdBQUdtTixNQUFNLEdBQUdGLENBQUMsQ0FBQ3pVLE1BQU0sRUFBRTtFQUMvQixDQUFDO0VBQ0Q0VSxpQkFBaUJBLENBQUEsRUFBRztJQUNsQixPQUFPLElBQUk7RUFDYixDQUFDO0VBQ0Q1VixjQUFjO0VBQ2RDLDZCQUE2QjtFQUM3QjRWLHNCQUFzQkEsQ0FBQzNTLEtBQUssRUFBRTtJQUM1QixPQUFPQSxLQUFLLEVBQUVyQyxXQUFXLElBQUksY0FBYztFQUM3QyxDQUFDO0VBQ0QsTUFBTWlWLGdCQUFnQkEsQ0FBQzVTLEtBQUssRUFBRWtJLE9BQU8sQ0FBQyxFQUFFb0QsT0FBTyxDQUFDNVIsZ0JBQWdCLENBQUMsQ0FBQztJQUNoRSxNQUFNd0osUUFBUSxHQUFHZ0YsT0FBTyxDQUFDL0UsV0FBVyxDQUFDLENBQUM7O0lBRXRDO0lBQ0E7SUFDQTtJQUNBLElBQ0UsVUFBVSxLQUFLLEtBQUssSUFDcEJELFFBQVEsQ0FBQzNCLHFCQUFxQixDQUFDOUMsSUFBSSxLQUFLLE1BQU0sRUFDOUM7TUFDQSxPQUFPO1FBQ0xvVSxRQUFRLEVBQUUsYUFBYTtRQUN2QnRGLE9BQU8sRUFBRTtNQUNYLENBQUM7SUFDSDtJQUVBLE9BQU87TUFBRXNGLFFBQVEsRUFBRSxPQUFPO01BQUVDLFlBQVksRUFBRTlTO0lBQU0sQ0FBQztFQUNuRCxDQUFDO0VBQ0QrUyxtQ0FBbUNBLENBQUN2TyxJQUFJLEVBQUU4SSxTQUFTLEVBQUU7SUFDbkQ7SUFDQSxNQUFNMEYsWUFBWSxHQUFHeE8sSUFBSSxJQUFJMUQsY0FBYztJQUMzQyxJQUNFLE9BQU9rUyxZQUFZLEtBQUssUUFBUSxJQUNoQ0EsWUFBWSxLQUFLLElBQUksSUFDckIsUUFBUSxJQUFJQSxZQUFZLElBQ3hCQSxZQUFZLENBQUN6VCxNQUFNLEtBQUssa0JBQWtCLEVBQzFDO01BQ0EsTUFBTTBULFNBQVMsR0FBR0QsWUFBWSxJQUFJL1MscUJBQXFCO01BQ3ZELE9BQU87UUFDTHdSLFdBQVcsRUFBRW5FLFNBQVM7UUFDdEJ2SCxJQUFJLEVBQUUsYUFBYTtRQUNuQnVELE9BQU8sRUFBRSxDQUNQO1VBQ0V2RCxJQUFJLEVBQUUsTUFBTTtVQUNacU0sSUFBSSxFQUFFO0FBQ2xCLFlBQVlhLFNBQVMsQ0FBQy9TLFdBQVc7QUFDakMsUUFBUStTLFNBQVMsQ0FBQzFVLElBQUk7QUFDdEIsYUFBYTBVLFNBQVMsQ0FBQ3pVLFNBQVM7QUFDaEM7UUFDVSxDQUFDO01BRUwsQ0FBQztJQUNIO0lBQ0EsSUFBSSxRQUFRLElBQUl3VSxZQUFZLElBQUlBLFlBQVksQ0FBQ3pULE1BQU0sS0FBSyxpQkFBaUIsRUFBRTtNQUN6RSxNQUFNNlAsQ0FBQyxHQUFHNEQsWUFBWTtNQUN0QixPQUFPO1FBQ0x2QixXQUFXLEVBQUVuRSxTQUFTO1FBQ3RCdkgsSUFBSSxFQUFFLGFBQWE7UUFDbkJ1RCxPQUFPLEVBQUUsQ0FDUDtVQUNFdkQsSUFBSSxFQUFFLE1BQU07VUFDWnFNLElBQUksRUFBRSwwQ0FBMENoRCxDQUFDLENBQUN4TyxNQUFNLGtCQUFrQndPLENBQUMsQ0FBQ3ZPLFVBQVUsa0JBQWtCdU8sQ0FBQyxDQUFDelAsVUFBVTtRQUN0SCxDQUFDO01BRUwsQ0FBQztJQUNIO0lBQ0EsSUFBSTZFLElBQUksQ0FBQ2pGLE1BQU0sS0FBSyxnQkFBZ0IsRUFBRTtNQUNwQyxNQUFNa1QsTUFBTSxHQUFHLGdEQUFnRGpPLElBQUksQ0FBQzlFLE9BQU8scUVBQXFFOEUsSUFBSSxDQUFDOUUsT0FBTywySEFBMkg7TUFDdlIsTUFBTXdULFlBQVksR0FBRzFPLElBQUksQ0FBQzVFLGlCQUFpQixHQUN2QyxnTkFBZ040RSxJQUFJLENBQUM3RSxVQUFVLGlFQUFpRTdFLG1CQUFtQixPQUFPRixjQUFjLDJCQUEyQixHQUNuVyxvSkFBb0o7TUFDeEosTUFBTXdYLElBQUksR0FBRyxHQUFHSyxNQUFNLEtBQUtTLFlBQVksRUFBRTtNQUN6QyxPQUFPO1FBQ0x6QixXQUFXLEVBQUVuRSxTQUFTO1FBQ3RCdkgsSUFBSSxFQUFFLGFBQWE7UUFDbkJ1RCxPQUFPLEVBQUUsQ0FDUDtVQUNFdkQsSUFBSSxFQUFFLE1BQU07VUFDWnFNO1FBQ0YsQ0FBQztNQUVMLENBQUM7SUFDSDtJQUNBLElBQUk1TixJQUFJLENBQUNqRixNQUFNLEtBQUssV0FBVyxFQUFFO01BQy9CLE1BQU00VCxZQUFZLEdBQUczTyxJQUFJLElBQUk0TyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQztNQUNwRCxNQUFNQyxnQkFBZ0IsR0FBR0YsWUFBWSxDQUFDakosWUFBWSxHQUM5QyxtQkFBbUJpSixZQUFZLENBQUNqSixZQUFZLHFCQUFxQmlKLFlBQVksQ0FBQ2hKLGNBQWMsRUFBRSxHQUM5RixFQUFFO01BQ047TUFDQTtNQUNBO01BQ0E7TUFDQSxNQUFNbUosZUFBZSxHQUNuQjlPLElBQUksQ0FBQzhFLE9BQU8sQ0FBQzdELE1BQU0sR0FBRyxDQUFDLEdBQ25CakIsSUFBSSxDQUFDOEUsT0FBTyxHQUNaLENBQ0U7UUFDRXZELElBQUksRUFBRSxNQUFNLElBQUl4QixLQUFLO1FBQ3JCNk4sSUFBSSxFQUFFO01BQ1IsQ0FBQyxDQUNGO01BQ1A7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBLElBQ0U1TixJQUFJLENBQUNQLFNBQVMsSUFDZHRJLDRCQUE0QixDQUFDNFgsR0FBRyxDQUFDL08sSUFBSSxDQUFDUCxTQUFTLENBQUMsSUFDaEQsQ0FBQ29QLGdCQUFnQixFQUNqQjtRQUNBLE9BQU87VUFDTDVCLFdBQVcsRUFBRW5FLFNBQVM7VUFDdEJ2SCxJQUFJLEVBQUUsYUFBYTtVQUNuQnVELE9BQU8sRUFBRWdLO1FBQ1gsQ0FBQztNQUNIO01BQ0EsT0FBTztRQUNMN0IsV0FBVyxFQUFFbkUsU0FBUztRQUN0QnZILElBQUksRUFBRSxhQUFhO1FBQ25CdUQsT0FBTyxFQUFFLENBQ1AsR0FBR2dLLGVBQWUsRUFDbEI7VUFDRXZOLElBQUksRUFBRSxNQUFNO1VBQ1pxTSxJQUFJLEVBQUUsWUFBWTVOLElBQUksQ0FBQzlFLE9BQU8sK0JBQStCOEUsSUFBSSxDQUFDOUUsT0FBTyw0QkFBNEIyVCxnQkFBZ0I7QUFDakksdUJBQXVCN08sSUFBSSxDQUFDK0wsV0FBVztBQUN2QyxhQUFhL0wsSUFBSSxDQUFDNkwsaUJBQWlCO0FBQ25DLGVBQWU3TCxJQUFJLENBQUNrTSxlQUFlO1FBQ3pCLENBQUM7TUFFTCxDQUFDO0lBQ0g7SUFDQWxNLElBQUksV0FBVyxLQUFLO0lBQ3BCLE1BQU0sSUFBSWhCLEtBQUssQ0FDYix3Q0FBd0MsQ0FBQ2dCLElBQUksSUFBSTtNQUFFakYsTUFBTSxFQUFFLE1BQU07SUFBQyxDQUFDLEVBQUVBLE1BQU0sRUFDN0UsQ0FBQztFQUNILENBQUM7RUFDRC9DLHVCQUF1QjtFQUN2QkUsb0JBQW9CO0VBQ3BCRyxnQkFBZ0I7RUFDaEJGLDRCQUE0QjtFQUM1QkMsNEJBQTRCO0VBQzVCSCx5QkFBeUI7RUFDekIrVyxvQkFBb0IsRUFBRWpYO0FBQ3hCLENBQUMsV0FBV3RHLE9BQU8sQ0FBQ2dKLFdBQVcsRUFBRWMsTUFBTSxFQUFFa0IsUUFBUSxDQUFDLENBQUM7QUFFbkQsU0FBU3lDLGVBQWVBLENBQ3RCMUQsS0FBSyxFQUFFO0VBQUV4QixTQUFTLENBQUMsRUFBRSxNQUFNO0FBQUMsQ0FBQyxFQUM3QjBFLFFBQVEsRUFBRTtFQUFFdVEsV0FBVyxDQUFDLEVBQUU7SUFBRWhRLFFBQVEsRUFBRSxNQUFNO0VBQUMsQ0FBQztBQUFDLENBQUMsQ0FDakQsRUFBRSxNQUFNLEdBQUcsU0FBUyxDQUFDO0VBQ3BCLElBQUksQ0FBQy9LLG9CQUFvQixDQUFDLENBQUMsRUFBRSxPQUFPdUssU0FBUztFQUM3QyxPQUFPakQsS0FBSyxDQUFDeEIsU0FBUyxJQUFJMEUsUUFBUSxDQUFDdVEsV0FBVyxFQUFFaFEsUUFBUTtBQUMxRCIsImlnbm9yZUxpc3QiOltdfQ==