Correspondents/.next/static/webpack/app/page.29c74e39184b54db.hot-update.js

22 lines
124 KiB
JavaScript

"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
self["webpackHotUpdate_N_E"]("app/page",{
/***/ "(app-pages-browser)/./src/components/chat-interface.tsx":
/*!*******************************************!*\
!*** ./src/components/chat-interface.tsx ***!
\*******************************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ChatInterface: () => (/* binding */ ChatInterface)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/.pnpm/next@15.5.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/.pnpm/next@15.5.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var framer_motion__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! framer-motion */ \"(app-pages-browser)/./node_modules/.pnpm/framer-motion@12.23.24_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/framer-motion/dist/es/render/components/motion/proxy.mjs\");\n/* harmony import */ var framer_motion__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! framer-motion */ \"(app-pages-browser)/./node_modules/.pnpm/framer-motion@12.23.24_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/framer-motion/dist/es/components/AnimatePresence/index.mjs\");\n/* harmony import */ var _components_ui_button__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/components/ui/button */ \"(app-pages-browser)/./src/components/ui/button.tsx\");\n/* harmony import */ var _barrel_optimize_names_ChevronDown_Copy_Loader2_Paperclip_Send_SquarePen_X_lucide_react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! __barrel_optimize__?names=ChevronDown,Copy,Loader2,Paperclip,Send,SquarePen,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/.pnpm/lucide-react@0.454.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/square-pen.js\");\n/* harmony import */ var _barrel_optimize_names_ChevronDown_Copy_Loader2_Paperclip_Send_SquarePen_X_lucide_react__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! __barrel_optimize__?names=ChevronDown,Copy,Loader2,Paperclip,Send,SquarePen,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/.pnpm/lucide-react@0.454.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/copy.js\");\n/* harmony import */ var _barrel_optimize_names_ChevronDown_Copy_Loader2_Paperclip_Send_SquarePen_X_lucide_react__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! __barrel_optimize__?names=ChevronDown,Copy,Loader2,Paperclip,Send,SquarePen,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/.pnpm/lucide-react@0.454.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/x.js\");\n/* harmony import */ var _barrel_optimize_names_ChevronDown_Copy_Loader2_Paperclip_Send_SquarePen_X_lucide_react__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! __barrel_optimize__?names=ChevronDown,Copy,Loader2,Paperclip,Send,SquarePen,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/.pnpm/lucide-react@0.454.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/chevron-down.js\");\n/* harmony import */ var _barrel_optimize_names_ChevronDown_Copy_Loader2_Paperclip_Send_SquarePen_X_lucide_react__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! __barrel_optimize__?names=ChevronDown,Copy,Loader2,Paperclip,Send,SquarePen,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/.pnpm/lucide-react@0.454.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/loader-circle.js\");\n/* harmony import */ var _barrel_optimize_names_ChevronDown_Copy_Loader2_Paperclip_Send_SquarePen_X_lucide_react__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! __barrel_optimize__?names=ChevronDown,Copy,Loader2,Paperclip,Send,SquarePen,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/.pnpm/lucide-react@0.454.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/send.js\");\n/* harmony import */ var _barrel_optimize_names_ChevronDown_Copy_Loader2_Paperclip_Send_SquarePen_X_lucide_react__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! __barrel_optimize__?names=ChevronDown,Copy,Loader2,Paperclip,Send,SquarePen,X!=!lucide-react */ \"(app-pages-browser)/./node_modules/.pnpm/lucide-react@0.454.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/paperclip.js\");\n/* harmony import */ var _components_ui_dropdown_menu__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/components/ui/dropdown-menu */ \"(app-pages-browser)/./src/components/ui/dropdown-menu.tsx\");\n/* harmony import */ var _markdown_renderer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./markdown-renderer */ \"(app-pages-browser)/./src/components/markdown-renderer.tsx\");\n/* harmony import */ var _lib_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/lib/utils */ \"(app-pages-browser)/./src/lib/utils.ts\");\n/* __next_internal_client_entry_do_not_use__ ChatInterface auto */ \nvar _s = $RefreshSig$();\n\n\n\n\n\n\n\nfunction ChatInterface(param) {\n let { agent, agents, onAgentSelected, isAgentsLoading } = param;\n _s();\n const heroGreeting = \"hello, user\";\n const [messages, setMessages] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [input, setInput] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"\");\n const [isLoading, setIsLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [sessionId, setSessionId] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"\");\n const [selectedImages, setSelectedImages] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [composerAgentId, setComposerAgentId] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const messagesContainerRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const inputRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const fileInputRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const [copiedMessageId, setCopiedMessageId] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)({\n \"ChatInterface.useEffect\": ()=>{\n // Use agent-specific session ID: chat-session-{agentId}\n const sessionKey = \"chat-session-\".concat(agent.id);\n let existingSessionId = localStorage.getItem(sessionKey);\n if (!existingSessionId) {\n // Generate new sessionID using timestamp and random string\n existingSessionId = \"session-\".concat(agent.id, \"-\").concat(Date.now(), \"-\").concat(Math.random().toString(36).substring(2, 15));\n localStorage.setItem(sessionKey, existingSessionId);\n }\n setSessionId(existingSessionId);\n // Load existing messages for this agent\n const messagesKey = \"chat-messages-\".concat(agent.id);\n const savedMessages = localStorage.getItem(messagesKey);\n if (savedMessages) {\n try {\n const parsed = JSON.parse(savedMessages);\n // Ensure timestamps are Date objects\n const messages = parsed.map({\n \"ChatInterface.useEffect.messages\": (msg)=>({\n ...msg,\n timestamp: new Date(msg.timestamp)\n })\n }[\"ChatInterface.useEffect.messages\"]);\n setMessages(messages);\n } catch (err) {\n console.error(\"[chat] Failed to load saved messages:\", err);\n }\n }\n }\n }[\"ChatInterface.useEffect\"], [\n agent.id\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)({\n \"ChatInterface.useEffect\": ()=>{\n if (messagesContainerRef.current) {\n messagesContainerRef.current.scrollTop = messagesContainerRef.current.scrollHeight;\n }\n }\n }[\"ChatInterface.useEffect\"], [\n messages,\n isLoading\n ]);\n // Save messages to localStorage whenever they change\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)({\n \"ChatInterface.useEffect\": ()=>{\n const messagesKey = \"chat-messages-\".concat(agent.id);\n localStorage.setItem(messagesKey, JSON.stringify(messages));\n }\n }[\"ChatInterface.useEffect\"], [\n messages,\n agent.id\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)({\n \"ChatInterface.useEffect\": ()=>{\n if (inputRef.current) {\n inputRef.current.style.height = \"auto\";\n inputRef.current.style.height = Math.min(inputRef.current.scrollHeight, 160) + \"px\";\n }\n }\n }[\"ChatInterface.useEffect\"], [\n input\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)({\n \"ChatInterface.useEffect\": ()=>{\n if (messages.length > 0 && composerAgentId !== agent.id) {\n setComposerAgentId(agent.id);\n }\n }\n }[\"ChatInterface.useEffect\"], [\n messages.length,\n agent.id\n ]);\n // Handle image file selection\n const handleImageSelect = async (e)=>{\n const files = e.currentTarget.files;\n if (!files) return;\n const newImages = [];\n for(let i = 0; i < files.length; i++){\n const file = files[i];\n // Only accept image files\n if (!file.type.startsWith(\"image/\")) {\n console.warn(\"[chat] Skipping non-image file:\", file.name);\n continue;\n }\n try {\n const base64 = await fileToBase64(file);\n newImages.push(base64);\n } catch (err) {\n console.error(\"[chat] Failed to convert image:\", err);\n }\n }\n setSelectedImages((prev)=>[\n ...prev,\n ...newImages\n ]);\n // Reset file input\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n };\n // Convert file to base64 string\n const fileToBase64 = (file)=>{\n return new Promise((resolve, reject)=>{\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = ()=>resolve(reader.result);\n reader.onerror = reject;\n });\n };\n // Remove selected image\n const removeImage = (index)=>{\n setSelectedImages((prev)=>prev.filter((_, i)=>i !== index));\n };\n const sendMessage = async (e)=>{\n if (e) {\n e.preventDefault();\n }\n if (!input.trim() || isLoading) return;\n const userMessage = {\n id: Date.now().toString(),\n role: \"user\",\n content: input.trim(),\n timestamp: new Date(),\n images: selectedImages.length > 0 ? selectedImages : undefined\n };\n setMessages((prev)=>[\n ...prev,\n userMessage\n ]);\n setInput(\"\");\n setSelectedImages([]);\n setIsLoading(true);\n try {\n const response = await fetch(\"/api/chat\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n message: userMessage.content,\n timestamp: userMessage.timestamp.toISOString(),\n sessionId: sessionId,\n agentId: agent.id,\n images: selectedImages.length > 0 ? selectedImages : undefined\n })\n });\n const data = await response.json();\n if (!response.ok) {\n const errorMessage = {\n id: (Date.now() + 1).toString(),\n role: \"assistant\",\n content: data.error || \"Failed to communicate with the webhook.\",\n timestamp: new Date(),\n isError: true,\n hint: data.hint\n };\n setMessages((prev)=>[\n ...prev,\n errorMessage\n ]);\n } else {\n const assistantMessage = {\n id: (Date.now() + 1).toString(),\n role: \"assistant\",\n content: data.response || data.message || JSON.stringify(data),\n timestamp: new Date()\n };\n setMessages((prev)=>[\n ...prev,\n assistantMessage\n ]);\n }\n } catch (error) {\n console.error(\"[v0] Error sending message:\", error);\n const errorMessage = {\n id: (Date.now() + 1).toString(),\n role: \"assistant\",\n content: \"Sorry, I encountered an error processing your message. Please try again.\",\n timestamp: new Date(),\n isError: true\n };\n setMessages((prev)=>[\n ...prev,\n errorMessage\n ]);\n } finally{\n var _inputRef_current;\n setIsLoading(false);\n (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.focus();\n }\n };\n const startNewChat = ()=>{\n var // Focus input\n _inputRef_current;\n // Clear all messages\n setMessages([]);\n // Generate new sessionID for this agent\n const newSessionId = \"session-\".concat(agent.id, \"-\").concat(Date.now(), \"-\").concat(Math.random().toString(36).substring(2, 15));\n setSessionId(newSessionId);\n const sessionKey = \"chat-session-\".concat(agent.id);\n localStorage.setItem(sessionKey, newSessionId);\n // Clear input and images\n setInput(\"\");\n setSelectedImages([]);\n setComposerAgentId(null);\n (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : _inputRef_current.focus();\n };\n const handleKeyDown = (e)=>{\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n sendMessage();\n }\n };\n const handleCopyMessage = async (id, content)=>{\n try {\n await navigator.clipboard.writeText(content);\n setCopiedMessageId(id);\n setTimeout(()=>{\n setCopiedMessageId((current)=>current === id ? null : current);\n }, 1200);\n } catch (error) {\n console.error(\"[chat] Failed to copy message\", error);\n }\n };\n const handleComposerAgentSelect = (entry)=>{\n setComposerAgentId(entry.id);\n onAgentSelected(entry);\n };\n const canSwitchAgents = agents.length > 0 && !isAgentsLoading;\n const hasMessages = messages.length > 0;\n const dropdownSelectedId = composerAgentId !== null && composerAgentId !== void 0 ? composerAgentId : hasMessages ? agent.id : null;\n const dropdownLabel = dropdownSelectedId ? agent.name : \"Select a correspondent\";\n const highlightAgentDropdown = !dropdownSelectedId && !hasMessages;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(framer_motion__WEBPACK_IMPORTED_MODULE_6__.motion.div, {\n initial: {\n opacity: 0,\n y: 35\n },\n animate: {\n opacity: 1,\n y: 0\n },\n transition: {\n duration: 0.85,\n ease: \"easeOut\"\n },\n className: \"relative flex h-full w-full flex-col overflow-hidden rounded-[2.5rem] bg-gradient-to-b from-white/0 via-white/15 to-white/45 px-4 py-8 shadow-[0_15px_35px_rgba(45,45,45,0.1),0_0_0_1px_rgba(255,255,255,0.25)_inset,0_15px_25px_rgba(255,255,255,0.12)_inset] backdrop-blur-xl dark:bg-gradient-to-b dark:from-transparent dark:via-white/5 dark:to-white/20 dark:shadow-[0_12px_25px_rgba(0,0,0,0.35),0_0_0_1px_rgba(255,255,255,0.06)_inset,0_12px_20px_rgba(255,255,255,0.04)_inset] sm:px-8 sm:py-10\",\n children: [\n messages.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"absolute left-8 top-8 z-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_button__WEBPACK_IMPORTED_MODULE_2__.Button, {\n onClick: startNewChat,\n variant: \"ghost\",\n size: \"icon\",\n className: \"group h-11 w-11 rounded-2xl border border-white/25 bg-white/15 text-white shadow-[0_2px_6px_rgba(0,0,0,0.12)] backdrop-blur transition hover:bg-white/25\",\n title: \"Start a fresh conversation\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_ChevronDown_Copy_Loader2_Paperclip_Send_SquarePen_X_lucide_react__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n className: \"h-4 w-4\"\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 285,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 278,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 277,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n ref: messagesContainerRef,\n className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_5__.cn)(\"px-1 pt-4 sm:px-0\", hasMessages ? \"flex-1 overflow-y-auto pb-10\" : \"pb-6\"),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-[52rem] space-y-10 px-2 sm:px-4\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(framer_motion__WEBPACK_IMPORTED_MODULE_8__.AnimatePresence, {\n mode: \"wait\",\n children: hasMessages ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(framer_motion__WEBPACK_IMPORTED_MODULE_6__.motion.div, {\n initial: {\n opacity: 0,\n y: 30\n },\n animate: {\n opacity: 1,\n y: 0\n },\n exit: {\n opacity: 0,\n y: -20\n },\n transition: {\n duration: 0.6,\n ease: \"easeOut\"\n },\n className: \"space-y-10\",\n children: [\n messages.map((message)=>{\n const isUser = message.role === \"user\";\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(framer_motion__WEBPACK_IMPORTED_MODULE_6__.motion.div, {\n layout: true,\n initial: {\n opacity: 0,\n y: 15\n },\n animate: {\n opacity: 1,\n y: 0\n },\n transition: {\n duration: 0.35,\n ease: \"easeOut\"\n },\n className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_5__.cn)(\"message-frame flex flex-col gap-3\", isUser ? \"items-end text-right\" : \"\"),\n children: [\n isUser ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"message-bubble user\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_markdown_renderer__WEBPACK_IMPORTED_MODULE_4__.MarkdownRenderer, {\n content: message.content,\n tone: \"bubble\"\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 321,\n columnNumber: 27\n }, this)\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 320,\n columnNumber: 25\n }, this) : message.isError ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-medium text-destructive\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"whitespace-pre-wrap break-words leading-relaxed\",\n children: message.content\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 325,\n columnNumber: 27\n }, this)\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 324,\n columnNumber: 25\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"relative text-sm text-charcoal dark:text-foreground\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_markdown_renderer__WEBPACK_IMPORTED_MODULE_4__.MarkdownRenderer, {\n content: message.content\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 329,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-4 flex items-center justify-end gap-3 border-t border-white/10 pt-3 opacity-50 transition hover:opacity-100\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleCopyMessage(message.id, message.content),\n className: \"inline-flex h-7 w-7 items-center justify-center rounded border border-white/20 bg-white/8 text-white/70 shadow-[0_2px_5px_rgba(0,0,0,0.07)] backdrop-blur transition-transform duration-150 hover:bg-white/18 \".concat(copiedMessageId === message.id ? \"scale-90 bg-white/20 text-white\" : \"\"),\n \"aria-label\": \"Copy response\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_ChevronDown_Copy_Loader2_Paperclip_Send_SquarePen_X_lucide_react__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n className: \"h-2.5 w-2.5\"\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 339,\n columnNumber: 31\n }, this)\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 331,\n columnNumber: 29\n }, this)\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 330,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 328,\n columnNumber: 25\n }, this),\n message.hint && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"rounded-lg border border-accent/60 bg-accent/40 px-3 py-2 text-xs text-charcoal\",\n children: message.hint\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 346,\n columnNumber: 25\n }, this)\n ]\n }, message.id, true, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 311,\n columnNumber: 21\n }, this);\n }),\n isLoading && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"message-frame flex flex-col gap-3\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-3 text-sm text-muted-foreground\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"uppercase tracking-[0.25em] text-white/70\",\n children: \"Correspondent\"\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 357,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"relative flex h-3 w-24 overflow-hidden rounded-full bg-white/10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"absolute inset-y-0 w-1/2 animate-[shimmer_1.4s_infinite] bg-white/40\"\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 359,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 358,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 356,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 355,\n columnNumber: 19\n }, this)\n ]\n }, \"conversation\", true, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 300,\n columnNumber: 15\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(framer_motion__WEBPACK_IMPORTED_MODULE_6__.motion.div, {\n initial: {\n opacity: 0,\n y: 60\n },\n animate: {\n opacity: 1,\n y: 0\n },\n exit: {\n opacity: 0,\n y: -20\n },\n transition: {\n duration: 0.65,\n ease: \"easeOut\"\n },\n className: \"flex min-h-[40vh] flex-col items-center justify-center gap-6 text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"font-heading text-[7rem] lowercase tracking-tight text-white/85 drop-shadow-[0_12px_30px_rgba(0,0,0,0.4)]\",\n children: heroGreeting.split(\"\").map((char, index)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(framer_motion__WEBPACK_IMPORTED_MODULE_6__.motion.span, {\n initial: {\n opacity: 0,\n y: 18\n },\n animate: {\n opacity: 1,\n y: 0\n },\n transition: {\n delay: 0.15 + index * 0.05,\n duration: 0.35,\n ease: \"easeOut\"\n },\n className: \"inline-block\",\n children: char === \" \" ? \"\\u00A0\" : char\n }, \"\".concat(char, \"-\").concat(index), false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 377,\n columnNumber: 23\n }, this))\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 375,\n columnNumber: 19\n }, this)\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 374,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"w-full max-w-3xl space-y-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-[0.6rem] uppercase tracking-[0.4em] text-white/55\",\n children: \"Select a correspondent to begin\"\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 391,\n columnNumber: 19\n }, this),\n agents.length > 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap items-center justify-center gap-3\",\n children: agents.map((entry)=>{\n const isActive = dropdownSelectedId === entry.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: ()=>handleComposerAgentSelect(entry),\n className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_5__.cn)(\"rounded-full border px-4 py-2 text-[0.65rem] uppercase tracking-[0.35em] transition\", isActive ? \"border-white/25 bg-white/25 text-white shadow-[0_5px_20px_rgba(0,0,0,0.35)]\" : \"border-white/10 bg-white/5 text-white/70 hover:border-white/30 hover:text-white\"),\n children: entry.name\n }, entry.id, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 399,\n columnNumber: 27\n }, this);\n })\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 395,\n columnNumber: 21\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-white/60\",\n children: \"No agents available yet.\"\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 415,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 390,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid w-full max-w-2xl gap-4 sm:grid-cols-2\",\n children: [\n \"Help me brainstorm ideas for a new mobile app\",\n \"Generate creative writing prompts for a fantasy novel\",\n \"Suggest innovative marketing strategies for a startup\",\n \"Create a list of unique product names for a tech company\"\n ].map((prompt, index)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: ()=>setInput(prompt),\n className: \"scroll-reveal rounded-2xl border border-border/30 bg-white/80 p-4 text-left text-sm text-charcoal shadow-sm transition hover:border-ring/60 hover:bg-white\",\n style: {\n animationDelay: \"\".concat(index * 50, \"ms\")\n },\n children: prompt\n }, prompt, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 426,\n columnNumber: 21\n }, this))\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 419,\n columnNumber: 17\n }, this)\n ]\n }, \"empty-state\", true, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 366,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 298,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 297,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 290,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(framer_motion__WEBPACK_IMPORTED_MODULE_6__.motion.div, {\n layout: true,\n className: \"relative mt-auto pt-6 pb-4 transition-all duration-500\",\n animate: {\n y: hasMessages ? 0 : -140,\n scale: hasMessages ? 1 : 1.05\n },\n transition: {\n type: \"spring\",\n stiffness: 160,\n damping: 24\n },\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"form\", {\n onSubmit: sendMessage,\n className: \"relative flex justify-center\",\n children: [\n selectedImages.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3 flex flex-wrap gap-3 px-3 pt-2\",\n children: selectedImages.map((image, index)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"relative\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"img\", {\n src: image,\n alt: \"Selected \".concat(index),\n className: \"h-16 w-16 rounded-lg border border-border/40 object-cover shadow-md\"\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 454,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>removeImage(index),\n className: \"absolute -right-2 -top-2 flex h-5 w-5 items-center justify-center rounded-full text-white shadow-md hover:opacity-80\",\n style: {\n backgroundColor: \"var(--charcoal-ink)\"\n },\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_ChevronDown_Copy_Loader2_Paperclip_Send_SquarePen_X_lucide_react__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n className: \"h-3 w-3\"\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 465,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 459,\n columnNumber: 19\n }, this)\n ]\n }, index, true, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 453,\n columnNumber: 17\n }, this))\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 451,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"manuscript-panel w-[85%] max-w-2xl p-5\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"textarea\", {\n ref: inputRef,\n value: input,\n onChange: (e)=>setInput(e.target.value),\n onKeyDown: handleKeyDown,\n placeholder: \"Write a note, share a hunch, or paste a brief…\",\n disabled: isLoading,\n rows: 1,\n className: \"min-h-[32px] max-h-32 w-full resize-none border-0 bg-transparent text-lg text-foreground placeholder:text-muted-foreground/80 focus:outline-none\",\n style: {\n overflow: \"hidden\",\n height: \"auto\"\n },\n onInput: (e)=>{\n const target = e.target;\n target.style.height = \"auto\";\n target.style.height = Math.min(target.scrollHeight, 160) + \"px\";\n }\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 474,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap items-center justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_dropdown_menu__WEBPACK_IMPORTED_MODULE_3__.DropdownMenu, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_dropdown_menu__WEBPACK_IMPORTED_MODULE_3__.DropdownMenuTrigger, {\n asChild: true,\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_5__.cn)(\"inline-flex max-w-[12rem] items-center gap-2 rounded-xl border px-3 py-2 text-left text-[0.55rem] uppercase tracking-[0.3em] backdrop-blur transition hover:border-white/30 hover:text-white disabled:opacity-50\", highlightAgentDropdown ? \"agent-picker-prompt text-white\" : \"border-white/15 bg-white/10 text-white/70\"),\n disabled: !canSwitchAgents,\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"truncate text-xs font-heading normal-case tracking-normal text-white\",\n children: dropdownLabel\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 505,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_ChevronDown_Copy_Loader2_Paperclip_Send_SquarePen_X_lucide_react__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n className: \"h-3.5 w-3.5 text-white/70\"\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 508,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 497,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 496,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_dropdown_menu__WEBPACK_IMPORTED_MODULE_3__.DropdownMenuContent, {\n align: \"start\",\n className: \"min-w-[12rem] rounded-2xl border border-white/15 bg-black/80 p-2 text-white shadow-[0_20px_40px_rgba(0,0,0,0.5)] backdrop-blur\",\n children: isAgentsLoading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_dropdown_menu__WEBPACK_IMPORTED_MODULE_3__.DropdownMenuItem, {\n disabled: true,\n className: \"text-white/50\",\n children: \"Gathering correspondents…\"\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 516,\n columnNumber: 23\n }, this) : agents.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_dropdown_menu__WEBPACK_IMPORTED_MODULE_3__.DropdownMenuItem, {\n disabled: true,\n className: \"text-white/50\",\n children: \"No agents configured\"\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 520,\n columnNumber: 23\n }, this) : agents.map((entry)=>{\n const isActive = dropdownSelectedId === entry.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_dropdown_menu__WEBPACK_IMPORTED_MODULE_3__.DropdownMenuItem, {\n onClick: ()=>handleComposerAgentSelect(entry),\n className: \"flex w-full items-center justify-between rounded-xl px-3 py-2 text-xs transition \".concat(isActive ? \"bg-white/15 text-white\" : \"text-white/70 hover:bg-white/5 hover:text-white\"),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-heading text-sm\",\n children: entry.name\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 536,\n columnNumber: 29\n }, this),\n isActive && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-[0.55rem] uppercase tracking-[0.3em]\",\n children: \"Active\"\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 537,\n columnNumber: 42\n }, this)\n ]\n }, entry.id, true, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 527,\n columnNumber: 27\n }, this);\n })\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 511,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 495,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap items-center justify-end gap-3 text-xs uppercase tracking-[0.25em] text-muted-foreground\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_button__WEBPACK_IMPORTED_MODULE_2__.Button, {\n type: \"submit\",\n disabled: !input.trim() || isLoading,\n size: \"icon\",\n className: \"group h-12 w-12 flex-shrink-0 rounded-2xl border border-white/20 bg-white/30 text-white shadow-[0_10px_25px_rgba(0,0,0,0.2)] backdrop-blur transition hover:bg-white/40 disabled:opacity-50\",\n children: isLoading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_ChevronDown_Copy_Loader2_Paperclip_Send_SquarePen_X_lucide_react__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n className: \"h-4 w-4 animate-spin\"\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 553,\n columnNumber: 21\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_ChevronDown_Copy_Loader2_Paperclip_Send_SquarePen_X_lucide_react__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n className: \"h-4 w-4\"\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 555,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 546,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n ref: fileInputRef,\n type: \"file\",\n multiple: true,\n accept: \"image/*\",\n onChange: handleImageSelect,\n className: \"hidden\",\n disabled: isLoading\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 558,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_button__WEBPACK_IMPORTED_MODULE_2__.Button, {\n type: \"button\",\n variant: \"ghost\",\n size: \"icon\",\n onClick: ()=>{\n var _fileInputRef_current;\n return (_fileInputRef_current = fileInputRef.current) === null || _fileInputRef_current === void 0 ? void 0 : _fileInputRef_current.click();\n },\n disabled: isLoading,\n className: \"h-11 w-11 rounded-2xl border border-white/20 bg-white/10 text-white/80 transition hover:bg-white/20 hover:text-white\",\n title: \"Attach image\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_ChevronDown_Copy_Loader2_Paperclip_Send_SquarePen_X_lucide_react__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n className: \"h-4 w-4\"\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 576,\n columnNumber: 19\n }, this)\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 567,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 545,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 494,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 473,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 472,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 448,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 442,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/nicholai/Documents/dev/multi-agent_chat_interface/src/components/chat-interface.tsx\",\n lineNumber: 270,\n columnNumber: 5\n }, this);\n}\n_s(ChatInterface, \"1WhQg5QyNl9G/pOy2UBbWCcCM0Y=\");\n_c = ChatInterface;\nvar _c;\n$RefreshReg$(_c, \"ChatInterface\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9jb21wb25lbnRzL2NoYXQtaW50ZXJmYWNlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSW1EO0FBQ0k7QUFDUjtBQUN5QztBQU1sRDtBQUNnQjtBQUV0QjtBQVN6QixTQUFTbUIsY0FBYyxLQUtUO1FBTFMsRUFDNUJDLEtBQUssRUFDTEMsTUFBTSxFQUNOQyxlQUFlLEVBQ2ZDLGVBQWUsRUFDSSxHQUxTOztJQU01QixNQUFNQyxlQUFlO0lBQ3JCLE1BQU0sQ0FBQ0MsVUFBVUMsWUFBWSxHQUFHMUIsK0NBQVFBLENBQVksRUFBRTtJQUN0RCxNQUFNLENBQUMyQixPQUFPQyxTQUFTLEdBQUc1QiwrQ0FBUUEsQ0FBQztJQUNuQyxNQUFNLENBQUM2QixXQUFXQyxhQUFhLEdBQUc5QiwrQ0FBUUEsQ0FBQztJQUMzQyxNQUFNLENBQUMrQixXQUFXQyxhQUFhLEdBQUdoQywrQ0FBUUEsQ0FBUztJQUNuRCxNQUFNLENBQUNpQyxnQkFBZ0JDLGtCQUFrQixHQUFHbEMsK0NBQVFBLENBQVcsRUFBRTtJQUNqRSxNQUFNLENBQUNtQyxpQkFBaUJDLG1CQUFtQixHQUFHcEMsK0NBQVFBLENBQWdCO0lBQ3RFLE1BQU1xQyx1QkFBdUJwQyw2Q0FBTUEsQ0FBaUI7SUFDcEQsTUFBTXFDLFdBQVdyQyw2Q0FBTUEsQ0FBc0I7SUFDN0MsTUFBTXNDLGVBQWV0Qyw2Q0FBTUEsQ0FBbUI7SUFDOUMsTUFBTSxDQUFDdUMsaUJBQWlCQyxtQkFBbUIsR0FBR3pDLCtDQUFRQSxDQUFnQjtJQUV0RUUsZ0RBQVNBO21DQUFDO1lBQ1Isd0RBQXdEO1lBQ3hELE1BQU13QyxhQUFhLGdCQUF5QixPQUFUdEIsTUFBTXVCLEVBQUU7WUFDM0MsSUFBSUMsb0JBQW9CQyxhQUFhQyxPQUFPLENBQUNKO1lBRTdDLElBQUksQ0FBQ0UsbUJBQW1CO2dCQUN0QiwyREFBMkQ7Z0JBQzNEQSxvQkFBb0IsV0FBdUJHLE9BQVozQixNQUFNdUIs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a0gsUUFBUTt3REFDUkMsUUFBTzt3REFDUFgsVUFBVS9HO3dEQUNWOEUsV0FBVTt3REFDVnFDLFVBQVUvSjs7Ozs7O2tFQUVaLDhEQUFDeEIseURBQU1BO3dEQUNMMkUsTUFBSzt3REFDTHlFLFNBQVE7d0RBQ1JDLE1BQUs7d0RBQ0xGLFNBQVM7Z0VBQU1qSDtvRUFBQUEsd0JBQUFBLGFBQWEwQixPQUFPLGNBQXBCMUIsNENBQUFBLHNCQUFzQjZKLEtBQUs7O3dEQUMxQ1IsVUFBVS9KO3dEQUNWMEgsV0FBVTt3REFDVkksT0FBTTtrRUFFTiw0RUFBQ2xKLGdJQUFTQTs0REFBQzhJLFdBQVU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVV2QztHQWhqQmdCcEk7S0FBQUEiLCJzb3VyY2VzIjpbIi9ob21lL25pY2hvbGFpL0RvY3VtZW50cy9kZXYvbXVsdGktYWdlbnRfY2hhdF9pbnRlcmZhY2Uvc3JjL2NvbXBvbmVudHMvY2hhdC1pbnRlcmZhY2UudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiXG5cbmltcG9ydCB0eXBlIFJlYWN0IGZyb20gXCJyZWFjdFwiXG5cbmltcG9ydCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgeyBtb3Rpb24sIEFuaW1hdGVQcmVzZW5jZSB9IGZyb20gXCJmcmFtZXItbW90aW9uXCJcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvdWkvYnV0dG9uXCJcbmltcG9ydCB7IFNlbmQsIExvYWRlcjIsIFNxdWFyZVBlbiwgUGFwZXJjbGlwLCBDb3B5LCBYLCBDaGV2cm9uRG93biB9IGZyb20gXCJsdWNpZGUtcmVhY3RcIlxuaW1wb3J0IHtcbiAgRHJvcGRvd25NZW51LFxuICBEcm9wZG93bk1lbnVDb250ZW50LFxuICBEcm9wZG93bk1lbnVJdGVtLFxuICBEcm9wZG93bk1lbnVUcmlnZ2VyLFxufSBmcm9tIFwiQC9jb21wb25lbnRzL3VpL2Ryb3Bkb3duLW1lbnVcIlxuaW1wb3J0IHsgTWFya2Rvd25SZW5kZXJlciB9IGZyb20gXCIuL21hcmtkb3duLXJlbmRlcmVyXCJcbmltcG9ydCB0eXBlIHsgTWVzc2FnZSwgQWdlbnQgfSBmcm9tIFwiQC9saWIvdHlwZXNcIlxuaW1wb3J0IHsgY24gfSBmcm9tIFwiQC9saWIvdXRpbHNcIlxuXG5pbnRlcmZhY2UgQ2hhdEludGVyZmFjZVByb3BzIHtcbiAgYWdlbnQ6IEFnZW50XG4gIGFnZW50czogQWdlbnRbXVxuICBvbkFnZW50U2VsZWN0ZWQ6IChhZ2VudDogQWdlbnQpID0+IHZvaWRcbiAgaXNBZ2VudHNMb2FkaW5nOiBib29sZWFuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDaGF0SW50ZXJmYWNlKHtcbiAgYWdlbnQsXG4gIGFnZW50cyxcbiAgb25BZ2VudFNlbGVjdGVkLFxuICBpc0FnZW50c0xvYWRpbmcsXG59OiBDaGF0SW50ZXJmYWNlUHJvcHMpIHtcbiAgY29uc3QgaGVyb0dyZWV0aW5nID0gXCJoZWxsbywgdXNlclwiXG4gIGNvbnN0IFttZXNzYWdlcywgc2V0TWVzc2FnZXNdID0gdXNlU3RhdGU8TWVzc2FnZVtdPihbXSlcbiAgY29uc3QgW2lucHV0LCBzZXRJbnB1dF0gPSB1c2VTdGF0ZShcIlwiKVxuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtzZXNzaW9uSWQsIHNldFNlc3Npb25JZF0gPSB1c2VTdGF0ZTxzdHJpbmc+KFwiXCIpXG4gIGNvbnN0IFtzZWxlY3RlZEltYWdlcywgc2V0U2VsZWN0ZWRJbWFnZXNdID0gdXNlU3RhdGU8c3RyaW5nW10+KFtdKVxuICBjb25zdCBbY29tcG9zZXJBZ2VudElkLCBzZXRDb21wb3NlckFnZW50SWRdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgY29uc3QgbWVzc2FnZXNDb250YWluZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpXG4gIGNvbnN0IGlucHV0UmVmID0gdXNlUmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQ+KG51bGwpXG4gIGNvbnN0IGZpbGVJbnB1dFJlZiA9IHVzZVJlZjxIVE1MSW5wdXRFbGVtZW50PihudWxsKVxuICBjb25zdCBbY29waWVkTWVzc2FnZUlkLCBzZXRDb3BpZWRNZXNzYWdlSWRdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbClcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIFVzZSBhZ2VudC1zcGVjaWZpYyBzZXNzaW9uIElEOiBjaGF0LXNlc3Npb24te2FnZW50SWR9XG4gICAgY29uc3Qgc2Vzc2lvbktleSA9IGBjaGF0LXNlc3Npb24tJHthZ2VudC5pZH1gXG4gICAgbGV0IGV4aXN0aW5nU2Vzc2lvbklkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oc2Vzc2lvbktleSlcblxuICAgIGlmICghZXhpc3RpbmdTZXNzaW9uSWQpIHtcbiAgICAgIC8vIEdlbmVyYXRlIG5ldyBzZXNzaW9uSUQgdXNpbmcgdGltZXN0YW1wIGFuZCByYW5kb20gc3RyaW5nXG4gICAgICBleGlzdGluZ1Nlc3Npb25JZCA9IGBzZXNzaW9uLSR7YWdlbnQuaWR9LSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgMTUpfWBcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHNlc3Npb25LZXksIGV4aXN0aW5nU2Vzc2lvbklkKVxuICAgIH1cblxuICAgIHNldFNlc3Npb25JZChleGlzdGluZ1Nlc3Npb25JZClcblxuICAgIC8vIExvYWQgZXhpc3RpbmcgbWVzc2FnZXMgZm9yIHRoaXMgYWdlbnRcbiAgICBjb25zdCBtZXNzYWdlc0tleSA9IGBjaGF0LW1lc3NhZ2VzLSR7YWdlbnQuaWR9YFxuICAgIGNvbnN0IHNhdmVkTWVzc2FnZXMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShtZXNzYWdlc0tleSlcbiAgICBpZiAoc2F2ZWRNZXNzYWdlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShzYXZlZE1lc3NhZ2VzKVxuICAgICAgICAvLyBFbnN1cmUgdGltZXN0YW1wcyBhcmUgRGF0ZSBvYmplY3RzXG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gcGFyc2VkLm1hcCgobXNnOiBhbnkpID0+ICh7XG4gICAgICAgICAgLi4ubXNnLFxuICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUobXNnLnRpbWVzdGFtcCksXG4gICAgICAgIH0pKVxuICAgICAgICBzZXRNZXNzYWdlcyhtZXNzYWdlcylcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiW2NoYXRdIEZhaWxlZCB0byBsb2FkIHNhdmVkIG1lc3NhZ2VzOlwiLCBlcnIpXG4gICAgICB9XG4gICAgfVxuICB9LCBbYWdlbnQuaWRdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKG1lc3NhZ2VzQ29udGFpbmVyUmVmLmN1cnJlbnQpIHtcbiAgICAgIG1lc3NhZ2VzQ29udGFpbmVyUmVmLmN1cnJlbnQuc2Nyb2xsVG9wID0gbWVzc2FnZXNDb250YWluZXJSZWYuY3VycmVudC5zY3JvbGxIZWlnaHRcbiAgICB9XG4gIH0sIFttZXNzYWdlcywgaXNMb2FkaW5nXSlcblxuICAvLyBTYXZlIG1lc3NhZ2VzIHRvIGxvY2FsU3RvcmFnZSB3aGVuZXZlciB0aGV5IGNoYW5nZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG1lc3NhZ2VzS2V5ID0gYGNoYXQtbWVzc2FnZXMtJHthZ2VudC5pZH1gXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obWVzc2FnZXNLZXksIEpTT04uc3RyaW5naWZ5KG1lc3NhZ2VzKSlcbiAgfSwgW21lc3NhZ2VzLCBhZ2VudC5pZF0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaW5wdXRSZWYuY3VycmVudCkge1xuICAgICAgaW5wdXRSZWYuY3VycmVudC5zdHlsZS5oZWlnaHQgPSBcImF1dG9cIlxuICAgICAgaW5wdXRSZWYuY3VycmVudC5zdHlsZS5oZWlnaHQgPSBNYXRoLm1pbihpbnB1dFJlZi5jdXJyZW50LnNjcm9sbEhlaWdodCwgMTYwKSArIFwicHhcIlxuICAgIH1cbiAgfSwgW2lucHV0XSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChtZXNzYWdlcy5sZW5ndGggPiAwICYmIGNvbXBvc2VyQWdlbnRJZCAhPT0gYWdlbnQuaWQpIHtcbiAgICAgIHNldENvbXBvc2VyQWdlbnRJZChhZ2VudC5pZClcbiAgICB9XG4gIH0sIFttZXNzYWdlcy5sZW5ndGgsIGFnZW50LmlkXSlcblxuICAvLyBIYW5kbGUgaW1hZ2UgZmlsZSBzZWxlY3Rpb25cbiAgY29uc3QgaGFuZGxlSW1hZ2VTZWxlY3QgPSBhc3luYyAoZTogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICBjb25zdCBmaWxlcyA9IGUuY3VycmVudFRhcmdldC5maWxlc1xuICAgIGlmICghZmlsZXMpIHJldHVyblxuXG4gICAgY29uc3QgbmV3SW1hZ2VzOiBzdHJpbmdbXSA9IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZmlsZSA9IGZpbGVzW2ldXG4gICAgICAvLyBPbmx5IGFjY2VwdCBpbWFnZSBmaWxlc1xuICAgICAgaWYgKCFmaWxlLnR5cGUuc3RhcnRzV2l0aChcImltYWdlL1wiKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbY2hhdF0gU2tpcHBpbmcgbm9uLWltYWdlIGZpbGU6XCIsIGZpbGUubmFtZSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYmFzZTY0ID0gYXdhaXQgZmlsZVRvQmFzZTY0KGZpbGUpXG4gICAgICAgIG5ld0ltYWdlcy5wdXNoKGJhc2U2NClcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiW2NoYXRdIEZhaWxlZCB0byBjb252ZXJ0IGltYWdlOlwiLCBlcnIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0U2VsZWN0ZWRJbWFnZXMoKHByZXYpID0+IFsuLi5wcmV2LCAuLi5uZXdJbWFnZXNdKVxuICAgIC8vIFJlc2V0IGZpbGUgaW5wdXRcbiAgICBpZiAoZmlsZUlucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgIGZpbGVJbnB1dFJlZi5jdXJyZW50LnZhbHVlID0gXCJcIlxuICAgIH1cbiAgfVxuXG4gIC8vIENvbnZlcnQgZmlsZSB0byBiYXNlNjQgc3RyaW5nXG4gIGNvbnN0IGZpbGVUb0Jhc2U2NCA9IChmaWxlOiBGaWxlKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSlcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKVxuICAgICAgcmVhZGVyLm9uZXJyb3IgPSByZWplY3RcbiAgICB9KVxuICB9XG5cbiAgLy8gUmVtb3ZlIHNlbGVjdGVkIGltYWdlXG4gIGNvbnN0IHJlbW92ZUltYWdlID0gKGluZGV4OiBudW1iZXIpID0+IHtcbiAgICBzZXRTZWxlY3RlZEltYWdlcygocHJldikgPT4gcHJldi5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KSlcbiAgfVxuXG4gIGNvbnN0IHNlbmRNZXNzYWdlID0gYXN5bmMgKGU/OiBSZWFjdC5Gb3JtRXZlbnQpID0+IHtcbiAgICBpZiAoZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgfVxuXG4gICAgaWYgKCFpbnB1dC50cmltKCkgfHwgaXNMb2FkaW5nKSByZXR1cm5cblxuICAgIGNvbnN0IHVzZXJNZXNzYWdlOiBNZXNzYWdlID0ge1xuICAgICAgaWQ6IERhdGUubm93KCkudG9TdHJpbmcoKSxcbiAgICAgIHJvbGU6IFwidXNlclwiLFxuICAgICAgY29udGVudDogaW5wdXQudHJpbSgpLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgaW1hZ2VzOiBzZWxlY3RlZEltYWdlcy5sZW5ndGggPiAwID8gc2VsZWN0ZWRJbWFnZXMgOiB1bmRlZmluZWQsXG4gICAgfVxuXG4gICAgc2V0TWVzc2FnZXMoKHByZXYpID0+IFsuLi5wcmV2LCB1c2VyTWVzc2FnZV0pXG4gICAgc2V0SW5wdXQoXCJcIilcbiAgICBzZXRTZWxlY3RlZEltYWdlcyhbXSlcbiAgICBzZXRJc0xvYWRpbmcodHJ1ZSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFwiL2FwaS9jaGF0XCIsIHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgbWVzc2FnZTogdXNlck1lc3NhZ2UuY29udGVudCxcbiAgICAgICAgICB0aW1lc3RhbXA6IHVzZXJNZXNzYWdlLnRpbWVzdGFtcC50b0lTT1N0cmluZygpLFxuICAgICAgICAgIHNlc3Npb25JZDogc2Vzc2lvbklkLFxuICAgICAgICAgIGFnZW50SWQ6IGFnZW50LmlkLFxuICAgICAgICAgIGltYWdlczogc2VsZWN0ZWRJbWFnZXMubGVuZ3RoID4gMCA/IHNlbGVjdGVkSW1hZ2VzIDogdW5kZWZpbmVkLFxuICAgICAgICB9KSxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7XG4gICAgICAgIGVycm9yPzogc3RyaW5nXG4gICAgICAgIGhpbnQ/OiBzdHJpbmdcbiAgICAgICAgcmVzcG9uc2U/OiBzdHJpbmdcbiAgICAgICAgbWVzc2FnZT86IHN0cmluZ1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZTogTWVzc2FnZSA9IHtcbiAgICAgICAgICBpZDogKERhdGUubm93KCkgKyAxKS50b1N0cmluZygpLFxuICAgICAgICAgIHJvbGU6IFwiYXNzaXN0YW50XCIsXG4gICAgICAgICAgY29udGVudDogZGF0YS5lcnJvciB8fCBcIkZhaWxlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSB3ZWJob29rLlwiLFxuICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgICAgICBpc0Vycm9yOiB0cnVlLFxuICAgICAgICAgIGhpbnQ6IGRhdGEuaGludCxcbiAgICAgICAgfVxuICAgICAgICBzZXRNZXNzYWdlcygocHJldikgPT4gWy4uLnByZXYsIGVycm9yTWVzc2FnZV0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBhc3Npc3RhbnRNZXNzYWdlOiBNZXNzYWdlID0ge1xuICAgICAgICAgIGlkOiAoRGF0ZS5ub3coKSArIDEpLnRvU3RyaW5nKCksXG4gICAgICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgICAgICBjb250ZW50OiBkYXRhLnJlc3BvbnNlIHx8IGRhdGEubWVzc2FnZSB8fCBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICAgIH1cbiAgICAgICAgc2V0TWVzc2FnZXMoKHByZXYpID0+IFsuLi5wcmV2LCBhc3Npc3RhbnRNZXNzYWdlXSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIlt2MF0gRXJyb3Igc2VuZGluZyBtZXNzYWdlOlwiLCBlcnJvcilcblxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlOiBNZXNzYWdlID0ge1xuICAgICAgICBpZDogKERhdGUubm93KCkgKyAxKS50b1N0cmluZygpLFxuICAgICAgICByb2xlOiBcImFzc2lzdGFudFwiLFxuICAgICAgICBjb250ZW50OiBcIlNvcnJ5LCBJIGVuY291bnRlcmVkIGFuIGVycm9yIHByb2Nlc3NpbmcgeW91ciBtZXNzYWdlLiBQbGVhc2UgdHJ5IGFnYWluLlwiLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgICB9XG5cbiAgICAgIHNldE1lc3NhZ2VzKChwcmV2KSA9PiBbLi4ucHJldiwgZXJyb3JNZXNzYWdlXSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKVxuICAgICAgaW5wdXRSZWYuY3VycmVudD8uZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN0YXJ0TmV3Q2hhdCA9ICgpID0+IHtcbiAgICAvLyBDbGVhciBhbGwgbWVzc2FnZXNcbiAgICBzZXRNZXNzYWdlcyhbXSlcbiAgICAvLyBHZW5lcmF0ZSBuZXcgc2Vzc2lvbklEIGZvciB0aGlzIGFnZW50XG4gICAgY29uc3QgbmV3U2Vzc2lvbklkID0gYHNlc3Npb24tJHthZ2VudC5pZH0tJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxNSl9YFxuICAgIHNldFNlc3Npb25JZChuZXdTZXNzaW9uSWQpXG4gICAgY29uc3Qgc2Vzc2lvbktleSA9IGBjaGF0LXNlc3Npb24tJHthZ2VudC5pZH1gXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oc2Vzc2lvbktleSwgbmV3U2Vzc2lvbklkKVxuICAgIC8vIENsZWFyIGlucHV0IGFuZCBpbWFnZXNcbiAgICBzZXRJbnB1dChcIlwiKVxuICAgIHNldFNlbGVjdGVkSW1hZ2VzKFtdKVxuICAgIHNldENvbXBvc2VyQWdlbnRJZChudWxsKVxuICAgIC8vIEZvY3VzIGlucHV0XG4gICAgaW5wdXRSZWYuY3VycmVudD8uZm9jdXMoKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IChlOiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxUZXh0QXJlYUVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInICYmICFlLnNoaWZ0S2V5KSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIHNlbmRNZXNzYWdlKClcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVDb3B5TWVzc2FnZSA9IGFzeW5jIChpZDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoY29udGVudClcbiAgICAgIHNldENvcGllZE1lc3NhZ2VJZChpZClcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzZXRDb3BpZWRNZXNzYWdlSWQoKGN1cnJlbnQpID0+IChjdXJyZW50ID09PSBpZCA/IG51bGwgOiBjdXJyZW50KSlcbiAgICAgIH0sIDEyMDApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJbY2hhdF0gRmFpbGVkIHRvIGNvcHkgbWVzc2FnZVwiLCBlcnJvcilcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVDb21wb3NlckFnZW50U2VsZWN0ID0gKGVudHJ5OiBBZ2VudCkgPT4ge1xuICAgIHNldENvbXBvc2VyQWdlbnRJZChlbnRyeS5pZClcbiAgICBvbkFnZW50U2VsZWN0ZWQoZW50cnkpXG4gIH1cblxuICBjb25zdCBjYW5Td2l0Y2hBZ2VudHMgPSBhZ2VudHMubGVuZ3RoID4gMCAmJiAhaXNBZ2VudHNMb2FkaW5nXG4gIGNvbnN0IGhhc01lc3NhZ2VzID0gbWVzc2FnZXMubGVuZ3RoID4gMFxuICBjb25zdCBkcm9wZG93blNlbGVjdGVkSWQgPSBjb21wb3NlckFnZW50SWQgPz8gKGhhc01lc3NhZ2VzID8gYWdlbnQuaWQgOiBudWxsKVxuICBjb25zdCBkcm9wZG93bkxhYmVsID0gZHJvcGRvd25TZWxlY3RlZElkID8gYWdlbnQubmFtZSA6IFwiU2VsZWN0IGEgY29ycmVzcG9uZGVudFwiXG4gIGNvbnN0IGhpZ2hsaWdodEFnZW50RHJvcGRvd24gPSAhZHJvcGRvd25TZWxlY3RlZElkICYmICFoYXNNZXNzYWdlc1xuXG4gIHJldHVybiAoXG4gICAgPG1vdGlvbi5kaXZcbiAgICAgIGluaXRpYWw9e3sgb3BhY2l0eTogMCwgeTogMzUgfX1cbiAgICAgIGFuaW1hdGU9e3sgb3BhY2l0eTogMSwgeTogMCB9fVxuICAgICAgdHJhbnNpdGlvbj17eyBkdXJhdGlvbjogMC44NSwgZWFzZTogXCJlYXNlT3V0XCIgfX1cbiAgICAgIGNsYXNzTmFtZT1cInJlbGF0aXZlIGZsZXggaC1mdWxsIHctZnVsbCBmbGV4LWNvbCBvdmVyZmxvdy1oaWRkZW4gcm91bmRlZC1bMi41cmVtXSBiZy1ncmFkaWVudC10by1iIGZyb20td2hpdGUvMCB2aWEtd2hpdGUvMTUgdG8td2hpdGUvNDUgcHgtNCBweS04IHNoYWRvdy1bMF8xNXB4XzM1cHhfcmdiYSg0NSw0NSw0NSwwLjEpLDBfMF8wXzFweF9yZ2JhKDI1NSwyNTUsMjU1LDAuMjUpX2luc2V0LDBfMTVweF8yNXB4X3JnYmEoMjU1LDI1NSwyNTUsMC4xMilfaW5zZXRdIGJhY2tkcm9wLWJsdXIteGwgZGFyazpiZy1ncmFkaWVudC10by1iIGRhcms6ZnJvbS10cmFuc3BhcmVudCBkYXJrOnZpYS13aGl0ZS81IGRhcms6dG8td2hpdGUvMjAgZGFyazpzaGFkb3ctWzBfMTJweF8yNXB4X3JnYmEoMCwwLDAsMC4zNSksMF8wXzBfMXB4X3JnYmEoMjU1LDI1NSwyNTUsMC4wNilfaW5zZXQsMF8xMnB4XzIwcHhfcmdiYSgyNTUsMjU1LDI1NSwwLjA0KV9pbnNldF0gc206cHgtOCBzbTpweS0xMFwiXG4gICAgPlxuICAgICAge21lc3NhZ2VzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGxlZnQtOCB0b3AtOCB6LTEwXCI+XG4gICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgb25DbGljaz17c3RhcnROZXdDaGF0fVxuICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgIHNpemU9XCJpY29uXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImdyb3VwIGgtMTEgdy0xMSByb3VuZGVkLTJ4bCBib3JkZXIgYm9yZGVyLXdoaXRlLzI1IGJnLXdoaXRlLzE1IHRleHQtd2hpdGUgc2hhZG93LVswXzJweF82cHhfcmdiYSgwLDAsMCwwLjEyKV0gYmFja2Ryb3AtYmx1ciB0cmFuc2l0aW9uIGhvdmVyOmJnLXdoaXRlLzI1XCJcbiAgICAgICAgICAgIHRpdGxlPVwiU3RhcnQgYSBmcmVzaCBjb252ZXJzYXRpb25cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxTcXVhcmVQZW4gY2xhc3NOYW1lPVwiaC00IHctNFwiIC8+XG4gICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cblxuICAgICAgPGRpdlxuICAgICAgICByZWY9e21lc3NhZ2VzQ29udGFpbmVyUmVmfVxuICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgIFwicHgtMSBwdC00IHNtOnB4LTBcIixcbiAgICAgICAgICBoYXNNZXNzYWdlcyA/IFwiZmxleC0xIG92ZXJmbG93LXktYXV0byBwYi0xMFwiIDogXCJwYi02XCJcbiAgICAgICAgKX1cbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LVs1MnJlbV0gc3BhY2UteS0xMCBweC0yIHNtOnB4LTRcIj5cbiAgICAgICAgICA8QW5pbWF0ZVByZXNlbmNlIG1vZGU9XCJ3YWl0XCI+XG4gICAgICAgICAgICB7aGFzTWVzc2FnZXMgPyAoXG4gICAgICAgICAgICAgIDxtb3Rpb24uZGl2XG4gICAgICAgICAgICAgICAga2V5PVwiY29udmVyc2F0aW9uXCJcbiAgICAgICAgICAgICAgICBpbml0aWFsPXt7IG9wYWNpdHk6IDAsIHk6IDMwIH19XG4gICAgICAgICAgICAgICAgYW5pbWF0ZT17eyBvcGFjaXR5OiAxLCB5OiAwIH19XG4gICAgICAgICAgICAgICAgZXhpdD17eyBvcGFjaXR5OiAwLCB5OiAtMjAgfX1cbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uPXt7IGR1cmF0aW9uOiAwLjYsIGVhc2U6IFwiZWFzZU91dFwiIH19XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwic3BhY2UteS0xMFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7bWVzc2FnZXMubWFwKChtZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpc1VzZXIgPSBtZXNzYWdlLnJvbGUgPT09IFwidXNlclwiXG4gICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICA8bW90aW9uLmRpdlxuICAgICAgICAgICAgICAgICAgICAgIGtleT17bWVzc2FnZS5pZH1cbiAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRcbiAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsPXt7IG9wYWNpdHk6IDAsIHk6IDE1IH19XG4gICAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZT17eyBvcGFjaXR5OiAxLCB5OiAwIH19XG4gICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbj17eyBkdXJhdGlvbjogMC4zNSwgZWFzZTogXCJlYXNlT3V0XCIgfX1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NuKFwibWVzc2FnZS1mcmFtZSBmbGV4IGZsZXgtY29sIGdhcC0zXCIsIGlzVXNlciA/IFwiaXRlbXMtZW5kIHRleHQtcmlnaHRcIiA6IFwiXCIpfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge2lzVXNlciA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVzc2FnZS1idWJibGUgdXNlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8TWFya2Rvd25SZW5kZXJlciBjb250ZW50PXttZXNzYWdlLmNvbnRlbnR9IHRvbmU9XCJidWJibGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgKSA6IG1lc3NhZ2UuaXNFcnJvciA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWRlc3RydWN0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIndoaXRlc3BhY2UtcHJlLXdyYXAgYnJlYWstd29yZHMgbGVhZGluZy1yZWxheGVkXCI+e21lc3NhZ2UuY29udGVudH08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSB0ZXh0LXNtIHRleHQtY2hhcmNvYWwgZGFyazp0ZXh0LWZvcmVncm91bmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPE1hcmtkb3duUmVuZGVyZXIgY29udGVudD17bWVzc2FnZS5jb250ZW50fSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTQgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1lbmQgZ2FwLTMgYm9yZGVyLXQgYm9yZGVyLXdoaXRlLzEwIHB0LTMgb3BhY2l0eS01MCB0cmFuc2l0aW9uIGhvdmVyOm9wYWNpdHktMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVDb3B5TWVzc2FnZShtZXNzYWdlLmlkLCBtZXNzYWdlLmNvbnRlbnQpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgaW5saW5lLWZsZXggaC03IHctNyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZCBib3JkZXIgYm9yZGVyLXdoaXRlLzIwIGJnLXdoaXRlLzggdGV4dC13aGl0ZS83MCBzaGFkb3ctWzBfMnB4XzVweF9yZ2JhKDAsMCwwLDAuMDcpXSBiYWNrZHJvcC1ibHVyIHRyYW5zaXRpb24tdHJhbnNmb3JtIGR1cmF0aW9uLTE1MCBob3ZlcjpiZy13aGl0ZS8xOCAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWRNZXNzYWdlSWQgPT09IG1lc3NhZ2UuaWQgPyBcInNjYWxlLTkwIGJnLXdoaXRlLzIwIHRleHQtd2hpdGVcIiA6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNvcHkgcmVzcG9uc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDb3B5IGNsYXNzTmFtZT1cImgtMi41IHctMi41XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgICAgICAgICAge21lc3NhZ2UuaGludCAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1hY2NlbnQvNjAgYmctYWNjZW50LzQwIHB4LTMgcHktMiB0ZXh0LXhzIHRleHQtY2hhcmNvYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge21lc3NhZ2UuaGludH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvbW90aW9uLmRpdj5cbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9KX1cblxuICAgICAgICAgICAgICAgIHtpc0xvYWRpbmcgJiYgKFxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZXNzYWdlLWZyYW1lIGZsZXggZmxleC1jb2wgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMyB0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInVwcGVyY2FzZSB0cmFja2luZy1bMC4yNWVtXSB0ZXh0LXdoaXRlLzcwXCI+Q29ycmVzcG9uZGVudDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJyZWxhdGl2ZSBmbGV4IGgtMyB3LTI0IG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLWZ1bGwgYmctd2hpdGUvMTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LXktMCB3LTEvMiBhbmltYXRlLVtzaGltbWVyXzEuNHNfaW5maW5pdGVdIGJnLXdoaXRlLzQwXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L21vdGlvbi5kaXY+XG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICA8bW90aW9uLmRpdlxuICAgICAgICAgICAgICAgIGtleT1cImVtcHR5LXN0YXRlXCJcbiAgICAgICAgICAgICAgICBpbml0aWFsPXt7IG9wYWNpdHk6IDAsIHk6IDYwIH19XG4gICAgICAgICAgICAgICAgYW5pbWF0ZT17eyBvcGFjaXR5OiAxLCB5OiAwIH19XG4gICAgICAgICAgICAgICAgZXhpdD17eyBvcGFjaXR5OiAwLCB5OiAtMjAgfX1cbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uPXt7IGR1cmF0aW9uOiAwLjY1LCBlYXNlOiBcImVhc2VPdXRcIiB9fVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggbWluLWgtWzQwdmhdIGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtNiB0ZXh0LWNlbnRlclwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwiZm9udC1oZWFkaW5nIHRleHQtWzdyZW1dIGxvd2VyY2FzZSB0cmFja2luZy10aWdodCB0ZXh0LXdoaXRlLzg1IGRyb3Atc2hhZG93LVswXzEycHhfMzBweF9yZ2JhKDAsMCwwLDAuNCldXCI+XG4gICAgICAgICAgICAgICAgICAgIHtoZXJvR3JlZXRpbmcuc3BsaXQoXCJcIikubWFwKChjaGFyLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgIDxtb3Rpb24uc3BhblxuICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtgJHtjaGFyfS0ke2luZGV4fWB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsPXt7IG9wYWNpdHk6IDAsIHk6IDE4IH19XG4gICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlPXt7IG9wYWNpdHk6IDEsIHk6IDAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb249e3sgZGVsYXk6IDAuMTUgKyBpbmRleCAqIDAuMDUsIGR1cmF0aW9uOiAwLjM1LCBlYXNlOiBcImVhc2VPdXRcIiB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaW5saW5lLWJsb2NrXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2hhciA9PT0gXCIgXCIgPyBcIlxcdTAwQTBcIiA6IGNoYXJ9XG4gICAgICAgICAgICAgICAgICAgICAgPC9tb3Rpb24uc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LWZ1bGwgbWF4LXctM3hsIHNwYWNlLXktNFwiPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1bMC42cmVtXSB1cHBlcmNhc2UgdHJhY2tpbmctWzAuNGVtXSB0ZXh0LXdoaXRlLzU1XCI+XG4gICAgICAgICAgICAgICAgICAgIFNlbGVjdCBhIGNvcnJlc3BvbmRlbnQgdG8gYmVnaW5cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgIHthZ2VudHMubGVuZ3RoID4gMCA/IChcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7YWdlbnRzLm1hcCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQWN0aXZlID0gZHJvcGRvd25TZWxlY3RlZElkID09PSBlbnRyeS5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17ZW50cnkuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlQ29tcG9zZXJBZ2VudFNlbGVjdChlbnRyeSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicm91bmRlZC1mdWxsIGJvcmRlciBweC00IHB5LTIgdGV4dC1bMC42NXJlbV0gdXBwZXJjYXNlIHRyYWNraW5nLVswLjM1ZW1dIHRyYW5zaXRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJib3JkZXItd2hpdGUvMjUgYmctd2hpdGUvMjUgdGV4dC13aGl0ZSBzaGFkb3ctWzBfNXB4XzIwcHhfcmdiYSgwLDAsMCwwLjM1KV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiYm9yZGVyLXdoaXRlLzEwIGJnLXdoaXRlLzUgdGV4dC13aGl0ZS83MCBob3Zlcjpib3JkZXItd2hpdGUvMzAgaG92ZXI6dGV4dC13aGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtlbnRyeS5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtd2hpdGUvNjBcIj5ObyBhZ2VudHMgYXZhaWxhYmxlIHlldC48L3A+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIHctZnVsbCBtYXgtdy0yeGwgZ2FwLTQgc206Z3JpZC1jb2xzLTJcIj5cbiAgICAgICAgICAgICAgICAgIHtbXG4gICAgICAgICAgICAgICAgICAgIFwiSGVscCBtZSBicmFpbnN0b3JtIGlkZWFzIGZvciBhIG5ldyBtb2JpbGUgYXBwXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiR2VuZXJhdGUgY3JlYXRpdmUgd3JpdGluZyBwcm9tcHRzIGZvciBhIGZhbnRhc3kgbm92ZWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJTdWdnZXN0IGlubm92YXRpdmUgbWFya2V0aW5nIHN0cmF0ZWdpZXMgZm9yIGEgc3RhcnR1cFwiLFxuICAgICAgICAgICAgICAgICAgICBcIkNyZWF0ZSBhIGxpc3Qgb2YgdW5pcXVlIHByb2R1Y3QgbmFtZXMgZm9yIGEgdGVjaCBjb21wYW55XCIsXG4gICAgICAgICAgICAgICAgICBdLm1hcCgocHJvbXB0LCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAga2V5PXtwcm9tcHR9XG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0SW5wdXQocHJvbXB0KX1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJzY3JvbGwtcmV2ZWFsIHJvdW5kZWQtMnhsIGJvcmRlciBib3JkZXItYm9yZGVyLzMwIGJnLXdoaXRlLzgwIHAtNCB0ZXh0LWxlZnQgdGV4dC1zbSB0ZXh0LWNoYXJjb2FsIHNoYWRvdy1zbSB0cmFuc2l0aW9uIGhvdmVyOmJvcmRlci1yaW5nLzYwIGhvdmVyOmJnLXdoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17eyBhbmltYXRpb25EZWxheTogYCR7aW5kZXggKiA1MH1tc2AgfX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHtwcm9tcHR9XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbW90aW9uLmRpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxtb3Rpb24uZGl2XG4gICAgICAgIGxheW91dFxuICAgICAgICBjbGFzc05hbWU9XCJyZWxhdGl2ZSBtdC1hdXRvIHB0LTYgcGItNCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi01MDBcIlxuICAgICAgICBhbmltYXRlPXt7IHk6IGhhc01lc3NhZ2VzID8gMCA6IC0xNDAsIHNjYWxlOiBoYXNNZXNzYWdlcyA/IDEgOiAxLjA1IH19XG4gICAgICAgIHRyYW5zaXRpb249e3sgdHlwZTogXCJzcHJpbmdcIiwgc3RpZmZuZXNzOiAxNjAsIGRhbXBpbmc6IDI0IH19XG4gICAgICA+XG4gICAgICAgIDxmb3JtIG9uU3VibWl0PXtzZW5kTWVzc2FnZX0gY2xhc3NOYW1lPVwicmVsYXRpdmUgZmxleCBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgIHsvKiBJbWFnZSBwcmV2aWV3IHNlY3Rpb24gKi99XG4gICAgICAgICAge3NlbGVjdGVkSW1hZ2VzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi0zIGZsZXggZmxleC13cmFwIGdhcC0zIHB4LTMgcHQtMlwiPlxuICAgICAgICAgICAgICB7c2VsZWN0ZWRJbWFnZXMubWFwKChpbWFnZSwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICA8ZGl2IGtleT17aW5kZXh9IGNsYXNzTmFtZT1cInJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgIHNyYz17aW1hZ2V9XG4gICAgICAgICAgICAgICAgICAgIGFsdD17YFNlbGVjdGVkICR7aW5kZXh9YH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC0xNiB3LTE2IHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1ib3JkZXIvNDAgb2JqZWN0LWNvdmVyIHNoYWRvdy1tZFwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gcmVtb3ZlSW1hZ2UoaW5kZXgpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSAtcmlnaHQtMiAtdG9wLTIgZmxleCBoLTUgdy01IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLWZ1bGwgdGV4dC13aGl0ZSBzaGFkb3ctbWQgaG92ZXI6b3BhY2l0eS04MFwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1jaGFyY29hbC1pbmspXCIgfX1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPFggY2xhc3NOYW1lPVwiaC0zIHctM1wiIC8+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYW51c2NyaXB0LXBhbmVsIHctWzg1JV0gbWF4LXctMnhsIHAtNVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC00XCI+XG4gICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgIHJlZj17aW5wdXRSZWZ9XG4gICAgICAgICAgICAgICAgdmFsdWU9e2lucHV0fVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0SW5wdXQoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgIG9uS2V5RG93bj17aGFuZGxlS2V5RG93bn1cbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIldyaXRlIGEgbm90ZSwgc2hhcmUgYSBodW5jaCwgb3IgcGFzdGUgYSBicmllZuKAplwiXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzTG9hZGluZ31cbiAgICAgICAgICAgICAgICByb3dzPXsxfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm1pbi1oLVszMnB4XSBtYXgtaC0zMiB3LWZ1bGwgcmVzaXplLW5vbmUgYm9yZGVyLTAgYmctdHJhbnNwYXJlbnQgdGV4dC1sZyB0ZXh0LWZvcmVncm91bmQgcGxhY2Vob2xkZXI6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kLzgwIGZvY3VzOm91dGxpbmUtbm9uZVwiXG4gICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBcImF1dG9cIixcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIG9uSW5wdXQ9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50XG4gICAgICAgICAgICAgICAgICB0YXJnZXQuc3R5bGUuaGVpZ2h0ID0gXCJhdXRvXCJcbiAgICAgICAgICAgICAgICAgIHRhcmdldC5zdHlsZS5oZWlnaHQgPSBNYXRoLm1pbih0YXJnZXQuc2Nyb2xsSGVpZ2h0LCAxNjApICsgXCJweFwiXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC13cmFwIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTRcIj5cbiAgICAgICAgICAgICAgICA8RHJvcGRvd25NZW51PlxuICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudVRyaWdnZXIgYXNDaGlsZD5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAgICAgICBcImlubGluZS1mbGV4IG1heC13LVsxMnJlbV0gaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQteGwgYm9yZGVyIHB4LTMgcHktMiB0ZXh0LWxlZnQgdGV4dC1bMC41NXJlbV0gdXBwZXJjYXNlIHRyYWNraW5nLVswLjNlbV0gYmFja2Ryb3AtYmx1ciB0cmFuc2l0aW9uIGhvdmVyOmJvcmRlci13aGl0ZS8zMCBob3Zlcjp0ZXh0LXdoaXRlIGRpc2FibGVkOm9wYWNpdHktNTBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodEFnZW50RHJvcGRvd24gPyBcImFnZW50LXBpY2tlci1wcm9tcHQgdGV4dC13aGl0ZVwiIDogXCJib3JkZXItd2hpdGUvMTUgYmctd2hpdGUvMTAgdGV4dC13aGl0ZS83MFwiXG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWNhblN3aXRjaEFnZW50c31cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRydW5jYXRlIHRleHQteHMgZm9udC1oZWFkaW5nIG5vcm1hbC1jYXNlIHRyYWNraW5nLW5vcm1hbCB0ZXh0LXdoaXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7ZHJvcGRvd25MYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPENoZXZyb25Eb3duIGNsYXNzTmFtZT1cImgtMy41IHctMy41IHRleHQtd2hpdGUvNzBcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51VHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnVDb250ZW50XG4gICAgICAgICAgICAgICAgICAgIGFsaWduPVwic3RhcnRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJtaW4tdy1bMTJyZW1dIHJvdW5kZWQtMnhsIGJvcmRlciBib3JkZXItd2hpdGUvMTUgYmctYmxhY2svODAgcC0yIHRleHQtd2hpdGUgc2hhZG93LVswXzIwcHhfNDBweF9yZ2JhKDAsMCwwLDAuNSldIGJhY2tkcm9wLWJsdXJcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7aXNBZ2VudHNMb2FkaW5nID8gKFxuICAgICAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnVJdGVtIGRpc2FibGVkIGNsYXNzTmFtZT1cInRleHQtd2hpdGUvNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEdhdGhlcmluZyBjb3JyZXNwb25kZW50c+KAplxuICAgICAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51SXRlbT5cbiAgICAgICAgICAgICAgICAgICAgKSA6IGFnZW50cy5sZW5ndGggPT09IDAgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudUl0ZW0gZGlzYWJsZWQgY2xhc3NOYW1lPVwidGV4dC13aGl0ZS81MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgTm8gYWdlbnRzIGNvbmZpZ3VyZWRcbiAgICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudUl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgYWdlbnRzLm1hcCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQWN0aXZlID0gZHJvcGRvd25TZWxlY3RlZElkID09PSBlbnRyeS5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudUl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2VudHJ5LmlkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZUNvbXBvc2VyQWdlbnRTZWxlY3QoZW50cnkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcm91bmRlZC14bCBweC0zIHB5LTIgdGV4dC14cyB0cmFuc2l0aW9uICR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctd2hpdGUvMTUgdGV4dC13aGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXdoaXRlLzcwIGhvdmVyOmJnLXdoaXRlLzUgaG92ZXI6dGV4dC13aGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LWhlYWRpbmcgdGV4dC1zbVwiPntlbnRyeS5uYW1lfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aXNBY3RpdmUgJiYgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bMC41NXJlbV0gdXBwZXJjYXNlIHRyYWNraW5nLVswLjNlbV1cIj5BY3RpdmU8L3NwYW4+fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudUl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51Q29udGVudD5cbiAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudT5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXdyYXAgaXRlbXMtY2VudGVyIGp1c3RpZnktZW5kIGdhcC0zIHRleHQteHMgdXBwZXJjYXNlIHRyYWNraW5nLVswLjI1ZW1dIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPlxuICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFpbnB1dC50cmltKCkgfHwgaXNMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICBzaXplPVwiaWNvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImdyb3VwIGgtMTIgdy0xMiBmbGV4LXNocmluay0wIHJvdW5kZWQtMnhsIGJvcmRlciBib3JkZXItd2hpdGUvMjAgYmctd2hpdGUvMzAgdGV4dC13aGl0ZSBzaGFkb3ctWzBfMTBweF8yNXB4X3JnYmEoMCwwLDAsMC4yKV0gYmFja2Ryb3AtYmx1ciB0cmFuc2l0aW9uIGhvdmVyOmJnLXdoaXRlLzQwIGRpc2FibGVkOm9wYWNpdHktNTBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtpc0xvYWRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxMb2FkZXIyIGNsYXNzTmFtZT1cImgtNCB3LTQgYW5pbWF0ZS1zcGluXCIgLz5cbiAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgIDxTZW5kIGNsYXNzTmFtZT1cImgtNCB3LTRcIiAvPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHJlZj17ZmlsZUlucHV0UmVmfVxuICAgICAgICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICAgICAgICAgIGFjY2VwdD1cImltYWdlLypcIlxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUltYWdlU2VsZWN0fVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaGlkZGVuXCJcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJnaG9zdFwiXG4gICAgICAgICAgICAgICAgICBzaXplPVwiaWNvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBmaWxlSW5wdXRSZWYuY3VycmVudD8uY2xpY2soKX1cbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTExIHctMTEgcm91bmRlZC0yeGwgYm9yZGVyIGJvcmRlci13aGl0ZS8yMCBiZy13aGl0ZS8xMCB0ZXh0LXdoaXRlLzgwIHRyYW5zaXRpb24gaG92ZXI6Ymctd2hpdGUvMjAgaG92ZXI6dGV4dC13aGl0ZVwiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cIkF0dGFjaCBpbWFnZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPFBhcGVyY2xpcCBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz5cbiAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgPC9tb3Rpb24uZGl2PlxuICAgIDwvbW90aW9uLmRpdj5cbiAgKVxufVxuIl0sIm5hbWVzIjpbInVzZVN0YXRlIiwidXNlUmVmIiwidXNlRWZmZWN0IiwibW90aW9uIiwiQW5pbWF0ZVByZXNlbmNlIiwiQnV0dG9uIiwiU2VuZCIsIkxvYWRlcjIiLCJTcXVhcmVQZW4iLCJQYXBlcmNsaXAiLCJDb3B5IiwiWCIsIkNoZXZyb25Eb3duIiwiRHJvcGRvd25NZW51IiwiRHJvcGRvd25NZW51Q29udGVudCIsIkRyb3Bkb3duTWVudUl0ZW0iLCJEcm9wZG93bk1lbnVUcmlnZ2VyIiwiTWFya2Rvd25SZW5kZXJlciIsImNuIiwiQ2hhdEludGVyZmFjZSIsImFnZW50IiwiYWdlbnRzIiwib25BZ2VudFNlbGVjdGVkIiwiaXNBZ2VudHNMb2FkaW5nIiwiaGVyb0dyZWV0aW5nIiwibWVzc2FnZXMiLCJzZXRNZXNzYWdlcyIsImlucHV0Iiwic2V0SW5wdXQiLCJpc0xvYWRpbmciLCJzZXRJc0xvYWRpbmciLCJzZXNzaW9uSWQiLCJzZXRTZXNzaW9uSWQiLCJzZWxlY3RlZEltYWdlcyIsInNldFNlbGVjdGVkSW1hZ2VzIiwiY29tcG9zZXJBZ2VudElkIiwic2V0Q29tcG9zZXJBZ2VudElkIiwibWVzc2FnZXNDb250YWluZXJSZWYiLCJpbnB1dFJlZiIsImZpbGVJbnB1dFJlZiIsImNvcGllZE1lc3NhZ2VJZCIsInNldENvcGllZE1lc3NhZ2VJZCIsInNlc3Npb25LZXkiLCJpZCIsImV4aXN0aW5nU2Vzc2lvbklkIiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsIkRhdGUiLCJNYXRoIiwibm93IiwicmFuZG9tIiwidG9TdHJpbmciLCJzdWJzdHJpbmciLCJzZXRJdGVtIiwibWVzc2FnZXNLZXkiLCJzYXZlZE1lc3NhZ2VzIiwicGFyc2VkIiwiSlNPTiIsInBhcnNlIiwibWFwIiwibXNnIiwidGltZXN0YW1wIiwiZXJyIiwiY29uc29sZSIsImVycm9yIiwiY3VycmVudCIsInNjcm9sbFRvcCIsInNjcm9sbEhlaWdodCIsInN0cmluZ2lmeSIsInN0eWxlIiwiaGVpZ2h0IiwibWluIiwibGVuZ3RoIiwiaGFuZGxlSW1hZ2VTZWxlY3QiLCJlIiwiZmlsZXMiLCJjdXJyZW50VGFyZ2V0IiwibmV3SW1hZ2VzIiwiaSIsImZpbGUiLCJ0eXBlIiwic3RhcnRzV2l0aCIsIndhcm4iLCJuYW1lIiwiYmFzZTY0IiwiZmlsZVRvQmFzZTY0IiwicHVzaCIsInByZXYiLCJ2YWx1ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwicmVhZGVyIiwiRmlsZVJlYWRlciIsInJlYWRBc0RhdGFVUkwiLCJvbmxvYWQiLCJyZXN1bHQiLCJvbmVycm9yIiwicmVtb3ZlSW1hZ2UiLCJpbmRleCIsImZpbHRlciIsIl8iLCJzZW5kTWVzc2FnZSIsInByZXZlbnREZWZhdWx0IiwidHJpbSIsInVzZXJNZXNzYWdlIiwicm9sZSIsImNvbnRlbnQiLCJpbWFnZXMiLCJ1bmRlZmluZWQiLCJyZXNwb25zZSIsImZldGNoIiwibWV0aG9kIiwiaGVhZGVycyIsImJvZHkiLCJtZXNzYWdlIiwidG9JU09TdHJpbmciLCJhZ2VudElkIiwiZGF0YSIsImpzb24iLCJvayIsImVycm9yTWVzc2FnZSIsImlzRXJyb3IiLCJoaW50IiwiYXNzaXN0YW50TWVzc2FnZSIsImZvY3VzIiwic3RhcnROZXdDaGF0IiwibmV3U2Vzc2lvbklkIiwiaGFuZGxlS2V5RG93biIsImtleSIsInNoaWZ0S2V5IiwiaGFuZGxlQ29weU1lc3NhZ2UiLCJuYXZpZ2F0b3IiLCJjbGlwYm9hcmQiLCJ3cml0ZVRleHQiLCJzZXRUaW1lb3V0IiwiaGFuZGxlQ29tcG9zZXJBZ2VudFNlbGVjdCIsImVudHJ5IiwiY2FuU3dpdGNoQWdlbnRzIiwiaGFzTWVzc2FnZXMiLCJkcm9wZG93blNlbGVjdGVkSWQiLCJkcm9wZG93bkxhYmVsIiwiaGlnaGxpZ2h0QWdlbnREcm9wZG93biIsImRpdiIsImluaXRpYWwiLCJvcGFjaXR5IiwieSIsImFuaW1hdGUiLCJ0cmFuc2l0aW9uIiwiZHVyYXRpb24iLCJlYXNlIiwiY2xhc3NOYW1lIiwib25DbGljayIsInZhcmlhbnQiLCJzaXplIiwidGl0bGUiLCJyZWYiLCJtb2RlIiwiZXhpdCIsImlzVXNlciIsImxheW91dCIsInRvbmUiLCJwIiwiYnV0dG9uIiwiYXJpYS1sYWJlbCIsInNwYW4iLCJoMSIsInNwbGl0IiwiY2hhciIsImRlbGF5IiwiaXNBY3RpdmUiLCJwcm9tcHQiLCJhbmltYXRpb25EZWxheSIsInNjYWxlIiwic3RpZmZuZXNzIiwiZGFtcGluZyIsImZvcm0iLCJvblN1Ym1pdCIsImltYWdlIiwiaW1nIiwic3JjIiwiYWx0IiwiYmFja2dyb3VuZENvbG9yIiwidGV4dGFyZWEiLCJvbkNoYW5nZSIsInRhcmdldCIsIm9uS2V5RG93biIsInBsYWNlaG9sZGVyIiwiZGlzYWJsZWQiLCJyb3dzIiwib3ZlcmZsb3ciLCJvbklucHV0IiwiYXNDaGlsZCIsImFsaWduIiwibXVsdGlwbGUiLCJhY2NlcHQiLCJjbGljayJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/components/chat-interface.tsx\n"));
/***/ })
});