@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.
- package/README.md +200 -0
- package/bin/xela +100 -0
- package/package.json +88 -0
- package/src/QueryEngine.ts +1295 -0
- package/src/Task.ts +125 -0
- package/src/Tool.ts +792 -0
- package/src/_shims/_generated_stubs/_universal_stub.mjs +168 -0
- package/src/_shims/_generated_stubs/text_stub.mjs +1 -0
- package/src/_shims/bun_bundle.js +9 -0
- package/src/_shims/cjs_stub.cjs +23 -0
- package/src/_shims/empty_stub.js +33 -0
- package/src/_shims/loader.js +352 -0
- package/src/_shims/openai_adapter.ts +486 -0
- package/src/_shims/react_compiler_runtime.js +17 -0
- package/src/_shims/register.js +148 -0
- package/src/assistant/sessionHistory.ts +87 -0
- package/src/bootstrap/state.ts +1759 -0
- package/src/bridge/bridgeApi.ts +539 -0
- package/src/bridge/bridgeConfig.ts +48 -0
- package/src/bridge/bridgeDebug.ts +135 -0
- package/src/bridge/bridgeEnabled.ts +202 -0
- package/src/bridge/bridgeMain.ts +2999 -0
- package/src/bridge/bridgeMessaging.ts +461 -0
- package/src/bridge/bridgePermissionCallbacks.ts +43 -0
- package/src/bridge/bridgePointer.ts +210 -0
- package/src/bridge/bridgeStatusUtil.ts +163 -0
- package/src/bridge/bridgeUI.ts +530 -0
- package/src/bridge/capacityWake.ts +56 -0
- package/src/bridge/codeSessionApi.ts +168 -0
- package/src/bridge/createSession.ts +384 -0
- package/src/bridge/debugUtils.ts +141 -0
- package/src/bridge/envLessBridgeConfig.ts +165 -0
- package/src/bridge/flushGate.ts +71 -0
- package/src/bridge/inboundAttachments.ts +175 -0
- package/src/bridge/inboundMessages.ts +80 -0
- package/src/bridge/initReplBridge.ts +569 -0
- package/src/bridge/jwtUtils.ts +256 -0
- package/src/bridge/pollConfig.ts +110 -0
- package/src/bridge/pollConfigDefaults.ts +82 -0
- package/src/bridge/remoteBridgeCore.ts +1008 -0
- package/src/bridge/replBridge.ts +2406 -0
- package/src/bridge/replBridgeHandle.ts +36 -0
- package/src/bridge/replBridgeTransport.ts +370 -0
- package/src/bridge/sessionIdCompat.ts +57 -0
- package/src/bridge/sessionRunner.ts +550 -0
- package/src/bridge/trustedDevice.ts +210 -0
- package/src/bridge/types.ts +262 -0
- package/src/bridge/workSecret.ts +127 -0
- package/src/buddy/CompanionSprite.tsx +371 -0
- package/src/buddy/companion.ts +133 -0
- package/src/buddy/prompt.ts +36 -0
- package/src/buddy/sprites.ts +514 -0
- package/src/buddy/types.ts +148 -0
- package/src/buddy/useBuddyNotification.tsx +98 -0
- package/src/cli/exit.ts +31 -0
- package/src/cli/handlers/agents.ts +70 -0
- package/src/cli/handlers/auth.ts +330 -0
- package/src/cli/handlers/autoMode.ts +170 -0
- package/src/cli/handlers/mcp.tsx +362 -0
- package/src/cli/handlers/plugins.ts +878 -0
- package/src/cli/handlers/util.tsx +110 -0
- package/src/cli/ndjsonSafeStringify.ts +32 -0
- package/src/cli/print.ts +5594 -0
- package/src/cli/remoteIO.ts +255 -0
- package/src/cli/structuredIO.ts +859 -0
- package/src/cli/transports/HybridTransport.ts +282 -0
- package/src/cli/transports/SSETransport.ts +711 -0
- package/src/cli/transports/SerialBatchEventUploader.ts +275 -0
- package/src/cli/transports/WebSocketTransport.ts +800 -0
- package/src/cli/transports/WorkerStateUploader.ts +131 -0
- package/src/cli/transports/ccrClient.ts +998 -0
- package/src/cli/transports/transportUtils.ts +45 -0
- package/src/cli/update.ts +422 -0
- package/src/commands/add-dir/add-dir.tsx +126 -0
- package/src/commands/add-dir/index.ts +11 -0
- package/src/commands/add-dir/validation.ts +110 -0
- package/src/commands/advisor.ts +109 -0
- package/src/commands/agents/agents.tsx +12 -0
- package/src/commands/agents/index.ts +10 -0
- package/src/commands/ant-trace/index.js +1 -0
- package/src/commands/autofix-pr/index.js +1 -0
- package/src/commands/backfill-sessions/index.js +1 -0
- package/src/commands/branch/branch.ts +296 -0
- package/src/commands/branch/index.ts +14 -0
- package/src/commands/break-cache/index.js +1 -0
- package/src/commands/bridge/bridge.tsx +509 -0
- package/src/commands/bridge/index.ts +26 -0
- package/src/commands/bridge-kick.ts +200 -0
- package/src/commands/brief.ts +130 -0
- package/src/commands/btw/btw.tsx +243 -0
- package/src/commands/btw/index.ts +13 -0
- package/src/commands/bughunter/index.js +1 -0
- package/src/commands/chrome/chrome.tsx +285 -0
- package/src/commands/chrome/index.ts +13 -0
- package/src/commands/clear/caches.ts +144 -0
- package/src/commands/clear/clear.ts +7 -0
- package/src/commands/clear/conversation.ts +251 -0
- package/src/commands/clear/index.ts +19 -0
- package/src/commands/color/color.ts +93 -0
- package/src/commands/color/index.ts +16 -0
- package/src/commands/commit-push-pr.ts +158 -0
- package/src/commands/commit.ts +92 -0
- package/src/commands/compact/compact.ts +287 -0
- package/src/commands/compact/index.ts +15 -0
- package/src/commands/config/config.tsx +7 -0
- package/src/commands/config/index.ts +11 -0
- package/src/commands/context/context-noninteractive.ts +325 -0
- package/src/commands/context/context.tsx +64 -0
- package/src/commands/context/index.ts +24 -0
- package/src/commands/copy/copy.tsx +371 -0
- package/src/commands/copy/index.ts +15 -0
- package/src/commands/cost/cost.ts +24 -0
- package/src/commands/cost/index.ts +23 -0
- package/src/commands/createMovedToPluginCommand.ts +65 -0
- package/src/commands/ctx_viz/index.js +1 -0
- package/src/commands/debug-tool-call/index.js +1 -0
- package/src/commands/desktop/desktop.tsx +9 -0
- package/src/commands/desktop/index.ts +26 -0
- package/src/commands/diff/diff.tsx +9 -0
- package/src/commands/diff/index.ts +8 -0
- package/src/commands/doctor/doctor.tsx +7 -0
- package/src/commands/doctor/index.ts +12 -0
- package/src/commands/effort/effort.tsx +183 -0
- package/src/commands/effort/index.ts +13 -0
- package/src/commands/env/index.js +1 -0
- package/src/commands/exit/exit.tsx +33 -0
- package/src/commands/exit/index.ts +12 -0
- package/src/commands/export/export.tsx +91 -0
- package/src/commands/export/index.ts +11 -0
- package/src/commands/extra-usage/extra-usage-core.ts +118 -0
- package/src/commands/extra-usage/extra-usage-noninteractive.ts +16 -0
- package/src/commands/extra-usage/extra-usage.tsx +17 -0
- package/src/commands/extra-usage/index.ts +31 -0
- package/src/commands/fast/fast.tsx +269 -0
- package/src/commands/fast/index.ts +26 -0
- package/src/commands/feedback/feedback.tsx +25 -0
- package/src/commands/feedback/index.ts +26 -0
- package/src/commands/files/files.ts +19 -0
- package/src/commands/files/index.ts +12 -0
- package/src/commands/good-claude/index.js +1 -0
- package/src/commands/heapdump/heapdump.ts +17 -0
- package/src/commands/heapdump/index.ts +12 -0
- package/src/commands/help/help.tsx +11 -0
- package/src/commands/help/index.ts +10 -0
- package/src/commands/hooks/hooks.tsx +13 -0
- package/src/commands/hooks/index.ts +11 -0
- package/src/commands/ide/ide.tsx +646 -0
- package/src/commands/ide/index.ts +11 -0
- package/src/commands/init-verifiers.ts +262 -0
- package/src/commands/init.ts +256 -0
- package/src/commands/insights.ts +3200 -0
- package/src/commands/install-github-app/ApiKeyStep.tsx +231 -0
- package/src/commands/install-github-app/CheckExistingSecretStep.tsx +190 -0
- package/src/commands/install-github-app/CheckGitHubStep.tsx +15 -0
- package/src/commands/install-github-app/ChooseRepoStep.tsx +211 -0
- package/src/commands/install-github-app/CreatingStep.tsx +65 -0
- package/src/commands/install-github-app/ErrorStep.tsx +85 -0
- package/src/commands/install-github-app/ExistingWorkflowStep.tsx +103 -0
- package/src/commands/install-github-app/InstallAppStep.tsx +94 -0
- package/src/commands/install-github-app/OAuthFlowStep.tsx +276 -0
- package/src/commands/install-github-app/SuccessStep.tsx +96 -0
- package/src/commands/install-github-app/WarningsStep.tsx +73 -0
- package/src/commands/install-github-app/index.ts +13 -0
- package/src/commands/install-github-app/install-github-app.tsx +587 -0
- package/src/commands/install-github-app/setupGitHubActions.ts +325 -0
- package/src/commands/install-slack-app/index.ts +12 -0
- package/src/commands/install-slack-app/install-slack-app.ts +30 -0
- package/src/commands/install.tsx +300 -0
- package/src/commands/issue/index.js +1 -0
- package/src/commands/keybindings/index.ts +13 -0
- package/src/commands/keybindings/keybindings.ts +53 -0
- package/src/commands/login/index.ts +14 -0
- package/src/commands/login/login.tsx +104 -0
- package/src/commands/logout/index.ts +10 -0
- package/src/commands/logout/logout.tsx +82 -0
- package/src/commands/mcp/addCommand.ts +280 -0
- package/src/commands/mcp/index.ts +12 -0
- package/src/commands/mcp/mcp.tsx +85 -0
- package/src/commands/mcp/xaaIdpCommand.ts +266 -0
- package/src/commands/memory/index.ts +10 -0
- package/src/commands/memory/memory.tsx +90 -0
- package/src/commands/mobile/index.ts +11 -0
- package/src/commands/mobile/mobile.tsx +274 -0
- package/src/commands/mock-limits/index.js +1 -0
- package/src/commands/model/index.ts +16 -0
- package/src/commands/model/model.tsx +297 -0
- package/src/commands/oauth-refresh/index.js +1 -0
- package/src/commands/onboarding/index.js +1 -0
- package/src/commands/output-style/index.ts +11 -0
- package/src/commands/output-style/output-style.tsx +7 -0
- package/src/commands/passes/index.ts +22 -0
- package/src/commands/passes/passes.tsx +24 -0
- package/src/commands/perf-issue/index.js +1 -0
- package/src/commands/permissions/index.ts +11 -0
- package/src/commands/permissions/permissions.tsx +10 -0
- package/src/commands/plan/index.ts +11 -0
- package/src/commands/plan/plan.tsx +122 -0
- package/src/commands/plugin/AddMarketplace.tsx +162 -0
- package/src/commands/plugin/BrowseMarketplace.tsx +802 -0
- package/src/commands/plugin/DiscoverPlugins.tsx +781 -0
- package/src/commands/plugin/ManageMarketplaces.tsx +838 -0
- package/src/commands/plugin/ManagePlugins.tsx +2215 -0
- package/src/commands/plugin/PluginErrors.tsx +124 -0
- package/src/commands/plugin/PluginOptionsDialog.tsx +357 -0
- package/src/commands/plugin/PluginOptionsFlow.tsx +135 -0
- package/src/commands/plugin/PluginSettings.tsx +1072 -0
- package/src/commands/plugin/PluginTrustWarning.tsx +32 -0
- package/src/commands/plugin/UnifiedInstalledCell.tsx +565 -0
- package/src/commands/plugin/ValidatePlugin.tsx +98 -0
- package/src/commands/plugin/index.tsx +11 -0
- package/src/commands/plugin/parseArgs.ts +103 -0
- package/src/commands/plugin/plugin.tsx +7 -0
- package/src/commands/plugin/pluginDetailsHelpers.tsx +117 -0
- package/src/commands/plugin/usePagination.ts +171 -0
- package/src/commands/pr_comments/index.ts +50 -0
- package/src/commands/privacy-settings/index.ts +14 -0
- package/src/commands/privacy-settings/privacy-settings.tsx +58 -0
- package/src/commands/rate-limit-options/index.ts +19 -0
- package/src/commands/rate-limit-options/rate-limit-options.tsx +210 -0
- package/src/commands/release-notes/index.ts +11 -0
- package/src/commands/release-notes/release-notes.ts +50 -0
- package/src/commands/reload-plugins/index.ts +18 -0
- package/src/commands/reload-plugins/reload-plugins.ts +61 -0
- package/src/commands/remote-env/index.ts +15 -0
- package/src/commands/remote-env/remote-env.tsx +7 -0
- package/src/commands/remote-setup/api.ts +182 -0
- package/src/commands/remote-setup/index.ts +20 -0
- package/src/commands/remote-setup/remote-setup.tsx +187 -0
- package/src/commands/rename/generateSessionName.ts +67 -0
- package/src/commands/rename/index.ts +12 -0
- package/src/commands/rename/rename.ts +87 -0
- package/src/commands/reset-limits/index.js +4 -0
- package/src/commands/resume/index.ts +12 -0
- package/src/commands/resume/resume.tsx +275 -0
- package/src/commands/review/UltrareviewOverageDialog.tsx +96 -0
- package/src/commands/review/reviewRemote.ts +316 -0
- package/src/commands/review/ultrareviewCommand.tsx +58 -0
- package/src/commands/review/ultrareviewEnabled.ts +14 -0
- package/src/commands/review.ts +57 -0
- package/src/commands/rewind/index.ts +13 -0
- package/src/commands/rewind/rewind.ts +13 -0
- package/src/commands/sandbox-toggle/index.ts +50 -0
- package/src/commands/sandbox-toggle/sandbox-toggle.tsx +83 -0
- package/src/commands/security-review.ts +243 -0
- package/src/commands/session/index.ts +16 -0
- package/src/commands/session/session.tsx +140 -0
- package/src/commands/share/index.js +1 -0
- package/src/commands/skills/index.ts +10 -0
- package/src/commands/skills/skills.tsx +8 -0
- package/src/commands/stats/index.ts +10 -0
- package/src/commands/stats/stats.tsx +7 -0
- package/src/commands/status/index.ts +12 -0
- package/src/commands/status/status.tsx +8 -0
- package/src/commands/statusline.tsx +24 -0
- package/src/commands/stickers/index.ts +11 -0
- package/src/commands/stickers/stickers.ts +16 -0
- package/src/commands/summary/index.js +1 -0
- package/src/commands/tag/index.ts +12 -0
- package/src/commands/tag/tag.tsx +215 -0
- package/src/commands/tasks/index.ts +11 -0
- package/src/commands/tasks/tasks.tsx +8 -0
- package/src/commands/teleport/index.js +1 -0
- package/src/commands/terminalSetup/index.ts +23 -0
- package/src/commands/terminalSetup/terminalSetup.tsx +531 -0
- package/src/commands/theme/index.ts +10 -0
- package/src/commands/theme/theme.tsx +57 -0
- package/src/commands/thinkback/index.ts +13 -0
- package/src/commands/thinkback/thinkback.tsx +554 -0
- package/src/commands/thinkback-play/index.ts +17 -0
- package/src/commands/thinkback-play/thinkback-play.ts +43 -0
- package/src/commands/ultraplan.tsx +471 -0
- package/src/commands/upgrade/index.ts +16 -0
- package/src/commands/upgrade/upgrade.tsx +38 -0
- package/src/commands/usage/index.ts +9 -0
- package/src/commands/usage/usage.tsx +7 -0
- package/src/commands/version.ts +22 -0
- package/src/commands/vim/index.ts +11 -0
- package/src/commands/vim/vim.ts +38 -0
- package/src/commands/voice/index.ts +20 -0
- package/src/commands/voice/voice.ts +150 -0
- package/src/commands.ts +754 -0
- package/src/components/AgentProgressLine.tsx +136 -0
- package/src/components/App.tsx +56 -0
- package/src/components/ApproveApiKey.tsx +123 -0
- package/src/components/AutoModeOptInDialog.tsx +142 -0
- package/src/components/AutoUpdater.tsx +198 -0
- package/src/components/AutoUpdaterWrapper.tsx +91 -0
- package/src/components/AwsAuthStatusBox.tsx +82 -0
- package/src/components/BaseTextInput.tsx +136 -0
- package/src/components/BashModeProgress.tsx +56 -0
- package/src/components/BridgeDialog.tsx +401 -0
- package/src/components/BypassPermissionsModeDialog.tsx +87 -0
- package/src/components/ChannelDowngradeDialog.tsx +102 -0
- package/src/components/ClaudeCodeHint/PluginHintMenu.tsx +78 -0
- package/src/components/ClaudeInChromeOnboarding.tsx +121 -0
- package/src/components/ClaudeMdExternalIncludesDialog.tsx +137 -0
- package/src/components/ClickableImageRef.tsx +73 -0
- package/src/components/CompactSummary.tsx +118 -0
- package/src/components/ConfigurableShortcutHint.tsx +57 -0
- package/src/components/ConsoleOAuthFlow.tsx +631 -0
- package/src/components/ContextSuggestions.tsx +47 -0
- package/src/components/ContextVisualization.tsx +489 -0
- package/src/components/CoordinatorAgentStatus.tsx +273 -0
- package/src/components/CostThresholdDialog.tsx +50 -0
- package/src/components/CtrlOToExpand.tsx +51 -0
- package/src/components/CustomSelect/SelectMulti.tsx +213 -0
- package/src/components/CustomSelect/index.ts +3 -0
- package/src/components/CustomSelect/option-map.ts +50 -0
- package/src/components/CustomSelect/select-input-option.tsx +488 -0
- package/src/components/CustomSelect/select-option.tsx +68 -0
- package/src/components/CustomSelect/select.tsx +690 -0
- package/src/components/CustomSelect/use-multi-select-state.ts +414 -0
- package/src/components/CustomSelect/use-select-input.ts +287 -0
- package/src/components/CustomSelect/use-select-navigation.ts +653 -0
- package/src/components/CustomSelect/use-select-state.ts +157 -0
- package/src/components/DesktopHandoff.tsx +193 -0
- package/src/components/DesktopUpsell/DesktopUpsellStartup.tsx +171 -0
- package/src/components/DevBar.tsx +49 -0
- package/src/components/DevChannelsDialog.tsx +105 -0
- package/src/components/DiagnosticsDisplay.tsx +95 -0
- package/src/components/EffortCallout.tsx +265 -0
- package/src/components/EffortIndicator.ts +42 -0
- package/src/components/ExitFlow.tsx +48 -0
- package/src/components/ExportDialog.tsx +128 -0
- package/src/components/FallbackToolUseErrorMessage.tsx +116 -0
- package/src/components/FallbackToolUseRejectedMessage.tsx +16 -0
- package/src/components/FastIcon.tsx +46 -0
- package/src/components/Feedback.tsx +592 -0
- package/src/components/FeedbackSurvey/FeedbackSurvey.tsx +174 -0
- package/src/components/FeedbackSurvey/FeedbackSurveyView.tsx +108 -0
- package/src/components/FeedbackSurvey/TranscriptSharePrompt.tsx +88 -0
- package/src/components/FeedbackSurvey/submitTranscriptShare.ts +112 -0
- package/src/components/FeedbackSurvey/useDebouncedDigitInput.ts +82 -0
- package/src/components/FeedbackSurvey/useFeedbackSurvey.tsx +296 -0
- package/src/components/FeedbackSurvey/useMemorySurvey.tsx +213 -0
- package/src/components/FeedbackSurvey/usePostCompactSurvey.tsx +206 -0
- package/src/components/FeedbackSurvey/useSurveyState.tsx +100 -0
- package/src/components/FileEditToolDiff.tsx +181 -0
- package/src/components/FileEditToolUpdatedMessage.tsx +124 -0
- package/src/components/FileEditToolUseRejectedMessage.tsx +170 -0
- package/src/components/FilePathLink.tsx +43 -0
- package/src/components/FullscreenLayout.tsx +637 -0
- package/src/components/GlobalSearchDialog.tsx +343 -0
- package/src/components/HelpV2/Commands.tsx +82 -0
- package/src/components/HelpV2/General.tsx +23 -0
- package/src/components/HelpV2/HelpV2.tsx +184 -0
- package/src/components/HighlightedCode/Fallback.tsx +193 -0
- package/src/components/HighlightedCode.tsx +190 -0
- package/src/components/HistorySearchDialog.tsx +118 -0
- package/src/components/IdeAutoConnectDialog.tsx +154 -0
- package/src/components/IdeOnboardingDialog.tsx +167 -0
- package/src/components/IdeStatusIndicator.tsx +58 -0
- package/src/components/IdleReturnDialog.tsx +118 -0
- package/src/components/InterruptedByUser.tsx +15 -0
- package/src/components/InvalidConfigDialog.tsx +156 -0
- package/src/components/InvalidSettingsDialog.tsx +89 -0
- package/src/components/KeybindingWarnings.tsx +55 -0
- package/src/components/LanguagePicker.tsx +86 -0
- package/src/components/LogSelector.tsx +1575 -0
- package/src/components/LogoV2/AnimatedAsterisk.tsx +50 -0
- package/src/components/LogoV2/AnimatedClawd.tsx +124 -0
- package/src/components/LogoV2/ChannelsNotice.tsx +266 -0
- package/src/components/LogoV2/Clawd.tsx +240 -0
- package/src/components/LogoV2/CondensedLogo.tsx +161 -0
- package/src/components/LogoV2/EmergencyTip.tsx +58 -0
- package/src/components/LogoV2/Feed.tsx +112 -0
- package/src/components/LogoV2/FeedColumn.tsx +59 -0
- package/src/components/LogoV2/GuestPassesUpsell.tsx +70 -0
- package/src/components/LogoV2/LogoV2.tsx +543 -0
- package/src/components/LogoV2/Opus1mMergeNotice.tsx +55 -0
- package/src/components/LogoV2/OverageCreditUpsell.tsx +166 -0
- package/src/components/LogoV2/VoiceModeNotice.tsx +68 -0
- package/src/components/LogoV2/WelcomeV2.tsx +433 -0
- package/src/components/LogoV2/feedConfigs.tsx +92 -0
- package/src/components/LspRecommendation/LspRecommendationMenu.tsx +88 -0
- package/src/components/MCPServerApprovalDialog.tsx +115 -0
- package/src/components/MCPServerDesktopImportDialog.tsx +203 -0
- package/src/components/MCPServerDialogCopy.tsx +15 -0
- package/src/components/MCPServerMultiselectDialog.tsx +133 -0
- package/src/components/ManagedSettingsSecurityDialog/ManagedSettingsSecurityDialog.tsx +149 -0
- package/src/components/ManagedSettingsSecurityDialog/utils.ts +144 -0
- package/src/components/Markdown.tsx +236 -0
- package/src/components/MarkdownTable.tsx +322 -0
- package/src/components/MemoryUsageIndicator.tsx +37 -0
- package/src/components/Message.tsx +627 -0
- package/src/components/MessageModel.tsx +43 -0
- package/src/components/MessageResponse.tsx +78 -0
- package/src/components/MessageRow.tsx +383 -0
- package/src/components/MessageSelector.tsx +831 -0
- package/src/components/MessageTimestamp.tsx +63 -0
- package/src/components/Messages.tsx +834 -0
- package/src/components/ModelPicker.tsx +448 -0
- package/src/components/NativeAutoUpdater.tsx +193 -0
- package/src/components/NotebookEditToolUseRejectedMessage.tsx +92 -0
- package/src/components/OffscreenFreeze.tsx +44 -0
- package/src/components/Onboarding.tsx +244 -0
- package/src/components/OutputStylePicker.tsx +112 -0
- package/src/components/PackageManagerAutoUpdater.tsx +104 -0
- package/src/components/Passes/Passes.tsx +184 -0
- package/src/components/PrBadge.tsx +97 -0
- package/src/components/PressEnterToContinue.tsx +15 -0
- package/src/components/PromptInput/HistorySearchInput.tsx +51 -0
- package/src/components/PromptInput/IssueFlagBanner.tsx +12 -0
- package/src/components/PromptInput/Notifications.tsx +332 -0
- package/src/components/PromptInput/PromptInput.tsx +2339 -0
- package/src/components/PromptInput/PromptInputFooter.tsx +191 -0
- package/src/components/PromptInput/PromptInputFooterLeftSide.tsx +517 -0
- package/src/components/PromptInput/PromptInputFooterSuggestions.tsx +293 -0
- package/src/components/PromptInput/PromptInputHelpMenu.tsx +358 -0
- package/src/components/PromptInput/PromptInputModeIndicator.tsx +93 -0
- package/src/components/PromptInput/PromptInputQueuedCommands.tsx +117 -0
- package/src/components/PromptInput/PromptInputStashNotice.tsx +25 -0
- package/src/components/PromptInput/SandboxPromptFooterHint.tsx +64 -0
- package/src/components/PromptInput/ShimmeredInput.tsx +143 -0
- package/src/components/PromptInput/VoiceIndicator.tsx +137 -0
- package/src/components/PromptInput/inputModes.ts +33 -0
- package/src/components/PromptInput/inputPaste.ts +90 -0
- package/src/components/PromptInput/useMaybeTruncateInput.ts +58 -0
- package/src/components/PromptInput/usePromptInputPlaceholder.ts +76 -0
- package/src/components/PromptInput/useShowFastIconHint.ts +31 -0
- package/src/components/PromptInput/useSwarmBanner.ts +155 -0
- package/src/components/PromptInput/utils.ts +60 -0
- package/src/components/QuickOpenDialog.tsx +244 -0
- package/src/components/RemoteCallout.tsx +76 -0
- package/src/components/RemoteEnvironmentDialog.tsx +340 -0
- package/src/components/ResumeTask.tsx +268 -0
- package/src/components/SandboxViolationExpandedView.tsx +99 -0
- package/src/components/ScrollKeybindingHandler.tsx +1012 -0
- package/src/components/SearchBox.tsx +72 -0
- package/src/components/SentryErrorBoundary.ts +28 -0
- package/src/components/SessionBackgroundHint.tsx +108 -0
- package/src/components/SessionPreview.tsx +194 -0
- package/src/components/Settings/Config.tsx +1822 -0
- package/src/components/Settings/Settings.tsx +137 -0
- package/src/components/Settings/Status.tsx +241 -0
- package/src/components/Settings/Usage.tsx +377 -0
- package/src/components/ShowInIDEPrompt.tsx +170 -0
- package/src/components/SkillImprovementSurvey.tsx +152 -0
- package/src/components/Spinner/FlashingChar.tsx +61 -0
- package/src/components/Spinner/GlimmerMessage.tsx +328 -0
- package/src/components/Spinner/ShimmerChar.tsx +36 -0
- package/src/components/Spinner/SpinnerAnimationRow.tsx +265 -0
- package/src/components/Spinner/SpinnerGlyph.tsx +80 -0
- package/src/components/Spinner/TeammateSpinnerLine.tsx +233 -0
- package/src/components/Spinner/TeammateSpinnerTree.tsx +272 -0
- package/src/components/Spinner/index.ts +10 -0
- package/src/components/Spinner/teammateSelectHint.ts +1 -0
- package/src/components/Spinner/useShimmerAnimation.ts +31 -0
- package/src/components/Spinner/useStalledAnimation.ts +75 -0
- package/src/components/Spinner/utils.ts +84 -0
- package/src/components/Spinner.tsx +562 -0
- package/src/components/Stats.tsx +1228 -0
- package/src/components/StatusLine.tsx +324 -0
- package/src/components/StatusNotices.tsx +55 -0
- package/src/components/StructuredDiff/Fallback.tsx +487 -0
- package/src/components/StructuredDiff/colorDiff.ts +37 -0
- package/src/components/StructuredDiff.tsx +190 -0
- package/src/components/StructuredDiffList.tsx +30 -0
- package/src/components/TagTabs.tsx +139 -0
- package/src/components/TaskListV2.tsx +378 -0
- package/src/components/TeammateViewHeader.tsx +82 -0
- package/src/components/TeleportError.tsx +189 -0
- package/src/components/TeleportProgress.tsx +140 -0
- package/src/components/TeleportRepoMismatchDialog.tsx +104 -0
- package/src/components/TeleportResumeWrapper.tsx +167 -0
- package/src/components/TeleportStash.tsx +116 -0
- package/src/components/TextInput.tsx +124 -0
- package/src/components/ThemePicker.tsx +333 -0
- package/src/components/ThinkingToggle.tsx +153 -0
- package/src/components/TokenWarning.tsx +179 -0
- package/src/components/ToolUseLoader.tsx +42 -0
- package/src/components/TrustDialog/TrustDialog.tsx +290 -0
- package/src/components/TrustDialog/utils.ts +245 -0
- package/src/components/ValidationErrorsList.tsx +148 -0
- package/src/components/VimTextInput.tsx +140 -0
- package/src/components/VirtualMessageList.tsx +1082 -0
- package/src/components/WorkflowMultiselectDialog.tsx +128 -0
- package/src/components/WorktreeExitDialog.tsx +231 -0
- package/src/components/agents/AgentDetail.tsx +220 -0
- package/src/components/agents/AgentEditor.tsx +178 -0
- package/src/components/agents/AgentNavigationFooter.tsx +26 -0
- package/src/components/agents/AgentsList.tsx +440 -0
- package/src/components/agents/AgentsMenu.tsx +800 -0
- package/src/components/agents/ColorPicker.tsx +112 -0
- package/src/components/agents/ModelSelector.tsx +68 -0
- package/src/components/agents/ToolSelector.tsx +562 -0
- package/src/components/agents/agentFileUtils.ts +272 -0
- package/src/components/agents/generateAgent.ts +197 -0
- package/src/components/agents/new-agent-creation/CreateAgentWizard.tsx +97 -0
- package/src/components/agents/new-agent-creation/wizard-steps/ColorStep.tsx +84 -0
- package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStep.tsx +378 -0
- package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStepWrapper.tsx +74 -0
- package/src/components/agents/new-agent-creation/wizard-steps/DescriptionStep.tsx +123 -0
- package/src/components/agents/new-agent-creation/wizard-steps/GenerateStep.tsx +143 -0
- package/src/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx +80 -0
- package/src/components/agents/new-agent-creation/wizard-steps/MemoryStep.tsx +113 -0
- package/src/components/agents/new-agent-creation/wizard-steps/MethodStep.tsx +80 -0
- package/src/components/agents/new-agent-creation/wizard-steps/ModelStep.tsx +52 -0
- package/src/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx +128 -0
- package/src/components/agents/new-agent-creation/wizard-steps/ToolsStep.tsx +61 -0
- package/src/components/agents/new-agent-creation/wizard-steps/TypeStep.tsx +103 -0
- package/src/components/agents/types.ts +27 -0
- package/src/components/agents/utils.ts +18 -0
- package/src/components/agents/validateAgent.ts +109 -0
- package/src/components/design-system/Byline.tsx +77 -0
- package/src/components/design-system/Dialog.tsx +138 -0
- package/src/components/design-system/Divider.tsx +149 -0
- package/src/components/design-system/FuzzyPicker.tsx +312 -0
- package/src/components/design-system/KeyboardShortcutHint.tsx +81 -0
- package/src/components/design-system/ListItem.tsx +244 -0
- package/src/components/design-system/LoadingState.tsx +94 -0
- package/src/components/design-system/Pane.tsx +77 -0
- package/src/components/design-system/ProgressBar.tsx +86 -0
- package/src/components/design-system/Ratchet.tsx +80 -0
- package/src/components/design-system/StatusIcon.tsx +95 -0
- package/src/components/design-system/Tabs.tsx +340 -0
- package/src/components/design-system/ThemeProvider.tsx +174 -0
- package/src/components/design-system/ThemedBox.tsx +156 -0
- package/src/components/design-system/ThemedText.tsx +124 -0
- package/src/components/design-system/color.ts +30 -0
- package/src/components/diff/DiffDetailView.tsx +281 -0
- package/src/components/diff/DiffDialog.tsx +383 -0
- package/src/components/diff/DiffFileList.tsx +292 -0
- package/src/components/grove/Grove.tsx +463 -0
- package/src/components/hooks/HooksConfigMenu.tsx +578 -0
- package/src/components/hooks/PromptDialog.tsx +90 -0
- package/src/components/hooks/SelectEventMode.tsx +127 -0
- package/src/components/hooks/SelectHookMode.tsx +112 -0
- package/src/components/hooks/SelectMatcherMode.tsx +144 -0
- package/src/components/hooks/ViewHookMode.tsx +199 -0
- package/src/components/mcp/CapabilitiesSection.tsx +61 -0
- package/src/components/mcp/ElicitationDialog.tsx +1169 -0
- package/src/components/mcp/MCPAgentServerMenu.tsx +183 -0
- package/src/components/mcp/MCPListPanel.tsx +504 -0
- package/src/components/mcp/MCPReconnect.tsx +167 -0
- package/src/components/mcp/MCPRemoteServerMenu.tsx +649 -0
- package/src/components/mcp/MCPSettings.tsx +398 -0
- package/src/components/mcp/MCPStdioServerMenu.tsx +177 -0
- package/src/components/mcp/MCPToolDetailView.tsx +212 -0
- package/src/components/mcp/MCPToolListView.tsx +141 -0
- package/src/components/mcp/McpParsingWarnings.tsx +213 -0
- package/src/components/mcp/index.ts +9 -0
- package/src/components/mcp/utils/reconnectHelpers.tsx +49 -0
- package/src/components/memory/MemoryFileSelector.tsx +438 -0
- package/src/components/memory/MemoryUpdateNotification.tsx +45 -0
- package/src/components/messageActions.tsx +450 -0
- package/src/components/messages/AdvisorMessage.tsx +158 -0
- package/src/components/messages/AssistantRedactedThinkingMessage.tsx +31 -0
- package/src/components/messages/AssistantTextMessage.tsx +270 -0
- package/src/components/messages/AssistantThinkingMessage.tsx +86 -0
- package/src/components/messages/AssistantToolUseMessage.tsx +368 -0
- package/src/components/messages/AttachmentMessage.tsx +536 -0
- package/src/components/messages/CollapsedReadSearchContent.tsx +484 -0
- package/src/components/messages/CompactBoundaryMessage.tsx +18 -0
- package/src/components/messages/GroupedToolUseContent.tsx +58 -0
- package/src/components/messages/HighlightedThinkingText.tsx +162 -0
- package/src/components/messages/HookProgressMessage.tsx +116 -0
- package/src/components/messages/PlanApprovalMessage.tsx +222 -0
- package/src/components/messages/RateLimitMessage.tsx +161 -0
- package/src/components/messages/ShutdownMessage.tsx +132 -0
- package/src/components/messages/SystemAPIErrorMessage.tsx +141 -0
- package/src/components/messages/SystemTextMessage.tsx +827 -0
- package/src/components/messages/TaskAssignmentMessage.tsx +76 -0
- package/src/components/messages/UserAgentNotificationMessage.tsx +83 -0
- package/src/components/messages/UserBashInputMessage.tsx +58 -0
- package/src/components/messages/UserBashOutputMessage.tsx +54 -0
- package/src/components/messages/UserChannelMessage.tsx +137 -0
- package/src/components/messages/UserCommandMessage.tsx +108 -0
- package/src/components/messages/UserImageMessage.tsx +59 -0
- package/src/components/messages/UserLocalCommandOutputMessage.tsx +167 -0
- package/src/components/messages/UserMemoryInputMessage.tsx +75 -0
- package/src/components/messages/UserPlanMessage.tsx +42 -0
- package/src/components/messages/UserPromptMessage.tsx +80 -0
- package/src/components/messages/UserResourceUpdateMessage.tsx +121 -0
- package/src/components/messages/UserTeammateMessage.tsx +206 -0
- package/src/components/messages/UserTextMessage.tsx +275 -0
- package/src/components/messages/UserToolResultMessage/RejectedPlanMessage.tsx +31 -0
- package/src/components/messages/UserToolResultMessage/RejectedToolUseMessage.tsx +16 -0
- package/src/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +16 -0
- package/src/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +103 -0
- package/src/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +95 -0
- package/src/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +106 -0
- package/src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +104 -0
- package/src/components/messages/UserToolResultMessage/utils.tsx +44 -0
- package/src/components/messages/nullRenderingAttachments.ts +70 -0
- package/src/components/messages/teamMemCollapsed.tsx +140 -0
- package/src/components/messages/teamMemSaved.ts +19 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest.tsx +645 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/PreviewBox.tsx +229 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/PreviewQuestionView.tsx +328 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionNavigationBar.tsx +178 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionView.tsx +465 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/SubmitQuestionsView.tsx +144 -0
- package/src/components/permissions/AskUserQuestionPermissionRequest/use-multiple-choice-state.ts +179 -0
- package/src/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +482 -0
- package/src/components/permissions/BashPermissionRequest/bashToolUseOptions.tsx +147 -0
- package/src/components/permissions/ComputerUseApproval/ComputerUseApproval.tsx +441 -0
- package/src/components/permissions/EnterPlanModePermissionRequest/EnterPlanModePermissionRequest.tsx +122 -0
- package/src/components/permissions/ExitPlanModePermissionRequest/ExitPlanModePermissionRequest.tsx +768 -0
- package/src/components/permissions/FallbackPermissionRequest.tsx +333 -0
- package/src/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +182 -0
- package/src/components/permissions/FilePermissionDialog/FilePermissionDialog.tsx +204 -0
- package/src/components/permissions/FilePermissionDialog/ideDiffConfig.ts +42 -0
- package/src/components/permissions/FilePermissionDialog/permissionOptions.tsx +177 -0
- package/src/components/permissions/FilePermissionDialog/useFilePermissionDialog.ts +212 -0
- package/src/components/permissions/FilePermissionDialog/usePermissionHandler.ts +185 -0
- package/src/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +161 -0
- package/src/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +89 -0
- package/src/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +115 -0
- package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditPermissionRequest.tsx +166 -0
- package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditToolDiff.tsx +235 -0
- package/src/components/permissions/PermissionDecisionDebugInfo.tsx +460 -0
- package/src/components/permissions/PermissionDialog.tsx +72 -0
- package/src/components/permissions/PermissionExplanation.tsx +272 -0
- package/src/components/permissions/PermissionPrompt.tsx +336 -0
- package/src/components/permissions/PermissionRequest.tsx +217 -0
- package/src/components/permissions/PermissionRequestTitle.tsx +66 -0
- package/src/components/permissions/PermissionRuleExplanation.tsx +121 -0
- package/src/components/permissions/PowerShellPermissionRequest/PowerShellPermissionRequest.tsx +235 -0
- package/src/components/permissions/PowerShellPermissionRequest/powershellToolUseOptions.tsx +91 -0
- package/src/components/permissions/SandboxPermissionRequest.tsx +163 -0
- package/src/components/permissions/SedEditPermissionRequest/SedEditPermissionRequest.tsx +230 -0
- package/src/components/permissions/SkillPermissionRequest/SkillPermissionRequest.tsx +369 -0
- package/src/components/permissions/WebFetchPermissionRequest/WebFetchPermissionRequest.tsx +258 -0
- package/src/components/permissions/WorkerBadge.tsx +49 -0
- package/src/components/permissions/WorkerPendingPermission.tsx +105 -0
- package/src/components/permissions/hooks.ts +209 -0
- package/src/components/permissions/rules/AddPermissionRules.tsx +180 -0
- package/src/components/permissions/rules/AddWorkspaceDirectory.tsx +340 -0
- package/src/components/permissions/rules/PermissionRuleDescription.tsx +76 -0
- package/src/components/permissions/rules/PermissionRuleInput.tsx +138 -0
- package/src/components/permissions/rules/PermissionRuleList.tsx +1179 -0
- package/src/components/permissions/rules/RecentDenialsTab.tsx +207 -0
- package/src/components/permissions/rules/RemoveWorkspaceDirectory.tsx +110 -0
- package/src/components/permissions/rules/WorkspaceTab.tsx +150 -0
- package/src/components/permissions/shellPermissionHelpers.tsx +164 -0
- package/src/components/permissions/useShellPermissionFeedback.ts +148 -0
- package/src/components/permissions/utils.ts +25 -0
- package/src/components/sandbox/SandboxConfigTab.tsx +45 -0
- package/src/components/sandbox/SandboxDependenciesTab.tsx +120 -0
- package/src/components/sandbox/SandboxDoctorSection.tsx +46 -0
- package/src/components/sandbox/SandboxOverridesTab.tsx +193 -0
- package/src/components/sandbox/SandboxSettings.tsx +296 -0
- package/src/components/shell/ExpandShellOutputContext.tsx +36 -0
- package/src/components/shell/OutputLine.tsx +118 -0
- package/src/components/shell/ShellProgressMessage.tsx +150 -0
- package/src/components/shell/ShellTimeDisplay.tsx +74 -0
- package/src/components/skills/SkillsMenu.tsx +237 -0
- package/src/components/tasks/AsyncAgentDetailDialog.tsx +229 -0
- package/src/components/tasks/BackgroundTask.tsx +345 -0
- package/src/components/tasks/BackgroundTaskStatus.tsx +429 -0
- package/src/components/tasks/BackgroundTasksDialog.tsx +652 -0
- package/src/components/tasks/DreamDetailDialog.tsx +251 -0
- package/src/components/tasks/InProcessTeammateDetailDialog.tsx +266 -0
- package/src/components/tasks/RemoteSessionDetailDialog.tsx +904 -0
- package/src/components/tasks/RemoteSessionProgress.tsx +243 -0
- package/src/components/tasks/ShellDetailDialog.tsx +404 -0
- package/src/components/tasks/ShellProgress.tsx +87 -0
- package/src/components/tasks/renderToolActivity.tsx +33 -0
- package/src/components/tasks/taskStatusUtils.tsx +107 -0
- package/src/components/teams/TeamStatus.tsx +80 -0
- package/src/components/teams/TeamsDialog.tsx +715 -0
- package/src/components/ui/OrderedList.tsx +71 -0
- package/src/components/ui/OrderedListItem.tsx +45 -0
- package/src/components/ui/TreeSelect.tsx +397 -0
- package/src/components/wizard/WizardDialogLayout.tsx +65 -0
- package/src/components/wizard/WizardNavigationFooter.tsx +24 -0
- package/src/components/wizard/WizardProvider.tsx +213 -0
- package/src/components/wizard/index.ts +9 -0
- package/src/components/wizard/useWizard.ts +13 -0
- package/src/constants/apiLimits.ts +94 -0
- package/src/constants/betas.ts +52 -0
- package/src/constants/common.ts +33 -0
- package/src/constants/cyberRiskInstruction.ts +24 -0
- package/src/constants/errorIds.ts +15 -0
- package/src/constants/figures.ts +45 -0
- package/src/constants/files.ts +156 -0
- package/src/constants/github-app.ts +144 -0
- package/src/constants/keys.ts +11 -0
- package/src/constants/messages.ts +1 -0
- package/src/constants/oauth.ts +234 -0
- package/src/constants/outputStyles.ts +216 -0
- package/src/constants/product.ts +76 -0
- package/src/constants/prompts.ts +914 -0
- package/src/constants/spinnerVerbs.ts +204 -0
- package/src/constants/system.ts +95 -0
- package/src/constants/systemPromptSections.ts +68 -0
- package/src/constants/toolLimits.ts +56 -0
- package/src/constants/tools.ts +112 -0
- package/src/constants/turnCompletionVerbs.ts +12 -0
- package/src/constants/xml.ts +86 -0
- package/src/context/QueuedMessageContext.tsx +63 -0
- package/src/context/fpsMetrics.tsx +30 -0
- package/src/context/mailbox.tsx +38 -0
- package/src/context/modalContext.tsx +58 -0
- package/src/context/notifications.tsx +240 -0
- package/src/context/overlayContext.tsx +151 -0
- package/src/context/promptOverlayContext.tsx +125 -0
- package/src/context/stats.tsx +220 -0
- package/src/context/voice.tsx +88 -0
- package/src/context.ts +189 -0
- package/src/coordinator/coordinatorMode.ts +369 -0
- package/src/cost-tracker.ts +323 -0
- package/src/costHook.ts +22 -0
- package/src/dialogLaunchers.tsx +133 -0
- package/src/entrypoints/agentSdkTypes.ts +443 -0
- package/src/entrypoints/cli.tsx +303 -0
- package/src/entrypoints/init.ts +340 -0
- package/src/entrypoints/mcp.ts +196 -0
- package/src/entrypoints/sandboxTypes.ts +156 -0
- package/src/entrypoints/sdk/controlSchemas.ts +663 -0
- package/src/entrypoints/sdk/coreSchemas.ts +1889 -0
- package/src/entrypoints/sdk/coreTypes.ts +62 -0
- package/src/history.ts +464 -0
- package/src/hooks/fileSuggestions.ts +811 -0
- package/src/hooks/notifs/useAutoModeUnavailableNotification.ts +56 -0
- package/src/hooks/notifs/useCanSwitchToExistingSubscription.tsx +60 -0
- package/src/hooks/notifs/useDeprecationWarningNotification.tsx +44 -0
- package/src/hooks/notifs/useFastModeNotification.tsx +162 -0
- package/src/hooks/notifs/useIDEStatusIndicator.tsx +186 -0
- package/src/hooks/notifs/useInstallMessages.tsx +26 -0
- package/src/hooks/notifs/useLspInitializationNotification.tsx +143 -0
- package/src/hooks/notifs/useMcpConnectivityStatus.tsx +88 -0
- package/src/hooks/notifs/useModelMigrationNotifications.tsx +52 -0
- package/src/hooks/notifs/useNpmDeprecationNotification.tsx +25 -0
- package/src/hooks/notifs/usePluginAutoupdateNotification.tsx +83 -0
- package/src/hooks/notifs/usePluginInstallationStatus.tsx +128 -0
- package/src/hooks/notifs/useRateLimitWarningNotification.tsx +114 -0
- package/src/hooks/notifs/useSettingsErrors.tsx +69 -0
- package/src/hooks/notifs/useStartupNotification.ts +41 -0
- package/src/hooks/notifs/useTeammateShutdownNotification.ts +78 -0
- package/src/hooks/renderPlaceholder.ts +51 -0
- package/src/hooks/toolPermission/PermissionContext.ts +388 -0
- package/src/hooks/toolPermission/handlers/coordinatorHandler.ts +65 -0
- package/src/hooks/toolPermission/handlers/interactiveHandler.ts +536 -0
- package/src/hooks/toolPermission/handlers/swarmWorkerHandler.ts +159 -0
- package/src/hooks/toolPermission/permissionLogging.ts +238 -0
- package/src/hooks/unifiedSuggestions.ts +202 -0
- package/src/hooks/useAfterFirstRender.ts +17 -0
- package/src/hooks/useApiKeyVerification.ts +84 -0
- package/src/hooks/useArrowKeyHistory.tsx +229 -0
- package/src/hooks/useAssistantHistory.ts +250 -0
- package/src/hooks/useAwaySummary.ts +125 -0
- package/src/hooks/useBackgroundTaskNavigation.ts +251 -0
- package/src/hooks/useBlink.ts +34 -0
- package/src/hooks/useCanUseTool.tsx +204 -0
- package/src/hooks/useCancelRequest.ts +276 -0
- package/src/hooks/useChromeExtensionNotification.tsx +50 -0
- package/src/hooks/useClaudeCodeHintRecommendation.tsx +129 -0
- package/src/hooks/useClipboardImageHint.ts +77 -0
- package/src/hooks/useCommandKeybindings.tsx +108 -0
- package/src/hooks/useCommandQueue.ts +15 -0
- package/src/hooks/useCopyOnSelect.ts +98 -0
- package/src/hooks/useDeferredHookMessages.ts +46 -0
- package/src/hooks/useDiffData.ts +110 -0
- package/src/hooks/useDiffInIDE.ts +379 -0
- package/src/hooks/useDirectConnect.ts +229 -0
- package/src/hooks/useDoublePress.ts +62 -0
- package/src/hooks/useDynamicConfig.ts +22 -0
- package/src/hooks/useElapsedTime.ts +37 -0
- package/src/hooks/useExitOnCtrlCD.ts +95 -0
- package/src/hooks/useExitOnCtrlCDWithKeybindings.ts +24 -0
- package/src/hooks/useFileHistorySnapshotInit.ts +25 -0
- package/src/hooks/useGlobalKeybindings.tsx +249 -0
- package/src/hooks/useHistorySearch.ts +303 -0
- package/src/hooks/useIDEIntegration.tsx +70 -0
- package/src/hooks/useIdeAtMentioned.ts +76 -0
- package/src/hooks/useIdeConnectionStatus.ts +33 -0
- package/src/hooks/useIdeLogging.ts +41 -0
- package/src/hooks/useIdeSelection.ts +150 -0
- package/src/hooks/useInboxPoller.ts +969 -0
- package/src/hooks/useInputBuffer.ts +132 -0
- package/src/hooks/useIssueFlagBanner.ts +133 -0
- package/src/hooks/useLogMessages.ts +119 -0
- package/src/hooks/useLspPluginRecommendation.tsx +194 -0
- package/src/hooks/useMailboxBridge.ts +21 -0
- package/src/hooks/useMainLoopModel.ts +34 -0
- package/src/hooks/useManagePlugins.ts +304 -0
- package/src/hooks/useMemoryUsage.ts +39 -0
- package/src/hooks/useMergedClients.ts +23 -0
- package/src/hooks/useMergedCommands.ts +15 -0
- package/src/hooks/useMergedTools.ts +44 -0
- package/src/hooks/useMinDisplayTime.ts +35 -0
- package/src/hooks/useNotifyAfterTimeout.ts +65 -0
- package/src/hooks/useOfficialMarketplaceNotification.tsx +48 -0
- package/src/hooks/usePasteHandler.ts +285 -0
- package/src/hooks/usePluginRecommendationBase.tsx +105 -0
- package/src/hooks/usePrStatus.ts +106 -0
- package/src/hooks/usePromptSuggestion.ts +177 -0
- package/src/hooks/usePromptsFromClaudeInChrome.tsx +71 -0
- package/src/hooks/useQueueProcessor.ts +68 -0
- package/src/hooks/useRemoteSession.ts +605 -0
- package/src/hooks/useReplBridge.tsx +723 -0
- package/src/hooks/useSSHSession.ts +241 -0
- package/src/hooks/useScheduledTasks.ts +139 -0
- package/src/hooks/useSearchInput.ts +364 -0
- package/src/hooks/useSessionBackgrounding.ts +158 -0
- package/src/hooks/useSettings.ts +17 -0
- package/src/hooks/useSettingsChange.ts +25 -0
- package/src/hooks/useSkillImprovementSurvey.ts +105 -0
- package/src/hooks/useSkillsChange.ts +62 -0
- package/src/hooks/useSwarmInitialization.ts +81 -0
- package/src/hooks/useSwarmPermissionPoller.ts +330 -0
- package/src/hooks/useTaskListWatcher.ts +221 -0
- package/src/hooks/useTasksV2.ts +250 -0
- package/src/hooks/useTeammateViewAutoExit.ts +63 -0
- package/src/hooks/useTeleportResume.tsx +85 -0
- package/src/hooks/useTerminalSize.ts +15 -0
- package/src/hooks/useTextInput.ts +529 -0
- package/src/hooks/useTimeout.ts +14 -0
- package/src/hooks/useTurnDiffs.ts +213 -0
- package/src/hooks/useTypeahead.tsx +1385 -0
- package/src/hooks/useUpdateNotification.ts +34 -0
- package/src/hooks/useVimInput.ts +316 -0
- package/src/hooks/useVirtualScroll.ts +721 -0
- package/src/hooks/useVoice.ts +1144 -0
- package/src/hooks/useVoiceEnabled.ts +25 -0
- package/src/hooks/useVoiceIntegration.tsx +677 -0
- package/src/ink/Ansi.tsx +292 -0
- package/src/ink/bidi.ts +139 -0
- package/src/ink/clearTerminal.ts +74 -0
- package/src/ink/colorize.ts +231 -0
- package/src/ink/components/AlternateScreen.tsx +80 -0
- package/src/ink/components/App.tsx +659 -0
- package/src/ink/components/AppContext.ts +21 -0
- package/src/ink/components/Box.tsx +214 -0
- package/src/ink/components/Button.tsx +192 -0
- package/src/ink/components/ClockContext.tsx +112 -0
- package/src/ink/components/CursorDeclarationContext.ts +32 -0
- package/src/ink/components/ErrorOverview.tsx +109 -0
- package/src/ink/components/Link.tsx +42 -0
- package/src/ink/components/Newline.tsx +39 -0
- package/src/ink/components/NoSelect.tsx +68 -0
- package/src/ink/components/RawAnsi.tsx +57 -0
- package/src/ink/components/ScrollBox.tsx +237 -0
- package/src/ink/components/Spacer.tsx +20 -0
- package/src/ink/components/StdinContext.ts +49 -0
- package/src/ink/components/TerminalFocusContext.tsx +52 -0
- package/src/ink/components/TerminalSizeContext.tsx +7 -0
- package/src/ink/components/Text.tsx +254 -0
- package/src/ink/constants.ts +2 -0
- package/src/ink/dom.ts +484 -0
- package/src/ink/events/click-event.ts +38 -0
- package/src/ink/events/dispatcher.ts +233 -0
- package/src/ink/events/emitter.ts +39 -0
- package/src/ink/events/event-handlers.ts +73 -0
- package/src/ink/events/event.ts +11 -0
- package/src/ink/events/focus-event.ts +21 -0
- package/src/ink/events/input-event.ts +205 -0
- package/src/ink/events/keyboard-event.ts +51 -0
- package/src/ink/events/terminal-event.ts +107 -0
- package/src/ink/events/terminal-focus-event.ts +19 -0
- package/src/ink/focus.ts +181 -0
- package/src/ink/frame.ts +124 -0
- package/src/ink/get-max-width.ts +27 -0
- package/src/ink/hit-test.ts +130 -0
- package/src/ink/hooks/use-animation-frame.ts +57 -0
- package/src/ink/hooks/use-app.ts +8 -0
- package/src/ink/hooks/use-declared-cursor.ts +73 -0
- package/src/ink/hooks/use-input.ts +92 -0
- package/src/ink/hooks/use-interval.ts +67 -0
- package/src/ink/hooks/use-search-highlight.ts +53 -0
- package/src/ink/hooks/use-selection.ts +104 -0
- package/src/ink/hooks/use-stdin.ts +8 -0
- package/src/ink/hooks/use-tab-status.ts +72 -0
- package/src/ink/hooks/use-terminal-focus.ts +16 -0
- package/src/ink/hooks/use-terminal-title.ts +31 -0
- package/src/ink/hooks/use-terminal-viewport.ts +96 -0
- package/src/ink/ink.tsx +1728 -0
- package/src/ink/instances.ts +10 -0
- package/src/ink/layout/engine.ts +6 -0
- package/src/ink/layout/geometry.ts +97 -0
- package/src/ink/layout/node.ts +152 -0
- package/src/ink/layout/yoga.ts +308 -0
- package/src/ink/line-width-cache.ts +24 -0
- package/src/ink/log-update.ts +773 -0
- package/src/ink/measure-element.ts +23 -0
- package/src/ink/measure-text.ts +47 -0
- package/src/ink/node-cache.ts +54 -0
- package/src/ink/optimizer.ts +93 -0
- package/src/ink/output.ts +797 -0
- package/src/ink/parse-keypress.ts +801 -0
- package/src/ink/reconciler.ts +512 -0
- package/src/ink/render-border.ts +231 -0
- package/src/ink/render-node-to-output.ts +1462 -0
- package/src/ink/render-to-screen.ts +231 -0
- package/src/ink/renderer.ts +178 -0
- package/src/ink/root.ts +184 -0
- package/src/ink/screen.ts +1486 -0
- package/src/ink/searchHighlight.ts +93 -0
- package/src/ink/selection.ts +917 -0
- package/src/ink/squash-text-nodes.ts +92 -0
- package/src/ink/stringWidth.ts +222 -0
- package/src/ink/styles.ts +771 -0
- package/src/ink/supports-hyperlinks.ts +57 -0
- package/src/ink/tabstops.ts +46 -0
- package/src/ink/terminal-focus-state.ts +47 -0
- package/src/ink/terminal-querier.ts +212 -0
- package/src/ink/terminal.ts +248 -0
- package/src/ink/termio/ansi.ts +75 -0
- package/src/ink/termio/csi.ts +319 -0
- package/src/ink/termio/dec.ts +60 -0
- package/src/ink/termio/esc.ts +67 -0
- package/src/ink/termio/osc.ts +493 -0
- package/src/ink/termio/parser.ts +394 -0
- package/src/ink/termio/sgr.ts +308 -0
- package/src/ink/termio/tokenize.ts +319 -0
- package/src/ink/termio/types.ts +236 -0
- package/src/ink/termio.ts +42 -0
- package/src/ink/useTerminalNotification.ts +126 -0
- package/src/ink/warn.ts +9 -0
- package/src/ink/widest-line.ts +19 -0
- package/src/ink/wrap-text.ts +74 -0
- package/src/ink/wrapAnsi.ts +20 -0
- package/src/ink.ts +85 -0
- package/src/interactiveHelpers.tsx +367 -0
- package/src/keybindings/KeybindingContext.tsx +243 -0
- package/src/keybindings/KeybindingProviderSetup.tsx +308 -0
- package/src/keybindings/defaultBindings.ts +340 -0
- package/src/keybindings/loadUserBindings.ts +472 -0
- package/src/keybindings/match.ts +120 -0
- package/src/keybindings/parser.ts +203 -0
- package/src/keybindings/reservedShortcuts.ts +127 -0
- package/src/keybindings/resolver.ts +244 -0
- package/src/keybindings/schema.ts +236 -0
- package/src/keybindings/shortcutFormat.ts +63 -0
- package/src/keybindings/template.ts +52 -0
- package/src/keybindings/useKeybinding.ts +196 -0
- package/src/keybindings/useShortcutDisplay.ts +59 -0
- package/src/keybindings/validate.ts +498 -0
- package/src/main.tsx +4684 -0
- package/src/memdir/findRelevantMemories.ts +141 -0
- package/src/memdir/memdir.ts +507 -0
- package/src/memdir/memoryAge.ts +53 -0
- package/src/memdir/memoryScan.ts +94 -0
- package/src/memdir/memoryTypes.ts +271 -0
- package/src/memdir/paths.ts +278 -0
- package/src/memdir/teamMemPaths.ts +292 -0
- package/src/memdir/teamMemPrompts.ts +100 -0
- package/src/migrations/migrateAutoUpdatesToSettings.ts +61 -0
- package/src/migrations/migrateBypassPermissionsAcceptedToSettings.ts +40 -0
- package/src/migrations/migrateEnableAllProjectMcpServersToSettings.ts +118 -0
- package/src/migrations/migrateFennecToOpus.ts +45 -0
- package/src/migrations/migrateLegacyOpusToCurrent.ts +57 -0
- package/src/migrations/migrateOpusToOpus1m.ts +43 -0
- package/src/migrations/migrateReplBridgeEnabledToRemoteControlAtStartup.ts +22 -0
- package/src/migrations/migrateSonnet1mToSonnet45.ts +48 -0
- package/src/migrations/migrateSonnet45ToSonnet46.ts +67 -0
- package/src/migrations/resetAutoModeOptInForDefaultOffer.ts +51 -0
- package/src/migrations/resetProToOpusDefault.ts +51 -0
- package/src/moreright/useMoreRight.tsx +26 -0
- package/src/native-ts/color-diff/index.ts +999 -0
- package/src/native-ts/file-index/index.ts +370 -0
- package/src/native-ts/yoga-layout/enums.ts +134 -0
- package/src/native-ts/yoga-layout/index.ts +2578 -0
- package/src/outputStyles/loadOutputStylesDir.ts +98 -0
- package/src/plugins/builtinPlugins.ts +159 -0
- package/src/plugins/bundled/index.ts +23 -0
- package/src/projectOnboardingState.ts +83 -0
- package/src/query/config.ts +46 -0
- package/src/query/deps.ts +40 -0
- package/src/query/stopHooks.ts +473 -0
- package/src/query/tokenBudget.ts +93 -0
- package/src/query.ts +1729 -0
- package/src/remote/RemoteSessionManager.ts +343 -0
- package/src/remote/SessionsWebSocket.ts +404 -0
- package/src/remote/remotePermissionBridge.ts +78 -0
- package/src/remote/sdkMessageAdapter.ts +302 -0
- package/src/replLauncher.tsx +23 -0
- package/src/schemas/hooks.ts +222 -0
- package/src/screens/Doctor.tsx +575 -0
- package/src/screens/REPL.tsx +5006 -0
- package/src/screens/ResumeConversation.tsx +399 -0
- package/src/server/createDirectConnectSession.ts +88 -0
- package/src/server/directConnectManager.ts +213 -0
- package/src/server/types.ts +57 -0
- package/src/services/AgentSummary/agentSummary.ts +179 -0
- package/src/services/MagicDocs/magicDocs.ts +254 -0
- package/src/services/MagicDocs/prompts.ts +127 -0
- package/src/services/PromptSuggestion/promptSuggestion.ts +523 -0
- package/src/services/PromptSuggestion/speculation.ts +991 -0
- package/src/services/SessionMemory/prompts.ts +324 -0
- package/src/services/SessionMemory/sessionMemory.ts +495 -0
- package/src/services/SessionMemory/sessionMemoryUtils.ts +207 -0
- package/src/services/analytics/config.ts +38 -0
- package/src/services/analytics/datadog.ts +307 -0
- package/src/services/analytics/firstPartyEventLogger.ts +449 -0
- package/src/services/analytics/firstPartyEventLoggingExporter.ts +806 -0
- package/src/services/analytics/growthbook.ts +1157 -0
- package/src/services/analytics/index.ts +173 -0
- package/src/services/analytics/metadata.ts +973 -0
- package/src/services/analytics/sink.ts +114 -0
- package/src/services/analytics/sinkKillswitch.ts +25 -0
- package/src/services/api/adminRequests.ts +119 -0
- package/src/services/api/bootstrap.ts +142 -0
- package/src/services/api/claude.ts +3433 -0
- package/src/services/api/client.ts +395 -0
- package/src/services/api/dumpPrompts.ts +226 -0
- package/src/services/api/emptyUsage.ts +22 -0
- package/src/services/api/errorUtils.ts +260 -0
- package/src/services/api/errors.ts +1207 -0
- package/src/services/api/filesApi.ts +748 -0
- package/src/services/api/firstTokenDate.ts +60 -0
- package/src/services/api/grove.ts +357 -0
- package/src/services/api/logging.ts +788 -0
- package/src/services/api/metricsOptOut.ts +159 -0
- package/src/services/api/overageCreditGrant.ts +137 -0
- package/src/services/api/promptCacheBreakDetection.ts +727 -0
- package/src/services/api/referral.ts +281 -0
- package/src/services/api/sessionIngress.ts +514 -0
- package/src/services/api/ultrareviewQuota.ts +38 -0
- package/src/services/api/usage.ts +63 -0
- package/src/services/api/withRetry.ts +826 -0
- package/src/services/autoDream/autoDream.ts +324 -0
- package/src/services/autoDream/config.ts +21 -0
- package/src/services/autoDream/consolidationLock.ts +140 -0
- package/src/services/autoDream/consolidationPrompt.ts +65 -0
- package/src/services/awaySummary.ts +74 -0
- package/src/services/claudeAiLimits.ts +515 -0
- package/src/services/claudeAiLimitsHook.ts +23 -0
- package/src/services/compact/apiMicrocompact.ts +153 -0
- package/src/services/compact/autoCompact.ts +351 -0
- package/src/services/compact/compact.ts +1705 -0
- package/src/services/compact/compactWarningHook.ts +16 -0
- package/src/services/compact/compactWarningState.ts +18 -0
- package/src/services/compact/grouping.ts +63 -0
- package/src/services/compact/microCompact.ts +530 -0
- package/src/services/compact/postCompactCleanup.ts +77 -0
- package/src/services/compact/prompt.ts +374 -0
- package/src/services/compact/sessionMemoryCompact.ts +630 -0
- package/src/services/compact/timeBasedMCConfig.ts +43 -0
- package/src/services/diagnosticTracking.ts +397 -0
- package/src/services/extractMemories/extractMemories.ts +615 -0
- package/src/services/extractMemories/prompts.ts +154 -0
- package/src/services/internalLogging.ts +90 -0
- package/src/services/lsp/LSPClient.ts +447 -0
- package/src/services/lsp/LSPDiagnosticRegistry.ts +386 -0
- package/src/services/lsp/LSPServerInstance.ts +511 -0
- package/src/services/lsp/LSPServerManager.ts +420 -0
- package/src/services/lsp/config.ts +79 -0
- package/src/services/lsp/manager.ts +289 -0
- package/src/services/lsp/passiveFeedback.ts +328 -0
- package/src/services/mcp/InProcessTransport.ts +63 -0
- package/src/services/mcp/MCPConnectionManager.tsx +73 -0
- package/src/services/mcp/SdkControlTransport.ts +136 -0
- package/src/services/mcp/auth.ts +2465 -0
- package/src/services/mcp/channelAllowlist.ts +76 -0
- package/src/services/mcp/channelNotification.ts +316 -0
- package/src/services/mcp/channelPermissions.ts +240 -0
- package/src/services/mcp/claudeai.ts +164 -0
- package/src/services/mcp/client.ts +3348 -0
- package/src/services/mcp/config.ts +1578 -0
- package/src/services/mcp/elicitationHandler.ts +313 -0
- package/src/services/mcp/envExpansion.ts +38 -0
- package/src/services/mcp/headersHelper.ts +138 -0
- package/src/services/mcp/mcpStringUtils.ts +106 -0
- package/src/services/mcp/normalization.ts +23 -0
- package/src/services/mcp/oauthPort.ts +78 -0
- package/src/services/mcp/officialRegistry.ts +72 -0
- package/src/services/mcp/types.ts +258 -0
- package/src/services/mcp/useManageMCPConnections.ts +1141 -0
- package/src/services/mcp/utils.ts +575 -0
- package/src/services/mcp/vscodeSdkMcp.ts +112 -0
- package/src/services/mcp/xaa.ts +511 -0
- package/src/services/mcp/xaaIdpLogin.ts +487 -0
- package/src/services/mcpServerApproval.tsx +41 -0
- package/src/services/mockRateLimits.ts +882 -0
- package/src/services/notifier.ts +156 -0
- package/src/services/oauth/auth-code-listener.ts +211 -0
- package/src/services/oauth/client.ts +566 -0
- package/src/services/oauth/crypto.ts +23 -0
- package/src/services/oauth/getOauthProfile.ts +53 -0
- package/src/services/oauth/index.ts +198 -0
- package/src/services/plugins/PluginInstallationManager.ts +184 -0
- package/src/services/plugins/pluginCliCommands.ts +344 -0
- package/src/services/plugins/pluginOperations.ts +1088 -0
- package/src/services/policyLimits/index.ts +664 -0
- package/src/services/policyLimits/types.ts +27 -0
- package/src/services/preventSleep.ts +165 -0
- package/src/services/rateLimitMessages.ts +344 -0
- package/src/services/rateLimitMocking.ts +144 -0
- package/src/services/remoteManagedSettings/index.ts +639 -0
- package/src/services/remoteManagedSettings/securityCheck.tsx +74 -0
- package/src/services/remoteManagedSettings/syncCache.ts +112 -0
- package/src/services/remoteManagedSettings/syncCacheState.ts +96 -0
- package/src/services/remoteManagedSettings/types.ts +31 -0
- package/src/services/settingsSync/index.ts +581 -0
- package/src/services/settingsSync/types.ts +67 -0
- package/src/services/teamMemorySync/index.ts +1256 -0
- package/src/services/teamMemorySync/secretScanner.ts +324 -0
- package/src/services/teamMemorySync/teamMemSecretGuard.ts +44 -0
- package/src/services/teamMemorySync/types.ts +156 -0
- package/src/services/teamMemorySync/watcher.ts +387 -0
- package/src/services/tips/tipHistory.ts +17 -0
- package/src/services/tips/tipRegistry.ts +686 -0
- package/src/services/tips/tipScheduler.ts +58 -0
- package/src/services/tokenEstimation.ts +495 -0
- package/src/services/toolUseSummary/toolUseSummaryGenerator.ts +112 -0
- package/src/services/tools/StreamingToolExecutor.ts +530 -0
- package/src/services/tools/toolExecution.ts +1745 -0
- package/src/services/tools/toolHooks.ts +650 -0
- package/src/services/tools/toolOrchestration.ts +188 -0
- package/src/services/vcr.ts +406 -0
- package/src/services/voice.ts +525 -0
- package/src/services/voiceKeyterms.ts +106 -0
- package/src/services/voiceStreamSTT.ts +544 -0
- package/src/setup.ts +477 -0
- package/src/skills/bundled/batch.ts +124 -0
- package/src/skills/bundled/claudeApi.ts +196 -0
- package/src/skills/bundled/claudeApiContent.ts +75 -0
- package/src/skills/bundled/claudeInChrome.ts +34 -0
- package/src/skills/bundled/debug.ts +103 -0
- package/src/skills/bundled/index.ts +79 -0
- package/src/skills/bundled/keybindings.ts +339 -0
- package/src/skills/bundled/loop.ts +92 -0
- package/src/skills/bundled/loremIpsum.ts +282 -0
- package/src/skills/bundled/remember.ts +82 -0
- package/src/skills/bundled/scheduleRemoteAgents.ts +447 -0
- package/src/skills/bundled/simplify.ts +69 -0
- package/src/skills/bundled/skillify.ts +197 -0
- package/src/skills/bundled/stuck.ts +79 -0
- package/src/skills/bundled/updateConfig.ts +475 -0
- package/src/skills/bundled/verify.ts +30 -0
- package/src/skills/bundled/verifyContent.ts +13 -0
- package/src/skills/bundledSkills.ts +220 -0
- package/src/skills/loadSkillsDir.ts +1086 -0
- package/src/skills/mcpSkillBuilders.ts +44 -0
- package/src/state/AppState.tsx +200 -0
- package/src/state/AppStateStore.ts +569 -0
- package/src/state/onChangeAppState.ts +171 -0
- package/src/state/selectors.ts +76 -0
- package/src/state/store.ts +34 -0
- package/src/state/teammateViewHelpers.ts +141 -0
- package/src/tasks/DreamTask/DreamTask.ts +157 -0
- package/src/tasks/InProcessTeammateTask/InProcessTeammateTask.tsx +126 -0
- package/src/tasks/InProcessTeammateTask/types.ts +121 -0
- package/src/tasks/LocalAgentTask/LocalAgentTask.tsx +683 -0
- package/src/tasks/LocalMainSessionTask.ts +479 -0
- package/src/tasks/LocalShellTask/LocalShellTask.tsx +523 -0
- package/src/tasks/LocalShellTask/guards.ts +41 -0
- package/src/tasks/LocalShellTask/killShellTasks.ts +76 -0
- package/src/tasks/RemoteAgentTask/RemoteAgentTask.tsx +856 -0
- package/src/tasks/pillLabel.ts +82 -0
- package/src/tasks/stopTask.ts +100 -0
- package/src/tasks/types.ts +46 -0
- package/src/tasks.ts +39 -0
- package/src/tools/AgentTool/AgentTool.tsx +1398 -0
- package/src/tools/AgentTool/UI.tsx +872 -0
- package/src/tools/AgentTool/agentColorManager.ts +66 -0
- package/src/tools/AgentTool/agentDisplay.ts +104 -0
- package/src/tools/AgentTool/agentMemory.ts +177 -0
- package/src/tools/AgentTool/agentMemorySnapshot.ts +197 -0
- package/src/tools/AgentTool/agentToolUtils.ts +686 -0
- package/src/tools/AgentTool/built-in/claudeCodeGuideAgent.ts +205 -0
- package/src/tools/AgentTool/built-in/exploreAgent.ts +83 -0
- package/src/tools/AgentTool/built-in/generalPurposeAgent.ts +34 -0
- package/src/tools/AgentTool/built-in/planAgent.ts +92 -0
- package/src/tools/AgentTool/built-in/statuslineSetup.ts +144 -0
- package/src/tools/AgentTool/built-in/verificationAgent.ts +152 -0
- package/src/tools/AgentTool/builtInAgents.ts +72 -0
- package/src/tools/AgentTool/constants.ts +12 -0
- package/src/tools/AgentTool/forkSubagent.ts +210 -0
- package/src/tools/AgentTool/loadAgentsDir.ts +755 -0
- package/src/tools/AgentTool/prompt.ts +287 -0
- package/src/tools/AgentTool/resumeAgent.ts +265 -0
- package/src/tools/AgentTool/runAgent.ts +973 -0
- package/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +266 -0
- package/src/tools/AskUserQuestionTool/prompt.ts +44 -0
- package/src/tools/BashTool/BashTool.tsx +1144 -0
- package/src/tools/BashTool/BashToolResultMessage.tsx +191 -0
- package/src/tools/BashTool/UI.tsx +185 -0
- package/src/tools/BashTool/bashCommandHelpers.ts +265 -0
- package/src/tools/BashTool/bashPermissions.ts +2621 -0
- package/src/tools/BashTool/bashSecurity.ts +2592 -0
- package/src/tools/BashTool/commandSemantics.ts +140 -0
- package/src/tools/BashTool/commentLabel.ts +13 -0
- package/src/tools/BashTool/destructiveCommandWarning.ts +102 -0
- package/src/tools/BashTool/modeValidation.ts +115 -0
- package/src/tools/BashTool/pathValidation.ts +1303 -0
- package/src/tools/BashTool/prompt.ts +369 -0
- package/src/tools/BashTool/readOnlyValidation.ts +1990 -0
- package/src/tools/BashTool/sedEditParser.ts +322 -0
- package/src/tools/BashTool/sedValidation.ts +684 -0
- package/src/tools/BashTool/shouldUseSandbox.ts +153 -0
- package/src/tools/BashTool/toolName.ts +2 -0
- package/src/tools/BashTool/utils.ts +223 -0
- package/src/tools/BriefTool/BriefTool.ts +204 -0
- package/src/tools/BriefTool/UI.tsx +101 -0
- package/src/tools/BriefTool/attachments.ts +110 -0
- package/src/tools/BriefTool/prompt.ts +22 -0
- package/src/tools/BriefTool/upload.ts +174 -0
- package/src/tools/ConfigTool/ConfigTool.ts +467 -0
- package/src/tools/ConfigTool/UI.tsx +38 -0
- package/src/tools/ConfigTool/constants.ts +1 -0
- package/src/tools/ConfigTool/prompt.ts +93 -0
- package/src/tools/ConfigTool/supportedSettings.ts +211 -0
- package/src/tools/EnterPlanModeTool/EnterPlanModeTool.ts +126 -0
- package/src/tools/EnterPlanModeTool/UI.tsx +33 -0
- package/src/tools/EnterPlanModeTool/constants.ts +1 -0
- package/src/tools/EnterPlanModeTool/prompt.ts +170 -0
- package/src/tools/EnterWorktreeTool/EnterWorktreeTool.ts +127 -0
- package/src/tools/EnterWorktreeTool/UI.tsx +20 -0
- package/src/tools/EnterWorktreeTool/constants.ts +1 -0
- package/src/tools/EnterWorktreeTool/prompt.ts +30 -0
- package/src/tools/ExitPlanModeTool/ExitPlanModeV2Tool.ts +493 -0
- package/src/tools/ExitPlanModeTool/UI.tsx +82 -0
- package/src/tools/ExitPlanModeTool/constants.ts +2 -0
- package/src/tools/ExitPlanModeTool/prompt.ts +29 -0
- package/src/tools/ExitWorktreeTool/ExitWorktreeTool.ts +329 -0
- package/src/tools/ExitWorktreeTool/UI.tsx +25 -0
- package/src/tools/ExitWorktreeTool/constants.ts +1 -0
- package/src/tools/ExitWorktreeTool/prompt.ts +32 -0
- package/src/tools/FileEditTool/FileEditTool.ts +625 -0
- package/src/tools/FileEditTool/UI.tsx +289 -0
- package/src/tools/FileEditTool/constants.ts +11 -0
- package/src/tools/FileEditTool/prompt.ts +28 -0
- package/src/tools/FileEditTool/types.ts +85 -0
- package/src/tools/FileEditTool/utils.ts +775 -0
- package/src/tools/FileReadTool/FileReadTool.ts +1183 -0
- package/src/tools/FileReadTool/UI.tsx +185 -0
- package/src/tools/FileReadTool/imageProcessor.ts +94 -0
- package/src/tools/FileReadTool/limits.ts +92 -0
- package/src/tools/FileReadTool/prompt.ts +49 -0
- package/src/tools/FileWriteTool/FileWriteTool.ts +434 -0
- package/src/tools/FileWriteTool/UI.tsx +405 -0
- package/src/tools/FileWriteTool/prompt.ts +18 -0
- package/src/tools/GlobTool/GlobTool.ts +198 -0
- package/src/tools/GlobTool/UI.tsx +63 -0
- package/src/tools/GlobTool/prompt.ts +7 -0
- package/src/tools/GrepTool/GrepTool.ts +577 -0
- package/src/tools/GrepTool/UI.tsx +201 -0
- package/src/tools/GrepTool/prompt.ts +18 -0
- package/src/tools/LSPTool/LSPTool.ts +860 -0
- package/src/tools/LSPTool/UI.tsx +228 -0
- package/src/tools/LSPTool/formatters.ts +592 -0
- package/src/tools/LSPTool/prompt.ts +21 -0
- package/src/tools/LSPTool/schemas.ts +215 -0
- package/src/tools/LSPTool/symbolContext.ts +90 -0
- package/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +123 -0
- package/src/tools/ListMcpResourcesTool/UI.tsx +29 -0
- package/src/tools/ListMcpResourcesTool/prompt.ts +20 -0
- package/src/tools/MCPTool/MCPTool.ts +77 -0
- package/src/tools/MCPTool/UI.tsx +403 -0
- package/src/tools/MCPTool/classifyForCollapse.ts +604 -0
- package/src/tools/MCPTool/prompt.ts +3 -0
- package/src/tools/McpAuthTool/McpAuthTool.ts +215 -0
- package/src/tools/NotebookEditTool/NotebookEditTool.ts +490 -0
- package/src/tools/NotebookEditTool/UI.tsx +93 -0
- package/src/tools/NotebookEditTool/constants.ts +2 -0
- package/src/tools/NotebookEditTool/prompt.ts +3 -0
- package/src/tools/PowerShellTool/PowerShellTool.tsx +1001 -0
- package/src/tools/PowerShellTool/UI.tsx +131 -0
- package/src/tools/PowerShellTool/clmTypes.ts +211 -0
- package/src/tools/PowerShellTool/commandSemantics.ts +142 -0
- package/src/tools/PowerShellTool/commonParameters.ts +30 -0
- package/src/tools/PowerShellTool/destructiveCommandWarning.ts +109 -0
- package/src/tools/PowerShellTool/gitSafety.ts +176 -0
- package/src/tools/PowerShellTool/modeValidation.ts +404 -0
- package/src/tools/PowerShellTool/pathValidation.ts +2049 -0
- package/src/tools/PowerShellTool/powershellPermissions.ts +1648 -0
- package/src/tools/PowerShellTool/powershellSecurity.ts +1090 -0
- package/src/tools/PowerShellTool/prompt.ts +145 -0
- package/src/tools/PowerShellTool/readOnlyValidation.ts +1823 -0
- package/src/tools/PowerShellTool/toolName.ts +2 -0
- package/src/tools/REPLTool/constants.ts +46 -0
- package/src/tools/REPLTool/primitiveTools.ts +39 -0
- package/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +158 -0
- package/src/tools/ReadMcpResourceTool/UI.tsx +37 -0
- package/src/tools/ReadMcpResourceTool/prompt.ts +16 -0
- package/src/tools/RemoteTriggerTool/RemoteTriggerTool.ts +161 -0
- package/src/tools/RemoteTriggerTool/UI.tsx +17 -0
- package/src/tools/RemoteTriggerTool/prompt.ts +15 -0
- package/src/tools/ScheduleCronTool/CronCreateTool.ts +157 -0
- package/src/tools/ScheduleCronTool/CronDeleteTool.ts +95 -0
- package/src/tools/ScheduleCronTool/CronListTool.ts +97 -0
- package/src/tools/ScheduleCronTool/UI.tsx +60 -0
- package/src/tools/ScheduleCronTool/prompt.ts +135 -0
- package/src/tools/SendMessageTool/SendMessageTool.ts +917 -0
- package/src/tools/SendMessageTool/UI.tsx +31 -0
- package/src/tools/SendMessageTool/constants.ts +1 -0
- package/src/tools/SendMessageTool/prompt.ts +49 -0
- package/src/tools/SkillTool/SkillTool.ts +1108 -0
- package/src/tools/SkillTool/UI.tsx +128 -0
- package/src/tools/SkillTool/constants.ts +1 -0
- package/src/tools/SkillTool/prompt.ts +241 -0
- package/src/tools/SleepTool/prompt.ts +17 -0
- package/src/tools/SyntheticOutputTool/SyntheticOutputTool.ts +163 -0
- package/src/tools/TaskCreateTool/TaskCreateTool.ts +138 -0
- package/src/tools/TaskCreateTool/constants.ts +1 -0
- package/src/tools/TaskCreateTool/prompt.ts +56 -0
- package/src/tools/TaskGetTool/TaskGetTool.ts +128 -0
- package/src/tools/TaskGetTool/constants.ts +1 -0
- package/src/tools/TaskGetTool/prompt.ts +24 -0
- package/src/tools/TaskListTool/TaskListTool.ts +116 -0
- package/src/tools/TaskListTool/constants.ts +1 -0
- package/src/tools/TaskListTool/prompt.ts +49 -0
- package/src/tools/TaskOutputTool/TaskOutputTool.tsx +584 -0
- package/src/tools/TaskOutputTool/constants.ts +1 -0
- package/src/tools/TaskStopTool/TaskStopTool.ts +131 -0
- package/src/tools/TaskStopTool/UI.tsx +41 -0
- package/src/tools/TaskStopTool/prompt.ts +8 -0
- package/src/tools/TaskUpdateTool/TaskUpdateTool.ts +406 -0
- package/src/tools/TaskUpdateTool/constants.ts +1 -0
- package/src/tools/TaskUpdateTool/prompt.ts +77 -0
- package/src/tools/TeamCreateTool/TeamCreateTool.ts +240 -0
- package/src/tools/TeamCreateTool/UI.tsx +6 -0
- package/src/tools/TeamCreateTool/constants.ts +1 -0
- package/src/tools/TeamCreateTool/prompt.ts +113 -0
- package/src/tools/TeamDeleteTool/TeamDeleteTool.ts +139 -0
- package/src/tools/TeamDeleteTool/UI.tsx +20 -0
- package/src/tools/TeamDeleteTool/constants.ts +1 -0
- package/src/tools/TeamDeleteTool/prompt.ts +16 -0
- package/src/tools/TodoWriteTool/TodoWriteTool.ts +115 -0
- package/src/tools/TodoWriteTool/constants.ts +1 -0
- package/src/tools/TodoWriteTool/prompt.ts +184 -0
- package/src/tools/ToolSearchTool/ToolSearchTool.ts +471 -0
- package/src/tools/ToolSearchTool/constants.ts +1 -0
- package/src/tools/ToolSearchTool/prompt.ts +121 -0
- package/src/tools/TungstenTool/TungstenTool.js +2 -0
- package/src/tools/TungstenTool/TungstenTool.ts +1 -0
- package/src/tools/WebFetchTool/UI.tsx +72 -0
- package/src/tools/WebFetchTool/WebFetchTool.ts +318 -0
- package/src/tools/WebFetchTool/preapproved.ts +166 -0
- package/src/tools/WebFetchTool/prompt.ts +46 -0
- package/src/tools/WebFetchTool/utils.ts +530 -0
- package/src/tools/WebSearchTool/UI.tsx +101 -0
- package/src/tools/WebSearchTool/WebSearchTool.ts +435 -0
- package/src/tools/WebSearchTool/prompt.ts +34 -0
- package/src/tools/shared/gitOperationTracking.ts +277 -0
- package/src/tools/shared/spawnMultiAgent.ts +1093 -0
- package/src/tools/testing/TestingPermissionTool.tsx +74 -0
- package/src/tools/utils.ts +40 -0
- package/src/tools.ts +389 -0
- package/src/types/command.ts +216 -0
- package/src/types/connectorText.js +5 -0
- package/src/types/connectorText.ts +1 -0
- package/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +865 -0
- package/src/types/generated/events_mono/common/v1/auth.ts +100 -0
- package/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +223 -0
- package/src/types/generated/google/protobuf/timestamp.ts +187 -0
- package/src/types/hooks.ts +290 -0
- package/src/types/ids.ts +44 -0
- package/src/types/logs.ts +330 -0
- package/src/types/permissions.ts +441 -0
- package/src/types/plugin.ts +363 -0
- package/src/types/textInputTypes.ts +387 -0
- package/src/upstreamproxy/relay.ts +455 -0
- package/src/upstreamproxy/upstreamproxy.ts +285 -0
- package/src/utils/CircularBuffer.ts +84 -0
- package/src/utils/Cursor.ts +1530 -0
- package/src/utils/QueryGuard.ts +121 -0
- package/src/utils/Shell.ts +474 -0
- package/src/utils/ShellCommand.ts +465 -0
- package/src/utils/abortController.ts +99 -0
- package/src/utils/activityManager.ts +164 -0
- package/src/utils/advisor.ts +145 -0
- package/src/utils/agentContext.ts +178 -0
- package/src/utils/agentId.ts +99 -0
- package/src/utils/agentSwarmsEnabled.ts +44 -0
- package/src/utils/agenticSessionSearch.ts +307 -0
- package/src/utils/analyzeContext.ts +1382 -0
- package/src/utils/ansiToPng.ts +334 -0
- package/src/utils/ansiToSvg.ts +272 -0
- package/src/utils/api.ts +718 -0
- package/src/utils/apiPreconnect.ts +72 -0
- package/src/utils/appleTerminalBackup.ts +124 -0
- package/src/utils/argumentSubstitution.ts +145 -0
- package/src/utils/array.ts +13 -0
- package/src/utils/asciicast.ts +239 -0
- package/src/utils/attachments.ts +3997 -0
- package/src/utils/attribution.ts +393 -0
- package/src/utils/auth.ts +2007 -0
- package/src/utils/authFileDescriptor.ts +196 -0
- package/src/utils/authPortable.ts +19 -0
- package/src/utils/autoModeDenials.ts +26 -0
- package/src/utils/autoRunIssue.tsx +122 -0
- package/src/utils/autoUpdater.ts +562 -0
- package/src/utils/aws.ts +74 -0
- package/src/utils/awsAuthStatusManager.ts +81 -0
- package/src/utils/background/remote/preconditions.ts +235 -0
- package/src/utils/background/remote/remoteSession.ts +98 -0
- package/src/utils/backgroundHousekeeping.ts +94 -0
- package/src/utils/bash/ParsedCommand.ts +318 -0
- package/src/utils/bash/ShellSnapshot.ts +582 -0
- package/src/utils/bash/ast.ts +2679 -0
- package/src/utils/bash/bashParser.ts +4436 -0
- package/src/utils/bash/bashPipeCommand.ts +294 -0
- package/src/utils/bash/commands.ts +1339 -0
- package/src/utils/bash/heredoc.ts +733 -0
- package/src/utils/bash/parser.ts +230 -0
- package/src/utils/bash/prefix.ts +204 -0
- package/src/utils/bash/registry.ts +53 -0
- package/src/utils/bash/shellCompletion.ts +259 -0
- package/src/utils/bash/shellPrefix.ts +28 -0
- package/src/utils/bash/shellQuote.ts +304 -0
- package/src/utils/bash/shellQuoting.ts +128 -0
- package/src/utils/bash/specs/alias.ts +14 -0
- package/src/utils/bash/specs/index.ts +18 -0
- package/src/utils/bash/specs/nohup.ts +13 -0
- package/src/utils/bash/specs/pyright.ts +91 -0
- package/src/utils/bash/specs/sleep.ts +13 -0
- package/src/utils/bash/specs/srun.ts +31 -0
- package/src/utils/bash/specs/time.ts +13 -0
- package/src/utils/bash/specs/timeout.ts +20 -0
- package/src/utils/bash/treeSitterAnalysis.ts +506 -0
- package/src/utils/betas.ts +438 -0
- package/src/utils/billing.ts +78 -0
- package/src/utils/binaryCheck.ts +53 -0
- package/src/utils/browser.ts +68 -0
- package/src/utils/bufferedWriter.ts +100 -0
- package/src/utils/bundledMode.ts +22 -0
- package/src/utils/caCerts.ts +115 -0
- package/src/utils/caCertsConfig.ts +88 -0
- package/src/utils/cachePaths.ts +38 -0
- package/src/utils/classifierApprovals.ts +88 -0
- package/src/utils/classifierApprovalsHook.ts +17 -0
- package/src/utils/claudeCodeHints.ts +193 -0
- package/src/utils/claudeDesktop.ts +152 -0
- package/src/utils/claudeInChrome/chromeNativeHost.ts +527 -0
- package/src/utils/claudeInChrome/common.ts +540 -0
- package/src/utils/claudeInChrome/mcpServer.ts +293 -0
- package/src/utils/claudeInChrome/prompt.ts +83 -0
- package/src/utils/claudeInChrome/setup.ts +400 -0
- package/src/utils/claudeInChrome/setupPortable.ts +233 -0
- package/src/utils/claudeInChrome/toolRendering.tsx +262 -0
- package/src/utils/claudemd.ts +1479 -0
- package/src/utils/cleanup.ts +602 -0
- package/src/utils/cleanupRegistry.ts +25 -0
- package/src/utils/cliArgs.ts +60 -0
- package/src/utils/cliHighlight.ts +54 -0
- package/src/utils/codeIndexing.ts +206 -0
- package/src/utils/collapseBackgroundBashNotifications.ts +84 -0
- package/src/utils/collapseHookSummaries.ts +59 -0
- package/src/utils/collapseReadSearch.ts +1109 -0
- package/src/utils/collapseTeammateShutdowns.ts +55 -0
- package/src/utils/combinedAbortSignal.ts +47 -0
- package/src/utils/commandLifecycle.ts +21 -0
- package/src/utils/commitAttribution.ts +961 -0
- package/src/utils/completionCache.ts +166 -0
- package/src/utils/computerUse/appNames.ts +196 -0
- package/src/utils/computerUse/cleanup.ts +86 -0
- package/src/utils/computerUse/common.ts +61 -0
- package/src/utils/computerUse/computerUseLock.ts +215 -0
- package/src/utils/computerUse/drainRunLoop.ts +79 -0
- package/src/utils/computerUse/escHotkey.ts +54 -0
- package/src/utils/computerUse/executor.ts +658 -0
- package/src/utils/computerUse/gates.ts +72 -0
- package/src/utils/computerUse/hostAdapter.ts +69 -0
- package/src/utils/computerUse/inputLoader.ts +30 -0
- package/src/utils/computerUse/mcpServer.ts +106 -0
- package/src/utils/computerUse/setup.ts +53 -0
- package/src/utils/computerUse/swiftLoader.ts +23 -0
- package/src/utils/computerUse/toolRendering.tsx +125 -0
- package/src/utils/computerUse/wrapper.tsx +336 -0
- package/src/utils/concurrentSessions.ts +204 -0
- package/src/utils/config.ts +1817 -0
- package/src/utils/configConstants.ts +21 -0
- package/src/utils/contentArray.ts +51 -0
- package/src/utils/context.ts +221 -0
- package/src/utils/contextAnalysis.ts +272 -0
- package/src/utils/contextSuggestions.ts +235 -0
- package/src/utils/controlMessageCompat.ts +32 -0
- package/src/utils/conversationRecovery.ts +597 -0
- package/src/utils/cron.ts +308 -0
- package/src/utils/cronJitterConfig.ts +75 -0
- package/src/utils/cronScheduler.ts +565 -0
- package/src/utils/cronTasks.ts +458 -0
- package/src/utils/cronTasksLock.ts +195 -0
- package/src/utils/crossProjectResume.ts +75 -0
- package/src/utils/crypto.ts +13 -0
- package/src/utils/cwd.ts +32 -0
- package/src/utils/debug.ts +268 -0
- package/src/utils/debugFilter.ts +157 -0
- package/src/utils/deepLink/banner.ts +123 -0
- package/src/utils/deepLink/parseDeepLink.ts +170 -0
- package/src/utils/deepLink/protocolHandler.ts +136 -0
- package/src/utils/deepLink/registerProtocol.ts +348 -0
- package/src/utils/deepLink/terminalLauncher.ts +557 -0
- package/src/utils/deepLink/terminalPreference.ts +54 -0
- package/src/utils/desktopDeepLink.ts +236 -0
- package/src/utils/detectRepository.ts +178 -0
- package/src/utils/diagLogs.ts +94 -0
- package/src/utils/diff.ts +177 -0
- package/src/utils/directMemberMessage.ts +69 -0
- package/src/utils/displayTags.ts +51 -0
- package/src/utils/doctorContextWarnings.ts +265 -0
- package/src/utils/doctorDiagnostic.ts +625 -0
- package/src/utils/dxt/helpers.ts +88 -0
- package/src/utils/dxt/zip.ts +226 -0
- package/src/utils/earlyInput.ts +191 -0
- package/src/utils/editor.ts +183 -0
- package/src/utils/effort.ts +329 -0
- package/src/utils/embeddedTools.ts +29 -0
- package/src/utils/env.ts +347 -0
- package/src/utils/envDynamic.ts +151 -0
- package/src/utils/envUtils.ts +183 -0
- package/src/utils/envValidation.ts +38 -0
- package/src/utils/errorLogSink.ts +235 -0
- package/src/utils/errors.ts +238 -0
- package/src/utils/exampleCommands.ts +184 -0
- package/src/utils/execFileNoThrow.ts +150 -0
- package/src/utils/execFileNoThrowPortable.ts +89 -0
- package/src/utils/execSyncWrapper.ts +38 -0
- package/src/utils/exportRenderer.tsx +98 -0
- package/src/utils/extraUsage.ts +23 -0
- package/src/utils/fastMode.ts +532 -0
- package/src/utils/file.ts +584 -0
- package/src/utils/fileHistory.ts +1115 -0
- package/src/utils/fileOperationAnalytics.ts +71 -0
- package/src/utils/filePersistence/filePersistence.ts +287 -0
- package/src/utils/filePersistence/outputsScanner.ts +126 -0
- package/src/utils/fileRead.ts +102 -0
- package/src/utils/fileReadCache.ts +96 -0
- package/src/utils/fileStateCache.ts +142 -0
- package/src/utils/findExecutable.ts +17 -0
- package/src/utils/fingerprint.ts +76 -0
- package/src/utils/forkedAgent.ts +689 -0
- package/src/utils/format.ts +308 -0
- package/src/utils/formatBriefTimestamp.ts +81 -0
- package/src/utils/fpsTracker.ts +47 -0
- package/src/utils/frontmatterParser.ts +370 -0
- package/src/utils/fsOperations.ts +770 -0
- package/src/utils/fullscreen.ts +202 -0
- package/src/utils/generatedFiles.ts +136 -0
- package/src/utils/generators.ts +88 -0
- package/src/utils/genericProcessUtils.ts +184 -0
- package/src/utils/getWorktreePaths.ts +70 -0
- package/src/utils/getWorktreePathsPortable.ts +27 -0
- package/src/utils/ghPrStatus.ts +106 -0
- package/src/utils/git/gitConfigParser.ts +277 -0
- package/src/utils/git/gitFilesystem.ts +699 -0
- package/src/utils/git/gitignore.ts +99 -0
- package/src/utils/git.ts +926 -0
- package/src/utils/gitDiff.ts +532 -0
- package/src/utils/gitSettings.ts +18 -0
- package/src/utils/github/ghAuthStatus.ts +29 -0
- package/src/utils/githubRepoPathMapping.ts +162 -0
- package/src/utils/glob.ts +130 -0
- package/src/utils/gracefulShutdown.ts +529 -0
- package/src/utils/groupToolUses.ts +182 -0
- package/src/utils/handlePromptSubmit.ts +610 -0
- package/src/utils/hash.ts +46 -0
- package/src/utils/headlessProfiler.ts +178 -0
- package/src/utils/heapDumpService.ts +303 -0
- package/src/utils/heatmap.ts +198 -0
- package/src/utils/highlightMatch.tsx +28 -0
- package/src/utils/hooks/AsyncHookRegistry.ts +309 -0
- package/src/utils/hooks/apiQueryHookHelper.ts +141 -0
- package/src/utils/hooks/execAgentHook.ts +339 -0
- package/src/utils/hooks/execHttpHook.ts +242 -0
- package/src/utils/hooks/execPromptHook.ts +211 -0
- package/src/utils/hooks/fileChangedWatcher.ts +191 -0
- package/src/utils/hooks/hookEvents.ts +192 -0
- package/src/utils/hooks/hookHelpers.ts +83 -0
- package/src/utils/hooks/hooksConfigManager.ts +400 -0
- package/src/utils/hooks/hooksConfigSnapshot.ts +133 -0
- package/src/utils/hooks/hooksSettings.ts +271 -0
- package/src/utils/hooks/postSamplingHooks.ts +70 -0
- package/src/utils/hooks/registerFrontmatterHooks.ts +67 -0
- package/src/utils/hooks/registerSkillHooks.ts +64 -0
- package/src/utils/hooks/sessionHooks.ts +447 -0
- package/src/utils/hooks/skillImprovement.ts +267 -0
- package/src/utils/hooks/ssrfGuard.ts +294 -0
- package/src/utils/hooks.ts +5022 -0
- package/src/utils/horizontalScroll.ts +137 -0
- package/src/utils/http.ts +136 -0
- package/src/utils/hyperlink.ts +39 -0
- package/src/utils/iTermBackup.ts +73 -0
- package/src/utils/ide.ts +1494 -0
- package/src/utils/idePathConversion.ts +90 -0
- package/src/utils/idleTimeout.ts +53 -0
- package/src/utils/imagePaste.ts +416 -0
- package/src/utils/imageResizer.ts +880 -0
- package/src/utils/imageStore.ts +167 -0
- package/src/utils/imageValidation.ts +104 -0
- package/src/utils/immediateCommand.ts +15 -0
- package/src/utils/inProcessTeammateHelpers.ts +102 -0
- package/src/utils/ink.ts +26 -0
- package/src/utils/intl.ts +94 -0
- package/src/utils/jetbrains.ts +191 -0
- package/src/utils/json.ts +277 -0
- package/src/utils/jsonRead.ts +16 -0
- package/src/utils/keyboardShortcuts.ts +14 -0
- package/src/utils/lazySchema.ts +8 -0
- package/src/utils/listSessionsImpl.ts +454 -0
- package/src/utils/localInstaller.ts +162 -0
- package/src/utils/lockfile.ts +43 -0
- package/src/utils/log.ts +362 -0
- package/src/utils/logoV2Utils.ts +350 -0
- package/src/utils/mailbox.ts +73 -0
- package/src/utils/managedEnv.ts +199 -0
- package/src/utils/managedEnvConstants.ts +191 -0
- package/src/utils/markdown.ts +381 -0
- package/src/utils/markdownConfigLoader.ts +600 -0
- package/src/utils/mcp/dateTimeParser.ts +121 -0
- package/src/utils/mcp/elicitationValidation.ts +336 -0
- package/src/utils/mcpInstructionsDelta.ts +130 -0
- package/src/utils/mcpOutputStorage.ts +189 -0
- package/src/utils/mcpValidation.ts +208 -0
- package/src/utils/mcpWebSocketTransport.ts +200 -0
- package/src/utils/memoize.ts +269 -0
- package/src/utils/memory/types.ts +12 -0
- package/src/utils/memory/versions.ts +8 -0
- package/src/utils/memoryFileDetection.ts +289 -0
- package/src/utils/messagePredicates.ts +8 -0
- package/src/utils/messageQueueManager.ts +547 -0
- package/src/utils/messages/mappers.ts +290 -0
- package/src/utils/messages/systemInit.ts +96 -0
- package/src/utils/messages.ts +5512 -0
- package/src/utils/model/agent.ts +157 -0
- package/src/utils/model/aliases.ts +25 -0
- package/src/utils/model/antModels.ts +64 -0
- package/src/utils/model/bedrock.ts +265 -0
- package/src/utils/model/check1mAccess.ts +72 -0
- package/src/utils/model/configs.ts +118 -0
- package/src/utils/model/contextWindowUpgradeCheck.ts +47 -0
- package/src/utils/model/deprecation.ts +101 -0
- package/src/utils/model/model.ts +634 -0
- package/src/utils/model/modelAllowlist.ts +170 -0
- package/src/utils/model/modelCapabilities.ts +118 -0
- package/src/utils/model/modelOptions.ts +540 -0
- package/src/utils/model/modelStrings.ts +166 -0
- package/src/utils/model/modelSupportOverrides.ts +50 -0
- package/src/utils/model/providers.ts +46 -0
- package/src/utils/model/validateModel.ts +159 -0
- package/src/utils/modelCost.ts +235 -0
- package/src/utils/modifiers.ts +36 -0
- package/src/utils/mtls.ts +179 -0
- package/src/utils/nativeInstaller/download.ts +523 -0
- package/src/utils/nativeInstaller/index.ts +18 -0
- package/src/utils/nativeInstaller/installer.ts +1708 -0
- package/src/utils/nativeInstaller/packageManagers.ts +336 -0
- package/src/utils/nativeInstaller/pidLock.ts +433 -0
- package/src/utils/notebook.ts +224 -0
- package/src/utils/objectGroupBy.ts +18 -0
- package/src/utils/pasteStore.ts +104 -0
- package/src/utils/path.ts +155 -0
- package/src/utils/pdf.ts +300 -0
- package/src/utils/pdfUtils.ts +70 -0
- package/src/utils/peerAddress.ts +21 -0
- package/src/utils/permissions/PermissionMode.ts +141 -0
- package/src/utils/permissions/PermissionPromptToolResultSchema.ts +127 -0
- package/src/utils/permissions/PermissionResult.ts +35 -0
- package/src/utils/permissions/PermissionRule.ts +40 -0
- package/src/utils/permissions/PermissionUpdate.ts +389 -0
- package/src/utils/permissions/PermissionUpdateSchema.ts +78 -0
- package/src/utils/permissions/autoModeState.ts +39 -0
- package/src/utils/permissions/bashClassifier.ts +61 -0
- package/src/utils/permissions/bypassPermissionsKillswitch.ts +155 -0
- package/src/utils/permissions/classifierDecision.ts +98 -0
- package/src/utils/permissions/classifierShared.ts +39 -0
- package/src/utils/permissions/dangerousPatterns.ts +80 -0
- package/src/utils/permissions/denialTracking.ts +45 -0
- package/src/utils/permissions/filesystem.ts +1777 -0
- package/src/utils/permissions/getNextPermissionMode.ts +101 -0
- package/src/utils/permissions/pathValidation.ts +485 -0
- package/src/utils/permissions/permissionExplainer.ts +250 -0
- package/src/utils/permissions/permissionRuleParser.ts +198 -0
- package/src/utils/permissions/permissionSetup.ts +1532 -0
- package/src/utils/permissions/permissions.ts +1486 -0
- package/src/utils/permissions/permissionsLoader.ts +296 -0
- package/src/utils/permissions/shadowedRuleDetection.ts +234 -0
- package/src/utils/permissions/shellRuleMatching.ts +228 -0
- package/src/utils/permissions/yoloClassifier.ts +1495 -0
- package/src/utils/planModeV2.ts +95 -0
- package/src/utils/plans.ts +397 -0
- package/src/utils/platform.ts +150 -0
- package/src/utils/plugins/addDirPluginSettings.ts +71 -0
- package/src/utils/plugins/cacheUtils.ts +196 -0
- package/src/utils/plugins/dependencyResolver.ts +305 -0
- package/src/utils/plugins/fetchTelemetry.ts +135 -0
- package/src/utils/plugins/gitAvailability.ts +69 -0
- package/src/utils/plugins/headlessPluginInstall.ts +174 -0
- package/src/utils/plugins/hintRecommendation.ts +164 -0
- package/src/utils/plugins/installCounts.ts +292 -0
- package/src/utils/plugins/installedPluginsManager.ts +1268 -0
- package/src/utils/plugins/loadPluginAgents.ts +348 -0
- package/src/utils/plugins/loadPluginCommands.ts +946 -0
- package/src/utils/plugins/loadPluginHooks.ts +287 -0
- package/src/utils/plugins/loadPluginOutputStyles.ts +178 -0
- package/src/utils/plugins/lspPluginIntegration.ts +387 -0
- package/src/utils/plugins/lspRecommendation.ts +374 -0
- package/src/utils/plugins/managedPlugins.ts +27 -0
- package/src/utils/plugins/marketplaceHelpers.ts +592 -0
- package/src/utils/plugins/marketplaceManager.ts +2643 -0
- package/src/utils/plugins/mcpPluginIntegration.ts +634 -0
- package/src/utils/plugins/mcpbHandler.ts +968 -0
- package/src/utils/plugins/officialMarketplace.ts +25 -0
- package/src/utils/plugins/officialMarketplaceGcs.ts +216 -0
- package/src/utils/plugins/officialMarketplaceStartupCheck.ts +439 -0
- package/src/utils/plugins/orphanedPluginFilter.ts +114 -0
- package/src/utils/plugins/parseMarketplaceInput.ts +162 -0
- package/src/utils/plugins/performStartupChecks.tsx +70 -0
- package/src/utils/plugins/pluginAutoupdate.ts +284 -0
- package/src/utils/plugins/pluginBlocklist.ts +127 -0
- package/src/utils/plugins/pluginDirectories.ts +178 -0
- package/src/utils/plugins/pluginFlagging.ts +208 -0
- package/src/utils/plugins/pluginIdentifier.ts +123 -0
- package/src/utils/plugins/pluginInstallationHelpers.ts +595 -0
- package/src/utils/plugins/pluginLoader.ts +3302 -0
- package/src/utils/plugins/pluginOptionsStorage.ts +400 -0
- package/src/utils/plugins/pluginPolicy.ts +20 -0
- package/src/utils/plugins/pluginStartupCheck.ts +341 -0
- package/src/utils/plugins/pluginVersioning.ts +157 -0
- package/src/utils/plugins/reconciler.ts +265 -0
- package/src/utils/plugins/refresh.ts +215 -0
- package/src/utils/plugins/schemas.ts +1681 -0
- package/src/utils/plugins/validatePlugin.ts +903 -0
- package/src/utils/plugins/walkPluginMarkdown.ts +69 -0
- package/src/utils/plugins/zipCache.ts +406 -0
- package/src/utils/plugins/zipCacheAdapters.ts +164 -0
- package/src/utils/powershell/dangerousCmdlets.ts +185 -0
- package/src/utils/powershell/parser.ts +1804 -0
- package/src/utils/powershell/staticPrefix.ts +316 -0
- package/src/utils/preflightChecks.tsx +151 -0
- package/src/utils/privacyLevel.ts +55 -0
- package/src/utils/process.ts +68 -0
- package/src/utils/processUserInput/processBashCommand.tsx +140 -0
- package/src/utils/processUserInput/processSlashCommand.tsx +922 -0
- package/src/utils/processUserInput/processTextPrompt.ts +100 -0
- package/src/utils/processUserInput/processUserInput.ts +605 -0
- package/src/utils/profilerBase.ts +46 -0
- package/src/utils/promptCategory.ts +49 -0
- package/src/utils/promptEditor.ts +188 -0
- package/src/utils/promptShellExecution.ts +183 -0
- package/src/utils/proxy.ts +426 -0
- package/src/utils/queryContext.ts +179 -0
- package/src/utils/queryHelpers.ts +552 -0
- package/src/utils/queryProfiler.ts +301 -0
- package/src/utils/queueProcessor.ts +95 -0
- package/src/utils/readEditContext.ts +227 -0
- package/src/utils/readFileInRange.ts +383 -0
- package/src/utils/releaseNotes.ts +360 -0
- package/src/utils/renderOptions.ts +77 -0
- package/src/utils/ripgrep.ts +679 -0
- package/src/utils/sandbox/sandbox-adapter.ts +985 -0
- package/src/utils/sandbox/sandbox-ui-utils.ts +12 -0
- package/src/utils/sanitization.ts +91 -0
- package/src/utils/screenshotClipboard.ts +121 -0
- package/src/utils/sdkEventQueue.ts +134 -0
- package/src/utils/secureStorage/fallbackStorage.ts +70 -0
- package/src/utils/secureStorage/index.ts +17 -0
- package/src/utils/secureStorage/keychainPrefetch.ts +116 -0
- package/src/utils/secureStorage/macOsKeychainHelpers.ts +111 -0
- package/src/utils/secureStorage/macOsKeychainStorage.ts +231 -0
- package/src/utils/secureStorage/plainTextStorage.ts +84 -0
- package/src/utils/semanticBoolean.ts +29 -0
- package/src/utils/semanticNumber.ts +36 -0
- package/src/utils/semver.ts +59 -0
- package/src/utils/sequential.ts +56 -0
- package/src/utils/sessionActivity.ts +133 -0
- package/src/utils/sessionEnvVars.ts +22 -0
- package/src/utils/sessionEnvironment.ts +166 -0
- package/src/utils/sessionFileAccessHooks.ts +250 -0
- package/src/utils/sessionIngressAuth.ts +140 -0
- package/src/utils/sessionRestore.ts +551 -0
- package/src/utils/sessionStart.ts +232 -0
- package/src/utils/sessionState.ts +150 -0
- package/src/utils/sessionStorage.ts +5105 -0
- package/src/utils/sessionStoragePortable.ts +793 -0
- package/src/utils/sessionTitle.ts +129 -0
- package/src/utils/sessionUrl.ts +64 -0
- package/src/utils/set.ts +53 -0
- package/src/utils/settings/allErrors.ts +32 -0
- package/src/utils/settings/applySettingsChange.ts +92 -0
- package/src/utils/settings/changeDetector.ts +488 -0
- package/src/utils/settings/constants.ts +202 -0
- package/src/utils/settings/internalWrites.ts +37 -0
- package/src/utils/settings/managedPath.ts +34 -0
- package/src/utils/settings/mdm/constants.ts +81 -0
- package/src/utils/settings/mdm/rawRead.ts +130 -0
- package/src/utils/settings/mdm/settings.ts +316 -0
- package/src/utils/settings/permissionValidation.ts +262 -0
- package/src/utils/settings/pluginOnlyPolicy.ts +60 -0
- package/src/utils/settings/schemaOutput.ts +8 -0
- package/src/utils/settings/settings.ts +1015 -0
- package/src/utils/settings/settingsCache.ts +80 -0
- package/src/utils/settings/toolValidationConfig.ts +103 -0
- package/src/utils/settings/types.ts +1148 -0
- package/src/utils/settings/validateEditTool.ts +45 -0
- package/src/utils/settings/validation.ts +265 -0
- package/src/utils/settings/validationTips.ts +164 -0
- package/src/utils/shell/bashProvider.ts +255 -0
- package/src/utils/shell/outputLimits.ts +14 -0
- package/src/utils/shell/powershellDetection.ts +107 -0
- package/src/utils/shell/powershellProvider.ts +123 -0
- package/src/utils/shell/prefix.ts +367 -0
- package/src/utils/shell/readOnlyCommandValidation.ts +1893 -0
- package/src/utils/shell/resolveDefaultShell.ts +14 -0
- package/src/utils/shell/shellProvider.ts +33 -0
- package/src/utils/shell/shellToolUtils.ts +22 -0
- package/src/utils/shell/specPrefix.ts +241 -0
- package/src/utils/shellConfig.ts +167 -0
- package/src/utils/sideQuery.ts +222 -0
- package/src/utils/sideQuestion.ts +155 -0
- package/src/utils/signal.ts +43 -0
- package/src/utils/sinks.ts +16 -0
- package/src/utils/skills/skillChangeDetector.ts +311 -0
- package/src/utils/slashCommandParsing.ts +60 -0
- package/src/utils/sleep.ts +84 -0
- package/src/utils/sliceAnsi.ts +91 -0
- package/src/utils/slowOperations.ts +286 -0
- package/src/utils/standaloneAgent.ts +23 -0
- package/src/utils/startupProfiler.ts +194 -0
- package/src/utils/staticRender.tsx +116 -0
- package/src/utils/stats.ts +1061 -0
- package/src/utils/statsCache.ts +434 -0
- package/src/utils/status.tsx +362 -0
- package/src/utils/statusNoticeDefinitions.tsx +198 -0
- package/src/utils/statusNoticeHelpers.ts +20 -0
- package/src/utils/stream.ts +76 -0
- package/src/utils/streamJsonStdoutGuard.ts +123 -0
- package/src/utils/streamlinedTransform.ts +201 -0
- package/src/utils/stringUtils.ts +235 -0
- package/src/utils/subprocessEnv.ts +99 -0
- package/src/utils/suggestions/commandSuggestions.ts +567 -0
- package/src/utils/suggestions/directoryCompletion.ts +263 -0
- package/src/utils/suggestions/shellHistoryCompletion.ts +119 -0
- package/src/utils/suggestions/skillUsageTracking.ts +55 -0
- package/src/utils/suggestions/slackChannelSuggestions.ts +209 -0
- package/src/utils/swarm/It2SetupPrompt.tsx +380 -0
- package/src/utils/swarm/backends/ITermBackend.ts +370 -0
- package/src/utils/swarm/backends/InProcessBackend.ts +339 -0
- package/src/utils/swarm/backends/PaneBackendExecutor.ts +354 -0
- package/src/utils/swarm/backends/TmuxBackend.ts +764 -0
- package/src/utils/swarm/backends/detection.ts +128 -0
- package/src/utils/swarm/backends/it2Setup.ts +245 -0
- package/src/utils/swarm/backends/registry.ts +464 -0
- package/src/utils/swarm/backends/teammateModeSnapshot.ts +87 -0
- package/src/utils/swarm/backends/types.ts +311 -0
- package/src/utils/swarm/constants.ts +33 -0
- package/src/utils/swarm/inProcessRunner.ts +1552 -0
- package/src/utils/swarm/leaderPermissionBridge.ts +54 -0
- package/src/utils/swarm/permissionSync.ts +928 -0
- package/src/utils/swarm/reconnection.ts +119 -0
- package/src/utils/swarm/spawnInProcess.ts +328 -0
- package/src/utils/swarm/spawnUtils.ts +146 -0
- package/src/utils/swarm/teamHelpers.ts +683 -0
- package/src/utils/swarm/teammateInit.ts +129 -0
- package/src/utils/swarm/teammateLayoutManager.ts +107 -0
- package/src/utils/swarm/teammateModel.ts +10 -0
- package/src/utils/swarm/teammatePromptAddendum.ts +18 -0
- package/src/utils/systemDirectories.ts +74 -0
- package/src/utils/systemPrompt.ts +123 -0
- package/src/utils/systemPromptType.ts +14 -0
- package/src/utils/systemTheme.ts +119 -0
- package/src/utils/taggedId.ts +54 -0
- package/src/utils/task/TaskOutput.ts +390 -0
- package/src/utils/task/diskOutput.ts +451 -0
- package/src/utils/task/framework.ts +308 -0
- package/src/utils/task/outputFormatting.ts +38 -0
- package/src/utils/task/sdkProgress.ts +36 -0
- package/src/utils/tasks.ts +862 -0
- package/src/utils/teamDiscovery.ts +81 -0
- package/src/utils/teamMemoryOps.ts +88 -0
- package/src/utils/teammate.ts +292 -0
- package/src/utils/teammateContext.ts +96 -0
- package/src/utils/teammateMailbox.ts +1183 -0
- package/src/utils/telemetry/betaSessionTracing.ts +491 -0
- package/src/utils/telemetry/bigqueryExporter.ts +252 -0
- package/src/utils/telemetry/events.ts +75 -0
- package/src/utils/telemetry/instrumentation.ts +825 -0
- package/src/utils/telemetry/logger.ts +26 -0
- package/src/utils/telemetry/perfettoTracing.ts +1120 -0
- package/src/utils/telemetry/pluginTelemetry.ts +289 -0
- package/src/utils/telemetry/sessionTracing.ts +927 -0
- package/src/utils/telemetry/skillLoadedEvent.ts +39 -0
- package/src/utils/telemetryAttributes.ts +71 -0
- package/src/utils/teleport/api.ts +466 -0
- package/src/utils/teleport/environmentSelection.ts +77 -0
- package/src/utils/teleport/environments.ts +120 -0
- package/src/utils/teleport/gitBundle.ts +292 -0
- package/src/utils/teleport.tsx +1226 -0
- package/src/utils/tempfile.ts +31 -0
- package/src/utils/terminal.ts +131 -0
- package/src/utils/terminalPanel.ts +191 -0
- package/src/utils/textHighlighting.ts +166 -0
- package/src/utils/theme.ts +639 -0
- package/src/utils/thinking.ts +162 -0
- package/src/utils/timeouts.ts +39 -0
- package/src/utils/tmuxSocket.ts +427 -0
- package/src/utils/todo/types.ts +18 -0
- package/src/utils/tokenBudget.ts +73 -0
- package/src/utils/tokens.ts +261 -0
- package/src/utils/toolErrors.ts +132 -0
- package/src/utils/toolPool.ts +79 -0
- package/src/utils/toolResultStorage.ts +1040 -0
- package/src/utils/toolSchemaCache.ts +26 -0
- package/src/utils/toolSearch.ts +756 -0
- package/src/utils/transcriptSearch.ts +202 -0
- package/src/utils/treeify.ts +170 -0
- package/src/utils/truncate.ts +179 -0
- package/src/utils/ultraplan/ccrSession.ts +349 -0
- package/src/utils/ultraplan/keyword.ts +127 -0
- package/src/utils/ultraplan/prompt.txt +1 -0
- package/src/utils/unaryLogging.ts +39 -0
- package/src/utils/undercover.ts +89 -0
- package/src/utils/user.ts +194 -0
- package/src/utils/userAgent.ts +10 -0
- package/src/utils/userPromptKeywords.ts +27 -0
- package/src/utils/uuid.ts +27 -0
- package/src/utils/warningHandler.ts +121 -0
- package/src/utils/which.ts +82 -0
- package/src/utils/windowsPaths.ts +173 -0
- package/src/utils/withResolvers.ts +13 -0
- package/src/utils/words.ts +800 -0
- package/src/utils/workloadContext.ts +57 -0
- package/src/utils/worktree.ts +1519 -0
- package/src/utils/worktreeModeEnabled.ts +11 -0
- package/src/utils/xdg.ts +65 -0
- package/src/utils/xml.ts +16 -0
- package/src/utils/yaml.ts +15 -0
- package/src/utils/zodToJsonSchema.ts +23 -0
- package/src/vim/motions.ts +82 -0
- package/src/vim/operators.ts +556 -0
- package/src/vim/textObjects.ts +186 -0
- package/src/vim/transitions.ts +490 -0
- package/src/vim/types.ts +199 -0
- package/src/voice/voiceModeEnabled.ts +54 -0
- package/start.js +1 -0
|
@@ -0,0 +1,1012 @@
|
|
|
1
|
+
import React, { type RefObject, useEffect, useRef } from 'react';
|
|
2
|
+
import { useNotifications } from '../context/notifications.js';
|
|
3
|
+
import { useCopyOnSelect, useSelectionBgColor } from '../hooks/useCopyOnSelect.js';
|
|
4
|
+
import type { ScrollBoxHandle } from '../ink/components/ScrollBox.js';
|
|
5
|
+
import { useSelection } from '../ink/hooks/use-selection.js';
|
|
6
|
+
import type { FocusMove, SelectionState } from '../ink/selection.js';
|
|
7
|
+
import { isXtermJs } from '../ink/terminal.js';
|
|
8
|
+
import { getClipboardPath } from '../ink/termio/osc.js';
|
|
9
|
+
// eslint-disable-next-line custom-rules/prefer-use-keybindings -- Esc needs conditional propagation based on selection state
|
|
10
|
+
import { type Key, useInput } from '../ink.js';
|
|
11
|
+
import { useKeybindings } from '../keybindings/useKeybinding.js';
|
|
12
|
+
import { logForDebugging } from '../utils/debug.js';
|
|
13
|
+
type Props = {
|
|
14
|
+
scrollRef: RefObject<ScrollBoxHandle | null>;
|
|
15
|
+
isActive: boolean;
|
|
16
|
+
/** Called after every scroll action with the resulting sticky state and
|
|
17
|
+
* the handle (for reading scrollTop/scrollHeight post-scroll). */
|
|
18
|
+
onScroll?: (sticky: boolean, handle: ScrollBoxHandle) => void;
|
|
19
|
+
/** Enables modal pager keys (g/G, ctrl+u/d/b/f). Only safe when there
|
|
20
|
+
* is no text input competing for those characters — i.e. transcript
|
|
21
|
+
* mode. Defaults to false. When true, G works regardless of editorMode
|
|
22
|
+
* and sticky state; ctrl+u/d/b/f don't conflict with kill-line/exit/
|
|
23
|
+
* task:background/kill-agents (none are mounted, or they mount after
|
|
24
|
+
* this component so stopImmediatePropagation wins). */
|
|
25
|
+
isModal?: boolean;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// Terminals send one SGR wheel event per intended row (verified in Ghostty
|
|
29
|
+
// src/Surface.zig: `for (0..@abs(y.delta)) |_| { mouseReport(.four, ...) }`).
|
|
30
|
+
// Ghostty already 3×'s discrete wheel ticks before that loop; trackpad
|
|
31
|
+
// precision scroll is pixels/cell_size. 1 event = 1 row intended — use it
|
|
32
|
+
// as the base, and ramp a multiplier when events arrive rapidly. The
|
|
33
|
+
// pendingScrollDelta accumulator + proportional drain in
|
|
34
|
+
// render-node-to-output handles smooth catch-up on big bursts.
|
|
35
|
+
//
|
|
36
|
+
// xterm.js (VS Code/Cursor/Windsurf integrated terminals) sends exactly 1
|
|
37
|
+
// event per wheel notch — no pre-amplification. A separate exponential
|
|
38
|
+
// decay curve (below) compensates for the lower event rate, with burst
|
|
39
|
+
// detection and gap-dependent caps tuned to VS Code's event patterns.
|
|
40
|
+
|
|
41
|
+
// Native terminals: hard-window linear ramp. Events closer than the window
|
|
42
|
+
// ramp the multiplier; idle gaps reset to `base` (default 1). Some emulators
|
|
43
|
+
// pre-multiply at their layer (ghostty discrete=3 sends 3 SGR events/notch;
|
|
44
|
+
// iTerm2 "faster scroll" similar) — base=1 is correct there. Others send 1
|
|
45
|
+
// event/notch — users on those can set CLAUDE_CODE_SCROLL_SPEED=3 to match
|
|
46
|
+
// vim/nvim/opencode app-side defaults. We can't detect which, so knob it.
|
|
47
|
+
const WHEEL_ACCEL_WINDOW_MS = 40;
|
|
48
|
+
const WHEEL_ACCEL_STEP = 0.3;
|
|
49
|
+
const WHEEL_ACCEL_MAX = 6;
|
|
50
|
+
|
|
51
|
+
// Encoder bounce debounce + wheel-mode decay curve. Worn/cheap optical
|
|
52
|
+
// encoders emit spurious reverse-direction ticks during fast spins — measured
|
|
53
|
+
// 28% of events on Boris's mouse (2026-03-17, iTerm2). Pattern is always
|
|
54
|
+
// flip-then-flip-back; trackpads produce ZERO flips (0/458 in same recording).
|
|
55
|
+
// A confirmed bounce proves a physical wheel is attached — engage the same
|
|
56
|
+
// exponential-decay curve the xterm.js path uses (it's already tuned), with
|
|
57
|
+
// a higher cap to compensate for the lower event rate (~9/sec vs VS Code's
|
|
58
|
+
// ~30/sec). Trackpad can't reach this path.
|
|
59
|
+
//
|
|
60
|
+
// The decay curve gives: 1st click after idle = 1 row (precision), 2nd = 10,
|
|
61
|
+
// 3rd = cap. Slowing down decays smoothly toward 1 — no separate idle
|
|
62
|
+
// threshold needed, large gaps just have m≈0 → mult→1. Wheel mode is STICKY:
|
|
63
|
+
// once a bounce confirms it's a mouse, the decay curve applies until an idle
|
|
64
|
+
// gap or trackpad-flick-burst signals a possible device switch.
|
|
65
|
+
const WHEEL_BOUNCE_GAP_MAX_MS = 200; // flip-back must arrive within this
|
|
66
|
+
// Mouse is ~9 events/sec vs VS Code's ~30 — STEP is 3× xterm.js's 5 to
|
|
67
|
+
// compensate. At gap=100ms (m≈0.63): one click gives 1+15*0.63≈10.5.
|
|
68
|
+
const WHEEL_MODE_STEP = 15;
|
|
69
|
+
const WHEEL_MODE_CAP = 15;
|
|
70
|
+
// Max mult growth per event. Without this, the +STEP*m term jumps mult
|
|
71
|
+
// from 1→10 in one event when wheelMode engages mid-scroll (bounce
|
|
72
|
+
// detected after N events in trackpad mode at mult=1). User sees scroll
|
|
73
|
+
// suddenly go 10× faster. Cap=3 gives 1→4→7→10→13→15 over ~0.5s at
|
|
74
|
+
// 9 events/sec — smooth ramp instead of a jump. Decay is unaffected
|
|
75
|
+
// (target<mult wins the min).
|
|
76
|
+
const WHEEL_MODE_RAMP = 3;
|
|
77
|
+
// Device-switch disengage: mouse finger-repositions max at ~830ms (measured);
|
|
78
|
+
// trackpad between-gesture pauses are 2000ms+. An idle gap above this means
|
|
79
|
+
// the user stopped — might have switched devices. Disengage; the next mouse
|
|
80
|
+
// bounce re-engages. Trackpad slow swipe (no <5ms bursts, so the burst-count
|
|
81
|
+
// guard doesn't catch it) is what this protects against.
|
|
82
|
+
const WHEEL_MODE_IDLE_DISENGAGE_MS = 1500;
|
|
83
|
+
|
|
84
|
+
// xterm.js: exponential decay. momentum=0.5^(gap/hl) — slow click → m≈0
|
|
85
|
+
// → mult→1 (precision); fast → m≈1 → carries momentum. Steady-state
|
|
86
|
+
// = 1 + step×m/(1-m), capped. Measured event rates in VS Code (wheel.log):
|
|
87
|
+
// sustained scroll sends events at 20-50ms gaps (20-40 Hz), plus 0-2ms
|
|
88
|
+
// same-batch bursts on flicks. Cap is low (3–6, gap-dependent) because event
|
|
89
|
+
// frequency is high — at 40 Hz × 6 = 240 rows/sec max demand, which the
|
|
90
|
+
// adaptive drain at ~200fps (measured) handles. Higher cap → pending explosion.
|
|
91
|
+
// Tuned empirically (boris 2026-03). See docs/research/terminal-scroll-*.
|
|
92
|
+
const WHEEL_DECAY_HALFLIFE_MS = 150;
|
|
93
|
+
const WHEEL_DECAY_STEP = 5;
|
|
94
|
+
// Same-batch events (<BURST_MS) arrive in one stdin batch — the terminal
|
|
95
|
+
// is doing proportional reporting. Treat as 1 row/event like native.
|
|
96
|
+
const WHEEL_BURST_MS = 5;
|
|
97
|
+
// Cap boundary: slow events (≥GAP_MS) cap low for short smooth drains;
|
|
98
|
+
// fast events cap higher for throughput (adaptive drain handles backlog).
|
|
99
|
+
const WHEEL_DECAY_GAP_MS = 80;
|
|
100
|
+
const WHEEL_DECAY_CAP_SLOW = 3; // gap ≥ GAP_MS: precision
|
|
101
|
+
const WHEEL_DECAY_CAP_FAST = 6; // gap < GAP_MS: throughput
|
|
102
|
+
// Idle threshold: gaps beyond this reset to the kick value (2) so the
|
|
103
|
+
// first click after a pause feels responsive regardless of direction.
|
|
104
|
+
const WHEEL_DECAY_IDLE_MS = 500;
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Whether a keypress should clear the virtual text selection. Mimics
|
|
108
|
+
* native terminal selection: any keystroke clears, EXCEPT modified nav
|
|
109
|
+
* keys (shift/opt/cmd + arrow/home/end/page*). In native macOS contexts,
|
|
110
|
+
* shift+nav extends selection, and cmd/opt+nav are often intercepted by
|
|
111
|
+
* the terminal emulator for scrollback nav — neither disturbs selection.
|
|
112
|
+
* Bare arrows DO clear (user's cursor moves, native deselects). Wheel is
|
|
113
|
+
* excluded — scroll:lineUp/Down already clears via the keybinding path.
|
|
114
|
+
*/
|
|
115
|
+
export function shouldClearSelectionOnKey(key: Key): boolean {
|
|
116
|
+
if (key.wheelUp || key.wheelDown) return false;
|
|
117
|
+
const isNav = key.leftArrow || key.rightArrow || key.upArrow || key.downArrow || key.home || key.end || key.pageUp || key.pageDown;
|
|
118
|
+
if (isNav && (key.shift || key.meta || key.super)) return false;
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Map a keypress to a selection focus move (keyboard extension). Only
|
|
124
|
+
* shift extends — that's the universal text-selection modifier. cmd
|
|
125
|
+
* (super) only arrives via kitty keyboard protocol — in most terminals
|
|
126
|
+
* cmd+arrow is intercepted by the emulator and never reaches the pty, so
|
|
127
|
+
* no super branch. shift+home/end covers line-edge jumps (and fn+shift+
|
|
128
|
+
* left/right on mac laptops = shift+home/end). shift+opt (word-jump) not
|
|
129
|
+
* yet implemented — falls through to shouldClearSelectionOnKey which
|
|
130
|
+
* preserves (modified nav). Returns null for non-extend keys.
|
|
131
|
+
*/
|
|
132
|
+
export function selectionFocusMoveForKey(key: Key): FocusMove | null {
|
|
133
|
+
if (!key.shift || key.meta) return null;
|
|
134
|
+
if (key.leftArrow) return 'left';
|
|
135
|
+
if (key.rightArrow) return 'right';
|
|
136
|
+
if (key.upArrow) return 'up';
|
|
137
|
+
if (key.downArrow) return 'down';
|
|
138
|
+
if (key.home) return 'lineStart';
|
|
139
|
+
if (key.end) return 'lineEnd';
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
export type WheelAccelState = {
|
|
143
|
+
time: number;
|
|
144
|
+
mult: number;
|
|
145
|
+
dir: 0 | 1 | -1;
|
|
146
|
+
xtermJs: boolean;
|
|
147
|
+
/** Carried fractional scroll (xterm.js only). scrollBy floors, so without
|
|
148
|
+
* this a mult of 1.5 gives 1 row every time. Carrying the remainder gives
|
|
149
|
+
* 1,2,1,2 on average for mult=1.5 — correct throughput over time. */
|
|
150
|
+
frac: number;
|
|
151
|
+
/** Native-path baseline rows/event. Reset value on idle/reversal; ramp
|
|
152
|
+
* builds on top. xterm.js path ignores this (own kick=2 tuning). */
|
|
153
|
+
base: number;
|
|
154
|
+
/** Deferred direction flip (native only). Might be encoder bounce or a
|
|
155
|
+
* real reversal — resolved by the NEXT event. Real reversal loses 1 row
|
|
156
|
+
* of latency; bounce is swallowed and triggers wheel mode. The flip's
|
|
157
|
+
* direction and timestamp are derivable (it's always -state.dir at
|
|
158
|
+
* state.time) so this is just a marker. */
|
|
159
|
+
pendingFlip: boolean;
|
|
160
|
+
/** Set true once a bounce is confirmed (flip-then-flip-back within
|
|
161
|
+
* BOUNCE_GAP_MAX). Sticky — but disengaged on idle gap >1500ms OR a
|
|
162
|
+
* trackpad-signature burst (see burstCount). State lives in a useRef so
|
|
163
|
+
* it persists across device switches; the disengages handle mouse→trackpad. */
|
|
164
|
+
wheelMode: boolean;
|
|
165
|
+
/** Consecutive <5ms events. Trackpad flick produces 100+ at <5ms; mouse
|
|
166
|
+
* produces ≤3 (verified in /tmp/wheel-tune.txt). 5+ in a row → trackpad
|
|
167
|
+
* signature → disengage wheel mode so device-switch doesn't leak mouse
|
|
168
|
+
* accel to trackpad. */
|
|
169
|
+
burstCount: number;
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
/** Compute rows for one wheel event, mutating accel state. Returns 0 when
|
|
173
|
+
* a direction flip is deferred for bounce detection — call sites no-op on
|
|
174
|
+
* step=0 (scrollBy(0) is a no-op, onScroll(false) is idempotent). Exported
|
|
175
|
+
* for tests. */
|
|
176
|
+
export function computeWheelStep(state: WheelAccelState, dir: 1 | -1, now: number): number {
|
|
177
|
+
if (!state.xtermJs) {
|
|
178
|
+
// Device-switch guard ①: idle disengage. Runs BEFORE pendingFlip resolve
|
|
179
|
+
// so a pending bounce (28% of last-mouse-events) doesn't bypass it via
|
|
180
|
+
// the real-reversal early return. state.time is either the last committed
|
|
181
|
+
// event OR the deferred flip — both count as "last activity".
|
|
182
|
+
if (state.wheelMode && now - state.time > WHEEL_MODE_IDLE_DISENGAGE_MS) {
|
|
183
|
+
state.wheelMode = false;
|
|
184
|
+
state.burstCount = 0;
|
|
185
|
+
state.mult = state.base;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Resolve any deferred flip BEFORE touching state.time/dir — we need the
|
|
189
|
+
// pre-flip state.dir to distinguish bounce (flip-back) from real reversal
|
|
190
|
+
// (flip persisted), and state.time (= bounce timestamp) for the gap check.
|
|
191
|
+
if (state.pendingFlip) {
|
|
192
|
+
state.pendingFlip = false;
|
|
193
|
+
if (dir !== state.dir || now - state.time > WHEEL_BOUNCE_GAP_MAX_MS) {
|
|
194
|
+
// Real reversal: new dir persisted, OR flip-back arrived too late.
|
|
195
|
+
// Commit. The deferred event's 1 row is lost (acceptable latency).
|
|
196
|
+
state.dir = dir;
|
|
197
|
+
state.time = now;
|
|
198
|
+
state.mult = state.base;
|
|
199
|
+
return Math.floor(state.mult);
|
|
200
|
+
}
|
|
201
|
+
// Bounce confirmed: flipped back to original dir within the window.
|
|
202
|
+
// state.dir/mult unchanged from pre-bounce. state.time was advanced to
|
|
203
|
+
// the bounce below, so gap here = flip-back interval — reflects the
|
|
204
|
+
// user's actual click cadence (bounce IS a physical click, just noisy).
|
|
205
|
+
state.wheelMode = true;
|
|
206
|
+
}
|
|
207
|
+
const gap = now - state.time;
|
|
208
|
+
if (dir !== state.dir && state.dir !== 0) {
|
|
209
|
+
// Flip. Defer — next event decides bounce vs. real reversal. Advance
|
|
210
|
+
// time (but NOT dir/mult): if this turns out to be a bounce, the
|
|
211
|
+
// confirm event's gap will be the flip-back interval, which reflects
|
|
212
|
+
// the user's actual click rate. The bounce IS a physical wheel click,
|
|
213
|
+
// just misread by the encoder — it should count toward cadence.
|
|
214
|
+
state.pendingFlip = true;
|
|
215
|
+
state.time = now;
|
|
216
|
+
return 0;
|
|
217
|
+
}
|
|
218
|
+
state.dir = dir;
|
|
219
|
+
state.time = now;
|
|
220
|
+
|
|
221
|
+
// ─── MOUSE (wheel mode, sticky until device-switch signal) ───
|
|
222
|
+
if (state.wheelMode) {
|
|
223
|
+
if (gap < WHEEL_BURST_MS) {
|
|
224
|
+
// Same-batch burst check (ported from xterm.js): iTerm2 proportional
|
|
225
|
+
// reporting sends 2+ SGR events for one detent when macOS gives
|
|
226
|
+
// delta>1. Without this, the 2nd event at gap<1ms has m≈1 → STEP*m=15
|
|
227
|
+
// → one gentle click gives 1+15=16 rows.
|
|
228
|
+
//
|
|
229
|
+
// Device-switch guard ②: trackpad flick produces 100+ events at <5ms
|
|
230
|
+
// (measured); mouse produces ≤3. 5+ consecutive → trackpad flick.
|
|
231
|
+
if (++state.burstCount >= 5) {
|
|
232
|
+
state.wheelMode = false;
|
|
233
|
+
state.burstCount = 0;
|
|
234
|
+
state.mult = state.base;
|
|
235
|
+
} else {
|
|
236
|
+
return 1;
|
|
237
|
+
}
|
|
238
|
+
} else {
|
|
239
|
+
state.burstCount = 0;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// Re-check: may have disengaged above.
|
|
243
|
+
if (state.wheelMode) {
|
|
244
|
+
// xterm.js decay curve with STEP×3, higher cap. No idle threshold —
|
|
245
|
+
// the curve handles it (gap=1000ms → m≈0.01 → mult≈1). No frac —
|
|
246
|
+
// rounding loss is minor at high mult, and frac persisting across idle
|
|
247
|
+
// was causing off-by-one on the first click back.
|
|
248
|
+
const m = Math.pow(0.5, gap / WHEEL_DECAY_HALFLIFE_MS);
|
|
249
|
+
const cap = Math.max(WHEEL_MODE_CAP, state.base * 2);
|
|
250
|
+
const next = 1 + (state.mult - 1) * m + WHEEL_MODE_STEP * m;
|
|
251
|
+
state.mult = Math.min(cap, next, state.mult + WHEEL_MODE_RAMP);
|
|
252
|
+
return Math.floor(state.mult);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// ─── TRACKPAD / HI-RES (native, non-wheel-mode) ───
|
|
256
|
+
// Tight 40ms burst window: sub-40ms events ramp, anything slower resets.
|
|
257
|
+
// Trackpad flick delivers 200+ events at <20ms gaps → rails to cap 6.
|
|
258
|
+
// Trackpad slow swipe at 40-400ms gaps → resets every event → 1 row each.
|
|
259
|
+
if (gap > WHEEL_ACCEL_WINDOW_MS) {
|
|
260
|
+
state.mult = state.base;
|
|
261
|
+
} else {
|
|
262
|
+
const cap = Math.max(WHEEL_ACCEL_MAX, state.base * 2);
|
|
263
|
+
state.mult = Math.min(cap, state.mult + WHEEL_ACCEL_STEP);
|
|
264
|
+
}
|
|
265
|
+
return Math.floor(state.mult);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// ─── VSCODE (xterm.js, browser wheel events) ───
|
|
269
|
+
// Browser wheel events — no encoder bounce, no SGR bursts. Decay curve
|
|
270
|
+
// unchanged from the original tuning. Same formula shape as wheel mode
|
|
271
|
+
// above (keep in sync) but STEP=5 not 15 — higher event rate here.
|
|
272
|
+
const gap = now - state.time;
|
|
273
|
+
const sameDir = dir === state.dir;
|
|
274
|
+
state.time = now;
|
|
275
|
+
state.dir = dir;
|
|
276
|
+
// xterm.js path. Debug log shows two patterns: (a) 20-50ms gaps during
|
|
277
|
+
// sustained scroll (~30 Hz), (b) <5ms same-batch bursts on flicks. For
|
|
278
|
+
// (b) give 1 row/event — the burst count IS the acceleration, same as
|
|
279
|
+
// native. For (a) the decay curve gives 3-5 rows. For sparse events
|
|
280
|
+
// (100ms+, slow deliberate scroll) the curve gives 1-3.
|
|
281
|
+
if (sameDir && gap < WHEEL_BURST_MS) return 1;
|
|
282
|
+
if (!sameDir || gap > WHEEL_DECAY_IDLE_MS) {
|
|
283
|
+
// Direction reversal or long idle: start at 2 (not 1) so the first
|
|
284
|
+
// click after a pause moves a visible amount. Without this, idle-
|
|
285
|
+
// then-resume in the same direction decays to mult≈1 (1 row).
|
|
286
|
+
state.mult = 2;
|
|
287
|
+
state.frac = 0;
|
|
288
|
+
} else {
|
|
289
|
+
const m = Math.pow(0.5, gap / WHEEL_DECAY_HALFLIFE_MS);
|
|
290
|
+
const cap = gap >= WHEEL_DECAY_GAP_MS ? WHEEL_DECAY_CAP_SLOW : WHEEL_DECAY_CAP_FAST;
|
|
291
|
+
state.mult = Math.min(cap, 1 + (state.mult - 1) * m + WHEEL_DECAY_STEP * m);
|
|
292
|
+
}
|
|
293
|
+
const total = state.mult + state.frac;
|
|
294
|
+
const rows = Math.floor(total);
|
|
295
|
+
state.frac = total - rows;
|
|
296
|
+
return rows;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/** Read CLAUDE_CODE_SCROLL_SPEED, default 1, clamp (0, 20].
|
|
300
|
+
* Some terminals pre-multiply wheel events (ghostty discrete=3, iTerm2
|
|
301
|
+
* "faster scroll") — base=1 is correct there. Others send 1 event/notch —
|
|
302
|
+
* set CLAUDE_CODE_SCROLL_SPEED=3 to match vim/nvim/opencode. We can't
|
|
303
|
+
* detect which kind of terminal we're in, hence the knob. Called lazily
|
|
304
|
+
* from initAndLogWheelAccel so globalSettings.env has loaded. */
|
|
305
|
+
export function readScrollSpeedBase(): number {
|
|
306
|
+
const raw = process.env.CLAUDE_CODE_SCROLL_SPEED;
|
|
307
|
+
if (!raw) return 1;
|
|
308
|
+
const n = parseFloat(raw);
|
|
309
|
+
return Number.isNaN(n) || n <= 0 ? 1 : Math.min(n, 20);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/** Initial wheel accel state. xtermJs=true selects the decay curve.
|
|
313
|
+
* base is the native-path baseline rows/event (default 1). */
|
|
314
|
+
export function initWheelAccel(xtermJs = false, base = 1): WheelAccelState {
|
|
315
|
+
return {
|
|
316
|
+
time: 0,
|
|
317
|
+
mult: base,
|
|
318
|
+
dir: 0,
|
|
319
|
+
xtermJs,
|
|
320
|
+
frac: 0,
|
|
321
|
+
base,
|
|
322
|
+
pendingFlip: false,
|
|
323
|
+
wheelMode: false,
|
|
324
|
+
burstCount: 0
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// Lazy-init helper. isXtermJs() combines the TERM_PROGRAM env check + async
|
|
329
|
+
// XTVERSION probe — the probe may not have resolved at render time, so this
|
|
330
|
+
// is called on the first wheel event (>>50ms after startup) when it's settled.
|
|
331
|
+
// Logs detected mode once so --debug users can verify SSH detection worked.
|
|
332
|
+
// The renderer also calls isXtermJsHost() (in render-node-to-output) to
|
|
333
|
+
// select the drain algorithm — no state to pass through.
|
|
334
|
+
function initAndLogWheelAccel(): WheelAccelState {
|
|
335
|
+
const xtermJs = isXtermJs();
|
|
336
|
+
const base = readScrollSpeedBase();
|
|
337
|
+
logForDebugging(`wheel accel: ${xtermJs ? 'decay (xterm.js)' : 'window (native)'} · base=${base} · TERM_PROGRAM=${process.env.TERM_PROGRAM ?? 'unset'}`);
|
|
338
|
+
return initWheelAccel(xtermJs, base);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// Drag-to-scroll: when dragging past the viewport edge, scroll by this many
|
|
342
|
+
// rows every AUTOSCROLL_INTERVAL_MS. Mode 1002 mouse tracking only fires on
|
|
343
|
+
// cell change, so a timer is needed to continue scrolling while stationary.
|
|
344
|
+
const AUTOSCROLL_LINES = 2;
|
|
345
|
+
const AUTOSCROLL_INTERVAL_MS = 50;
|
|
346
|
+
// Hard cap on consecutive auto-scroll ticks. If the release event is lost
|
|
347
|
+
// (mouse released outside terminal window — some emulators don't capture the
|
|
348
|
+
// pointer and drop the release), isDragging stays true and the timer would
|
|
349
|
+
// run until a scroll boundary. Cap bounds the damage; any new drag motion
|
|
350
|
+
// event restarts the count via check()→start().
|
|
351
|
+
const AUTOSCROLL_MAX_TICKS = 200; // 10s @ 50ms
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Keyboard scroll navigation for the fullscreen layout's message scroll box.
|
|
355
|
+
* PgUp/PgDn scroll by half-viewport. Mouse wheel scrolls by a few lines.
|
|
356
|
+
* Scrolling breaks sticky mode; Ctrl+End re-enables it. Wheeling down at
|
|
357
|
+
* the bottom also re-enables sticky so new content follows naturally.
|
|
358
|
+
*/
|
|
359
|
+
export function ScrollKeybindingHandler({
|
|
360
|
+
scrollRef,
|
|
361
|
+
isActive,
|
|
362
|
+
onScroll,
|
|
363
|
+
isModal = false
|
|
364
|
+
}: Props): React.ReactNode {
|
|
365
|
+
const selection = useSelection();
|
|
366
|
+
const {
|
|
367
|
+
addNotification
|
|
368
|
+
} = useNotifications();
|
|
369
|
+
// Lazy-inited on first wheel event so the XTVERSION probe (fired at
|
|
370
|
+
// raw-mode-enable time) has resolved by then — initializing in useRef()
|
|
371
|
+
// would read getWheelBase() before the probe reply arrives over SSH.
|
|
372
|
+
const wheelAccel = useRef<WheelAccelState | null>(null);
|
|
373
|
+
function showCopiedToast(text: string): void {
|
|
374
|
+
// getClipboardPath reads env synchronously — predicts what setClipboard
|
|
375
|
+
// did (native pbcopy / tmux load-buffer / raw OSC 52) so we can tell
|
|
376
|
+
// the user whether paste will Just Work or needs prefix+].
|
|
377
|
+
const path = getClipboardPath();
|
|
378
|
+
const n = text.length;
|
|
379
|
+
let msg: string;
|
|
380
|
+
switch (path) {
|
|
381
|
+
case 'native':
|
|
382
|
+
msg = `copied ${n} chars to clipboard`;
|
|
383
|
+
break;
|
|
384
|
+
case 'tmux-buffer':
|
|
385
|
+
msg = `copied ${n} chars to tmux buffer · paste with prefix + ]`;
|
|
386
|
+
break;
|
|
387
|
+
case 'osc52':
|
|
388
|
+
msg = `sent ${n} chars via OSC 52 · check terminal clipboard settings if paste fails`;
|
|
389
|
+
break;
|
|
390
|
+
}
|
|
391
|
+
addNotification({
|
|
392
|
+
key: 'selection-copied',
|
|
393
|
+
text: msg,
|
|
394
|
+
color: 'suggestion',
|
|
395
|
+
priority: 'immediate',
|
|
396
|
+
timeoutMs: path === 'native' ? 2000 : 4000
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
function copyAndToast(): void {
|
|
400
|
+
const text_0 = selection.copySelection();
|
|
401
|
+
if (text_0) showCopiedToast(text_0);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// Translate selection to track a keyboard page jump. Selection coords are
|
|
405
|
+
// screen-buffer-local; a scrollTo that moves content by N rows must also
|
|
406
|
+
// shift anchor+focus by N so the highlight stays on the same text (native
|
|
407
|
+
// terminal behavior: selection moves with content, clips at viewport
|
|
408
|
+
// edges). Rows that scroll out of the viewport are captured into
|
|
409
|
+
// scrolledOffAbove/Below before the scroll so getSelectedText still
|
|
410
|
+
// returns the full text. Wheel scroll (scroll:lineUp/Down via scrollBy)
|
|
411
|
+
// still clears — its async pendingScrollDelta drain means the actual
|
|
412
|
+
// delta isn't known synchronously (follow-up).
|
|
413
|
+
function translateSelectionForJump(s: ScrollBoxHandle, delta: number): void {
|
|
414
|
+
const sel = selection.getState();
|
|
415
|
+
if (!sel?.anchor || !sel.focus) return;
|
|
416
|
+
const top = s.getViewportTop();
|
|
417
|
+
const bottom = top + s.getViewportHeight() - 1;
|
|
418
|
+
// Only translate if the selection is ON scrollbox content. Selections
|
|
419
|
+
// in the footer/prompt/StickyPromptHeader are on static text — the
|
|
420
|
+
// scroll doesn't move what's under them. Same guard as ink.tsx's
|
|
421
|
+
// auto-follow translate (commit 36a8d154).
|
|
422
|
+
if (sel.anchor.row < top || sel.anchor.row > bottom) return;
|
|
423
|
+
// Cross-boundary: anchor in scrollbox, focus in footer/header. Mirror
|
|
424
|
+
// ink.tsx's Flag-3 guard — fall through without shifting OR capturing.
|
|
425
|
+
// The static endpoint pins the selection; shifting would teleport it
|
|
426
|
+
// into scrollbox content.
|
|
427
|
+
if (sel.focus.row < top || sel.focus.row > bottom) return;
|
|
428
|
+
const max = Math.max(0, s.getScrollHeight() - s.getViewportHeight());
|
|
429
|
+
const cur = s.getScrollTop() + s.getPendingDelta();
|
|
430
|
+
// Actual scroll distance after boundary clamp. jumpBy may call
|
|
431
|
+
// scrollToBottom when target >= max but the view can't move past max,
|
|
432
|
+
// so the selection shift is bounded here.
|
|
433
|
+
const actual = Math.max(0, Math.min(max, cur + delta)) - cur;
|
|
434
|
+
if (actual === 0) return;
|
|
435
|
+
if (actual > 0) {
|
|
436
|
+
// Scrolling down: content moves up. Rows at the TOP leave viewport.
|
|
437
|
+
// Anchor+focus shift -actual so they track the content that moved up.
|
|
438
|
+
selection.captureScrolledRows(top, top + actual - 1, 'above');
|
|
439
|
+
selection.shiftSelection(-actual, top, bottom);
|
|
440
|
+
} else {
|
|
441
|
+
// Scrolling up: content moves down. Rows at the BOTTOM leave viewport.
|
|
442
|
+
const a = -actual;
|
|
443
|
+
selection.captureScrolledRows(bottom - a + 1, bottom, 'below');
|
|
444
|
+
selection.shiftSelection(a, top, bottom);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
useKeybindings({
|
|
448
|
+
'scroll:pageUp': () => {
|
|
449
|
+
const s_0 = scrollRef.current;
|
|
450
|
+
if (!s_0) return;
|
|
451
|
+
const d = -Math.max(1, Math.floor(s_0.getViewportHeight() / 2));
|
|
452
|
+
translateSelectionForJump(s_0, d);
|
|
453
|
+
const sticky = jumpBy(s_0, d);
|
|
454
|
+
onScroll?.(sticky, s_0);
|
|
455
|
+
},
|
|
456
|
+
'scroll:pageDown': () => {
|
|
457
|
+
const s_1 = scrollRef.current;
|
|
458
|
+
if (!s_1) return;
|
|
459
|
+
const d_0 = Math.max(1, Math.floor(s_1.getViewportHeight() / 2));
|
|
460
|
+
translateSelectionForJump(s_1, d_0);
|
|
461
|
+
const sticky_0 = jumpBy(s_1, d_0);
|
|
462
|
+
onScroll?.(sticky_0, s_1);
|
|
463
|
+
},
|
|
464
|
+
'scroll:lineUp': () => {
|
|
465
|
+
// Wheel: scrollBy accumulates into pendingScrollDelta, drained async
|
|
466
|
+
// by the renderer. captureScrolledRows can't read the outgoing rows
|
|
467
|
+
// before they leave (drain is non-deterministic). Clear for now.
|
|
468
|
+
selection.clearSelection();
|
|
469
|
+
const s_2 = scrollRef.current;
|
|
470
|
+
// Return false (not consumed) when the ScrollBox content fits —
|
|
471
|
+
// scroll would be a no-op. Lets a child component's handler take
|
|
472
|
+
// the wheel event instead (e.g. Settings Config's list navigation
|
|
473
|
+
// inside the centered Modal, where the paginated slice always fits).
|
|
474
|
+
if (!s_2 || s_2.getScrollHeight() <= s_2.getViewportHeight()) return false;
|
|
475
|
+
wheelAccel.current ??= initAndLogWheelAccel();
|
|
476
|
+
scrollUp(s_2, computeWheelStep(wheelAccel.current, -1, performance.now()));
|
|
477
|
+
onScroll?.(false, s_2);
|
|
478
|
+
},
|
|
479
|
+
'scroll:lineDown': () => {
|
|
480
|
+
selection.clearSelection();
|
|
481
|
+
const s_3 = scrollRef.current;
|
|
482
|
+
if (!s_3 || s_3.getScrollHeight() <= s_3.getViewportHeight()) return false;
|
|
483
|
+
wheelAccel.current ??= initAndLogWheelAccel();
|
|
484
|
+
const step = computeWheelStep(wheelAccel.current, 1, performance.now());
|
|
485
|
+
const reachedBottom = scrollDown(s_3, step);
|
|
486
|
+
onScroll?.(reachedBottom, s_3);
|
|
487
|
+
},
|
|
488
|
+
'scroll:top': () => {
|
|
489
|
+
const s_4 = scrollRef.current;
|
|
490
|
+
if (!s_4) return;
|
|
491
|
+
translateSelectionForJump(s_4, -(s_4.getScrollTop() + s_4.getPendingDelta()));
|
|
492
|
+
s_4.scrollTo(0);
|
|
493
|
+
onScroll?.(false, s_4);
|
|
494
|
+
},
|
|
495
|
+
'scroll:bottom': () => {
|
|
496
|
+
const s_5 = scrollRef.current;
|
|
497
|
+
if (!s_5) return;
|
|
498
|
+
const max_0 = Math.max(0, s_5.getScrollHeight() - s_5.getViewportHeight());
|
|
499
|
+
translateSelectionForJump(s_5, max_0 - (s_5.getScrollTop() + s_5.getPendingDelta()));
|
|
500
|
+
// scrollTo(max) eager-writes scrollTop so the render-phase sticky
|
|
501
|
+
// follow computes followDelta=0. Without this, scrollToBottom()
|
|
502
|
+
// alone leaves scrollTop stale → followDelta=max-stale →
|
|
503
|
+
// shiftSelectionForFollow applies the SAME shift we already did
|
|
504
|
+
// above, 2× offset. scrollToBottom() then re-enables sticky.
|
|
505
|
+
s_5.scrollTo(max_0);
|
|
506
|
+
s_5.scrollToBottom();
|
|
507
|
+
onScroll?.(true, s_5);
|
|
508
|
+
},
|
|
509
|
+
'selection:copy': copyAndToast
|
|
510
|
+
}, {
|
|
511
|
+
context: 'Scroll',
|
|
512
|
+
isActive
|
|
513
|
+
});
|
|
514
|
+
|
|
515
|
+
// scroll:halfPage*/fullPage* have no default key bindings — ctrl+u/d/b/f
|
|
516
|
+
// all have real owners in normal mode (kill-line/exit/task:background/
|
|
517
|
+
// kill-agents). Transcript mode gets them via the isModal raw useInput
|
|
518
|
+
// below. These handlers stay for custom rebinds only.
|
|
519
|
+
useKeybindings({
|
|
520
|
+
'scroll:halfPageUp': () => {
|
|
521
|
+
const s_6 = scrollRef.current;
|
|
522
|
+
if (!s_6) return;
|
|
523
|
+
const d_1 = -Math.max(1, Math.floor(s_6.getViewportHeight() / 2));
|
|
524
|
+
translateSelectionForJump(s_6, d_1);
|
|
525
|
+
const sticky_1 = jumpBy(s_6, d_1);
|
|
526
|
+
onScroll?.(sticky_1, s_6);
|
|
527
|
+
},
|
|
528
|
+
'scroll:halfPageDown': () => {
|
|
529
|
+
const s_7 = scrollRef.current;
|
|
530
|
+
if (!s_7) return;
|
|
531
|
+
const d_2 = Math.max(1, Math.floor(s_7.getViewportHeight() / 2));
|
|
532
|
+
translateSelectionForJump(s_7, d_2);
|
|
533
|
+
const sticky_2 = jumpBy(s_7, d_2);
|
|
534
|
+
onScroll?.(sticky_2, s_7);
|
|
535
|
+
},
|
|
536
|
+
'scroll:fullPageUp': () => {
|
|
537
|
+
const s_8 = scrollRef.current;
|
|
538
|
+
if (!s_8) return;
|
|
539
|
+
const d_3 = -Math.max(1, s_8.getViewportHeight());
|
|
540
|
+
translateSelectionForJump(s_8, d_3);
|
|
541
|
+
const sticky_3 = jumpBy(s_8, d_3);
|
|
542
|
+
onScroll?.(sticky_3, s_8);
|
|
543
|
+
},
|
|
544
|
+
'scroll:fullPageDown': () => {
|
|
545
|
+
const s_9 = scrollRef.current;
|
|
546
|
+
if (!s_9) return;
|
|
547
|
+
const d_4 = Math.max(1, s_9.getViewportHeight());
|
|
548
|
+
translateSelectionForJump(s_9, d_4);
|
|
549
|
+
const sticky_4 = jumpBy(s_9, d_4);
|
|
550
|
+
onScroll?.(sticky_4, s_9);
|
|
551
|
+
}
|
|
552
|
+
}, {
|
|
553
|
+
context: 'Scroll',
|
|
554
|
+
isActive
|
|
555
|
+
});
|
|
556
|
+
|
|
557
|
+
// Modal pager keys — transcript mode only. less/tmux copy-mode lineage:
|
|
558
|
+
// ctrl+u/d (half-page), ctrl+b/f (full-page), g/G (top/bottom). Tom's
|
|
559
|
+
// resolution (2026-03-15): "In ctrl-o mode, ctrl-u, ctrl-d, etc. should
|
|
560
|
+
// roughly just work!" — transcript is the copy-mode container.
|
|
561
|
+
//
|
|
562
|
+
// Safe because the conflicting handlers aren't reachable here:
|
|
563
|
+
// ctrl+u → kill-line, ctrl+d → exit: PromptInput not mounted
|
|
564
|
+
// ctrl+b → task:background: SessionBackgroundHint not mounted
|
|
565
|
+
// ctrl+f → chat:killAgents moved to ctrl+x ctrl+k; no conflict
|
|
566
|
+
// g/G → printable chars: no prompt to eat them, no vim/sticky gate needed
|
|
567
|
+
//
|
|
568
|
+
// TODO(search): `/`, n/N — build on Richard Kim's d94b07add4 (branch
|
|
569
|
+
// claude/jump-recent-message-CEPcq). getItemY Yoga-walk + computeOrigin +
|
|
570
|
+
// anchorY already solve scroll-to-index. jumpToPrevTurn is the n/N
|
|
571
|
+
// template. Single-shot via OVERSCAN_ROWS=80; two-phase was tried and
|
|
572
|
+
// abandoned (❯ oscillation). See team memory scroll-copy-mode-design.md.
|
|
573
|
+
useInput((input, key, event) => {
|
|
574
|
+
const s_10 = scrollRef.current;
|
|
575
|
+
if (!s_10) return;
|
|
576
|
+
const sticky_5 = applyModalPagerAction(s_10, modalPagerAction(input, key), d_5 => translateSelectionForJump(s_10, d_5));
|
|
577
|
+
if (sticky_5 === null) return;
|
|
578
|
+
onScroll?.(sticky_5, s_10);
|
|
579
|
+
event.stopImmediatePropagation();
|
|
580
|
+
}, {
|
|
581
|
+
isActive: isActive && isModal
|
|
582
|
+
});
|
|
583
|
+
|
|
584
|
+
// Esc clears selection; any other keystroke also clears it (matches
|
|
585
|
+
// native terminal behavior where selection disappears on input).
|
|
586
|
+
// Ctrl+C copies when a selection exists — needed on legacy terminals
|
|
587
|
+
// where ctrl+shift+c sends the same byte (\x03, shift is lost) and
|
|
588
|
+
// cmd+c never reaches the pty (terminal intercepts it for Edit > Copy).
|
|
589
|
+
// Handled via raw useInput so we can conditionally consume: Esc/Ctrl+C
|
|
590
|
+
// only stop propagation when a selection exists, letting them still work
|
|
591
|
+
// for cancel-request / interrupt otherwise. Other keys never stop
|
|
592
|
+
// propagation — they're observed to clear selection as a side-effect.
|
|
593
|
+
// The selection:copy keybinding (ctrl+shift+c / cmd+c) registers above
|
|
594
|
+
// via useKeybindings and consumes its event before reaching here.
|
|
595
|
+
useInput((input_0, key_0, event_0) => {
|
|
596
|
+
if (!selection.hasSelection()) return;
|
|
597
|
+
if (key_0.escape) {
|
|
598
|
+
selection.clearSelection();
|
|
599
|
+
event_0.stopImmediatePropagation();
|
|
600
|
+
return;
|
|
601
|
+
}
|
|
602
|
+
if (key_0.ctrl && !key_0.shift && !key_0.meta && input_0 === 'c') {
|
|
603
|
+
copyAndToast();
|
|
604
|
+
event_0.stopImmediatePropagation();
|
|
605
|
+
return;
|
|
606
|
+
}
|
|
607
|
+
const move = selectionFocusMoveForKey(key_0);
|
|
608
|
+
if (move) {
|
|
609
|
+
selection.moveFocus(move);
|
|
610
|
+
event_0.stopImmediatePropagation();
|
|
611
|
+
return;
|
|
612
|
+
}
|
|
613
|
+
if (shouldClearSelectionOnKey(key_0)) {
|
|
614
|
+
selection.clearSelection();
|
|
615
|
+
}
|
|
616
|
+
}, {
|
|
617
|
+
isActive
|
|
618
|
+
});
|
|
619
|
+
useDragToScroll(scrollRef, selection, isActive, onScroll);
|
|
620
|
+
useCopyOnSelect(selection, isActive, showCopiedToast);
|
|
621
|
+
useSelectionBgColor(selection);
|
|
622
|
+
return null;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
/**
|
|
626
|
+
* Auto-scroll the ScrollBox when the user drags a selection past its top or
|
|
627
|
+
* bottom edge. The anchor is shifted in the opposite direction so it stays
|
|
628
|
+
* on the same content (content that was at viewport row N is now at row N±d
|
|
629
|
+
* after scrolling by d). Focus stays at the mouse position (edge row).
|
|
630
|
+
*
|
|
631
|
+
* Selection coords are screen-buffer-local, so the anchor is clamped to the
|
|
632
|
+
* viewport bounds once the original content scrolls out. To preserve the full
|
|
633
|
+
* selection, rows about to scroll out are captured into scrolledOffAbove/
|
|
634
|
+
* scrolledOffBelow before each scroll step and joined back in by
|
|
635
|
+
* getSelectedText.
|
|
636
|
+
*/
|
|
637
|
+
function useDragToScroll(scrollRef: RefObject<ScrollBoxHandle | null>, selection: ReturnType<typeof useSelection>, isActive: boolean, onScroll: Props['onScroll']): void {
|
|
638
|
+
const timerRef = useRef<NodeJS.Timeout | null>(null);
|
|
639
|
+
const dirRef = useRef<-1 | 0 | 1>(0); // -1 scrolling up, +1 down, 0 idle
|
|
640
|
+
// Survives stop() — reset only on drag-finish. See check() for semantics.
|
|
641
|
+
const lastScrolledDirRef = useRef<-1 | 0 | 1>(0);
|
|
642
|
+
const ticksRef = useRef(0);
|
|
643
|
+
// onScroll may change identity every render (if not memoized by caller).
|
|
644
|
+
// Read through a ref so the effect doesn't re-subscribe and kill the timer
|
|
645
|
+
// on each scroll-induced re-render.
|
|
646
|
+
const onScrollRef = useRef(onScroll);
|
|
647
|
+
onScrollRef.current = onScroll;
|
|
648
|
+
useEffect(() => {
|
|
649
|
+
if (!isActive) return;
|
|
650
|
+
function stop(): void {
|
|
651
|
+
dirRef.current = 0;
|
|
652
|
+
if (timerRef.current) {
|
|
653
|
+
clearInterval(timerRef.current);
|
|
654
|
+
timerRef.current = null;
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
function tick(): void {
|
|
658
|
+
const sel = selection.getState();
|
|
659
|
+
const s = scrollRef.current;
|
|
660
|
+
const dir = dirRef.current;
|
|
661
|
+
// dir === 0 defends against a stale interval (start() may have set one
|
|
662
|
+
// after the immediate tick already called stop() at a scroll boundary).
|
|
663
|
+
// ticks cap defends against a lost release event (mouse released
|
|
664
|
+
// outside terminal window) leaving isDragging stuck true.
|
|
665
|
+
if (!sel?.isDragging || !sel.focus || !s || dir === 0 || ++ticksRef.current > AUTOSCROLL_MAX_TICKS) {
|
|
666
|
+
stop();
|
|
667
|
+
return;
|
|
668
|
+
}
|
|
669
|
+
// scrollBy accumulates into pendingScrollDelta; the screen buffer
|
|
670
|
+
// doesn't update until the next render drains it. If a previous
|
|
671
|
+
// tick's scroll hasn't drained yet, captureScrolledRows would read
|
|
672
|
+
// stale content (same rows as last tick → duplicated in the
|
|
673
|
+
// accumulator AND missing the rows that actually scrolled out).
|
|
674
|
+
// Skip this tick; the 50ms interval will retry after Ink's 16ms
|
|
675
|
+
// render catches up. Also prevents shiftAnchor from desyncing.
|
|
676
|
+
if (s.getPendingDelta() !== 0) return;
|
|
677
|
+
const top = s.getViewportTop();
|
|
678
|
+
const bottom = top + s.getViewportHeight() - 1;
|
|
679
|
+
// Clamp anchor within [top, bottom]. Not [0, bottom]: the ScrollBox
|
|
680
|
+
// padding row at 0 would produce a blank line between scrolledOffAbove
|
|
681
|
+
// and the on-screen content in getSelectedText. The padding-row
|
|
682
|
+
// highlight was a minor visual nicety; text correctness wins.
|
|
683
|
+
if (dir < 0) {
|
|
684
|
+
if (s.getScrollTop() <= 0) {
|
|
685
|
+
stop();
|
|
686
|
+
return;
|
|
687
|
+
}
|
|
688
|
+
// Scrolling up: content moves down in viewport, so anchor row +N.
|
|
689
|
+
// Clamp to actual scroll distance so anchor stays in sync when near
|
|
690
|
+
// the top boundary (renderer clamps scrollTop to 0 on drain).
|
|
691
|
+
const actual = Math.min(AUTOSCROLL_LINES, s.getScrollTop());
|
|
692
|
+
// Capture rows about to scroll out the BOTTOM before scrollBy
|
|
693
|
+
// overwrites them. Only rows inside the selection are captured
|
|
694
|
+
// (captureScrolledRows intersects with selection bounds).
|
|
695
|
+
selection.captureScrolledRows(bottom - actual + 1, bottom, 'below');
|
|
696
|
+
selection.shiftAnchor(actual, 0, bottom);
|
|
697
|
+
s.scrollBy(-AUTOSCROLL_LINES);
|
|
698
|
+
} else {
|
|
699
|
+
const max = Math.max(0, s.getScrollHeight() - s.getViewportHeight());
|
|
700
|
+
if (s.getScrollTop() >= max) {
|
|
701
|
+
stop();
|
|
702
|
+
return;
|
|
703
|
+
}
|
|
704
|
+
// Scrolling down: content moves up in viewport, so anchor row -N.
|
|
705
|
+
// Clamp to actual scroll distance so anchor stays in sync when near
|
|
706
|
+
// the bottom boundary (renderer clamps scrollTop to max on drain).
|
|
707
|
+
const actual_0 = Math.min(AUTOSCROLL_LINES, max - s.getScrollTop());
|
|
708
|
+
// Capture rows about to scroll out the TOP.
|
|
709
|
+
selection.captureScrolledRows(top, top + actual_0 - 1, 'above');
|
|
710
|
+
selection.shiftAnchor(-actual_0, top, bottom);
|
|
711
|
+
s.scrollBy(AUTOSCROLL_LINES);
|
|
712
|
+
}
|
|
713
|
+
onScrollRef.current?.(false, s);
|
|
714
|
+
}
|
|
715
|
+
function start(dir_0: -1 | 1): void {
|
|
716
|
+
// Record BEFORE early-return: the empty-accumulator reset in check()
|
|
717
|
+
// may have zeroed this during the pre-crossing phase (accumulators
|
|
718
|
+
// empty until the anchor row enters the capture range). Re-record
|
|
719
|
+
// on every call so the corruption is instantly healed.
|
|
720
|
+
lastScrolledDirRef.current = dir_0;
|
|
721
|
+
if (dirRef.current === dir_0) return; // already going this way
|
|
722
|
+
stop();
|
|
723
|
+
dirRef.current = dir_0;
|
|
724
|
+
ticksRef.current = 0;
|
|
725
|
+
tick();
|
|
726
|
+
// tick() may have hit a scroll boundary and called stop() (dir reset to
|
|
727
|
+
// 0). Only start the interval if we're still going — otherwise the
|
|
728
|
+
// interval would run forever with dir === 0 doing nothing useful.
|
|
729
|
+
if (dirRef.current === dir_0) {
|
|
730
|
+
timerRef.current = setInterval(tick, AUTOSCROLL_INTERVAL_MS);
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
// Re-evaluated on every selection change (start/drag/finish/clear).
|
|
735
|
+
// Drives drag-to-scroll autoscroll when the drag leaves the viewport.
|
|
736
|
+
// Prior versions broke sticky here on drag-start to prevent selection
|
|
737
|
+
// drift during streaming — ink.tsx now translates selection coords by
|
|
738
|
+
// the follow delta instead (native terminal behavior: view keeps
|
|
739
|
+
// scrolling, highlight walks up with the text). Keeping sticky also
|
|
740
|
+
// avoids useVirtualScroll's tail-walk → forward-walk phantom growth.
|
|
741
|
+
function check(): void {
|
|
742
|
+
const s_0 = scrollRef.current;
|
|
743
|
+
if (!s_0) {
|
|
744
|
+
stop();
|
|
745
|
+
return;
|
|
746
|
+
}
|
|
747
|
+
const top_0 = s_0.getViewportTop();
|
|
748
|
+
const bottom_0 = top_0 + s_0.getViewportHeight() - 1;
|
|
749
|
+
const sel_0 = selection.getState();
|
|
750
|
+
// Pass the LAST-scrolled direction (not dirRef) so the anchor guard is
|
|
751
|
+
// bypassed after shiftAnchor has clamped anchor toward row 0. Using
|
|
752
|
+
// lastScrolledDirRef (survives stop()) lets autoscroll resume after a
|
|
753
|
+
// brief mouse dip into the viewport. Same-direction only — a mouse
|
|
754
|
+
// jump from below-bottom to above-top must stop, since reversing while
|
|
755
|
+
// the scrolledOffAbove/Below accumulators hold the prior direction's
|
|
756
|
+
// rows would duplicate text in getSelectedText. Reset on drag-finish
|
|
757
|
+
// OR when both accumulators are empty: startSelection clears them
|
|
758
|
+
// (selection.ts), so a new drag after a lost-release (isDragging
|
|
759
|
+
// stuck true, the reason AUTOSCROLL_MAX_TICKS exists) still resets.
|
|
760
|
+
// Safe: start() below re-records lastScrolledDirRef before its
|
|
761
|
+
// early-return, so a mid-scroll reset here is instantly undone.
|
|
762
|
+
if (!sel_0?.isDragging || sel_0.scrolledOffAbove.length === 0 && sel_0.scrolledOffBelow.length === 0) {
|
|
763
|
+
lastScrolledDirRef.current = 0;
|
|
764
|
+
}
|
|
765
|
+
const dir_1 = dragScrollDirection(sel_0, top_0, bottom_0, lastScrolledDirRef.current);
|
|
766
|
+
if (dir_1 === 0) {
|
|
767
|
+
// Blocked reversal: focus jumped to the opposite edge (off-window
|
|
768
|
+
// drag return, fast flick). handleSelectionDrag already moved focus
|
|
769
|
+
// past the anchor, flipping selectionBounds — the accumulator is
|
|
770
|
+
// now orphaned (holds rows on the wrong side). Clear it so
|
|
771
|
+
// getSelectedText matches the visible highlight.
|
|
772
|
+
if (lastScrolledDirRef.current !== 0 && sel_0?.focus) {
|
|
773
|
+
const want = sel_0.focus.row < top_0 ? -1 : sel_0.focus.row > bottom_0 ? 1 : 0;
|
|
774
|
+
if (want !== 0 && want !== lastScrolledDirRef.current) {
|
|
775
|
+
sel_0.scrolledOffAbove = [];
|
|
776
|
+
sel_0.scrolledOffBelow = [];
|
|
777
|
+
sel_0.scrolledOffAboveSW = [];
|
|
778
|
+
sel_0.scrolledOffBelowSW = [];
|
|
779
|
+
lastScrolledDirRef.current = 0;
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
stop();
|
|
783
|
+
} else start(dir_1);
|
|
784
|
+
}
|
|
785
|
+
const unsubscribe = selection.subscribe(check);
|
|
786
|
+
return () => {
|
|
787
|
+
unsubscribe();
|
|
788
|
+
stop();
|
|
789
|
+
lastScrolledDirRef.current = 0;
|
|
790
|
+
};
|
|
791
|
+
}, [isActive, scrollRef, selection]);
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
/**
|
|
795
|
+
* Compute autoscroll direction for a drag selection relative to the ScrollBox
|
|
796
|
+
* viewport. Returns 0 when not dragging, anchor/focus missing, or the anchor
|
|
797
|
+
* is outside the viewport — a multi-click or drag that started in the input
|
|
798
|
+
* area must not commandeer the message scroll (double-click in the input area
|
|
799
|
+
* while scrolled up previously corrupted the anchor via shiftAnchor and
|
|
800
|
+
* spuriously scrolled the message history every 50ms until release).
|
|
801
|
+
*
|
|
802
|
+
* alreadyScrollingDir bypasses the anchor-in-viewport guard once autoscroll
|
|
803
|
+
* is active (shiftAnchor legitimately clamps the anchor toward row 0, below
|
|
804
|
+
* `top`) but only allows SAME-direction continuation. If the focus jumps to
|
|
805
|
+
* the opposite edge (below→above or above→below — possible with a fast flick
|
|
806
|
+
* or off-window drag since mode 1002 reports on cell change, not per cell),
|
|
807
|
+
* returns 0 to stop — reversing without clearing scrolledOffAbove/Below
|
|
808
|
+
* would duplicate captured rows when they scroll back on-screen.
|
|
809
|
+
*/
|
|
810
|
+
export function dragScrollDirection(sel: SelectionState | null, top: number, bottom: number, alreadyScrollingDir: -1 | 0 | 1 = 0): -1 | 0 | 1 {
|
|
811
|
+
if (!sel?.isDragging || !sel.anchor || !sel.focus) return 0;
|
|
812
|
+
const row = sel.focus.row;
|
|
813
|
+
const want: -1 | 0 | 1 = row < top ? -1 : row > bottom ? 1 : 0;
|
|
814
|
+
if (alreadyScrollingDir !== 0) {
|
|
815
|
+
// Same-direction only. Focus on the opposite side, or back inside the
|
|
816
|
+
// viewport, stops the scroll — captured rows stay in scrolledOffAbove/
|
|
817
|
+
// Below but never scroll back on-screen, so getSelectedText is correct.
|
|
818
|
+
return want === alreadyScrollingDir ? want : 0;
|
|
819
|
+
}
|
|
820
|
+
// Anchor must be inside the viewport for us to own this drag. If the
|
|
821
|
+
// user started selecting in the input box or header, autoscrolling the
|
|
822
|
+
// message history is surprising and corrupts the anchor via shiftAnchor.
|
|
823
|
+
if (sel.anchor.row < top || sel.anchor.row > bottom) return 0;
|
|
824
|
+
return want;
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
// Keyboard page jumps: scrollTo() writes scrollTop directly and clears
|
|
828
|
+
// pendingScrollDelta — one frame, no drain. scrollBy() accumulates into
|
|
829
|
+
// pendingScrollDelta which the renderer drains over several frames
|
|
830
|
+
// (render-node-to-output.ts drainProportional/drainAdaptive) — correct for
|
|
831
|
+
// wheel smoothness, wrong for PgUp/ctrl+u where the user expects a snap.
|
|
832
|
+
// Target is relative to scrollTop+pendingDelta so a jump mid-wheel-burst
|
|
833
|
+
// lands where the wheel was heading.
|
|
834
|
+
export function jumpBy(s: ScrollBoxHandle, delta: number): boolean {
|
|
835
|
+
const max = Math.max(0, s.getScrollHeight() - s.getViewportHeight());
|
|
836
|
+
const target = s.getScrollTop() + s.getPendingDelta() + delta;
|
|
837
|
+
if (target >= max) {
|
|
838
|
+
// Eager-write scrollTop so follow-scroll sees followDelta=0. Callers
|
|
839
|
+
// that ran translateSelectionForJump already shifted; scrollToBottom()
|
|
840
|
+
// alone would double-shift via the render-phase sticky follow.
|
|
841
|
+
s.scrollTo(max);
|
|
842
|
+
s.scrollToBottom();
|
|
843
|
+
return true;
|
|
844
|
+
}
|
|
845
|
+
s.scrollTo(Math.max(0, target));
|
|
846
|
+
return false;
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
// Wheel-down past maxScroll re-enables sticky so wheeling at the bottom
|
|
850
|
+
// naturally re-pins (matches typical chat-app behavior). Returns the
|
|
851
|
+
// resulting sticky state so callers can propagate it.
|
|
852
|
+
function scrollDown(s: ScrollBoxHandle, amount: number): boolean {
|
|
853
|
+
const max = Math.max(0, s.getScrollHeight() - s.getViewportHeight());
|
|
854
|
+
// Include pendingDelta: scrollBy accumulates into pendingScrollDelta
|
|
855
|
+
// without updating scrollTop, so getScrollTop() alone is stale within
|
|
856
|
+
// a batch of wheel events. Without this, wheeling to the bottom never
|
|
857
|
+
// re-enables sticky scroll.
|
|
858
|
+
const effectiveTop = s.getScrollTop() + s.getPendingDelta();
|
|
859
|
+
if (effectiveTop + amount >= max) {
|
|
860
|
+
s.scrollToBottom();
|
|
861
|
+
return true;
|
|
862
|
+
}
|
|
863
|
+
s.scrollBy(amount);
|
|
864
|
+
return false;
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
// Wheel-up past scrollTop=0 clamps via scrollTo(0), clearing
|
|
868
|
+
// pendingScrollDelta so aggressive wheel bursts (e.g. MX Master free-spin)
|
|
869
|
+
// don't accumulate an unbounded negative delta. Without this clamp,
|
|
870
|
+
// useVirtualScroll's [effLo, effHi] span grows past what MAX_MOUNTED_ITEMS
|
|
871
|
+
// can cover and intermediate drain frames render at scrollTops with no
|
|
872
|
+
// mounted children — blank viewport.
|
|
873
|
+
export function scrollUp(s: ScrollBoxHandle, amount: number): void {
|
|
874
|
+
// Include pendingDelta: scrollBy accumulates without updating scrollTop,
|
|
875
|
+
// so getScrollTop() alone is stale within a batch of wheel events.
|
|
876
|
+
const effectiveTop = s.getScrollTop() + s.getPendingDelta();
|
|
877
|
+
if (effectiveTop - amount <= 0) {
|
|
878
|
+
s.scrollTo(0);
|
|
879
|
+
return;
|
|
880
|
+
}
|
|
881
|
+
s.scrollBy(-amount);
|
|
882
|
+
}
|
|
883
|
+
export type ModalPagerAction = 'lineUp' | 'lineDown' | 'halfPageUp' | 'halfPageDown' | 'fullPageUp' | 'fullPageDown' | 'top' | 'bottom';
|
|
884
|
+
|
|
885
|
+
/**
|
|
886
|
+
* Maps a keystroke to a modal pager action. Exported for testing.
|
|
887
|
+
* Returns null for keys the modal pager doesn't handle (they fall through).
|
|
888
|
+
*
|
|
889
|
+
* ctrl+u/d/b/f are the less-lineage bindings. g/G are bare letters (only
|
|
890
|
+
* safe when no prompt is mounted). G arrives as input='G' shift=false on
|
|
891
|
+
* legacy terminals, or input='g' shift=true on kitty-protocol terminals.
|
|
892
|
+
* Lowercase g needs the !shift guard so it doesn't also match kitty-G.
|
|
893
|
+
*
|
|
894
|
+
* Key-repeat: stdin coalesces held-down printables into one multi-char
|
|
895
|
+
* string (e.g. 'ggg'). Only uniform-char batches are handled — mixed input
|
|
896
|
+
* like 'gG' isn't key-repeat. g/G are idempotent absolute jumps, so the
|
|
897
|
+
* count is irrelevant (consuming the batch just prevents it from leaking
|
|
898
|
+
* to the selection-clear-on-printable handler).
|
|
899
|
+
*/
|
|
900
|
+
export function modalPagerAction(input: string, key: Pick<Key, 'ctrl' | 'meta' | 'shift' | 'upArrow' | 'downArrow' | 'home' | 'end'>): ModalPagerAction | null {
|
|
901
|
+
if (key.meta) return null;
|
|
902
|
+
// Special keys first — arrows/home/end arrive with empty or junk input,
|
|
903
|
+
// so these must be checked before any input-string logic. shift is
|
|
904
|
+
// reserved for selection-extend (selectionFocusMoveForKey); ctrl+home/end
|
|
905
|
+
// already has a useKeybindings route to scroll:top/bottom.
|
|
906
|
+
if (!key.ctrl && !key.shift) {
|
|
907
|
+
if (key.upArrow) return 'lineUp';
|
|
908
|
+
if (key.downArrow) return 'lineDown';
|
|
909
|
+
if (key.home) return 'top';
|
|
910
|
+
if (key.end) return 'bottom';
|
|
911
|
+
}
|
|
912
|
+
if (key.ctrl) {
|
|
913
|
+
if (key.shift) return null;
|
|
914
|
+
switch (input) {
|
|
915
|
+
case 'u':
|
|
916
|
+
return 'halfPageUp';
|
|
917
|
+
case 'd':
|
|
918
|
+
return 'halfPageDown';
|
|
919
|
+
case 'b':
|
|
920
|
+
return 'fullPageUp';
|
|
921
|
+
case 'f':
|
|
922
|
+
return 'fullPageDown';
|
|
923
|
+
// emacs-style line scroll (less accepts both ctrl+n/p and ctrl+e/y).
|
|
924
|
+
// Works during search nav — fine-adjust after a jump without
|
|
925
|
+
// leaving modal. No !searchOpen gate on this useInput's isActive.
|
|
926
|
+
case 'n':
|
|
927
|
+
return 'lineDown';
|
|
928
|
+
case 'p':
|
|
929
|
+
return 'lineUp';
|
|
930
|
+
default:
|
|
931
|
+
return null;
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
// Bare letters. Key-repeat batches: only act on uniform runs.
|
|
935
|
+
const c = input[0];
|
|
936
|
+
if (!c || input !== c.repeat(input.length)) return null;
|
|
937
|
+
// kitty sends G as input='g' shift=true; legacy as 'G' shift=false.
|
|
938
|
+
// Check BEFORE the shift-gate so both hit 'bottom'.
|
|
939
|
+
if (c === 'G' || c === 'g' && key.shift) return 'bottom';
|
|
940
|
+
if (key.shift) return null;
|
|
941
|
+
switch (c) {
|
|
942
|
+
case 'g':
|
|
943
|
+
return 'top';
|
|
944
|
+
// j/k re-added per Tom Mar 18 — reversal of Mar 16 removal. Works
|
|
945
|
+
// during search nav (fine-adjust after n/N lands) since isModal is
|
|
946
|
+
// independent of searchOpen.
|
|
947
|
+
case 'j':
|
|
948
|
+
return 'lineDown';
|
|
949
|
+
case 'k':
|
|
950
|
+
return 'lineUp';
|
|
951
|
+
// less: space = page down, b = page up. ctrl+b already maps above;
|
|
952
|
+
// bare b is the less-native version.
|
|
953
|
+
case ' ':
|
|
954
|
+
return 'fullPageDown';
|
|
955
|
+
case 'b':
|
|
956
|
+
return 'fullPageUp';
|
|
957
|
+
default:
|
|
958
|
+
return null;
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
/**
|
|
963
|
+
* Applies a modal pager action to a ScrollBox. Returns the resulting sticky
|
|
964
|
+
* state, or null if the action was null (nothing to do — caller should fall
|
|
965
|
+
* through). Calls onBeforeJump(delta) before scrolling so the caller can
|
|
966
|
+
* translate the text selection by the scroll delta (capture outgoing rows,
|
|
967
|
+
* shift anchor+focus) instead of clearing it. Exported for testing.
|
|
968
|
+
*/
|
|
969
|
+
export function applyModalPagerAction(s: ScrollBoxHandle, act: ModalPagerAction | null, onBeforeJump: (delta: number) => void): boolean | null {
|
|
970
|
+
switch (act) {
|
|
971
|
+
case null:
|
|
972
|
+
return null;
|
|
973
|
+
case 'lineUp':
|
|
974
|
+
case 'lineDown':
|
|
975
|
+
{
|
|
976
|
+
const d = act === 'lineDown' ? 1 : -1;
|
|
977
|
+
onBeforeJump(d);
|
|
978
|
+
return jumpBy(s, d);
|
|
979
|
+
}
|
|
980
|
+
case 'halfPageUp':
|
|
981
|
+
case 'halfPageDown':
|
|
982
|
+
{
|
|
983
|
+
const half = Math.max(1, Math.floor(s.getViewportHeight() / 2));
|
|
984
|
+
const d = act === 'halfPageDown' ? half : -half;
|
|
985
|
+
onBeforeJump(d);
|
|
986
|
+
return jumpBy(s, d);
|
|
987
|
+
}
|
|
988
|
+
case 'fullPageUp':
|
|
989
|
+
case 'fullPageDown':
|
|
990
|
+
{
|
|
991
|
+
const page = Math.max(1, s.getViewportHeight());
|
|
992
|
+
const d = act === 'fullPageDown' ? page : -page;
|
|
993
|
+
onBeforeJump(d);
|
|
994
|
+
return jumpBy(s, d);
|
|
995
|
+
}
|
|
996
|
+
case 'top':
|
|
997
|
+
onBeforeJump(-(s.getScrollTop() + s.getPendingDelta()));
|
|
998
|
+
s.scrollTo(0);
|
|
999
|
+
return false;
|
|
1000
|
+
case 'bottom':
|
|
1001
|
+
{
|
|
1002
|
+
const max = Math.max(0, s.getScrollHeight() - s.getViewportHeight());
|
|
1003
|
+
onBeforeJump(max - (s.getScrollTop() + s.getPendingDelta()));
|
|
1004
|
+
// Eager-write scrollTop before scrollToBottom — same double-shift
|
|
1005
|
+
// fix as scroll:bottom and jumpBy's max branch.
|
|
1006
|
+
s.scrollTo(max);
|
|
1007
|
+
s.scrollToBottom();
|
|
1008
|
+
return true;
|
|
1009
|
+
}
|
|
1010
|
+
}
|
|
1011
|
+
}
|
|
1012
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIlJlZk9iamVjdCIsInVzZUVmZmVjdCIsInVzZVJlZiIsInVzZU5vdGlmaWNhdGlvbnMiLCJ1c2VDb3B5T25TZWxlY3QiLCJ1c2VTZWxlY3Rpb25CZ0NvbG9yIiwiU2Nyb2xsQm94SGFuZGxlIiwidXNlU2VsZWN0aW9uIiwiRm9jdXNNb3ZlIiwiU2VsZWN0aW9uU3RhdGUiLCJpc1h0ZXJtSnMiLCJnZXRDbGlwYm9hcmRQYXRoIiwiS2V5IiwidXNlSW5wdXQiLCJ1c2VLZXliaW5kaW5ncyIsImxvZ0ZvckRlYnVnZ2luZyIsIlByb3BzIiwic2Nyb2xsUmVmIiwiaXNBY3RpdmUiLCJvblNjcm9sbCIsInN0aWNreSIsImhhbmRsZSIsImlzTW9kYWwiLCJXSEVFTF9BQ0NFTF9XSU5ET1dfTVMiLCJXSEVFTF9BQ0NFTF9TVEVQIiwiV0hFRUxfQUNDRUxfTUFYIiwiV0hFRUxfQk9VTkNFX0dBUF9NQVhfTVMiLCJXSEVFTF9NT0RFX1NURVAiLCJXSEVFTF9NT0RFX0NBUCIsIldIRUVMX01PREVfUkFNUCIsIldIRUVMX01PREVfSURMRV9ESVNFTkdBR0VfTVMiLCJXSEVFTF9ERUNBWV9IQUxGTElGRV9NUyIsIldIRUVMX0RFQ0FZX1NURVAiLCJXSEVFTF9CVVJTVF9NUyIsIldIRUVMX0RFQ0FZX0dBUF9NUyIsIldIRUVMX0RFQ0FZX0NBUF9TTE9XIiwiV0hFRUxfREVDQVlfQ0FQX0ZBU1QiLCJXSEVFTF9ERUNBWV9JRExFX01TIiwic2hvdWxkQ2xlYXJTZWxlY3Rpb25PbktleSIsImtleSIsIndoZWVsVXAiLCJ3aGVlbERvd24iLCJpc05hdiIsImxlZnRBcnJvdyIsInJpZ2h0QXJyb3ciLCJ1cEFycm93IiwiZG93bkFycm93IiwiaG9tZSIsImVuZCIsInBhZ2VVcCIsInBhZ2VEb3duIiwic2hpZnQiLCJtZXRhIiwic3VwZXIiLCJzZWxlY3Rpb25Gb2N1c01vdmVGb3JLZXkiLCJXaGVlbEFjY2VsU3RhdGUiLCJ0aW1lIiwibXVsdCIsImRpciIsInh0ZXJtSnMiLCJmcmFjIiwiYmFzZSIsInBlbmRpbmdGbGlwIiwid2hlZWxNb2RlIiwiYnVyc3RDb3VudCIsImNvbXB1dGVXaGVlbFN0ZXAiLCJzdGF0ZSIsIm5vdyIsIk1hdGgiLCJmbG9vciIsImdhcCIsIm0iLCJwb3ciLCJjYXAiLCJtYXgiLCJuZXh0IiwibWluIiwic2FtZURpciIsInRvdGFsIiwicm93cyIsInJlYWRTY3JvbGxTcGVlZEJhc2UiLCJyYXciLCJwcm9jZXNzIiwiZW52IiwiQ0xBVURFX0NPREVfU0NST0xMX1NQRUVEIiwibiIsInBhcnNlRmxvYXQiLCJOdW1iZXIiLCJpc05hTiIsImluaXRXaGVlbEFjY2VsIiwiaW5pdEFuZExvZ1doZWVsQWNjZWwiLCJURVJNX1BST0dSQU0iLCJBVVRPU0NST0xMX0xJTkVTIiwiQVVUT1NDUk9MTF9JTlRFUlZBTF9NUyIsIkFVVE9TQ1JPTExfTUFYX1RJQ0tTIiwiU2Nyb2xsS2V5YmluZGluZ0hhbmRsZXIiLCJSZWFjdE5vZGUiLCJzZWxlY3Rpb24iLCJhZGROb3RpZmljYXRpb24iLCJ3aGVlbEFjY2VsIiwic2hvd0NvcGllZFRvYXN0IiwidGV4dCIsInBhdGgiLCJsZW5ndGgiLCJtc2ciLCJjb2xvciIsInByaW9yaXR5IiwidGltZW91dE1zIiwiY29weUFuZFRvYXN0IiwiY29weVNlbGVjdGlvbiIsInRyYW5zbGF0ZVNlbGVjdGlvbkZvckp1bXAiLCJzIiwiZGVsdGEiLCJzZWwiLCJnZXRTdGF0ZSIsImFuY2hvciIsImZvY3VzIiwidG9wIiwiZ2V0Vmlld3BvcnRUb3AiLCJib3R0b20iLCJnZXRWaWV3cG9ydEhlaWdodCIsInJvdyIsImdldFNjcm9sbEhlaWdodCIsImN1ciIsImdldFNjcm9sbFRvcCIsImdldFBlbmRpbmdEZWx0YSIsImFjdHVhbCIsImNhcHR1cmVTY3JvbGxlZFJvd3MiLCJzaGlmdFNlbGVjdGlvbiIsImEiLCJzY3JvbGw6cGFnZVVwIiwiY3VycmVudCIsImQiLCJqdW1wQnkiLCJzY3JvbGw6cGFnZURvd24iLCJzY3JvbGw6bGluZVVwIiwiY2xlYXJTZWxlY3Rpb24iLCJzY3JvbGxVcCIsInBlcmZvcm1hbmNlIiwic2Nyb2xsOmxpbmVEb3duIiwic3RlcCIsInJlYWNoZWRCb3R0b20iLCJzY3JvbGxEb3duIiwic2Nyb2xsOnRvcCIsInNjcm9sbFRvIiwic2Nyb2xsOmJvdHRvbSIsInNjcm9sbFRvQm90dG9tIiwiY29udGV4dCIsInNjcm9sbDpoYWxmUGFnZVVwIiwic2Nyb2xsOmhhbGZQYWdlRG93biIsInNjcm9sbDpmdWxsUGFnZVVwIiwic2Nyb2xsOmZ1bGxQYWdlRG93biIsImlucHV0IiwiZXZlbnQiLCJhcHBseU1vZGFsUGFnZXJBY3Rpb24iLCJtb2RhbFBhZ2VyQWN0aW9uIiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwiaGFzU2VsZWN0aW9uIiwiZXNjYXBlIiwiY3RybCIsIm1vdmUiLCJtb3ZlRm9jdXMiLCJ1c2VEcmFnVG9TY3JvbGwiLCJSZXR1cm5UeXBlIiwidGltZXJSZWYiLCJOb2RlSlMiLCJUaW1lb3V0IiwiZGlyUmVmIiwibGFzdFNjcm9sbGVkRGlyUmVmIiwidGlja3NSZWYiLCJvblNjcm9sbFJlZiIsInN0b3AiLCJjbGVhckludGVydmFsIiwidGljayIsImlzRHJhZ2dpbmciLCJzaGlmdEFuY2hvciIsInNjcm9sbEJ5Iiwic3RhcnQiLCJzZXRJbnRlcnZhbCIsImNoZWNrIiwic2Nyb2xsZWRPZmZBYm92ZSIsInNjcm9sbGVkT2ZmQmVsb3ciLCJkcmFnU2Nyb2xsRGlyZWN0aW9uIiwid2FudCIsInNjcm9sbGVkT2ZmQWJvdmVTVyIsInNjcm9sbGVkT2ZmQmVsb3dTVyIsInVuc3Vic2NyaWJlIiwic3Vic2NyaWJlIiwiYWxyZWFkeVNjcm9sbGluZ0RpciIsInRhcmdldCIsImFtb3VudCIsImVmZmVjdGl2ZVRvcCIsIk1vZGFsUGFnZXJBY3Rpb24iLCJQaWNrIiwiYyIsInJlcGVhdCIsImFjdCIsIm9uQmVmb3JlSnVtcCIsImhhbGYiLCJwYWdlIl0sInNvdXJjZXMiOlsiU2Nyb2xsS2V5YmluZGluZ0hhbmRsZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyB0eXBlIFJlZk9iamVjdCwgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZU5vdGlmaWNhdGlvbnMgfSBmcm9tICcuLi9jb250ZXh0L25vdGlmaWNhdGlvbnMuanMnXG5pbXBvcnQge1xuICB1c2VDb3B5T25TZWxlY3QsXG4gIHVzZVNlbGVjdGlvbkJnQ29sb3IsXG59IGZyb20gJy4uL2hvb2tzL3VzZUNvcHlPblNlbGVjdC5qcydcbmltcG9ydCB0eXBlIHsgU2Nyb2xsQm94SGFuZGxlIH0gZnJvbSAnLi4vaW5rL2NvbXBvbmVudHMvU2Nyb2xsQm94LmpzJ1xuaW1wb3J0IHsgdXNlU2VsZWN0aW9uIH0gZnJvbSAnLi4vaW5rL2hvb2tzL3VzZS1zZWxlY3Rpb24uanMnXG5pbXBvcnQgdHlwZSB7IEZvY3VzTW92ZSwgU2VsZWN0aW9uU3RhdGUgfSBmcm9tICcuLi9pbmsvc2VsZWN0aW9uLmpzJ1xuaW1wb3J0IHsgaXNYdGVybUpzIH0gZnJvbSAnLi4vaW5rL3Rlcm1pbmFsLmpzJ1xuaW1wb3J0IHsgZ2V0Q2xpcGJvYXJkUGF0aCB9IGZyb20gJy4uL2luay90ZXJtaW8vb3NjLmpzJ1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGN1c3RvbS1ydWxlcy9wcmVmZXItdXNlLWtleWJpbmRpbmdzIC0tIEVzYyBuZWVkcyBjb25kaXRpb25hbCBwcm9wYWdhdGlvbiBiYXNlZCBvbiBzZWxlY3Rpb24gc3RhdGVcbmltcG9ydCB7IHR5cGUgS2V5LCB1c2VJbnB1dCB9IGZyb20gJy4uL2luay5qcydcbmltcG9ydCB7IHVzZUtleWJpbmRpbmdzIH0gZnJvbSAnLi4va2V5YmluZGluZ3MvdXNlS2V5YmluZGluZy5qcydcbmltcG9ydCB7IGxvZ0ZvckRlYnVnZ2luZyB9IGZyb20gJy4uL3V0aWxzL2RlYnVnLmpzJ1xuXG50eXBlIFByb3BzID0ge1xuICBzY3JvbGxSZWY6IFJlZk9iamVjdDxTY3JvbGxCb3hIYW5kbGUgfCBudWxsPlxuICBpc0FjdGl2ZTogYm9vbGVhblxuICAvKiogQ2FsbGVkIGFmdGVyIGV2ZXJ5IHNjcm9sbCBhY3Rpb24gd2l0aCB0aGUgcmVzdWx0aW5nIHN0aWNreSBzdGF0ZSBhbmRcbiAgICogIHRoZSBoYW5kbGUgKGZvciByZWFkaW5nIHNjcm9sbFRvcC9zY3JvbGxIZWlnaHQgcG9zdC1zY3JvbGwpLiAqL1xuICBvblNjcm9sbD86IChzdGlja3k6IGJvb2xlYW4sIGhhbmRsZTogU2Nyb2xsQm94SGFuZGxlKSA9PiB2b2lkXG4gIC8qKiBFbmFibGVzIG1vZGFsIHBhZ2VyIGtleXMgKGcvRywgY3RybCt1L2QvYi9mKS4gT25seSBzYWZlIHdoZW4gdGhlcmVcbiAgICogIGlzIG5vIHRleHQgaW5wdXQgY29tcGV0aW5nIGZvciB0aG9zZSBjaGFyYWN0ZXJzIOKAlCBpLmUuIHRyYW5zY3JpcHRcbiAgICogIG1vZGUuIERlZmF1bHRzIHRvIGZhbHNlLiBXaGVuIHRydWUsIEcgd29ya3MgcmVnYXJkbGVzcyBvZiBlZGl0b3JNb2RlXG4gICAqICBhbmQgc3RpY2t5IHN0YXRlOyBjdHJsK3UvZC9iL2YgZG9uJ3QgY29uZmxpY3Qgd2l0aCBraWxsLWxpbmUvZXhpdC9cbiAgICogIHRhc2s6YmFja2dyb3VuZC9raWxsLWFnZW50cyAobm9uZSBhcmUgbW91bnRlZCwgb3IgdGhleSBtb3VudCBhZnRlclxuICAgKiAgdGhpcyBjb21wb25lbnQgc28gc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIHdpbnMpLiAqL1xuICBpc01vZGFsPzogYm9vbGVhblxufVxuXG4vLyBUZXJtaW5hbHMgc2VuZCBvbmUgU0dSIHdoZWVsIGV2ZW50IHBlciBpbnRlbmRlZCByb3cgKHZlcmlmaWVkIGluIEdob3N0dHlcbi8vIHNyYy9TdXJmYWNlLnppZzogYGZvciAoMC4uQGFicyh5LmRlbHRhKSkgfF98IHsgbW91c2VSZXBvcnQoLmZvdXIsIC4uLikgfWApLlxuLy8gR2hvc3R0eSBhbHJlYWR5IDPDlydzIGRpc2NyZXRlIHdoZWVsIHRpY2tzIGJlZm9yZSB0aGF0IGxvb3A7IHRyYWNrcGFkXG4vLyBwcmVjaXNpb24gc2Nyb2xsIGlzIHBpeGVscy9jZWxsX3NpemUuIDEgZXZlbnQgPSAxIHJvdyBpbnRlbmRlZCDigJQgdXNlIGl0XG4vLyBhcyB0aGUgYmFzZSwgYW5kIHJhbXAgYSBtdWx0aXBsaWVyIHdoZW4gZXZlbnRzIGFycml2ZSByYXBpZGx5LiBUaGVcbi8vIHBlbmRpbmdTY3JvbGxEZWx0YSBhY2N1bXVsYXRvciArIHByb3BvcnRpb25hbCBkcmFpbiBpblxuLy8gcmVuZGVyLW5vZGUtdG8tb3V0cHV0IGhhbmRsZXMgc21vb3RoIGNhdGNoLXVwIG9uIGJpZyBidXJzdHMuXG4vL1xuLy8geHRlcm0uanMgKFZTIENvZGUvQ3Vyc29yL1dpbmRzdXJmIGludGVncmF0ZWQgdGVybWluYWxzKSBzZW5kcyBleGFjdGx5IDFcbi8vIGV2ZW50IHBlciB3aGVlbCBub3RjaCDigJQgbm8gcHJlLWFtcGxpZmljYXRpb24uIEEgc2VwYXJhdGUgZXhwb25lbnRpYWxcbi8vIGRlY2F5IGN1cnZlIChiZWxvdykgY29tcGVuc2F0ZXMgZm9yIHRoZSBsb3dlciBldmVudCByYXRlLCB3aXRoIGJ1cnN0XG4vLyBkZXRlY3Rpb24gYW5kIGdhcC1kZXBlbmRlbnQgY2FwcyB0dW5lZCB0byBWUyBDb2RlJ3MgZXZlbnQgcGF0dGVybnMuXG5cbi8vIE5hdGl2ZSB0ZXJtaW5hbHM6IGhhcmQtd2luZG93IGxpbmVhciByYW1wLiBFdmVudHMgY2xvc2VyIHRoYW4gdGhlIHdpbmRvd1xuLy8gcmFtcCB0aGUgbXVsdGlwbGllcjsgaWRsZSBnYXBzIHJlc2V0IHRvIGBiYXNlYCAoZGVmYXVsdCAxKS4gU29tZSBlbXVsYXRvcnNcbi8vIHByZS1tdWx0aXBseSBhdCB0aGVpciBsYXllciAoZ2hvc3R0eSBkaXNjcmV0ZT0zIHNlbmRzIDMgU0dSIGV2ZW50cy9ub3RjaDtcbi8vIGlUZXJtMiBcImZhc3RlciBzY3JvbGxcIiBzaW1pbGFyKSDigJQgYmFzZT0xIGlzIGNvcnJlY3QgdGhlcmUuIE90aGVycyBzZW5kIDFcbi8vIGV2ZW50L25vdGNoIOKAlCB1c2VycyBvbiB0aG9zZSBjYW4gc2V0IENMQVVERV9DT0RFX1NDUk9MTF9TUEVFRD0zIHRvIG1hdGNoXG4vLyB2aW0vbnZpbS9vcGVuY29kZSBhcHAtc2lkZSBkZWZhdWx0cy4gV2UgY2FuJ3QgZGV0ZWN0IHdoaWNoLCBzbyBrbm9iIGl0LlxuY29uc3QgV0hFRUxfQUNDRUxfV0lORE9XX01TID0gNDBcbmNvbnN0IFdIRUVMX0FDQ0VMX1NURVAgPSAwLjNcbmNvbnN0IFdIRUVMX0FDQ0VMX01BWCA9IDZcblxuLy8gRW5jb2RlciBib3VuY2UgZGVib3VuY2UgKyB3aGVlbC1tb2RlIGRlY2F5IGN1cnZlLiBXb3JuL2NoZWFwIG9wdGljYWxcbi8vIGVuY29kZXJzIGVtaXQgc3B1cmlvdXMgcmV2ZXJzZS1kaXJlY3Rpb24gdGlja3MgZHVyaW5nIGZhc3Qgc3BpbnMg4oCUIG1lYXN1cmVkXG4vLyAyOCUgb2YgZXZlbnRzIG9uIEJvcmlzJ3MgbW91c2UgKDIwMjYtMDMtMTcsIGlUZXJtMikuIFBhdHRlcm4gaXMgYWx3YXlzXG4vLyBmbGlwLXRoZW4tZmxpcC1iYWNrOyB0cmFja3BhZHMgcHJvZHVjZSBaRVJPIGZsaXBzICgwLzQ1OCBpbiBzYW1lIHJlY29yZGluZykuXG4vLyBBIGNvbmZpcm1lZCBib3VuY2UgcHJvdmVzIGEgcGh5c2ljYWwgd2hlZWwgaXMgYXR0YWNoZWQg4oCUIGVuZ2FnZSB0aGUgc2FtZVxuLy8gZXhwb25lbnRpYWwtZGVjYXkgY3VydmUgdGhlIHh0ZXJtLmpzIHBhdGggdXNlcyAoaXQncyBhbHJlYWR5IHR1bmVkKSwgd2l0aFxuLy8gYSBoaWdoZXIgY2FwIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBsb3dlciBldmVudCByYXRlICh+OS9zZWMgdnMgVlMgQ29kZSdzXG4vLyB+MzAvc2VjKS4gVHJhY2twYWQgY2FuJ3QgcmVhY2ggdGhpcyBwYXRoLlxuLy9cbi8vIFRoZSBkZWNheSBjdXJ2ZSBnaXZlczogMXN0IGNsaWNrIGFmdGVyIGlkbGUgPSAxIHJvdyAocHJlY2lzaW9uKSwgMm5kID0gMTAsXG4vLyAzcmQgPSBjYXAuIFNsb3dpbmcgZG93biBkZWNheXMgc21vb3RobHkgdG93YXJkIDEg4oCUIG5vIHNlcGFyYXRlIGlkbGVcbi8vIHRocmVzaG9sZCBuZWVkZWQsIGxhcmdlIGdhcHMganVzdCBoYXZlIG3iiYgwIOKGkiBtdWx04oaSMS4gV2hlZWwgbW9kZSBpcyBTVElDS1k6XG4vLyBvbmNlIGEgYm91bmNlIGNvbmZpcm1zIGl0J3MgYSBtb3VzZSwgdGhlIGRlY2F5IGN1cnZlIGFwcGxpZXMgdW50aWwgYW4gaWRsZVxuLy8gZ2FwIG9yIHRyYWNrcGFkLWZsaWNrLWJ1cnN0IHNpZ25hbHMgYSBwb3NzaWJsZSBkZXZpY2Ugc3dpdGNoLlxuY29uc3QgV0hFRUxfQk9VTkNFX0dBUF9NQVhfTVMgPSAyMDAgLy8gZmxpcC1iYWNrIG11c3QgYXJyaXZlIHdpdGhpbiB0aGlzXG4vLyBNb3VzZSBpcyB+OSBldmVudHMvc2VjIHZzIFZTIENvZGUncyB+MzAg4oCUIFNURVAgaXMgM8OXIHh0ZXJtLmpzJ3MgNSB0b1xuLy8gY29tcGVuc2F0ZS4gQXQgZ2FwPTEwMG1zICht4omIMC42Myk6IG9uZSBjbGljayBnaXZlcyAxKzE1KjAuNjPiiYgxMC41LlxuY29uc3QgV0hFRUxfTU9ERV9TVEVQID0gMTVcbmNvbnN0IFdIRUVMX01PREVfQ0FQID0gMTVcbi8vIE1heCBtdWx0IGdyb3d0aCBwZXIgZXZlbnQuIFdpdGhvdXQgdGhpcywgdGhlICtTVEVQKm0gdGVybSBqdW1wcyBtdWx0XG4vLyBmcm9tIDHihpIxMCBpbiBvbmUgZXZlbnQgd2hlbiB3aGVlbE1vZGUgZW5nYWdlcyBtaWQtc2Nyb2xsIChib3VuY2Vcbi8vIGRldGVjdGVkIGFmdGVyIE4gZXZlbnRzIGluIHRyYWNrcGFkIG1vZGUgYXQgbXVsdD0xKS4gVXNlciBzZWVzIHNjcm9sbFxuLy8gc3VkZGVubHkgZ28gMTDDlyBmYXN0ZXIuIENhcD0zIGdpdmVzIDHihpI04oaSN+KGkjEw4oaSMTPihpIxNSBvdmVyIH4wLjVzIGF0XG4vLyA5IGV2ZW50cy9zZWMg4oCUIHNtb290aCByYW1wIGluc3RlYWQgb2YgYSBqdW1wLiBEZWNheSBpcyB1bmFmZmVjdGVkXG4vLyAodGFyZ2V0PG11bHQgd2lucyB0aGUgbWluKS5cbmNvbnN0IFdIRUVMX01PREVfUkFNUCA9IDNcbi8vIERldmljZS1zd2l0Y2ggZGlzZW5nYWdlOiBtb3VzZSBmaW5nZXItcmVwb3NpdGlvbnMgbWF4IGF0IH44MzBtcyAobWVhc3VyZWQpO1xuLy8gdHJhY2twYWQgYmV0d2Vlbi1nZXN0dXJlIHBhdXNlcyBhcmUgMjAwMG1zKy4gQW4gaWRsZSBnYXAgYWJvdmUgdGhpcyBtZWFuc1xuLy8gdGhlIHVzZXIgc3RvcHBlZCDigJQgbWlnaHQgaGF2ZSBzd2l0Y2hlZCBkZXZpY2VzLiBEaXNlbmdhZ2U7IHRoZSBuZXh0IG1vdXNlXG4vLyBib3VuY2UgcmUtZW5nYWdlcy4gVHJhY2twYWQgc2xvdyBzd2lwZSAobm8gPDVtcyBidXJzdHMsIHNvIHRoZSBidXJzdC1jb3VudFxuLy8gZ3VhcmQgZG9lc24ndCBjYXRjaCBpdCkgaXMgd2hhdCB0aGlzIHByb3RlY3RzIGFnYWluc3QuXG5jb25zdCBXSEVFTF9NT0RFX0lETEVfRElTRU5HQUdFX01TID0gMTUwMFxuXG4vLyB4dGVybS5qczogZXhwb25lbnRpYWwgZGVjYXkuIG1vbWVudHVtPTAuNV4oZ2FwL2hsKSDigJQgc2xvdyBjbGljayDihpIgbeKJiDBcbi8vIOKGkiBtdWx04oaSMSAocHJlY2lzaW9uKTsgZmFzdCDihpIgbeKJiDEg4oaSIGNhcnJpZXMgbW9tZW50dW0uIFN0ZWFkeS1zdGF0ZVxuLy8gPSAxICsgc3RlcMOXbS8oMS1tKSwgY2FwcGVkLiBNZWFzdXJlZCBldmVudCByYXRlcyBpbiBWUyBDb2RlICh3aGVlbC5sb2cpOlxuLy8gc3VzdGFpbmVkIHNjcm9sbCBzZW5kcyBldmVudHMgYXQgMjAtNTBtcyBnYXBzICgyMC00MCBIeiksIHBsdXMgMC0ybXNcbi8vIHNhbWUtYmF0Y2ggYnVyc3RzIG9uIGZsaWNrcy4gQ2FwIGlzIGxvdyAoM+KAkzYsIGdhcC1kZXBlbmRlbnQpIGJlY2F1c2UgZXZlbnRcbi8vIGZyZXF1ZW5jeSBpcyBoaWdoIOKAlCBhdCA0MCBIeiDDlyA2ID0gMjQwIHJvd3Mvc2VjIG1heCBkZW1hbmQsIHdoaWNoIHRoZVxuLy8gYWRhcHRpdmUgZHJhaW4gYXQgfjIwMGZwcyAobWVhc3VyZWQpIGhhbmRsZXMuIEhpZ2hlciBjYXAg4oaSIHBlbmRpbmcgZXhwbG9zaW9uLlxuLy8gVHVuZWQgZW1waXJpY2FsbHkgKGJvcmlzIDIwMjYtMDMpLiBTZWUgZG9jcy9yZXNlYXJjaC90ZXJtaW5hbC1zY3JvbGwtKi5cbmNvbnN0IFdIRUVMX0RFQ0FZX0hBTEZMSUZFX01TID0gMTUwXG5jb25zdCBXSEVFTF9ERUNBWV9TVEVQID0gNVxuLy8gU2FtZS1iYXRjaCBldmVudHMgKDxCVVJTVF9NUykgYXJyaXZlIGluIG9uZSBzdGRpbiBiYXRjaCDigJQgdGhlIHRlcm1pbmFsXG4vLyBpcyBkb2luZyBwcm9wb3J0aW9uYWwgcmVwb3J0aW5nLiBUcmVhdCBhcyAxIHJvdy9ldmVudCBsaWtlIG5hdGl2ZS5cbmNvbnN0IFdIRUVMX0JVUlNUX01TID0gNVxuLy8gQ2FwIGJvdW5kYXJ5OiBzbG93IGV2ZW50cyAo4omlR0FQX01TKSBjYXAgbG93IGZvciBzaG9ydCBzbW9vdGggZHJhaW5zO1xuLy8gZmFzdCBldmVudHMgY2FwIGhpZ2hlciBmb3IgdGhyb3VnaHB1dCAoYWRhcHRpdmUgZHJhaW4gaGFuZGxlcyBiYWNrbG9nKS5cbmNvbnN0IFdIRUVMX0RFQ0FZX0dBUF9NUyA9IDgwXG5jb25zdCBXSEVFTF9ERUNBWV9DQVBfU0xPVyA9IDMgLy8gZ2FwIOKJpSBHQVBfTVM6IHByZWNpc2lvblxuY29uc3QgV0hFRUxfREVDQVlfQ0FQX0ZBU1QgPSA2IC8vIGdhcCA8IEdBUF9NUzogdGhyb3VnaHB1dFxuLy8gSWRsZSB0aHJlc2hvbGQ6IGdhcHMgYmV5b25kIHRoaXMgcmVzZXQgdG8gdGhlIGtpY2sgdmFsdWUgKDIpIHNvIHRoZVxuLy8gZmlyc3QgY2xpY2sgYWZ0ZXIgYSBwYXVzZSBmZWVscyByZXNwb25zaXZlIHJlZ2FyZGxlc3Mgb2YgZGlyZWN0aW9uLlxuY29uc3QgV0hFRUxfREVDQVlfSURMRV9NUyA9IDUwMFxuXG4vKipcbiAqIFdoZXRoZXIgYSBrZXlwcmVzcyBzaG91bGQgY2xlYXIgdGhlIHZpcnR1YWwgdGV4dCBzZWxlY3Rpb24uIE1pbWljc1xuICogbmF0aXZlIHRlcm1pbmFsIHNlbGVjdGlvbjogYW55IGtleXN0cm9rZSBjbGVhcnMsIEVYQ0VQVCBtb2RpZmllZCBuYXZcbiAqIGtleXMgKHNoaWZ0L29wdC9jbWQgKyBhcnJvdy9ob21lL2VuZC9wYWdlKikuIEluIG5hdGl2ZSBtYWNPUyBjb250ZXh0cyxcbiAqIHNoaWZ0K25hdiBleHRlbmRzIHNlbGVjdGlvbiwgYW5kIGNtZC9vcHQrbmF2IGFyZSBvZnRlbiBpbnRlcmNlcHRlZCBieVxuICogdGhlIHRlcm1pbmFsIGVtdWxhdG9yIGZvciBzY3JvbGxiYWNrIG5hdiDigJQgbmVpdGhlciBkaXN0dXJicyBzZWxlY3Rpb24uXG4gKiBCYXJlIGFycm93cyBETyBjbGVhciAodXNlcidzIGN1cnNvciBtb3ZlcywgbmF0aXZlIGRlc2VsZWN0cykuIFdoZWVsIGlzXG4gKiBleGNsdWRlZCDigJQgc2Nyb2xsOmxpbmVVcC9Eb3duIGFscmVhZHkgY2xlYXJzIHZpYSB0aGUga2V5YmluZGluZyBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkQ2xlYXJTZWxlY3Rpb25PbktleShrZXk6IEtleSk6IGJvb2xlYW4ge1xuICBpZiAoa2V5LndoZWVsVXAgfHwga2V5LndoZWVsRG93bikgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IGlzTmF2ID1cbiAgICBrZXkubGVmdEFycm93IHx8XG4gICAga2V5LnJpZ2h0QXJyb3cgfHxcbiAgICBrZXkudXBBcnJvdyB8fFxuICAgIGtleS5kb3duQXJyb3cgfHxcbiAgICBrZXkuaG9tZSB8fFxuICAgIGtleS5lbmQgfHxcbiAgICBrZXkucGFnZVVwIHx8XG4gICAga2V5LnBhZ2VEb3duXG4gIGlmIChpc05hdiAmJiAoa2V5LnNoaWZ0IHx8IGtleS5tZXRhIHx8IGtleS5zdXBlcikpIHJldHVybiBmYWxzZVxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIE1hcCBhIGtleXByZXNzIHRvIGEgc2VsZWN0aW9uIGZvY3VzIG1vdmUgKGtleWJvYXJkIGV4dGVuc2lvbikuIE9ubHlcbiAqIHNoaWZ0IGV4dGVuZHMg4oCUIHRoYXQncyB0aGUgdW5pdmVyc2FsIHRleHQtc2VsZWN0aW9uIG1vZGlmaWVyLiBjbWRcbiAqIChzdXBlcikgb25seSBhcnJpdmVzIHZpYSBraXR0eSBrZXlib2FyZCBwcm90b2NvbCDigJQgaW4gbW9zdCB0ZXJtaW5hbHNcbiAqIGNtZCthcnJvdyBpcyBpbnRlcmNlcHRlZCBieSB0aGUgZW11bGF0b3IgYW5kIG5ldmVyIHJlYWNoZXMgdGhlIHB0eSwgc29cbiAqIG5vIHN1cGVyIGJyYW5jaC4gc2hpZnQraG9tZS9lbmQgY292ZXJzIGxpbmUtZWRnZSBqdW1wcyAoYW5kIGZuK3NoaWZ0K1xuICogbGVmdC9yaWdodCBvbiBtYWMgbGFwdG9wcyA9IHNoaWZ0K2hvbWUvZW5kKS4gc2hpZnQrb3B0ICh3b3JkLWp1bXApIG5vdFxuICogeWV0IGltcGxlbWVudGVkIOKAlCBmYWxscyB0aHJvdWdoIHRvIHNob3VsZENsZWFyU2VsZWN0aW9uT25LZXkgd2hpY2hcbiAqIHByZXNlcnZlcyAobW9kaWZpZWQgbmF2KS4gUmV0dXJucyBudWxsIGZvciBub24tZXh0ZW5kIGtleXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3Rpb25Gb2N1c01vdmVGb3JLZXkoa2V5OiBLZXkpOiBGb2N1c01vdmUgfCBudWxsIHtcbiAgaWYgKCFrZXkuc2hpZnQgfHwga2V5Lm1ldGEpIHJldHVybiBudWxsXG4gIGlmIChrZXkubGVmdEFycm93KSByZXR1cm4gJ2xlZnQnXG4gIGlmIChrZXkucmlnaHRBcnJvdykgcmV0dXJuICdyaWdodCdcbiAgaWYgKGtleS51cEFycm93KSByZXR1cm4gJ3VwJ1xuICBpZiAoa2V5LmRvd25BcnJvdykgcmV0dXJuICdkb3duJ1xuICBpZiAoa2V5LmhvbWUpIHJldHVybiAnbGluZVN0YXJ0J1xuICBpZiAoa2V5LmVuZCkgcmV0dXJuICdsaW5lRW5kJ1xuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgdHlwZSBXaGVlbEFjY2VsU3RhdGUgPSB7XG4gIHRpbWU6IG51bWJlclxuICBtdWx0OiBudW1iZXJcbiAgZGlyOiAwIHwgMSB8IC0xXG4gIHh0ZXJtSnM6IGJvb2xlYW5cbiAgLyoqIENhcnJpZWQgZnJhY3Rpb25hbCBzY3JvbGwgKHh0ZXJtLmpzIG9ubHkpLiBzY3JvbGxCeSBmbG9vcnMsIHNvIHdpdGhvdXRcbiAgICogIHRoaXMgYSBtdWx0IG9mIDEuNSBnaXZlcyAxIHJvdyBldmVyeSB0aW1lLiBDYXJyeWluZyB0aGUgcmVtYWluZGVyIGdpdmVzXG4gICAqICAxLDIsMSwyIG9uIGF2ZXJhZ2UgZm9yIG11bHQ9MS41IOKAlCBjb3JyZWN0IHRocm91Z2hwdXQgb3ZlciB0aW1lLiAqL1xuICBmcmFjOiBudW1iZXJcbiAgLyoqIE5hdGl2ZS1wYXRoIGJhc2VsaW5lIHJvd3MvZXZlbnQuIFJlc2V0IHZhbHVlIG9uIGlkbGUvcmV2ZXJzYWw7IHJhbXBcbiAgICogIGJ1aWxkcyBvbiB0b3AuIHh0ZXJtLmpzIHBhdGggaWdub3JlcyB0aGlzIChvd24ga2ljaz0yIHR1bmluZykuICovXG4gIGJhc2U6IG51bWJlclxuICAvKiogRGVmZXJyZWQgZGlyZWN0aW9uIGZsaXAgKG5hdGl2ZSBvbmx5KS4gTWlnaHQgYmUgZW5jb2RlciBib3VuY2Ugb3IgYVxuICAgKiAgcmVhbCByZXZlcnNhbCDigJQgcmVzb2x2ZWQgYnkgdGhlIE5FWFQgZXZlbnQuIFJlYWwgcmV2ZXJzYWwgbG9zZXMgMSByb3dcbiAgICogIG9mIGxhdGVuY3k7IGJvdW5jZSBpcyBzd2FsbG93ZWQgYW5kIHRyaWdnZXJzIHdoZWVsIG1vZGUuIFRoZSBmbGlwJ3NcbiAgICogIGRpcmVjdGlvbiBhbmQgdGltZXN0YW1wIGFyZSBkZXJpdmFibGUgKGl0J3MgYWx3YXlzIC1zdGF0ZS5kaXIgYXRcbiAgICogIHN0YXRlLnRpbWUpIHNvIHRoaXMgaXMganVzdCBhIG1hcmtlci4gKi9cbiAgcGVuZGluZ0ZsaXA6IGJvb2xlYW5cbiAgLyoqIFNldCB0cnVlIG9uY2UgYSBib3VuY2UgaXMgY29uZmlybWVkIChmbGlwLXRoZW4tZmxpcC1iYWNrIHdpdGhpblxuICAgKiAgQk9VTkNFX0dBUF9NQVgpLiBTdGlja3kg4oCUIGJ1dCBkaXNlbmdhZ2VkIG9uIGlkbGUgZ2FwID4xNTAwbXMgT1IgYVxuICAgKiAgdHJhY2twYWQtc2lnbmF0dXJlIGJ1cnN0IChzZWUgYnVyc3RDb3VudCkuIFN0YXRlIGxpdmVzIGluIGEgdXNlUmVmIHNvXG4gICAqICBpdCBwZXJzaXN0cyBhY3Jvc3MgZGV2aWNlIHN3aXRjaGVzOyB0aGUgZGlzZW5nYWdlcyBoYW5kbGUgbW91c2XihpJ0cmFja3BhZC4gKi9cbiAgd2hlZWxNb2RlOiBib29sZWFuXG4gIC8qKiBDb25zZWN1dGl2ZSA8NW1zIGV2ZW50cy4gVHJhY2twYWQgZmxpY2sgcHJvZHVjZXMgMTAwKyBhdCA8NW1zOyBtb3VzZVxuICAgKiAgcHJvZHVjZXMg4omkMyAodmVyaWZpZWQgaW4gL3RtcC93aGVlbC10dW5lLnR4dCkuIDUrIGluIGEgcm93IOKGkiB0cmFja3BhZFxuICAgKiAgc2lnbmF0dXJlIOKGkiBkaXNlbmdhZ2Ugd2hlZWwgbW9kZSBzbyBkZXZpY2Utc3dpdGNoIGRvZXNuJ3QgbGVhayBtb3VzZVxuICAgKiAgYWNjZWwgdG8gdHJhY2twYWQuICovXG4gIGJ1cnN0Q291bnQ6IG51bWJlclxufVxuXG4vKiogQ29tcHV0ZSByb3dzIGZvciBvbmUgd2hlZWwgZXZlbnQsIG11dGF0aW5nIGFjY2VsIHN0YXRlLiBSZXR1cm5zIDAgd2hlblxuICogIGEgZGlyZWN0aW9uIGZsaXAgaXMgZGVmZXJyZWQgZm9yIGJvdW5jZSBkZXRlY3Rpb24g4oCUIGNhbGwgc2l0ZXMgbm8tb3Agb25cbiAqICBzdGVwPTAgKHNjcm9sbEJ5KDApIGlzIGEgbm8tb3AsIG9uU2Nyb2xsKGZhbHNlKSBpcyBpZGVtcG90ZW50KS4gRXhwb3J0ZWRcbiAqICBmb3IgdGVzdHMuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVdoZWVsU3RlcChcbiAgc3RhdGU6IFdoZWVsQWNjZWxTdGF0ZSxcbiAgZGlyOiAxIHwgLTEsXG4gIG5vdzogbnVtYmVyLFxuKTogbnVtYmVyIHtcbiAgaWYgKCFzdGF0ZS54dGVybUpzKSB7XG4gICAgLy8gRGV2aWNlLXN3aXRjaCBndWFyZCDikaA6IGlkbGUgZGlzZW5nYWdlLiBSdW5zIEJFRk9SRSBwZW5kaW5nRmxpcCByZXNvbHZlXG4gICAgLy8gc28gYSBwZW5kaW5nIGJvdW5jZSAoMjglIG9mIGxhc3QtbW91c2UtZXZlbnRzKSBkb2Vzbid0IGJ5cGFzcyBpdCB2aWFcbiAgICAvLyB0aGUgcmVhbC1yZXZlcnNhbCBlYXJseSByZXR1cm4uIHN0YXRlLnRpbWUgaXMgZWl0aGVyIHRoZSBsYXN0IGNvbW1pdHRlZFxuICAgIC8vIGV2ZW50IE9SIHRoZSBkZWZlcnJlZCBmbGlwIOKAlCBib3RoIGNvdW50IGFzIFwibGFzdCBhY3Rpdml0eVwiLlxuICAgIGlmIChzdGF0ZS53aGVlbE1vZGUgJiYgbm93IC0gc3RhdGUudGltZSA+IFdIRUVMX01PREVfSURMRV9ESVNFTkdBR0VfTVMpIHtcbiAgICAgIHN0YXRlLndoZWVsTW9kZSA9IGZhbHNlXG4gICAgICBzdGF0ZS5idXJzdENvdW50ID0gMFxuICAgICAgc3RhdGUubXVsdCA9IHN0YXRlLmJhc2VcbiAgICB9XG5cbiAgICAvLyBSZXNvbHZlIGFueSBkZWZlcnJlZCBmbGlwIEJFRk9SRSB0b3VjaGluZyBzdGF0ZS50aW1lL2RpciDigJQgd2UgbmVlZCB0aGVcbiAgICAvLyBwcmUtZmxpcCBzdGF0ZS5kaXIgdG8gZGlzdGluZ3Vpc2ggYm91bmNlIChmbGlwLWJhY2spIGZyb20gcmVhbCByZXZlcnNhbFxuICAgIC8vIChmbGlwIHBlcnNpc3RlZCksIGFuZCBzdGF0ZS50aW1lICg9IGJvdW5jZSB0aW1lc3RhbXApIGZvciB0aGUgZ2FwIGNoZWNrLlxuICAgIGlmIChzdGF0ZS5wZW5kaW5nRmxpcCkge1xuICAgICAgc3RhdGUucGVuZGluZ0ZsaXAgPSBmYWxzZVxuICAgICAgaWYgKGRpciAhPT0gc3RhdGUuZGlyIHx8IG5vdyAtIHN0YXRlLnRpbWUgPiBXSEVFTF9CT1VOQ0VfR0FQX01BWF9NUykge1xuICAgICAgICAvLyBSZWFsIHJldmVyc2FsOiBuZXcgZGlyIHBlcnNpc3RlZCwgT1IgZmxpcC1iYWNrIGFycml2ZWQgdG9vIGxhdGUuXG4gICAgICAgIC8vIENvbW1pdC4gVGhlIGRlZmVycmVkIGV2ZW50J3MgMSByb3cgaXMgbG9zdCAoYWNjZXB0YWJsZSBsYXRlbmN5KS5cbiAgICAgICAgc3RhdGUuZGlyID0gZGlyXG4gICAgICAgIHN0YXRlLnRpbWUgPSBub3dcbiAgICAgICAgc3RhdGUubXVsdCA9IHN0YXRlLmJhc2VcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3Ioc3RhdGUubXVsdClcbiAgICAgIH1cbiAgICAgIC8vIEJvdW5jZSBjb25maXJtZWQ6IGZsaXBwZWQgYmFjayB0byBvcmlnaW5hbCBkaXIgd2l0aGluIHRoZSB3aW5kb3cuXG4gICAgICAvLyBzdGF0ZS5kaXIvbXVsdCB1bmNoYW5nZWQgZnJvbSBwcmUtYm91bmNlLiBzdGF0ZS50aW1lIHdhcyBhZHZhbmNlZCB0b1xuICAgICAgLy8gdGhlIGJvdW5jZSBiZWxvdywgc28gZ2FwIGhlcmUgPSBmbGlwLWJhY2sgaW50ZXJ2YWwg4oCUIHJlZmxlY3RzIHRoZVxuICAgICAgLy8gdXNlcidzIGFjdHVhbCBjbGljayBjYWRlbmNlIChib3VuY2UgSVMgYSBwaHlzaWNhbCBjbGljaywganVzdCBub2lzeSkuXG4gICAgICBzdGF0ZS53aGVlbE1vZGUgPSB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgZ2FwID0gbm93IC0gc3RhdGUudGltZVxuICAgIGlmIChkaXIgIT09IHN0YXRlLmRpciAmJiBzdGF0ZS5kaXIgIT09IDApIHtcbiAgICAgIC8vIEZsaXAuIERlZmVyIOKAlCBuZXh0IGV2ZW50IGRlY2lkZXMgYm91bmNlIHZzLiByZWFsIHJldmVyc2FsLiBBZHZhbmNlXG4gICAgICAvLyB0aW1lIChidXQgTk9UIGRpci9tdWx0KTogaWYgdGhpcyB0dXJucyBvdXQgdG8gYmUgYSBib3VuY2UsIHRoZVxuICAgICAgLy8gY29uZmlybSBldmVudCdzIGdhcCB3aWxsIGJlIHRoZSBmbGlwLWJhY2sgaW50ZXJ2YWwsIHdoaWNoIHJlZmxlY3RzXG4gICAgICAvLyB0aGUgdXNlcidzIGFjdHVhbCBjbGljayByYXRlLiBUaGUgYm91bmNlIElTIGEgcGh5c2ljYWwgd2hlZWwgY2xpY2ssXG4gICAgICAvLyBqdXN0IG1pc3JlYWQgYnkgdGhlIGVuY29kZXIg4oCUIGl0IHNob3VsZCBjb3VudCB0b3dhcmQgY2FkZW5jZS5cbiAgICAgIHN0YXRlLnBlbmRpbmdGbGlwID0gdHJ1ZVxuICAgICAgc3RhdGUudGltZSA9IG5vd1xuICAgICAgcmV0dXJuIDBcbiAgICB9XG4gICAgc3RhdGUuZGlyID0gZGlyXG4gICAgc3RhdGUudGltZSA9IG5vd1xuXG4gICAgLy8g4pSA4pSA4pSAIE1PVVNFICh3aGVlbCBtb2RlLCBzdGlja3kgdW50aWwgZGV2aWNlLXN3aXRjaCBzaWduYWwpIOKUgOKUgOKUgFxuICAgIGlmIChzdGF0ZS53aGVlbE1vZGUpIHtcbiAgICAgIGlmIChnYXAgPCBXSEVFTF9CVVJTVF9NUykge1xuICAgICAgICAvLyBTYW1lLWJhdGNoIGJ1cnN0IGNoZWNrIChwb3J0ZWQgZnJvbSB4dGVybS5qcyk6IGlUZXJtMiBwcm9wb3J0aW9uYWxcbiAgICAgICAgLy8gcmVwb3J0aW5nIHNlbmRzIDIrIFNHUiBldmVudHMgZm9yIG9uZSBkZXRlbnQgd2hlbiBtYWNPUyBnaXZlc1xuICAgICAgICAvLyBkZWx0YT4xLiBXaXRob3V0IHRoaXMsIHRoZSAybmQgZXZlbnQgYXQgZ2FwPDFtcyBoYXMgbeKJiDEg4oaSIFNURVAqbT0xNVxuICAgICAgICAvLyDihpIgb25lIGdlbnRsZSBjbGljayBnaXZlcyAxKzE1PTE2IHJvd3MuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIERldmljZS1zd2l0Y2ggZ3VhcmQg4pGhOiB0cmFja3BhZCBmbGljayBwcm9kdWNlcyAxMDArIGV2ZW50cyBhdCA8NW1zXG4gICAgICAgIC8vIChtZWFzdXJlZCk7IG1vdXNlIHByb2R1Y2VzIOKJpDMuIDUrIGNvbnNlY3V0aXZlIOKGkiB0cmFja3BhZCBmbGljay5cbiAgICAgICAgaWYgKCsrc3RhdGUuYnVyc3RDb3VudCA+PSA1KSB7XG4gICAgICAgICAgc3RhdGUud2hlZWxNb2RlID0gZmFsc2VcbiAgICAgICAgICBzdGF0ZS5idXJzdENvdW50ID0gMFxuICAgICAgICAgIHN0YXRlLm11bHQgPSBzdGF0ZS5iYXNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIDFcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUuYnVyc3RDb3VudCA9IDBcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUmUtY2hlY2s6IG1heSBoYXZlIGRpc2VuZ2FnZWQgYWJvdmUuXG4gICAgaWYgKHN0YXRlLndoZWVsTW9kZSkge1xuICAgICAgLy8geHRlcm0uanMgZGVjYXkgY3VydmUgd2l0aCBTVEVQw5czLCBoaWdoZXIgY2FwLiBObyBpZGxlIHRocmVzaG9sZCDigJRcbiAgICAgIC8vIHRoZSBjdXJ2ZSBoYW5kbGVzIGl0IChnYXA9MTAwMG1zIOKGkiBt4omIMC4wMSDihpIgbXVsdOKJiDEpLiBObyBmcmFjIOKAlFxuICAgICAgLy8gcm91bmRpbmcgbG9zcyBpcyBtaW5vciBhdCBoaWdoIG11bHQsIGFuZCBmcmFjIHBlcnNpc3RpbmcgYWNyb3NzIGlkbGVcbiAgICAgIC8vIHdhcyBjYXVzaW5nIG9mZi1ieS1vbmUgb24gdGhlIGZpcnN0IGNsaWNrIGJhY2suXG4gICAgICBjb25zdCBtID0gTWF0aC5wb3coMC41LCBnYXAgLyBXSEVFTF9ERUNBWV9IQUxGTElGRV9NUylcbiAgICAgIGNvbnN0IGNhcCA9IE1hdGgubWF4KFdIRUVMX01PREVfQ0FQLCBzdGF0ZS5iYXNlICogMilcbiAgICAgIGNvbnN0IG5leHQgPSAxICsgKHN0YXRlLm11bHQgLSAxKSAqIG0gKyBXSEVFTF9NT0RFX1NURVAgKiBtXG4gICAgICBzdGF0ZS5tdWx0ID0gTWF0aC5taW4oY2FwLCBuZXh0LCBzdGF0ZS5tdWx0ICsgV0hFRUxfTU9ERV9SQU1QKVxuICAgICAgcmV0dXJuIE1hdGguZmxvb3Ioc3RhdGUubXVsdClcbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgVFJBQ0tQQUQgLyBISS1SRVMgKG5hdGl2ZSwgbm9uLXdoZWVsLW1vZGUpIOKUgOKUgOKUgFxuICAgIC8vIFRpZ2h0IDQwbXMgYnVyc3Qgd2luZG93OiBzdWItNDBtcyBldmVudHMgcmFtcCwgYW55dGhpbmcgc2xvd2VyIHJlc2V0cy5cbiAgICAvLyBUcmFja3BhZCBmbGljayBkZWxpdmVycyAyMDArIGV2ZW50cyBhdCA8MjBtcyBnYXBzIOKGkiByYWlscyB0byBjYXAgNi5cbiAgICAvLyBUcmFja3BhZCBzbG93IHN3aXBlIGF0IDQwLTQwMG1zIGdhcHMg4oaSIHJlc2V0cyBldmVyeSBldmVudCDihpIgMSByb3cgZWFjaC5cbiAgICBpZiAoZ2FwID4gV0hFRUxfQUNDRUxfV0lORE9XX01TKSB7XG4gICAgICBzdGF0ZS5tdWx0ID0gc3RhdGUuYmFzZVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjYXAgPSBNYXRoLm1heChXSEVFTF9BQ0NFTF9NQVgsIHN0YXRlLmJhc2UgKiAyKVxuICAgICAgc3RhdGUubXVsdCA9IE1hdGgubWluKGNhcCwgc3RhdGUubXVsdCArIFdIRUVMX0FDQ0VMX1NURVApXG4gICAgfVxuICAgIHJldHVybiBNYXRoLmZsb29yKHN0YXRlLm11bHQpXG4gIH1cblxuICAvLyDilIDilIDilIAgVlNDT0RFICh4dGVybS5qcywgYnJvd3NlciB3aGVlbCBldmVudHMpIOKUgOKUgOKUgFxuICAvLyBCcm93c2VyIHdoZWVsIGV2ZW50cyDigJQgbm8gZW5jb2RlciBib3VuY2UsIG5vIFNHUiBidXJzdHMuIERlY2F5IGN1cnZlXG4gIC8vIHVuY2hhbmdlZCBmcm9tIHRoZSBvcmlnaW5hbCB0dW5pbmcuIFNhbWUgZm9ybXVsYSBzaGFwZSBhcyB3aGVlbCBtb2RlXG4gIC8vIGFib3ZlIChrZWVwIGluIHN5bmMpIGJ1dCBTVEVQPTUgbm90IDE1IOKAlCBoaWdoZXIgZXZlbnQgcmF0ZSBoZXJlLlxuICBjb25zdCBnYXAgPSBub3cgLSBzdGF0ZS50aW1lXG4gIGNvbnN0IHNhbWVEaXIgPSBkaXIgPT09IHN0YXRlLmRpclxuICBzdGF0ZS50aW1lID0gbm93XG4gIHN0YXRlLmRpciA9IGRpclxuICAvLyB4dGVybS5qcyBwYXRoLiBEZWJ1ZyBsb2cgc2hvd3MgdHdvIHBhdHRlcm5zOiAoYSkgMjAtNTBtcyBnYXBzIGR1cmluZ1xuICAvLyBzdXN0YWluZWQgc2Nyb2xsICh+MzAgSHopLCAoYikgPDVtcyBzYW1lLWJhdGNoIGJ1cnN0cyBvbiBmbGlja3MuIEZvclxuICAvLyAoYikgZ2l2ZSAxIHJvdy9ldmVudCDigJQgdGhlIGJ1cnN0IGNvdW50IElTIHRoZSBhY2NlbGVyYXRpb24sIHNhbWUgYXNcbiAgLy8gbmF0aXZlLiBGb3IgKGEpIHRoZSBkZWNheSBjdXJ2ZSBnaXZlcyAzLTUgcm93cy4gRm9yIHNwYXJzZSBldmVudHNcbiAgLy8gKDEwMG1zKywgc2xvdyBkZWxpYmVyYXRlIHNjcm9sbCkgdGhlIGN1cnZlIGdpdmVzIDEtMy5cbiAgaWYgKHNhbWVEaXIgJiYgZ2FwIDwgV0hFRUxfQlVSU1RfTVMpIHJldHVybiAxXG4gIGlmICghc2FtZURpciB8fCBnYXAgPiBXSEVFTF9ERUNBWV9JRExFX01TKSB7XG4gICAgLy8gRGlyZWN0aW9uIHJldmVyc2FsIG9yIGxvbmcgaWRsZTogc3RhcnQgYXQgMiAobm90IDEpIHNvIHRoZSBmaXJzdFxuICAgIC8vIGNsaWNrIGFmdGVyIGEgcGF1c2UgbW92ZXMgYSB2aXNpYmxlIGFtb3VudC4gV2l0aG91dCB0aGlzLCBpZGxlLVxuICAgIC8vIHRoZW4tcmVzdW1lIGluIHRoZSBzYW1lIGRpcmVjdGlvbiBkZWNheXMgdG8gbXVsdOKJiDEgKDEgcm93KS5cbiAgICBzdGF0ZS5tdWx0ID0gMlxuICAgIHN0YXRlLmZyYWMgPSAwXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbSA9IE1hdGgucG93KDAuNSwgZ2FwIC8gV0hFRUxfREVDQVlfSEFMRkxJRkVfTVMpXG4gICAgY29uc3QgY2FwID1cbiAgICAgIGdhcCA+PSBXSEVFTF9ERUNBWV9HQVBfTVMgPyBXSEVFTF9ERUNBWV9DQVBfU0xPVyA6IFdIRUVMX0RFQ0FZX0NBUF9GQVNUXG4gICAgc3RhdGUubXVsdCA9IE1hdGgubWluKGNhcCwgMSArIChzdGF0ZS5tdWx0IC0gMSkgKiBtICsgV0hFRUxfREVDQVlfU1RFUCAqIG0pXG4gIH1cbiAgY29uc3QgdG90YWwgPSBzdGF0ZS5tdWx0ICsgc3RhdGUuZnJhY1xuICBjb25zdCByb3dzID0gTWF0aC5mbG9vcih0b3RhbClcbiAgc3RhdGUuZnJhYyA9IHRvdGFsIC0gcm93c1xuICByZXR1cm4gcm93c1xufVxuXG4vKiogUmVhZCBDTEFVREVfQ09ERV9TQ1JPTExfU1BFRUQsIGRlZmF1bHQgMSwgY2xhbXAgKDAsIDIwXS5cbiAqICBTb21lIHRlcm1pbmFscyBwcmUtbXVsdGlwbHkgd2hlZWwgZXZlbnRzIChnaG9zdHR5IGRpc2NyZXRlPTMsIGlUZXJtMlxuICogIFwiZmFzdGVyIHNjcm9sbFwiKSDigJQgYmFzZT0xIGlzIGNvcnJlY3QgdGhlcmUuIE90aGVycyBzZW5kIDEgZXZlbnQvbm90Y2gg4oCUXG4gKiAgc2V0IENMQVVERV9DT0RFX1NDUk9MTF9TUEVFRD0zIHRvIG1hdGNoIHZpbS9udmltL29wZW5jb2RlLiBXZSBjYW4ndFxuICogIGRldGVjdCB3aGljaCBraW5kIG9mIHRlcm1pbmFsIHdlJ3JlIGluLCBoZW5jZSB0aGUga25vYi4gQ2FsbGVkIGxhemlseVxuICogIGZyb20gaW5pdEFuZExvZ1doZWVsQWNjZWwgc28gZ2xvYmFsU2V0dGluZ3MuZW52IGhhcyBsb2FkZWQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZFNjcm9sbFNwZWVkQmFzZSgpOiBudW1iZXIge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudi5DTEFVREVfQ09ERV9TQ1JPTExfU1BFRURcbiAgaWYgKCFyYXcpIHJldHVybiAxXG4gIGNvbnN0IG4gPSBwYXJzZUZsb2F0KHJhdylcbiAgcmV0dXJuIE51bWJlci5pc05hTihuKSB8fCBuIDw9IDAgPyAxIDogTWF0aC5taW4obiwgMjApXG59XG5cbi8qKiBJbml0aWFsIHdoZWVsIGFjY2VsIHN0YXRlLiB4dGVybUpzPXRydWUgc2VsZWN0cyB0aGUgZGVjYXkgY3VydmUuXG4gKiAgYmFzZSBpcyB0aGUgbmF0aXZlLXBhdGggYmFzZWxpbmUgcm93cy9ldmVudCAoZGVmYXVsdCAxKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0V2hlZWxBY2NlbCh4dGVybUpzID0gZmFsc2UsIGJhc2UgPSAxKTogV2hlZWxBY2NlbFN0YXRlIHtcbiAgcmV0dXJuIHtcbiAgICB0aW1lOiAwLFxuICAgIG11bHQ6IGJhc2UsXG4gICAgZGlyOiAwLFxuICAgIHh0ZXJtSnMsXG4gICAgZnJhYzogMCxcbiAgICBiYXNlLFxuICAgIHBlbmRpbmdGbGlwOiBmYWxzZSxcbiAgICB3aGVlbE1vZGU6IGZhbHNlLFxuICAgIGJ1cnN0Q291bnQ6IDAsXG4gIH1cbn1cblxuLy8gTGF6eS1pbml0IGhlbHBlci4gaXNYdGVybUpzKCkgY29tYmluZXMgdGhlIFRFUk1fUFJPR1JBTSBlbnYgY2hlY2sgKyBhc3luY1xuLy8gWFRWRVJTSU9OIHByb2JlIOKAlCB0aGUgcHJvYmUgbWF5IG5vdCBoYXZlIHJlc29sdmVkIGF0IHJlbmRlciB0aW1lLCBzbyB0aGlzXG4vLyBpcyBjYWxsZWQgb24gdGhlIGZpcnN0IHdoZWVsIGV2ZW50ICg+PjUwbXMgYWZ0ZXIgc3RhcnR1cCkgd2hlbiBpdCdzIHNldHRsZWQuXG4vLyBMb2dzIGRldGVjdGVkIG1vZGUgb25jZSBzbyAtLWRlYnVnIHVzZXJzIGNhbiB2ZXJpZnkgU1NIIGRldGVjdGlvbiB3b3JrZWQuXG4vLyBUaGUgcmVuZGVyZXIgYWxzbyBjYWxscyBpc1h0ZXJtSnNIb3N0KCkgKGluIHJlbmRlci1ub2RlLXRvLW91dHB1dCkgdG9cbi8vIHNlbGVjdCB0aGUgZHJhaW4gYWxnb3JpdGhtIOKAlCBubyBzdGF0ZSB0byBwYXNzIHRocm91Z2guXG5mdW5jdGlvbiBpbml0QW5kTG9nV2hlZWxBY2NlbCgpOiBXaGVlbEFjY2VsU3RhdGUge1xuICBjb25zdCB4dGVybUpzID0gaXNYdGVybUpzKClcbiAgY29uc3QgYmFzZSA9IHJlYWRTY3JvbGxTcGVlZEJhc2UoKVxuICBsb2dGb3JEZWJ1Z2dpbmcoXG4gICAgYHdoZWVsIGFjY2VsOiAke3h0ZXJtSnMgPyAnZGVjYXkgKHh0ZXJtLmpzKScgOiAnd2luZG93IChuYXRpdmUpJ30gwrcgYmFzZT0ke2Jhc2V9IMK3IFRFUk1fUFJPR1JBTT0ke3Byb2Nlc3MuZW52LlRFUk1fUFJPR1JBTSA/PyAndW5zZXQnfWAsXG4gIClcbiAgcmV0dXJuIGluaXRXaGVlbEFjY2VsKHh0ZXJtSnMsIGJhc2UpXG59XG5cbi8vIERyYWctdG8tc2Nyb2xsOiB3aGVuIGRyYWdnaW5nIHBhc3QgdGhlIHZpZXdwb3J0IGVkZ2UsIHNjcm9sbCBieSB0aGlzIG1hbnlcbi8vIHJvd3MgZXZlcnkgQVVUT1NDUk9MTF9JTlRFUlZBTF9NUy4gTW9kZSAxMDAyIG1vdXNlIHRyYWNraW5nIG9ubHkgZmlyZXMgb25cbi8vIGNlbGwgY2hhbmdlLCBzbyBhIHRpbWVyIGlzIG5lZWRlZCB0byBjb250aW51ZSBzY3JvbGxpbmcgd2hpbGUgc3RhdGlvbmFyeS5cbmNvbnN0IEFVVE9TQ1JPTExfTElORVMgPSAyXG5jb25zdCBBVVRPU0NST0xMX0lOVEVSVkFMX01TID0gNTBcbi8vIEhhcmQgY2FwIG9uIGNvbnNlY3V0aXZlIGF1dG8tc2Nyb2xsIHRpY2tzLiBJZiB0aGUgcmVsZWFzZSBldmVudCBpcyBsb3N0XG4vLyAobW91c2UgcmVsZWFzZWQgb3V0c2lkZSB0ZXJtaW5hbCB3aW5kb3cg4oCUIHNvbWUgZW11bGF0b3JzIGRvbid0IGNhcHR1cmUgdGhlXG4vLyBwb2ludGVyIGFuZCBkcm9wIHRoZSByZWxlYXNlKSwgaXNEcmFnZ2luZyBzdGF5cyB0cnVlIGFuZCB0aGUgdGltZXIgd291bGRcbi8vIHJ1biB1bnRpbCBhIHNjcm9sbCBib3VuZGFyeS4gQ2FwIGJvdW5kcyB0aGUgZGFtYWdlOyBhbnkgbmV3IGRyYWcgbW90aW9uXG4vLyBldmVudCByZXN0YXJ0cyB0aGUgY291bnQgdmlhIGNoZWNrKCnihpJzdGFydCgpLlxuY29uc3QgQVVUT1NDUk9MTF9NQVhfVElDS1MgPSAyMDAgLy8gMTBzIEAgNTBtc1xuXG4vKipcbiAqIEtleWJvYXJkIHNjcm9sbCBuYXZpZ2F0aW9uIGZvciB0aGUgZnVsbHNjcmVlbiBsYXlvdXQncyBtZXNzYWdlIHNjcm9sbCBib3guXG4gKiBQZ1VwL1BnRG4gc2Nyb2xsIGJ5IGhhbGYtdmlld3BvcnQuIE1vdXNlIHdoZWVsIHNjcm9sbHMgYnkgYSBmZXcgbGluZXMuXG4gKiBTY3JvbGxpbmcgYnJlYWtzIHN0aWNreSBtb2RlOyBDdHJsK0VuZCByZS1lbmFibGVzIGl0LiBXaGVlbGluZyBkb3duIGF0XG4gKiB0aGUgYm90dG9tIGFsc28gcmUtZW5hYmxlcyBzdGlja3kgc28gbmV3IGNvbnRlbnQgZm9sbG93cyBuYXR1cmFsbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTY3JvbGxLZXliaW5kaW5nSGFuZGxlcih7XG4gIHNjcm9sbFJlZixcbiAgaXNBY3RpdmUsXG4gIG9uU2Nyb2xsLFxuICBpc01vZGFsID0gZmFsc2UsXG59OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IHNlbGVjdGlvbiA9IHVzZVNlbGVjdGlvbigpXG4gIGNvbnN0IHsgYWRkTm90aWZpY2F0aW9uIH0gPSB1c2VOb3RpZmljYXRpb25zKClcbiAgLy8gTGF6eS1pbml0ZWQgb24gZmlyc3Qgd2hlZWwgZXZlbnQgc28gdGhlIFhUVkVSU0lPTiBwcm9iZSAoZmlyZWQgYXRcbiAgLy8gcmF3LW1vZGUtZW5hYmxlIHRpbWUpIGhhcyByZXNvbHZlZCBieSB0aGVuIOKAlCBpbml0aWFsaXppbmcgaW4gdXNlUmVmKClcbiAgLy8gd291bGQgcmVhZCBnZXRXaGVlbEJhc2UoKSBiZWZvcmUgdGhlIHByb2JlIHJlcGx5IGFycml2ZXMgb3ZlciBTU0guXG4gIGNvbnN0IHdoZWVsQWNjZWwgPSB1c2VSZWY8V2hlZWxBY2NlbFN0YXRlIHwgbnVsbD4obnVsbClcblxuICBmdW5jdGlvbiBzaG93Q29waWVkVG9hc3QodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gZ2V0Q2xpcGJvYXJkUGF0aCByZWFkcyBlbnYgc3luY2hyb25vdXNseSDigJQgcHJlZGljdHMgd2hhdCBzZXRDbGlwYm9hcmRcbiAgICAvLyBkaWQgKG5hdGl2ZSBwYmNvcHkgLyB0bXV4IGxvYWQtYnVmZmVyIC8gcmF3IE9TQyA1Mikgc28gd2UgY2FuIHRlbGxcbiAgICAvLyB0aGUgdXNlciB3aGV0aGVyIHBhc3RlIHdpbGwgSnVzdCBXb3JrIG9yIG5lZWRzIHByZWZpeCtdLlxuICAgIGNvbnN0IHBhdGggPSBnZXRDbGlwYm9hcmRQYXRoKClcbiAgICBjb25zdCBuID0gdGV4dC5sZW5ndGhcbiAgICBsZXQgbXNnOiBzdHJpbmdcbiAgICBzd2l0Y2ggKHBhdGgpIHtcbiAgICAgIGNhc2UgJ25hdGl2ZSc6XG4gICAgICAgIG1zZyA9IGBjb3BpZWQgJHtufSBjaGFycyB0byBjbGlwYm9hcmRgXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICd0bXV4LWJ1ZmZlcic6XG4gICAgICAgIG1zZyA9IGBjb3BpZWQgJHtufSBjaGFycyB0byB0bXV4IGJ1ZmZlciDCtyBwYXN0ZSB3aXRoIHByZWZpeCArIF1gXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdvc2M1Mic6XG4gICAgICAgIG1zZyA9IGBzZW50ICR7bn0gY2hhcnMgdmlhIE9TQyA1MiDCtyBjaGVjayB0ZXJtaW5hbCBjbGlwYm9hcmQgc2V0dGluZ3MgaWYgcGFzdGUgZmFpbHNgXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICAgIGFkZE5vdGlmaWNhdGlvbih7XG4gICAgICBrZXk6ICdzZWxlY3Rpb24tY29waWVkJyxcbiAgICAgIHRleHQ6IG1zZyxcbiAgICAgIGNvbG9yOiAnc3VnZ2VzdGlvbicsXG4gICAgICBwcmlvcml0eTogJ2ltbWVkaWF0ZScsXG4gICAgICB0aW1lb3V0TXM6IHBhdGggPT09ICduYXRpdmUnID8gMjAwMCA6IDQwMDAsXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvcHlBbmRUb2FzdCgpOiB2b2lkIHtcbiAgICBjb25zdCB0ZXh0ID0gc2VsZWN0aW9uLmNvcHlTZWxlY3Rpb24oKVxuICAgIGlmICh0ZXh0KSBzaG93Q29waWVkVG9hc3QodGV4dClcbiAgfVxuXG4gIC8vIFRyYW5zbGF0ZSBzZWxlY3Rpb24gdG8gdHJhY2sgYSBrZXlib2FyZCBwYWdlIGp1bXAuIFNlbGVjdGlvbiBjb29yZHMgYXJlXG4gIC8vIHNjcmVlbi1idWZmZXItbG9jYWw7IGEgc2Nyb2xsVG8gdGhhdCBtb3ZlcyBjb250ZW50IGJ5IE4gcm93cyBtdXN0IGFsc29cbiAgLy8gc2hpZnQgYW5jaG9yK2ZvY3VzIGJ5IE4gc28gdGhlIGhpZ2hsaWdodCBzdGF5cyBvbiB0aGUgc2FtZSB0ZXh0IChuYXRpdmVcbiAgLy8gdGVybWluYWwgYmVoYXZpb3I6IHNlbGVjdGlvbiBtb3ZlcyB3aXRoIGNvbnRlbnQsIGNsaXBzIGF0IHZpZXdwb3J0XG4gIC8vIGVkZ2VzKS4gUm93cyB0aGF0IHNjcm9sbCBvdXQgb2YgdGhlIHZpZXdwb3J0IGFyZSBjYXB0dXJlZCBpbnRvXG4gIC8vIHNjcm9sbGVkT2ZmQWJvdmUvQmVsb3cgYmVmb3JlIHRoZSBzY3JvbGwgc28gZ2V0U2VsZWN0ZWRUZXh0IHN0aWxsXG4gIC8vIHJldHVybnMgdGhlIGZ1bGwgdGV4dC4gV2hlZWwgc2Nyb2xsIChzY3JvbGw6bGluZVVwL0Rvd24gdmlhIHNjcm9sbEJ5KVxuICAvLyBzdGlsbCBjbGVhcnMg4oCUIGl0cyBhc3luYyBwZW5kaW5nU2Nyb2xsRGVsdGEgZHJhaW4gbWVhbnMgdGhlIGFjdHVhbFxuICAvLyBkZWx0YSBpc24ndCBrbm93biBzeW5jaHJvbm91c2x5IChmb2xsb3ctdXApLlxuICBmdW5jdGlvbiB0cmFuc2xhdGVTZWxlY3Rpb25Gb3JKdW1wKHM6IFNjcm9sbEJveEhhbmRsZSwgZGVsdGE6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHNlbCA9IHNlbGVjdGlvbi5nZXRTdGF0ZSgpXG4gICAgaWYgKCFzZWw/LmFuY2hvciB8fCAhc2VsLmZvY3VzKSByZXR1cm5cbiAgICBjb25zdCB0b3AgPSBzLmdldFZpZXdwb3J0VG9wKClcbiAgICBjb25zdCBib3R0b20gPSB0b3AgKyBzLmdldFZpZXdwb3J0SGVpZ2h0KCkgLSAxXG4gICAgLy8gT25seSB0cmFuc2xhdGUgaWYgdGhlIHNlbGVjdGlvbiBpcyBPTiBzY3JvbGxib3ggY29udGVudC4gU2VsZWN0aW9uc1xuICAgIC8vIGluIHRoZSBmb290ZXIvcHJvbXB0L1N0aWNreVByb21wdEhlYWRlciBhcmUgb24gc3RhdGljIHRleHQg4oCUIHRoZVxuICAgIC8vIHNjcm9sbCBkb2Vzbid0IG1vdmUgd2hhdCdzIHVuZGVyIHRoZW0uIFNhbWUgZ3VhcmQgYXMgaW5rLnRzeCdzXG4gICAgLy8gYXV0by1mb2xsb3cgdHJhbnNsYXRlIChjb21taXQgMzZhOGQxNTQpLlxuICAgIGlmIChzZWwuYW5jaG9yLnJvdyA8IHRvcCB8fCBzZWwuYW5jaG9yLnJvdyA+IGJvdHRvbSkgcmV0dXJuXG4gICAgLy8gQ3Jvc3MtYm91bmRhcnk6IGFuY2hvciBpbiBzY3JvbGxib3gsIGZvY3VzIGluIGZvb3Rlci9oZWFkZXIuIE1pcnJvclxuICAgIC8vIGluay50c3gncyBGbGFnLTMgZ3VhcmQg4oCUIGZhbGwgdGhyb3VnaCB3aXRob3V0IHNoaWZ0aW5nIE9SIGNhcHR1cmluZy5cbiAgICAvLyBUaGUgc3RhdGljIGVuZHBvaW50IHBpbnMgdGhlIHNlbGVjdGlvbjsgc2hpZnRpbmcgd291bGQgdGVsZXBvcnQgaXRcbiAgICAvLyBpbnRvIHNjcm9sbGJveCBjb250ZW50LlxuICAgIGlmIChzZWwuZm9jdXMucm93IDwgdG9wIHx8IHNlbC5mb2N1cy5yb3cgPiBib3R0b20pIHJldHVyblxuICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KDAsIHMuZ2V0U2Nyb2xsSGVpZ2h0KCkgLSBzLmdldFZpZXdwb3J0SGVpZ2h0KCkpXG4gICAgY29uc3QgY3VyID0gcy5nZXRTY3JvbGxUb3AoKSArIHMuZ2V0UGVuZGluZ0RlbHRhKClcbiAgICAvLyBBY3R1YWwgc2Nyb2xsIGRpc3RhbmNlIGFmdGVyIGJvdW5kYXJ5IGNsYW1wLiBqdW1wQnkgbWF5IGNhbGxcbiAgICAvLyBzY3JvbGxUb0JvdHRvbSB3aGVuIHRhcmdldCA+PSBtYXggYnV0IHRoZSB2aWV3IGNhbid0IG1vdmUgcGFzdCBtYXgsXG4gICAgLy8gc28gdGhlIHNlbGVjdGlvbiBzaGlmdCBpcyBib3VuZGVkIGhlcmUuXG4gICAgY29uc3QgYWN0dWFsID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obWF4LCBjdXIgKyBkZWx0YSkpIC0gY3VyXG4gICAgaWYgKGFjdHVhbCA9PT0gMCkgcmV0dXJuXG4gICAgaWYgKGFjdHVhbCA+IDApIHtcbiAgICAgIC8vIFNjcm9sbGluZyBkb3duOiBjb250ZW50IG1vdmVzIHVwLiBSb3dzIGF0IHRoZSBUT1AgbGVhdmUgdmlld3BvcnQuXG4gICAgICAvLyBBbmNob3IrZm9jdXMgc2hpZnQgLWFjdHVhbCBzbyB0aGV5IHRyYWNrIHRoZSBjb250ZW50IHRoYXQgbW92ZWQgdXAuXG4gICAgICBzZWxlY3Rpb24uY2FwdHVyZVNjcm9sbGVkUm93cyh0b3AsIHRvcCArIGFjdHVhbCAtIDEsICdhYm92ZScpXG4gICAgICBzZWxlY3Rpb24uc2hpZnRTZWxlY3Rpb24oLWFjdHVhbCwgdG9wLCBib3R0b20pXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNjcm9sbGluZyB1cDogY29udGVudCBtb3ZlcyBkb3duLiBSb3dzIGF0IHRoZSBCT1RUT00gbGVhdmUgdmlld3BvcnQuXG4gICAgICBjb25zdCBhID0gLWFjdHVhbFxuICAgICAgc2VsZWN0aW9uLmNhcHR1cmVTY3JvbGxlZFJvd3MoYm90dG9tIC0gYSArIDEsIGJvdHRvbSwgJ2JlbG93JylcbiAgICAgIHNlbGVjdGlvbi5zaGlmdFNlbGVjdGlvbihhLCB0b3AsIGJvdHRvbSlcbiAgICB9XG4gIH1cblxuICB1c2VLZXliaW5kaW5ncyhcbiAgICB7XG4gICAgICAnc2Nyb2xsOnBhZ2VVcCc6ICgpID0+IHtcbiAgICAgICAgY29uc3QgcyA9IHNjcm9sbFJlZi5jdXJyZW50XG4gICAgICAgIGlmICghcykgcmV0dXJuXG4gICAgICAgIGNvbnN0IGQgPSAtTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihzLmdldFZpZXdwb3J0SGVpZ2h0KCkgLyAyKSlcbiAgICAgICAgdHJhbnNsYXRlU2VsZWN0aW9uRm9ySnVtcChzLCBkKVxuICAgICAgICBjb25zdCBzdGlja3kgPSBqdW1wQnkocywgZClcbiAgICAgICAgb25TY3JvbGw/LihzdGlja3ksIHMpXG4gICAgICB9LFxuICAgICAgJ3Njcm9sbDpwYWdlRG93bic6ICgpID0+IHtcbiAgICAgICAgY29uc3QgcyA9IHNjcm9sbFJlZi5jdXJyZW50XG4gICAgICAgIGlmICghcykgcmV0dXJuXG4gICAgICAgIGNvbnN0IGQgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHMuZ2V0Vmlld3BvcnRIZWlnaHQoKSAvIDIpKVxuICAgICAgICB0cmFuc2xhdGVTZWxlY3Rpb25Gb3JKdW1wKHMsIGQpXG4gICAgICAgIGNvbnN0IHN0aWNreSA9IGp1bXBCeShzLCBkKVxuICAgICAgICBvblNjcm9sbD8uKHN0aWNreSwgcylcbiAgICAgIH0sXG4gICAgICAnc2Nyb2xsOmxpbmVVcCc6ICgpID0+IHtcbiAgICAgICAgLy8gV2hlZWw6IHNjcm9sbEJ5IGFjY3VtdWxhdGVzIGludG8gcGVuZGluZ1Njcm9sbERlbHRhLCBkcmFpbmVkIGFzeW5jXG4gICAgICAgIC8vIGJ5IHRoZSByZW5kZXJlci4gY2FwdHVyZVNjcm9sbGVkUm93cyBjYW4ndCByZWFkIHRoZSBvdXRnb2luZyByb3dzXG4gICAgICAgIC8vIGJlZm9yZSB0aGV5IGxlYXZlIChkcmFpbiBpcyBub24tZGV0ZXJtaW5pc3RpYykuIENsZWFyIGZvciBub3cuXG4gICAgICAgIHNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpXG4gICAgICAgIGNvbnN0IHMgPSBzY3JvbGxSZWYuY3VycmVudFxuICAgICAgICAvLyBSZXR1cm4gZmFsc2UgKG5vdCBjb25zdW1lZCkgd2hlbiB0aGUgU2Nyb2xsQm94IGNvbnRlbnQgZml0cyDigJRcbiAgICAgICAgLy8gc2Nyb2xsIHdvdWxkIGJlIGEgbm8tb3AuIExldHMgYSBjaGlsZCBjb21wb25lbnQncyBoYW5kbGVyIHRha2VcbiAgICAgICAgLy8gdGhlIHdoZWVsIGV2ZW50IGluc3RlYWQgKGUuZy4gU2V0dGluZ3MgQ29uZmlnJ3MgbGlzdCBuYXZpZ2F0aW9uXG4gICAgICAgIC8vIGluc2lkZSB0aGUgY2VudGVyZWQgTW9kYWwsIHdoZXJlIHRoZSBwYWdpbmF0ZWQgc2xpY2UgYWx3YXlzIGZpdHMpLlxuICAgICAgICBpZiAoIXMgfHwgcy5nZXRTY3JvbGxIZWlnaHQoKSA8PSBzLmdldFZpZXdwb3J0SGVpZ2h0KCkpIHJldHVybiBmYWxzZVxuICAgICAgICB3aGVlbEFjY2VsLmN1cnJlbnQgPz89IGluaXRBbmRMb2dXaGVlbEFjY2VsKClcbiAgICAgICAgc2Nyb2xsVXAocywgY29tcHV0ZVdoZWVsU3RlcCh3aGVlbEFjY2VsLmN1cnJlbnQsIC0xLCBwZXJmb3JtYW5jZS5ub3coKSkpXG4gICAgICAgIG9uU2Nyb2xsPy4oZmFsc2UsIHMpXG4gICAgICB9LFxuICAgICAgJ3Njcm9sbDpsaW5lRG93bic6ICgpID0+IHtcbiAgICAgICAgc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKClcbiAgICAgICAgY29uc3QgcyA9IHNjcm9sbFJlZi5jdXJyZW50XG4gICAgICAgIGlmICghcyB8fCBzLmdldFNjcm9sbEhlaWdodCgpIDw9IHMuZ2V0Vmlld3BvcnRIZWlnaHQoKSkgcmV0dXJuIGZhbHNlXG4gICAgICAgIHdoZWVsQWNjZWwuY3VycmVudCA/Pz0gaW5pdEFuZExvZ1doZWVsQWNjZWwoKVxuICAgICAgICBjb25zdCBzdGVwID0gY29tcHV0ZVdoZWVsU3RlcCh3aGVlbEFjY2VsLmN1cnJlbnQsIDEsIHBlcmZvcm1hbmNlLm5vdygpKVxuICAgICAgICBjb25zdCByZWFjaGVkQm90dG9tID0gc2Nyb2xsRG93bihzLCBzdGVwKVxuICAgICAgICBvblNjcm9sbD8uKHJlYWNoZWRCb3R0b20sIHMpXG4gICAgICB9LFxuICAgICAgJ3Njcm9sbDp0b3AnOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHMgPSBzY3JvbGxSZWYuY3VycmVudFxuICAgICAgICBpZiAoIXMpIHJldHVyblxuICAgICAgICB0cmFuc2xhdGVTZWxlY3Rpb25Gb3JKdW1wKHMsIC0ocy5nZXRTY3JvbGxUb3AoKSArIHMuZ2V0UGVuZGluZ0RlbHRhKCkpKVxuICAgICAgICBzLnNjcm9sbFRvKDApXG4gICAgICAgIG9uU2Nyb2xsPy4oZmFsc2UsIHMpXG4gICAgICB9LFxuICAgICAgJ3Njcm9sbDpib3R0b20nOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHMgPSBzY3JvbGxSZWYuY3VycmVudFxuICAgICAgICBpZiAoIXMpIHJldHVyblxuICAgICAgICBjb25zdCBtYXggPSBNYXRoLm1heCgwLCBzLmdldFNjcm9sbEhlaWdodCgpIC0gcy5nZXRWaWV3cG9ydEhlaWdodCgpKVxuICAgICAgICB0cmFuc2xhdGVTZWxlY3Rpb25Gb3JKdW1wKFxuICAgICAgICAgIHMsXG4gICAgICAgICAgbWF4IC0gKHMuZ2V0U2Nyb2xsVG9wKCkgKyBzLmdldFBlbmRpbmdEZWx0YSgpKSxcbiAgICAgICAgKVxuICAgICAgICAvLyBzY3JvbGxUbyhtYXgpIGVhZ2VyLXdyaXRlcyBzY3JvbGxUb3Agc28gdGhlIHJlbmRlci1waGFzZSBzdGlja3lcbiAgICAgICAgLy8gZm9sbG93IGNvbXB1dGVzIGZvbGxvd0RlbHRhPTAuIFdpdGhvdXQgdGhpcywgc2Nyb2xsVG9Cb3R0b20oKVxuICAgICAgICAvLyBhbG9uZSBsZWF2ZXMgc2Nyb2xsVG9wIHN0YWxlIOKGkiBmb2xsb3dEZWx0YT1tYXgtc3RhbGUg4oaSXG4gICAgICAgIC8vIHNoaWZ0U2VsZWN0aW9uRm9yRm9sbG93IGFwcGxpZXMgdGhlIFNBTUUgc2hpZnQgd2UgYWxyZWFkeSBkaWRcbiAgICAgICAgLy8gYWJvdmUsIDLDlyBvZmZzZXQuIHNjcm9sbFRvQm90dG9tKCkgdGhlbiByZS1lbmFibGVzIHN0aWNreS5cbiAgICAgICAgcy5zY3JvbGxUbyhtYXgpXG4gICAgICAgIHMuc2Nyb2xsVG9Cb3R0b20oKVxuICAgICAgICBvblNjcm9sbD8uKHRydWUsIHMpXG4gICAgICB9LFxuICAgICAgJ3NlbGVjdGlvbjpjb3B5JzogY29weUFuZFRvYXN0LFxuICAgIH0sXG4gICAgeyBjb250ZXh0OiAnU2Nyb2xsJywgaXNBY3RpdmUgfSxcbiAgKVxuXG4gIC8vIHNjcm9sbDpoYWxmUGFnZSovZnVsbFBhZ2UqIGhhdmUgbm8gZGVmYXVsdCBrZXkgYmluZGluZ3Mg4oCUIGN0cmwrdS9kL2IvZlxuICAvLyBhbGwgaGF2ZSByZWFsIG93bmVycyBpbiBub3JtYWwgbW9kZSAoa2lsbC1saW5lL2V4aXQvdGFzazpiYWNrZ3JvdW5kL1xuICAvLyBraWxsLWFnZW50cykuIFRyYW5zY3JpcHQgbW9kZSBnZXRzIHRoZW0gdmlhIHRoZSBpc01vZGFsIHJhdyB1c2VJbnB1dFxuICAvLyBiZWxvdy4gVGhlc2UgaGFuZGxlcnMgc3RheSBmb3IgY3VzdG9tIHJlYmluZHMgb25seS5cbiAgdXNlS2V5YmluZGluZ3MoXG4gICAge1xuICAgICAgJ3Njcm9sbDpoYWxmUGFnZVVwJzogKCkgPT4ge1xuICAgICAgICBjb25zdCBzID0gc2Nyb2xsUmVmLmN1cnJlbnRcbiAgICAgICAgaWYgKCFzKSByZXR1cm5cbiAgICAgICAgY29uc3QgZCA9IC1NYXRoLm1heCgxLCBNYXRoLmZsb29yKHMuZ2V0Vmlld3BvcnRIZWlnaHQoKSAvIDIpKVxuICAgICAgICB0cmFuc2xhdGVTZWxlY3Rpb25Gb3JKdW1wKHMsIGQpXG4gICAgICAgIGNvbnN0IHN0aWNreSA9IGp1bXBCeShzLCBkKVxuICAgICAgICBvblNjcm9sbD8uKHN0aWNreSwgcylcbiAgICAgIH0sXG4gICAgICAnc2Nyb2xsOmhhbGZQYWdlRG93bic6ICgpID0+IHtcbiAgICAgICAgY29uc3QgcyA9IHNjcm9sbFJlZi5jdXJyZW50XG4gICAgICAgIGlmICghcykgcmV0dXJuXG4gICAgICAgIGNvbnN0IGQgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHMuZ2V0Vmlld3BvcnRIZWlnaHQoKSAvIDIpKVxuICAgICAgICB0cmFuc2xhdGVTZWxlY3Rpb25Gb3JKdW1wKHMsIGQpXG4gICAgICAgIGNvbnN0IHN0aWNreSA9IGp1bXBCeShzLCBkKVxuICAgICAgICBvblNjcm9sbD8uKHN0aWNreSwgcylcbiAgICAgIH0sXG4gICAgICAnc2Nyb2xsOmZ1bGxQYWdlVXAnOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHMgPSBzY3JvbGxSZWYuY3VycmVudFxuICAgICAgICBpZiAoIXMpIHJldHVyblxuICAgICAgICBjb25zdCBkID0gLU1hdGgubWF4KDEsIHMuZ2V0Vmlld3BvcnRIZWlnaHQoKSlcbiAgICAgICAgdHJhbnNsYXRlU2VsZWN0aW9uRm9ySnVtcChzLCBkKVxuICAgICAgICBjb25zdCBzdGlja3kgPSBqdW1wQnkocywgZClcbiAgICAgICAgb25TY3JvbGw/LihzdGlja3ksIHMpXG4gICAgICB9LFxuICAgICAgJ3Njcm9sbDpmdWxsUGFnZURvd24nOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHMgPSBzY3JvbGxSZWYuY3VycmVudFxuICAgICAgICBpZiAoIXMpIHJldHVyblxuICAgICAgICBjb25zdCBkID0gTWF0aC5tYXgoMSwgcy5nZXRWaWV3cG9ydEhlaWdodCgpKVxuICAgICAgICB0cmFuc2xhdGVTZWxlY3Rpb25Gb3JKdW1wKHMsIGQpXG4gICAgICAgIGNvbnN0IHN0aWNreSA9IGp1bXBCeShzLCBkKVxuICAgICAgICBvblNjcm9sbD8uKHN0aWNreSwgcylcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IGNvbnRleHQ6ICdTY3JvbGwnLCBpc0FjdGl2ZSB9LFxuICApXG5cbiAgLy8gTW9kYWwgcGFnZXIga2V5cyDigJQgdHJhbnNjcmlwdCBtb2RlIG9ubHkuIGxlc3MvdG11eCBjb3B5LW1vZGUgbGluZWFnZTpcbiAgLy8gY3RybCt1L2QgKGhhbGYtcGFnZSksIGN0cmwrYi9mIChmdWxsLXBhZ2UpLCBnL0cgKHRvcC9ib3R0b20pLiBUb20nc1xuICAvLyByZXNvbHV0aW9uICgyMDI2LTAzLTE1KTogXCJJbiBjdHJsLW8gbW9kZSwgY3RybC11LCBjdHJsLWQsIGV0Yy4gc2hvdWxkXG4gIC8vIHJvdWdobHkganVzdCB3b3JrIVwiIOKAlCB0cmFuc2NyaXB0IGlzIHRoZSBjb3B5LW1vZGUgY29udGFpbmVyLlxuICAvL1xuICAvLyBTYWZlIGJlY2F1c2UgdGhlIGNvbmZsaWN0aW5nIGhhbmRsZXJzIGFyZW4ndCByZWFjaGFibGUgaGVyZTpcbiAgLy8gICBjdHJsK3Ug4oaSIGtpbGwtbGluZSwgY3RybCtkIOKGkiBleGl0OiBQcm9tcHRJbnB1dCBub3QgbW91bnRlZFxuICAvLyAgIGN0cmwrYiDihpIgdGFzazpiYWNrZ3JvdW5kOiBTZXNzaW9uQmFja2dyb3VuZEhpbnQgbm90IG1vdW50ZWRcbiAgLy8gICBjdHJsK2Yg4oaSIGNoYXQ6a2lsbEFnZW50cyBtb3ZlZCB0byBjdHJsK3ggY3RybCtrOyBubyBjb25mbGljdFxuICAvLyAgIGcvRyDihpIgcHJpbnRhYmxlIGNoYXJzOiBubyBwcm9tcHQgdG8gZWF0IHRoZW0sIG5vIHZpbS9zdGlja3kgZ2F0ZSBuZWVkZWRcbiAgLy9cbiAgLy8gVE9ETyhzZWFyY2gpOiBgL2AsIG4vTiDigJQgYnVpbGQgb24gUmljaGFyZCBLaW0ncyBkOTRiMDdhZGQ0IChicmFuY2hcbiAgLy8gY2xhdWRlL2p1bXAtcmVjZW50LW1lc3NhZ2UtQ0VQY3EpLiBnZXRJdGVtWSBZb2dhLXdhbGsgKyBjb21wdXRlT3JpZ2luICtcbiAgLy8gYW5jaG9yWSBhbHJlYWR5IHNvbHZlIHNjcm9sbC10by1pbmRleC4ganVtcFRvUHJldlR1cm4gaXMgdGhlIG4vTlxuICAvLyB0ZW1wbGF0ZS4gU2luZ2xlLXNob3QgdmlhIE9WRVJTQ0FOX1JPV1M9ODA7IHR3by1waGFzZSB3YXMgdHJpZWQgYW5kXG4gIC8vIGFiYW5kb25lZCAo4p2vIG9zY2lsbGF0aW9uKS4gU2VlIHRlYW0gbWVtb3J5IHNjcm9sbC1jb3B5LW1vZGUtZGVzaWduLm1kLlxuICB1c2VJbnB1dChcbiAgICAoaW5wdXQsIGtleSwgZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHMgPSBzY3JvbGxSZWYuY3VycmVudFxuICAgICAgaWYgKCFzKSByZXR1cm5cbiAgICAgIGNvbnN0IHN0aWNreSA9IGFwcGx5TW9kYWxQYWdlckFjdGlvbihzLCBtb2RhbFBhZ2VyQWN0aW9uKGlucHV0LCBrZXkpLCBkID0+XG4gICAgICAgIHRyYW5zbGF0ZVNlbGVjdGlvbkZvckp1bXAocywgZCksXG4gICAgICApXG4gICAgICBpZiAoc3RpY2t5ID09PSBudWxsKSByZXR1cm5cbiAgICAgIG9uU2Nyb2xsPy4oc3RpY2t5LCBzKVxuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcbiAgICB9LFxuICAgIHsgaXNBY3RpdmU6IGlzQWN0aXZlICYmIGlzTW9kYWwgfSxcbiAgKVxuXG4gIC8vIEVzYyBjbGVhcnMgc2VsZWN0aW9uOyBhbnkgb3RoZXIga2V5c3Ryb2tlIGFsc28gY2xlYXJzIGl0IChtYXRjaGVzXG4gIC8vIG5hdGl2ZSB0ZXJtaW5hbCBiZWhhdmlvciB3aGVyZSBzZWxlY3Rpb24gZGlzYXBwZWFycyBvbiBpbnB1dCkuXG4gIC8vIEN0cmwrQyBjb3BpZXMgd2hlbiBhIHNlbGVjdGlvbiBleGlzdHMg4oCUIG5lZWRlZCBvbiBsZWdhY3kgdGVybWluYWxzXG4gIC8vIHdoZXJlIGN0cmwrc2hpZnQrYyBzZW5kcyB0aGUgc2FtZSBieXRlIChcXHgwMywgc2hpZnQgaXMgbG9zdCkgYW5kXG4gIC8vIGNtZCtjIG5ldmVyIHJlYWNoZXMgdGhlIHB0eSAodGVybWluYWwgaW50ZXJjZXB0cyBpdCBmb3IgRWRpdCA+IENvcHkpLlxuICAvLyBIYW5kbGVkIHZpYSByYXcgdXNlSW5wdXQgc28gd2UgY2FuIGNvbmRpdGlvbmFsbHkgY29uc3VtZTogRXNjL0N0cmwrQ1xuICAvLyBvbmx5IHN0b3AgcHJvcGFnYXRpb24gd2hlbiBhIHNlbGVjdGlvbiBleGlzdHMsIGxldHRpbmcgdGhlbSBzdGlsbCB3b3JrXG4gIC8vIGZvciBjYW5jZWwtcmVxdWVzdCAvIGludGVycnVwdCBvdGhlcndpc2UuIE90aGVyIGtleXMgbmV2ZXIgc3RvcFxuICAvLyBwcm9wYWdhdGlvbiDigJQgdGhleSdyZSBvYnNlcnZlZCB0byBjbGVhciBzZWxlY3Rpb24gYXMgYSBzaWRlLWVmZmVjdC5cbiAgLy8gVGhlIHNlbGVjdGlvbjpjb3B5IGtleWJpbmRpbmcgKGN0cmwrc2hpZnQrYyAvIGNtZCtjKSByZWdpc3RlcnMgYWJvdmVcbiAgLy8gdmlhIHVzZUtleWJpbmRpbmdzIGFuZCBjb25zdW1lcyBpdHMgZXZlbnQgYmVmb3JlIHJlYWNoaW5nIGhlcmUuXG4gIHVzZUlucHV0KFxuICAgIChpbnB1dCwga2V5LCBldmVudCkgPT4ge1xuICAgICAgaWYgKCFzZWxlY3Rpb24uaGFzU2VsZWN0aW9uKCkpIHJldHVyblxuICAgICAgaWYgKGtleS5lc2NhcGUpIHtcbiAgICAgICAgc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKClcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoa2V5LmN0cmwgJiYgIWtleS5zaGlmdCAmJiAha2V5Lm1ldGEgJiYgaW5wdXQgPT09ICdjJykge1xuICAgICAgICBjb3B5QW5kVG9hc3QoKVxuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IG1vdmUgPSBzZWxlY3Rpb25Gb2N1c01vdmVGb3JLZXkoa2V5KVxuICAgICAgaWYgKG1vdmUpIHtcbiAgICAgICAgc2VsZWN0aW9uLm1vdmVGb2N1cyhtb3ZlKVxuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRDbGVhclNlbGVjdGlvbk9uS2V5KGtleSkpIHtcbiAgICAgICAgc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKClcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgaXNBY3RpdmUgfSxcbiAgKVxuXG4gIHVzZURyYWdUb1Njcm9sbChzY3JvbGxSZWYsIHNlbGVjdGlvbiwgaXNBY3RpdmUsIG9uU2Nyb2xsKVxuICB1c2VDb3B5T25TZWxlY3Qoc2VsZWN0aW9uLCBpc0FjdGl2ZSwgc2hvd0NvcGllZFRvYXN0KVxuICB1c2VTZWxlY3Rpb25CZ0NvbG9yKHNlbGVjdGlvbilcblxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIEF1dG8tc2Nyb2xsIHRoZSBTY3JvbGxCb3ggd2hlbiB0aGUgdXNlciBkcmFncyBhIHNlbGVjdGlvbiBwYXN0IGl0cyB0b3Agb3JcbiAqIGJvdHRvbSBlZGdlLiBUaGUgYW5jaG9yIGlzIHNoaWZ0ZWQgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiBzbyBpdCBzdGF5c1xuICogb24gdGhlIHNhbWUgY29udGVudCAoY29udGVudCB0aGF0IHdhcyBhdCB2aWV3cG9ydCByb3cgTiBpcyBub3cgYXQgcm93IE7CsWRcbiAqIGFmdGVyIHNjcm9sbGluZyBieSBkKS4gRm9jdXMgc3RheXMgYXQgdGhlIG1vdXNlIHBvc2l0aW9uIChlZGdlIHJvdykuXG4gKlxuICogU2VsZWN0aW9uIGNvb3JkcyBhcmUgc2NyZWVuLWJ1ZmZlci1sb2NhbCwgc28gdGhlIGFuY2hvciBpcyBjbGFtcGVkIHRvIHRoZVxuICogdmlld3BvcnQgYm91bmRzIG9uY2UgdGhlIG9yaWdpbmFsIGNvbnRlbnQgc2Nyb2xscyBvdXQuIFRvIHByZXNlcnZlIHRoZSBmdWxsXG4gKiBzZWxlY3Rpb24sIHJvd3MgYWJvdXQgdG8gc2Nyb2xsIG91dCBhcmUgY2FwdHVyZWQgaW50byBzY3JvbGxlZE9mZkFib3ZlL1xuICogc2Nyb2xsZWRPZmZCZWxvdyBiZWZvcmUgZWFjaCBzY3JvbGwgc3RlcCBhbmQgam9pbmVkIGJhY2sgaW4gYnlcbiAqIGdldFNlbGVjdGVkVGV4dC5cbiAqL1xuZnVuY3Rpb24gdXNlRHJhZ1RvU2Nyb2xsKFxuICBzY3JvbGxSZWY6IFJlZk9iamVjdDxTY3JvbGxCb3hIYW5kbGUgfCBudWxsPixcbiAgc2VsZWN0aW9uOiBSZXR1cm5UeXBlPHR5cGVvZiB1c2VTZWxlY3Rpb24+LFxuICBpc0FjdGl2ZTogYm9vbGVhbixcbiAgb25TY3JvbGw6IFByb3BzWydvblNjcm9sbCddLFxuKTogdm9pZCB7XG4gIGNvbnN0IHRpbWVyUmVmID0gdXNlUmVmPE5vZGVKUy5UaW1lb3V0IHwgbnVsbD4obnVsbClcbiAgY29uc3QgZGlyUmVmID0gdXNlUmVmPC0xIHwgMCB8IDE+KDApIC8vIC0xIHNjcm9sbGluZyB1cCwgKzEgZG93biwgMCBpZGxlXG4gIC8vIFN1cnZpdmVzIHN0b3AoKSDigJQgcmVzZXQgb25seSBvbiBkcmFnLWZpbmlzaC4gU2VlIGNoZWNrKCkgZm9yIHNlbWFudGljcy5cbiAgY29uc3QgbGFzdFNjcm9sbGVkRGlyUmVmID0gdXNlUmVmPC0xIHwgMCB8IDE+KDApXG4gIGNvbnN0IHRpY2tzUmVmID0gdXNlUmVmKDApXG4gIC8vIG9uU2Nyb2xsIG1heSBjaGFuZ2UgaWRlbnRpdHkgZXZlcnkgcmVuZGVyIChpZiBub3QgbWVtb2l6ZWQgYnkgY2FsbGVyKS5cbiAgLy8gUmVhZCB0aHJvdWdoIGEgcmVmIHNvIHRoZSBlZmZlY3QgZG9lc24ndCByZS1zdWJzY3JpYmUgYW5kIGtpbGwgdGhlIHRpbWVyXG4gIC8vIG9uIGVhY2ggc2Nyb2xsLWluZHVjZWQgcmUtcmVuZGVyLlxuICBjb25zdCBvblNjcm9sbFJlZiA9IHVzZVJlZihvblNjcm9sbClcbiAgb25TY3JvbGxSZWYuY3VycmVudCA9IG9uU2Nyb2xsXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWlzQWN0aXZlKSByZXR1cm5cblxuICAgIGZ1bmN0aW9uIHN0b3AoKTogdm9pZCB7XG4gICAgICBkaXJSZWYuY3VycmVudCA9IDBcbiAgICAgIGlmICh0aW1lclJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXJSZWYuY3VycmVudClcbiAgICAgICAgdGltZXJSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0aWNrKCk6IHZvaWQge1xuICAgICAgY29uc3Qgc2VsID0gc2VsZWN0aW9uLmdldFN0YXRlKClcbiAgICAgIGNvbnN0IHMgPSBzY3JvbGxSZWYuY3VycmVudFxuICAgICAgY29uc3QgZGlyID0gZGlyUmVmLmN1cnJlbnRcbiAgICAgIC8vIGRpciA9PT0gMCBkZWZlbmRzIGFnYWluc3QgYSBzdGFsZSBpbnRlcnZhbCAoc3RhcnQoKSBtYXkgaGF2ZSBzZXQgb25lXG4gICAgICAvLyBhZnRlciB0aGUgaW1tZWRpYXRlIHRpY2sgYWxyZWFkeSBjYWxsZWQgc3RvcCgpIGF0IGEgc2Nyb2xsIGJvdW5kYXJ5KS5cbiAgICAgIC8vIHRpY2tzIGNhcCBkZWZlbmRzIGFnYWluc3QgYSBsb3N0IHJlbGVhc2UgZXZlbnQgKG1vdXNlIHJlbGVhc2VkXG4gICAgICAvLyBvdXRzaWRlIHRlcm1pbmFsIHdpbmRvdykgbGVhdmluZyBpc0RyYWdnaW5nIHN0dWNrIHRydWUuXG4gICAgICBpZiAoXG4gICAgICAgICFzZWw/LmlzRHJhZ2dpbmcgfHxcbiAgICAgICAgIXNlbC5mb2N1cyB8fFxuICAgICAgICAhcyB8fFxuICAgICAgICBkaXIgPT09IDAgfHxcbiAgICAgICAgKyt0aWNrc1JlZi5jdXJyZW50ID4gQVVUT1NDUk9MTF9NQVhfVElDS1NcbiAgICAgICkge1xuICAgICAgICBzdG9wKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvLyBzY3JvbGxCeSBhY2N1bXVsYXRlcyBpbnRvIHBlbmRpbmdTY3JvbGxEZWx0YTsgdGhlIHNjcmVlbiBidWZmZXJcbiAgICAgIC8vIGRvZXNuJ3QgdXBkYXRlIHVudGlsIHRoZSBuZXh0IHJlbmRlciBkcmFpbnMgaXQuIElmIGEgcHJldmlvdXNcbiAgICAgIC8vIHRpY2sncyBzY3JvbGwgaGFzbid0IGRyYWluZWQgeWV0LCBjYXB0dXJlU2Nyb2xsZWRSb3dzIHdvdWxkIHJlYWRcbiAgICAgIC8vIHN0YWxlIGNvbnRlbnQgKHNhbWUgcm93cyBhcyBsYXN0IHRpY2sg4oaSIGR1cGxpY2F0ZWQgaW4gdGhlXG4gICAgICAvLyBhY2N1bXVsYXRvciBBTkQgbWlzc2luZyB0aGUgcm93cyB0aGF0IGFjdHVhbGx5IHNjcm9sbGVkIG91dCkuXG4gICAgICAvLyBTa2lwIHRoaXMgdGljazsgdGhlIDUwbXMgaW50ZXJ2YWwgd2lsbCByZXRyeSBhZnRlciBJbmsncyAxNm1zXG4gICAgICAvLyByZW5kZXIgY2F0Y2hlcyB1cC4gQWxzbyBwcmV2ZW50cyBzaGlmdEFuY2hvciBmcm9tIGRlc3luY2luZy5cbiAgICAgIGlmIChzLmdldFBlbmRpbmdEZWx0YSgpICE9PSAwKSByZXR1cm5cbiAgICAgIGNvbnN0IHRvcCA9IHMuZ2V0Vmlld3BvcnRUb3AoKVxuICAgICAgY29uc3QgYm90dG9tID0gdG9wICsgcy5nZXRWaWV3cG9ydEhlaWdodCgpIC0gMVxuICAgICAgLy8gQ2xhbXAgYW5jaG9yIHdpdGhpbiBbdG9wLCBib3R0b21dLiBOb3QgWzAsIGJvdHRvbV06IHRoZSBTY3JvbGxCb3hcbiAgICAgIC8vIHBhZGRpbmcgcm93IGF0IDAgd291bGQgcHJvZHVjZSBhIGJsYW5rIGxpbmUgYmV0d2VlbiBzY3JvbGxlZE9mZkFib3ZlXG4gICAgICAvLyBhbmQgdGhlIG9uLXNjcmVlbiBjb250ZW50IGluIGdldFNlbGVjdGVkVGV4dC4gVGhlIHBhZGRpbmctcm93XG4gICAgICAvLyBoaWdobGlnaHQgd2FzIGEgbWlub3IgdmlzdWFsIG5pY2V0eTsgdGV4dCBjb3JyZWN0bmVzcyB3aW5zLlxuICAgICAgaWYgKGRpciA8IDApIHtcbiAgICAgICAgaWYgKHMuZ2V0U2Nyb2xsVG9wKCkgPD0gMCkge1xuICAgICAgICAgIHN0b3AoKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIC8vIFNjcm9sbGluZyB1cDogY29udGVudCBtb3ZlcyBkb3duIGluIHZpZXdwb3J0LCBzbyBhbmNob3Igcm93ICtOLlxuICAgICAgICAvLyBDbGFtcCB0byBhY3R1YWwgc2Nyb2xsIGRpc3RhbmNlIHNvIGFuY2hvciBzdGF5cyBpbiBzeW5jIHdoZW4gbmVhclxuICAgICAgICAvLyB0aGUgdG9wIGJvdW5kYXJ5IChyZW5kZXJlciBjbGFtcHMgc2Nyb2xsVG9wIHRvIDAgb24gZHJhaW4pLlxuICAgICAgICBjb25zdCBhY3R1YWwgPSBNYXRoLm1pbihBVVRPU0NST0xMX0xJTkVTLCBzLmdldFNjcm9sbFRvcCgpKVxuICAgICAgICAvLyBDYXB0dXJlIHJvd3MgYWJvdXQgdG8gc2Nyb2xsIG91dCB0aGUgQk9UVE9NIGJlZm9yZSBzY3JvbGxCeVxuICAgICAgICAvLyBvdmVyd3JpdGVzIHRoZW0uIE9ubHkgcm93cyBpbnNpZGUgdGhlIHNlbGVjdGlvbiBhcmUgY2FwdHVyZWRcbiAgICAgICAgLy8gKGNhcHR1cmVTY3JvbGxlZFJvd3MgaW50ZXJzZWN0cyB3aXRoIHNlbGVjdGlvbiBib3VuZHMpLlxuICAgICAgICBzZWxlY3Rpb24uY2FwdHVyZVNjcm9sbGVkUm93cyhib3R0b20gLSBhY3R1YWwgKyAxLCBib3R0b20sICdiZWxvdycpXG4gICAgICAgIHNlbGVjdGlvbi5zaGlmdEFuY2hvcihhY3R1YWwsIDAsIGJvdHRvbSlcbiAgICAgICAgcy5zY3JvbGxCeSgtQVVUT1NDUk9MTF9MSU5FUylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KDAsIHMuZ2V0U2Nyb2xsSGVpZ2h0KCkgLSBzLmdldFZpZXdwb3J0SGVpZ2h0KCkpXG4gICAgICAgIGlmIChzLmdldFNjcm9sbFRvcCgpID49IG1heCkge1xuICAgICAgICAgIHN0b3AoKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIC8vIFNjcm9sbGluZyBkb3duOiBjb250ZW50IG1vdmVzIHVwIGluIHZpZXdwb3J0LCBzbyBhbmNob3Igcm93IC1OLlxuICAgICAgICAvLyBDbGFtcCB0byBhY3R1YWwgc2Nyb2xsIGRpc3RhbmNlIHNvIGFuY2hvciBzdGF5cyBpbiBzeW5jIHdoZW4gbmVhclxuICAgICAgICAvLyB0aGUgYm90dG9tIGJvdW5kYXJ5IChyZW5kZXJlciBjbGFtcHMgc2Nyb2xsVG9wIHRvIG1heCBvbiBkcmFpbikuXG4gICAgICAgIGNvbnN0IGFjdHVhbCA9IE1hdGgubWluKEFVVE9TQ1JPTExfTElORVMsIG1heCAtIHMuZ2V0U2Nyb2xsVG9wKCkpXG4gICAgICAgIC8vIENhcHR1cmUgcm93cyBhYm91dCB0byBzY3JvbGwgb3V0IHRoZSBUT1AuXG4gICAgICAgIHNlbGVjdGlvbi5jYXB0dXJlU2Nyb2xsZWRSb3dzKHRvcCwgdG9wICsgYWN0dWFsIC0gMSwgJ2Fib3ZlJylcbiAgICAgICAgc2VsZWN0aW9uLnNoaWZ0QW5jaG9yKC1hY3R1YWwsIHRvcCwgYm90dG9tKVxuICAgICAgICBzLnNjcm9sbEJ5KEFVVE9TQ1JPTExfTElORVMpXG4gICAgICB9XG4gICAgICBvblNjcm9sbFJlZi5jdXJyZW50Py4oZmFsc2UsIHMpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RhcnQoZGlyOiAtMSB8IDEpOiB2b2lkIHtcbiAgICAgIC8vIFJlY29yZCBCRUZPUkUgZWFybHktcmV0dXJuOiB0aGUgZW1wdHktYWNjdW11bGF0b3IgcmVzZXQgaW4gY2hlY2soKVxuICAgICAgLy8gbWF5IGhhdmUgemVyb2VkIHRoaXMgZHVyaW5nIHRoZSBwcmUtY3Jvc3NpbmcgcGhhc2UgKGFjY3VtdWxhdG9yc1xuICAgICAgLy8gZW1wdHkgdW50aWwgdGhlIGFuY2hvciByb3cgZW50ZXJzIHRoZSBjYXB0dXJlIHJhbmdlKS4gUmUtcmVjb3JkXG4gICAgICAvLyBvbiBldmVyeSBjYWxsIHNvIHRoZSBjb3JydXB0aW9uIGlzIGluc3RhbnRseSBoZWFsZWQuXG4gICAgICBsYXN0U2Nyb2xsZWREaXJSZWYuY3VycmVudCA9IGRpclxuICAgICAgaWYgKGRpclJlZi5jdXJyZW50ID09PSBkaXIpIHJldHVybiAvLyBhbHJlYWR5IGdvaW5nIHRoaXMgd2F5XG4gICAgICBzdG9wKClcbiAgICAgIGRpclJlZi5jdXJyZW50ID0gZGlyXG4gICAgICB0aWNrc1JlZi5jdXJyZW50ID0gMFxuICAgICAgdGljaygpXG4gICAgICAvLyB0aWNrKCkgbWF5IGhhdmUgaGl0IGEgc2Nyb2xsIGJvdW5kYXJ5IGFuZCBjYWxsZWQgc3RvcCgpIChkaXIgcmVzZXQgdG9cbiAgICAgIC8vIDApLiBPbmx5IHN0YXJ0IHRoZSBpbnRlcnZhbCBpZiB3ZSdyZSBzdGlsbCBnb2luZyDigJQgb3RoZXJ3aXNlIHRoZVxuICAgICAgLy8gaW50ZXJ2YWwgd291bGQgcnVuIGZvcmV2ZXIgd2l0aCBkaXIgPT09IDAgZG9pbmcgbm90aGluZyB1c2VmdWwuXG4gICAgICBpZiAoZGlyUmVmLmN1cnJlbnQgPT09IGRpcikge1xuICAgICAgICB0aW1lclJlZi5jdXJyZW50ID0gc2V0SW50ZXJ2YWwodGljaywgQVVUT1NDUk9MTF9JTlRFUlZBTF9NUylcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZS1ldmFsdWF0ZWQgb24gZXZlcnkgc2VsZWN0aW9uIGNoYW5nZSAoc3RhcnQvZHJhZy9maW5pc2gvY2xlYXIpLlxuICAgIC8vIERyaXZlcyBkcmFnLXRvLXNjcm9sbCBhdXRvc2Nyb2xsIHdoZW4gdGhlIGRyYWcgbGVhdmVzIHRoZSB2aWV3cG9ydC5cbiAgICAvLyBQcmlvciB2ZXJzaW9ucyBicm9rZSBzdGlja3kgaGVyZSBvbiBkcmFnLXN0YXJ0IHRvIHByZXZlbnQgc2VsZWN0aW9uXG4gICAgLy8gZHJpZnQgZHVyaW5nIHN0cmVhbWluZyDigJQgaW5rLnRzeCBub3cgdHJhbnNsYXRlcyBzZWxlY3Rpb24gY29vcmRzIGJ5XG4gICAgLy8gdGhlIGZvbGxvdyBkZWx0YSBpbnN0ZWFkIChuYXRpdmUgdGVybWluYWwgYmVoYXZpb3I6IHZpZXcga2VlcHNcbiAgICAvLyBzY3JvbGxpbmcsIGhpZ2hsaWdodCB3YWxrcyB1cCB3aXRoIHRoZSB0ZXh0KS4gS2VlcGluZyBzdGlja3kgYWxzb1xuICAgIC8vIGF2b2lkcyB1c2VWaXJ0dWFsU2Nyb2xsJ3MgdGFpbC13YWxrIOKGkiBmb3J3YXJkLXdhbGsgcGhhbnRvbSBncm93dGguXG4gICAgZnVuY3Rpb24gY2hlY2soKTogdm9pZCB7XG4gICAgICBjb25zdCBzID0gc2Nyb2xsUmVmLmN1cnJlbnRcbiAgICAgIGlmICghcykge1xuICAgICAgICBzdG9wKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjb25zdCB0b3AgPSBzLmdldFZpZXdwb3J0VG9wKClcbiAgICAgIGNvbnN0IGJvdHRvbSA9IHRvcCArIHMuZ2V0Vmlld3BvcnRIZWlnaHQoKSAtIDFcbiAgICAgIGNvbnN0IHNlbCA9IHNlbGVjdGlvbi5nZXRTdGF0ZSgpXG4gICAgICAvLyBQYXNzIHRoZSBMQVNULXNjcm9sbGVkIGRpcmVjdGlvbiAobm90IGRpclJlZikgc28gdGhlIGFuY2hvciBndWFyZCBpc1xuICAgICAgLy8gYnlwYXNzZWQgYWZ0ZXIgc2hpZnRBbmNob3IgaGFzIGNsYW1wZWQgYW5jaG9yIHRvd2FyZCByb3cgMC4gVXNpbmdcbiAgICAgIC8vIGxhc3RTY3JvbGxlZERpclJlZiAoc3Vydml2ZXMgc3RvcCgpKSBsZXRzIGF1dG9zY3JvbGwgcmVzdW1lIGFmdGVyIGFcbiAgICAgIC8vIGJyaWVmIG1vdXNlIGRpcCBpbnRvIHRoZSB2aWV3cG9ydC4gU2FtZS1kaXJlY3Rpb24gb25seSDigJQgYSBtb3VzZVxuICAgICAgLy8ganVtcCBmcm9tIGJlbG93LWJvdHRvbSB0byBhYm92ZS10b3AgbXVzdCBzdG9wLCBzaW5jZSByZXZlcnNpbmcgd2hpbGVcbiAgICAgIC8vIHRoZSBzY3JvbGxlZE9mZkFib3ZlL0JlbG93IGFjY3VtdWxhdG9ycyBob2xkIHRoZSBwcmlvciBkaXJlY3Rpb24nc1xuICAgICAgLy8gcm93cyB3b3VsZCBkdXBsaWNhdGUgdGV4dCBpbiBnZXRTZWxlY3RlZFRleHQuIFJlc2V0IG9uIGRyYWctZmluaXNoXG4gICAgICAvLyBPUiB3aGVuIGJvdGggYWNjdW11bGF0b3JzIGFyZSBlbXB0eTogc3RhcnRTZWxlY3Rpb24gY2xlYXJzIHRoZW1cbiAgICAgIC8vIChzZWxlY3Rpb24udHMpLCBzbyBhIG5ldyBkcmFnIGFmdGVyIGEgbG9zdC1yZWxlYXNlIChpc0RyYWdnaW5nXG4gICAgICAvLyBzdHVjayB0cnVlLCB0aGUgcmVhc29uIEFVVE9TQ1JPTExfTUFYX1RJQ0tTIGV4aXN0cykgc3RpbGwgcmVzZXRzLlxuICAgICAgLy8gU2FmZTogc3RhcnQoKSBiZWxvdyByZS1yZWNvcmRzIGxhc3RTY3JvbGxlZERpclJlZiBiZWZvcmUgaXRzXG4gICAgICAvLyBlYXJseS1yZXR1cm4sIHNvIGEgbWlkLXNjcm9sbCByZXNldCBoZXJlIGlzIGluc3RhbnRseSB1bmRvbmUuXG4gICAgICBpZiAoXG4gICAgICAgICFzZWw/LmlzRHJhZ2dpbmcgfHxcbiAgICAgICAgKHNlbC5zY3JvbGxlZE9mZkFib3ZlLmxlbmd0aCA9PT0gMCAmJiBzZWwuc2Nyb2xsZWRPZmZCZWxvdy5sZW5ndGggPT09IDApXG4gICAgICApIHtcbiAgICAgICAgbGFzdFNjcm9sbGVkRGlyUmVmLmN1cnJlbnQgPSAwXG4gICAgICB9XG4gICAgICBjb25zdCBkaXIgPSBkcmFnU2Nyb2xsRGlyZWN0aW9uKFxuICAgICAgICBzZWwsXG4gICAgICAgIHRvcCxcbiAgICAgICAgYm90dG9tLFxuICAgICAgICBsYXN0U2Nyb2xsZWREaXJSZWYuY3VycmVudCxcbiAgICAgIClcbiAgICAgIGlmIChkaXIgPT09IDApIHtcbiAgICAgICAgLy8gQmxvY2tlZCByZXZlcnNhbDogZm9jdXMganVtcGVkIHRvIHRoZSBvcHBvc2l0ZSBlZGdlIChvZmYtd2luZG93XG4gICAgICAgIC8vIGRyYWcgcmV0dXJuLCBmYXN0IGZsaWNrKS4gaGFuZGxlU2VsZWN0aW9uRHJhZyBhbHJlYWR5IG1vdmVkIGZvY3VzXG4gICAgICAgIC8vIHBhc3QgdGhlIGFuY2hvciwgZmxpcHBpbmcgc2VsZWN0aW9uQm91bmRzIOKAlCB0aGUgYWNjdW11bGF0b3IgaXNcbiAgICAgICAgLy8gbm93IG9ycGhhbmVkIChob2xkcyByb3dzIG9uIHRoZSB3cm9uZyBzaWRlKS4gQ2xlYXIgaXQgc29cbiAgICAgICAgLy8gZ2V0U2VsZWN0ZWRUZXh0IG1hdGNoZXMgdGhlIHZpc2libGUgaGlnaGxpZ2h0LlxuICAgICAgICBpZiAobGFzdFNjcm9sbGVkRGlyUmVmLmN1cnJlbnQgIT09IDAgJiYgc2VsPy5mb2N1cykge1xuICAgICAgICAgIGNvbnN0IHdhbnQgPSBzZWwuZm9jdXMucm93IDwgdG9wID8gLTEgOiBzZWwuZm9jdXMucm93ID4gYm90dG9tID8gMSA6IDBcbiAgICAgICAgICBpZiAod2FudCAhPT0gMCAmJiB3YW50ICE9PSBsYXN0U2Nyb2xsZWREaXJSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgc2VsLnNjcm9sbGVkT2ZmQWJvdmUgPSBbXVxuICAgICAgICAgICAgc2VsLnNjcm9sbGVkT2ZmQmVsb3cgPSBbXVxuICAgICAgICAgICAgc2VsLnNjcm9sbGVkT2ZmQWJvdmVTVyA9IFtdXG4gICAgICAgICAgICBzZWwuc2Nyb2xsZWRPZmZCZWxvd1NXID0gW11cbiAgICAgICAgICAgIGxhc3RTY3JvbGxlZERpclJlZi5jdXJyZW50ID0gMFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdG9wKClcbiAgICAgIH0gZWxzZSBzdGFydChkaXIpXG4gICAgfVxuXG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSBzZWxlY3Rpb24uc3Vic2NyaWJlKGNoZWNrKVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB1bnN1YnNjcmliZSgpXG4gICAgICBzdG9wKClcbiAgICAgIGxhc3RTY3JvbGxlZERpclJlZi5jdXJyZW50ID0gMFxuICAgIH1cbiAgfSwgW2lzQWN0aXZlLCBzY3JvbGxSZWYsIHNlbGVjdGlvbl0pXG59XG5cbi8qKlxuICogQ29tcHV0ZSBhdXRvc2Nyb2xsIGRpcmVjdGlvbiBmb3IgYSBkcmFnIHNlbGVjdGlvbiByZWxhdGl2ZSB0byB0aGUgU2Nyb2xsQm94XG4gKiB2aWV3cG9ydC4gUmV0dXJucyAwIHdoZW4gbm90IGRyYWdnaW5nLCBhbmNob3IvZm9jdXMgbWlzc2luZywgb3IgdGhlIGFuY2hvclxuICogaXMgb3V0c2lkZSB0aGUgdmlld3BvcnQg4oCUIGEgbXVsdGktY2xpY2sgb3IgZHJhZyB0aGF0IHN0YXJ0ZWQgaW4gdGhlIGlucHV0XG4gKiBhcmVhIG11c3Qgbm90IGNvbW1hbmRlZXIgdGhlIG1lc3NhZ2Ugc2Nyb2xsIChkb3VibGUtY2xpY2sgaW4gdGhlIGlucHV0IGFyZWFcbiAqIHdoaWxlIHNjcm9sbGVkIHVwIHByZXZpb3VzbHkgY29ycnVwdGVkIHRoZSBhbmNob3IgdmlhIHNoaWZ0QW5jaG9yIGFuZFxuICogc3B1cmlvdXNseSBzY3JvbGxlZCB0aGUgbWVzc2FnZSBoaXN0b3J5IGV2ZXJ5IDUwbXMgdW50aWwgcmVsZWFzZSkuXG4gKlxuICogYWxyZWFkeVNjcm9sbGluZ0RpciBieXBhc3NlcyB0aGUgYW5jaG9yLWluLXZpZXdwb3J0IGd1YXJkIG9uY2UgYXV0b3Njcm9sbFxuICogaXMgYWN0aXZlIChzaGlmdEFuY2hvciBsZWdpdGltYXRlbHkgY2xhbXBzIHRoZSBhbmNob3IgdG93YXJkIHJvdyAwLCBiZWxvd1xuICogYHRvcGApIGJ1dCBvbmx5IGFsbG93cyBTQU1FLWRpcmVjdGlvbiBjb250aW51YXRpb24uIElmIHRoZSBmb2N1cyBqdW1wcyB0b1xuICogdGhlIG9wcG9zaXRlIGVkZ2UgKGJlbG934oaSYWJvdmUgb3IgYWJvdmXihpJiZWxvdyDigJQgcG9zc2libGUgd2l0aCBhIGZhc3QgZmxpY2tcbiAqIG9yIG9mZi13aW5kb3cgZHJhZyBzaW5jZSBtb2RlIDEwMDIgcmVwb3J0cyBvbiBjZWxsIGNoYW5nZSwgbm90IHBlciBjZWxsKSxcbiAqIHJldHVybnMgMCB0byBzdG9wIOKAlCByZXZlcnNpbmcgd2l0aG91dCBjbGVhcmluZyBzY3JvbGxlZE9mZkFib3ZlL0JlbG93XG4gKiB3b3VsZCBkdXBsaWNhdGUgY2FwdHVyZWQgcm93cyB3aGVuIHRoZXkgc2Nyb2xsIGJhY2sgb24tc2NyZWVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZHJhZ1Njcm9sbERpcmVjdGlvbihcbiAgc2VsOiBTZWxlY3Rpb25TdGF0ZSB8IG51bGwsXG4gIHRvcDogbnVtYmVyLFxuICBib3R0b206IG51bWJlcixcbiAgYWxyZWFkeVNjcm9sbGluZ0RpcjogLTEgfCAwIHwgMSA9IDAsXG4pOiAtMSB8IDAgfCAxIHtcbiAgaWYgKCFzZWw/LmlzRHJhZ2dpbmcgfHwgIXNlbC5hbmNob3IgfHwgIXNlbC5mb2N1cykgcmV0dXJuIDBcbiAgY29uc3Qgcm93ID0gc2VsLmZvY3VzLnJvd1xuICBjb25zdCB3YW50OiAtMSB8IDAgfCAxID0gcm93IDwgdG9wID8gLTEgOiByb3cgPiBib3R0b20gPyAxIDogMFxuICBpZiAoYWxyZWFkeVNjcm9sbGluZ0RpciAhPT0gMCkge1xuICAgIC8vIFNhbWUtZGlyZWN0aW9uIG9ubHkuIEZvY3VzIG9uIHRoZSBvcHBvc2l0ZSBzaWRlLCBvciBiYWNrIGluc2lkZSB0aGVcbiAgICAvLyB2aWV3cG9ydCwgc3RvcHMgdGhlIHNjcm9sbCDigJQgY2FwdHVyZWQgcm93cyBzdGF5IGluIHNjcm9sbGVkT2ZmQWJvdmUvXG4gICAgLy8gQmVsb3cgYnV0IG5ldmVyIHNjcm9sbCBiYWNrIG9uLXNjcmVlbiwgc28gZ2V0U2VsZWN0ZWRUZXh0IGlzIGNvcnJlY3QuXG4gICAgcmV0dXJuIHdhbnQgPT09IGFscmVhZHlTY3JvbGxpbmdEaXIgPyB3YW50IDogMFxuICB9XG4gIC8vIEFuY2hvciBtdXN0IGJlIGluc2lkZSB0aGUgdmlld3BvcnQgZm9yIHVzIHRvIG93biB0aGlzIGRyYWcuIElmIHRoZVxuICAvLyB1c2VyIHN0YXJ0ZWQgc2VsZWN0aW5nIGluIHRoZSBpbnB1dCBib3ggb3IgaGVhZGVyLCBhdXRvc2Nyb2xsaW5nIHRoZVxuICAvLyBtZXNzYWdlIGhpc3RvcnkgaXMgc3VycHJpc2luZyBhbmQgY29ycnVwdHMgdGhlIGFuY2hvciB2aWEgc2hpZnRBbmNob3IuXG4gIGlmIChzZWwuYW5jaG9yLnJvdyA8IHRvcCB8fCBzZWwuYW5jaG9yLnJvdyA+IGJvdHRvbSkgcmV0dXJuIDBcbiAgcmV0dXJuIHdhbnRcbn1cblxuLy8gS2V5Ym9hcmQgcGFnZSBqdW1wczogc2Nyb2xsVG8oKSB3cml0ZXMgc2Nyb2xsVG9wIGRpcmVjdGx5IGFuZCBjbGVhcnNcbi8vIHBlbmRpbmdTY3JvbGxEZWx0YSDigJQgb25lIGZyYW1lLCBubyBkcmFpbi4gc2Nyb2xsQnkoKSBhY2N1bXVsYXRlcyBpbnRvXG4vLyBwZW5kaW5nU2Nyb2xsRGVsdGEgd2hpY2ggdGhlIHJlbmRlcmVyIGRyYWlucyBvdmVyIHNldmVyYWwgZnJhbWVzXG4vLyAocmVuZGVyLW5vZGUtdG8tb3V0cHV0LnRzIGRyYWluUHJvcG9ydGlvbmFsL2RyYWluQWRhcHRpdmUpIOKAlCBjb3JyZWN0IGZvclxuLy8gd2hlZWwgc21vb3RobmVzcywgd3JvbmcgZm9yIFBnVXAvY3RybCt1IHdoZXJlIHRoZSB1c2VyIGV4cGVjdHMgYSBzbmFwLlxuLy8gVGFyZ2V0IGlzIHJlbGF0aXZlIHRvIHNjcm9sbFRvcCtwZW5kaW5nRGVsdGEgc28gYSBqdW1wIG1pZC13aGVlbC1idXJzdFxuLy8gbGFuZHMgd2hlcmUgdGhlIHdoZWVsIHdhcyBoZWFkaW5nLlxuZXhwb3J0IGZ1bmN0aW9uIGp1bXBCeShzOiBTY3JvbGxCb3hIYW5kbGUsIGRlbHRhOiBudW1iZXIpOiBib29sZWFuIHtcbiAgY29uc3QgbWF4ID0gTWF0aC5tYXgoMCwgcy5nZXRTY3JvbGxIZWlnaHQoKSAtIHMuZ2V0Vmlld3BvcnRIZWlnaHQoKSlcbiAgY29uc3QgdGFyZ2V0ID0gcy5nZXRTY3JvbGxUb3AoKSArIHMuZ2V0UGVuZGluZ0RlbHRhKCkgKyBkZWx0YVxuICBpZiAodGFyZ2V0ID49IG1heCkge1xuICAgIC8vIEVhZ2VyLXdyaXRlIHNjcm9sbFRvcCBzbyBmb2xsb3ctc2Nyb2xsIHNlZXMgZm9sbG93RGVsdGE9MC4gQ2FsbGVyc1xuICAgIC8vIHRoYXQgcmFuIHRyYW5zbGF0ZVNlbGVjdGlvbkZvckp1bXAgYWxyZWFkeSBzaGlmdGVkOyBzY3JvbGxUb0JvdHRvbSgpXG4gICAgLy8gYWxvbmUgd291bGQgZG91YmxlLXNoaWZ0IHZpYSB0aGUgcmVuZGVyLXBoYXNlIHN0aWNreSBmb2xsb3cuXG4gICAgcy5zY3JvbGxUbyhtYXgpXG4gICAgcy5zY3JvbGxUb0JvdHRvbSgpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICBzLnNjcm9sbFRvKE1hdGgubWF4KDAsIHRhcmdldCkpXG4gIHJldHVybiBmYWxzZVxufVxuXG4vLyBXaGVlbC1kb3duIHBhc3QgbWF4U2Nyb2xsIHJlLWVuYWJsZXMgc3RpY2t5IHNvIHdoZWVsaW5nIGF0IHRoZSBib3R0b21cbi8vIG5hdHVyYWxseSByZS1waW5zIChtYXRjaGVzIHR5cGljYWwgY2hhdC1hcHAgYmVoYXZpb3IpLiBSZXR1cm5zIHRoZVxuLy8gcmVzdWx0aW5nIHN0aWNreSBzdGF0ZSBzbyBjYWxsZXJzIGNhbiBwcm9wYWdhdGUgaXQuXG5mdW5jdGlvbiBzY3JvbGxEb3duKHM6IFNjcm9sbEJveEhhbmRsZSwgYW1vdW50OiBudW1iZXIpOiBib29sZWFuIHtcbiAgY29uc3QgbWF4ID0gTWF0aC5tYXgoMCwgcy5nZXRTY3JvbGxIZWlnaHQoKSAtIHMuZ2V0Vmlld3BvcnRIZWlnaHQoKSlcbiAgLy8gSW5jbHVkZSBwZW5kaW5nRGVsdGE6IHNjcm9sbEJ5IGFjY3VtdWxhdGVzIGludG8gcGVuZGluZ1Njcm9sbERlbHRhXG4gIC8vIHdpdGhvdXQgdXBkYXRpbmcgc2Nyb2xsVG9wLCBzbyBnZXRTY3JvbGxUb3AoKSBhbG9uZSBpcyBzdGFsZSB3aXRoaW5cbiAgLy8gYSBiYXRjaCBvZiB3aGVlbCBldmVudHMuIFdpdGhvdXQgdGhpcywgd2hlZWxpbmcgdG8gdGhlIGJvdHRvbSBuZXZlclxuICAvLyByZS1lbmFibGVzIHN0aWNreSBzY3JvbGwuXG4gIGNvbnN0IGVmZmVjdGl2ZVRvcCA9IHMuZ2V0U2Nyb2xsVG9wKCkgKyBzLmdldFBlbmRpbmdEZWx0YSgpXG4gIGlmIChlZmZlY3RpdmVUb3AgKyBhbW91bnQgPj0gbWF4KSB7XG4gICAgcy5zY3JvbGxUb0JvdHRvbSgpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICBzLnNjcm9sbEJ5KGFtb3VudClcbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8vIFdoZWVsLXVwIHBhc3Qgc2Nyb2xsVG9wPTAgY2xhbXBzIHZpYSBzY3JvbGxUbygwKSwgY2xlYXJpbmdcbi8vIHBlbmRpbmdTY3JvbGxEZWx0YSBzbyBhZ2dyZXNzaXZlIHdoZWVsIGJ1cnN0cyAoZS5nLiBNWCBNYXN0ZXIgZnJlZS1zcGluKVxuLy8gZG9uJ3QgYWNjdW11bGF0ZSBhbiB1bmJvdW5kZWQgbmVnYXRpdmUgZGVsdGEuIFdpdGhvdXQgdGhpcyBjbGFtcCxcbi8vIHVzZVZpcnR1YWxTY3JvbGwncyBbZWZmTG8sIGVmZkhpXSBzcGFuIGdyb3dzIHBhc3Qgd2hhdCBNQVhfTU9VTlRFRF9JVEVNU1xuLy8gY2FuIGNvdmVyIGFuZCBpbnRlcm1lZGlhdGUgZHJhaW4gZnJhbWVzIHJlbmRlciBhdCBzY3JvbGxUb3BzIHdpdGggbm9cbi8vIG1vdW50ZWQgY2hpbGRyZW4g4oCUIGJsYW5rIHZpZXdwb3J0LlxuZXhwb3J0IGZ1bmN0aW9uIHNjcm9sbFVwKHM6IFNjcm9sbEJveEhhbmRsZSwgYW1vdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgLy8gSW5jbHVkZSBwZW5kaW5nRGVsdGE6IHNjcm9sbEJ5IGFjY3VtdWxhdGVzIHdpdGhvdXQgdXBkYXRpbmcgc2Nyb2xsVG9wLFxuICAvLyBzbyBnZXRTY3JvbGxUb3AoKSBhbG9uZSBpcyBzdGFsZSB3aXRoaW4gYSBiYXRjaCBvZiB3aGVlbCBldmVudHMuXG4gIGNvbnN0IGVmZmVjdGl2ZVRvcCA9IHMuZ2V0U2Nyb2xsVG9wKCkgKyBzLmdldFBlbmRpbmdEZWx0YSgpXG4gIGlmIChlZmZlY3RpdmVUb3AgLSBhbW91bnQgPD0gMCkge1xuICAgIHMuc2Nyb2xsVG8oMClcbiAgICByZXR1cm5cbiAgfVxuICBzLnNjcm9sbEJ5KC1hbW91bnQpXG59XG5cbmV4cG9ydCB0eXBlIE1vZGFsUGFnZXJBY3Rpb24gPVxuICB8ICdsaW5lVXAnXG4gIHwgJ2xpbmVEb3duJ1xuICB8ICdoYWxmUGFnZVVwJ1xuICB8ICdoYWxmUGFnZURvd24nXG4gIHwgJ2Z1bGxQYWdlVXAnXG4gIHwgJ2Z1bGxQYWdlRG93bidcbiAgfCAndG9wJ1xuICB8ICdib3R0b20nXG5cbi8qKlxuICogTWFwcyBhIGtleXN0cm9rZSB0byBhIG1vZGFsIHBhZ2VyIGFjdGlvbi4gRXhwb3J0ZWQgZm9yIHRlc3RpbmcuXG4gKiBSZXR1cm5zIG51bGwgZm9yIGtleXMgdGhlIG1vZGFsIHBhZ2VyIGRvZXNuJ3QgaGFuZGxlICh0aGV5IGZhbGwgdGhyb3VnaCkuXG4gKlxuICogY3RybCt1L2QvYi9mIGFyZSB0aGUgbGVzcy1saW5lYWdlIGJpbmRpbmdzLiBnL0cgYXJlIGJhcmUgbGV0dGVycyAob25seVxuICogc2FmZSB3aGVuIG5vIHByb21wdCBpcyBtb3VudGVkKS4gRyBhcnJpdmVzIGFzIGlucHV0PSdHJyBzaGlmdD1mYWxzZSBvblxuICogbGVnYWN5IHRlcm1pbmFscywgb3IgaW5wdXQ9J2cnIHNoaWZ0PXRydWUgb24ga2l0dHktcHJvdG9jb2wgdGVybWluYWxzLlxuICogTG93ZXJjYXNlIGcgbmVlZHMgdGhlICFzaGlmdCBndWFyZCBzbyBpdCBkb2Vzbid0IGFsc28gbWF0Y2gga2l0dHktRy5cbiAqXG4gKiBLZXktcmVwZWF0OiBzdGRpbiBjb2FsZXNjZXMgaGVsZC1kb3duIHByaW50YWJsZXMgaW50byBvbmUgbXVsdGktY2hhclxuICogc3RyaW5nIChlLmcuICdnZ2cnKS4gT25seSB1bmlmb3JtLWNoYXIgYmF0Y2hlcyBhcmUgaGFuZGxlZCDigJQgbWl4ZWQgaW5wdXRcbiAqIGxpa2UgJ2dHJyBpc24ndCBrZXktcmVwZWF0LiBnL0cgYXJlIGlkZW1wb3RlbnQgYWJzb2x1dGUganVtcHMsIHNvIHRoZVxuICogY291bnQgaXMgaXJyZWxldmFudCAoY29uc3VtaW5nIHRoZSBiYXRjaCBqdXN0IHByZXZlbnRzIGl0IGZyb20gbGVha2luZ1xuICogdG8gdGhlIHNlbGVjdGlvbi1jbGVhci1vbi1wcmludGFibGUgaGFuZGxlcikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RhbFBhZ2VyQWN0aW9uKFxuICBpbnB1dDogc3RyaW5nLFxuICBrZXk6IFBpY2s8XG4gICAgS2V5LFxuICAgICdjdHJsJyB8ICdtZXRhJyB8ICdzaGlmdCcgfCAndXBBcnJvdycgfCAnZG93bkFycm93JyB8ICdob21lJyB8ICdlbmQnXG4gID4sXG4pOiBNb2RhbFBhZ2VyQWN0aW9uIHwgbnVsbCB7XG4gIGlmIChrZXkubWV0YSkgcmV0dXJuIG51bGxcbiAgLy8gU3BlY2lhbCBrZXlzIGZpcnN0IOKAlCBhcnJvd3MvaG9tZS9lbmQgYXJyaXZlIHdpdGggZW1wdHkgb3IganVuayBpbnB1dCxcbiAgLy8gc28gdGhlc2UgbXVzdCBiZSBjaGVja2VkIGJlZm9yZSBhbnkgaW5wdXQtc3RyaW5nIGxvZ2ljLiBzaGlmdCBpc1xuICAvLyByZXNlcnZlZCBmb3Igc2VsZWN0aW9uLWV4dGVuZCAoc2VsZWN0aW9uRm9jdXNNb3ZlRm9yS2V5KTsgY3RybCtob21lL2VuZFxuICAvLyBhbHJlYWR5IGhhcyBhIHVzZUtleWJpbmRpbmdzIHJvdXRlIHRvIHNjcm9sbDp0b3AvYm90dG9tLlxuICBpZiAoIWtleS5jdHJsICYmICFrZXkuc2hpZnQpIHtcbiAgICBpZiAoa2V5LnVwQXJyb3cpIHJldHVybiAnbGluZVVwJ1xuICAgIGlmIChrZXkuZG93bkFycm93KSByZXR1cm4gJ2xpbmVEb3duJ1xuICAgIGlmIChrZXkuaG9tZSkgcmV0dXJuICd0b3AnXG4gICAgaWYgKGtleS5lbmQpIHJldHVybiAnYm90dG9tJ1xuICB9XG4gIGlmIChrZXkuY3RybCkge1xuICAgIGlmIChrZXkuc2hpZnQpIHJldHVybiBudWxsXG4gICAgc3dpdGNoIChpbnB1dCkge1xuICAgICAgY2FzZSAndSc6XG4gICAgICAgIHJldHVybiAnaGFsZlBhZ2VVcCdcbiAgICAgIGNhc2UgJ2QnOlxuICAgICAgICByZXR1cm4gJ2hhbGZQYWdlRG93bidcbiAgICAgIGNhc2UgJ2InOlxuICAgICAgICByZXR1cm4gJ2Z1bGxQYWdlVXAnXG4gICAgICBjYXNlICdmJzpcbiAgICAgICAgcmV0dXJuICdmdWxsUGFnZURvd24nXG4gICAgICAvLyBlbWFjcy1zdHlsZSBsaW5lIHNjcm9sbCAobGVzcyBhY2NlcHRzIGJvdGggY3RybCtuL3AgYW5kIGN0cmwrZS95KS5cbiAgICAgIC8vIFdvcmtzIGR1cmluZyBzZWFyY2ggbmF2IOKAlCBmaW5lLWFkanVzdCBhZnRlciBhIGp1bXAgd2l0aG91dFxuICAgICAgLy8gbGVhdmluZyBtb2RhbC4gTm8gIXNlYXJjaE9wZW4gZ2F0ZSBvbiB0aGlzIHVzZUlucHV0J3MgaXNBY3RpdmUuXG4gICAgICBjYXNlICduJzpcbiAgICAgICAgcmV0dXJuICdsaW5lRG93bidcbiAgICAgIGNhc2UgJ3AnOlxuICAgICAgICByZXR1cm4gJ2xpbmVVcCdcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG4gIC8vIEJhcmUgbGV0dGVycy4gS2V5LXJlcGVhdCBiYXRjaGVzOiBvbmx5IGFjdCBvbiB1bmlmb3JtIHJ1bnMuXG4gIGNvbnN0IGMgPSBpbnB1dFswXVxuICBpZiAoIWMgfHwgaW5wdXQgIT09IGMucmVwZWF0KGlucHV0Lmxlbmd0aCkpIHJldHVybiBudWxsXG4gIC8vIGtpdHR5IHNlbmRzIEcgYXMgaW5wdXQ9J2cnIHNoaWZ0PXRydWU7IGxlZ2FjeSBhcyAnRycgc2hpZnQ9ZmFsc2UuXG4gIC8vIENoZWNrIEJFRk9SRSB0aGUgc2hpZnQtZ2F0ZSBzbyBib3RoIGhpdCAnYm90dG9tJy5cbiAgaWYgKGMgPT09ICdHJyB8fCAoYyA9PT0gJ2cnICYmIGtleS5zaGlmdCkpIHJldHVybiAnYm90dG9tJ1xuICBpZiAoa2V5LnNoaWZ0KSByZXR1cm4gbnVsbFxuICBzd2l0Y2ggKGMpIHtcbiAgICBjYXNlICdnJzpcbiAgICAgIHJldHVybiAndG9wJ1xuICAgIC8vIGovayByZS1hZGRlZCBwZXIgVG9tIE1hciAxOCDigJQgcmV2ZXJzYWwgb2YgTWFyIDE2IHJlbW92YWwuIFdvcmtzXG4gICAgLy8gZHVyaW5nIHNlYXJjaCBuYXYgKGZpbmUtYWRqdXN0IGFmdGVyIG4vTiBsYW5kcykgc2luY2UgaXNNb2RhbCBpc1xuICAgIC8vIGluZGVwZW5kZW50IG9mIHNlYXJjaE9wZW4uXG4gICAgY2FzZSAnaic6XG4gICAgICByZXR1cm4gJ2xpbmVEb3duJ1xuICAgIGNhc2UgJ2snOlxuICAgICAgcmV0dXJuICdsaW5lVXAnXG4gICAgLy8gbGVzczogc3BhY2UgPSBwYWdlIGRvd24sIGIgPSBwYWdlIHVwLiBjdHJsK2IgYWxyZWFkeSBtYXBzIGFib3ZlO1xuICAgIC8vIGJhcmUgYiBpcyB0aGUgbGVzcy1uYXRpdmUgdmVyc2lvbi5cbiAgICBjYXNlICcgJzpcbiAgICAgIHJldHVybiAnZnVsbFBhZ2VEb3duJ1xuICAgIGNhc2UgJ2InOlxuICAgICAgcmV0dXJuICdmdWxsUGFnZVVwJ1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbFxuICB9XG59XG5cbi8qKlxuICogQXBwbGllcyBhIG1vZGFsIHBhZ2VyIGFjdGlvbiB0byBhIFNjcm9sbEJveC4gUmV0dXJucyB0aGUgcmVzdWx0aW5nIHN0aWNreVxuICogc3RhdGUsIG9yIG51bGwgaWYgdGhlIGFjdGlvbiB3YXMgbnVsbCAobm90aGluZyB0byBkbyDigJQgY2FsbGVyIHNob3VsZCBmYWxsXG4gKiB0aHJvdWdoKS4gQ2FsbHMgb25CZWZvcmVKdW1wKGRlbHRhKSBiZWZvcmUgc2Nyb2xsaW5nIHNvIHRoZSBjYWxsZXIgY2FuXG4gKiB0cmFuc2xhdGUgdGhlIHRleHQgc2VsZWN0aW9uIGJ5IHRoZSBzY3JvbGwgZGVsdGEgKGNhcHR1cmUgb3V0Z29pbmcgcm93cyxcbiAqIHNoaWZ0IGFuY2hvcitmb2N1cykgaW5zdGVhZCBvZiBjbGVhcmluZyBpdC4gRXhwb3J0ZWQgZm9yIHRlc3RpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU1vZGFsUGFnZXJBY3Rpb24oXG4gIHM6IFNjcm9sbEJveEhhbmRsZSxcbiAgYWN0OiBNb2RhbFBhZ2VyQWN0aW9uIHwgbnVsbCxcbiAgb25CZWZvcmVKdW1wOiAoZGVsdGE6IG51bWJlcikgPT4gdm9pZCxcbik6IGJvb2xlYW4gfCBudWxsIHtcbiAgc3dpdGNoIChhY3QpIHtcbiAgICBjYXNlIG51bGw6XG4gICAgICByZXR1cm4gbnVsbFxuICAgIGNhc2UgJ2xpbmVVcCc6XG4gICAgY2FzZSAnbGluZURvd24nOiB7XG4gICAgICBjb25zdCBkID0gYWN0ID09PSAnbGluZURvd24nID8gMSA6IC0xXG4gICAgICBvbkJlZm9yZUp1bXAoZClcbiAgICAgIHJldHVybiBqdW1wQnkocywgZClcbiAgICB9XG4gICAgY2FzZSAnaGFsZlBhZ2VVcCc6XG4gICAgY2FzZSAnaGFsZlBhZ2VEb3duJzoge1xuICAgICAgY29uc3QgaGFsZiA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Iocy5nZXRWaWV3cG9ydEhlaWdodCgpIC8gMikpXG4gICAgICBjb25zdCBkID0gYWN0ID09PSAnaGFsZlBhZ2VEb3duJyA/IGhhbGYgOiAtaGFsZlxuICAgICAgb25CZWZvcmVKdW1wKGQpXG4gICAgICByZXR1cm4ganVtcEJ5KHMsIGQpXG4gICAgfVxuICAgIGNhc2UgJ2Z1bGxQYWdlVXAnOlxuICAgIGNhc2UgJ2Z1bGxQYWdlRG93bic6IHtcbiAgICAgIGNvbnN0IHBhZ2UgPSBNYXRoLm1heCgxLCBzLmdldFZpZXdwb3J0SGVpZ2h0KCkpXG4gICAgICBjb25zdCBkID0gYWN0ID09PSAnZnVsbFBhZ2VEb3duJyA/IHBhZ2UgOiAtcGFnZVxuICAgICAgb25CZWZvcmVKdW1wKGQpXG4gICAgICByZXR1cm4ganVtcEJ5KHMsIGQpXG4gICAgfVxuICAgIGNhc2UgJ3RvcCc6XG4gICAgICBvbkJlZm9yZUp1bXAoLShzLmdldFNjcm9sbFRvcCgpICsgcy5nZXRQZW5kaW5nRGVsdGEoKSkpXG4gICAgICBzLnNjcm9sbFRvKDApXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICBjYXNlICdib3R0b20nOiB7XG4gICAgICBjb25zdCBtYXggPSBNYXRoLm1heCgwLCBzLmdldFNjcm9sbEhlaWdodCgpIC0gcy5nZXRWaWV3cG9ydEhlaWdodCgpKVxuICAgICAgb25CZWZvcmVKdW1wKG1heCAtIChzLmdldFNjcm9sbFRvcCgpICsgcy5nZXRQZW5kaW5nRGVsdGEoKSkpXG4gICAgICAvLyBFYWdlci13cml0ZSBzY3JvbGxUb3AgYmVmb3JlIHNjcm9sbFRvQm90dG9tIOKAlCBzYW1lIGRvdWJsZS1zaGlmdFxuICAgICAgLy8gZml4IGFzIHNjcm9sbDpib3R0b20gYW5kIGp1bXBCeSdzIG1heCBicmFuY2guXG4gICAgICBzLnNjcm9sbFRvKG1heClcbiAgICAgIHMuc2Nyb2xsVG9Cb3R0b20oKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsS0FBSyxJQUFJLEtBQUtDLFNBQVMsRUFBRUMsU0FBUyxFQUFFQyxNQUFNLFFBQVEsT0FBTztBQUNoRSxTQUFTQyxnQkFBZ0IsUUFBUSw2QkFBNkI7QUFDOUQsU0FDRUMsZUFBZSxFQUNmQyxtQkFBbUIsUUFDZCw2QkFBNkI7QUFDcEMsY0FBY0MsZUFBZSxRQUFRLGdDQUFnQztBQUNyRSxTQUFTQyxZQUFZLFFBQVEsK0JBQStCO0FBQzVELGNBQWNDLFNBQVMsRUFBRUMsY0FBYyxRQUFRLHFCQUFxQjtBQUNwRSxTQUFTQyxTQUFTLFFBQVEsb0JBQW9CO0FBQzlDLFNBQVNDLGdCQUFnQixRQUFRLHNCQUFzQjtBQUN2RDtBQUNBLFNBQVMsS0FBS0MsR0FBRyxFQUFFQyxRQUFRLFFBQVEsV0FBVztBQUM5QyxTQUFTQyxjQUFjLFFBQVEsaUNBQWlDO0FBQ2hFLFNBQVNDLGVBQWUsUUFBUSxtQkFBbUI7QUFFbkQsS0FBS0MsS0FBSyxHQUFHO0VBQ1hDLFNBQVMsRUFBRWpCLFNBQVMsQ0FBQ00sZUFBZSxHQUFHLElBQUksQ0FBQztFQUM1Q1ksUUFBUSxFQUFFLE9BQU87RUFDakI7QUFDRjtFQUNFQyxRQUFRLENBQUMsRUFBRSxDQUFDQyxNQUFNLEVBQUUsT0FBTyxFQUFFQyxNQUFNLEVBQUVmLGVBQWUsRUFBRSxHQUFHLElBQUk7RUFDN0Q7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0VnQixPQUFPLENBQUMsRUFBRSxPQUFPO0FBQ25CLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU1DLHFCQUFxQixHQUFHLEVBQUU7QUFDaEMsTUFBTUMsZ0JBQWdCLEdBQUcsR0FBRztBQUM1QixNQUFNQyxlQUFlLEdBQUcsQ0FBQzs7QUFFekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU1DLHVCQUF1QixHQUFHLEdBQUcsRUFBQztBQUNwQztBQUNBO0FBQ0EsTUFBTUMsZUFBZSxHQUFHLEVBQUU7QUFDMUIsTUFBTUMsY0FBYyxHQUFHLEVBQUU7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTUMsZUFBZSxHQUFHLENBQUM7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU1DLDRCQUE0QixHQUFHLElBQUk7O0FBRXpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNQyx1QkFBdUIsR0FBRyxHQUFHO0FBQ25DLE1BQU1DLGdCQUFnQixHQUFHLENBQUM7QUFDMUI7QUFDQTtBQUNBLE1BQU1DLGNBQWMsR0FBRyxDQUFDO0FBQ3hCO0FBQ0E7QUFDQSxNQUFNQyxrQkFBa0IsR0FBRyxFQUFFO0FBQzdCLE1BQU1DLG9CQUFvQixHQUFHLENBQUMsRUFBQztBQUMvQixNQUFNQyxvQkFBb0IsR0FBRyxDQUFDLEVBQUM7QUFDL0I7QUFDQTtBQUNBLE1BQU1DLG1CQUFtQixHQUFHLEdBQUc7O0FBRS9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sU0FBU0MseUJBQXlCQSxDQUFDQyxHQUFHLEVBQUUzQixHQUFHLENBQUMsRUFBRSxPQUFPLENBQUM7RUFDM0QsSUFBSTJCLEdBQUcsQ0FBQ0MsT0FBTyxJQUFJRCxHQUFHLENBQUNFLFNBQVMsRUFBRSxPQUFPLEtBQUs7RUFDOUMsTUFBTUMsS0FBSyxHQUNUSCxHQUFHLENBQUNJLFNBQVMsSUFDYkosR0FBRyxDQUFDSyxVQUFVLElBQ2RMLEdBQUcsQ0FBQ00sT0FBTyxJQUNYTixHQUFHLENBQUNPLFNBQVMsSUFDYlAsR0FBRyxDQUFDUSxJQUFJLElBQ1JSLEdBQUcsQ0FBQ1MsR0FBRyxJQUNQVCxHQUFHLENBQUNVLE1BQU0sSUFDVlYsR0FBRyxDQUFDVyxRQUFRO0VBQ2QsSUFBSVIsS0FBSyxLQUFLSCxHQUFHLENBQUNZLEtBQUssSUFBSVosR0FBRyxDQUFDYSxJQUFJLElBQUliLEdBQUcsQ0FBQ2MsS0FBSyxDQUFDLEVBQUUsT0FBTyxLQUFLO0VBQy9ELE9BQU8sSUFBSTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxTQUFTQyx3QkFBd0JBLENBQUNmLEdBQUcsRUFBRTNCLEdBQUcsQ0FBQyxFQUFFSixTQUFTLEdBQUcsSUFBSSxDQUFDO0VBQ25FLElBQUksQ0FBQytCLEdBQUcsQ0FBQ1ksS0FBSyxJQUFJWixHQUFHLENBQUNhLElBQUksRUFBRSxPQUFPLElBQUk7RUFDdkMsSUFBSWIsR0FBRyxDQUFDSSxTQUFTLEVBQUUsT0FBTyxNQUFNO0VBQ2hDLElBQUlKLEdBQUcsQ0FBQ0ssVUFBVSxFQUFFLE9BQU8sT0FBTztFQUNsQyxJQUFJTCxHQUFHLENBQUNNLE9BQU8sRUFBRSxPQUFPLElBQUk7RUFDNUIsSUFBSU4sR0FBRyxDQUFDTyxTQUFTLEVBQUUsT0FBTyxNQUFNO0VBQ2hDLElBQUlQLEdBQUcsQ0FBQ1EsSUFBSSxFQUFFLE9BQU8sV0FBVztFQUNoQyxJQUFJUixHQUFHLENBQUNTLEdBQUcsRUFBRSxPQUFPLFNBQVM7RUFDN0IsT0FBTyxJQUFJO0FBQ2I7QUFFQSxPQUFPLEtBQUtPLGVBQWUsR0FBRztFQUM1QkMsSUFBSSxFQUFFLE1BQU07RUFDWkMsSUFBSSxFQUFFLE1BQU07RUFDWkMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2ZDLE9BQU8sRUFBRSxPQUFPO0VBQ2hCO0FBQ0Y7QUFDQTtFQUNFQyxJQUFJLEVBQUUsTUFBTTtFQUNaO0FBQ0Y7RUFDRUMsSUFBSSxFQUFFLE1BQU07RUFDWjtBQUNGO0FBQ0E7QUFDQTtBQUNBO0VBQ0VDLFdBQVcsRUFBRSxPQUFPO0VBQ3BCO0FBQ0Y7QUFDQTtBQUNBO0VBQ0VDLFNBQVMsRUFBRSxPQUFPO0VBQ2xCO0FBQ0Y7QUFDQTtBQUNBO0VBQ0VDLFVBQVUsRUFBRSxNQUFNO0FBQ3BCLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLFNBQVNDLGdCQUFnQkEsQ0FDOUJDLEtBQUssRUFBRVgsZUFBZSxFQUN0QkcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDWFMsR0FBRyxFQUFFLE1BQU0sQ0FDWixFQUFFLE1BQU0sQ0FBQztFQUNSLElBQUksQ0FBQ0QsS0FBSyxDQUFDUCxPQUFPLEVBQUU7SUFDbEI7SUFDQTtJQUNBO0lBQ0E7SUFDQSxJQUFJTyxLQUFLLENBQUNILFNBQVMsSUFBSUksR0FBRyxHQUFHRCxLQUFLLENBQUNWLElBQUksR0FBRzFCLDRCQUE0QixFQUFFO01BQ3RFb0MsS0FBSyxDQUFDSCxTQUFTLEdBQUcsS0FBSztNQUN2QkcsS0FBSyxDQUFDRixVQUFVLEdBQUcsQ0FBQztNQUNwQkUsS0FBSyxDQUFDVCxJQUFJLEdBQUdTLEtBQUssQ0FBQ0wsSUFBSTtJQUN6Qjs7SUFFQTtJQUNBO0lBQ0E7SUFDQSxJQUFJSyxLQUFLLENBQUNKLFdBQVcsRUFBRTtNQUNyQkksS0FBSyxDQUFDSixXQUFXLEdBQUcsS0FBSztNQUN6QixJQUFJSixHQUFHLEtBQUtRLEtBQUssQ0FBQ1IsR0FBRyxJQUFJUyxHQUFHLEdBQUdELEtBQUssQ0FBQ1YsSUFBSSxHQUFHOUIsdUJBQXVCLEVBQUU7UUFDbkU7UUFDQTtRQUNBd0MsS0FBSyxDQUFDUixHQUFHLEdBQUdBLEdBQUc7UUFDZlEsS0FBSyxDQUFDVixJQUFJLEdBQUdXLEdBQUc7UUFDaEJELEtBQUssQ0FBQ1QsSUFBSSxHQUFHUyxLQUFLLENBQUNMLElBQUk7UUFDdkIsT0FBT08sSUFBSSxDQUFDQyxLQUFLLENBQUNILEtBQUssQ0FBQ1QsSUFBSSxDQUFDO01BQy9CO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQVMsS0FBSyxDQUFDSCxTQUFTLEdBQUcsSUFBSTtJQUN4QjtJQUVBLE1BQU1PLEdBQUcsR0FBR0gsR0FBRyxHQUFHRCxLQUFLLENBQUNWLElBQUk7SUFDNUIsSUFBSUUsR0FBRyxLQUFLUSxLQUFLLENBQUNSLEdBQUcsSUFBSVEsS0FBSyxDQUFDUixHQUFHLEtBQUssQ0FBQyxFQUFFO01BQ3hDO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQVEsS0FBSyxDQUFDSixXQUFXLEdBQUcsSUFBSTtNQUN4QkksS0FBSyxDQUFDVixJQUFJLEdBQUdXLEdBQUc7TUFDaEIsT0FBTyxDQUFDO0lBQ1Y7SUFDQUQsS0FBSyxDQUFDUixHQUFHLEdBQUdBLEdBQUc7SUFDZlEsS0FBSyxDQUFDVixJQUFJLEdBQUdXLEdBQUc7O0lBRWhCO0lBQ0EsSUFBSUQsS0FBSyxDQUFDSCxTQUFTLEVBQUU7TUFDbkIsSUFBSU8sR0FBRyxHQUFHckMsY0FBYyxFQUFFO1FBQ3hCO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsSUFBSSxFQUFFaUMsS0FBSyxDQUFDRixVQUFVLElBQUksQ0FBQyxFQUFFO1VBQzNCRSxLQUFLLENBQUNILFNBQVMsR0FBRyxLQUFLO1VBQ3ZCRyxLQUFLLENBQUNGLFVBQVUsR0FBRyxDQUFDO1VBQ3BCRSxLQUFLLENBQUNULElBQUksR0FBR1MsS0FBSyxDQUFDTCxJQUFJO1FBQ3pCLENBQUMsTUFBTTtVQUNMLE9BQU8sQ0FBQztRQUNWO01BQ0YsQ0FBQyxNQUFNO1FBQ0xLLEtBQUssQ0FBQ0YsVUFBVSxHQUFHLENBQUM7TUFDdEI7SUFDRjtJQUNBO0lBQ0EsSUFBSUUsS0FBSyxDQUFDSCxTQUFTLEVBQUU7TUFDbkI7TUFDQTtNQUNBO01BQ0E7TUFDQSxNQUFNUSxDQUFDLEdBQUdILElBQUksQ0FBQ0ksR0FBRyxDQUFDLEdBQUcsRUFBRUYsR0FBRyxHQUFHdkMsdUJBQXVCLENBQUM7TUFDdEQsTUFBTTBDLEdBQUcsR0FBR0wsSUFBSSxDQUFDTSxHQUFHLENBQUM5QyxjQUFjLEVBQUVzQyxLQUFLLENBQUNMLElBQUksR0FBRyxDQUFDLENBQUM7TUFDcEQsTUFBTWMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDVCxLQUFLLENBQUNULElBQUksR0FBRyxDQUFDLElBQUljLENBQUMsR0FBRzVDLGVBQWUsR0FBRzRDLENBQUM7TUFDM0RMLEtBQUssQ0FBQ1QsSUFBSSxHQUFHVyxJQUFJLENBQUNRLEdBQUcsQ0FBQ0gsR0FBRyxFQUFFRSxJQUFJLEVBQUVULEtBQUssQ0FBQ1QsSUFBSSxHQUFHNUIsZUFBZSxDQUFDO01BQzlELE9BQU91QyxJQUFJLENBQUNDLEtBQUssQ0FBQ0gsS0FBSyxDQUFDVCxJQUFJLENBQUM7SUFDL0I7O0lBRUE7SUFDQTtJQUNBO0lBQ0E7SUFDQSxJQUFJYSxHQUFHLEdBQUcvQyxxQkFBcUIsRUFBRTtNQUMvQjJDLEtBQUssQ0FBQ1QsSUFBSSxHQUFHUyxLQUFLLENBQUNMLElBQUk7SUFDekIsQ0FBQyxNQUFNO01BQ0wsTUFBTVksR0FBRyxHQUFHTCxJQUFJLENBQUNNLEdBQUcsQ0FBQ2pELGVBQWUsRUFBRXlDLEtBQUssQ0FBQ0wsSUFBSSxHQUFHLENBQUMsQ0FBQztNQUNyREssS0FBSyxDQUFDVCxJQUFJLEdBQUdXLElBQUksQ0FBQ1EsR0FBRyxDQUFDSCxHQUFHLEVBQUVQLEtBQUssQ0FBQ1QsSUFBSSxHQUFHakMsZ0JBQWdCLENBQUM7SUFDM0Q7SUFDQSxPQUFPNEMsSUFBSSxDQUFDQyxLQUFLLENBQUNILEtBQUssQ0FBQ1QsSUFBSSxDQUFDO0VBQy9COztFQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsTUFBTWEsR0FBRyxHQUFHSCxHQUFHLEdBQUdELEtBQUssQ0FBQ1YsSUFBSTtFQUM1QixNQUFNcUIsT0FBTyxHQUFHbkIsR0FBRyxLQUFLUSxLQUFLLENBQUNSLEdBQUc7RUFDakNRLEtBQUssQ0FBQ1YsSUFBSSxHQUFHVyxHQUFHO0VBQ2hCRCxLQUFLLENBQUNSLEdBQUcsR0FBR0EsR0FBRztFQUNmO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxJQUFJbUIsT0FBTyxJQUFJUCxHQUFHLEdBQUdyQyxjQUFjLEVBQUUsT0FBTyxDQUFDO0VBQzdDLElBQUksQ0FBQzRDLE9BQU8sSUFBSVAsR0FBRyxHQUFHakMsbUJBQW1CLEVBQUU7SUFDekM7SUFDQTtJQUNBO0lBQ0E2QixLQUFLLENBQUNULElBQUksR0FBRyxDQUFDO0lBQ2RTLEtBQUssQ0FBQ04sSUFBSSxHQUFHLENBQUM7RUFDaEIsQ0FBQyxNQUFNO0lBQ0wsTUFBTVcsQ0FBQyxHQUFHSCxJQUFJLENBQUNJLEdBQUcsQ0FBQyxHQUFHLEVBQUVGLEdBQUcsR0FBR3ZDLHVCQUF1QixDQUFDO0lBQ3RELE1BQU0wQyxHQUFHLEdBQ1BILEdBQUcsSUFBSXBDLGtCQUFrQixHQUFHQyxvQkFBb0IsR0FBR0Msb0JBQW9CO0lBQ3pFOEIsS0FBSyxDQUFDVCxJQUFJLEdBQUdXLElBQUksQ0FBQ1EsR0FBRyxDQUFDSCxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUNQLEtBQUssQ0FBQ1QsSUFBSSxHQUFHLENBQUMsSUFBSWMsQ0FBQyxHQUFHdkMsZ0JBQWdCLEdBQUd1QyxDQUFDLENBQUM7RUFDN0U7RUFDQSxNQUFNTyxLQUFLLEdBQUdaLEtBQUssQ0FBQ1QsSUFBSSxHQUFHUyxLQUFLLENBQUNOLElBQUk7RUFDckMsTUFBTW1CLElBQUksR0FBR1gsSUFBSSxDQUFDQyxLQUFLLENBQUNTLEtBQUssQ0FBQztFQUM5QlosS0FBSyxDQUFDTixJQUFJLEdBQUdrQixLQUFLLEdBQUdDLElBQUk7RUFDekIsT0FBT0EsSUFBSTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sU0FBU0MsbUJBQW1CQSxDQUFBLENBQUUsRUFBRSxNQUFNLENBQUM7RUFDNUMsTUFBTUMsR0FBRyxHQUFHQyxPQUFPLENBQUNDLEdBQUcsQ0FBQ0Msd0JBQXdCO0VBQ2hELElBQUksQ0FBQ0gsR0FBRyxFQUFFLE9BQU8sQ0FBQztFQUNsQixNQUFNSSxDQUFDLEdBQUdDLFVBQVUsQ0FBQ0wsR0FBRyxDQUFDO0VBQ3pCLE9BQU9NLE1BQU0sQ0FBQ0MsS0FBSyxDQUFDSCxDQUFDLENBQUMsSUFBSUEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUdqQixJQUFJLENBQUNRLEdBQUcsQ0FBQ1MsQ0FBQyxFQUFFLEVBQUUsQ0FBQztBQUN4RDs7QUFFQTtBQUNBO0FBQ0EsT0FBTyxTQUFTSSxjQUFjQSxDQUFDOUIsT0FBTyxHQUFHLEtBQUssRUFBRUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFTixlQUFlLENBQUM7RUFDekUsT0FBTztJQUNMQyxJQUFJLEVBQUUsQ0FBQztJQUNQQyxJQUFJLEVBQUVJLElBQUk7SUFDVkgsR0FBRyxFQUFFLENBQUM7SUFDTkMsT0FBTztJQUNQQyxJQUFJLEVBQUUsQ0FBQztJQUNQQyxJQUFJO0lBQ0pDLFdBQVcsRUFBRSxLQUFLO0lBQ2xCQyxTQUFTLEVBQUUsS0FBSztJQUNoQkMsVUFBVSxFQUFFO0VBQ2QsQ0FBQztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMwQixvQkFBb0JBLENBQUEsQ0FBRSxFQUFFbkMsZUFBZSxDQUFDO0VBQy9DLE1BQU1JLE9BQU8sR0FBR2pELFNBQVMsQ0FBQyxDQUFDO0VBQzNCLE1BQU1tRCxJQUFJLEdBQUdtQixtQkFBbUIsQ0FBQyxDQUFDO0VBQ2xDakUsZUFBZSxDQUNiLGdCQUFnQjRDLE9BQU8sR0FBRyxrQkFBa0IsR0FBRyxpQkFBaUIsV0FBV0UsSUFBSSxtQkFBbUJxQixPQUFPLENBQUNDLEdBQUcsQ0FBQ1EsWUFBWSxJQUFJLE9BQU8sRUFDdkksQ0FBQztFQUNELE9BQU9GLGNBQWMsQ0FBQzlCLE9BQU8sRUFBRUUsSUFBSSxDQUFDO0FBQ3RDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU0rQixnQkFBZ0IsR0FBRyxDQUFDO0FBQzFCLE1BQU1DLHNCQUFzQixHQUFHLEVBQUU7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU1DLG9CQUFvQixHQUFHLEdBQUcsRUFBQzs7QUFFakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxTQUFTQyx1QkFBdUJBLENBQUM7RUFDdEM5RSxTQUFTO0VBQ1RDLFFBQVE7RUFDUkMsUUFBUTtFQUNSRyxPQUFPLEdBQUc7QUFDTCxDQUFOLEVBQUVOLEtBQUssQ0FBQyxFQUFFakIsS0FBSyxDQUFDaUcsU0FBUyxDQUFDO0VBQ3pCLE1BQU1DLFNBQVMsR0FBRzFGLFlBQVksQ0FBQyxDQUFDO0VBQ2hDLE1BQU07SUFBRTJGO0VBQWdCLENBQUMsR0FBRy9GLGdCQUFnQixDQUFDLENBQUM7RUFDOUM7RUFDQTtFQUNBO0VBQ0EsTUFBTWdHLFVBQVUsR0FBR2pHLE1BQU0sQ0FBQ3FELGVBQWUsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUM7RUFFdkQsU0FBUzZDLGVBQWVBLENBQUNDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUM7SUFDM0M7SUFDQTtJQUNBO0lBQ0EsTUFBTUMsSUFBSSxHQUFHM0YsZ0JBQWdCLENBQUMsQ0FBQztJQUMvQixNQUFNMEUsQ0FBQyxHQUFHZ0IsSUFBSSxDQUFDRSxNQUFNO0lBQ3JCLElBQUlDLEdBQUcsRUFBRSxNQUFNO0lBQ2YsUUFBUUYsSUFBSTtNQUNWLEtBQUssUUFBUTtRQUNYRSxHQUFHLEdBQUcsVUFBVW5CLENBQUMscUJBQXFCO1FBQ3RDO01BQ0YsS0FBSyxhQUFhO1FBQ2hCbUIsR0FBRyxHQUFHLFVBQVVuQixDQUFDLCtDQUErQztRQUNoRTtNQUNGLEtBQUssT0FBTztRQUNWbUIsR0FBRyxHQUFHLFFBQVFuQixDQUFDLHNFQUFzRTtRQUNyRjtJQUNKO0lBQ0FhLGVBQWUsQ0FBQztNQUNkM0QsR0FBRyxFQUFFLGtCQUFrQjtNQUN2QjhELElBQUksRUFBRUcsR0FBRztNQUNUQyxLQUFLLEVBQUUsWUFBWTtNQUNuQkMsUUFBUSxFQUFFLFdBQVc7TUFDckJDLFNBQVMsRUFBRUwsSUFBSSxLQUFLLFFBQVEsR0FBRyxJQUFJLEdBQUc7SUFDeEMsQ0FBQyxDQUFDO0VBQ0o7RUFFQSxTQUFTTSxZQUFZQSxDQUFBLENBQUUsRUFBRSxJQUFJLENBQUM7SUFDNUIsTUFBTVAsTUFBSSxHQUFHSixTQUFTLENBQUNZLGFBQWEsQ0FBQyxDQUFDO0lBQ3RDLElBQUlSLE1BQUksRUFBRUQsZUFBZSxDQUFDQyxNQUFJLENBQUM7RUFDakM7O0VBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsU0FBU1MseUJBQXlCQSxDQUFDQyxDQUFDLEVBQUV6RyxlQUFlLEVBQUUwRyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDO0lBQzFFLE1BQU1DLEdBQUcsR0FBR2hCLFNBQVMsQ0FBQ2lCLFFBQVEsQ0FBQyxDQUFDO0lBQ2hDLElBQUksQ0FBQ0QsR0FBRyxFQUFFRSxNQUFNLElBQUksQ0FBQ0YsR0FBRyxDQUFDRyxLQUFLLEVBQUU7SUFDaEMsTUFBTUMsR0FBRyxHQUFHTixDQUFDLENBQUNPLGNBQWMsQ0FBQyxDQUFDO0lBQzlCLE1BQU1DLE1BQU0sR0FBR0YsR0FBRyxHQUFHTixDQUFDLENBQUNTLGlCQUFpQixDQUFDLENBQUMsR0FBRyxDQUFDO0lBQzlDO0lBQ0E7SUFDQTtJQUNBO0lBQ0EsSUFBSVAsR0FBRyxDQUFDRSxNQUFNLENBQUNNLEdBQUcsR0FBR0osR0FBRyxJQUFJSixHQUFHLENBQUNFLE1BQU0sQ0FBQ00sR0FBRyxHQUFHRixNQUFNLEVBQUU7SUFDckQ7SUFDQTtJQUNBO0lBQ0E7SUFDQSxJQUFJTixHQUFHLENBQUNHLEtBQUssQ0FBQ0ssR0FBRyxHQUFHSixHQUFHLElBQUlKLEdBQUcsQ0FBQ0csS0FBSyxDQUFDSyxHQUFHLEdBQUdGLE1BQU0sRUFBRTtJQUNuRCxNQUFNN0MsR0FBRyxHQUFHTixJQUFJLENBQUNNLEdBQUcsQ0FBQyxDQUFDLEVBQUVxQyxDQUFDLENBQUNXLGVBQWUsQ0FBQyxDQUFDLEdBQUdYLENBQUMsQ0FBQ1MsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLE1BQU1HLEdBQUcsR0FBR1osQ0FBQyxDQUFDYSxZQUFZLENBQUMsQ0FBQyxHQUFHYixDQUFDLENBQUNjLGVBQWUsQ0FBQyxDQUFDO0lBQ2xEO0lBQ0E7SUFDQTtJQUNBLE1BQU1DLE1BQU0sR0FBRzFELElBQUksQ0FBQ00sR0FBRyxDQUFDLENBQUMsRUFBRU4sSUFBSSxDQUFDUSxHQUFHLENBQUNGLEdBQUcsRUFBRWlELEdBQUcsR0FBR1gsS0FBSyxDQUFDLENBQUMsR0FBR1csR0FBRztJQUM1RCxJQUFJRyxNQUFNLEtBQUssQ0FBQyxFQUFFO0lBQ2xCLElBQUlBLE1BQU0sR0FBRyxDQUFDLEVBQUU7TUFDZDtNQUNBO01BQ0E3QixTQUFTLENBQUM4QixtQkFBbUIsQ0FBQ1YsR0FBRyxFQUFFQSxHQUFHLEdBQUdTLE1BQU0sR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDO01BQzdEN0IsU0FBUyxDQUFDK0IsY0FBYyxDQUFDLENBQUNGLE1BQU0sRUFBRVQsR0FBRyxFQUFFRSxNQUFNLENBQUM7SUFDaEQsQ0FBQyxNQUFNO01BQ0w7TUFDQSxNQUFNVSxDQUFDLEdBQUcsQ0FBQ0gsTUFBTTtNQUNqQjdCLFNBQVMsQ0FBQzhCLG1CQUFtQixDQUFDUixNQUFNLEdBQUdVLENBQUMsR0FBRyxDQUFDLEVBQUVWLE1BQU0sRUFBRSxPQUFPLENBQUM7TUFDOUR0QixTQUFTLENBQUMrQixjQUFjLENBQUNDLENBQUMsRUFBRVosR0FBRyxFQUFFRSxNQUFNLENBQUM7SUFDMUM7RUFDRjtFQUVBekcsY0FBYyxDQUNaO0lBQ0UsZUFBZSxFQUFFb0gsQ0FBQSxLQUFNO01BQ3JCLE1BQU1uQixHQUFDLEdBQUc5RixTQUFTLENBQUNrSCxPQUFPO01BQzNCLElBQUksQ0FBQ3BCLEdBQUMsRUFBRTtNQUNSLE1BQU1xQixDQUFDLEdBQUcsQ0FBQ2hFLElBQUksQ0FBQ00sR0FBRyxDQUFDLENBQUMsRUFBRU4sSUFBSSxDQUFDQyxLQUFLLENBQUMwQyxHQUFDLENBQUNTLGlCQUFpQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztNQUM3RFYseUJBQXlCLENBQUNDLEdBQUMsRUFBRXFCLENBQUMsQ0FBQztNQUMvQixNQUFNaEgsTUFBTSxHQUFHaUgsTUFBTSxDQUFDdEIsR0FBQyxFQUFFcUIsQ0FBQyxDQUFDO01BQzNCakgsUUFBUSxHQUFHQyxNQUFNLEVBQUUyRixHQUFDLENBQUM7SUFDdkIsQ0FBQztJQUNELGlCQUFpQixFQUFFdUIsQ0FBQSxLQUFNO01BQ3ZCLE1BQU12QixHQUFDLEdBQUc5RixTQUFTLENBQUNrSCxPQUFPO01BQzNCLElBQUksQ0FBQ3BCLEdBQUMsRUFBRTtNQUNSLE1BQU1xQixHQUFDLEdBQUdoRSxJQUFJLENBQUNNLEdBQUcsQ0FBQyxDQUFDLEVBQUVOLElBQUksQ0FBQ0MsS0FBSyxDQUFDMEMsR0FBQyxDQUFDUyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7TUFDNURWLHlCQUF5QixDQUFDQyxHQUFDLEVBQUVxQixHQUFDLENBQUM7TUFDL0IsTUFBTWhILFFBQU0sR0FBR2lILE1BQU0sQ0FBQ3RCLEdBQUMsRUFBRXFCLEdBQUMsQ0FBQztNQUMzQmpILFFBQVEsR0FBR0MsUUFBTSxFQUFFMkYsR0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxlQUFlLEVBQUV3QixDQUFBLEtBQU07TUFDckI7TUFDQTtNQUNBO01BQ0F0QyxTQUFTLENBQUN1QyxjQUFjLENBQUMsQ0FBQztNQUMxQixNQUFNekIsR0FBQyxHQUFHOUYsU0FBUyxDQUFDa0gsT0FBTztNQUMzQjtNQUNBO01BQ0E7TUFDQTtNQUNBLElBQUksQ0FBQ3BCLEdBQUMsSUFBSUEsR0FBQyxDQUFDVyxlQUFlLENBQUMsQ0FBQyxJQUFJWCxHQUFDLENBQUNTLGlCQUFpQixDQUFDLENBQUMsRUFBRSxPQUFPLEtBQUs7TUFDcEVyQixVQUFVLENBQUNnQyxPQUFPLEtBQUt6QyxvQkFBb0IsQ0FBQyxDQUFDO01BQzdDK0MsUUFBUSxDQUFDMUIsR0FBQyxFQUFFOUMsZ0JBQWdCLENBQUNrQyxVQUFVLENBQUNnQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUVPLFdBQVcsQ0FBQ3ZFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUN4RWhELFFBQVEsR0FBRyxLQUFLLEVBQUU0RixHQUFDLENBQUM7SUFDdEIsQ0FBQztJQUNELGlCQUFpQixFQUFFNEIsQ0FBQSxLQUFNO01BQ3ZCMUMsU0FBUyxDQUFDdUMsY0FBYyxDQUFDLENBQUM7TUFDMUIsTUFBTXpCLEdBQUMsR0FBRzlGLFNBQVMsQ0FBQ2tILE9BQU87TUFDM0IsSUFBSSxDQUFDcEIsR0FBQyxJQUFJQSxHQUFDLENBQUNXLGVBQWUsQ0FBQyxDQUFDLElBQUlYLEdBQUMsQ0FBQ1MsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLE9BQU8sS0FBSztNQUNwRXJCLFVBQVUsQ0FBQ2dDLE9BQU8sS0FBS3pDLG9CQUFvQixDQUFDLENBQUM7TUFDN0MsTUFBTWtELElBQUksR0FBRzNFLGdCQUFnQixDQUFDa0MsVUFBVSxDQUFDZ0MsT0FBTyxFQUFFLENBQUMsRUFBRU8sV0FBVyxDQUFDdkUsR0FBRyxDQUFDLENBQUMsQ0FBQztNQUN2RSxNQUFNMEUsYUFBYSxHQUFHQyxVQUFVLENBQUMvQixHQUFDLEVBQUU2QixJQUFJLENBQUM7TUFDekN6SCxRQUFRLEdBQUcwSCxhQUFhLEVBQUU5QixHQUFDLENBQUM7SUFDOUIsQ0FBQztJQUNELFlBQVksRUFBRWdDLENBQUEsS0FBTTtNQUNsQixNQUFNaEMsR0FBQyxHQUFHOUYsU0FBUyxDQUFDa0gsT0FBTztNQUMzQixJQUFJLENBQUNwQixHQUFDLEVBQUU7TUFDUkQseUJBQXlCLENBQUNDLEdBQUMsRUFBRSxFQUFFQSxHQUFDLENBQUNhLFlBQVksQ0FBQyxDQUFDLEdBQUdiLEdBQUMsQ0FBQ2MsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ3ZFZCxHQUFDLENBQUNpQyxRQUFRLENBQUMsQ0FBQyxDQUFDO01BQ2I3SCxRQUFRLEdBQUcsS0FBSyxFQUFFNEYsR0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFDRCxlQUFlLEVBQUVrQyxDQUFBLEtBQU07TUFDckIsTUFBTWxDLEdBQUMsR0FBRzlGLFNBQVMsQ0FBQ2tILE9BQU87TUFDM0IsSUFBSSxDQUFDcEIsR0FBQyxFQUFFO01BQ1IsTUFBTXJDLEtBQUcsR0FBR04sSUFBSSxDQUFDTSxHQUFHLENBQUMsQ0FBQyxFQUFFcUMsR0FBQyxDQUFDVyxlQUFlLENBQUMsQ0FBQyxHQUFHWCxHQUFDLENBQUNTLGlCQUFpQixDQUFDLENBQUMsQ0FBQztNQUNwRVYseUJBQXlCLENBQ3ZCQyxHQUFDLEVBQ0RyQyxLQUFHLElBQUlxQyxHQUFDLENBQUNhLFlBQVksQ0FBQyxDQUFDLEdBQUdiLEdBQUMsQ0FBQ2MsZUFBZSxDQUFDLENBQUMsQ0FDL0MsQ0FBQztNQUNEO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQWQsR0FBQyxDQUFDaUMsUUFBUSxDQUFDdEUsS0FBRyxDQUFDO01BQ2ZxQyxHQUFDLENBQUNtQyxjQUFjLENBQUMsQ0FBQztNQUNsQi9ILFFBQVEsR0FBRyxJQUFJLEVBQUU0RixHQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELGdCQUFnQixFQUFFSDtFQUNwQixDQUFDLEVBQ0Q7SUFBRXVDLE9BQU8sRUFBRSxRQUFRO0lBQUVqSTtFQUFTLENBQ2hDLENBQUM7O0VBRUQ7RUFDQTtFQUNBO0VBQ0E7RUFDQUosY0FBYyxDQUNaO0lBQ0UsbUJBQW1CLEVBQUVzSSxDQUFBLEtBQU07TUFDekIsTUFBTXJDLEdBQUMsR0FBRzlGLFNBQVMsQ0FBQ2tILE9BQU87TUFDM0IsSUFBSSxDQUFDcEIsR0FBQyxFQUFFO01BQ1IsTUFBTXFCLEdBQUMsR0FBRyxDQUFDaEUsSUFBSSxDQUFDTSxHQUFHLENBQUMsQ0FBQyxFQUFFTixJQUFJLENBQUNDLEtBQUssQ0FBQzBDLEdBQUMsQ0FBQ1MsaUJBQWlCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO01BQzdEVix5QkFBeUIsQ0FBQ0MsR0FBQyxFQUFFcUIsR0FBQyxDQUFDO01BQy9CLE1BQU1oSCxRQUFNLEdBQUdpSCxNQUFNLENBQUN0QixHQUFDLEVBQUVxQixHQUFDLENBQUM7TUFDM0JqSCxRQUFRLEdBQUdDLFFBQU0sRUFBRTJGLEdBQUMsQ0FBQztJQUN2QixDQUFDO0lBQ0QscUJBQXFCLEVBQUVzQyxDQUFBLEtBQU07TUFDM0IsTUFBTXRDLEdBQUMsR0FBRzlGLFNBQVMsQ0FBQ2tILE9BQU87TUFDM0IsSUFBSSxDQUFDcEIsR0FBQyxFQUFFO01BQ1IsTUFBTXFCLEdBQUMsR0FBR2hFLElBQUksQ0FBQ00sR0FBRyxDQUFDLENBQUMsRUFBRU4sSUFBSSxDQUFDQyxLQUFLLENBQUMwQyxHQUFDLENBQUNTLGlCQUFpQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztNQUM1RFYseUJBQXlCLENBQUNDLEdBQUMsRUFBRXFCLEdBQUMsQ0FBQztNQUMvQixNQUFNaEgsUUFBTSxHQUFHaUgsTUFBTSxDQUFDdEIsR0FBQyxFQUFFcUIsR0FBQyxDQUFDO01BQzNCakgsUUFBUSxHQUFHQyxRQUFNLEVBQUUyRixHQUFDLENBQUM7SUFDdkIsQ0FBQztJQUNELG1CQUFtQixFQUFFdUMsQ0FBQSxLQUFNO01BQ3pCLE1BQU12QyxHQUFDLEdBQUc5RixTQUFTLENBQUNrSCxPQUFPO01BQzNCLElBQUksQ0FBQ3BCLEdBQUMsRUFBRTtNQUNSLE1BQU1xQixHQUFDLEdBQUcsQ0FBQ2hFLElBQUksQ0FBQ00sR0FBRyxDQUFDLENBQUMsRUFBRXFDLEdBQUMsQ0FBQ1MsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO01BQzdDVix5QkFBeUIsQ0FBQ0MsR0FBQyxFQUFFcUIsR0FBQyxDQUFDO01BQy9CLE1BQU1oSCxRQUFNLEdBQUdpSCxNQUFNLENBQUN0QixHQUFDLEVBQUVxQixHQUFDLENBQUM7TUFDM0JqSCxRQUFRLEdBQUdDLFFBQU0sRUFBRTJGLEdBQUMsQ0FBQztJQUN2QixDQUFDO0lBQ0QscUJBQXFCLEVBQUV3QyxDQUFBLEtBQU07TUFDM0IsTUFBTXhDLEdBQUMsR0FBRzlGLFNBQVMsQ0FBQ2tILE9BQU87TUFDM0IsSUFBSSxDQUFDcEIsR0FBQyxFQUFFO01BQ1IsTUFBTXFCLEdBQUMsR0FBR2hFLElBQUksQ0FBQ00sR0FBRyxDQUFDLENBQUMsRUFBRXFDLEdBQUMsQ0FBQ1MsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO01BQzVDVix5QkFBeUIsQ0FBQ0MsR0FBQyxFQUFFcUIsR0FBQyxDQUFDO01BQy9CLE1BQU1oSCxRQUFNLEdBQUdpSCxNQUFNLENBQUN0QixHQUFDLEVBQUVxQixHQUFDLENBQUM7TUFDM0JqSCxRQUFRLEdBQUdDLFFBQU0sRUFBRTJGLEdBQUMsQ0FBQztJQUN2QjtFQUNGLENBQUMsRUFDRDtJQUFFb0MsT0FBTyxFQUFFLFFBQVE7SUFBRWpJO0VBQVMsQ0FDaEMsQ0FBQzs7RUFFRDtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBTCxRQUFRLENBQ04sQ0FBQzJJLEtBQUssRUFBRWpILEdBQUcsRUFBRWtILEtBQUssS0FBSztJQUNyQixNQUFNMUMsSUFBQyxHQUFHOUYsU0FBUyxDQUFDa0gsT0FBTztJQUMzQixJQUFJLENBQUNwQixJQUFDLEVBQUU7SUFDUixNQUFNM0YsUUFBTSxHQUFHc0kscUJBQXFCLENBQUMzQyxJQUFDLEVBQUU0QyxnQkFBZ0IsQ0FBQ0gsS0FBSyxFQUFFakgsR0FBRyxDQUFDLEVBQUU2RixHQUFDLElBQ3JFdEIseUJBQXlCLENBQUNDLElBQUMsRUFBRXFCLEdBQUMsQ0FDaEMsQ0FBQztJQUNELElBQUloSCxRQUFNLEtBQUssSUFBSSxFQUFFO0lBQ3JCRCxRQUFRLEdBQUdDLFFBQU0sRUFBRTJGLElBQUMsQ0FBQztJQUNyQjBDLEtBQUssQ0FBQ0csd0JBQXdCLENBQUMsQ0FBQztFQUNsQyxDQUFDLEVBQ0Q7SUFBRTFJLFFBQVEsRUFBRUEsUUFBUSxJQUFJSTtFQUFRLENBQ2xDLENBQUM7O0VBRUQ7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBVCxRQUFRLENBQ04sQ0FBQzJJLE9BQUssRUFBRWpILEtBQUcsRUFBRWtILE9BQUssS0FBSztJQUNyQixJQUFJLENBQUN4RCxTQUFTLENBQUM0RCxZQUFZLENBQUMsQ0FBQyxFQUFFO0lBQy9CLElBQUl0SCxLQUFHLENBQUN1SCxNQUFNLEVBQUU7TUFDZDdELFNBQVMsQ0FBQ3VDLGNBQWMsQ0FBQyxDQUFDO01BQzFCaUIsT0FBSyxDQUFDRyx3QkFBd0IsQ0FBQyxDQUFDO01BQ2hDO0lBQ0Y7SUFDQSxJQUFJckgsS0FBRyxDQUFDd0gsSUFBSSxJQUFJLENBQUN4SCxLQUFHLENBQUNZLEtBQUssSUFBSSxDQUFDWixLQUFHLENBQUNhLElBQUksSUFBSW9HLE9BQUssS0FBSyxHQUFHLEVBQUU7TUFDeEQ1QyxZQUFZLENBQUMsQ0FBQztNQUNkNkMsT0FBSyxDQUFDRyx3QkFBd0IsQ0FBQyxDQUFDO01BQ2hDO0lBQ0Y7SUFDQSxNQUFNSSxJQUFJLEdBQUcxRyx3QkFBd0IsQ0FBQ2YsS0FBRyxDQUFDO0lBQzFDLElBQUl5SCxJQUFJLEVBQUU7TUFDUi9ELFNBQVMsQ0FBQ2dFLFNBQVMsQ0FBQ0QsSUFBSSxDQUFDO01BQ3pCUCxPQUFLLENBQUNHLHdCQUF3QixDQUFDLENBQUM7TUFDaEM7SUFDRjtJQUNBLElBQUl0SCx5QkFBeUIsQ0FBQ0MsS0FBRyxDQUFDLEVBQUU7TUFDbEMwRCxTQUFTLENBQUN1QyxjQUFjLENBQUMsQ0FBQztJQUM1QjtFQUNGLENBQUMsRUFDRDtJQUFFdEg7RUFBUyxDQUNiLENBQUM7RUFFRGdKLGVBQWUsQ0FBQ2pKLFNBQVMsRUFBRWdGLFNBQVMsRUFBRS9FLFFBQVEsRUFBRUMsUUFBUSxDQUFDO0VBQ3pEZixlQUFlLENBQUM2RixTQUFTLEVBQUUvRSxRQUFRLEVBQUVrRixlQUFlLENBQUM7RUFDckQvRixtQkFBbUIsQ0FBQzRGLFNBQVMsQ0FBQztFQUU5QixPQUFPLElBQUk7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTaUUsZUFBZUEsQ0FDdEJqSixTQUFTLEVBQUVqQixTQUFTLENBQUNNLGVBQWUsR0FBRyxJQUFJLENBQUMsRUFDNUMyRixTQUFTLEVBQUVrRSxVQUFVLENBQUMsT0FBTzVKLFlBQVksQ0FBQyxFQUMxQ1csUUFBUSxFQUFFLE9BQU8sRUFDakJDLFFBQVEsRUFBRUgsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUM1QixFQUFFLElBQUksQ0FBQztFQUNOLE1BQU1vSixRQUFRLEdBQUdsSyxNQUFNLENBQUNtSyxNQUFNLENBQUNDLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUM7RUFDcEQsTUFBTUMsTUFBTSxHQUFHckssTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQztFQUNyQztFQUNBLE1BQU1zSyxrQkFBa0IsR0FBR3RLLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2hELE1BQU11SyxRQUFRLEdBQUd2SyxNQUFNLENBQUMsQ0FBQyxDQUFDO0VBQzFCO0VBQ0E7RUFDQTtFQUNBLE1BQU13SyxXQUFXLEdBQUd4SyxNQUFNLENBQUNpQixRQUFRLENBQUM7RUFDcEN1SixXQUFXLENBQUN2QyxPQUFPLEdBQUdoSCxRQUFRO0VBRTlCbEIsU0FBUyxDQUFDLE1BQU07SUFDZCxJQUFJLENBQUNpQixRQUFRLEVBQUU7SUFFZixTQUFTeUosSUFBSUEsQ0FBQSxDQUFFLEVBQUUsSUFBSSxDQUFDO01BQ3BCSixNQUFNLENBQUNwQyxPQUFPLEdBQUcsQ0FBQztNQUNsQixJQUFJaUMsUUFBUSxDQUFDakMsT0FBTyxFQUFFO1FBQ3BCeUMsYUFBYSxDQUFDUixRQUFRLENBQUNqQyxPQUFPLENBQUM7UUFDL0JpQyxRQUFRLENBQUNqQyxPQUFPLEdBQUcsSUFBSTtNQUN6QjtJQUNGO0lBRUEsU0FBUzBDLElBQUlBLENBQUEsQ0FBRSxFQUFFLElBQUksQ0FBQztNQUNwQixNQUFNNUQsR0FBRyxHQUFHaEIsU0FBUyxDQUFDaUIsUUFBUSxDQUFDLENBQUM7TUFDaEMsTUFBTUgsQ0FBQyxHQUFHOUYsU0FBUyxDQUFDa0gsT0FBTztNQUMzQixNQUFNekUsR0FBRyxHQUFHNkcsTUFBTSxDQUFDcEMsT0FBTztNQUMxQjtNQUNBO01BQ0E7TUFDQTtNQUNBLElBQ0UsQ0FBQ2xCLEdBQUcsRUFBRTZELFVBQVUsSUFDaEIsQ0FBQzdELEdBQUcsQ0FBQ0csS0FBSyxJQUNWLENBQUNMLENBQUMsSUFDRnJELEdBQUcsS0FBSyxDQUFDLElBQ1QsRUFBRStHLFFBQVEsQ0FBQ3RDLE9BQU8sR0FBR3JDLG9CQUFvQixFQUN6QztRQUNBNkUsSUFBSSxDQUFDLENBQUM7UUFDTjtNQUNGO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQSxJQUFJNUQsQ0FBQyxDQUFDYyxlQUFlLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRTtNQUMvQixNQUFNUixHQUFHLEdBQUdOLENBQUMsQ0FBQ08sY0FBYyxDQUFDLENBQUM7TUFDOUIsTUFBTUMsTUFBTSxHQUFHRixHQUFHLEdBQUdOLENBQUMsQ0FBQ1MsaUJBQWlCLENBQUMsQ0FBQyxHQUFHLENBQUM7TUFDOUM7TUFDQTtNQUNBO01BQ0E7TUFDQSxJQUFJOUQsR0FBRyxHQUFHLENBQUMsRUFBRTtRQUNYLElBQUlxRCxDQUFDLENBQUNhLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFO1VBQ3pCK0MsSUFBSSxDQUFDLENBQUM7VUFDTjtRQUNGO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsTUFBTTdDLE1BQU0sR0FBRzFELElBQUksQ0FBQ1EsR0FBRyxDQUFDZ0IsZ0JBQWdCLEVBQUVtQixDQUFDLENBQUNhLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDM0Q7UUFDQTtRQUNBO1FBQ0EzQixTQUFTLENBQUM4QixtQkFBbUIsQ0FBQ1IsTUFBTSxHQUFHTyxNQUFNLEdBQUcsQ0FBQyxFQUFFUCxNQUFNLEVBQUUsT0FBTyxDQUFDO1FBQ25FdEIsU0FBUyxDQUFDOEUsV0FBVyxDQUFDakQsTUFBTSxFQUFFLENBQUMsRUFBRVAsTUFBTSxDQUFDO1FBQ3hDUixDQUFDLENBQUNpRSxRQUFRLENBQUMsQ0FBQ3BGLGdCQUFnQixDQUFDO01BQy9CLENBQUMsTUFBTTtRQUNMLE1BQU1sQixHQUFHLEdBQUdOLElBQUksQ0FBQ00sR0FBRyxDQUFDLENBQUMsRUFBRXFDLENBQUMsQ0FBQ1csZUFBZSxDQUFDLENBQUMsR0FBR1gsQ0FBQyxDQUFDUyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7UUFDcEUsSUFBSVQsQ0FBQyxDQUFDYSxZQUFZLENBQUMsQ0FBQyxJQUFJbEQsR0FBRyxFQUFFO1VBQzNCaUcsSUFBSSxDQUFDLENBQUM7VUFDTjtRQUNGO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsTUFBTTdDLFFBQU0sR0FBRzFELElBQUksQ0FBQ1EsR0FBRyxDQUFDZ0IsZ0JBQWdCLEVBQUVsQixHQUFHLEdBQUdxQyxDQUFDLENBQUNhLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDakU7UUFDQTNCLFNBQVMsQ0FBQzhCLG1CQUFtQixDQUFDVixHQUFHLEVBQUVBLEdBQUcsR0FBR1MsUUFBTSxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUM7UUFDN0Q3QixTQUFTLENBQUM4RSxXQUFXLENBQUMsQ0FBQ2pELFFBQU0sRUFBRVQsR0FBRyxFQUFFRSxNQUFNLENBQUM7UUFDM0NSLENBQUMsQ0FBQ2lFLFFBQVEsQ0FBQ3BGLGdCQUFnQixDQUFDO01BQzlCO01BQ0E4RSxXQUFXLENBQUN2QyxPQUFPLEdBQUcsS0FBSyxFQUFFcEIsQ0FBQyxDQUFDO0lBQ2pDO0lBRUEsU0FBU2tFLEtBQUtBLENBQUN2SCxLQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO01BQ2hDO01BQ0E7TUFDQTtNQUNBO01BQ0E4RyxrQkFBa0IsQ0FBQ3JDLE9BQU8sR0FBR3pFLEtBQUc7TUFDaEMsSUFBSTZHLE1BQU0sQ0FBQ3BDLE9BQU8sS0FBS3pFLEtBQUcsRUFBRSxPQUFNLENBQUM7TUFDbkNpSCxJQUFJLENBQUMsQ0FBQztNQUNOSixNQUFNLENBQUNwQyxPQUFPLEdBQUd6RSxLQUFHO01BQ3BCK0csUUFBUSxDQUFDdEMsT0FBTyxHQUFHLENBQUM7TUFDcEIwQyxJQUFJLENBQUMsQ0FBQztNQUNOO01BQ0E7TUFDQTtNQUNBLElBQUlOLE1BQU0sQ0FBQ3BDLE9BQU8sS0FBS3pFLEtBQUcsRUFBRTtRQUMxQjBHLFFBQVEsQ0FBQ2pDLE9BQU8sR0FBRytDLFdBQVcsQ0FBQ0wsSUFBSSxFQUFFaEYsc0JBQXNCLENBQUM7TUFDOUQ7SUFDRjs7SUFFQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBLFNBQVNzRixLQUFLQSxDQUFBLENBQUUsRUFBRSxJQUFJLENBQUM7TUFDckIsTUFBTXBFLEdBQUMsR0FBRzlGLFNBQVMsQ0FBQ2tILE9BQU87TUFDM0IsSUFBSSxDQUFDcEIsR0FBQyxFQUFFO1FBQ040RCxJQUFJLENBQUMsQ0FBQztRQUNOO01BQ0Y7TUFDQSxNQUFNdEQsS0FBRyxHQUFHTixHQUFDLENBQUNPLGNBQWMsQ0FBQyxDQUFDO01BQzlCLE1BQU1DLFFBQU0sR0FBR0YsS0FBRyxHQUFHTixHQUFDLENBQUNTLGlCQUFpQixDQUFDLENBQUMsR0FBRyxDQUFDO01BQzlDLE1BQU1QLEtBQUcsR0FBR2hCLFNBQVMsQ0FBQ2lCLFFBQVEsQ0FBQyxDQUFDO01BQ2hDO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBLElBQ0UsQ0FBQ0QsS0FBRyxFQUFFNkQsVUFBVSxJQUNmN0QsS0FBRyxDQUFDbUUsZ0JBQWdCLENBQUM3RSxNQUFNLEtBQUssQ0FBQyxJQUFJVSxLQUFHLENBQUNvRSxnQkFBZ0IsQ0FBQzlFLE1BQU0sS0FBSyxDQUFFLEVBQ3hFO1FBQ0FpRSxrQkFBa0IsQ0FBQ3JDLE9BQU8sR0FBRyxDQUFDO01BQ2hDO01BQ0EsTUFBTXpFLEtBQUcsR0FBRzRILG1CQUFtQixDQUM3QnJFLEtBQUcsRUFDSEksS0FBRyxFQUNIRSxRQUFNLEVBQ05pRCxrQkFBa0IsQ0FBQ3JDLE9BQ3JCLENBQUM7TUFDRCxJQUFJekUsS0FBRyxLQUFLLENBQUMsRUFBRTtRQUNiO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxJQUFJOEcsa0JBQWtCLENBQUNyQyxPQUFPLEtBQUssQ0FBQyxJQUFJbEIsS0FBRyxFQUFFRyxLQUFLLEVBQUU7VUFDbEQsTUFBTW1FLElBQUksR0FBR3RFLEtBQUcsQ0FBQ0csS0FBSyxDQUFDSyxHQUFHLEdBQUdKLEtBQUcsR0FBRyxDQUFDLENBQUMsR0FBR0osS0FBRyxDQUFDRyxLQUFLLENBQUNLLEdBQUcsR0FBR0YsUUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDO1VBQ3RFLElBQUlnRSxJQUFJLEtBQUssQ0FBQyxJQUFJQSxJQUFJLEtBQUtmLGtCQUFrQixDQUFDckMsT0FBTyxFQUFFO1lBQ3JEbEIsS0FBRyxDQUFDbUUsZ0JBQWdCLEdBQUcsRUFBRTtZQUN6Qm5FLEtBQUcsQ0FBQ29FLGdCQUFnQixHQUFHLEVBQUU7WUFDekJwRSxLQUFHLENBQUN1RSxrQkFBa0IsR0FBRyxFQUFFO1lBQzNCdkUsS0FBRyxDQUFDd0Usa0JBQWtCLEdBQUcsRUFBRTtZQUMzQmpCLGtCQUFrQixDQUFDckMsT0FBTyxHQUFHLENBQUM7VUFDaEM7UUFDRjtRQUNBd0MsSUFBSSxDQUFDLENBQUM7TUFDUixDQUFDLE1BQU1NLEtBQUssQ0FBQ3ZILEtBQUcsQ0FBQztJQUNuQjtJQUVBLE1BQU1nSSxXQUFXLEdBQUd6RixTQUFTLENBQUMwRixTQUFTLENBQUNSLEtBQUssQ0FBQztJQUM5QyxPQUFPLE1BQU07TUFDWE8sV0FBVyxDQUFDLENBQUM7TUFDYmYsSUFBSSxDQUFDLENBQUM7TUFDTkgsa0JBQWtCLENBQUNyQyxPQUFPLEdBQUcsQ0FBQztJQUNoQyxDQUFDO0VBQ0gsQ0FBQyxFQUFFLENBQUNqSCxRQUFRLEVBQUVELFNBQVMsRUFBRWdGLFNBQVMsQ0FBQyxDQUFDO0FBQ3RDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxTQUFTcUYsbUJBQW1CQSxDQUNqQ3JFLEdBQUcsRUFBRXhHLGNBQWMsR0FBRyxJQUFJLEVBQzFCNEcsR0FBRyxFQUFFLE1BQU0sRUFDWEUsTUFBTSxFQUFFLE1BQU0sRUFDZHFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUNwQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDWixJQUFJLENBQUMzRSxHQUFHLEVBQUU2RCxVQUFVLElBQUksQ0FBQzdELEdBQUcsQ0FBQ0UsTUFBTSxJQUFJLENBQUNGLEdBQUcsQ0FBQ0csS0FBSyxFQUFFLE9BQU8sQ0FBQztFQUMzRCxNQUFNSyxHQUFHLEdBQUdSLEdBQUcsQ0FBQ0csS0FBSyxDQUFDSyxHQUFHO0VBQ3pCLE1BQU04RCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRzlELEdBQUcsR0FBR0osR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHSSxHQUFHLEdBQUdGLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQztFQUM5RCxJQUFJcUUsbUJBQW1CLEtBQUssQ0FBQyxFQUFFO0lBQzdCO0lBQ0E7SUFDQTtJQUNBLE9BQU9MLElBQUksS0FBS0ssbUJBQW1CLEdBQUdMLElBQUksR0FBRyxDQUFDO0VBQ2hEO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsSUFBSXRFLEdBQUcsQ0FBQ0UsTUFBTSxDQUFDTSxHQUFHLEdBQUdKLEdBQUcsSUFBSUosR0FBRyxDQUFDRSxNQUFNLENBQUNNLEdBQUcsR0FBR0YsTUFBTSxFQUFFLE9BQU8sQ0FBQztFQUM3RCxPQUFPZ0UsSUFBSTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxTQUFTbEQsTUFBTUEsQ0FBQ3RCLENBQUMsRUFBRXpHLGVBQWUsRUFBRTBHLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxPQUFPLENBQUM7RUFDakUsTUFBTXRDLEdBQUcsR0FBR04sSUFBSSxDQUFDTSxHQUFHLENBQUMsQ0FBQyxFQUFFcUMsQ0FBQyxDQUFDVyxlQUFlLENBQUMsQ0FBQyxHQUFHWCxDQUFDLENBQUNTLGlCQUFpQixDQUFDLENBQUMsQ0FBQztFQUNwRSxNQUFNcUUsTUFBTSxHQUFHOUUsQ0FBQyxDQUFDYSxZQUFZLENBQUMsQ0FBQyxHQUFHYixDQUFDLENBQUNjLGVBQWUsQ0FBQyxDQUFDLEdBQUdiLEtBQUs7RUFDN0QsSUFBSTZFLE1BQU0sSUFBSW5ILEdBQUcsRUFBRTtJQUNqQjtJQUNBO0lBQ0E7SUFDQXFDLENBQUMsQ0FBQ2lDLFFBQVEsQ0FBQ3RFLEdBQUcsQ0FBQztJQUNmcUMsQ0FBQyxDQUFDbUMsY0FBYyxDQUFDLENBQUM7SUFDbEIsT0FBTyxJQUFJO0VBQ2I7RUFDQW5DLENBQUMsQ0FBQ2lDLFFBQVEsQ0FBQzVFLElBQUksQ0FBQ00sR0FBRyxDQUFDLENBQUMsRUFBRW1ILE1BQU0sQ0FBQyxDQUFDO0VBQy9CLE9BQU8sS0FBSztBQUNkOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVMvQyxVQUFVQSxDQUFDL0IsQ0FBQyxFQUFFekcsZUFBZSxFQUFFd0wsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLE9BQU8sQ0FBQztFQUMvRCxNQUFNcEgsR0FBRyxHQUFHTixJQUFJLENBQUNNLEdBQUcsQ0FBQyxDQUFDLEVBQUVxQyxDQUFDLENBQUNXLGVBQWUsQ0FBQyxDQUFDLEdBQUdYLENBQUMsQ0FBQ1MsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0VBQ3BFO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsTUFBTXVFLFlBQVksR0FBR2hGLENBQUMsQ0FBQ2EsWUFBWSxDQUFDLENBQUMsR0FBR2IsQ0FBQyxDQUFDYyxlQUFlLENBQUMsQ0FBQztFQUMzRCxJQUFJa0UsWUFBWSxHQUFHRCxNQUFNLElBQUlwSCxHQUFHLEVBQUU7SUFDaENxQyxDQUFDLENBQUNtQyxjQUFjLENBQUMsQ0FBQztJQUNsQixPQUFPLElBQUk7RUFDYjtFQUNBbkMsQ0FBQyxDQUFDaUUsUUFBUSxDQUFDYyxNQUFNLENBQUM7RUFDbEIsT0FBTyxLQUFLO0FBQ2Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxTQUFTckQsUUFBUUEsQ0FBQzFCLENBQUMsRUFBRXpHLGVBQWUsRUFBRXdMLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUM7RUFDakU7RUFDQTtFQUNBLE1BQU1DLFlBQVksR0FBR2hGLENBQUMsQ0FBQ2EsWUFBWSxDQUFDLENBQUMsR0FBR2IsQ0FBQyxDQUFDYyxlQUFlLENBQUMsQ0FBQztFQUMzRCxJQUFJa0UsWUFBWSxHQUFHRCxNQUFNLElBQUksQ0FBQyxFQUFFO0lBQzlCL0UsQ0FBQyxDQUFDaUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNiO0VBQ0Y7RUFDQWpDLENBQUMsQ0FBQ2lFLFFBQVEsQ0FBQyxDQUFDYyxNQUFNLENBQUM7QUFDckI7QUFFQSxPQUFPLEtBQUtFLGdCQUFnQixHQUN4QixRQUFRLEdBQ1IsVUFBVSxHQUNWLFlBQVksR0FDWixjQUFjLEdBQ2QsWUFBWSxHQUNaLGNBQWMsR0FDZCxLQUFLLEdBQ0wsUUFBUTs7QUFFWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLFNBQVNyQyxnQkFBZ0JBLENBQzlCSCxLQUFLLEVBQUUsTUFBTSxFQUNiakgsR0FBRyxFQUFFMEosSUFBSSxDQUNQckwsR0FBRyxFQUNILE1BQU0sR0FBRyxNQUFNLEdBQUcsT0FBTyxHQUFHLFNBQVMsR0FBRyxXQUFXLEdBQUcsTUFBTSxHQUFHLEtBQUssQ0FDckUsQ0FDRixFQUFFb0wsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0VBQ3pCLElBQUl6SixHQUFHLENBQUNhLElBQUksRUFBRSxPQUFPLElBQUk7RUFDekI7RUFDQTtFQUNBO0VBQ0E7RUFDQSxJQUFJLENBQUNiLEdBQUcsQ0FBQ3dILElBQUksSUFBSSxDQUFDeEgsR0FBRyxDQUFDWSxLQUFLLEVBQUU7SUFDM0IsSUFBSVosR0FBRyxDQUFDTSxPQUFPLEVBQUUsT0FBTyxRQUFRO0lBQ2hDLElBQUlOLEdBQUcsQ0FBQ08sU0FBUyxFQUFFLE9BQU8sVUFBVTtJQUNwQyxJQUFJUCxHQUFHLENBQUNRLElBQUksRUFBRSxPQUFPLEtBQUs7SUFDMUIsSUFBSVIsR0FBRyxDQUFDUyxHQUFHLEVBQUUsT0FBTyxRQUFRO0VBQzlCO0VBQ0EsSUFBSVQsR0FBRyxDQUFDd0gsSUFBSSxFQUFFO0lBQ1osSUFBSXhILEdBQUcsQ0FBQ1ksS0FBSyxFQUFFLE9BQU8sSUFBSTtJQUMxQixRQUFRcUcsS0FBSztNQUNYLEtBQUssR0FBRztRQUNOLE9BQU8sWUFBWTtNQUNyQixLQUFLLEdBQUc7UUFDTixPQUFPLGNBQWM7TUFDdkIsS0FBSyxHQUFHO1FBQ04sT0FBTyxZQUFZO01BQ3JCLEtBQUssR0FBRztRQUNOLE9BQU8sY0FBYztNQUN2QjtNQUNBO01BQ0E7TUFDQSxLQUFLLEdBQUc7UUFDTixPQUFPLFVBQVU7TUFDbkIsS0FBSyxHQUFHO1FBQ04sT0FBTyxRQUFRO01BQ2pCO1FBQ0UsT0FBTyxJQUFJO0lBQ2Y7RUFDRjtFQUNBO0VBQ0EsTUFBTTBDLENBQUMsR0FBRzFDLEtBQUssQ0FBQyxDQUFDLENBQUM7RUFDbEIsSUFBSSxDQUFDMEMsQ0FBQyxJQUFJMUMsS0FBSyxLQUFLMEMsQ0FBQyxDQUFDQyxNQUFNLENBQUMzQyxLQUFLLENBQUNqRCxNQUFNLENBQUMsRUFBRSxPQUFPLElBQUk7RUFDdkQ7RUFDQTtFQUNBLElBQUkyRixDQUFDLEtBQUssR0FBRyxJQUFLQSxDQUFDLEtBQUssR0FBRyxJQUFJM0osR0FBRyxDQUFDWSxLQUFNLEVBQUUsT0FBTyxRQUFRO0VBQzFELElBQUlaLEdBQUcsQ0FBQ1ksS0FBSyxFQUFFLE9BQU8sSUFBSTtFQUMxQixRQUFRK0ksQ0FBQztJQUNQLEtBQUssR0FBRztNQUNOLE9BQU8sS0FBSztJQUNkO0lBQ0E7SUFDQTtJQUNBLEtBQUssR0FBRztNQUNOLE9BQU8sVUFBVTtJQUNuQixLQUFLLEdBQUc7TUFDTixPQUFPLFFBQVE7SUFDakI7SUFDQTtJQUNBLEtBQUssR0FBRztNQUNOLE9BQU8sY0FBYztJQUN2QixLQUFLLEdBQUc7TUFDTixPQUFPLFlBQVk7SUFDckI7TUFDRSxPQUFPLElBQUk7RUFDZjtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxTQUFTeEMscUJBQXFCQSxDQUNuQzNDLENBQUMsRUFBRXpHLGVBQWUsRUFDbEI4TCxHQUFHLEVBQUVKLGdCQUFnQixHQUFHLElBQUksRUFDNUJLLFlBQVksRUFBRSxDQUFDckYsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FDdEMsRUFBRSxPQUFPLEdBQUcsSUFBSSxDQUFDO0VBQ2hCLFFBQVFvRixHQUFHO0lBQ1QsS0FBSyxJQUFJO01BQ1AsT0FBTyxJQUFJO0lBQ2IsS0FBSyxRQUFRO0lBQ2IsS0FBSyxVQUFVO01BQUU7UUFDZixNQUFNaEUsQ0FBQyxHQUFHZ0UsR0FBRyxLQUFLLFVBQVUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDQyxZQUFZLENBQUNqRSxDQUFDLENBQUM7UUFDZixPQUFPQyxNQUFNLENBQUN0QixDQUFDLEVBQUVxQixDQUFDLENBQUM7TUFDckI7SUFDQSxLQUFLLFlBQVk7SUFDakIsS0FBSyxjQUFjO01BQUU7UUFDbkIsTUFBTWtFLElBQUksR0FBR2xJLElBQUksQ0FBQ00sR0FBRyxDQUFDLENBQUMsRUFBRU4sSUFBSSxDQUFDQyxLQUFLLENBQUMwQyxDQUFDLENBQUNTLGlCQUFpQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMvRCxNQUFNWSxDQUFDLEdBQUdnRSxHQUFHLEtBQUssY0FBYyxHQUFHRSxJQUFJLEdBQUcsQ0FBQ0EsSUFBSTtRQUMvQ0QsWUFBWSxDQUFDakUsQ0FBQyxDQUFDO1FBQ2YsT0FBT0MsTUFBTSxDQUFDdEIsQ0FBQyxFQUFFcUIsQ0FBQyxDQUFDO01BQ3JCO0lBQ0EsS0FBSyxZQUFZO0lBQ2pCLEtBQUssY0FBYztNQUFFO1FBQ25CLE1BQU1tRSxJQUFJLEdBQUduSSxJQUFJLENBQUNNLEdBQUcsQ0FBQyxDQUFDLEVBQUVxQyxDQUFDLENBQUNTLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUMvQyxNQUFNWSxDQUFDLEdBQUdnRSxHQUFHLEtBQUssY0FBYyxHQUFHRyxJQUFJLEdBQUcsQ0FBQ0EsSUFBSTtRQUMvQ0YsWUFBWSxDQUFDakUsQ0FBQyxDQUFDO1FBQ2YsT0FBT0MsTUFBTSxDQUFDdEIsQ0FBQyxFQUFFcUIsQ0FBQyxDQUFDO01BQ3JCO0lBQ0EsS0FBSyxLQUFLO01BQ1JpRSxZQUFZLENBQUMsRUFBRXRGLENBQUMsQ0FBQ2EsWUFBWSxDQUFDLENBQUMsR0FBR2IsQ0FBQyxDQUFDYyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDdkRkLENBQUMsQ0FBQ2lDLFFBQVEsQ0FBQyxDQUFDLENBQUM7TUFDYixPQUFPLEtBQUs7SUFDZCxLQUFLLFFBQVE7TUFBRTtRQUNiLE1BQU10RSxHQUFHLEdBQUdOLElBQUksQ0FBQ00sR0FBRyxDQUFDLENBQUMsRUFBRXFDLENBQUMsQ0FBQ1csZUFBZSxDQUFDLENBQUMsR0FBR1gsQ0FBQyxDQUFDUyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7UUFDcEU2RSxZQUFZLENBQUMzSCxHQUFHLElBQUlxQyxDQUFDLENBQUNhLFlBQVksQ0FBQyxDQUFDLEdBQUdiLENBQUMsQ0FBQ2MsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVEO1FBQ0E7UUFDQWQsQ0FBQyxDQUFDaUMsUUFBUSxDQUFDdEUsR0FBRyxDQUFDO1FBQ2ZxQyxDQUFDLENBQUNtQyxjQUFjLENBQUMsQ0FBQztRQUNsQixPQUFPLElBQUk7TUFDYjtFQUNGO0FBQ0YiLCJpZ25vcmVMaXN0IjpbXX0=
|